From ae6d00747e0d619ba9c1f6632a90299377ccab65 Mon Sep 17 00:00:00 2001 From: Giulio rebuffo Date: Tue, 29 Nov 2022 09:46:52 +0100 Subject: [PATCH] removed debug util now not necessary (#6149) --- cl/decode/main.go | 84 ----------------------------------------------- 1 file changed, 84 deletions(-) delete mode 100644 cl/decode/main.go diff --git a/cl/decode/main.go b/cl/decode/main.go deleted file mode 100644 index f96993e24..000000000 --- a/cl/decode/main.go +++ /dev/null @@ -1,84 +0,0 @@ -/* - Copyright 2022 Erigon-Lightclient contributors - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package main - -import ( - "bytes" - "encoding/hex" - "fmt" - "io" - "strings" - - "github.com/golang/snappy" - "github.com/ledgerwatch/erigon/cl/cltypes" -) - -var ( - // Hex encoded. - metadataV1Response = "10ff060000734e6150705901140000a43afc0e0b000000000000000000000000002000" - metadataV2Response = "11ff060000734e6150705901150000b3a056ea0000000000000000000000000000000000" - finalityUpdateResponse = "4a26c58bc804ff060000734e61507059014c020083eec0dbdf664c00000000004de90600000000001781be17c85df24278e5a08c2cebbab21dcd60593574c231f47075262425fb7e613fae1212348abcbb15ed2e6e99b1ce5d93c8013eb66009d824721f0a068db1be1d557934252345e99093d8e6b227b4ee19423a35d984a56489bfcb57d2647b80664c00000000009b480200000000003c68b551600735c179abfbd5c74341a8d524365217e70c031d13acc22b003e4938e9d045749e349689d211972dca6c9792a364f309b5c202f25d87b45b3f55b07feaab3b47760bb2436849a855b52e08a61be89156b90d5080f5719b9989274b34630200000000000000000000000000000000000000000000000000000000004165581604f4b02f5dc241254fdde469a55c8ec1ba3a431486f187227a7d7339ac7a41b9c769bd31b1f1b1d22163f4d61a5f54bdaee0c136ec3fddb84e6d7ffddd55a8a16926d19569039f7af4feb2ff5b4d78bb7d8e3378008d32ae06db97ef0055e5bc3b4060c2a667378780d589571cb7fe0af24cb59a2245bfbcc73728645f17cfe000a126a583ceffd3fa2362fbad8368cbfdf9b197e2d7ab8af059a924ffffbfffffffffffff5f7fffffffffffffffffffffdffffffefffffffffffffffffffffffffffffbfdfefffffbfffff7fff9dfbfffffffffffffffffffffffff817d6d9bd4199e2c7296c91a574e5082af3a28ad831793265a28181ac5795f61e93575902ef7668c12ebc3f151949ae017052f8eb5ef7a89901fa07a0b24816fa6ffd207e973106bc5a207124ca49401d8f0f3d325c9feedcb5edb7e0e386d2ee0664c0000000000" - optimisticUpdateResponse = "4a26c58b9802ff060000734e61507059011c010082d6f5f3ff794c0000000000a49a0200000000009a768d1014238eee34b812ac38d4d5fac898baa2b0051fa1ab70f3e8845f3489070bfacdbd9c1578d50d7a9fd74e1f5fc3cf73a0f46cf08b63fe1c8cbbfbfdc4c2ab947c8bc9de93febc896aeca3a83267ad5554a80bd981eb3bbaf6be29c401ffffffffffffffffffdf7fffdffffffffffefeffffffffffffffffffffffffe7fffffffffffffbfffffffffffffffffffffdffbf7fffbfffffffffbfffffffffb41efa9795abfddb166a4d660fae5ca7af3702653112bf180f477693e99869ead8a86a252e9351cf649b0eff14f584a80a144a988a04641cde878990e48d68a5fc5c61d3faea46493a3920744adad1948429cb282650618b290a0294894a4820007a4c0000000000" - lightClientUpdate = ` -4a26c58b98c601ff060000734e61507059011c6300ee4a181a9a894b00000000004b270200000000009c5a0bdaccb36e887ced8d9aad5984fef9252fe1ce434e860b560d350e21763dff741b693fbf0a5e34d1c40add7ca39309f305ca38d773627cccf7b4598cda971263b1e67052b9a025967d4738d11ac3ce0ce85ee9f065cf7e2ee01b65e06e729302ecccbe366133b41dc26bbf0f93af9f38c5adf027649d4b778dd6535763ab37c24c21434d2fa73becc1b956c986918cf7978039b1a8084cb860c42700a218fde22b9b92b030ac592ccdd9e218cef2b4284b5a1caa871ad63c14f79cebf05684a83051327b814c5b9ff6725c935532ee0fa3d9c32e0a221cd290179d0c34ffcab45a5568ab1af565a06555c335c7a3914c97952ad40d3d7fb8527993ad53f8bab927cfa0e1ee040776a5bf7449bf4442005eeac74c9cf56601265dc088b43da2d5bc85f62acd887afea2af10bbddcca594577fdc1d5fd73733118afc1e175396a397fe7c84177eed0abcf94e30d555a3b12f479c4e105514535513bf77e8315d623949412a6b76df9fbe884d96ccec7799995d4f121cf1fa14fdd5afaeb8eeae048c35401abc72252498a8189c16d75ef7b03a5c41ad2b8b6dfbc79aeb2ca3e2e401e05014aaa527585d26e3189ecd93290f0647d4c13d5e2bb927c42eb2accc9026e1a5f194ebdb93b4a37e69a730a7c406a51b7a5ae0a535dca37c6fefad95add3d256e047c9dd8f176559f690066364dce49105ef35d8740c8a3c6e0cabf4e3c38590ad726c8409fde0af495d54b9700f5ca7231352072f734f9d8eba6df97f378e3a9b598dc7b7f9472cc051f97caaf55f84216bf371405675580bcf74a416410bc04ad1e4cd1775043c4c3bf0f49976c963c3ac76a7f5112043c5c9359c3518cbff4ddbb4d408b6083e2c68d4a7ec9ec6f4f0d94dcf596d5bec9b1dd5651ed6294c67daabe6739a587eb8f3918d22fdf41bde5bcf4efe8f31567d2e67b1f6eadf7bebcee2a9d02f515130ccbedf3e0f9476f03acca58e539b333272a27ded0e93ee9349f41e578c663aa38f70867bc4a5676b432de4588490b1445ce7e2a91ae7c9323e7159b0bb3696ca854ddb101f9e2fc6a86b1e004bcf02c41718b20c1fd6b09fc165c7d658e63caee714fe2259968c28231302d003ba442c61e3eac43efdea5693c9059545963f91fbe18a4727ac7b25f132021f66fa31040185b303774a2b2d3f8b76029b1dd851c282a4954c8a161672ee678c2d4fef5a0951b18499159106bbde719380ac8afe80fde3bef5fbae4a02bf4cc2eacdc4522b03cbf36245ad8d6ea4085c330b5b8e39d1ade5d1e27df7120eae23dfce74a14106a3ed0c43a2d359d365643705affab325a205ef31b05e6b53d3fb286a73a8eebe9697d495a4e9123285be4394db9a206fb780e4c444399c605c9816c81dd330c9510ff8d1c61d8ea28518e88d839fec1a8b2a7a0eab8f78bcd0fe03b8adfd2979a0445ea890f06202f1d7967568f14b6417fb431a62c551e934a69b72b81f1b2ca056c0a392e597dbdb5f9b270bdbcfda63eee2aaad060bd35dc1e88b56a4f2a84534de067f2f4858f52ac55f5e62c342805afbd44ee8ca2372f31835c02b16dd4f76b0f18338eea8c277048570625d36341e8cbc64d523b39b7e023b9f1205eba711dc6eff35869671c5b10f9b8dd99e382bdefcafa1c3c79471a0c0357c627cb0191d7a6aa8d75312dd1adb989fc575a04b54fb06296097507e7b5b2907d780b7244fedbc8b1b805b2712e9c7cfb2798747ff810abb52ba595c5abbddcd6f7da03042c757cf9bba7b967a03aaea5a85b3e1a3d2d5fdbcba4276970c13bb76d2aaf7d8c36874d993b3d24900d064386ca8ab3bc1e0218f3881ea159f22972d98a3f08d9f691c79d5c68eff8079a768345df7910c3ea81c5ddcebe7a6e51b99e896dceec2d5e23cd85c01704be74ded5a38a3cb88267d330d38d2a71c1639370afa46d045ac053fb2206668814b1b62baa15709c8dbed2ba7a8ce55e1887d79a66d22d19fe08f2649f0d1cba7b6d4466150333851a58fb5cbe941e3d37ef2b8df847b8e6b1078c7b6268fbf8d2609eac2e1b2490ddf7e2a5879f7561423184d03ba612ff1a608ae2323802eb59ef455b4a2ce34a99013b1c15b2fe653ad3f434b0591cbe439e00f8a3e9b1247dd2ec709cd1d13d84df911ba86ed7de9f2579a74b0a1fcb814f9e51c0f1135e5aaf439103c821d3cb112c7229fd45b97a97c3bb72e75024473ed0013d207c41f66a66ca7b71a5b8ebf94c42115754fcf48a4d0ccf87f7ef15757ada72d86fe83f0bcef7d46ecb0b1caf2d3da6d5ddc630af0865f925c016bee387b515ec02221bd4fe73e819cbefcfbe0aeefb2d529f614579c427b793ea506cedb364ddbfc1ae3ab076db030906b1c646d193a12a492e7d5b9a14d4530d8879fe42c8cda581c040459a1891e72e026cd07ae8b134c58f601d4e7867177913e92968353ac2734b41774dddf7d4bc0aac3eb47ddff0135251a1369bd4e8605828ef68f0cda3054a818814493ed2b9e4c50f6e2a935aa43e185f3689f2623fd302b30144e36c7af6fa080f43e3c6035bd4d5628b4e6cfb2f985103b8254c49481683207471a9e8e1e749fb986185014adb14825e3d6ac375558dbce8caf3543e506169cd103c2bf84cf5b63b0f6afcd20db81afe5d7924767eb3b290381f9549f465f98b38d00fd3f362f7033fe408c150842f641b73e5167dfdafc94da93f998cce95d7d4544b4a3895faef75e305458814d365aeaac1855bb5ee4266ef1298e488951090425c7a5382f398997510c35f4aa2c29ca08fc328eb7bc1bad4fa5806fbe97961d3825182986882cf3230de8a4505fca7c08e537b76ed18b09270db08ccbaa779df8e2c94776cabc7ecf038178c50bf7f46f5f5b0f479e2b8e86c4821d88833083d8d5c4b3d1a997532ae2ee1a4dc20f324d770e68bbbb59011c3dce06df6cbc221abe8e226abba47a9b9608ec268e1ad0460ffe513c4794d983240384827538e23f8c67ab5bf11d62cc72bb0fd7d33dd8dbc38e3c6c471d993e2e1601d303ca3d000a2a751660ae4f2ff410474c75490e0472d5d4ba46fa901160560505360201a7ee6eab579e8624bee76fa49a3e9ac8ec13a5d2e38e86b58f2029d0dd5ff0975622b8fd104fcae978254cf8093e6719c073d78df701df497a3daecfc8650973e052d14088f296cf43994265f81c74f460447dc5466419a61076f5ff4ac7f1853251a31073c821c4da3309fd8787c6c36f004fdf679e8714aa70ddd641d6654ae9e36aa3c9ce653cb3eae56da85f1e5b87980820c622c6c7c21a22eaff66492ff3404b65c7e2b15c363aa6ad606f3801bb8b50800d8f67dae906956d14fb295899504cbe698e7f802c7c92fb23282c561325ac6d387ea2c0d64a03a7e42b877b1fb0b0c9e195c8b7ef469db18f3daf5f12f6bddc43616525e23b163c115164bc4900991d99e0932ba7f8d9b664e9b52062feeb8517f701dca8caf265a32e925c1715379678a8fef097c6ccc903a79f87330122123bd28fcbd12c86881d660b12d188209ebe0691a9d80b44714496b6d3158753de25193fea635b94a61979b182edd5349eefa5aa38c05a85084f0d93508f5ea41bc3f64e97ae209bae61e4094b05306e6b4517c915a052b9144bb0213a44914c13910884ebab6321dc47bbd5d9bfbf3fb155f71fdf751dfb0834ffd90257704bc31f4455a4e5b509ec52cfdadcdb7ec61089b58d2629a4c97c32143a1355cd923e5efcc7eca69ef7e64d7dd2a68fd2e70c0a12444f1d5bc8fa0cda1f516d4208bf6fc1a77fc7c5fc2db32b1b14d95f14c1161ae3848f5cbddb422d26ee93300aba7125716757273b0c1df1833788f9e39a6b7b935d6e3704afca2bf38e404f3463334bb49fd98bfbc2cff60f3e2eb2adc085039218737616bf0d0ca4abfb8116dffd7fa7ea4a03864b10568cdceb1af84adf12e3e701e9e4352e42d65a929c53d0b5f2cf1f6ffedcfb60da4b935d60ebbcd0adacaaaa9470cfeb181f6d8558b7c10a13f6d13bb087411a1d0e80ae148787a27df24de8a07d642de81b8c53576453fd8a8b2fe85b7c0fbd38a3e283a342c835f372171c3f1470a12de651222474d71de2c862d7d6cb9ca1b49c699c4668d2995b903fb891325f5b9bbfc9c08b687e70e6d5f116e0a3eee910f8660311ad700d5971f7054f5ce7ab739cda82302f1ca45a9667fd9f20da4307d965d41728f713225548e22a4186487ac587e618af9fdd86a1f3761eb5d1b73eb91f9ab2a4ea54d690d79ccf089edc37d5152791d229b671efda7a42b58bff18e41c790fda61ab5ca08f9e87cf70b7dff26880bd6dd7f8a9a3367d1b2915d1b098e48ace31bd7d22d1a9da16b1552e90c722b042748873402748cdef5fc3e17163e627380f8c82688af152e5899acc4cd063f72357c7e9dbe825ad3734e158fd95c2d4d9006ada3e4be71bc4ea19b07c3ed833edc5713982ae17e2c036d762854183c07cf83e6f24872b0e5efc11b6ce8818129bc811c015284638b44520f027842a3db55bc43127af0144d76cade2c61031b761949ad5c7072bf08ceadc5c500c2f654b40bd0591a84bf15f61d64de0123307790eee4e18a74c645b190d3afcebecc16ff5dfab1a8943a3326153c1d46ce7ee26ee8a93c9cd16c6246a789b8a95ae5513c17b549599fa2d2e289468bb766a910000fd71fd01676f8fe269ab9243f8b0d74611ec4a4ebafa18ee1603c32474da1e3eda9a578c58a979bc08a1793ad5b46eee90b0d25c3eea1d932189faf818a48fb53689ffc77f2e37a725c9af76db0e76d18d4d2aa8f7bf763cb43334fb4753f456818038f3e9ec9216acb0efc94e637d0202878adce9fa3f29db07b454363aae42ec384799a73281fe5b5026a97f013e31236cb1d65c3bfbcfe563ff0a7da47f9298324f46d540657480bc46122a36a58170fcdb815b5f61a05b6523d3e7d4f6d0dedd0f0448b59ce1d344e5aba3da7785d01e5796d04161ea18448788f04f757a7a9782af17f9f5e8c7834cafad08bc8660a5e7772ed692d358d43629c8575ccaaf02c6566bda0001be45c3018c74d9305b77f7b2b464c4b2bd0080c510079a71a83b7f427a18e153ee79b8967a5e5e1fc1cea3476f2c9d21963675fc9b7e8d5f3572328a015f378821e96534a854526566a4e6f336202e92d0f0c4a51bf3f82ff9ebd6a8594f7373076a3dba0e7faf775f92eab920eacff971122c93643801a1cd9941226efd52b3f8234ae5f43866f9330b82a527057bdf92ca83aaa7f3766bc4ee70b3a385215addedd65e157f8766abdf67309746e71ae9f74fd1c0ed8243ee043eb343915062d84bdd48d69418b4861a9f928e86b74037d46918320002f6a7696308f52663d72d5540f57b5dbcd3d12fd8d91ecd100eab1efc824aef97602786d2b267dee51eafc8df8427b48d473362f932d0e70b433535a0d95405f7f6aa0af937fe724a7ac3ae83df7f53de1b724213a5a2e3c96a1c480adcf66108f88fdc39fde8c862e1881ffac99fb80ec16c128ba4b8b21c996056a1bffe20e05dc31c0cb2a2cd2c2621430a890ad72fcf9aade38735d28bc1590c86624259830a2ca13db24fa94f1a91e62b5377f35018e1366e8c32ddd482bc1c824946432c6e3d34e56d20a89d4d014e89560b2b83f9615e932eabe3b26276b9583fa9f4f50f751bbcb9a893e661ec0b3e9a14f54b2bf959929f9b55cd9d2047432ced7cc81ab7ba1b7546d529e9e1c5a8910b60c8fb88ed5eb1e35fed1b24a829345bae37c6122c0629921a04b09630b19350f2441463d34851a6cb8a3011a234913d5cf68e17d8cfa0a8fe5ddfea14a4f5f3a41e03220386d79fec76acd8a0b0fe4a76bf56a380b8bd11ce6310ec0e875031d8195fa66be0a61fd259955df02822d42a01d88dc26eb24aa779436804fdb3d9b2ed3adeec804e63f2da0662da65fa39ea3e49810d2aa9f1011f9cdcb53a992ec6c7ab73348b16a13a8dd21d691b9db8d486651f882cbc074435a6f2dbe658263b2fe0782dc9a1e9b0d6ae47e0b6096c8443c21f5ac35990b2d7fe7f774a59e4290866b24e77e83294d6d03e12565b8f305e9ebd4f48b8d2c08743bc1e5a78c68dbc7a79f6fa65a2485dcd483fe911ca389014f46e4c57d3c5f352aaf6f02b9bea5c69d816ef920c02ca887fb78004d9f6d0f88ed9e26b5e04a29eac4edb3a488e10d14a1325c22c0f0ac0d86c099825f83ffce7e9df99d8dfba4dedf528eebd1480990677429e3c76fd1e0044353414262465d7f41cb30c9ee63b5b8ec07592dd398640fbbc8da6157dd8264154113b69d859a18e9e907b5c5cd0aa0e519e50d2fe74405210c6cef1e56649b55ba72de406ca1d0ac58a0815d3ff1de6796dcb3cd84784cdc10a960d07e872a9cba41cd49d75f190a0b915202d2dc83f59e3698663a096d325afcb5261315904c36de974788afc39ba082faf2325d6e23725f91d894683ec8501c610f2352323d13f995b185ee495529188d0d8a525a7ad23913b07cdb7174bc96fe6c6dead2bc2c7bc5be3eda92eb9a36fecd4a449b33efc536eb67a273f31a20ece6c5c4850c4a0772d5b7dcc50bd75e7b9705466a6c4a6f62f2430ebfe456451dff9ebe5a86238914d30334001608c95ef63e90c97e402420433a12f931e163ec39f642257f445d0b58ceec9e3ae3358d277ff6df55329695e0fb445288ea17717160e55475452e060b961b5cf3a6f7b38575fe1fee095b0a7bd8a7e2cd7b0f1d7f5484dee9984b787df16d8365d87b309028a309855e387275db78579ba051587945407cf5d81d99ae9cd2ef0856af4a5679de451ece8ff0fc77188f3bc8a82a49115a66997bfa6403e9555e3fa56ff75ff3ad613d85537f35baafdd8340775349580319a1366421f4666b0cd519944d75cfcc0ed18645b4f2f1f51d92a2229b524ed9788dbc699f9cec1a8bd77b1b150a4247f82bcb01d1e217b2dc97d8 -bfb33f6066f491662036b99432cdae25f4bcc696271cfce9d824d0cdc7356b1cfb2ed7239a9bd6b52e39ab0bb6578b4a3aff8177b72080acff91f8fd62e2eb191c83b2c1af5b327c230f3685b10db915f3a74fb5c87f4ac8dffe6467d35f900a0bfcf002755c5bca9e68c8e2e5a588a534b9256ee02b6cfa06efe2cabc689705537e9a20e9dd8f948eed6af3fc185a3a236bfba427ddb9ae09e74ba623d1c68838b0667f4bb68bd98f2954561f80df9226465a2521d2f65d43119ab1dc30441913c4399a661a668a1d3cda51423c47fd8146a1925a5aefe91488260d1e6ae0d64a0c9157c7e830b34cd3512bcc93114a692538fc5ddb5bb0cb55ec1b3f644ba194a55b52d10393cbe028c3e2458997897748b4e5ef3227d225de0fd34fac292a86e2ac25694fb591bbb43692ee9d084a5ab84dee6d5eade4b7a291572b67677f1b8c5339f5c039012de2cce7cf69e1498122771df642609ebe2c73574c40543469c9d8bc50aa9cde7925574dd6ab3e4a160705c45effd749fbd6d70a2890c47ad2610ca2520ecc1c5f11020b3482b2a583932e96d51f95601c7d217922b18c3bba6c789e6325509c8a9716d8192c9c494ba1b83742f61c1162f5981f719735965c63cdcfc44ad98f57c9f42cd5ff9eaf97f3551744572cb73fd042ffb6cafdd82640d203605a9be2cfbfd5680ffc0832254682ab6e2909bf6ac38b73ba50ccc51d7dd9b85437421dabd6c6a1d446e85b4994862cb82dcc16a9d80b66a2ffe8e44242d4bcd83c82d6000a5daefc7de283cf8476696dcc116fc65356e8f7d59bb977f63a1782cd5f5b1359cf7aeaf5b7d17e4cfa94c202ad1bf16753e85acdf3bde8450a765ffc14fd64d553bee5b101a95c228a34ca00fcf02c34d1ab3ca0f0dd8a4b2355d65d9fbb2fe95a3c4e473310624a4f50f13ced5b93eba74b1e3585fa45d31bf27f1946d504b5e3f69a943ea71637b38a9d01d91a9dfe173412e87c19a4a6b7bc64b6587877cba019f84af03afba6740f1e6f5560fa7b158f051cab5b2650264403bd7f2ed75b4c900e396303f9d6d1ae72861cfc622ad475dd26ec4b27d82f1f7ce188e4f3c6a4c00f04ea2e13b7bef05665dc03b038a4adbef9549f948c164d4a110490dd3f42f661c57e4810af23437bfc9b2ab3b73ccb412b387105bbeb0bd5d96c98eefaedcb32dd191023724d127c80b1e11663466c9bf11eb87b2dee6e33c3f5a4459df59ad3eeaf6392e4aa9eaba530efd30d3473a183b5f5bba150aea34ec03ca0bcca994878024a1639b4359f535203b148c1054aeac6ab8069a3356da17f9c73335e67d86fa7c525ca7d953d9198ee96553ac2189e80f90ea210d54a4cbfca879e7cfd6c8bd4b6c97c0f16564e4c52f567e9fc5da6bbe1b45240d7b69c22cc6287f10a87ea6eb943903dc4920c1385bb79b1a6b7a937cc6e7fa3dd4e6cce7dea83b093852203782e7b99fe42ef98cd04beb4590c5e6ebae4775996e29f7df83d500f997fc330e1e03f70b42d478d26aa4ae7afa83f75c66577ee56a82364576038f702b0f851eb4090fa493a86e08f93ddf5e32a87c741d295575dbf5fc3c4694ac602a4f360dca0269c43f708aa9cd4d4aba69548157b17fdbb452f0681c89510f44a9d4a2e4d971b605f461f5388fb391e4ba75afdc0847df64006aa52ce222bccf72b791b8acdb3e30f8e35e618e125072a9f801bb03f09ab15f7d0169d663bbd91139a6c0c7e9d4c10281526455d19a415f8717839066dd48d41b543a4c8c5875ee840d1c3ab317d4ff93cbb45a1ae56cdaedb1838f2fad7db1a7af040219d9c670293ed59190b6ca7d628985bae1c8c481f566ee0d1a2f3d6d923b26aea4455a86df53f44d6e5130dacc372c73611f195b56cb968397e9c92a6f053045000cb5387e3c15e2cbca2ea7b7a5b0a408dc99128f7fada876315f295e3bd185a4812adba3f590b6002d3553189f017ac7929d9791743e33cd7f30b96e2da85f80945f01805c37eab8cf8a83ec1723aad43eaa10caaee097fa8edee3fa06fd8464623995b5a1e2213bb020099956000c360a39919ad22a7646c2fc3cacf7e9a76f736ad7bddc73a548d9149a3676756fed8f0071677931ed188a02db24233f1c984bcc499f06ce478848f0f1ed73e748afcc4b17b58c00a0bb4c11c73f9045761810c5158aadd2a3139e029fa509afff1071be33c634e182c55b6c0d1a47fa123b34cbef60ffbdb872e1a81dca8450297df8f6044cf2a51bbd67abd863ae33513684c134901373043106163a86a906873305688ff9d4ccae9dbae07979ba98c0d3a9d76881955a60001b4f28aafeeffa7f575639e9c41be96ad02924aef613100a66fe4a57999797584bc0f63b4af130909a0ec14813add1615fea7709fefb8d99566384c34a6f2fd327c29d014fdc6cddbd76fe45af90882f226b5823556b79705f0041a78991718e1a226b5a3342ecc491f9a935d1cbaf49c703a3a092043c38898ad824b982ad0d8e43497f07e5b5fa0783b686ed9aa66f5ffd12304cbe7abcc2dfb92d3482623ef33c487011327c21c9bbae811d2ca347264f20e005f66fd51eba9874a33016d1981bbf92ac9bb68c82082ae70cd50984022cd380e4f22b7f3676d4b542b8b5290211b3b9ffca83279eb7fed9621f306f3321b115179328372ff5c2db52127c8f8e13d879620ff8bd30c8aec862198edeafdbfa7a077cf12ac1656413f476fb139eafd0d04d7ba3db9dfe36c45ad88b2dc5011cb5cb241ed68e50cd3135979995b768b0989c4fce85efdb724af4ce6fb5210496303174d8d230638743fbae52d92e9d36f5ad59e144fd3d2eac467c83ac033e441586e515a6f5803ddc0ecd2223012ef2f4f9eadab10afe917c58d491525ebf7df0bffddb2e353938e9ff929192c51d5332c048568fd1737ad0084baa358165ce12d695bd568f968d6658eb0fc0fd849164c2320d581539ea818a6f848896bb138f7b82917694b81437c15e036e32fc2ab0dd94c840931c1b95f846ea382498fcdcba0f96cc667da4202c68b568c59290711cc2fb5a082370f074813dba4c735e224da2d00b07bf5b457d9a050976e9ee1c60bf6e2e985662cfc240a28c368d6345f032252cedb4232cb8d7a2431f6378f87ab32c89db383ce07e5a7afeec41e6a209a7f03d83424cc36e70b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8ccfbe105a22eabb6a2ebb171bf73e0ec5d469bc5660bfb4c5e6a578adb26a22df0b39c97f16dddaceb3e13b8a6aa46fb81d11f7e43684e9b45c01cf289f57d0d4ec0705441558e849ce6691774ea7db647e64a8061dd57479947ffd4f8d16b3901dc3ae681db6a3cbb6c9db3a7b4bf9dbb814412b5b70af676cf9ec994c604ba6cb76881c3be9e283fc642d16939126b8af41dc6805c3edea19a1d44d4665fd4257b2057b97b656a36637f72d1cf4c5fb048f50773fbc906c2681f9f1a8bc65a0a2a25b81aa44a4c48cec746cd9a928bc1df2edea6535f8ec4bb061e8f052d9e145d54627544c8a1544fe436ba803e5a27c13f7c63cf5c35d3b33563267aa0846c198a7887e7e0ded7d7ba718d1e1f8315eb35b6799e752ff0d399171b25d75b8c55bb585faf49d0067cbceef4642f228f791d6e7388ef4e919f2cd19c10d1c884cd33ee2067e06693e634a8750f41a809467f3259a4d113fd0a592dae7d64c8e1e28e1d9fce8cb03095f7f90334f57543a51cd16afad1494f670d8c33c587181553f71db0856b1faded7dfa6a4a207c845ced78f6a42a4e9f602ea922d6ece1249fcbc36041e2703441bbee768b5d5a501507bf31d5dee6190e139428c12f069432be8fb9e43cb29ada7d8555d40c6939124564c588e948b6eb633e9d6c0e49764328be1be588dc21c897d71e48954bb990eaed0684b92fdd8ab10533c9a13fc23e2cb2acd881f05610822bdbf4fbc8a5cfd457810a10e81f2915c6872c7c8012a1a0ece57d6bf2cdb17929ddc51e1fcb6616d17dfdaf89cec746c99364ecd811d2e66da67f500acb062825b1e3f00d83159c35653d695a606b4c48c336beb0653a717cf463d955b4ff991e9e42197b11ccda9693b77f3a28d1f5c91a5260bf676553a57b71df8032b75ac7dd549b6b530e95576426ba9130693541cadbd3b93952f44210ed2fc7fdfde04282af1e07c072fe87b6d1bd9b576ff79c13755d56d69e355f9cc44f13d170c71dfa1109db210f82b45002cc748cee15e9206e524381092ef81bf28cc97f828136a0bf7802e990ac3063f09cd0ce1c89b688582f58214c658ff1f1ecef413761ed4487661b59fe31a21c6fd3972c37b807f4c932e8886709b38b1d675cb55f2a9bf7259eca477140a8abe6b57ef27e35b658827c3ed2c1d87861ca9b6d3a56a2721e05d822ceabbd94fd958b0d1a1afdbc00f23b78dcfd37b6f46faf7581289c0429614b9495a3fc380e02e8a5792f1b3f96dc5c8cad03fd6ae340bdfec3c6ac96cccc567b788993e1252221ea3aefc0ef5aae9fad892f6ba8840947e1e7051f809564e9ba363c9689b3044e73f32f5649d24dacc9188c728edf40ed51a2ffb428d0360e74b079110c292a2a58b5acac15bea5151a301c84c2332397936c7b75b49494ffd931d02dc573f1db9235358b6b246fbaf11de3222f6b9d6db7a2ade0f018b2b35ae03ccb3aac655bc1f9a694bf891bc4fa6dab8aa31366d4b4c9394d93d36f72855a30b251216fac13d5c333c1d6165ce3f2e1c9e5436a6c15ae8e57fe01aba60956a66b3ac1e92088936331b20b3d2e660ec72e8a1208234c085c64be5fec1d4cd3f5d4fffed985d3c8a1d3d6f7847c883297ef67ce9345d3a3ab12f2cc0c9f606d56303dd5c723c5c20fc172660a8c23f9fb53233596e2e5ff6c9171b87f69786e7ed4586560f2833170c00430e3011734c14ddce07b453f4f286c213a9f26e268b17124dac89182a1338a0123da70fa84221c71c5eda31ec50bdfe4ab492437c3e9369540cfb85f70fed3b03dda9d2501071d5c55d9de056c183ee6d1dc4859391654816de57ff86448a3309edf2d65e19fd4d6839406c49f787bb1cfeedb4098ee1cb9161df76c9a474fd10bd6201ad9be416e4da981e6276df3528d602108990e412844d55eb8b9ca779d044380a6651fff5737834f51257c95949e7b6b3b0d187e5dd94b4cc49fc8ca995112d44bee5baa58a8ba7e5760169bd585fddd99dfb84279ef8ffb4d9a52d45c9fa02d8b0ab167cd8d58622112b6d7d3d763d8d52690b11a3b670213ad7c44b72bc6761c0d4309ddb402b7e62dbaf4631c0f969a6b0116dea5d943c393a10bb3131a1bed311737dc97ea6e8ec78e762ed4ceb132f98c8e3388c0dac197f7990a58a309f8938db1ded1b97e8781f5329f9fbd26cbe4f96192b6fc3e745a83ef0a1843a62975e84e08a726bcba19548bf5295438c993aa5a96e3bef88bbff3fb348377d71c4bc512a825247b2b54712a076659ce3e6f5d4979f157b88860572d94d823fb28d8179bce700b5702f037622eaf78dd159eab182dc872ef17e288a6205a4b90d20b3ed9a1ee4bd82349018fe4c7c80c2a5edbf3be9b83fdeb41187faa0884525e75a9596dd87b901a22548b937d865f9cf6166cded02028b42fcd98c7ffa5c3a98dcec29ee4444c2a5a129c6350cf6b3c77e5925ea27d28ecb9fb29371240f070de21ee19f203af7103afcc34033cbc08d5ed04c78a7ec91c2201d78c88c5bf68db133875651e095ac62b38154dde6ff5e62bf7e2ae4075771a7196bc84a057894dfa10a848f3c97822e33699e792df17a83809f9aa024e4f8fd0b7ecd26e37c27d1469fd64e0dad3ffd17385aeb9ccdb9faf72c476f326f4c426b44e8043be889face9ee9bd69a4deffc7066877298ac8ad7cbec1636d1a98197bdf63506b45a5b8aef23ad6ee11788e9e34f539fd4dbc88e0fb28b029bf2a1eef4278f5a441769e0d6fc3616f5352eb62204f42cd228e154bdbe8a337539c15a206a4937bda59c5356c0731153b2d056a29b79f514d49dfab4da060aa4f3014dd2586d8075b9525720ba606a3f74a0f4b27b835d2c03c3399cb3cec4b20f74fc42d67fdf748c491a88ba0a85b6550f5d0b6c4b2d196b2d32d8b5e3107de1e9965d5e56bed7052046f3d117bf28adef0a4a9d47c6579b613ebddbe678df10ce9cf4ca435d243970f9cab92d718dce3c207d9f669322e65022eb9ed8684639c35d63d360567da7adbf889d169a2f4f3fd14012c42b4ccb2562b5369b0260b4304929d0ff4c8dce67567bfbc6d760fe2e1186c6e46e6fc96017c17e95974f84b8fc38ad3731a548161496def5eb91d14cf10a51a97b6203ca4e0bcd1cd430840e95b0ca2a2811f8debc0256ea693a20107e9c82084874182c75941596bb0f0f4efc674d21d8eec40eec07f5b0eaa76477f21cec9f6dd5c247cca15dfc16dfb882857f91eeb1246b49dfab0032e00b1243a09dedfb0dcd2fd543e696f952fde715c5cbc19ec5aa736f40996a06e3d174413fe61f6b9c106a8ca840b00c0663f52a47d0e8faa6543f83c0b51a5f3cc879b7e5363b4526b0c82dbb17b52835c13d15b1ed635a358148f4494c454b94b769c695284f1fb6aca02cc1c306813e8d955afe2c19a0c69748c1146609c919c9ecedc88cc140e704bb657a4aa61528cc7d9da56d497da922341bb37277fc762e24abad7c7635350b3aa84742447462488fbc4934e2e836771a148106ea416c072297356d71844adc0fe47bcd5d3d32dce2a672c7375ecd4f3092f7f0b48e50ae180221a264cbcafe8a5323de834fee426d77039585b0f1aacbb493280a35694eabf00489dbd653abc48c80b963d9f06b8c84a29d9de7db99ead1680ba42cea43e708b9fc9bd8e1b6a2f71ae0aa510f0f46c2ddd268652ef6b8cc3cf5d08e2dbab6627711a8f05c4edb72c0815b034d9dbd6088888d608671f60e4f0af18f82ea4e3be05717abac9fb52d2d07739e4191e2a69d4c841bb3669b678af9ba -1025577823730542cbca710419fcaee72cf93dc38096ed5fdbfafbf0ac43f26fc722d99fef326dbaba97a5997fdb60676a46257958f89dd1228c7f45d6c8cf8c54a673aacd28254d8524f16227131cc4b127576749bf4a63da1a491b8a43a0021c7e9d911f66356607c01c69ee1ff69415137a6ab27657d5bd647b5a17e2015c0f165a475386269379d60c790963c82c1b044815867aa1a1a6a8994e6c525176da66439e0ccfb21208def4408fc46de528ef9b875fc260acdc66f698f9a3801c28e46dba1e0899a520c90101f539aa62ff397531a7639f76868f632b56b9b315059a888d57a1d53c9a462d79947ec364335f3ca9598239150a6f8800b7184091c43c4dc66f3c20d03c36d2f1065b712b90c91659a85c0e6bad4535b85b02dce6f6c5f6638ab45910e88e2e9f1645405cac5360530cd965c043cc508efe4f0b576146a45f9e6c32c2d628581b92ef65c33980afc392bbeba65729b6c2e6081e058cd0bb4f2798762874d32ba5293167eb6dbf1582e34b83db053c902aed6e919e264ee89dda7d7a2799c7a7ee5974f2e1c04377820d2e7c7bdc1ed5e65d4d19e3b6b295e0fe8a6345bc04ff6ae844937414099b0fb7a039e3e5b6ec6d71ae97a222435beb0844a420c4234215e543bb608672ecbc7cd36e95ad63adcb2f0b551cd65eba2856b301be3f6a16f5190f8db38e830382b1f21f6fcd8c25f0a548452ac52766223996f6f006cf952ac2a83ad8f6924987a9b91cd8f458c63d00ba45cbb7d15af20b9d1a686bf0957eb57f0385c44fb1db692df652cd7ef1eb7ca8bc7a9aa82b7c4dcdc064dd2b2e7a2cdf9085cc3073f0ca08933915077e2110fbf44ef995aeed4e96960f713ed4283f50cb3e60ab79e6d22a76dfc91d0473e5ed1d2e97887c9a851654a0134b641918a7fa25139c0d88e97a3e9f43f596f820896f4cc298e608153769950b426e9fd41e804ca19712027ef67f72d1c62a0c086af6f528e518d5bb9e5fdb16123738dbae3b16caa038337c299ae7e9ae25287a3cd723cce95cfaa2b4a0a5c9d3d558fa9706083290271f11832c514fcb3e5abd4edc006b5c94a6c2e56f3fad7fe32651bf3b7acc0cbd3f19bfa6d06d812155793f2bd341ea75b61a393cffc2eafb687e4507962bcdbaf79633cd929e5a619547a1034734a7f56e8ccc5af25f1172cc8cb41b7be207215e8b557d394edcbecb58062ad1685472e0da4cd08ab990ea2361c4c73f2dc650fe9c03b97714c8aac4cd9957623bd564c8211b3919c2e9a9d8a910a2f01e232aa58c6b9b2fa000992f2661a32c8f1b52a3369f250ff571d1120f6edb0fc49a16dfec11e4e3b609f2f8f6883fc68a3e3b7bd9198bba2fdcc186bac432c47d1aca9db916f41e84dd12c4cc25ed1a9734eb2caac663ab4d893c28a9904b65f242be46c1bafa20c29f252bd4e01ef947548620889cfc748ee1f97e3691e7b2e73b50d1f510e86c7b4716b80bd49ab0099c840088f710aa1a95d71489e27b046088e1520352fb14e579d89c64ba4716aef0e3a00d015f7b294ff48a4f6e157d1ba803d4311e3ed2329cf411936babf16e3c0ab29c58fcbd137291bada2f5b9ecc1b566cdd4f5bd839bad5fb0aae874add53b1b095979202aa1cd4ae259c60efbf055893714433cad23bd3da89cc5626e3fda055f1d95583f705855ac443caec9a0a133fd8175ef451b172ca2ec13924d416498ab47c893c23c17a73a89549dc3c67b1e58b623abc09bdf60937f3ea6098954d5350408342b5cbdf8c5fb3c2d93360fcce243d532433a2e3e3ac652588df74e93fda2a6bbd1b150efb21fb32c79d4bda01c8330d8f6110858ca67c20c4e7157570a8975b1b4ebf3f2e9277fb8b0a92c19b33ff8f9239dfa40b5ebe3081dc56d3f5ccf925a240672ed63b272e2a3e450ebe5498376d8b94af1cc003eab6eefe20edfcf0f405826d8af894ad2925ab4bdc906db3886d30a99163f9798e8860daf01208f33beaf880574dd3b7a4e9c8bcd374a9c4d0db91138ec87bb64895dca7b861e15a96e15a0fd3b9c4832d8af6193c14dc91937781babcc16b5efbbbbde7f27f6d1372e046279aa951ff6c5a390be1d15869eb939f575913ea8828575e07f8a26352407f570440011f1279d93b03b974aa7442fdc4cbc5986f49428d84c2edd7635948ea65cbbf16319d093e1ea759bd7ebe1a423604663fbcb2a7b3e7915b25807dffb1c72d1f38c2cb8dff632ff4e9c7ef822221fd07ec0b1487811eefc610a52ebc97b8b714f18526ae8d1e1e01732788d37b57143bca0d31b529a125c305795dc861abd55475cc869d60c275da2358edae60d0a3c7b34b725fb5268a5f2bef20a35fa45879a862ca18a4f7831877022211bc937a33e1e932c391e0f0b004a3eb3e4790d3a4a034d58d4fbf3c111c48ab23ca8f9454b98978ab8cfab854c5259e4200ff602bd6d5193c22e1db012504d6b678c53d660c80a77db4c8aa41a298632fc61756c1395f971611112d5fc5dd27b2594fb0e76fbb82bcde07f4696702346e7628aacfa96fdcb1ea0c1b06c0c1fa83767e8d23c932079dbe8b9fe8318196a6bb1aaf0574c46bd52c11e71016288fc14b585a1204e51eccd8e4313e454ccfce90ee28750a1e829518a4eb9d71a580ac69a8ee310f5bd29b768685baf034e00d8179045f922828251770c308861580fdb4a14561db70b537f2e676f521783e870a9cdebcbd1bbd758c469d17c564c1e7a449bc386333971968cd04c5cb7e87193bc48222ba36422f80d3384163a82d3ae19f22cf30b6a107d43564f6768a6b6fb770492fa8b4b30169d4c0a4fda8b26d48c3dd3468304589d7f892ccf15e869f439439b739019ea370bad5097f0a7811d07f11c8041221fabbdbe81b345b769ec0b053b5daa2f93e00dd851fa57bb4b56c607d65c2724f326a71af8b03d7c9f91e93b6c22ea64ef7a25b5c0afa0dc672ceeaa6f088116a530a9e7e1e46e6f46cf286b8eb8fb2d1bad0f18c07cca6147ed8c8675ba347bf19301af1493c393200a9f9026bb979d0b1fa97d4496fa688a39ea9e6c011b322148f76050bd86f7ce3c96c43ebb1e24863dd9508bb102d54d227183a2f3993b209e63a49c78c5bd763f08b9075e44e7050b5b9ba2de5de6c028e948a949793cb1e7cd11f9cce6a256e1c357ba93b8133e948e0280598542c31814d77d095e6952eb7787e558f82c87979532f5da7e2c98cfa42e9b712b20961f709fc83f9004a3edbb3802c820bd1d6664ea4bf4ca100d5937641202835c103e26b0380deed3af983f1643578228c3a978509027a5eb325a1907ac00036ce25fbded920d29df22ec05f5f03c1a8bc6f66e4e14e2572b104275d935c241560028d5e2cf2d99d53db121461c0e3b8b52430369fb5390c9be56436005fd6865e7998a0956f1fc7c14382c33e084327e90c11e832498835ca6f0a47e2ec04dfe57bd9b8461f4e7fb6d571724be1236b50b3453d58b59c659c4fe7818a0b8c3d65a7ccd29a976ad8bcf5bc524c2609f2fb3d322d4791d7b22e9d9c180e214e3fa22a9c6dd23c84f43fa51bc157653a81dda351fd18689b7c67a7f37b12f1b4835e679672882bd6ef71d4e66d5b6c27372a89f1f470d0c9a45bfe67d2c41eb5588115b180da2cca69977367713bd30b9b911cd4a7e56568700abd3a85d5fa77fd6938fddc523552b16751b6706bda40db884fa3e0165df983f2d3ee608b21e590f1e9a650d2c58dc566db5d8db9cb03699a96f20c486f3ab1d9814c1762115327ab8a4e0d7cb23b05ddf115c724d1f60303ab5e1fd7eb482e1a2b51b7c80833f6e77fc6754c6b94b3b621c726d1d5d374e427b0c1ae8b7a98897744b73132dc55dc58c7c6df18e662003faf522b7fa527b3c69efea5b98a605274e5e4d07b800af70f9685ce28aaca7622e8e6ca6b6ee36f60d2c17bd238171b03d8c17fd6e5a7591ca969389afe05c747878d7588d34baa1adfe623c2691cb616cc0325c498f3e126e1db51ae7052d34016e427713ed06f4b82a4dacb68cae377dd69809539fa5b95de033eda9a6163f258ea4a545f8e30dd10c565617049e8b1708874600c6685ae92963ae3d5a8afc22a7ca07eaf5bf755322c717ceb895ae3560f422d86b9a6cd4066c6b78dc8faa83fcfd50403c5530d7be58f07bbe9fa2b3074d4bbdbef639ec408fcd8f976f6b6228bf2115392a15eff4916af525954d2b9b4a5fce9e1e5bf284380d7829c15c86a9927cb8a105d8e17e2c9b928c2ac81141ae5a32bff5883f9688d7c863d05c6e0fac111df1ca1c0c300e9600f563049092e7a6f1dcfeccee8b8873e9b1d97d83d07c821a1d273028644c961cedd23e61861accb3fb7aa1266282bcc85f6aeeffdc057cbd961757fa301c459d8aa155fcdbf58578582669675fe75a17a756f413fd22c20f8f522e02d2280006083c6d1861f5abe993a4b201046a0669912f7ec5ddbf7644f3e7bbd5f6b7ec5650458eb191b6c60db793e8a4e86f30aa9db83a5191da1be23affb4a7b7f82ad485e01b70e55f0e3b913f09e48052fb39ed09e78fbd6399590323c52175fa310f1ea2fdd1faa1514e485c6914d503c20189e1f97cfa7d00acdf86a22c9e88b5642185c26c0526558731ff50dd74f45c7bc6d532842199f989ee4de53a030fe47495d291d3885811cd428fcf0bb591a27c5ba6e9ae55c7c4aa1cf6bd1cff45a593db656ee4212973857592f1814b90587ab06606cc981baddddb793f6d70de712fbd15544943a110322582a438bd1e19c1f0aa216fabfd910765de3e4ea6dcf45680d4067261c7996ae64c72a8a2ac89ecb6322df92b59c905a0284b05c0b5fd1f962bb7f91a7f51411ff6b63899d43d95b6d9f590360062ebab889762c8de99f7c75bc664049c07b589fdea68044a6bc62bc9306063fe7c89eb0d0526899eceb88747ea06a010efd44743015a05d41419219407f18db6ecb08226984b4db4e01f773ade77429a70f7e1062cad26092ce290b617a28dde3e2b1346ecaa6a3e893b9a23adb30c1f5af4e6a0fe13317bf9a2739a84a7973873c5fe89d18e194f005f83311bbea4cfbdb44290dcf9a6f70a365f91cdd3400149b8b44cf0bc0b956f97737e2f0c9cd3ce4830af1e6a20e6297f97c6cf3427fcca0f3a16d5703c8fb637ea95ff0e95e4ab3eb008d7180c74e3226dfc8315ebe3cf825f9f3e8511ed33ecb000ea52d07ef99bae53641dc7788b28d23cea609bf7d73eb4b0b8450dcf3b477f721f91c283d19643473f1693caf9db86d7032bf1c81c064e8c059bb689d930931c7faca37024a6a2e6c45c33f315f8027cf5edac31d6e0b55184e65dce773dae8656da9fa41af6a4021d71d6f0e2613ce9222388aac423da06d7679b5741742cb3e838a9f0b969abff1f45223fa08e96e946039b2dd3cb7e26a52bc9e16eb1a985c7bf26b5c3c3fb83d8b51188da2973e6b5053c6659856f3ca695384dab589819f1fe66343950e0b4327fc6e9278dd47b4b2903fbbb5ea604dc735d4c7898e0e939365d0947e4b397f41c4d2a4fcb809c670e92d3cd8b78df8ef79cdf1e2f802610b788a1c6cab25265ea3b9b7c35c8945e350fe45ca49f89c2f093a4bde48083049d936696b49c82aa82b95a1f576e2174cf6736684a471e47bf5afc84bfc56affdd9933c554510eb4a6df41b8798938ea769f8c6d2d3458f2387eb67a577cc8d1cce3b64c6d1aa6c4131a6bcb8dfd75472c2af729d9119de4d40e1b840382b2c213ddc10aca0b36310fabaf74491f34f9c584e187f8970d1924e68e6d749a5d17703b459f353f29c923d4d86e3086c3e125a57f01722c0a44a531d91559dbf117b87ad6c6d65dd4cfa2b8998987291de3072c53e580db06513f7274e4d0b45ea0d28b0c3e15c08d90efe22aa864ba4f5e04aa5b5a8c4dea2ae46380d948b4bb18a4ad0695d6884056c59c0059b3aaa299962271064f46eb3ccd9d60384d62453e5ee4619d2d9456e0944b1c2569e4d4f2097b11fbd9b49802f0b1229937b99f8af76194912f8ccc189aecb3897c9e16a1d36d589481afa01eec21090b279098b3c0cf952525764cce9da5e1529fab9d90dc6d337b1c96918f7d17c3288a390cf6c7103c347ddce7b6717b802e54f42b04621a8d84d2bf0437489e44c0e6ad1362219b0f53acf4b7e00900b9edaff8c79c5c9345f619c4106da3567351f7753b3993f3057f332fb9138eb8502f22922a5566c1a226acc2d6851efed3d2fad9854c0d0ff4656c0e1bc379ec7ab2e9ec590319f27517fb085cef9661ff839bac1c35a5e7db9b69c3800011b7b6dc231a835547af7b548c59cdbe61231f7c35e2d30dc37faede49ec4c9d12d117acc583a586bbf35a9fb548f501fce2dc5b77568bbe67e863b8dbf28ca5e58b7860e174992a69f405235623523cf0cd737c25a891b772c2911396e443b8d418e5c3761cd4a3fa7fcb469878931736869508520a6f86de63d86aa211450aa49c0c85158e51100cedf366f66bcbb47ec7f53b1cd17ceca0dda63d1af2e94c545927e02c90ab09acdcbd9684b930a32cccd9afa398bf674902acd2669fae391c8f6f8c66bab60e76147a55612ae57308b1e93382ee708c66461f41f40f38bf1778fa1a92b81e2d9a84d99824ca023067a04eb1eb9709ae127db4b04684608ef8034e036df4b2cea8f773dbd2a2fcec07a7cdaf868269b0f344934a9ae71133bb7a9ec365779d09d6d03e156acb110204e5ee9e7b2b2312f71fe349ab44e73b77a3406a8fb768fc5dbe431b7767c1432dfd43d3d246b791443771d80aa15c8dd83212bf3f474fc7c9bded93215aebebd989716eb586e5854eedc2656fd0b590574b75078c068d528493631f63591baf15350c374de153c71d6cdfcf315f711ad88ee77ca4b2163f518e898eb177d14acf2394c4764917e3beb88434079055bc25bfefe0d85eea8c3e7b140dcec19edf8e05f06c00a96fff5f48e08f392852844eed9a681dd5a8b37fb8187dd19ca45292bc1c0f42491f9ca0328e7947581100974ccfff8d83ed19a8aae07b6d8 -1b7d81a087fb330fcb3fc85c8508796cca2d235b3dac0e93a95bb1ff57b6157a2a27fb559e89211b8151ba05aaada37868931284479d560740ea56502e20d8244ab6196d02ea6449f019374d189d44cc7909bb88bed4e679471dc069389654ea024557255ebc1784b21c0b62d65191327f78bf439749e3698a1186287e1ca7a8159b535a251ed57b5757885546c6e2fda4fae3a08d76aaf81aae6b83a4a958422434ad2d8617168c2ce252f0134453e7d50067101235c1385c47e4cf289ca440db02ab4f251135c0371847e555d291302d4f13c6c16e84dbc33967a15e6519e410c5d565a92a94a8ab4dff764bc0deac3c84dc910cedc32143efa9a37bbd52a1bb293cd3038c314709d24013ceaddca1b3726c5f660c51d977454d743a247eaadcedde5a61ca081658dc4dd4a62d5da15603839ac2a713409fcc9f81e0e76aabad741a843c0c1828baff28b1dddda33e283dac4ae3c13f40806ac2617deac466ddab9f948baa49f440e82a08955a544098cb089425f27bfa83b4f87c07344365c5e00aa49eb88ed3b2940e6ebe314202bdb1ba62ccce608e5df144a194c13b0ec7686d0bd954e60aab31cadceaab6646218c53db38d1843ccf72550068fe7b841974e84f498d8ddf81b13c2ca6e5df81580ae648189e6e6b0376aea04d3412c9c5fc894fd3fae5af9bedb94376b2a8bfde57f0d6af4644792cb6eaeb7a0bdce2c69e7a43253ff5397f4f9fee3f56be603ba2288307830af2d8da5c4342f04517db0bb36859676dfee6e1927e3643a9bbc74c9c1af296314b6f15ab5e140f8f2e21497ea0718841d18e227af3993493420c02faa60f40505d9421b03c117d94a27c71520cfff8c06b19717998e696dbcb0f424b99fbe91369e7bf9f79b63c30a141faf544ea765351f38b3bc8a5b89b8b4601780bb0a9b0ca7ddb817f04aa94e860d8e0eeceaa198f7c1a589fc3472f3f676ca541a7a4b2ae263d9b65de9fc90696606993a327d7898bb323adc769c0f018ec6b68d7d0b985c02536f4c10288909c3698504efe45c1929598b314f1c79d8abf6b063bdbd849044e68c263821421c521939f910354326b2d699c9f9e4d05d7beaef207b47722133666a209432eb176eb3e25bdfbae5ad0af8bc6bf2bc295e022b98da13e895d1d6a0063958d0e266abdcd4af6dd0472720eb5985e84de76fe4832c10eb0f52a6aa2e5a0a4e46845e81117f01f7b7099e24746e7981eb10ef1f862257f15f06e75973ab934c8e5782f2f9265ea00eb28db18300026731c8f11c76dde4d22433fc56c58ac2484444f4bfe0a44cdaf4f7ec694890ecd4da6d630f04d7c97db736afa90c84c9f61542d56ecbd4bd280993079b889ad63175a8ea4a05abca86944b0d47a8f9910c8435570a7da4b45e51a098156a69f225c0a404b88c5f3d39262d5c285ba89e7f98645d3b19a86be201dcc524b2cf997dcd1afacf6212c7ea9983901f8d79d01104b36c7b3b8cb7af4e86388c8ce05c3dd1c7be1241cee9294167dfb9959ab265b3eef7e42d7bc08c83b980a767175ef8c626760a523187cc6e2f7864079c4466d4c2cc072cb08f769c07db8b00ded909ae5e4fd85ea33007d2a18c813c514b76fc37e3f2e0c441c983d7e547522f3875d46ce76ce833676dae72c21bc4ae4471dc58d1febf01e3afc8d4b3836ce531826d200e27e506a6518aa7354bb51567eac3ff2cd981c972699b11e389a126bffbe7a8c6ddc9261ad7cb9a8284a5bb078777bb2575045151cfe55973ced116ab766ec02828ca9cc740636ffaa2b2a786cfae50418177c07b94118591e37caba9245d5e6d0a3e2c4448de622f69580b499ad0d33316673cf9218db03f8dadcc5e3dcfa31834dd2b114dba119471e524aaef4478d0d9bd06814e95ebff91c65dd6bdd642da0d206bcfde5f696f2880d63ad24163d145097f5c644d9bacbcc56bd0ec6ee29a7838f1fbf550cd84f339babd93916278e479318aa88aba81f9df7b5db55dd1c3be91768d04d7b0b19b0de4c86b16fd1f50bba90acfd6d87b712fd16c8b0c58f0a5c89adc3fa69c3a9ddab79423fa84c7a48dff204b601599afd92ef91b7159f3cf4a21e22f0554e9727f27e959a619b38a3fbcd31da2d0cf63ca44d8f35003dad879a9336a3206a7c093e4f542c65ca1cadf1757d444574d307b38297808270a8183b23651a445b9a7957aefc34328b0f7369c0d2ddbe1a597cb7b96cf9fd7f35557d882b7f1acfcd80533a42f66d1d885d312bb79be7d1c9153289f5689cf0c7e2de16d1c6fb0ae9f7c4e173d992775f6fccc359918cabc157ba2c09faf19f0221b14745ecfd6a8fc91f9489101e6d3860d09014e32c18782a45d5b6f571613ee786bfb47069e1fe80f31ddf7b7d3ce47161a40fb31a35fb3a025042dfa5d293b466af4257eb7902a700f84023e89ea1908488a2f2aca0d9bc6eaadcc58068c591876be0dc3d31e89b1a7c464c083a671031cdb042d0099f0e93fd196ba56296df4895ad6751ada453fccd7bfcfd5b809a585500f83133c67b7c3d1ee7ca2a042443f6f6c4f3293a020c9393f10530829f87df267b95bfd1164d1a6731792ca933993f4e17aead8f333026380c96bfb2ba279aafbd7abaea2f81f929cb33be334a42f6249ecb3e218d90b8cde303a9bf5bd990dcff36caea5d658d663cad3c2235700a62f8036838c18caa0bfab1a93a52ba4eaa8ee9c3341bbb5d73b39461ad94116d842578f10079f659f55e65d357c38ad90289813a4b85888bd894ca71e1c64e1301143e8474211cc8bfc586d6583587e0da00b61b39923ed426e87c8090cd27a74acc956b604bb35a50b8818a98bf135b55157d1fc0f456c7460a0e140183f5f9fee8397ade4913fc7c2eb4ee47dc5acab4dcb0aa6a7676a187699f89357e3c35d5f40c1d3fc08df6da03a166b146e99b66fb4ea3a45a1c2bc9fc2c8158c28e55fc313ba924d88766b7b10086e7e9e38b0e8f9a669ccd882ef5559426c3168e12c2739cc6534060a3637debe9bce7ae267625134b4044521b266c2e51f16c88821280d19b955e8087c80ccdf00bc3af4d5de15622fdb95a64ed1d0369d9519af01dc90c0b8f83986f9a731677000d841e05cc400bc8694c7749e2ac5a26b823982b5b38d44395b786c4c63a5064b18769a396e10a0e65ffa7fb032cccac4116bc76abec0588311f6b548b78d901e6568e83d4eb37a52a73ebc94534d66d998ade0a3674ea1dca443f315dce019119fa8bdbda9b4463b380655e27063c846ee179bf153eb18c9906fc86d596b712b63fea2610382b1756a8c2798bd89ef7432f2e43cfa9f0b5a6c5ba687262bbf42368c97a263463fc6c3e67b85cd9af7429a92be799a87a91e0eb7d39369ff4e763dfe80ab22b6931580939da6885d148261f3d37c0721a1cd7d81b7f66cdd41ac4c44072aa7d3a79076e0f0e5c56649d216fe2f7ba91e2ef1706322cd73755e2faadbd374addfa4b7903ff4e8399bd1266f7737de21a7b2578605cac9042945310f25c141ee38ac9257ff843ba364ce2f297180c4194695d1c2aecf421439538c7f0ca315a26d99487ef551527b0df9259f2b418a7249a5463a66c9716e9a8a3dc21f6b9e1dc3bee1f4efdb0f6340767addfabc8498b588126e2afe5717d1517ae4a5537d8198aa86795e2f09a36fdc94c1755b1f8f88d4cbe3bfd4b8273e08d56532457c3402869d473ff905ad2192ce65c7d97c559ae18c5c2fa5058c5d49fc798329ea507a65380e2d0a339df78a9c99ba69565ef199f584b325f6e3cb3770c281a3a04097ab57b088732531bde148aede1d8c2bc53abe5b611a1b914c2112e4b0063feebb82b125372bcb70b06dcd7a133b1c9d2324d4829ce4e3c7de87fd83e0002a0a68986bbdf433b4a47c6c031016f58fc728ac57ea2ad3e86bb3cc389eddfa61c7644ec62783b243c91b29c710d7526b5c011410bfcbbcdb801c6decf569b3dcbcb4b4cd64ab336c32b1a8d8b855d7c9ec321d8350e205cece2f8761ca0649083b6d56c80ca4680d31f46c41d520048322e3b08d8ce304e6cb909e17de15bed7c241f9fefe8e24f3d9501d76cc2a1d1bbacee15153e3efe0d29d5d2032312f8996aca7f2bf2c08249fee9c6f9b1acb138e7117e7afa8a05b2c9f3bdb0e70c46175b71d16deb1aa459cdd9263931be2ad9146a7b5f6f780edb0067f2feec9045e3474396c2ed841524eff2ad16c4810f2b744b620b527be11c3a81d3cc41e694d684ba496d2fc12a3956e3b34771a1e5179bb9345e8849c4e013497d11b74b3ab5734e7774b189793cc3758f5d60d463e7d3eb5c664fa1e9bde2636caa57c5fd9101ea3345a2bf182bba4e56925ccefc4f0342235c1274f157024ec2e698696791f9ba85b6edd21e8be6a233ed1d73653292ab621d5a3c9a22902cc34549fb37dfa935af3419a7baa6910b41d012742321576954de6876687c8593aaaf90d39683226a5e9f814c82ef14d6a87bbacfc019b4409b2a398506dd54583013213bb53b995a0d1cd2abc88b4e2b1a31555a7f9bb3e986cb42641e6a0f7ee5f11b4c84ef72f0a5bd1ecb16e31de290d04d065be3fddb13f0392c3bf497de9c89df089cbc76c33352b363f9ccd90d17c11b82d9ab105f5b3ddb070e6b1f2b1d321f2a105b540a76434576b7e0b351eaa941b2697aee0fc660aa2cc779633cec4f348ba125b5e7844b7d11c3a10351d1f867d1de731d4ac17df411604f8bb0efa3418421876716addcc700add9b3dfd9dc30e7dfef03640e23421eaf75a8fd99d4b7864c92c3f8696d16b3a20faa109e38af73a0c58a70ddac77e315b1cdadd6c9b9e785982ecc8b540dc6f53f5d693486f0713cdd5c8b25f44d76772033a1184d17fa138dbb820373e01558c2008d22d1ea543ad6c66e9d4c44ce87ed92ecfd5dd744b92c04d8b585ca7b0e84156210013c71e907994b81670ffb83a24366e91fc9d75591d0a3f612f4daf5b751122cfdf734b30162a849eaab3c0821e410dd7558631aa3b1e8e70dd2087e538a2775c5535d088b6017b527759489a76ab476597de506ed2398c249306b163f68f30bd79e4c46846ff000153567242c552568af1722a5b2c04dfb203d211c974bab2260c6606a42570b1e034d3edb79ca05d292cfc198a170d4185414d75fe4dd6041d08f6357e56fb07363f3a158a73dd8dae8d5e53bbf2b9a84fea29a8a8bfbfbc81a36b6c686599f35036d7e553559fdb9b6d9e53c9582a3ccbbaa168602cf498120eaf5e05e3f0942c82f291d8bd253388ae6d16f0eac0ba128bf0d8e1ebf0b464a603e9c737355be5799231c08807762138ad21a3a2b8a0928e6a0c9919ff4ca676f26b7d3dea12e3d7fa54aad39d27d7f7ffcad36768c8f300961937d888b682427fba7e6d5085daae4b04f8eb9e30a3204ce5b4cfc638adda0696a1ca51a78b2020b893591e5b2c3e54a173be8640ad02a172b0850ea42fb5d99013e583d386e4b466f94de35bd8aa1c3bde476d46e0ba3fb8180f37045edf6a359daacf4740f6b07b7f8fe685c4764faf1c5d3c64b083a7422bac466a673275af31190a591210fc6fd3c28283f0154aaef1ee9d9f922fc5d20b711fae61e9b912fed677cf5d003f6445d3348167e6f904721104baea3dd04d5e1fd4a3d5cad9294b21aa3baeeb22fbbe9f2b87e5be06453bfd9cea4d4fd14db7d8b5cb580991203b3b7c008f414085b62b72b510a4ead9c00cc9fe01e86c4889640299d50c41a37209881a1d7b4bbe95b2932c4a0412a047e8de2830559ac51635ab0529f796279e1511e7b9d09071f23f5686f0da6b835b75d75eeee99bf649a2a90eb95cae5e70550d7607f6e6fdbd758d26f9d9e2f721eb118c476d1784da5afd87ffe7ccc787cf9a8d9e22852780836b391cd0544f42c419ca21cdd2010439a9b017c4f4535625ee083e32c1008f703b821fe43efc228c16cb8f32a777748cb1a41c353de6b70ec1f52f247eb31ff7a842f97952256d81cb3f7e19a4a6fee074aacd6882426a8582ec0df29412c0269d1a205edce004e6e80d2a0b7988dff186fc7ccb880a31df6dcc4f8f8d53192266a75f2997f89afa2d7e19f321c581776ad471d412285ef7f108add6ce0d61c0e80d2d75cfc64059129bfdaa8b0d15fee0a40909db8075e4efc1a29c87362cf321fa0c0f659a5a5d7c4683d46aa0ca621f5862b105e2b8a6ba817ea249e16f4766a5eb240a0cb6bf8cea64a64143266c251549432b19883b10b37492a3a5306b55376cdb8d1533fadba084e8ce9618bb09992ab6caa8881b0d406ef8a55295ace42127e5f6db0cb4a47a5fea755a5a2d10210624c2d24eb0dfaa3314a1ff72bf17a71e7f31c97ddec4a11d67611461271f496519e7bbc2ea1ddd6b7ac7b83c5d9483375700a971fbcd5bd8663472dbd842b5763cc35d3c7ab02c4c80967b1a5e8b571388647f7704c8696b9064055c6e34c0e7f508810c3113a0fad208cf94ec7f9552bc10bb77c7746e70fa23df9a09fd2747ae331c8af6689a7932c765fd767d36e99573a9a127e1ad95ba9eda3c91da8840bfbed2fd7a3afc382a25333d0fffebc29e94110f96cea465835ce65b337a6e8b7b1d5610d84b5f61d65f8154b70ca72b5debbbd8307a3300409d2648420f672a416e5b93d95b00cd0984b8a4939f4050bb04874e3776376fe9f20b6916f6a68871c39df39487fcbdf016018817037cb045d338a0de1344dff2e0670b74745e61cfdb2574a9841fdcee3f101cb5f5a09ee48f7955ff3fcf3887203a17a520928d973d6422495799433a5d8884c509c37bbe671f6135499d810bcdf1123ae1b4f3e09dc517d38908fd1376c960799654e43481d9d8a5e461e0571ea20886132e4420f3c932abd04dfcf7be94f8355dabe34ae9b5db4cc72411c3c1d8cab5d402dacbd64489b873e7fff9c6a66520c615a6c03b7a999e803251eda70cdb7ee085836f8a5cb1826c73eeefe0f16c81f25d4696b4a887f03ff8d0fec91fd39fe276678d10c5d10bb2d9d4e76b6620efafa809879fa961c88e4743b127b -3210bef566bdb494788e2393f2c177c8920b4f4420e03ca6798153e0bf14cb84ec921e6b853814c7278fdd142f6600cb0f73b0550b62aee42c5657b77000199ffcbf5c77494ec55e1fd95b397a94acc1fcde967b99e3d7dd60770343a5a2e3c9b4a3344f01079f874bf3e353657ce19d70bc56581b09d72e85c0577d2ea8843b1b5ac4894dc13c047cce11a3f87a246c0a8e13accb2f08bf29d90a4fa15721149db25a35609c6c07a2bd35e5b89cbe26b7e67d78bb59c4687b72960c33b6b28735238904e680e983851c96559b8740cbb9ce0f66ef2c22f324e95efa5f2a484c48ac799910c799dab98ee25913ad2a07740f78c8ce97cab9a0e0e2ec0a02a48d966ed5dec566dac051b412208575d74af99fe03b5bcfaf85ec4ac329b7893b276fadf71d9861d329a5b400fc604bd7382674734e1e54522f82e9f18f47e01c3f2afbf3ba5d9c9cb4d2dd5975ad47e984e4ae57256912a9cdd3ee9989f62a9cfc2a2de1aab7a8209c1b05dc5f45e87e5e1d76657900bc5b79e090ba4ed2216d3ba0a8aeda2f5fa15b71a345b9781196c85f6c27dadad883f51d7f86d64d793c7d15394b6ac87acb7c0c04e52030bd7341c6bd094cb6fdee4f5df16bcf39b89d758e5b1be88bad403b168a1d6925fa608f26e2d1e838754c2dc7ef098645326a3c7c17f05209b72b0afd485f0910709919c30fb2d5ac14560486ef7922dfe0f3d71f66a0eb0208c03a67a50bc07b64b86cf8003aed9638b367cba6626c3756caa217397b4bfaabfb42c29a591c3a3c8839e49020db1719fc46097ea462ce480586bf55eb91894b1df1ce5e2e1b0e9f621cc5e50c1f55f4df14a80351405eee2b9a00b888c888587f54277a160a8f4479a0c5b5d63971edc2826e766bdb4eedec181806b70fa6297a8a970c26c5ed8b648fc04529a86aaffa6813c37c046a1b836e1040ed867c8c780e15cd11d25ea07501eb51d14e502c9fdcdc70502583d41007a227805b45633972a3bd91af4c451497dc537ee08adc92fecdfc1807b3f65e8bac1f33b68ea7b9f836a27a7bfad9d9000108b53b4285c7abff484cb2db692ccb0aebff520a48886470bc0f5d7c292e6dec20d46e74b39117e44cf74a93890998259d92fa045b9d274cc2f1dea275cba4a9ca85cf59014bccfedca8311d658bdb3bbf2b4722a5964a0ac583c40db60119a6271518ba32cce83f04b807af8298740b6ac9b2a8e6f126e564f7c3fa0f45089226d8310f543c49eac84da56c35a5e0975dc3796ee5c5c89ff3bc7f1ca605a58cea3a42ee2155ef1d0da1f2320c06438ceeca998a99b8534dcdde36c66d555d19a73cca5ea6f9ee7a8b0d724f3979d535ec81d552a620ee5f513705c50f4709e07680f55bb52f95e5a1dca1e83e1ca4929fb54a134b047903bde08c1a2c9574b159490e17aedcd6ae86a483ebeb3d7a0615f85526fee59381e6e2fd1cc226f7c66fc0ca9f0606dbaf92cada9d8615788b813e25175af4e5b07c9d7366587c0360e8ef68b1c5d7d83c355e239e3c4d1cd7394508356454aa9a8628b1aa4c039b3a72af453ffcab7ff1f0bca1d1f72e6d0168268b75b2988f8c11a220e03cf05a2a6b9f395be58aef7b9e4e8a9b5d2a90bd66386f5dc7ebc613654f2effcf6e6b7a98cb6613236764f672f045f74f266977c6113a29038b1a5fc3fa4f250c6ebfcde8709bd6be1a11ea26119857b7ed23dd89a7abd50104bf72e62125fba76560a5439c6873554192004bd6a0e9058cc086040a82e3593d2027eb4ac4c6fa981e14b74c7c47008f5da1753e5fac89f410f028beaa4c64d1391d7e0c9cb92749a8122771089458668a88d34c3a98b2c29567490b0f0017422ca50bdc90233e46a5f2d050a9053803bfffdd579e1942c5612078aef1eb6dd2549952fef61318888f2dce77f0ea1ec1ce7f9e86124d284f03ab8e01c8009879945745bc2071ff8756819dc7f3de77cac02ea81b99a093286661ceefd005094cc6a43968ff34f77df86fa7970b1054180f7b5ce12b301e2ddf2e7565ed665e7f2dff667ba89f59fb1c0fa8be80d9b613a67feeae936147293046be12d8a2351ae9cd0d38c02a36f1018fb8b957d1ccd12466e2d29f4a339acb88b04daa5061f10fa4400fc01f5e700cfc57c7bb8451732c0c12de5f7857e3a9a71461e55ab2a7fe4ab9607eb9edfa67fb7a7506d89341cc46ad8f816c2d5ff8323aa83920302a668e417463c566818555416c80133f10392504a2761c616853a0da4921688bb2c87f6d81051c48ce6abae2a3294963265f3b339079652f986ddd6134c3cc5bdc0e91853de84297f5dad9fdea32f291f1b83077df25b03c899e8265fd0a8edf5afe669f58e5ecca2560e4e48ce3872dc7392ad24192c1d68a181a063f52c864be653f8d42b77bc6bc3706cb506acb77c53b6f8b6c5ce47f16a1513d68bf98104e2ace80a06961f034507b715e69a50c5cdf25c937ebd9932b90cd743d39516663018814c8307524e078aa3f366c9054d8c248b5baa228ded524e618ea56e867c5520d7031d3a50cde46aa8cde794e9f138e6e0b9d4649ce66b500fce187c156b982a416549faea3a320cff6b8372674331e4b552792d1f1f9364312fcea8adfe22daa3651ebdaf4739f2f1d419bfaf3fdabc5a6488aa5d87ce73bd1871a4a331db837dd673d8b785dcbe58b490a5f323d94373db8421be68fc92cbb72a3fa1bc797643ce1804a525751f5822d9d4cc547a66fd4dc82cbbc73fae317ca4b6cf92746cfc881b9da6368f38b35f764c827112080c187abaa69e13e81c0f85ed44d6e894f461bfba85a7fd35c220618705e0f143e3827d3e4747a9deadc66d777b68bc35dd4b81c7c4c9773b656983ba34fc7a06739f1b1ab393d945648fe7b6518f94115abee47e3c1c2486d3e2dcb184d93e5e53a032a9c94e20ad8d9cfbf43665ddfbe476d88758e021139561298c9d0dcef8c45404b65488dccd8c171c3b62a5289e830b3db0c1a5eacc0ddeaec77562c31472e5323b86628e4b2b2b74927d70e677de1d0d75596de71193fcc44146b1d0163c0bb93685254cd0d65ea380693167f02d2e46de4f1ed62396df11948fd2caca6d0b4003317911b0c94e10ce0b5cf2cea0ca6036a7b8f98e2ebc06f7c2924bd0862e01dd4b0f1234cd7b11a6c8e696ed94af28e04e0bd1800e120a3fbe7f678b244b10a41db777684a38fa210e2e9bbeda8e63c465080728dbf4f6a63be633c93f52fff67894cb65a4a791102bc5e35fa1788b625095ff01280ec795a5f8b39b015ab4c163f4a0c30c5a0cb050bfc15cdd0ee62776d37656559b1139eebab46fea63ca8da17bc229b79fd6cff3fa03555f71a70190cd88c4020099a3f4599bf2d934efc1a47707f0405b3bbf907ee7068ee3ac2d86eb1510cdf1948f7ff15aa2267cc836ff2d712ff03e318a986b64881a1650c75f4b00999f4d015eb18872c38469345034e5069e7ea6e035a9451827106f1f52d0b46df372ac5aa7e2be22f6235c9a0679849a2de7ae7eea0f679c631dca24ff18d2f85e5bf2455f91fb9848ea616191b1d05102c3cf88820c1f899b70f61f342012d46b1b176bfc03a8ca29a5037cbe6765881021f93ebd074df77db35c1ba702c901e687782e97ece4bf581ae2c78b398da4b7071a42ae680e06668ead18b6a63dfeec6d672cfa1a28589d85f25eb5e64282c644886da9331816731738596e1ba7554af5aefad9c04344d8913b6ef7b15cab108c3a328eb48cbe7f560ba462fd6a6631bde94cb9b065446f779eb11231c26768d6e5f9d0b8e8e017bbc45a26d01210f3700c52465cefeddab204de6e7cd163f8320d8fac779bea888a892a8532f422a57a321953f7cb2d5a385f3bc092a227e3e766bd132fd16ecc41b8fb6a3e3a4e2afaabf8a91e404877315dd5fe2283a922efa80e3b725e83afc204dec5d0ec435c44f010afd73cf1d0f30e9361bab13cc8704554a70637b6edb691a26e042407841beaecda9043bb79bbb8feefb5435f2a616d231babcf110c607a471dd491d424ef596489fdab7b309d05e8776b1da48b590c75d3eb538b62bf2f09300963f865b347d1e45fb0393a1e0d6ed534bd47e5f6887e901cbe833b0dd0883e79374ccb2805035ef62eda9ae08d88e163aa7ac04962efa16e9e4fbc9e82d291995140d6c492db80d530634e9ccb2f9abe8162b675cf231fafba8d2ce7a46a784f4ae4103a92bc904c5b1f428ffbb88a7b215919924a47b3339b9b8ec28bfa9e44a201d480f4d026968fda8ce6218b227af64debd9998d46ccc67c052c8acbd3cade46fb25901889313bb94015899b811c636e2c12793ff1906e9726f3d1753abcc21cbc3a0c6b027abf93080e21b1fe02e3e4011d949388e7fba2d8cbf56d3014bd912d50c2b176cea78436b70940800deffab237322284119686a9721c1a7a9747f9258e63818e8a90d173c6c6d8650356012c2fd9743a1910608ced425bfbc3f6378c40a95bc2f6dbad98f71707487d8228e7f04cddad493e426200f2dacb65557c04a4337a59c889d2e02de1b7baf4670a99581a92a1dba82c926778df9c898824d1f3732a96404918504b3f1f02cb4ac4c715708497c16c9671d1b8886e9a2ae2fc40f53b2df5d5fc8318d4fc49af8b9be49e64ca8329776688745b6582b315da0fba24c554cc5354bda0cbc1d17db5510f4dc7f1a5758050217d1aaa2bd3712b1da47429ad8ce1525e43da0e2c751e5f9b58779c1653b1c6fc502f4e881db116713a6a4922d98fd17064a7a67b84a8b8343b492f8ee3510e15024e21a3bd89044cc94a8d62f7cdaffc81c3d2680d6e8a6f725e5d9a247c1222ad2726bf455a274bbae1a7969957b9a9abb3aaba84351169462541c2a2876dd8950bfb6d2bc3a2ba69c708b7a5333cf787b1cbaf5dcc8662f7e3e6b9dde5a1d40cefa1813b0af73c4fb92b36a1fb971a068c26592ba5e872afc766e12909d1c4f49a1aeef57eb5967fe1318c259c4bbd5b5bdb5b3fdb70067ea5332b3250fe83da9a34f3549cb2bf7781a42951272801e80268b88674d9271ad7de96d546f715243d0feb3678efc0cf5563e50edcc7b3d969e9a0bbece2c49a2b85164fca695496648268b1787c610f3270898fa61e60f98c07643f63b7d138c27d6c663006551f9b6087de9286039096360317842bcc0b651dfeb6fdfe7df18b9aac11107c5fce023d92bc54d1c892e6ef5a7d389831422d97144318df1b36f7fd51ce7a4496048505f4d9964b3dea4941b39ce7547a0ae72d8ace54ad3fce2ea5dcd5d919ea439c7cc6ff338e2017bf087e2dc5be964933c2134af912ba96b5fd93043b974fd14671b86eda3e3d99370c672d2f1e89372a82201075ea2dabc431f40f6e54590583a941e7b01a90a8c687ac3c0b73c3d6f41f9c5fcd0c713efd29d25a8f52cbab555082487096bc3e6a05badfa3cd9314fab31f84fc4c7fda11978c0d8efe92e38678b6ce3791921ee473b4c7546b67d71e3a099c97ef44fd9a60b0b1c9af989fc775feb8f834a5f55400afff10649ad4c9b8eb8e1bd69763589b70044749cb0bf289e1c3130bada8091dd80d860a667088c5a29a807e399123c08ef46ab65bf6205ca2e1dc3f38ac697b89cd2c799980672952893f137a259f8bdf6d7ea00d12f64baa6762dcd16a2a7d958eaa95141dfde45315c8eb35f57d0eeb39605d4a7b8b6568ea5d1bebc736c7456468b8aa78f5a4d8ce524dd70cfb60a888b2dc7acde5aeed14cc0a45e8c4f4ef126cf7fa2803292a2e11dc07b15093d22c9309eb99d186fcc6aafc9829a447a51da3429c4b5d56de793929b757a2ccd003600d7a1cd22a6479dd85d8c68d566ce593cc739634c63d2ababd57fd0366a39579ca916b09389b6a1b979fa703fe8ba2565bb3c3b11628c045762535a8fef9e510327bfb00dfbb748d49a3a53a52a78301af6d986497c3dbe355f246e69f3c525df8c915c506d170184fd960cb6df775887e3220b5b3a3906d59185def6b885e4f6c50f860274235c3d645c00f10fe1a397d1d062747f033de3c1c77bd354f8acc5b1f49b31803e9be3155e091848e9275d90208b531405e576deb8a6f68b19682e842b1468c7f1600dae999ddb5accb51d6f2c6d8d039d153173d332b16b771551622b58de71da77837932caba6009617812b0b58803750c4a059c9a62a0ba4847167bd2fabd82c58c37d4e571c8def546d7d7047e53e66151a9458178b1bdee5b7adc749c628aa1bd78b2349f0b8537420cb9c44929ea961bd372ea128b0163ff0eeca150b3e9d6e2705f17cec55fbd402368f38d0771e64d03922d1d0c4e64897313ff9c391ca4d937d544a118eb6294ed7e1c546c3666d8e94e86b2c56cb865177a45c7c04e945c697e7311f5898bc8751302bd796dd8dff0301710e82f63d9a741ab651136f4468eb8a78de65e196d019263d605956813361862ac20439ffb1dbfe40c0934d3c3cd9e4a2609177d352556e3fab0a646417bdc19e796360da0987a1ab7d8a88cc2c56c5cd487065dfc61a8f8e275b5ef23d1ef57d8f8f764f65d6e80b2f91a72a425d4c9aed93ceae372106e709cc43c70c0db694dfbbecbbc0767e1278ee599832bc886e39b9b144a7c4eefff0ce7e224a382de52cb3902381793cd519f306424281dae6bf795c1b2822c88d5623f79641a7a22af2b912c075076762850138d49305d6b3270bb9262ff8b9a47e74d4ce05fb42d725fac3b67f0b058db52c9f4def04cc292565af40980fe7dfc2f8587fd1d75044f8adcf8e0e8b142363f5bf3bce21e66bb5d0d3e2a1523261390a13710f13c259bf5242baf25a84b23612a880eb847da832a35fff320987bc775921d24e952133635a156139aee630042dca5ad1b4f630fc1f225ce6e726f94144d3701b22166365dfb4d47d73e4b29bcddeac830c5391e40df56a5778fa664155529e0b7667fa007a41b82b58f990c73296197ce603d3f840894b000000000095b705000000000079d586a4493910d3badd9689a081d6e810ad418dccb56494d5c14460d4893f88b -8654f8385139c01b198242f8fa23b5c7b1806114ad7ba5d65ef71ee66143d60770df60d9a54b1536aa67488cd471cfd6a09eeac061da9e85a106e6b041881cc4a5c020000000000000000000000000000000000000000000000000000000000ecef3cbbdb84cdf004d2638f2b644d355544fa18aba30c48f8b6396e770919d48d38d1863bc3e3009228f49eb91a69b72a8400f3ece13ed0ac56902f2ba8be8ea35fff320987bc775921d24e952133635a156139aee630042dca5ad1b4f630fc1f225ce6e726f94144d3701b22166365dfb4d47d73e4b29bcddeac830c5391e40df56a5778fa664155529e0b7667fa007a41b82b58f990c73296197ce603d3f8fffffffffffffff7fffffffdfffffffffffffffffffffffffff7ffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808fd644cb30a5f62dfd042cab8a48c23d314a775f8df5161911024253713d248c301a820305aa8d42bd3bfd864ee48c14ca94ce1f738f8cd5529b2d47b7d02f3c6a912b9f7c428e03296e7679d40b994b5aceb635dc9bdeb1bf3ab54928955c9b894b0000000000 -` -) - -func decodeTestResponses(data string, result cltypes.ObjectSSZ, prefixBytes uint8) { - msg, err := hex.DecodeString(data) - if err != nil { - fmt.Printf("unable to decode string into byte slice: %v", err) - return - } - fmt.Printf("Hex Packet: %x\n", msg) - - // Get the size of the object. - ln := result.SizeSSZ() - fmt.Printf("size: %d, length of string: %d\n", ln, len(msg)) - - // Read first six bytes. - r := bytes.NewReader(msg) - r.Read(make([]byte, prefixBytes)) - - // Now we can construct the snappy reader. - sr := snappy.NewReader(r) - decompressed := make([]byte, ln) - - // Do the snappy decompression. - if _, err := io.ReadFull(sr, decompressed); err != nil { - fmt.Printf("unable to decompress data: %v\n", err) - return - } - - // Unmarshal into our result object. - err = result.UnmarshalSSZ(decompressed) - if err != nil { - fmt.Printf("unable to unmarshall data: %v\n", err) - return - } - fmt.Printf("decoded object: %+v\n", result) -} - -func main() { - decodeTestResponses(metadataV1Response, &cltypes.MetadataV1{}, 1) - decodeTestResponses(metadataV2Response, &cltypes.MetadataV2{}, 1) // Doesn't work. - decodeTestResponses(finalityUpdateResponse, &cltypes.LightClientFinalityUpdate{}, 6) - decodeTestResponses(optimisticUpdateResponse, &cltypes.LightClientOptimisticUpdate{}, 6) - decodeTestResponses(strings.ReplaceAll(lightClientUpdate, "\n", ""), &cltypes.LightClientUpdate{}, 7) -}