From 458984a3a7ee333f4ba68821ae801782c894e5dc Mon Sep 17 00:00:00 2001 From: Anh Minh <1phamminh0811@gmail.com> Date: Tue, 17 Sep 2024 02:07:29 +0700 Subject: [PATCH] Fix tax2gas logic and e2e-test --- Dockerfile | 2 +- contrib/updates/Dockerfile.old | 2 +- custom/auth/ante/min_initial_deposit.go | 4 -- custom/auth/ante/spamming_memo_test.go | 59 ------------------------- custom/wasm/client/cli/tx.go | 2 +- go.mod | 4 +- go.sum | 8 ++-- ictest.Dockerfile | 2 +- tests/e2e/configurer/chain/commands.go | 8 ++-- tests/e2e/e2e.Dockerfile | 2 +- x/tax2gas/ante/ante.go | 5 +++ x/tax2gas/post/post.go | 11 ++++- 12 files changed, 30 insertions(+), 79 deletions(-) delete mode 100644 custom/auth/ante/spamming_memo_test.go diff --git a/Dockerfile b/Dockerfile index 5e4e6cd11..a2082c645 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 ARG source=./ -ARG GO_VERSION="1.20" +ARG GO_VERSION="1.21" ARG BUILDPLATFORM=linux/amd64 ARG BASE_IMAGE="golang:${GO_VERSION}-alpine3.18" FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as base diff --git a/contrib/updates/Dockerfile.old b/contrib/updates/Dockerfile.old index 5e4e6cd11..a2082c645 100644 --- a/contrib/updates/Dockerfile.old +++ b/contrib/updates/Dockerfile.old @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 ARG source=./ -ARG GO_VERSION="1.20" +ARG GO_VERSION="1.21" ARG BUILDPLATFORM=linux/amd64 ARG BASE_IMAGE="golang:${GO_VERSION}-alpine3.18" FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as base diff --git a/custom/auth/ante/min_initial_deposit.go b/custom/auth/ante/min_initial_deposit.go index aba117587..7d7da3de0 100644 --- a/custom/auth/ante/min_initial_deposit.go +++ b/custom/auth/ante/min_initial_deposit.go @@ -65,10 +65,6 @@ func HandleCheckMinInitialDeposit(ctx sdk.Context, msg sdk.Msg, govKeeper govkee // AnteHandle handles checking MsgSubmitProposal func (midd MinInitialDepositDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - if simulate { - return next(ctx, tx, simulate) - } - msgs := tx.GetMsgs() for _, msg := range msgs { if !IsMsgSubmitProposal(msg) { diff --git a/custom/auth/ante/spamming_memo_test.go b/custom/auth/ante/spamming_memo_test.go deleted file mode 100644 index 1b61378cf..000000000 --- a/custom/auth/ante/spamming_memo_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package ante_test - -import ( - "fmt" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - - "github.com/cosmos/cosmos-sdk/x/auth/ante" -) - -func (suite *AnteTestSuite) TestMemoSpamming() { - suite.SetupTest(true) // setup - suite.txBuilder = suite.clientCtx.TxConfig.NewTxBuilder() - - midd := ante.NewValidateMemoDecorator(suite.app.AccountKeeper) - antehandler := sdk.ChainAnteDecorators(midd) - - priv1, _, addr1 := testdata.KeyTestPubAddr() - _, _, addr2 := testdata.KeyTestPubAddr() - - // Set IsCheckTx to true - suite.ctx = suite.ctx.WithIsCheckTx(true) - - suite.app.AccountKeeper.SetParams(suite.ctx, authtypes.DefaultParams()) - authParams := suite.app.AccountKeeper.GetParams(suite.ctx) - authParams.MaxMemoCharacters = 512 - suite.app.AccountKeeper.SetParams(suite.ctx, authParams) - - transferCoin := sdk.Coin{} - msg := ibctransfertypes.NewMsgTransfer( - "transfer", - "channel-0", - transferCoin, - addr1.String(), - addr2.String(), - clienttypes.Height{}, - 0, - longMemo, - ) - feeAmount := testdata.NewTestFeeAmount() - gasLimit := testdata.NewTestGasLimit() - suite.Require().NoError(suite.txBuilder.SetMsgs(msg)) - suite.txBuilder.SetFeeAmount(feeAmount) - suite.txBuilder.SetGasLimit(gasLimit) - privs, accNums, accSeqs := []cryptotypes.PrivKey{priv1}, []uint64{0}, []uint64{0} - tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) - suite.Require().NoError(err) - - _, err = antehandler(suite.ctx, tx, false) - - fmt.Println("err: ", err) -} - -var longMemo = "6d5184c6ee6a853986cc2e41b1f308cede7accb9994d7b90d951e7560ee9ba6b61b0500df10180b841bc0833bf7fc3be33ee4bf91bf9044daa4f421de59470d75ceef8aef47c44c3d55d01cbf95a29f3b6e21c536b394207f770807a508bb3398ca401f8a469d7c9e98e6f009f1ed4be8964dc2a9830e1aa8480982795faab8dd8bfc1ada3725ac9ef9e404492fb832801c3edcc0b6b82c0758193416c02961338339bbde9a20d55af67ed69717c0a3a80465103a2cee184a47a144ce7fbc706adcd148c1b6ddc143258c78f1528ee2a400eed47f787f3324b6efaa185950b866cc1953e77d968e2d956848abffdb7d92e2e190ffe1c78cabe110429a81c21f436ed09fc8a10add744ecaa9f07c39a430265368ecfddb0f6d8d3f80e9bcfb2af19371202dd0845ff57d0bd565856b2a83b41bdc7b116bc7347c80c0d4bf3741deeb499f3cd22204d7cb6709f2867c1831d55e3efbe6b3e43261294ef6f2cbb9fa139249deeeeec8916806fd257aa871150f61714ff63f5e0042690cf62c6b4083e31bc84cb070ba6eecee853f55cd1b08a932610d5171e70d87cac011e7e8a821d539fdf12c4df57cc1efd7fe7b49a80d4df4b790dcbc94e1d4c354800fef027036db9a3de40b4f2544a0084325f5cfda839d01318096738fc542cc253537c71478e06d7d8e5b1ea12e712e42976a68e5cf31f2688c3276ec689dae917608f034b63804a19c0ffe287e3b5553ee59dae20499182cafa1b37530d999e3d6fc0d922c18b2a93cdd381547645b4c34f60d2e51b11f64af4510b1d5fc8c9dbbca9ba77d4e796e1fcb678c145cf0d4b90a5cfe158769f22076c8b113060b3f44b989a62c70dd8074dc9a2fdea79c8495cc66c33a253c824cbcae344684003a82d3b600edab8c4152bd169c0ab1582c36e937aed35d06fb6fef1537d0685b6f5f6cd17624f7dd03a60153c2f39bdfda0b0b4c27495bf996642c05830124f9a5d9ab829e5d1ad3eab10f443fa7f63fa804ce7df355a0335c96e1c59879bf38a2c918fbe43ebf88551f29653284388a716cd6ce39752ba85851e96e9634792008ca39402e2fda8c369a1a6435a0237a859cb106051ff20522c37497c6b5d002cb0e4897de1c83205c44794a1ed5d1b6e3fcc5262f821340a6960817105355ed44422baeee55e2f4df54773d5580333cc5f133bd632ab1f6ba9197242e0b3a43f2a11a47eaed703137ed5bb486419c5c4657a74b6e01472ef69844929cd974977323c744c2cc206d674463d17aaac5e50012df6d34e78d19c7904792c618d1e83487a23edd47e83587e5b3330d3c34620bdf3b2c162b38581579e0c5fa808f927582f9fbc5e2190b036c65b339b36e82bb1d4028d3af2b108dc05242748e8ff4c85224fb616d2b6d8c7ececef9f909d7faffe0a9ee50fdee54c309bb8758ab0fc81959688daa8607df9e0497ca61a169181356396471fa9845166c2f2bbfe49a8581f344efb616d088594a259942a6a5e9056ae42f696e8c2eb311cdaa8ea7db64fa598f3d67fa5e090347e120849bb81461b4064bcc290cefafdca7e4f72417d31c7de1c14faec26845fe1e29518b5f8ce1ffc8f98cd8f723b46134c0de0bee21a7f91202e02a1b2118ad3b27b1d1f999c41b5af851d3ef9b91a21cbc4165c6a616e056af3f16714d39ee405fd046ffd2f618a999d34466195c6dad1297960da73e1cc19faa894a953debbb4490ec5b3ca13cc5cb30c78431f6818863f53a2193490563da5e2d573fbecce5fe6fd65731f4fa3c9f467b8a4acb33eecb8e3d1a6d6d592e095fd45f68691c89b114231a7e0aa5a561f1f01c43ea7b17b6604d138b42407502f484f58029075bb0a041b9d107ce64434cf2c5f9427d2cddf209625d193d79bf70e6df5db4f288668552aaebbe2c665f949cd5d5ea5030a298f900ea91ff7bac8e17df98a1ce17234e2857572c7bf0ab898e7a6724a3eec74cfcb0fec86c01d96a0f9a9275c0f4c60553d4169073b0f2d2af668066dffd086dbd974ad8ca82dc67afe51c69965184a838da926cb21d7b12e42ffb6309742fd3e26323850deaf0d3f2920fb40b31d476fa7146d0cb46dbf101b6dbff567461473808438495be37f1bd1b5ab07e321ff8caed7b05e0a5e4bfef86bfa1d1367fbfbb12fb933931c4e1927ee0118e009f9038b7efc36b83590fe912553ed73da1d71c567dae83f5326f92269c1cb46422078bf7c0dacf0d707ba1f2a77f393da2247a1318959691d9ece4a1a21b346487ff1fba522109954d47f576b02a2a04837af1bb55421701ab87b026434b7801b1a2ea633073fd89d19caa3e2451793bf022cb088d446eda5b4525d160b9bbc88539ba1f668a8f372e16ac4b3b530fb8709bdef1abde73b0bb0c9b07030c91ec4e73ea2ef108662d60461171850c25db3af8c69734691c14faa83159f64233920cf914f2e1b32303370c26a3ebfca32e5fc307329c4a75dbd7e4c71196c0646bfd77b499e0ac6ad0a68dee81d01d51351a6f6d31374fab7a78466344eaa3cc44ec7c63eab11042d2113f32dd612011f6e4e2c2dcc44eb8618c7b17a8d5b4c1772e0db213085c0d2e421cc26314d87d4c94817834b29853325010f7a676f493c3d00b71e001261f0eff1c8173002ba9359e46775e06179ab6997104a02ee518bac9b3ffaef2b5c73a1a3a1a4fbea48d0e365a34779f5cbbb8671a54bfaa8b25cbae6b61b8fb31562f589b8635829b80b361a9658ad061d72f24a4f61648b02d175718cc8a549545cf9e0745fd39ef6b4d937a9b15a90ed03d3ba4afb6ab86b7db9ec9e6515cfb51de93b12de9fe471cb9ca3c4e40054f66e6762a6f68415d4fb53607667ba15d8d61a7530947e4729c8266d74c0300b2b4347a09dc836b6fd69f85a49794082e2ebca0eede5c7150c266d11171ae38c5cfa32fdf208c4984ace2bee9f2f27415d3d9a24303bfb00eed311f6a745f89e3b6d36eac9ba3105b2b393ec6635546f75af202870eb906f07a89d243e73add3fca1fd681d4e7b8a9ebc935536c88ff4d4aedc839f7092624eda684faf893d45a251f282b1f5a6d263e1733ca4ab1055f411ca9118bb2368bccb6ced641e853a63792744539a8d6417e4f5ec81f182462703a9858bfc6e4925ac229db7dd0febd100555017d2ed31dafa7dce4f55e3a3e7f6b4007212fd2326722ca46272f3e640e7476695aa8c850063fd757abd8ea023f532ff229bdb2405cb1e9d4593a6f0f9b79ac9edaba1110351d4c0caea34e9d2f5c0dd48424e981bf50a6f4e6e53b807e5a2b5decf6ee1ab819d011352d9ec002ee7c2608a9bf79cdf0f5c935e9314e36cf70343def521d00d2145fe7f01d6923c74e8191b28bde8cd0ce46390f56e6c329b7b9a0bcf407d76fd84e1188de9fa364ad01498eff0eac2d8c9ca4edaa0c6c2416fcda5d61fefa395a8ce949128d454575fe6151d8986f8cc945215ae5b7ec3c3883765e1c2b07fe08a6180a31d7ea796c646435f4b79f4790a67dead9da428a73a85dce9fae762d716dd733e2309c5b13623697efe2c7d1aa4ae6425172babb49d02d6c88de76981a8c6ce01ff8af277cdd6f2e83aa793da1b66c7422e9597805733b17c6aa6810ee5be17060568e9e37d11d8726d26acb1860bfb33954c57895700588f42ac5c1c651005ec1e773115668163af569e299919a486fefcea90039efa16cb10da918a7c711016bd3d5e37a67beed1a0f66cfd8b7bf471cc89f98b27c505f3b75df7c97423691fa5df3d4ef8ef8c3d42382aa42ba61190e5c7c5605841e616feca883f3447ef387197c4fd4250dc4ed40e40e19b86387a8f545668b9255b1b66ee07888b2dfe766cd87ef115a6974777814676fc6f4120cb7098d41e5aabe011e2793e1eabe17cb5c81ce6c6ca1d4c4d850ad035089f51b4769966ab320c74daadfeaaac4b393971d3f53e34340190d91839d094e237d5fb3cea9be4d4fbf72a347d69b0e38dd0c68e5bcbb579ade4e0829792d55fce13c5247d41a05b1bc9f17779a20698ca13446c8ac25432557efcdc07958b391211b344124176b85f74ffc8f6207e36e038606a6c42fa3b0186ae6cc7656d79704154359c73300e68606c801abf58e025adba0513f14d6a0db3337a5ede9a70b9d83a9331e30e44d3a0bda15d9938cbe54306136efc91b4feb3416117fa05c5924f81a256943660932f554b240eae5838729802b104f2b187d5ecd72ecd83534d61866d891ce96428c35c0b182b78a769a9e951e4e5b1f478aa658098891890a1d9dd1827007e76412648f601dcc46492893c96e0e9ed6e0aa43e504d61c0195ca2e274c76bb1bf4170f502b1e07945b9b081ca42b3eda98e8da3725710c69e284f47cdbbb10f2ec9350f3c3ed526ea1451e476bb0fa288209e20c94c89ee7d7949314f9d90f8fde72256f1c32dc2571526be95602e36f09780b3c74c8816923c8fc44ec58169b9e6ee6b9e671c913f269595d89bd2f55c77a4da85e2fe40db9561108ff873d89e46d46a5a0c3396d2a8711c1dab7c07ec0a022eb0acd9012941ef9e78db529f22c3da7c1ab3563a4503217702ba3d1b043522e96aa030cec6910bf5c49556f8a47ae9eb93240da995e3c71d34b7fc8d816898d7941926c4084094f70537f6182d276b521bf332e49d510335e4343086782b1ce244cc599c657dc3ef76a403f26fd4e78ced7a67a3c3db414baf1d85cd44d6db7c874b578a87625a921af23519220fb45e8e4c6976fc76bff37e7213190e66948b9f70fd0c9eefeb298a1c8553cfcf84d37d5c8448b6b09c715535176e8d913e7a4bdd5a3865b228456a0b84bfe64f12dc43d9aa1be9de61e888b1cb58d30a6d7b8f01718224e7838946384e20c86abd7f2111f316dc8b9eceaf788b72b741d6072e0b8ee0bc20745320ee0b9adc86de7f80ab5da5f30f4014b82a065a88212e2c9889dbf9a901c7bb1323b6e3df10e2d0b61e97524c8f9bfbe807f811f3c8d159ea3352bad35bb2af3096e8989d49c9491a784067cbffb56fa1191190c49820e72da0947026677b1f7d1a5d0c44e1f1bc5e21340c2a73df1d849b27e689ea25ea9815f6218607cac5f988d97bf9717338749ab31515991a561c1d7bd5a45001abba5afdbf9fef1ace79d441b1b34c679f790565fc4091a9d3a45b9af51a960064f20a811dcbbd42d2971c738c20c4d83211cea1daf82b162f5013a0d97d125a4caaa81e3ddfd9e039fa3c1f0331a573d0efd81135e9d2f224a42e2ba9954ae92349c69ab8c87ec9a6c40f8651f154d8ba146e871c0fa067698a87af24e63a97d866b3cf0dabf61b1ff7918ac876f19204d2d98a8c110d4430507c71ac9d4d2cee308401ea08fb839fc9bc68a217ea15b8027e22454ca4592535319481faf576fa04b5e3f10a6e78bae93178cf1f7dee2b234f6c00ad3bc92f970a48630cbb22de221027925d2abfd8538d8a7e00843a62b84c3e18804b96f44de93ed632abfb48a78dadd791e28213a887378eff9b135b1988f61b753e794fb6c08f4c23717705d08aa1eeafd679e697078423caec20de1bf3b39e5dc6bd642781849123bff36afe84959af35ef2bc9ab74f9a7c183e730e2cd9e71fa9e3b249f0a0a91adb2b26f0d46bf61b98552e8b7ace570ead619b2c75dd9406c8a8145cfd2bea9c239f11c5dfcee453cbeb06cfc78be9e096f81a83fe2519adb44a1dd8c6a7af97ad5cbf69b7d1a7a047c8555f30d584b57416a6fce5ed7d4e95d3679b0231eb1d9ae9858757f61d930359782eb08b338fc79ce9e89c9796f680fe81bc4aaab482aeeac5e0a1b9e8a33886256326812c7bcfb8fb4c592554cf1a892cbb9d7ac20c0aa4646303284f9751be717ed80bd3165296530c7c6b5ac21c14e70fc40c7c91e96ca40097a713026d60050176acb18d80cd73f4e83ce10c95117af4464b9521d2127da2a1dce16a19bb7f7c842f3542e05d6d52a09134fc4108d52cdaeba290d692f378968966bafc532a88531d687cf3e7bd4eb56e786c7701ecbd95e88adb8e9c51aec10b77188e50d9278b3374884d43556f4a6d2a158c77ab8307c9e5d3418f3d3c0b81c5ef114ec1bbbf19ff7add20cf29a8962aa1d4e7c80980a4439e81c081b6d492e1b5bb0d5d349ae99027665869d570471f3aef02c1554a388beb7ca03c91170d269de93caece9532b05b600f64f82037d1c7c9c9255f8cbe0aabd422f03db8c0765a66f467efca584ff2813f0a35fb35e8c959956fc42dd1e4ac136cd2ac8a21e1b054ca81e74d8d6e270b9ed4494d1cb8b92ae710ca2c4d79372b12f2d2566ba0faca2b84413539eacef8879fde814a495feb593638cffe32d5d2b57ee2246e024321b05a0472f0ebf6da9c3d1459a286ca49f37f10516990d4811d63aa82680bcda60ee9fe2475c8f887db63bc177e4a8bae756287bec7ad5f4f512c9b86a64d8967cfae2b20fc6cc2d17c1e8f3552a78f63f191d08258ecae0b7c08a9b09f02a2b5d1286d116b6b0090d5829e76cce2f05a9c6ea2dfaea1f0f10120055da9e12aca3f835be6290c195f3de8f71271a8f4554c64c58a77b97762d5146c6736a3e01971ce12b96a17fbeebbc9dc5992a284231085a665ebd009cb05e721ca76b9061ebf1a2fb31fe98e30b694592dc351b9d89029cb7ebd406803853570e6c98f1bb684c13678945cebb22e95241c0d29be160ca26479e566c333b4ac37a7e5ff2a3f28f5dc5ea790b3939f4fef20933f5a463ba0de92949075f914655f692189f302eae776676e0882207b6215ea8d6e17f7b8d00434554a98e78fdb1d2bb29b24b75de4c10e31738a1eb54f3343549a55ba26e79b19b7a68f0a4dc9da7d709e17d739c2f12d63264e43852530da7a7d94b9fd8de5fbb1e2dc70bb52253b1492ca169fc1f6cc388967a25754353803f16c2bcc7781e27081dd5ca1a1dae5c3c23f03a8e047e092ce46cd07ea23b630e6cbd6e4dcdd55d3f2440f5e5105e9185e3c704a262fc6e77a4a764f83243b94cda9db9f3430018e9cf756f557cf627a51e3c55af0e9a91775d51eb2de5d4617bf131aa7092690df547fe6eff553caefda3d062af6b2a28fff92b04550b62ef64d1dd24a560b60cb77a48214c2665d9d89425c45f74aabb181ead37dc65399a4cd99ecc8f5befb9c3ac0acf8adb9cbc291b642e89652db6d7b1bddda50f3d1ae14c862cd19f43dfceb7fda3b1ec7fa8d38d1b4f25e646eb19f9af9d6a0572f0f5772dc26438f6a6bdb9f48bd522c5f7d963cacd83e3ea62fdbae4cb4ca4419b075eaefe9b3f469ed500e9b1f7cb4a6d9caa26cd1ac123dfd5d37bc73a6aaeffeebe1b4ba53ce9d56c89639ad793f053a03240e335a9b4f37ad0ef382fbb90f0e1b20100e16c0d16e26285a2b94ed79508c80ac6366d686e1f811dd998618041b66df12eaa3ff443b8f96f7ac18113fa3c6533f3a8d63a8569648737b578078fac1b70aa57ec6e52b3d3dc3e65f38a1bf9f8beef1de389c22ba4b03b88fe0a9c434c5d08c5482a64fbaa2a48c94a3ce3510b7ef46a9d596c677b9137f11a86e390a507754c8f4b8c54a41666f78a4e17767230d36be3124491353a8e4b5d3eaaf8463b778052279970698886e7ffff416efdeb671bc3fc4ffece54260f7715241add48b464b0c5558fe2d39637e75956b35c4185d01173cf1d3994d7aea9d30fdb8a97e087af7d2223500f8d95f9789cf017d3b1e2e3532a25cbead6fffba2a02bbe0425182a07788242d56ba7935ed68c0950b4e6487c64c3a4ba6286c9ce94e20a777116d7cb37d5408c6fc4ef4f62766b0e237ab346fd4d8fae5199bfda0d1c06787dc34115a2ecc8bb6e4d59d20da2bcca8af7eb38d7a88f1b6cf078eaa39a6f107cf938a3cf9dbc92d287e4366f5d608767441ddc7e11d990dec8452a39efacc63b913a7ec67b600c307cf8895a263498b1b04e1c093176faef24674dd68c46ae1e1dfa1a69667cea407dd5615c4a786b5f10aab74b3d3d88189ae539baaedbd8b98b7e92461893d6c7d048ce6292629b71834a317f31e2edc1cd37d1783f725f970d88388454ec613d64eaa2cfe6978ddbc7e7da76d74944cffd4285e20eed7b0da3e310527603f7d28c3994c4ce6b7573b2b266a1396e86661938dac68e8fdb32a3546c9a9a313467659d8609a2fe6a329d3b479f415af9f952c9a6499580206cf3c23a40f6e8ffba674aeab246d32d1f4298847c6f85f0ce49e56ad1194f0ca536cc823bf32b3c8143dd72be7478d7f416aaf786a76e95f1258268be120bc9e489ff89876229dae1f80837b0093ee497d2ea783fbe408726fbe614e3cbb9710e95df5d4d2673e8d379b47660337113e39e96a91395ce5d72a9f7e9dd1744de97e16cd7a134119c677ba5b1478f81acbd51cff83798f5449364d50155c22250306385c29a4280c5f533a7c36aa10919ec3de6e482c1c2ed276b8a030dcb283d5c5ea0537991de40924595003ebac4ebf1b4beebd9d3c73cdf799153be8b458e3ca6afc527f2140c9339d62595953d77ffae0cceec7308557247fb300aa8368d3daa2814e889011ac81c6e75cd733e6c46a8381c78c09a3d27de40ef57981c72b15a193bbcc4d8de17116e91819c911cfc53eca8327f76622d00912775aa0a327c1b529d0117ad41e9ee2b448ce5bdde1aecaace63474b4c47ed5f9739ebcf84a982fa84afbd0d0f0918f8d27efbfb21fcab4d55ad7bb52e38edd375a4f3391071144ea327daa2ef6018659a44ed211dad23ebdda2643cb434576ddb6e9203b50f27fecc871cca20869e833b6d1472a4d04de371fb63e80b840b5423c71e189eb4f6e66b051d1656d3a32e58f20da8644ba2e49a6ab00e4ee50760f4bfca775787a61d586a2076c151d5e27f8510f1e01bdd0c05ad7b5a124738bf2a9a30e0b2fe919ec11be8968c6b378b46addfc984fc7b43655af7a089ae80a17e6668bcf03979a25fc2a584a155ba3903407d92f2997655224e565e25ece7b34e1baca7a1a00b65fa4ed18574704da2a8f1aba671ea6f56c7105655362464e713ce14f34d754cc2fc8da6ed3c21927384a892c48bcf8e7989c4ff794ccccc3712e16fc9e5bc3e6fa86d88ac9a5f504450e5381e44967b742f580acbb0c4f671809be06678c3a3669a5faf4bea33b108c415e22f0cc3bc8f8708038132b85ce0eaa53d86e76b019834bf0fd291b29797bf2ec8f91a6262a2a2ec446e61e91e6bf364e3944d484bcef92a082b875df62eeff51771f2ec5c5ddcb666467fd0be7c3c9c8a3408019dacba606ae379ab5bf2646843606e10ccc018dab095fb44015b31bd1decd6ced6c77984a98b6e672b1ae3e0263c6ced7ef6d903986c1fdbff81b117a908825c91f2670355e4a848f2f707d5f4fccce67ac8718eb57e9917ff0dec4c61ad59dc1114bdefbfe5efd0a51cc3929c01eccf1902bbce83aee06b4279fb77bc4a50fafbfdcabea666ae49a28075174f72197ef077516770511f54555130fda0f55e62010aac9fe634ddad5e923757c6257948227dd3018a064ca59da349111bae0d7801ac7545e519758811b0c0deaa2a0f5b38fc43c8dc30631e45a16dbb06cf97c967c74cce0d505ba26b02aa1ce87bac7d87b491cab79254b79b735a51258bbd401efa0d54d1fed6e9945761b7682cba4a8bbd1a08b94413fefd0ecd46d896f2a4811bb830f368663a44d65b2116da1b5f883de0db60159210a2e3c873094ca19f2181aaa174ae1aba8685bb4585522ac185a05ac7077a1cb623a8c49ba72d39e08169e49ebb3bcd48915ad7b132a16549e976a0da2f437cdaff44187bbd924310293ead1ab2e71ea9dadf174319b57ab162e6fea08f1185e95367fd433ebaa013ff7728f7702aa1d98cfcd700cca2dace7fc63662dc27be3484a05739603dc9de5471c917d6629fb1b0c1673b923842369f05b453f15a479b4e6edd90a4728216c1b7fd67f5b23907989b0a277c3d6da044026c39c035b845737bc1f547416d683ad9c3ff68af07ad6e7a94750a09abe84b0fb1b77612004aecb969f75713158e8f7ae8f975423e92daa6956eac38387ebe06a0ffa590cff4b7553d3c879e808500d0d2e1b9b3ebc5cdc2ca9159d7a30270733563a35a84e980200b754de8832b5b502c152a91a732f74a0a8a4e9cdbef71bded914c9be172ab110c6a582f37c40c6ca2b315055ddbad48250b0467b5ad704476d845c1ec817e8c86789581c576066ec710dd2209e4e4fba9afeb4d0047d54d1953ec6ecd29a1d5596e6648d0092b481b630b89b484b47167607a2d03b14c9d19eaa360963e556f34e1dffc75fb3bd53cb0d94890c510546bd1ae0bdd2161704fa10c3bec3946346b63564d83adead449d4031786f85a2a80ac846a390e9f3e303d6402769cf2db6f226286032188252082fe22c74f8aafd3be581757bb47af8a9a1530937e2e7ae4ab2353f7b12da883433ae88349d0a5cd833f597557b80584b1a0e51fac860a4f6466469a7abf675c5060d73dbbd2a4e1a93b280700527dded2d6e250636e40fd79a2f4ed3f6565174739eb68b48cbd5107a11025efa4a78d81e8a873c8b9f3884e8d875a21cde7234d6aac2874f06fcc1c8ddd578b93c38fcb91676fe38ea1fa5e1ce8bf37f9bce5175862bb51cf5c13211762b56551065f2d243e87a13f28b0b865f14b27518897a419a3c4cf94577a1c22dbde080f6895a90bda64278e94d4eb8fd98295cad8f98819b522abd5f4eae16a5d42f087adecd4d9df6d1eff99244d6deb544e2d3d65f0a9cd7991054c33f9d2dca3b49c860b7178fc9935e36960e2f11a3816765c09349ba4871a6afa94bed01283cc7857fdcacfbc0e7a8f3b1feedc8a85264e3a508daa1d8807ea631be8755b72e7b6ade6b9baff748575299a65dc58ea487b8ba540e55bf66473b47a6a859dda985b0c6d3d272a79264439c8bb4838ec3f6c86a18b1b29bcfce69c6f614ef13608683732cb356c1e41537da797cdae767301facb81890103a47ef1b60263035f5062ef94dbb80077f4ff4b283eaa6f9f6ce989b6d10f060037e90bf7f123ba7826147d5e43a9c8bd5cb70ee276bb8b594a84855c75dc875b23d21ec66e92481e1483313ba5f487e53536d89fa018d41d30437b174d8c0ed3eadcb35a345533dd662c1c6a78cc94ab0ac1f14427cefdd6ddf0378803dde07211a8016e74172dcc68eb0b503a044dc386b80a048afa48b9c50c408372f45c093d3f8c8cfabbe7e268bf62ec26c6494ff853c0a162098a989786fa45822a0b6b8a0b449a00471c45cb9fc5da9ef77536734889c5053614f8a4bebea555c113ca874f733140de23f69173846c46be09b01d71b7899b008673c2d1b6095acb174f7f4cfa526e3bd2d441527ad7e94cac3b87f230178218444ac7578377a4a95eb86edaccd9e029782749285387405ac0a979bc007052ea4c59cda0503b9b622ba29cd27755a1e5613addbc4f5d6e1988ddce0428522ada4a090b03e82ee55c9e2596cf02f82881c92d6a2e4480d1e822b280942bd407621d58847f2f22a47e472dbb96637c43217a49ec938a7808c23da36b1e101a6e3fdd08572f366049720ca127e2ec26f17da591f878691ae216dcdb8d4f3b0b273ba44edc2532ddf299f12c55c17770a48b2b220671c3c008edd04f9e52529423913e40956aa9349eaca6818c71e8db1d580bcc20667b0b2f61b59d71a98b848c48b55cda345cdd7d96394592a324c621ccd8ae1579d1d26471019e7675917999d8ce3422bae14c46ecdfb7f47ef1690bc1e97c841800f35d7b9a85c6700ab250e7254132df41aec517fabf2e97714186704f556e41634e2f9d7060ef78e39dded7a1bfb3e5ab0289fe98df752b4db994b35f1585140f673638e8a567fcc4953a40b3399f188c746664c8be6fe764e8d8fba0b249deedd554a7fabb92425faf360ee79fe2bc5788868e2630b0c9a582969e1b1ee132d242ca0ed15ae8183ab8ba74631d267eab4d6331e3505de87a81de92734649e954dfe65465758dd41f41e8f2f2ca0d2c0a4ee05fad43120e77b65f8f74bd588413b9751d6e3be44355d9dbeea3d172dd62e3c32bf1e59e30f817cf2f9c16c56f17ea4eb731d11bd685006213cecb5403a15cff0f9276d5decd0bd7bcfa3685be29c8f453cf7ffb9f59acc61286e19d3d4cca7c356e97933092699618828cf95caff294326d7cc814fb46fec43e3813c1c105617455c7de1443e106c9e24223d1be496b912252f60a612a65cb2a76d7d319b038fa0c839318a7eaca878c82f0782fcdf587e6b1226afbc626b92810a36e8a35a4d906d4f1d1e7b7672313d94f6b39e5490ee1e0a1d1535c1cfa6afd0579853d1bacf1dff640ff0dbe88c55091319d94e75d883ba9467d07ac65b7c26e3a53d60b9aa68c47ac2a0cd7a8badb62287847f6bdeafa380fbec64ec0d77c299892df01bda82db3d8fc5e8380a1092e39d3aa6aa1a1e28db1b17e5565707c998d62a8fdda09320798a62b256d15f74e587bea9a84581c536e2d36d38ebd0fd259c6114e97451c55229b4e95bce9f8933ece0922a3b728107bc8a1926522d7b6bb8e2b95a9c137263b647cb1f2a57aa46449b691b88785fd8aab135a9860806c2bd21ce47eea714d997bb0e42f2c4554e2eae93f57df7b4b335f4e9b3be06685042c806bcf8c1304a3179254ef765c7f8eec9c4be2c741c2b5e789e46a2298229c3b2f8e1b3f28fcad72d9591337279dc4236b52eb5e30c2039cf0dd76e942fbecdeff5100f1febf885fef3de096e8e4df36fe81c77e5351d318f3b92f011a94df65805ca50e280720831c43e3d89349668b03f7de1a1ae5124c00c89b4840580dd49aadcb67bddc92e12262e19a145965709b16a56c4cd0016ef607eae49bbe14e332bad9b9997bf6781d2be97545e769174ab9f0210ef47e6aa190d42f8eb7cf4f5c4e942a34504467477846c5d503b0e12d59d55596bc1e5a17cc8e1765e166e2ad7fec601498b029fe5eeb8b1a6fe5f25dcc0eac67fba5fba602acd80e0d94b55469d8d9bc11a9c305525cfab9d25491008647dd25e0c1d88c51f918cf792052908e9fce91db2c27c270e6aeeefee9fedda8bdd175b335abe2fc9628eb2447d355dfa9448c4d9cbf6c62cb56878f407bb3ccf03457bf31b1b718f0dd0a44b99be594934618b3c83e350a428323b7af87cb11d902a9274f6a3d7f775e6b84bc36826f11af0792c39fd7bc2adff2b1bc7d0f2f125ff49c818a5db2ecf82c4053c982df95dc50fbeb17236b91c8a9a23ee7464f0530aa7eb3ff74c799e163a245ef174bf0b5294334942f9e32cc21e7072a573705caa657cd0ad51fd214433d8e3eeed8874a1a80d483484ac56aedaf0af8e4cbe1c6c0d9ed5be63f82f5ad3d0bccc1398beec5ca82bea1164741a173509ea8de7483ae60ec1a54eae8f8821c7d5a5766b3cf895543b3ff82e34f579a6227b10dd6d32aa5c2e380fe192d3aac4df39bb870e1d237a6654602cf616906d8ae73f33325db9e97e11be65b6531ad7ca84954db01d770446f3400170a832454f8d49bcffe0ec9a6ee38ce2c6bf7d374e9dcf1301001867222ea0efaf135c12f9dabf1126ab093b226e03350ef310757cd2908d30151913023f598b2905038abe4a4cbfc06b1183981906627ee13fc1354074c801e60475decf46a0b4b3b84a38e54d3b904f8ee94b57f9c709659dff1116fa4d395e217495cdd999028ec08445bca943d1806ae7acb71903bd1df10d3cedf381379a24380e67ae3f5f189a4ca2140789f80b1392878ad7fdd39b7b7e1ab6606049627fdf2d322f32190c53b36906773ca1bd143529e6bf97671e4e57ead5a9a8932eb1f2e4e158f33c73d2ea52012cddfd7e49efc893e3852edf45856fbfb2a75b3784895d9a5498ef9f35ffc849496a9710e765aa287e1666765ceb159c98776ec97a079e9e23d8512ee1ca67428d7addf08e27a6dbda0a5ab3830c11fa66459aa82f6b1f897fce205d3b70035570b574531c97b6e685c4489b0a6ee8d82baf2dd76d0ec20a824bf252265ddc1b9f8af0e02dfea1abd451788d06b26084c05a3ce33411cd336777374dc74d3861afd328e4314682d1c3617ddf241a892a2df030f847669b0510c241573bbcbb5d61a86aa845a7f9f5384df3c5c241494c7854950bd58d28032e0772f8637839fd52d9da8fdfbf522652f1fbc5208a4d3c1eb5bd0c275ad87fcf4103db14015f3a7a0e9a14f42b20e57dbf7cec6f0a74a857bd819b2d5f54bbb2f1dbb43e67b0f64a7a9c5b4e3d879fcc11a06185510a75f49cf8704c2605b7744ccbf16b2ad3bc8db235a52aa4891418fe3b4d10c1c36d1a12f40b396cd3424d9f8e58ca2ea07eb9b62ce858a3b0c771891a6436b5e07214bd278b7bbe97ef3ccffe15415eab70670217307558f375c3faa02632cb20c9e92ca1f27ec0a08fffa46109c3299883878d788c78c8c777f13f87d10e377b398e2b9584cee289584e2ac8e4aea6a4ff4eefc152bcc9606982d96d08bee59f34f8188882a65eab4671986ecab9422310ae0f82e133a2ab6ed3d5341d7a31f515467608578993bce6fa123bcde01f7a405a0d8cbbe6538db53dd228394edd5af1f08c5ebbac05d6880be7400f7e1ae131511ded6c412c1f492028b9802560192d96ded9f797c9a9ca58e8ce982649b2a3d281caf5e45cdf308ba68b891c5007e5b6ec2dd361cff0030167fb4361095e4abe5df7b874c95df3f1b6eccc9ef7558843cdaad91ef3ac71df538cbc5dd78481c337c46ddc5bdc655487b7b37074aa699245c6f69c6f47e71b5a4eda9425ff46fc5b42238a122401e6ba1c0fc237ddfc3c7a57af5cee5a5fdc73891ed9a97b2eac4fb6d68040fa8ec716b81bea3e151bbcb861af4f1d64946426ca556b85d57b10dc3661467857ea53fc4708dcb4b1a4eb4c71961a7158cf04e50c989b109131f186c2191c7733f1383e73f7d188f5922d44353fda971fa6f6802d7443dba117332adbfcc5c3be0e7dbc08079a58ff404884d6816dfc3ada1c2d8503a7192e78e0d256885e2ae818042b1e0fd1dbbf4a48d606a2d4fea7cb28821225830d46bcf6d7b0aaeecdc863c92ad059d1bae166fc9670c0517cb892a750ad1e98a9349606272630605de17a0afcf734bb03d4f9c35f21b6a5434befe9b4275be326a1f40c3a82c92a399fa78919b4263d2368cba823e0377a6f69cc3e387c0f7674930277a41d0251567aaceb2efc3246efb5994206b9979b88eebfeb2356464c7914c0693097d187cfa9ffc40d745fb120aef1614b7598dee03e30fd3f9046602d9663d57cb4f96acc7ca85084f4d09c138f98a68b1bb28653b0e439f1573c94ccafdfdeed0e2285cd9c9eeb8973b55daba71d62336961b7cb56f07f56d25edb351e739bb7254733165e2fbdc26b0e17399382a9b890aea88dd5eb0b024988b550bdd7e86e50a30dc35ea2d0eee98c146262f22cc7ed142c3b7ab9ea2039250c3456bfd0f063491d501159deab722463c38bcc26886b4d44134e659cda0955fb79cecc6cf53904471940a404497de6119afcfe04d39fcc20528dfaf92b04c17405dbbaf4965e2fe57663edd432d85dfd737079c4e3d234b731fd8a5b74bab26ec6160fd3a8ff19ca2dc361ed6273e87cdd2f7bd09d5923b3ae88acd532a1de55e42ef18796844cf587fb5633b932b83d1eaabdb1acb96ddef25b9eedd6c4c8b03f3ea8e7252fed1b5f0c7dfc9907182e047a658e079e912d7c3940064d76ca13e9e5a896b0d461fcbc7c04d1d02b4f1ac1b6d52728dcfcf543031251ce84395e72120f1a421ebf4f418715ca5aacda9e23b5e8b633e650a3cda16757a04264afa1c8221f711f1d27d89f193f79cd108927e40c30703ae49cf0b07b09eb2f2a9747f8814414da2321a9e8a72df6735c10bcc959fc8d0fd113a44d05947e2256bb5bbcc4b58362658982b7e27889479a9707bfd018709ab9015d85ffdd3e84af4480943506cc77388bdb9125ffb84480ebf832167f06b81faa7116795ca0d1c6489694495104df8fd949a43d3f4eb087d2f26a9b5d362e9113559ca2aab0c454d609b848087bc8d6fbd37869c9b3d7ab78d538aa9e9cff406084fa283a83f75cac2c50faf0d1900caf079b4dc07eab4cb49824daede0e7f3cf106d252a87fd3b2c77bbe67000c03c48c2d2707fef40b31c035874a88ec6af62184298266b07a3f89cb65f293e49a1c3d6aabf6a3b671d5d40475d93f6360772bbf3576d8df3f14d1f8774b378e60a843b601bd8a274a7619aa778df3344c8199f5faa81064b7c1498a5adba03787b05fd52a4e99eb1227650e47e9d29dcb1d08733aafea6389555d23c8035324009e52ebf773e830eb3dc6da331d634057236f1d82f811a6125fc1e8ae0204ca5e186a46caec17698eab8e545f2c8e6ba494de0443f67845948e56aa55cb234d02805f6d6e998cca2029f453f50a95bfd438edf1813a16389b2a15cb2bf0c12bfd770909df7b690b7d615f8a4f037f9106732709a9f3bf3ad65acad1ce711b3374441600e7679a231b4eb4bc1f27f2b36d13e2240b031f23847d170290ad6c8bd77ec5dc7167c622652aae008a28e15107c95f1348170d862204151d427fa371d19f2413b29d7e1a01548555b00413d46c13ee37152d27a180a3746500159505eb39b8c9c65107ab8faf381d4ad28406e41a1afc0d66a5d299a10080446457333c34606ec8d99586509311b64f362211e481f7aa67deca552c82b6b9d168caa8acad5b445c4b2c70ab3a86375250f24931f408b12362fbe21484233b5d845cbdfc2b6a112b5fbda6e9ae8ff52f40672e1dd0d2dce5960d1f22af3479f82da88c99e68009fd6aded45ec32dc00864d639ec23a4afef2f79b85877b07b55a6df36776b9c6fa5f1ef01a8429467d9694dba47af855c29017e94657f57cdfa023e55e8eb2d3d62a156cc5c5e72f4dcf18b9d5a4ca3e4ebb62e827f983b19f042b18a25ccaec6f6c8c1bad687764ef925a740a54054d2e1a1e8c3d9ede78685ef442c654faca5c35bc8d4c22f0aad4626f7062875ea0a3b9980d5bab5e2367fcd04e1e3a8e2ee73ddaacb7769f1be784ef4e90e906189a063942e9832b82e244d401e1abb2ed81946593a53ac4d80e64e7162046d218d81a7e55ffa88bc72273484d7eb3053e871e849900a6889575f758d6b49dbb5ed5eba067e538831ce7c7af542e6721e09f4c141a1e95ca8674108020d84932d78f5e90f8ab8e0611928a87afeaf853d3865372f07674c17d654451c17c1cffdff7919734ca60428a7a0c5b8395322d787bcbdde87cf780fd82f2c6bbc0e53a3c9b96b09fbfec592c3f8a3470bfe409ce0962c4bb603049c8ecdce0ca2ce4f47ff257d70da14fe33f064794bd3ab12278c0afa3ccb6cf74cb35d8f7025856b68b9d68a11ce080446c6616a82f691a2f060fc2c702926376214f6b8fb0d46e43a4503489f96bce6205a66eebe961668be6dc5ae74e08a53527fc39ebbbaf565f544877bebd60a2f29ee8f8ff97d721fe3994b017759954dfbdc6ffa977c33612053b3f75e6f94fe4bc7fd791436b6725ec3c68807748ed815f618a3653b5f235fe385bf77aa44ded030b10689e9d62de6952a5a6992552a90e8494b63f99a06d05130734d2d2a7eda287989348a5f99384a4d9768cc935ae1bb86378e632e63d606a2947a275635a3980f0d39c4f98d0f8bdeaee944be82a339c6dd89d17cc25deb9ef272719edba98be0614e67539d00ef2a71995a0b18f1f0ff098d022f571411ee255e21f4e2eb1328ac51fe8567f144229637c6f6f495921c17f3bc79ac242db43a1701be0468019b8c0be1ddc66c73778d3acbc970b5852b4024236d57668398824a98cb8e5dc37124c0e7e284179e3e0af2a9dc3afc4a779b584d2eec56a70d721fa7edc5df20cc5e235896a436d01dfedd77042d51700368e8edc049f867001e18265edb2e043043f46e3855829f47ee989bd398ca79096c72e5b166efe0bc9c367cfdfdeab647ff33c790878a36b4b79573186068ee774c0f95e0e9ee0bf8691d53f390de0efd5bb720f0feac1c21146f5401649820c79ada062eaa5b76827a1d39bee3728dde6d79d88ad5e96c96a8861afc2c2a486a17ea9b5bf3ea5f5e7e747556aa1064dac305d4331bbcd11ce7b3ecb1e88df79c867998bf68a278bedeac8ac754074da3f76890d17986eddbafe7055cba61d9c3ef0ea786825f6ade2478242d4d42a14ece3896d92802954bb98b8a78c69c7966b95abb10037263dde084013902411e7d9477cb8d9e39c2e18187f5b366190f5ee0c4b53d110f3ebb04cc4cbf9ddac0237e978cd677f14900b06647e0bc2248aeb15c723c230653cbd70f80b42f2a98f93772adbd69f7f89bbac86d945b245e5691a8bc0d842c4fd12d93cad5015fd41c2f003054ff9fc90186d7d5cde86744f7d0b55bfc85807f7687a3f8db58ca3fc86c58f6f4b2032731e659db853dba36a080f9a86ee5933e8dc8ef59c708a4e0ad38444f35c72ad5131644374d3171db69e929e1c25a85177d424280c82c048e399c8e3da9f5e315f28b44952c56a1587bad1eb7410ab652a063e8271005a46077de4c4e0a8da670d88fda9ce914e0b30735460888b749d40fe592106b5055d81d06955439dd908067d6488c2b2435d71cac37a53aca9b27c90ef1ec29e64f1cac25603466418443f2371942af2d0b10d462062b218249324fc5ef1cb557ee5234c0416694ab8db5add0edb4b830ca496750949634752f63ea55a20efce9a70ad7c3f029ae82d2bb0aecd311cec461f06623665ee0d5c65ca940c0183a7c7c56f5bff0b70f5fd7dfd51dc62ce9ba5b103ac80baaaf5e1f32b21f411e07371cf2da750488ea93fd356604ab8738e9d99ee6aca5f271034b6f26027ef54aa83c860f91ad83575fa65f7a494d4bd42c825c774d9945344ee5c7354f0fd2d3d5079147004536ca580f39ff125000bb74ec9f97b34e2356db171617140b1952ac7686d34fbcacf97bf153a238b82fe91ba6a60f0b39148bfc516036d1213dc201ca2ae9a23dea50c7b3ed508201cbe33efbfab3183303a1e9b225c4b7fa1d0db9331648f9e49a56a20e97511d74b8b5f6a72b85ccd3d4778d1232e52dbfeeb1e2aec7824a57aa0df4fdebcba65a6ba2b992da37b23b81be3fba28f86848da7579339bf41b33cf24a671d936b8e9737b063c2d6ea99bf63fe5f7ca18ae970415d77045e293bf80dbbad50e14be000a9cbd67bd571b86af3582b321995e0bcdaa2d3aea58bc19db08f7590ed4836d9be5482c5d1dd0cc4b5d151785cc18808224b29234482c9ef01b10f88e046730f01532c70547febfef99940d80fbb344df1d73b78c6a36dd8ba7e52e0e73dcaa0d4f000046ddbbafa3ecffe47da99713e1af6360ec730dd3ff2415f676547ec1ceb9043bafa7c02ac03ac3c1657a4bf10b522d5b707c60fdd08ff5faf9028937ed5c770b81ba0c3a63328db220999ae2ea07c18a6e6d080bf40a6f949700c86e713316dd05a8e4cfaecdcbfb627d7025074228e17d7d6f768420bd6806660938355ead4cf3fb83dd3b9587c5dfcffea8b077b0c09bcc87493bf1f00d8cf7537734be2f5f47873caafcda45584b6199a3b47dfae9b190e9dd9206eb3d2c030f2df4bbe3666e5e16906a9c2cddc89acf38bd5ce56bccbd786a61ff4ab4c3124b9f764085e801e83df018f54ab8bdb5582c96ed3d78ec72655aa66cc362c4cc10cc3ba82bf52e7d0af3c0eb519f26fc43df7291f024a06c5e5fe21a818e2ff67823729c6ac1a5bc96d2ed5e59062e591148a6d25ed951a4825e47b16cab150cb80151ab9fb3748b7b40195a39d9730b7d8e9400a363d4217a915f3a10a66a1a2ed695abf34d68e639fe02b8defc41fffbb33d0c19434aba858dc7cea1a093c352c963c9297e81f4bf0f1ee14a5b0fd17de72b40570e327345dba00433dd9051db5d11821853e22eaf76b9f32f6026bb5bc885c15e1ef0d7693c6138a813d3f451fa02e3f0b8edc7a6ec0b218025aa5770e2d948a30d0ff6ade27a15607d325cc91d651c063120a035c747e52b494a593d661d1d13fb42245d1da702698e9dce3b269a554098d70da5f81d39fd7e6185be3370f69e257eba226f53fa84db7e2229852e4dc8deee0d4407aaf83f60918bfe8f3f08dbc3d6f04d00bafed316cd04586dbbc41d88bdd565facc3d5c6b70b7d4976403722cb05fad165a483ab9137fdde150bc0c0cc98b6ffae98aebfdc2fa344bb7a7dd122dd3cf1c636639f570faaccf67fe4da129ba3c7790f0a21336c8543ad7553d478c974f7ef26a9f66b0adaed76e9fef06f8effdde190ff1fd26b005486d59b85a32cc99a741b8254e638115778e94af5f49e847e473ebedaaf555a86f01ccbe72d44386a6384113de88e9cdce8b7accdef70ca5ecade3ab53165dc1be1128e2ae79d9f47b0bb1cff1723203b4233ad6cc4b31e5baed9b93f0cc110c6bf53a6ded6de534afe78c047875d2eeac930a4675408198d987c90ac9278905f4784214ecb63b3fc53c877dcc25e914133d562205a9c9043fe18103f8c861147dbdf15e8824cc446a1937bdefbb33c92a096815644dcfdbe439898245aa90538a0c2a631fa14bc471f4c9250e2aeb852a2653cf34b265261d776b494dc206051eac92493dfc229cdb0c761e65f74d638f8026bb904db70df6c0ac25e6ad90564c8bbd69502c9e987a0feb660e10228df509f67870dc421c398ce38b876cab5cad9d46a049e268a06f3d55b2767740afa685538ab0e0d5ca722a21dd52a8f8d0b6050816a6a0872d883e2d3bde838b371c33df918f5a8606af0606de758b92a6a10d3518e0c2f4dce4a04e61440123bd23bf6b75772c5d248611b2b011afdb74d39f04420cb68f5ca66ae6c8bcb066be8c5de7b191c5303b69b9ab8e1e186808bd8dbf9c397c5f95bbc3d68c8aeaa4ce7cfac4183cb4cc3427ad8c305efb1738af70e4481873b8223f392a7fd28a090e2f811f9adb9e229982a50233ce7d966cfd4e751fb5fecf8d3f716045794de532fc06c1c405e11c24aebc9c8311b51bb413ef8d12c6b0aafc29270a3d2a0a18c808a33e70e3c92d391e3e76294a9fb0fbc9df9e5549ab2ce8a7225027d3717667a48fed8178bd19df6d18ded8e9d1c0541b9e01121669e3b60ab3ee84de764484577063c2b681c2a9d813c1eafea3e7c0622dab26bf43a936602071acdd2ddefa2502d14e32808cee9d3525244d561730082b96e9140d8bf90b482dfb340eec483363249de65c849b96bf57ea022e0d6a7ddc0395c5c3a7292c6a37e3b50793115ddd486fd26f7e59f474d7da722c91fcc1afc7dd0ac4cb6a1fd2393a25ca632b4f00bab748ea09b1035f695e4e93123a0b60ab45ddf68929170ac88280bb0896630ad735cee378d58536517a08ca796878ae3ca07bb7546ace1f7d34f11a56d863b192671de51f2eb6664c15b82dee5cdf78d09af1d605a2b8cd36227de449cf0f239c10950f29494557db0c3ea5f3d909f8288c421784fa2c3e98ca0807433a2c5a34d4c4469f6a15ffa7c6bc5961bf0d05fff3d725bfbd606d0c8a3632ec595df5151de5a4eb3961ebaa777465bf38a13d6bf90cef31e5130eda09429bb0ca5b3483f47bbc8ae553858744debfe4c45fd8d8b2c54798e947a931b93d050a3524399befd429f3eb46b2acbddb8bbb752e9b2f7bbe79ac91e2d9d59840d18b92d5e5f204dd7a94b4a1af7779b9eb0fad35028a032fe88a7cd44ebe87de6cabb4b7237aa940a1242741028ebc810d4f89703ea5a4eb9c8580c73af77f67e94d278c84b1f89f92c57ffedde47725ef6386096f8cbcffcffdd6af13bcf8907d49f7063863c50ecda226d94960bb4d217b48b9a31a7c61da8e69c3e1a61dd6522a4d32a508fdacdc73195d36241c9fa6246d8cdabd653c64d41937cbee8e0fcbbabdbd72d04591786fb9fad74cb79b7fc88577a837bdde7502edbb0d4c8ce22c4537650dfb098a2bbdc9960df7d1d88402f5a0bfb5d12e09045ffff9c870a96410bd97ef80da707d224fe4d7536b2cb91f8d82bee040f882b69fd14bffc4e9e5cfc244b4a7e1ae43ad43c20c2309c9a77197f9d55e56196182ec2b672f46a4a329657c0a42fa39fea53f24cea75dc0b96b7cde8fe323754013243eddfce8d06cbf6f61361e38885eb149eed131e22efaf5300406f52e30447d016c1c96e8c644f10934bfc7ed468e54abf18df2a8322bee8fb5c4579e7700a04e05899c9de19cdeffd8b8de7aff37db6125a62ddc229210ff8458d788f0225d67f62b41948289839a8f2e88fa10bb495c4b71a9d8f2188d758ba957dc68749f56f5d5d6ee138be10285f3adbea1c2c02fa5f76f8d665d4af7b0279c4e8705dab2b70b7e70ec18977e01470450d6a011348badfe1b5767e97f75e11baa62f0d1315fee987289e1a89435cedf9006b3a1bece6619d5dec19a6d5b812614431e11790aeb9393cff273668b12031d96b8a685f0146c701cbd1a0c29e05adeaff95f9e95a14bd362cf6cb3b174bfae6cf52bdca45c1ba03a711c8a3f9586d4dc58e5cce9e0e961a478fdf7a721ae725d54567705ab96f3440d964f385ca3d6f110c96a10817fdec70bc54032af2e5350f977cda3e67234ca325dc5c8e65d6e504c9b3962c98f4efd5422ba02971d09aa514f4cd47cf5caa4ae969af15cb0ca832425c03d70651a2e976ff606a48b4670ebb1e215f478924fa99b6878e82cd8ff9a14f7643ff6ea43ffa3723744e28047602757fae7f937fcdd846727ca3b7f2ffc82ff55673a4432a497763095e95bac2158d1078ebcb2ea145e9baacc09561bb03fcf8deeb6e2b0c85976b9141f3b9c1b81a67dcbae0694fad76266e5dfce765714fd2bb3ce20800001649c2536611be08f8734ff3df082874ecbd8aef45a762abaf1d26a3b78e81909dedd7693c09eb946e81c8f81bc6089e5011bccbd0d6b79c5b45ba4bc664c5f76845b1b11cb9d1c617f26f979706496dd372b800f5e5ef075178bfacc3d33ae3d3b80b64a50987bbd4cc069523fea39f0130465c3bba121b1d5ab65af919fa8693678e666d92f2254180ec48b023fc843028a8d44d588b8e812875afa2b5a5173e648003702dbcdd65a4e997f487522cf29bc640e1473fff25a267aca27e38f562b587844d1235bd72b2dc74703d6ff4cbf4699d0aa791b6b4fd646bfd59d5bf1c965407066dfe16ec3d3057ca73b0bb7265a62b6e470de735f8fb54145155478dc7e7bfbdcc91b1c1a4031cc4ab7516b3e665cf4410b58badf1b7124d4ab870f4f194bc81faf7ba0ecf34ed1c12765486f0be6ed6f9b7a5a9a7f5adad9b4f4eff55ebe71011f5475000e39d94c1cf7fb068cb7291737beb60b14834cae4392e89b4d0aa5b1f8dd65b4f67f053f18d6f79fd7637a7ad8f0dd5943216929afb0ef552f93d30ee6113b1d6a8890ba1b7d440b598836d204e026a030915bc0c742ad92b0e70a7e0cb98c5d3d5880d99574aa1405235acf392022cf1598916b66b975c4deff2ae7986d1582b6d17052c7a6eaf6e16463ec5d1b354f0235b4904b6b6feaa94f157aa96e2a41f9559e5e26bf18772462b3ebf77ece56cd8e206c41ac0008ee18f61ab7419bebc217a9c67bcb1af3761495bbfe864ac7dd78a4301ae9975f4820ee7d36eb54cb8e3517a570041508048eebb686433487be42f5ba086f2f2433ab6ddd1e722b6e09dca8b0455fc7954d8fb02c2c1d723263c7dd4ba4d314a1a4eb4f7886d6f233c14d6c8d7fa6591761680d7b97d47082670a1153e673c97c73340a5a6c6c43fa75d600b7c2e699a22a7bbef3a3cb7b44162e5fb8776a09fa545609227123ded5b255f27f884f525f765672c3ccc1e601948d61865b7c71a73860624e1179a451cc4dbd0bdfad8230042560ef62884f1ecac491ec4975a8344cef4145f13b04a12fff6c4e489d0ca624c52e7026a0490e9a1c77c0199f7150c7b8c51023be138e683e2a0277dd2eb4b175b3f3ee015189bf97984425cf1fbb1620ec44b0b07e6e758a660e4c5d28f1633f0245210ac7b3e6a1fcc8da9f5cb82b57b9d957bbb9f7aa673e453ce370beaf7f10d79a67649fd89836ea05f0631bfc20e0c1e69008efee31552e5276a8fbee6636432f3dea91dd5b53513ee60696248e8a7c871a889700065fe124f0a70eb1dc77971b52688be87cd944c87d88e9ba496e48008fc8ba6d94be7d5a0aca372741661d0f78f69aca935d6ed16952aba31cdd7eb863b2c3a6ed714f27ea8a91b6a59f07abd1679da2688d43792bb6daefa7cff318b43ec0f1d8b5ae65be1ba667473c130776c9dbe8da9627d22b6ad7c53e0ec87a9e3e6259c99a2fee50e273f786b919836363c8bfb24e0b7caa1770b2330726478dcaca93f1cb5103167e7dcaada74327dba2c6fcb6a71bcb32f39ebf53bf54b2a3c1cd5e38cbdcf4d54b6aece37784ff87b6c7c499e8c90613bdd20568466e44f9a97427f687170a7f5e4beae4cf85c458d1e167c41b045f26553dcadc05be41a6e3c0ac18fe2e7d859c1a9111643d6c5b60ace894787833a3b5c11be8c01fbffca878a1a2629d7996e114f3b3d45bb6431ed48fedbcd7276cb033a4aadec938ef5b20fc050838850999c13c19b2de1a45891dbbdd02f044438f96ed33062e08b95cc0c6dd1ce3ce9cfcbcb89e433e82d36e049e864399c8d031433723c9f50f3f5b4d938aabb1cfaff6d963a3057622d6dcb91371d8079bb619346c9ede699dcb3b7f66cd5b8eca86306b2715bf65bd42112f35d60ffe1fc3d6e3b97b0ca6270fda13a1f113fa2d9c4645f3acd55fbaaf60abeafd8e45ad1f7bf9486649f7ce48752c99a14b135d560e16c796339297b956c1516343e84afe0bb335e6c47f12243731a49989caec63d1ddb01a1207c4a5a3737abba169e85c886346254c96deb1a3daa989444ae93c1b3a0d00639c2d92451f52116d9a8530b7db5d669b0ad42c3ba8315f186e578f7d686f0d8852ba595eb0210c310e3dbd9a3dfcaf0522700dd41149f9abd6454693aa4240457ee69a4b9ec01b5537ea4325235792a7783c31d70712df7c9e3f210b596c56982461b77b3e6919c545c2b610f42a07d0e5b74d8c0cec7ea6b674b31cfbe881af7d93d66df68c95c3eea166c3b14497ef48d5e2d0b182418b2f5f6857dcab3f032e583be9ace85aac81242608836867e58d29a0512ed9fa6213b6e5c86318055a4d14d7407ee86348517a199f08932e0f92523eb1e545a875acd0602d295be16c66bc1ac3694c5e3f070104112cb315344c6b9daa34e9d60f867fe65066ffb36bad4eb976e9dee576050ec40334bc9edb8c0b260935626885e24a50c99c0e6700aeeba4e4d17ab726348cf47c28e0ff5797d6d4141c76cb4cd13664d1c43c1efd270dc8e47c079df10bd51b741c5ad7138c34d10ca0b8d76cd5d5707fa5841e8b4667a6b324bf2b772d44eb2e698ac70c79d41b607bcffc5bb4eb837753c6ab83077442c8d07502e877fd5cf9e3754a7d7cd7acbdc27550c90c95b3e8df5c0daf6285ef391b7fbdfd86e8cae6d98101c75553e9349170b8fde76e500e858619cf280d59f1e0e1f30b8cbf15a49296a9362ded7aa64cd9faae16dd68e22c2e1ff90a131d1df7ede5136ac85ddcd93f61ee540679d380a9eea656ee8b8ab68b57556a08e8c8e0b9851988038098c201eb6f01ec5b978c2bc6ac3a78423beffe8ba2b97ea884bc23784cb9aea6bddf1d12549e6d50171246356fb6b84db144d815cf4585c596e6bf39c25b873931b21f02e856b20b392895b5a2d1c092beac9753dc73a69a4dda1ca9c67270a3140ae222978f668b51790cc2706d9d330fa109e5fbd08a41c571533035d2479b636cc4fe4f79a962b64947040de00813e1acf9a9feb6b7cb061035d431243c59748da74fa94ec65ca911057f965ab16379d6267a9235d97caae7435e3274c9e3c07d36a61546cb41cfaa3b2b31c7c3f7e30420a0ac81719592a17932cd09b5af64e1342c75dbd7d50febb9c4ec8d77cee02a3a1ef05a4a8f0b3c5514b3d9afee3c274b0404209053fa5e288e8791ac69560f067392fa78461aa4134dd211dba5f168177e66e280c9c34ee33d43f9219a6f3487be182c87beb1c45494780ac11c3792d8873442dbf51f75d713a958255e87a261f4d1d02e845978f084f0546151964f63f597816aee977d7be29034ceed7f377f0750ebfc4312c0a6f404e098dea98fa726a69562e1445036864f97fd28d50fba164bada5e2a5ed8c634fb8efe9d901228584923445897b34f9ba785ff3ed53a379a2df37f098fade0605ea1d39614272102a1d24d5f6f87f6bb18fc5b2b77fb3fd2487f93f505ee6117950823e25d0a3cad34526df21b6eda4f591924be6472f90ba1b016a8a7c464188f81eba1e508b58abf06fab29ced8818dba3ccf2a41e0309dc72ed0781676f8c90899feb9214b2686d68dad3c42b4f58ecb806c45b42d8e71e4ff9d503b0cbbac769a9aca1d44719b083bf1c2f0bffa91f45fdc9a1996b719cbbb4808b46bed1cc6fd9818c8a5261f1a2b955687fe5b415b8038a6727e4a44ddbde64042bdc25e69b5d3c18f35abe581669af0a9458a01f41f3da793a92e71d8e96fede1ec6d9c98fb110faae31e419a94908a16a6bc7994959e7ebac813f083303df65c09b8fd1a135e94f9993027072a09f1ce72a1ebffa0ecb160885b5d0ef78c8e9c71d81da80295959b8b6dc605c81865e2913b75e1a15966421e8aed4331f3c42241419be51bb9eafc133edf48503763d0ee31f2eaeaf95888ad8060451c1bd1aacd1b2190752df15336098cc035570775da86b56ddb858b0352f538cb813077c3134a39a0079f2016cbb0384d1aea53df8fb74a8f18daead5af0ed32d14996abb37a4d7f330d5c6fd74d330894e9908e56bf4cf9d4b49dc156db1c72cdce514e6520b94cc429d76060dd24ebb21051a1fdc1a41c3424e3befe6d42d96fe1bd259520c38cf329b7980d7a00255be43717b47fbcb4b9699ea6c88df49388bfa16aae77744b390c2555efe82143b2cc646448baf4ac8cc95598278146d36a94cbb0dca5f72ff6c7ae06f8af3e26d3fa867298adeb584bbf75e08e05e2d52cdad0d1f998efc073b2c33db3eee5eb9abba31b12410b914f459d4850350884ffafdbc9de178c547fc05da4114566d6c1a42113934f1bbed5153d5801ac06fca337c242288b3e18b0d1797c83a0893d80c801d2f02cf77a5be6013992de7ae9f9aa84c9d15484c05fa748798fa1b811f4c0e2fe45c7a0f2b1b2d40e83eaebd21928b8cdd2e2e6f22fcc48e556406b051ba9a7c80981ea8c1240955df31903f47b003c89ba258a41210a7b50516f59493a61eca991cf325c4c5a1b65a1152675adc6c1fcdbbd61d83b9b2994fd981c28bac1d37e98d8bb681d0187b5dd25bc4bcdcfb5d89cdcab52a9882e92ecb8f41aa82dd062a1a71f40c4fcd309de74cc4995122facc93d2dd3bd4214ac98794019fafd646e599f02b178a8208e37cba46ff669622ae833621e1402a632362c74c21b5014d58ef0c569db86bd263e5dc43fdfdb2eb51e26aecdcd9195ebbd69cf9eb8700840bdd407a8d520bcac967d09763eee2d4bf3144346dff330dd88eb8c9bb9d4fef30f34daa1dc1fd8c5c587a0859409f1d19d124b9b099a299254007d741b128a880b18aef253f5f87469d663c08a2fa78118e66f049059439819f99426987af9caa991dd7343642c27170ffd36ae5a36ca4df0781bb93a1caef0208a3c47cf5cda4eb297900fdd11248298677951a3007626c78ecc9c691c756f29bc310394d7c440388cf732757071e527972efdf362c8082cc986e2c5164c6357f0bfe7e492358317e89c01ec749cd9afeecd9aa1465280aad17e77ef49af4565104f569f1ad4ae9248112a9f8286a5964ce9b578e81436602148be8f2174a5c63d470dc6317e1f22f954ee39ad426094bab94aee56cd1e1d8f1b11cd36d71bd9c0d5c834266d00c139a97e23459dcacf5aaa98c715b2c65c51549b74fac67125f441582ca57bda4a1b1e874ad2210b6e493ca58ec1dc6039b4452f8bc19a34ad20e2f8418e0fd122eaf855ff3a4c65f2912f3ef3d01f32e167fd6ad0137485220b97a21ed265d1f8a050d5c4d2533ed6aacef0eb250af0e6c1cfb7c41f4849182ac1a0f5bd9ed4237ed7905a53d9f7b7b40ba848dc9f96ea3d91052f2115a0339bb7138eddcfe8df62f1a4464528ec34af5910c4edeef035cc1cf2dec362dae021f1272fcb4574409c94fbce4e61ae8d000bf762395422cbddd8416398ae4650038b43afb87b73097474ed00235a608047d788b4d3a4e1915448a0c3d95a3151c0504846be1612a34c846ad8e1b90848a9191871cd076e4233beb97623e6ba497de6683de67f17bfbf3440643a3eaa38b3a41b81e9925bf6ac8175151ba26d69ddbcef9db65728c923708a230f75dd0285b7085e19cd422bcf03d0b93ceb1e994c9086453b3f09ef7a896e5c73b3237a5f067f7bf8e5408dec7d0077e11c27abcd3980245399669f76fc2e2f1130bb13d2b40c47977798f65609ea43bfe37c341e06db7d7bd5c332ada86f9f7f5a621445b02f484b4db72a2011244c54cf03e2138470879206501581dddf92984f1954331775c8e16423141291b7a688defb84fcdf6b5a89b9bcd31fbecebaa83618b19c77544ffa6171d7cbbb7a1a874134e1189afa9f6250054da4b1f00da8e553cac80170f451386d5726065300b3af4230e863150a48916626a958f73253e4bd079e5e6856c42790bb7aa98ee6ea68fcad591848dbd50efc4b49aec023cba0851230614a3d18e4b900c30f86dcb7d1adc4cdb4ce9f411ac2d27f05623b2f9c8669bf0318c4584fa39a0b0c223d66cc3443cc72114c6f2e8392195717f4e3ed299bf4febd1a90491d7eeeb1f9d0d420067c89edd6f982338232fb18622ec6ea92165164f82673251b32fead03036d3f788c7399b456bab26182f20210414291d01aca4acd84e7b01050592b962bbf66a2cb4226e5001a5ce8aa8ec714d7f4fc9aa3e095a68ebe245af258ac448efbf8bd852f73622bf718324fe706cfd2f1a9e325178e562c6e976eb37b5517957cfcf8901f7fe08f9877f937c9b714914a898161622eabf0325f0acf92dc66a0e818909239d5dc1236adae01bb6d276afa3878a4672a848d6ea6b029b7d5d6d3c004495d5312a96a17c6649b0e86714d6a6636db38f04b5e760d6eb3e7bf1c704cd5adc577067fc447fed9e3451f425400890e8fe7004913553d4eb0000b9a2cd2dcdc9efc1fb5d55b94ee7abb7e4803f2065232e5e18d832487684b947cf0a1ee5b07b242fc3a007849c0cfc8f7ff20a5fd9c65f6bf16117161e8bb0d21ee8a030feae768152647703b931036545ee58da052bd7d23535f294833fdbd24473868d4662660c9e7bbf0b8c7be4d0f22899b97302fd30297d56e277bc954e41e7f05d3c5cd00056c390a7614b16f1b1e62919d9be3e6b4ddd10aff2e3af45f5044a6218cd471154691f41aa435d0efddc4040a2dd0cc320710613ed3b160617b4549ddc3feb7c8c26e789e6bd6f011c119eeb8a59aa2ac6208e770d8bfc01b2961a1d181a3d26b8a05b6aca479a011b8a7b05b81c67815d37ae567dc5346a2a9bc5c0c10539f3031cd784a23350f324111b3142d4fa2325478abd294c557b18f5a70b65fb42a23704116db0644fda7ad50306ce979c1dc990f882ddbdc9b2ac0fb2f5722b5620e97098df8444d9eabb5635627ca682491d786aa931cf953de7aff23fd4968a080246f68e9610ff7a8b1419b4044c095f92d8a4d3475f82d53980b485b78022f5316461e7839cbb627af32e1405c5ef3b747bdb4ffec1a94cdd79f8e26f55ab851491d1a7b6f517cb4419f32a55bd2674759bf0240faede13afe51e8c24b99433d564403ef2dac77c9878bdb1b2444a59445e9135ddeafc0595f4005a6fcc8c5814b22854201f4254dcf0c256f9dd5ea4d188792642b162fe4d46aafa5564030783387ad235c50f260a68c7c8f8fa90635877bf1d311fe314fb513ce80dbdcf108b87699e9e23831339b5f5e22b913dfdf000a4cd971da9f0cda9e7592ce5246873d92099dc21793c26eb8685b0eb82a2b4ea0db233828fb018a99d63578d5ca6c5206636f124178ba340e3e01aba29d196d229a0493dbbf81b72d79a3b1a7deb4497d346641ad498d4ac71005e84e47aa5f704ba7c3f9f51fd8154476f45e76024ef768bcd6b5ee2687354e7285c01a499f13be7c92cb7a9d5b0624efad1fc0a2daa617b9c3ca65168fad5e1a20cc7fbd3bc1384aa2a0194577d3c5864450d06670bd5f96644fc003fa25595b80c11fc1b1c5b47fff4e668f4bb38cbcfd7e47abea408e0543bcb5a42c8e7c3e4bc50b74e6a19ca4ea83b4e3dc6732344b6438043d5be4cc3b57ae298c33418b527c019e1724ac48c5c1551b04dcde2b1facba146ffa07b859b505f62eaf5b4f9f59724540b021b33af92a7b72ece36d9adf0cedba1e612103cc4c0723655338e97b8f0c3a267aaec0be795c63f2397737dcd6f62b55a6bd67184e97c6e9f5ce69e6aee69548c400247aac7a2e7ca9f75d5f27198b45e2e880eb3ae00a14e0f9749902d02052234780e8532c80ae949d11d2642954849d7f87442902b3b24302504c5441fd548b743fb37a175eeef6d0c282d828517230fd3f9fe7ca8f5cb5acf43a0f47c97609e0fe2f097582dad0879bed42ce2c734cf7483fc93b8f04ae4f9002629d07c08b0d0382a2eff5814ca703495cec7a58f8bb9326dc83d3fd36c16e9bb1071b42410b44a8c8a7b228c1837b2ee5358554b5ae55ecd77f451e4a78aaf2c057eafc36b1d4b8457b83ff172a035462dd7454b9e58d6f37573af8c9e9fceeb78b65e1058bdeb89dc914690d441a85f303b1ac698ede60ab606dccb8717baa304712667d9988deb72ef0f203c845fad7c04c1a6986f7c1d039ddd05ccecbb055c530c298147f654812be64abc7c1ff901a6b549a13dd6fb0c4e4ee7d8c353ff78f43f6784ec50c10c6fd86d04ba0a1aae758835c57adaa2beea9f26871b812d1a1bafc1b47483e3bc1066b4bdde6ae29933363cf9e1a60dc3f63fb6a2533ea7cb45a1d2bbf0e3a34e20e90728715070f92d709c3f6979ef7ea1ec8be0a38d7703bbabe0a4a1a5ebe982c78612f5055c6fea7af707ec7ecf0097015429bff9a2427f78c30c4006e53fa4e072472037c325b2c614c2e0babca768939c0b3cd3b96d940dec3ead096d5095a11c8e02bcdb8d0961fb53927b98f9f83d19e4503b032707cf2235a705ea25e8fb5c98b8187f2426061837aad1cb82c2a5267ef23df5d698578e6e8e5de1aa1329a7a92597cc5914789911dd302897e28824a08f78a8d5b1410666ef2bb7e198fe16c8168bef4b13b76d826dc270fc85fc76338ec3ffca1a407a98ac8c55992604ce7712c4b995ecb0ed6bffca874e1887cd604b9a824af8c94b915407964dd30aad9695896db708571516d51a455e1e6a1659d3febf6966f6b6b923e095cd795b76937f373a1bcd74066995b403fb7c85e24745a853f96acd296aa253669dad67e88343ba073e2f5f52ca0cfae345ec676fa8738f86ee1686473355f0597f37850240407ff5350d1e703f0b3283acf2d12717485cce169c2ec084fe57294d58d904e24e0046938ee2e6f6188bc2eeb14533eef98243dc6a03a6dc88a578f2355c8bb9ac6dd39c9f54f95440646b44eeb2ce2fd254f670d6c3501e847398f8fcbc55932696dc9608106321e8fbc4d9d449591e3be43a9f44c053b1e83657fb7d0c9ddce53cff1d75e51625b68fbc554145e9a2590c2b290addf2970b02b2a385a7c01cd7a793d942c467db21ed474b01ce726af5da0a56895d869f0b55a6810e6302e9f149fce04ca4d4f701343393480b16d05afad16ab30f853d8b33504f40d9143d78dfda297a3052eec669399f45eace979a3ca20899aee6e375a829a91cf304d5a3d73b8901dabff7c1c5b958233377cf838ecd117b037936a6ec60aa11fd16a93b8866a0def74c7c21f4e630e40577f4f7528791a9eea45112a650d3c37cd4eb36b30607853faafa49a5c41c32539d623bfaea5065c6fa90a4189b2b88868706207e8f1369496bc78111232a422ce96afadf439aa8c2d4a6bdc97e11f951a7401aabfd29d009b2752ca809a45e954e4694642eabb68e863a116a42bc5903b6b1cae026e60680e8185a0083a5099f1897e030dbdfcbc72906369aa7a27c40d77b2fe32ddc8b7e0142fee7af3aaf857b4c89086873336c29e65c729396ad79cf821b2d18eda4ad4fd504975952eb73966be24e440670a8eaf85ec38aa67d35b12866929c66b7108035c7970c8f95eccc770e9c4da70935f75a72822cf3bf6a75969e207746d0a40c92037424eca37df82bc25124e882c184e659f47c8d7fa876b87ea134875f1b2d5abde21c781f614724d6cf263b1b4289eb0a550f0ad038820aebb6df8782290e9c95d9fd3ecf051105688fc03049b162e7c593a24642d0791cf3de53880f591676a1af01c21814c56f5cea0ca4b987a5a3225f966bab90cfbd852ec2225ab9c15053db781ccef07c42bfa8ed5e962e8d9f6895342a8ee68f102120491a4620c7d957f10f42b6f4dfe1d041ded29503a8c6828d7f7f96886d5de28e50f6e48fc78bc2c51a922586b2747b9ed629b1517c869ba956924c67c583c99ea1ae7c9b91f7f338867baac3abe0fea35a47af7fe15e096d86a55b2d4f0a54571dc8c9a3415bc34f7e326638482987ad4d9d44c0faab3dd63fc39ccf6e0e0c168b09c8547fdff240884850839803e519d9b773216ccbef56d2a12c7d1edb12b5513794fd8d1747c48d04b03d6d4113e8a9af4ec89892a48260c5543c0febc6cade1d0216751fecf2fb558e790f668135044988aca25f0316a4f7487ed4def10adff500c1e4bc1299d054f5335e593777d2058d996c6adf5d16fcb5eba4e8504d1fb2a1fdb604261f9f80e40ebb27375b7e6f364c81573902a3dec2b260e6c23ab9d9fb57705692522c6592ccb16a59fdf938ba3233acf57b55d8a2cc3a7ce61f17146befd01d1763ca31b9f0ac0c979f249b27b7e177062137cd3297e088c98d82302ee7548693f7eef36634c32ea4ef797966208c6949f67dec7a65a372c413349cfac57127b9e257e3af2eb66acbef1da0b42e1cc054fc964e05599cb3981efb0675d805467989a40e969910ff51aed94813e84d1c3d2bd5882b94cbba9acbcba6579f9cad99e2ea208fbf1483cbb583d417c7338b6187b50611cd7afa21c637a56eac175fe2177eaeb282089666e923ec6b07cb198f1a7750421db37dccace14c1cf9cf3954b028ea95689fef7ed2cd335793711dba1327c9e918e94fff3efe840ababf3212731664dfd87400ad5a1c1e977493f04836a53b331f4d285fe3e1434ff216da1539cbcdcd6caa7bdf59f85508b58a9ac622e67353e25d1abce32b6fa1a1fe2211324b95cf292776220bc0373525e8c8ccda22ed520a8c6002b576182e266ff8790003b936ccfeb5362ab9cce202ae6cd92329183313e2722742af9519ae535bd862bf239402cbba415309fd1a60cde884f2ee5f92995d563cbb55e72bbac3c78112ba6934a687179ea666ed4a74230229f4eb528980b39b362241ace99a321f7da30fabe32a1ccc77a72c4c79ad49f812e469e716d456b9a8ef1eb972dc2948d75c74a874c02ab7b7bcdba2f9fdcf96416e180df717153b76d2bfcb825aa4525b3258d48e10214cadb7f63fc0e03f0c1fa6ed7b207a57f7336a95c6c76afd04dbfc0d59a4b0769d9a7b2149e77adda818eaa713d153fe2ba1483acb53b9e0765fab49bd96675ac685284f4f6040155e85ed31eaac1acb6c57082912c5c6992fc33191bedff3bfd75ca650d481635bfbcb6b28af1a0e7b3c6bbc24d645d8889a47cb7a66b5ea6b9b46997e42ed7335ed00b525d0512cfc5dff7920a8420a49606efa272d6b06a25ffe3f21b280ead1b3449cb1c9336faf6b378c2a1dff06df60ccab580f8f648ca1a23a7cd90d609e489f30f17743f0a27b16685dbf2ae92e40cc99a40f0563415e322c60898782e89fa00fb4b58913eba2ede0a5fd5993c6bf7fe40cb98b47f2c043da58d5cb1e155b6a48984cc261aea4e9869da0dbddc52f54503f4d88e420b2f9a29eddb4c9a8e6fd47df1b8a5f8b6fef9df351bff9e7fea66d7c7deec5bdbdcb066b83981976e1c568aca7877ef99283184e33184720983b0c63f5668d02155a05eed955531176b319cc2d1feb0c41512a14b72e9c4138cf136d3ac9ffce58dbe910e8abc9c59f493921ac07b305e37a03634348ab7f8128145e60c0b2a551e040af98a6c8eda10d1998311cca0be7b4d6671c0fb13790f673a33f9abc915a5f3ca29674a097f037ef8df59efdb9afc9a201d95091268a4131b8330b570229cbdb2937b8a176fa0b75fda11de1cd0bafb789926eda4a24ef7d8edf22046e62db9c07c9bf770ca45625bd628e3911c1c629c6577a8e794a3dd7f83211f7916b9e021a589357c8df78ad90183f059cbca5a0d384c11e93015f691b6482877d393709837a7cab36cf7e7c6b3f5ff3472d4119fdd161e324a04b6341e3d7c940e1f0397057ee1d6d6fda5f846d8dee4440cdb9d3895c4f604b687e22e1d44490377e18ce44d6a73c37b64f6f74a10d349fdd0b6a20f2be5307ea1232b3571110ed0084aac38c95f5e7a8a6aad4851a14652406788411ccb118b2e1a71548861779426b92f1d41c034ce3e2adad6b79418cc1ab8a99e98a25b596cebf934b9ddca541ad45f07bbc8534dc97356a1e36ae011a306383d1fa3d3e6c1642f463433f1791b01fdfd50d644619962e64c8bebecb5f7629d9fbc8101be2f2a3e28f3d8af7ef3d2576bcd040f29d543291bd63f34ba9d4ce86061e1c45c89d680a2d16932c495a8cb812922de242ec5c9d2a6ff8ca67785a519e342809da0010034165339a53f3c4eb2f30a23fe7bbc8a432d0c9b4f83b2a056fd30623500025cf8f908965ce0de745401d12050c7c0282c2bde058a1187808ceea79b6a3e4c0cbe0b7d0748041680a1b946ca40deab3de076fd983c74677fb0198fb0075ec812f9981791513fff6524410fa62931a66411d0b6daa1f817208542072e873a7e63143107b56958e0a531e8f4e2f18277b546cb3417f592c8d8a5ebe2a2a3521a559b65ffc58631dd1f41df1f3bad6c0c42259bccfd85e3fada5de4b3a7ae8c775ae32dbd2214680c4869f554f50230c87eb6b1ee6121e042ec352db1325f9358f976dfad11ed65ba1a8354c1cd0099f8a36adf9b06279be548f8e6348126f14e4ac9d450ef0ee8b9797522dc8b0b6f17104c023d1e3bac72ff5431c3d85afa73c9dab3f0de1dd6f358be4688428b2e0ed82ae0082571f8d6b77286a0414e687e21c9781caee6063c3db7d87c05dc83a021ff81e7cfeab4d2272e7a6b55d29f12f6fd26e5f397ae766cf950691da4d9de23937b1fa502a7cfb1549ad056235ba8cab88a7235333af57aa6f3e951dda8b651d14f44e8afcf985fe03b43e12bb858bce294d8a915205f2135672019685b674cb6a6fa79116feb9cce19f52ec3bc18dd6568c732646e6232c7a8144cd9914ed44b654bbf07d85b53820387b1043fe0a20669c198ba6803218c8888799aed68acf846a7d203fa0f0265a32c5b34df3f2a6320bde8897d207ccc647e472b0b39ac19e8ad9bbfa8eb289fd2f71ce6c84ddb74661e6fa0001c731e50553bb0e97c636cb5e4815d6a5b2d6d5fb9a16678eeb96178f4a1b1c19b4c2fbd48c38dce69fdcb8666903b4187578ad767c9ba8ab817076a643122d7a34e3e9b2308fefd652b6bbcbd7952d90e157eeea69d6e9157e3ef1fcb3586c6e88bffff6f5e6899c9249bbce73bfa4d899bc4c1bd9d575c61494ecc1bedcfaf792dbcb60c70c1873c5c62ff198b4b48688977a4c461356623c7784555c8e60d78aa743f27646d1009b0869f0fde45844b4fa3c977ae86e42566948e243b679777ff16de38dd221f5651e13b302ee8bd6b65e0d327d8828a0669479771aaecbd5a3a6b224b998163d98ef20e147491b2a9c330eeaa34865281fdce72d433d28fb6f24b63091d07103da7506dce15eae2617b338233b72dd3399c6f83933b4ab047a4fac1a8de03e9333a03c2b078169bfb13a2cf046882e575c9ec1539f985661fddf4f5bde9394ad77591728e4d98ea4f1b3c49a11e915d2de910055f06065f022126558d2188fdf294465983bef420b39383aee0991b1114d737642f93c9235f1dfcf6de581af7f34305855365d7a4beacfe0b47f90dc4c194f494475fa99d1125bbc8be5b240d220e55de01c152bdf4e83fdb50aa4edaf37a3c2af0b43662c275b072c99d2fbd175783c8de407dbba439060d09e32958384266b72e9a867d162d4bc9171c827ebc4dd2ed1c7e51f1b7f4f2c02db10a3ff6743cf4f523641c963faf1bd2305693bf4a21f7be553dccdd9bf6dcd0449403361a294d501593195aaaa1ab2b8e5a48979010d654068da154d7e8eb0d9c5793c61bd4f4898b5a900d0754e844f0f1bd7ec9758382ba4ad331a2fd6c09831beb9154aed0ca1535c52ae87eff5d6eb79fe8c17f300bf74be7b6b33421f78f496a20e16e467f1910290e59f8d745bbe7328735b82bff52c8b9ae1678052752e1176e8d9c23c95d40225a1a7d0e4cfe6fdcbad0b855dddb1d057bd1e93cd515b3ee27874003be98ae6c6bbe7ed8f49f89a5e3902d48f027249ad280b88ee1f20ce63561e24761def2331f33f83706d9f193fd05a9482ed0ca6fed433d4bfd6a04ce13e441ec4eb12b681119d0a5f142932e838d3c0d4a8765492254a67a173c0418c571f49fe6dda0acbec4cc1746e6fd900206387914c706e7fb487ce6964e2843762c82d5a65b0c91f6e263f0cbf283458e3486dd8e8c5cec201f0e97068cf363364821937cad8239c029246594e16acbe6bc722835e0a24916750979170097cde95512e220db4d176e2c8ffa8eb54a246c65128ca475404215dbb3860ab94a94d9f6be59f7a227b9aaf7136f0f71124e5d9fba3541f5d988b8e7971347ce376016f2c9102bebe0faf0a660fed7cfdb0ecd6dc1644d8162b19a6a9c8eed4723120dc286747000c5864b28da27d45fa108e7cf57adee85b4fb459ee4a1a2dc0b62bc04da80b4dd25ff58399b3e2962e5b05e10821e0a9c5833a32ff70d533362cf50b8842486ef6c08320d4b4dfc07d44d3aafcc733c1b82c3b87772c7f37c5bfdc9c51926f1bc250d98408fd7958aa4d4d7f0f7d1eb4b25ec78aa28bcc09a0627a01422a927dfa34c4101e0d48bb03424eddce94f8f3af3d115caa47b2c3c15b4d92eca40b152682f81fac37a11ebbfa38c011b307f52a7a815987c2c3544581150f9a7401ccff6b22285c727d2f9ce812d31b45c1b6f5f841adbe1d1479fde2515303c48676fd759d5191fef0611223dbb8684df96862e4b0480caea96c3c41a384268a862f912c2cf21d5e83a6dca54741e2e784cf1ab097db29c562856a5f0a478e75dc35d2c16fa239f8c1f1f401181908afc494a567dc047c085015f44e0a26234bbe8c68253659ebd02af0852c22e6dd0afe9aaacb8db1f06083adaadb705537a3e0e6c648837ed9ce3c44ffa82a3594e1a96ba978c516795de0c76bcb999e5ae67ba0b3339bc21c21574788c8d4062ded801c679b1437882c8b30a29e12f96b06d4a64fbc5119cde1ea9f734bdb9b6ab61e87f4289107d22b6df400546fbd7202f714919bfdcbc3e4c36b84264994029fbf59ca04ca7fbb4327425b2d22aa2b72d768e99d3a7ac36c910c4676f0e4302d88bf8d80854a27eeed1eaebc3916eddf49a309acc36f8410b51186efa9110bcc79bed4ead583bdada268352d3969b58f5e320781c4497b62323d3898340aee6701c0c797e609e670237c1a2aa1447b56f52952ef1002c8437adfa90d4ab75fff18f0642f536a3e83b35416e6628c5dd0f7cb693af4d6da77a2ffe06daf2784ad8bbc70c0bfcb7099625bace0cc18af0d86d81e4498ea802dd35569e31aff586cfed883f6952ac0e2763e46720e209fffac1c175d6b3878ce2e5f0ca62a71b60610dfa168ff65e3ae53709cf53ce06b3b5b2001b942337c4a46308f0f51f20f4242858ca9002f26113a2b14de223fea68d959dea4e352db4dc3dcde58d9bcd370d0480fd37d1e454a99ed31b828b9709d1094cc0235c0aada24a3d658d34c73c31e0ce0a74251ea236f337662c9e2b16c2d5faf5139e24b784dea340e15a6067e1a8e0418a68e9cfb4f9cdac2c9594d4552385cd5b2dbc63167e35ebb9b9c7aa44ab42a2f51045906cf48fc77b7d50dcfc34952b7eb1ed7b6de13d04ec0f3d9a3417df18f60decfe316791789464ee9ef597a202dfaf677b2a16dc80043f159e7b5886c665c5799fe51b8c98fdca6d66acc1df6a6b7348575d07ba7a3ba96d68347c15f3fd1c134d83cec5c61c019362d498801ad4c07091a9dcd820cd4f44a1d500eb4f2731ae3eab35c7161c089244045d3b661cb6af580afe676457210d08c42a85de6aec2f72659661179af41e5350cb78d86ac622e2df57b2de8a4474e53ce074394dae39b5689ded972679d1114100ee7bc0332562f53fca0f5ae35380c622591ef0f1666eae83f5f374c173598aeb5ce68ddf22f747cdcc92d89236b4ccc1affc87e55a63198a22e25f8ffda4411352aed65930a2191a2e6fbdd7616bfd6eb4d353feee65c1b8f0a31a3ab2b6d4eb1c08fc93b8d9312cc55bf8dd8a7217dc75f5f085404b9f40c5ccb2507d8643db1c7d099b1a0767f120aa6ccd33d66aa850504fbd1f15ff1c28e33ad05b641d6392e83fd06b1ca8e5d2d9a9ac5119e23c440165278660cb559363049480de33286e9b0cd2dbaa731d12b6ee4198d67b51c5d65ba647f98479c1d35fc8bca3486ebff70a445e8822a46220fcaf2e1393db3601cb1868cc1f2b4be5db0b4cda8cd49822a7e316429c7e7c812450d1a7326f4c6ba287234fb43d254494c612ce9ab2a84a3e5ca59504469510f10cd321565ee11416058ac86bd68441950cbfaef80c39819bdd1049b3f88e3dd222716aa34a21db5727731073cfb0a323a1ce9a7c97d2856c5d9d59317f9020b75708d54b7a2848c104cad8aa181660da52ed90991b075c552c3314992a6c08bb3904fb87c8f2995a2d49c2ecce295763406ce48bc5eb9b876ca4c5196738bffeaca3c4d34d7f0af157d817edfc58c11b7b13f5c64651dfc8584244beb0b5221a7430ac67d2f2aa10937b36759f8074abfaae2bcd4476aa5a587f2b46a0f95c6df9e3cb3ca0e59c72f5c4134e360fce1671be45195b80a8438c85d72d281dc0ac0fb3777a7f169841d62a5c79b94f28ca2929fed954a24564c9a593e3d5244bbfc7ffc38522c0dbbd3d3c0a8d043b3114f6431d5520368a01f2510d4f89d21765efcaa3a8856ff64c861984e2d891f4800f746227ae534193ee355c195ff2edd9bf4d72905eb00ee706c63d02352844da397289c04c2f90437931ac813077f8ee13f459c1f4cb0bc72740486c7196d2acc61bd8279fe7908cc05c4f6809bfd5abeb6ea1495d1d25f3ce45ddfd10d960abb8506c529beaa8993b5f4d6fff58423bbbacd59c873e319b0a85c406a1e8df9524fc77f8195fc50d30900584964f58c6a028c1b3f50418c91c2048cec7152285b0b8d2d17f85ddc79d006ba9c8b111d136625fb792321260628f80d5bd8e2536cb9676b7009a3bc923c800f7a82df0238e514bde58429f1f830adc466b5b0520fb358a7d1239a3443d247f7724859465995bfd88fa5b9a7a5b10ed604c672ab5342bf717c3197f4ebb090a01eab0186022c3dca8517c17ba4c9a7f76386f6055709fcdd8e31686c919271073ad175f311dc35bc2d652b4fb03fb1f43aeeb3c453c34591085956e79c0365886e5c5de2a76dbd6a5df824be5afd1816eebbe18351b612ac0255a9a93241b793229a6b4b5ad2641d28a2bc674e916dcac6c61ad1809eb86ffb5c940e921b2ae9bd79d66cb87afa4fa987b3c0afbc9fad376d9e9b77ca2da76c09fc69e2f0f229fae435f9135537a1b25f0bf5fa821ee18b369fd204e133b4e1246d5492a95e1abc0e4914729e5810aed1ce9dbfb1f90e3be8af88fec7b9463ce8e2041ec1ed324d096c1b841c592c453e2f86b6b4088bc6265bc1f61091201ded658dfd59d9a295b0d1144d46545ce147f38b0bae32a5948e2dced78e231940e3475a18ec078696ee5dfe2093457d5d35e5abd759c279a19fa120cc1ad7aa204f376581dad4206e48b172b7ace083a529aec083201fa9e625ac475a3ac248826324732266510642240142ca27d387a27f4c4361a3fa13ed76296dc443c8700018f770c73613b5de714ab13a770938286222419ae1b9b5cf0c05cc0c98728292c19bc266453f5b80032be0d3c4abacc480184af8d6970ebc44f7defa0d1c3ca57bce83dd90bbb2e26e8b55203bc82b77e8bd9ee17519b856536b166038e324890f8eea7fead9fb6e4235f8b42fc55938098c0f990013928132ff4033ef697a5a41a9ca064f6d280066a5f85c76807956a3e83dc32ba3034184da49882c8213e96198005aa9a587e876b5b9aa417d1f885d2e1778e9985f87d428516ff028692fca65d8d64a1f065d24207c1fd7e94ad46ff8cd1b68ead062f24f00edba9ce7bf8a2c4159793737323b523122fc0cadcf2f2fb3cf715632906c9802a569935c01d7e9bfe24bf6da8a197432539cd27bee480623470cdd21ff9fbee5758ba92032fbc9bcb7e2a4c25ef33f1df57443b5318f5ba9edb4db735c4779b320966a8f1682d73ae3f8e04618612f71e2e757d72ede6bde049293d89ddb55f1ca7a46a5e991a3da2aea9e095da26740ec8de3fb6e876a5ea121e4674f533a9af2f04d684859c326a5cd877d8885e4f1f83e4f950d3098db11be3734de6e50c6492c7fca7a577f572248c22c2c04b21385db7df2d3df68d5fdc96b1f57e52cb3e528f0329707a784e673c9538a3bf27910e7f6109894f75cff4a4a56703688832e6b45f7b433180f10135c90685f7017cd22cf1502ae82f3e1cb75344f1a7335b04620dae7d894e27bfde2d6b27ab379b474850d1cd9025dacbf369225e51206378bf451e141e5116233bda7888022bd1b98ccb30c077c65fe3ab8c73207cb5ddca942d60c33238c64ea0eff3386b9f51a5a55132d62659fc33743283cd451edd7d35c816235f6fcf15e2e88a5d8beff5e812229b47d92fd62af81a5ebbba4bcdcdc733a2375e2b2c74c2b55af75675f9c265957d7d170d76437264e05c39f1b96c5dcb72de6f66bec48433e91f1c88e88bb0767bf6c178eb97d2e6c0f255e835aa97a7a5522dca10bb65d97f9c70e5fb07d1a7e246c3b518a51c5074225a3ff4e75eab8cb80c4b41c39bc71609399fa71a1dad386a298ce47acc13f7b0de0a7a0fac88bc3dc9fafbc98fda0afaf3310ee293a8da42ede64100d855b5babfde66eaf0affbfb7901f03b28a6edd58b3ea96f4630c88fa26f7241a0def6685cf41c42d94413ebee9bbb7f523b9b844e9c270029d1b5fe8d4927b7fd9d3a6137467b9f3d458abccffa900ba92ed6e3510635223cc15dcbc8c445864398713617f46380241e2a54dfb81040a7076352edc7d5dff16eee3a176f265caa0c230786b94676808fbfabce74e2cf7d2ac9769ae64d56ec3cd965a2097be8daee7e25bd22576274a788d7b31cae8a0b0c360ed86118662a4cb885ab193fc22e9b556df698d3ed66dec8816231909257d1f69f314daefe2912c2a4f567f6c24be8d4db7ced930f19d2b2a7cb9d4e45569fd1b8acaee1f6d24cebbbafdff2741e93755ad7df117711131a278e5a6332c6f9e86d3a7baacc33692e283003d29f523dfc86f9d6311db72619ff0761c15a185d1fd371f9e8670e801d06cc4aae76e9f5306ca18f7e1f1056df993b87bed2fb98333c77ff62ddf0353a2fc761a2ac31b071690d6887d4f2a8598e3251c17b645630de85f48ed6a73fc47aa547dc3775ac7a51345effbbd8827b60cbf30e742a9cde9bc085e832fe37a1a9d3effa638e3355245cfd07bfebedd1158248d098f66ba409bdf9c4499a375837d4210dba987994c7f58aa5483153fa27148140899710d7e3a0206626d451158d1e6d07527febee4bd816559f909db809ef13f182139d77e218bfde063bf616b5f15ff18cf92e559659df83af942608548ffe6e84a67abff1ab35c93df0207ba7924e400b2dccd1f971cb37a6c881c312012c49a371a494b19568b054d886742f529fed8a44557bb881a89d8ec231e54958c85391f064bd84bf5f7887acdcba4a60969edeecd1b3429bf26428132143f38ee1a879dc71eaec3c47db4c56769464970b0c076a12743f339eb256f063919cde01ec548512d2aea9627ea045395e2736ab3e8de0ff35fe533ef4642a4fc2b26e89d7545ae084597b57e607ffbd72762225bc82c39148aa50b41793810aa0123704de5bfa3051699596959fa87530c6573e33961e1ab7720c177dfc34d39527e264de3e5d16a7e6ad5b8d71d452c0a2eea134437d1e7cdd4c13c5da34c3a54c19d4ab090fa27f488f61655ab9e0de073a21a9d5c6a60b18a891f163221d2d645becfb376c632bca779ded1f7db197a74560945b3d13eb49a65b29dd7d9ff7aa168a6bf54e327c5aa77e60297fcd7ec48473d5eb96fc8d22f683cf6f67bf20b9b9445c5be09b3238a6191dece76087476520f3785abacb214a2b91e1c65e563df9aa805018afa0f7c6d9c3884b9cdb50138a28ffc6b39f509b01bea89781026ea3369807fa1df15951b1a2c94112cdd7adaa8b93caf7d08237d6fb3886d656c6d776b2a99d9d15797c713f752c3c90b321260a47ef99de38ec51f5f0bfbaa1f34aa560a9eb1684fd9cc119cd8053ac446fb91ee4bffc71fda42d1b6b2d662625a572de1197a80e5c808ee76aca8da237e8eedcdfa2b1b42417139602d76c4a48de21c021ae0dea135a9662a281484ce6dc7e2d25def3f1e3c0909d46a46f49a86871c60992344308ab62f5e17ebc7a4c2cce260987514023f2407141001eb318c8f324ac8057c59dc139950b7c3738f02d7e6561abe8c6cc5f22b44a887d0919a32f6939a4752aa315434dfe9a1f829c919973eb6194ced0b4144397c9558ae9f4ca472c63590f21f6d865cdfc478604d7cf426cf1d5274026285823a153af9e3aea00627c0b366af7ec3d320fb89115c3b79a0cde50fff15f26dedc743fc3d039a777988f4c016ff29297f6b8d02cb26ff697c8f70bb3ea4cc6542e96e3e01388feede35d9a915a1442a1a12d5d213ef0cb96c7dff32db1904ae560b785a3f74bda5cc44c2360f263347815b95bb01f2f72dfca8372f5cb99ee9b0312460b6821a96dd493e1fbe25405dc2dbab8d91a52a61f8a70c27077526605f482bb0ce54f0de870952b0161d03eea0dc4c6bf0a99995c82570aba82277a096f69d138c16df19188431aa6df2669a85e879783b7f4ae28b3d410bf97b1124c4fbfecf198566852c744b132918048f2e6f9380e16e62c01f4cdef87b4d84a8c5613e92e9414eed8d363b5452587059fa24423e7e76ce3429e1e403a246e3f3e6b43e1efaf8bd73932c5d5ca2398a66aecfc30940add58cb86f039164ed4ff4045b29df99d58f98bb20124c06015ed324b5296851f1dfcb0f9ccf7d90ae0f052c3dadae65020e1c1db3eea22ea9fa64ee0645b5f8e36e5cb81ca40cbe8ef94a2dcd3b41e5bd4576d45e61f47d48ae02df8454f0672bcc93fd081a4e6f57b56e6a457722e55c9a872b5a8375967c7e71884a6cfe1ba26d52e6d3c8067bc8269f2bdf1da3e837413c0a62eae126fc6edb32c6b68bda5e503edbd399dc17b2fdb23860e40be7f3c61d08bf07f151af33c3826526f7225e6eaa8786baa4e0abe353ddb30bb590dcd2db02c9cdcc7e03f45692f7ba0d22060152fcdebbe6e3b391d38e34da965682c5bf913613b8ffc2af5f9db26af02c3f2bb23d608b951736d6db9f4220f953d5382bda1371643c65e2df9a62b654101ca3ddbafc2251decd78cf3e9195e6f21bf86ae71bb9d510e50da2e94564a2435489b009f17bd6f3dabde7c323bc17f899dac2c5ba459acb4ccf1926135d1ebe9601c06859cab7b1a0483662f18e7b45c47e3823ec52bebee9376b4f3cd79d2591c5a91cf92b6d0c5f05c355cef38639a33728a382bc2337707a0066003b030e0e7ca3298da588742a1029155025cbee1eb8a44b95b3d41dc4f03cb8beae2f534591f54b2462f5375fa7d47496978a2315a3a86d54951db37e3e5351cede994b27c30315ea057b616ecb044cacfa77f63959b28e9d93df0e9c96ed7f1cfa840783652166e80c8630d994ea18680b1b4290e2f5d19582fc60194d60b29818e34b2c1d867560f2133236c081be5975cb17bf9c6139902039dcf67b1e740305110ac9cbdd81ab404997cda8d5a81fad3d25fee193c4722e1efd185e0fa43a08212537c638dd142913a3ec43d38887a8a91dedd2168ab6273d5a6864b1a262aaf33ecdf445588de0a5406fb1f013f1b82505a2aaf8a950060dd9a85362b61ca612c50949d8f0d63635e0ba04d9c557f120f20c10e0dfe44d89c09a053da937d68aad491cbb025cd252a7dafdb13efd3947e66dfe92ab3296903bcdf56342e653cd43bb83e067bb02a5467fa39efe801835006dea4a04ca7d3ad2088b2a2594253a36f5dd8aed95db8ec983f07864002d197cba7cba211fbe9891514aa2b5653cbf505258affe702a22501f3e35608830260801035df56797e815b2bb88a948097e55680a105e929e020484b4cb3b548c4ea044a138f59ed7037fb1dafe01eef9d7f2f40a6b0d3c86634bb1e51108456dc2a3aa3060564daea53abc687f88f269ccb052a2f4254f1d38b6b29b8cf7ae0ff9bd15f0f177c7437521756c65e1d1b9d1dab4a71b2ec9fcce5d56815975d6b001efa56e6e33270be8308df27f15a38018520a7316c10d4fe8d3d15eb06a405132d33faa80c986aac9193a3fe41ffb34952a238d4eb304cabf513abc51220c157fdc636cdf4ab68fce16533d71eb849f23998d77139404e6b4fa2a9d5ac1774832b514abf991b9daaac49b61fd1234349f6b651184de2c51b57a0ccc7b355164a4800fc791b792addb7ca7eddf619afd8cc0d5848ac57fb90ed6396385dff5e3ce0de0a35347ddd4023182f955a6fa2efb687c503de9a129c4f8ce5b52f6346989dcdd96a6c22c8e308268d8f7c0b43df71366222a15dc8629f29f26a3713cfcbcbcd1714da91e26ee4431e312b9f1c69909ddfa3ab2049f979ba97bb5e620b479fd9720b1cc1583aacf12a41d8d9642a3e11dd2a5a8c53a669c2032235bc2facfdc36666b242ce05a7608eeca0aad58006773d52a0a6fc52f3cc64fc3dd6f3c99d618089241c9d8f5c7654e9d05468565d66feb8104280845a68e11322e3be8f250387e9a85a763ea149438ba1fd22121bab272421b63b967b43fd50bd3800d75ddc87f6a66bb4742927a8f4ac7f87ccf2e5772aae026b9e5dcc89560dc4f8ed1cc00d5356bd89796286846ea2ef505b4ca259d05e45011c9953b626606935a4db705acb1f9670a3e0096ad4e3fa4ba70267d506719124b15fe80794c7f7d67beaf32f0a6ef0462d89c5bcf29e5262277e8a354511689dcd76bf3a82b42d36757aff86c86c618c25ae0517564462e131ff88989e91ab2188a2a69f776332d13c12ca5c1342f42f6f722c845e2f9ce4347eec4857c0e981cc23f3e5f26536d43c9416b7cf14d8e7296079a40deca37ab5a9eac64644afe8633beb1a914ccd604d461163e5da82b8520348227c396d65c6cb800abcbb1eef88b8b0b178aa4456d51f01354fbd9bab9d3bfac05ea078bcfba59a0b88a4ceb5535a480462f3bb543ac21b88de7ba210a6fed50b3a2b05fa7df0d54d9208c32c46110d2e55d770a2a301e6758a529c558d56781f2e84c863b9f59fbb8f3fabec4493ba3f658c3a824bdedcd783ca15b48ede3fe2b81b526c733211f026432ee92af56499d06d42671192a04bad5bbd1173bb6ff46941912fc351ce65812afa5f1db0f565a8f6905ebfb207fcf09df71bc4fdc073f41517b4979aa745be705f8ab01a8516c556b36b8f02164901305529028c4c6e6f5d11c362921e9b389aa833a9ccdf5873ee56556be8e660ef6b6014f5820d1662e0ef9ee19dc50542cdc9d74b57f1e192bf35bbae3d5311c7c951d1bdf11a8d8c37d8724b5b8ea9dace941e8faae248d6baa95bba14794c65f51cc93d0cc4e6efc0d0de6f99ad277253d02f04ec992e8f26a8cf3278ba0dbb263b459cca112b98c201dd7f4180bc6c72789abdd5456268ec8a6bbc4f4502b702e0a9e9a349a424520a1def56eada3935c2c2c8f184a3a9ec968f3f738d8f303c6e3e8c30f63ff68cac2a1cec7fac68ee64d5acf4bcd694c8eb1decff6deaf1994924338c195bf4a2dc31a090c6f4ce546394801b213bbbf48c6ae6e4f4ae27d4f34638837bc8bcc44129f43fd2ec55b3b2c28883bd5685ecd622a5fd20b76253574cf39c1befe640edee4d341f1fd4680829d9e1619f606e61f3406b0ae5c57ef0a7375bc85738c8d559b499b95f041ec6c8dcc573ed5296363fdbfe4d64e8fb1545ecaef0dfb74201613c366465b96bd538d35abf10e4cf7a4604224ab37110ca6b3dacd315ed32fd75e98884f7f07e4326d1e0e6e17cdd1d0f165d23647b1c01590786466d97f9e0967236cb8147c23a2780fb182a258197d480676cc3948814bd255b58061b02811bf0a43ba0683a74fb023dd463c60ad2d9a635bcf55a4bd7b517a121b780c1c0190e22be226958df5276f9cd4f0b1f38c722a65ef1c37d21e8a21c8f60a5470aa6d31dd237395711f0cd9f3c4980decc4f44ea3ecaed2ad9e05217f9163d9f253ce50b4a11a6cfed2423866aa293cf82069dd67c0649d9930b06206aa180940fd54d8d66b441627a9bff2665417c6b233ac5591efe1fe9e5839d635349f2c248636c3f6141005c509af59965fe85f1743c4f0e508e61baffee977d2510940813d437fa39b1ea15e4218426c2ea89600661e89521372de1559209705f811da64405bb88964a554c504c7edb37f174cb6a93927e2658d59a2d5789ce2fc2ead6b6e7e4a9429b55ae236fbf90e4f7302ff41b205275be589c8bdb15746133cb922cbe5bc6e18b5d1633edf921589cfec198261522f3de61ffd29faf26a7618ea50be3da31514e587001c738146255ef5561058f30c87108819afa5016e850384c5411f986d1d7b501bc1eac119d6b8eb2789acfa955d6542b751f8eb526c0bd71686e7289b066a576f2b2e5f7961577bca78c174202a0bed0885f78447cdafbd0c2b714f56094765b6403a79604fe30908ae78023b7e3018f6142a9e16947d3076f2e3f70c29b8bd2178cf61efb15382ca9d0a9eba1b520d8e6038cc1b4973f7a9ad1fbf559166732a053395a7cb8eea99c9d2a31aff07bbbf4daf4bbc5d95e3e2ebdb285e2be9a5be1921900d68b95af4fad6169a3153b5d62fc78cddd259474fbb7309647f415e635d9709349e29a75cad596cc1872e5420e6c8a6e0aaed035a3e7a17b277c3d51ab42caa6723e41cd74860c9962cc340704fbe0129cc891e1d873169ad93f1eeb50eb81224f4eccca98ca64b093b53d9976403a1fbbec00e1d252d01b20594fbd8947399031fd826b36d15c38c2ea14af62adf845b7da7c073544a1b5fa30cae72eb517011b090ccd5fafb4978c38176f10097f56ab4b245017444356447a412944a228e645c8e3eb900faa6a5d4a558cfef62be337502bc36775a181adf37863d9719f0594b2a0024aea5b0fc7b15975c31f2553f72c041559a22643224485112787651caa022442d0a85321471cbfe6afa886bceacd99aba1118acc95257b0634580533bb0149d7bc3bb0cc38403aee25a425b27cd6b72107ec0d55c66976c5cd23631bef3b2ba2fc813bff1fe705aafe719929eca308946c036fcd6b6f55b762d0ffc8cc0b2d169ab7f8be30ef1151f3959d467895861e16d4558e85402b60ab84dca0a2a40b3b71861d2b23dff3d064d5d306f2c280b0c21da82f3eea28062fced26d2a803efa15db72a3ea2ee98638b428b02ca55578df4055f4de39ab044450d5e6595dda92624af75223e82dc191c18685713ab3c31ed37f469f8ea491375b3a5bbcee7603db9b2967f065b62c5240da6b4ce8d326da368d973f90451ac503098b47e0c03b8b58e8e260991bffaf70750818e0d5f4430d0dc44aea7831e8b646894d0f0e15f1d66fbcad9bb9d8aea189a445b23345fffbf18f5091b480d798e802f29f71256931d84e8ebd62454c3e20636060c086ca169ea07808cf97f4a151ea0c00d2c035294e93c49e62755bab6a0ec0f922297fb9d1e344c666969e3ca43a8fef081c0d8d039afa51a94484d51a78d6894233f4d700b9c6abde9d86f8b0627d1f2bf7e7e996f59c46e7d14474198f903819d5de20aeac6bd37d72256097988bf169c8cab74ec60ec21bc7aab4f61b6329bc748bf1e4ad29da3419bcd8f1a0639b297d0339c7122aceba3575b8e4034320361c108bd95b3f521f3cd03f6876bd0132cb9da7327074b9123bd91f92f0cc49e6ba991eeba505f82d938e05a6a8e89b11b4fe33fc2a43d6c801990a7bbe990ef4ad05050beb557e4a6d817907f0541bff5abde06429904f6e9c50fcc5e5de4b03382ebab4e4f4f23a4b3dfbf554f375f252fb65e61fabaddecd2099c4f7edad1cd8752d2d77edcc57cc211260cefd6b857856bfef196e249cdf2b5ccdcf11b9bdcbc80e1e670ff398a4ec7fbb57d84007e0a70dcc7e0878d514f3490f757d58f582b2be9bff0fd479039dc8e0754508a273cc3f69517e560351317eec4fbe34db51b7126b112dc4cacfe53bcfc92c18ca58b1a1669bfd441e5072456073a84709ad8d6551a006bcc384f2c75dda73d2d7f7d625594065b2cecda2c5e112df6a3b0172f61e61975a889141df6d8d5defd83664e4a9c85d78ab4a1875cfb591d17ae4c215ef86f9a99c40cb21c2b0aa68315333e17c3a6672f383fb429c71c893ff26d28984caff13675e48960bdbcf4bb529ff660b084f931a2a3f44d6afa20eb37bc8201580dc20e4fc60d1d0c5e95ffcc27a58cd828ee25026fae64396e0664d2c8d45b0fd97a038bf276195f6b5185db9af5a482880813a977747dd488e228b9457ce5a90d72cad485502664224720afadb4e6cedb1ca28037348f5e5f0b7bef13aeb8935051067052163d315d5dce6bcaa0a802e17e0ab87f108d4effa9e12756cbbb71dcd146ab78072668a2837c14e894145f34e830403b3b46739d00ce187952e960ec8e68b79eb7bedbe4085d0b3772cc75254095b8d632981d1e1abe2be5bc75776ac7f89eb6f994f1f9f020d0eb2dbe5058bf894f9a5d797854c28ea298964b7cc96c6bf921808568fd9188d04476c79c5e76a1df7b9b9930aa7e3db7c891ecf7d8a745d3eeca204474c783a1d2ad6174e35e2ba9dc160730d9259b219fc6047eb3202d2254f02965f22214f6901f7626b05bdac369a04d5c669e9ecc93cc3cc02e16364a07e6a6de6c61f127e2cc9d033150e61417631fca87e0095acb52085ad6f9e7b72ec63cb84853ec43fd3b0686984f827e194b51ccf158819bb0affa0a3f8b515fc7332d75cad2e32dfee0b2a3a4d28057926366489a499910d111da944ccb6b8f6c4deedec909899b8e6c375f4f4046435d0217cdb88ff454f45bcfac4b2aa47cb3b328f013b2bde0958f50a7948318f227b406fa9952477ff50cbee2310c06f5ce6c915b3abba3c96003e16a7825fa6d37f3a94062099b13c48a127dabe261534ad488dfd76bf2a14d27ae9ec508d593818827720453ef53da31c7a05b2c5d8e8eaac8bad250a0ff581f867a2b60049db6bf6a132b2eafb0d67015c04d95e70bff04924a5d0356423878ed7bfbedd806fb54d01983ede2974a3088450eab85be4ba816bf78c33c08647107058eb1acfb07068c03a6ad97ee586d57d8f4bbe6fc2a50fc92affee8e7d739cd1ecc9c868f41f25c48739d3e5ad5545c1196f4a572b6efab97d901474eccaa4d6e9382ef64209ad811fa0aa1faf9818359dd98e1c78cb0863dd8a3a02fc7b295528ea26f272f4aec399444456e290a891bc61273e7a23a90a1275f8be18af00ced475ad68ed6e05bfae8df44cacc0df488acedb098f8501c70350922284561951b30bb83ff00f36bc825decc71152691a6a6a1075574f21e09e7478af9b5b1808bb441ead351c9c5259ddcca02ac13296e473ae1e5c83ef2ac84c55650ff601520237c2fb77bb79a26e00fe49d1679faaa5e2e1fe2cf91de43315990f1d8f1dd47fdd774a4158aed21ff3190b10a9e8b28f44dfde07e8e64431ee68c4f774f43b159a25124ba52812a5e10ec073569deba9dabd499f235ad1295ea82d6fd24e3e81cc3f8a0e4a8071599016db975d661148c8d86dd623e23ec9856e559787c9e0c312cfd265428245face95af8dff3b4eb536ea40a58a05fadfd674a0ffb4f6daceab0a40b625e4863cd97d9daa99e530a3119ef3c887ca2e80414060e9f0d30c233bf5834bdc7e4b854e0165db004bb84fa5d0f063c90ef943a32e216406e3a695931f18c13362e55320428283e2f96a307d93f2f6430dfd702d955ef7e8603d62bcd681a001879ffbe39945bc8b2d0e35249d9f060122670a7bd54118397a8f7bf847e4a51db44d980abcc35148141d89ec8a7d11d02f12a13552297c911eee25a0861889ffc7b9716f048bca23bc0977827fc2b73042a63e6c6a8c052f4bf3d6e3262e2ba1565e83cfe1331b7dcb0b0641a389241319dccef845b29903fa6af6e755ab8180c0cc9c588d83fa21aa96a26845cb641cc148ced38bea97b9d0d9e6a5f909ea4f50001e5a87658ed5200d8976429f04ee803c9bbd014dea7324a0951795c2dd8989b03b3baeb411aaaafaaee513667b2f08411efc0cb84914eb07ea481f5bee5bf2b61d8d5d540af9bbb3ada7f7aa28c6231d487d8e010399e4d31825552339094644dadf759b3d569b051f7538bcc366d2cb9640c5eeba34159ee9b247e3f6437035bfa7b10ff8c733d3ad5baf7b8fe357b0ccb5bdedbf6cebfae8d70f26237c8cfb484b56a26b697b173085d892c8180bf181a1d8220d529018529ac2c34dd7aeec43bd838d5a5abce9cf5a06eccb0611b7df5790abf6f0d96304c5a301104c9ec68d3d7632d12747b93afc9717162e779055b7220c74da37155097f38906479d921b2e11b33b092064a479863ac2becce64ba030b4d53041d237661dd3414b70c3ad5d64627dc89a6566d380d996a3f505de76789f640e2f59d8d79abcee9385b254ebac2091299b7106a208d5acb193f0bd0a342560c57d5b3ef4da4cc368ea17c6dd176e24ccfb6915117f3c97ebe0939b59ce2b08d78fe034ce6e0d9e3b0a84da0b67d7816b606a381dd3a5b2a02995388e3006085df1430fbef5eadbd7f03027f99d799205c816dffb0811f5fcace8f0ffbaa327eac5a8b96e52a7de15f209ab373e9e374c61ba2587c2f0ad55954f66838eb0369e2525ea700b495c090199ad278df53b42cdb1f9f3cf09f457916fbd555aa80df4fb6dae0e824db0aef94e4ebc630e8552662ff7816c439b5d71aa92252b4ab61615c334db8b72a6416febaac5c639d50553b739e440a7a39e2cbd9ecb79cbf67e90c605aaf0bc209947fe65bb8e66fdeb4e0556dba9b7e68f150c8602e7926f42ad7d5eca90077596a4313686ec8ea6a95e2da7ef377b68bc2883882e542953e5fb72fd0818d4f501a669bad537555deae1ede19314b0a7c6054ba5f1bc2485c380518447c9e3219dc221d6ca8c8ef0c75f42eb3a912447cb451773690c54bf4da8dd2313651c9a04f93707fbcec5b2daccfb7a85313a7439c66086737cc3a7382fb15a65f9a579051a3b4c665dad33a10ba2cd624ff3882e5c1e82654b4bff372d7c0a8c486aa5b7a3a3948609284ac999c4b9fddb5df8435c66852c48e4ed144932cc669cd1573afccf5467e9a98ae8c9b2f9147cd8a55aa161aead5059942d231f080076dd9d57e98da97c6fb7087f8fc23bf1a44a49701d409e61818ad882cb0882c9b41b9e431cfabc4fd8a2a9bc8a61ebb117b81b7c7673c6c4fd7d1f475878ae2e5007cce713d5ee61bcaa4e4ad9e7aa28f4ed6d7a0874a956a053b9814c2822f97ab62740bb52c2736380349ea4c22682f17db429038b97ea7c8293c40efcf2dc7fe1145e11830e3b5967c1cde9d3b4013d00af87939922eec3c4b701721e3052ed9c99fe29ff9b9bc1be78d3ce14b456aa267931b8c47bb813bdfd7a10185be855ab0f75bc46b102f06df9500a65bcecdf943f1965fc776b0fd8f422514e789274fe2b883bbdb58d4af86aa5148586e82e6222532c70772b98d61b1f47ac986b363667f3d5aa40d9ba1bc823e50e8420894b9d7668b8a976d920b9007ae227df6696fbee51fa73161767cabfbb473bd3c6d9873ea47b885388bf7b2b51e376bb6810bebc24747ade5f21eb2cd95cf912f884d71739d3eb6a4a68e6a3608ec976e277ca853d6ed6e464869589feafdab8888c006145f73f968ac4c6e449453f6c4a511905e4e36fdac9b868f0ceb3cb34e1a7464fba584def54635f3139de1ed523c36cee9e2a3a850efecedfb5074d1aef75d2bbbfddc0dd0a98f4cff6f55f4035a1c14db7746ec60cc84a564640441ba30f341d12faa89f8afd9e01e595d9f7b2d93404af33ecedaf389d706397cf4a1676e66249814bd792d070fd64b7c2f4ebb0d9fd89e9ab0ce5d012cfe10aea868aa461048763ef0766b8523a370b510203e90e645475f23dc9065954c5aa23baa1ab4532f31f2a66dfa6892a1c5348479cefa83010aaf9da1523f252c5da77cd51a551006caadd6af3da51c074bde6670f50eb0b8e234ec8736e02e3f33bab59666fa92475e1627dd843100257572a9de0440ace09078068da0254767c5fc66b90ee5d32c7b22951e801d5e88bc1826c51bada2be3adee3ffdcdc8f6adec7a34c333b095749d67f2c039c9d1a0971a425b6244a46884a1813ab190c19c10ba5c95cbbbe0e4c49fff68cb704806f4439bb00cca73da933230eeaee82ac07aca8ecd6dea1859a0b07d3f8a36010b53105c01e5fad7ad3e7663919689113dd37efb703897e5816b1c6c9f9217e10a0ac678420df8be848d38fc102e15a16121e6bdc02f40c7fa29aad5bfd02e5998e287ae010e290b19aaf6069ee56909a2f8466ac56802af878582e82d9825e34f3844c268ded1b9154dfb35b5b74854c8d2d0d0ee1846c9b1f6291e3fad61b8cb4e91c6faeb006731f804a930cf8bce119f5f7b10613563a1bd0c2cd529f05c2d325405e11aaf57e6e7f6e75b72647b29f037452f766695b616124d688790a3f7d7e0e29611f8d498e44e793810ec2f6092283ab57cc23064a71c96dd637e5cad248623b927ed186cfca4b63c902db059b3b6df101c914efba2ecbe06d679826a513e5d0785cb0faac07ac0aab666c777858120cc001a7b454a4135f2b233bfe37c2011b427cffec935f9aa0e1626cb7d3b02f46e306c48caa206f8ab0bff8f497a241f782be78065303a9c04cb38ad11b7f3a373da88b2c65dee2aa2e81beb8a8de2b025f08133f2e2af434d9604e2cc56c1509effad542038a774bb9aafe26450e953332674bbbc3b4eed51d664cef80497f8560493537951d9a59aab8e276a47462ca511c4bd77ce29a0a1094abb3e607591a4b39895abc984fdfb3903fd80a8caf5a1d1d3a51f70eafcf1636c8dbf55ee2053dffe78093666c835900988b1bf5ba769f5b507d8488d3e4ca2b3832621049d8394dc9b4f4e5acd23b13f6a99f0cd45001b59d282a5a9721eed0cd851f64ce7ef5e26e92bc7d83d21a34d0d3eef33d50fd52c718e4b0a63169b65168495134684d6d4d84df1306e5292f08f83f867939a82e4440c2159d7280a116ade735183f201f77c7a058610c7b7c7ef34a1d617e86b96abc63c5cb369265fd1f8938fa2496f078ca7d494148066e8377fbee6d4dec13af0cd414c635a3278c039bbc7466843b921e37b1b51c29cc91966d5b6096e615db4e399e31214799b4ec3e30710ab995c6765bc011778954d2a9c9d0c03b5502c7a28bda707280872a4752c197616577532a8c230ac647c97b42653d9aff16c0f21327543ed615ec245f05cb03f65b653c5c58d6b868b7a5764c58587041047fce3f6479eb923da54ee12898e99c4cc931adf3f2d5e85b1c76e580a357d4e50345bd8b6b5eab547ec2310036965eee51d7ce633741709fbe7ead793c8cc3c37c16715b691d5783adda2283ac86cd2a69549f34b1d5ced966e75fc4e65e011397dd8a230d5a9dc7b833ab2950eead22b26b28e9419e0b294238fb1edcd41446990e6b90ffc725ec8979883a1677e29202a899032dce7487d8c5600d65c88dc8cb51973903f164923a3a0419ef73ca373d7b3a13a4d94d88a1d68ddcac7d8b99d223565c6c6319e74501663384cc250f39d4723130d06f123c23ad03e12d0a4f34f250fb6b69c75593a81fa4a6ba4de42a78aed85b8dabe641e73cdaa2ba4f5ba58767eb8b63d934b7d8121c5c6f499ae7ec736d906c4549273247afc6fc18690175a4168d1f7fff317c5391661a9b6c4673397b36fd4dcddd9c7d8eb835a6956b801effd5f6f3a34bf778cc0b3675a470f043a568ea8903c2f45c9dd4c8e691297423f5750a468114cccc957dfdcf49aa5d4f44968431920587bcd61010121b397342f36922e2acfd4ff03bd87600d19a261b64300d6eeda3594c519154d585bc88f7a0d656c7bef06fc62fa9448a57728bfa425fbc79db3ad5f3c5cf286191a96e8daedd8d1b94a238817491f961ae27821a52cce90cd09d4e1f9f07c91bad9c7edf7f9a49610d599288e77556f184dcb1f0c1d3d4993858b1a320584e203b0eda8ac337090bd2472ebdaa1288b612a707a73db7c252695aa2f643a104b6048248b876af0a7f8c8b3ee1b08a46ab11106b39781745b6ce37ff03bb98b982513b0e4cb471708c0297fe0881f06cc2091ee4cf52b5e8ffdde07854c626f69061dbe13aa8cd730b599e137bf751d4ae0e3a7b224a61822e4bf13c0847319046f6c7149b9892c44c4fbee4a4a2443d56d273534d05a19bb8638508be708cf9088ade7e1a149f4b19301c261dc9c11d6e899bdffd5012d75c745871eeeaab2ba87a2fb32364cb7f8c8e3a1fae3c096e91f56d03b82bd6d44b57e5c4a95179f2087a4d734bffd7131cfe33518f3242d7e42ea766c138f49527563842caf7fbc9705671e67ad6fba14e80bfd675be433c6c36f9c2b0de6d8ceea6764c8a595f9868d5c028a590d130c6b8311a604b4f2c07eef460cecb6412f25f46a964d4075e74d54833da6579e9b8970406f98e3852270dd5651dbb887780d3fe6914442c9588874c904b1508aa994f5361314bb987614155900374a7be2da21182d72a0c2bd6764b81c30bf07c2f0e6c2a142da637631855732d31f239c2f91144765f5d3a6bf2572cf3e7ed35d980b8857f22b95735a7e03fc1cbc4ae2b37d2d27f61ec2567366f1bfc9d6a9fc6922eb93aa6fd961509f09c2df8a412c903470a9b56ba544537635c846a0ec6b00297216d92c17d9d5d1b6432ebcc5103a9ac955560c8afeba00470f90299ffee1d04d64e99039bad277d183f6f8937919908d1bdaf0da0ed9c58a45825d23a8864c715ef07a3730924dbf5fc942b2fcc463436dc3fd031971240fef3ca4be9a273aead7deb1833803876fd6deeb1dfecc57be2991c826803632d7d042a2b83aeb427076e189d8b04d60a444fcb4e6ccd996c81dfc7fe6eb31e86f93400c162ddaa7104f52a8cfdfbdfa262b426b5b144a8c6a8ddd69e2f7c0550bf43f8cd793a39fceb0d6b471a9abcaf8a8a0996b4d4d11ae7a1d8a698015cd1b75b4e731ef93d15e7581f3f028ca0ca7b7009ff0fb565bdd1d4c519fd0622f71959928f8b7ba5087cf50963d42ede54561740755f591cff6b189fe94f32938dd628298ef82beb73ceaab0ef9fcd961c6abb08b2f3a57395617f09ec603967eaa586fae94480c879486a1c5938607f92a1bf8fa4e279e504ae960b9bafbc49cfef077431ab4b6b98d79d2e843b94e6969e09f4ac7a100d3c5fcc2b0d8f9e67ec21593d3d8ad1fa9bb3bd8604e8630d3e0ebfa362a9a9ae1f7d3fa34a24a4ef188dbe2831c34bb7b86e0a93a93241f7914cb6f7ad1f3962a087a142bacb414d8836eca94a3e10067f441cb1f12a9902fe99805bf9da37a1a0f3a748453d392d687e28e1da319c96ebfc49c97dae69509c2a8bdbb6d26dfdbbc0f686f705dd30734c8e0936a027875a3d2e5d5e8bb2daefc438ce35d5ccd55fdf26baf6cb5cbb2e273658d1c7a9cbba8e3023de3e36421855d3acc4a814dc1bc022befc524512936028986e4948914a13c4c13d7b1270467faa9507b14dfa560ea2a096ea67c9fd81b329a77a870a4cefa02e4b5a8e2ea9f866197ae23ae337ad83068c1688736f4078b56a498fb7c3ad7b6d35a84608902ae130e377f6cbf415cb7b045e65a43203bab210a6bf245713920330fa29185f56ef621bf28ab4f92a04fbf70424f3eb4ebca23fdf2928e8cb1253fadcbf259ef393df63ff40199713ef6bc1a1f2e1d4f53d39ebd02b961fbc2615f2dc501c6e6167971777d8c6174038f49a65e9790aa102247c10dabb721b5aab456a9d08a8b02230834275829edb87b64cd9c3db0e414c8db7aeeb9f8faef09feb35b18eddb7dd3f4ec09c4c8fcbe2c0cc35e70707ea3d3abd4b434ba09b122f0384c5dbab71264ba27a556fcf3acfba518dc1893a163966f62e70bacaef5dac9adb759d6a07337be86df1c4bdd762f3e4f28b5da3fec5aee13bdab4a8a4701bda323221822be2b4efc4cfe666d8959ed919be43b32908ca8e5c673de44809b2ef5b2402b2093442e00a6d4e7ca08602827e40c565c4688cecb89bc830299141ab57c7496ad65f6ade2150bbc9aa162faaac40e6894907690512548473509c95f1d25e546c6a4040b3352ebc7c5e3d675de5834ed7d2c0fd8341799e0715c792ba4b9d14f19edf6806bf69384e0af3a0380ea00c088c9f2354466f18fce3fabc1df7f63fd9b499db1e6320d77bbcb2e72c6c64b0f436766029026ff5055a2dbc8f1ff623f9148fb1f572dc526a63f193cb9690d72f26f9a3a338f39884954705f39fa42c1eaa6003d7807cf89f3eb79101b0a3b4b2ad5e157cbbd7f1ef5209bdd7e730f60c37efaf2f7d40c508c996ac421c0cf17ce59c873921b98c04977d82a22e2d4ccac0a4c3d99487ec5eeb07dd4a581dc8e92e2825a324d10f98344a64af9e71c5cec4bdd4e831fecace9949cc36e6e456cb8187fa8df62bc6b3e42e1c3f993a5fa93e66e2be2ef24653ad606306785f26933b9ead0ec4d8b52567e6a82ea0d9fcfd0515632cbce4af92b9026877b56021e7f3c1aaf4264f1d64a39910d0ec902497134bb258082f9af0cea4a520b46d010f01671c04ce02d9e679437003435a1452b5d8da1c72890db65baae4ff7e8497c9b9a40686dda1483f24867018299c1c827732d19d8854b150a7162e8693c8fa03a46f3cbdbedaf127e0b029d906efe3700830f7fa8dcf971eb3ffc937e3c663e3c1539a6cf6e7299c297808f0d4c4663792a592330dd33a628f1801f37fff55deff6606a3487c31c7dc544f2f57f4ed260fc4d2fc58008381c6baac11d0528d6b8f108a0316c78a6b73acf2027b83ec203cd4d248afb7bef8967f4254c0ff09661036546c86bd15d6f2544c2a55c82353fd3bd0df1e4909fb969769e44c659b07e41beae83ebe04162b0f60cb2801334b039ff187aefa6ac727ee3123b9dca7ae88273b40e7d3f0add665bc4202063050479af1ffb4aaa7d3b7a4a8db2cad95bd245640d06a0c8d31e288f8af475b732fed5589ad724b179a4a4ce4ecc13f8299d8cf14b8aa8fa230d7661c2057fee17612842ce6744cb00573affc990d80362dadd5011a7b50b841e2c41dcaaee123abea3ac150e8a62a9482142c87bed04a45bebfa013469b75da86a3aa7ea3eb23dae312d0d106bed6848c30c6f0692dcd3d52be4194fe034e318ecdaeb74819ea806a0b0a2ce7c32f85641fe2bdb0cc017cc97571dde2f09ee5479b7886dbb791505c22270308aed30493150c3c33e22d9e200abd02debe90322a61669c54c0a9a59cb2a05f775e80a464cc5cb03cbf4a8cecec2005fb2d69329116b696cbe8752b65cc4e85ddbb39a13cd793898e2addb91db00aea522a3c7f46424d4352a9030409006204e3a09a902e27f4b358942689dac078a565f2ec11667f8480c7849c000719de540891df47376db41c167d590aba23f21ab5002aa2f3361c487e58f90d84cc8fb8bd1c9bb690c52d71b3b004fa299496f46f6284253f9f1e7caa9e1361ac1fdea2049ea810565053aa76fa9190242d913e44c5cc000e190d0cb59a5c6025bec5235fe8bf105956a62ca392d82f576245a5d371d7ab1966b8f03949aacda790e65a05279d64389586a13ed07289760e615ee1178b57a7ee7647b6f7035b3a0b85aacb18b1ad9c572ce5a30f23fd995ed087c50a6bb9fd12d40ec08087828ce572b47745978967c5237c75bd676fc160af99abd58e05ec3590c2f3fcdab1724e5bdd1c131812c845f7d794901e057e8ccc2d9b3943407f02fa0d7bc45e136ddac1ee076fb3f0feae11159200b7e8b05ff59ca5d3f2c17720065ce6ce0ab89c14594253bdc7d9bcd9d1c7d56afebb79a67dc15cb1a285138f9403ace43c740a07ec5bf383ed600c21d449516854e2cb801a733f8feb2d6b46e1197393f0d65fced0c70bc9b4ff83de43ee1cb9ff0ec93cc50d5eba16e7cd8c8063568457383be92630ed583404811c9de099f20aae06db5f879d1cf0ff128e0b9d696ffac092329686b200dbbf3ce96f0d20c6c4f9ef4948f9cde182036cb78ebee6bc8edefdebfae26caddd88474064d570711d263328fa025a483549487c18700d5937426aa14124aaaf431fab4fea291d2995a1cfbbd27ccd66161c853208684edf8037b2ff20f93f716958c93e411cb2239d8ec7d0496543a52f2d2ba8e4ff0bcbc0815e7528f265803ed6781" diff --git a/custom/wasm/client/cli/tx.go b/custom/wasm/client/cli/tx.go index 66cb2dfea..52847770c 100644 --- a/custom/wasm/client/cli/tx.go +++ b/custom/wasm/client/cli/tx.go @@ -42,7 +42,7 @@ func GetTxCmd() *cobra.Command { txCmd.AddCommand( cli.StoreCodeCmd(), InstantiateContractCmd(), - cli.InstantiateContract2Cmd(), + InstantiateContract2Cmd(), ExecuteContractCmd(), cli.MigrateContractCmd(), cli.UpdateContractAdminCmd(), diff --git a/go.mod b/go.mod index 7f336ac19..4544f7a6d 100644 --- a/go.mod +++ b/go.mod @@ -227,8 +227,8 @@ replace ( // use cometbft github.com/cometbft/cometbft => github.com/classic-terra/cometbft v0.37.4-terra1 github.com/cometbft/cometbft-db => github.com/cometbft/cometbft-db v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/classic-terra/cosmos-sdk v0.47.10-terra.1.0.20240910225558-386d57c2a1ee - github.com/cosmos/ibc-go/v7 => github.com/classic-terra/ibc-go/v7 v7.4.0-terra + github.com/cosmos/cosmos-sdk => github.com/classic-terra/cosmos-sdk v0.47.10-terra.2 + github.com/cosmos/ibc-go/v7 => github.com/classic-terra/ibc-go/v7 v7.4.0-terra.1 github.com/cosmos/ledger-cosmos-go => github.com/terra-money/ledger-terra-go v0.11.2 // replace goleveldb to optimized one github.com/syndtr/goleveldb => github.com/classic-terra/goleveldb v0.0.0-20230914223247-2b28f6655121 diff --git a/go.sum b/go.sum index f745ef04b..f848552d4 100644 --- a/go.sum +++ b/go.sum @@ -350,12 +350,12 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/classic-terra/cometbft v0.37.4-terra1 h1:eT5B2n5KKi5WVW+3ZNOVTmtfKKaZrXOLX9G80m9mhZo= github.com/classic-terra/cometbft v0.37.4-terra1/go.mod h1:vFqj7Qe3uFFJvHZleTJPQDmJ/WscXHi4rKWqiCAaNZk= -github.com/classic-terra/cosmos-sdk v0.47.10-terra.1.0.20240910225558-386d57c2a1ee h1:wj2pi3ceQsNEHCYLOfny/MWX9f95R1IvIuMSeZMRiUo= -github.com/classic-terra/cosmos-sdk v0.47.10-terra.1.0.20240910225558-386d57c2a1ee/go.mod h1:Qgm2WbKtqHgE1v9eAra7Fos/zAcB7F4ikwwbDm9SV+o= +github.com/classic-terra/cosmos-sdk v0.47.10-terra.2 h1:f54DHwGuOcyrWToTYKpFLy1i5qUz9GAtc6DOg7rF6zI= +github.com/classic-terra/cosmos-sdk v0.47.10-terra.2/go.mod h1:Qgm2WbKtqHgE1v9eAra7Fos/zAcB7F4ikwwbDm9SV+o= github.com/classic-terra/goleveldb v0.0.0-20230914223247-2b28f6655121 h1:fjpWDB0hm225wYg9vunyDyTH8ftd5xEUgINJKidj+Tw= github.com/classic-terra/goleveldb v0.0.0-20230914223247-2b28f6655121/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/classic-terra/ibc-go/v7 v7.4.0-terra h1:hawaq62XKlxyc8xLyIcc6IujDDEbqDBU+2U15SF+hj8= -github.com/classic-terra/ibc-go/v7 v7.4.0-terra/go.mod h1:s0lxNkjVIqsb8AVltL0qhzxeLgOKvWZrknPuvgjlEQ8= +github.com/classic-terra/ibc-go/v7 v7.4.0-terra.1 h1:xPT04cguu/Tt//x8eOKQVZP3RfYh/JDaBS4jPexK/OM= +github.com/classic-terra/ibc-go/v7 v7.4.0-terra.1/go.mod h1:viXPCzJXEM2fmtaShW+WD3nm3QGUG/6U+fw44UbnB2I= github.com/classic-terra/wasmd v0.46.0-classic.1 h1:+EHlqAD8r8Q2jOpjJoKGOTQFW9iD5cV8fKc0XxkZ5O0= github.com/classic-terra/wasmd v0.46.0-classic.1/go.mod h1:dF31qSPGrHgGPreCCIbAtw/YnJT0Gi997sAA5ZllPSI= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= diff --git a/ictest.Dockerfile b/ictest.Dockerfile index 4398ec08d..b1c410a94 100644 --- a/ictest.Dockerfile +++ b/ictest.Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 ARG source=./ -ARG GO_VERSION="1.20" +ARG GO_VERSION="1.21" ARG BUILDPLATFORM=linux/amd64 ARG BASE_IMAGE="golang:${GO_VERSION}-alpine3.18" FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as base diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go index f419217a5..f760f9798 100644 --- a/tests/e2e/configurer/chain/commands.go +++ b/tests/e2e/configurer/chain/commands.go @@ -39,10 +39,10 @@ func (n *NodeConfig) InstantiateWasmContract(codeID, initMsg, amount, from strin } if len(fees) == 0 { gasPrices := feeDenomsToGasPrices(feeDenoms) - cmd = append(cmd, "--gas", "auto", "--gas-adjustment=1.2", fmt.Sprintf("--gas-prices=%s", gasPrices)) + cmd = append(cmd, "--gas", "auto", "--gas-adjustment=1.5", fmt.Sprintf("--gas-prices=%s", gasPrices)) } else { feeCoins := sdk.NewCoins(fees...) - cmd = append(cmd, "--fees", feeCoins.String(), "--gas", "auto", "--gas-adjustment=1.2") + cmd = append(cmd, "--fees", feeCoins.String(), "--gas", "auto", "--gas-adjustment=1.5") } n.LogActionF(strings.Join(cmd, " ")) _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd) @@ -253,10 +253,10 @@ func (n *NodeConfig) BankSendWithWallet(amount string, sendAddress string, recei cmd := []string{"terrad", "tx", "bank", "send", sendAddress, receiveAddress, amount, fmt.Sprintf("--from=%s", walletName)} gasPrices := feeDenomsToGasPrices(feeDenoms) if len(fees) == 0 { - cmd = append(cmd, "--gas", "auto", "--gas-adjustment=1.2", fmt.Sprintf("--gas-prices=%s", gasPrices)) + cmd = append(cmd, "--gas", "auto", "--gas-adjustment=1.5", fmt.Sprintf("--gas-prices=%s", gasPrices)) } else { feeCoins := sdk.NewCoins(fees...) - cmd = append(cmd, "--fees", feeCoins.String(), "--gas", "auto", "--gas-adjustment=1.2") + cmd = append(cmd, "--fees", feeCoins.String(), "--gas", "auto", "--gas-adjustment=1.5") } _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd) require.NoError(n.t, err) diff --git a/tests/e2e/e2e.Dockerfile b/tests/e2e/e2e.Dockerfile index bc03e04b5..069da6154 100644 --- a/tests/e2e/e2e.Dockerfile +++ b/tests/e2e/e2e.Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 ARG source=./ -ARG GO_VERSION="1.20" +ARG GO_VERSION="1.21" ARG BUILDPLATFORM=linux/amd64 ARG BASE_IMAGE="golang:${GO_VERSION}-alpine3.18" FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as base diff --git a/x/tax2gas/ante/ante.go b/x/tax2gas/ante/ante.go index 0a11ea15c..b75d5719c 100644 --- a/x/tax2gas/ante/ante.go +++ b/x/tax2gas/ante/ante.go @@ -153,6 +153,11 @@ func (fd FeeDecorator) tryDeductFee(ctx sdk.Context, feeTx sdk.FeeTx, taxes sdk. return "", nil } + // Try to simulate using taxes + if foundCoins.IsZero() && simulate { + foundCoins = taxes + } + // if feegranter set deduct fee from feegranter account. // this works with only when feegrant enabled. if feeGranter != nil { diff --git a/x/tax2gas/post/post.go b/x/tax2gas/post/post.go index 2c2f8fb23..100ae4765 100644 --- a/x/tax2gas/post/post.go +++ b/x/tax2gas/post/post.go @@ -147,6 +147,15 @@ func (tgd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate return ctx, errorsmod.Wrapf(err, "%s does not allow to pay fees for %s", feeGranter, feePayer) } + // Try to simulate using paid denom + if feeCoins.IsZero() && simulate { + fees, err := tax2gasutils.ComputeFeesOnGasConsumed(tx, sdk.DecCoins{sdk.NewDecCoinFromDec(paidDenom, paidDenomGasPrice)}, totalGasRemaining) + if err != nil { + return ctx, err + } + feeCoins = fees + } + // First, we will deduct the fees covered taxGas and handle BurnTaxSplit taxes, payableFees, gasRemaining := tax2gasutils.CalculateTaxesAndPayableFee(gasPrices, feeCoins, taxGas, totalGasRemaining) if !simulate && !ctx.IsCheckTx() && gasRemaining.IsPositive() { @@ -159,7 +168,7 @@ func (tgd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate } feePayerAccount := tgd.accountKeeper.GetAccount(ctx, feePayer) - if !simulate && taxes.IsZero() { + if taxes.IsZero() && !simulate { payableFees = feeCoins } err := tgd.bankKeeper.SendCoinsFromAccountToModule(ctx, feePayerAccount.GetAddress(), authtypes.FeeCollectorName, payableFees)