安全研究
CVE-2020-10770 Keycloak SSRF:一个 OIDC 参数暴露内部服务器
Thinking
2020-11-18
3 分钟阅读
研究档案
#漏洞分析#代码审计#横向移动
仅仅一个 OIDC 参数——request_uri——就足以把 Keycloak 变成代理。在没有任何有效校验的情况下,攻击者控制的任何 URL 都会变成 Keycloak 替他发出的请求。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9277684cf8d2d680cc05eab1af7ad131d7fda220adcc63c44ddf8b024ab82e0980ce9aa48b5196f0fae7c93f2a3da7c8d52cb9d59b72e9ca00f4aaa25a8a29cdb5b91a07004eded486a2c741fe51b6f5f0e764a131422ff58af422bd01d99ffac14c92d9cc27dbe5b98c9e1bb9eac9415ff9e8f3e8f11324eba7bdf0f2345e9d66e4b028de379ac6e7746aa11e0481e480211e67e13470594c93c49ed71acfde74bb4d62d0fab31d6e632e5cdb3107a75183eb8bec8c1bce0067509f2e6194d7396c3b915b25f08a319fbbf7f579d732971e223b229e491a21a148719e0b06c6d52a3e47b47cd1c1ba96de81bd946883d63b0c65ca956ad0754243c267f112d1f3f5660a496dbb33491b90641b9b1ab4489a4622166ec9b2ff161a49fe060423979fbed2c0a9097c85dde210cbde89e424f4e65c4d529ccbbec3825e19f0995670a19ec9893635652adf1b393611837717329cf88a7101df235d4a0eb59385e763f34b28fab64817ced04f6fd1038dc9d527929dd16224e92fb061ebd89bd660e0044f0cbc5d4af8bb650cd209e592158cf13edef282723baa587aebfdd4f626d80393d9195bd2bda1ec1e65c8618c3f88703d7dd5837f8dc3fbae8da976c7c2aa450f43ac1b0525040ffb7748c2f440711cd48feacbe4873770fbf655170b3bc63e4685d814a1d03ec16035cf57f7bc643bcb1f89580c18baab0c1371c4df01d03c2e77debc909fa6617ff8c0486897a8b3aff5f3327457fa26e586e16cf0f5100751e4a9b2c13475b8339774bc4fd5a90c270b5241ca53ce7e1816756630c228a7e3f070b36e8dfb4a44c6fe7fe9ba7682969443edee024565bb70767ded139261fee2dfcbfbcd005d97498dbeca9b401a63ba5587ee33f41c674c54a4d210a5ae7cc3933438712f896943ceecddb45a8d149395c22dc58576134e785c55f14344c0a9a14083d51116a1fe684f3d14b7a0c0ddb6a2ed28cb563e3d92325d68bd4519decbb3fc133f876a47f6f7ef0351b8f30a3d1e8a7edb31d5792a35aa5d47914b2f33d5a03d8e3a30f929b9a45b0b5f2786e35f578fa73c3b8a733992325f9bcdf51c88ad026d65f16fe92d55e637c205ef8b8ceba2112d0401996358395fac0d851b11d718d9893b796d04f5b86be41717c6018f0d9cdeeeb32604af2b0afac212684cad682b4ebc2f6e6f8dcded7925dcd157894a2787603f009da06d8ff29b4ad7b96533d77623fe4d5870f7356e5dbcf7f5b09c2495523aa18cb6e7e7b59473b638af11e4a8e70e8642037434888f5fd145e0bd34fc35a1fd666b070c2d39dc3a22c0f14c97d98e5d13b690670a1bada117e03eb7e7db401c147963342aa48200a30b0c85426f79d2ca6df446a5f7522a42c90d3a75292d8b3451faafb5565097e307b9ac08c2572891702ecff2959a0efea13ba7ff76021e9e10c689629372885280d7debc2d47d10d79515fc8981b6f4a4ba7417d120d54c22b9c67106a5fc48b96eb6dee7efbd293225dadc8feee94801808085f05406ed9bcace1a9605509bf13288eeb56b3052d048776eae7f58b77d0ec25d9b68109306b54fc5e1084c578055794c7c2bea8f5d98d29a3367a09944658eee7e8901d3e85d78f46989391c294d9f9023c724d554428859d845f031a8de85796dd58fbde6ffe4f47fdea561c062b323ff3536b8acfa64402d73879288ecd035b39fe45d20f82057d2911a543559e7f7b1b04231f48298f5290db1926bd1bf705e72977385d10258b11f80563af904fbbe7c8665045659d2f5ce51a92b57580e6a1b62ceae002d29e02565583821bbbae7047c647769d752986212e95ca3ba16144501ee69cfd2c64789cb3964cd90d8d57f9c6b891f4e14193d67c6c21a71d0cd321fc6cdd32cf55d5734a54e7842c903e8329e13603b9c6223b188d2fc52de8c0b1f0ff2a6d1afa280739e20d97fd160798ca00e8a927a20aae6887c7f436ae1197f1f026b7c96b45f97b4c08796a882940b32f4c48ad51f623ea173f9f2b2f70cdc863a04b4ac40fee1caf610968bc18f736d2b0de1ceb6963a0a88a93f3f1f4c0e920cbf89a0118224d83e499234c19a82426d8f06d77b88fcce5071926d4c7760c9099bb81283cbf00adc90b16e9fcf33346516f7fa2c4b190a0c2c75cee855aff2affb56af1ea60c1d3471d22fd492f30187ad5e4dcf9c83f5945341bb270ab4e5317e8e9d90ae06c6c7b009a167578d80fedbf0e272762007f5f93ffdf338822ba8bd9ddb728a3c4f84e62aa211a0332baf69fd6a719a90f7b4d54a7080af12697ab4111f7cf7fc59514c2cf381ff40d7193f133afc7c7a448273bc452e4939e6f2b14a6d4c2c690180770c9ca0866a8cd90b9b7fd0c88404887ea07b1643c776e58f32324e92d5d029bb4151793c748a72ba79600b9e26130202f9588e213f6cbb83b042bd4e4e73b34b644d39e9b70d7cc76e2c9e711c64d2a1cae9da33509746ce0ef46284d5dc9d7bb85cc3c43452bb12ede5ae24d6b94d32859cf56f13e7a132cacdcdda140901e505985b66d37b030d293262a1d2e9d86ce2b67b3d8f61f85c0f8f867766930693a728565ed49c475c6604bcd127a6057d82b9eafd2b23a42bc502b368c5ad66bf3e6ba9533b45352481f87c8e3264b6beca8eaeab5ebeb9f6a52528eda0f9372e6e7c53fce443dd5606e31dd01aed749594b4c0cc23b3da26588c073de3d43c6505b8242e36b27c06e78b9f8a368aa16eaf36886d219ed6ef56416e316f7f81e874f0819f03d9e96cf084d3e37668a9a49343f2c0158a375ae561a61e6fa22df8df950ba3b61695cdb3709475366d8c34ee1b3fcba9a03c4526a640891c92389f21999b5e99a9512e9d242a3d90f38b03f3971281e2093fe915729c134596adc05b2921b4ffef01891257abbd1a5ec1deb6f5b094566d0840cfdec4aa47aeae2de143d64f99ef590a627fe3fc1341e227e4a980b8f9bf98c1feef613151cc75399e1168e045db78b37d886933f73e6e143987e7c4d71bd07a455c524a1788f13513c30ffb621018d919aa208ddb774be3ca6b4131c7f570d90ba8dbce03eadbb499a0063b8b762998dcb15f1ec247fe5d397671e3d32dd251e19cf4c30c78f2d54029e9999017682b4b128fad2d4ed44c2f6e65b9c4d2bd19233111edcc85ddc628728dfad53612807ebf19946a9d8ceee076fb60fb9dffcd5f59aaec48a294a8a65886d2202004fe5eb83b992c3f5ca6f9028ae3c0752df1cb35190a5cd7afdaf244ef233cf0d898b515f6590e72fc05317b0d7f5b291dade502d4d57d35d4fa3d70364e771a2a70db918990fb8d6e771296aadf4de0391d3fe131ea92b28a466c2a1b2670187d0a04b80ccc0b2521a26a1e11fd1b90851b44d3e113490393f715f02e0e2849a21596a91b13ed6ee875a32f27db71f71f237508d7e9f425b70e0c57e3529a474c039ada1f7ea05c54f340b8446ca69721837bebc687d6845f3e801b253475d9e7a1bd350a2e84151d07325d03fc1bdd670b985a18bd593a67bb6b636c491da2352ed14c7ef3dc1f6d50146e114df1de5bd1e741a93d3d3b9ff3e37975e4c52c5d5e7195f0fa7957165fa192f7ff30bcc9e9a3fc279316f3144e040a8f95a9f7112dffd2ef7d0fc69ce6dc8f22f52f786b27317d0ba65ea27a7b4895c1d0da8a8186d46de2a0bdf964923a77ddbb8c3082f5330aee2cc06654a0ee29d86a9e14666a52601baea6ab6d20d80a3c3542c9c57458a5c83f6c99d9c57aae358fd9a673ef50e021c9564ab7021cac152e15505c566dd73097648593d20ea40240107842219ca1d30acd2f3696f1c75cb2def35b5445e4e31c2693988d01cef8a50dded49ab3fc54834c070a9677140ea308cb2a75afa747f832ad50117fcd1b88a28ada5f27d3ab8862001bde0d313c285e7c3efe9ed66a0822de16c94e50563bfa7dc0e1d84472874c5bfd20006dbbb30655174ca22c692233476da6195a38dccc374684a00dd1a8388610dc836433ac8cc2ba7544090f958ccd3b687297fa3b90e156da93e871d96468087fe28baee8a9be634c7afe444805dec10a8ecade1ab6fbd43ee6690fe7e7b5c2d4b9a0b4a215a48dad75d405f5025b803038e8be97d10b49eab998ad2dce8848f42712d14ff1208f8e31fa9250fc7ff6a8e332dc442cdf21389e688ba2a2fcabb095147753fc99a8509796a99e8ab01d97c8d01b9ec0d5095970c18ab6210edac97bff6da52085844114c00fd5f630754d6a0a500f6e8b0895947571a33f9a3027586dee28e8fe312e2c70e8c20543d07ff62b86d9da2eb220a70414054baef26b21cc5c2dd6bae7e02a61bde7aa4cd7e6ead7ce23d96ef2b379b8fc0612c4c6a40dda99c9078707337278387b1492a75dc4aa18d374115a56b398f9c2c7d47a7220f0ed78e6d760d335ad31aba2ff19178e6d6418177668660ea5a1abdfbfb7332ff9d107581a276168439325c10167c65f6bf692eda63e0c779bf144edb82f21046610c274b12b6f098515b3808d4ed1c60356637bb098fbfdee635fb65d99f79c6646a7c4c4ab71928a97df813022a9ac59eda7d527f5d725d681bd66a58f5c676170cc00236fd876704688453ff22572338be41731dea16ba7557e62e41436ea159f4f8a83fb6413005a0ec3d11ced80bfc7b5c6111f4bfe2c6d41620b491415dba17534f42d80b8d9277b47e7f703942ffa7e829e1ddb8edc7f510a25617d24f5fdd5a58802b5c10492c8e593d7597402a60338b438d0b2fa56009f7d4fcd70e15b9eb0bea9530145713999b976a83826bc56c68263180c377074848e8e3fc7459ad9c99ce895466a6e309bf3fbf7b14910eca18146161d000689853a15cea4d641531d6e1af7da2f93cae7bece4fc302d0c22a8173ca0aaafc19ce6c7d4a4c0cb487523e9810e488233904c35d0cd350759231c2ce8523ef4266022ce14afee15f090150fc23f10f773b0aabefd2d654d823ffbaf1a1574aa2e677292355366b931887a11e8e028ba222ba5ea4be2a408e4b638a1c0c94b44da13ce3bd82efd09bb579eb32a5ea1201d23082fed93f598e8f6b6a34ddcb0ba3866945c9b193064b134e3e08b9cf8496e160fbe91702e0475863648b592eef9ad54e89856d64e1b025a9c9ad581fc5d94c5720ad95c4b2feb090be01daf898350511a66ef7c6afd31a638a1b8d903abf6bdc2785368e5c555f03e058fbb22e1a62307de2041221026ef49125ec398deddeb5f8e587bfc2e0ed46d8f01713a9800903c546348caa15fc4a6fcc6d9fc3cd8a6644097bcfbdfc057081d991eace0c341652fc6eedd8897f67ecc10985446576ff089499e712248ee6670d0ee78681117196834f374b301dafbb163078ef84d934454a62d7b0a7cca6e8724d583254f1e32cd6c6e50a816f7f0a1151aef7ab3ccbcafa8349340f3c8800dfdb0ccaca7b2c9d9bd8bc3b4e5fb8735f1d54e9c6cc7bfa3a2cf23137b86fda920cff363ca80c968a668960447b6b3bfbe7aa64750453ce8ae8153bd29d53abacbd93384c35c623739b4fee6127859adb45d7ffa20012a7b762e23f4494f8eedc8172ca2356a1da88e24801d2308b373377a3439c86c7e52776d188560f438ab7472931f2bed0f70038f50fce66f040843b910c39a6e4d582f5aabab94980303f5868d5e35738b097f05d8e8553d84d4b4b2489fe2aec7a9b1722f3083e627e1505af26b59de981e6a7fff525a2dd701a64c40458f542337d4ba57bf3c7d7988d4f6e3d0890941b2a2c8f733d2404ba3bf80ec98c50e873bcf63c950ac10d21fc717e280d6713b806939737e0cdfde9d0d8642519e56d65e15bd470f36adcadc81399115d52acd9eecc4b52d96cad0d7d9d9096dd5a79bf2f6a9f48480554d214dc36c5556cf7c35b7f8bb1e0f78a45bebbce6af4fc66b50ef4525ddee873188a9c2d67e7850a35fa948d373cc8f283e1781ee36ac8ccbf04fd5cf29b310cde5dcba6e6e782001d9a18cbc02ed14b9732c0f2ff1479a392c4b482ff6ebe419879571d52a1518ad0c790d1b2ef6859415eab5dfd3a71b8cc17e3acb53a2c7ba4d104f24eabe9d7ee91a003d8c81f926b50b1f90f303d071c5c9f6f13c82c15d8265f67d87fdcd9f25310aa3b82c6484af836d3f4653ca7974901b959505216365cdacc7f3d116985373084e6d563091a6b3cc3a7f724a7c6f3a566fa59675fb26629371a66adc0bf077e2701570bf6ca3144ced4234cc7457b7f0e996f997fd75f779ec46f83b67a084097a5677808fb833c2e0a5cd706ad7920d4758f5444fa673b389a508574be586af6bf21be06a206825670785109f9e1a4c071757727819da018927ef28abc16704b5cc36ca52f8fd92bd9acb7947d8611fb46976ed73e1a3567c05e5a21d54c7d918a0c58ac28227c05cbbba7b088e72df484044bcc6a201a4d84f0f6ff8f6a84cb5d5772b11301cddeff0a8689028b7e3691afc3ddccb6735137dc80e719bcabfc6a0b26563e624aa1a09f0f855f0f2e4dc578bff845498b4177bfce2d53a0be7ff460906babc1920e12022d55b12951b9603f677df8e70b97d24d529756bf8baf369bcb030e0eaf33251a258597939a2448b7e32ca24827b506f6d1bc84b44b1fff91bb46b7ab621a8a355688dd75f329a4e4561a72024c8ee235909b52685f261147c1de02d75a53089c6638cf791ec6321dab70e09da72ad4909e23c1b6aa7da98e772cb7b8cbfa2be944d6e51bb107015c8f707cfbae51d8a0299ed8974b3a3c92a183fa7b884ed3df585be700826ed99e7f4f5fda4a857e8163177407dafb346b163c38859da0eeeb38435e1d2cdf6718e6462f92e4824a0b0722931be304426b8ea28b5ca083de70008a694dd144ae75685683ed0ae4aed4b28c303d4636bfb0cf276b70a978b871d71d355c82432617462a5293afcaa0f2e9592bac7618ee6bad66dfe7d5827c202ff4166fe09f803459342f7828217b7039327f13c299239978e58510ba895a1526df6f6210084f757192e08932fcf9622b7834699237dc624a548a09ef645cd3c071a1d63adf6704d0956ac6429d1b041fc8dd1902ee0d011974b95c40991e9f69b35effa9ef44017d384cc29f8ce8c0fc94159d8bcdcbc5c666c1743ade4fdb643e05b536a0c312ca3388f89314a827ba6e10945daaf5ae19e2bb1d5803a720c81f3a7a9779efa862d9df4e290baaf08c3af70996aecd9d1671c65184659a8514b77b851902d268ab91120b6365f5c0d0e45c950d58fc58db2f1480c92980698d82ff4d0fbca0a4a1d3fc3f595ff781c0752f41f7a8216ed045f4f977b28c5b95991bcd05b889bfa216658e2913fbc0b2f34084cc0a418c92d86995058fc1b2a5933e756fb07129938737375ee0b69891d4b05594188d0d503272f3ebda967833449dfc5c20ce951cdc62799e251aed1078098d4ee62157ca1b9fd829fa72f13845753695007a0fe5836e9539a9dd8da707221cfdb7a96268bed026a6e8ec9f608e364a6eeed9f44159584a129920554d88cfd840d38bfb5cb08367da6160b529e48bc1e8a6f0cb0e42d54e594763a51e4e9daf3475dfa533507d734290af0f4ac544fa69a7e68730888d7187c27439537e2e61a2dc206ccaabeace5897c14c77682227f3ce3aedba368110891cf6f839a0eeb6d8d054326bab48678e08ca92a8eb6b1ee87473738a092bfefb32af848a09a9f23b6eb76a793a2047eca6bb1d2818326a1639415ded2800bab40899b28c219e6501877389ce85edb701f8647250c1c59496fca57de82fe4c7a2884d6a0d7a61f2de96239899a144aed86c87ba83f815141fc41b623e11e2f7a8c0eded6665a0be740ca229ac05a3b790712a55eb0524eb5cfa64806ec6792ed1bbec37c109461a189203c1ea31207d9f90d749ece42bc72e4cf306c42c878d0c7d1938b258a729c353f52be5ca83fef981da397921dfaebf7cbf9eacbb6b4a0c3ca1b2a154ed13d1f82081db8b96af8eb8fdd40d904c796ab7c395fd086573078a79f1acb4a4fdda67fc0a7228fb430d871ce88e627fe7453aa39ca17ca92bdbaa82fd63802f0d1a6470cc0adcdf4df8780cd6bac448ed41c4f906e11eb2865af9fac1daa48ba99e7d5f5b96c79bf2b65b9f3a33c77e2887eba8bdd27de627b773fbebd4ef569a54be98a3ab66f0ae8762b9a81accc7200c271f59c55539e7c69c14d1cc610fe8db55ab07f30c08ef66ee5b3575abe3af6999070b5d625cae5de2f54e45b14be6dfbdfa7cdb9ea1dbbc9b1b84181d9072d0587bdf50a462ccc33c36f6d1880187121aab02174384eb654998cffbd724a3665b6ce69e0a24e2a976b256adb2ffb8b70c95d542af039537b8f952c321454341d54577f02723a3ce6ed2daed09efb93d83848b8c6b56e6c9f6b6cd64944e9268fbfba7552b0df1430c7df45572ee651fec2339e70d03ed7eab8eba26eea5b6bf4459cbe41994083282527dd6618a3a00711273d3c1d243cd10030d27583717f49deba1a46756deec2b3e61b4e14228bd2be9783d58db8fd76dfe27e90974b3d1c906cd77b16255b58ffbd539597aa8ffad3919b0dca1bd4e75543c1cf05551e2680f1221caa22e324e3ef6eeeb23a6620a075523a3ef932a7a6de1602a8237a45cc96a1fb8c891d4fa67975c2815a28b60817e300f5ef9bc328de2f07c3ab3a293bbe56364626148cac7c0233438ffe5a4d0fefa2a8814e6c9f6d8fdbf26f704b311685232a1a48ac041f15ea4ffc8c934d97a7d5ec1e96f696c9f77a69f2a79b4fac7d54781ab94a3df9907ea881c78279361cce0305507602a2cdae4055094fb5bed0288a1412e48385ca0c9beac43ea2d50f16c9f00b89789a105a0267203c2509873dc5dfea4c772951442d04a456a824d0129c6e6c189dc9479ffeba763fa3ff8e2fb3b9aa7c1c19197c83b48c1accaec9dc4e57c6cee94e8675b7254765ea0bc540ff4b1ca821d7b372c670f56d6d4be82ca1ca7927cdaae574cf94390c95106192f441545e3d66e59659b25cae0094a637328acddcc5af0ea16a258a10af6e73673bec46ea23876545d088759075900eed84e371933bd59acbda148414c44d26360b3e148b215118fd0396b947df2b432bbef3d16f52070d0194c0d005cd968bdfdbcb98d129323c1d49aaa3cdbaa313a7cd1df12a37925f0bc196de35bb99fdc3433c20ffe10c9cdc4702a68940eca65e3a1f4e8a93e65db6fccfe0848856c41bb3f378e3adf820bddc876fb77963b86074d5f4d7c3821bbb9abd3354a96f1476ab02f63c1dbf408c2026fdb0aa6714dee81a70f62a4c1519b24a8f66120540a7f468738debfa119b8cb0d78a37028cac6d50aaf24ec86ec754358a814a8b614bce784ddcca8840f3fed9297c42c1fbcd7609aaee7691c546e72667c22509ef13a3935e19f895a0b7c8b2a71b47650ccd4bc20f3a0923e16c3520fd6757c5a51fd8cec617c92976685db28a1daa7b6b40c77c3b48f354fed6345f102d2e179f82d17471f43a389da5ff82be937280aadb0d1869cb3a81cd85673a3f5dcd601dc6239d4f1759096d7b9a75b0b366adb2b221b9efb7d236b800cb25fda80300426c8207ed9a38a3336dd8580efc471c7f6f9a2571e196f37d96e0c215fff5e9e34c94b4eeb0743ddf66416a2b9cb911c1b0d5b5f5aefe95be90b3dd8ceeacf2e8cde1d2e9c501c5ed00c45308f8d1d0266f6dbea3fb1fca74f5dac2457accbb9492cb25d43787e9eb338ac4df67e746464bf6f6c653fd53d44361546e9b5c412418e0a8d0a56d8966b02592d2439d828ff1fc5d933867d8a693d3eb99a3c0d5dec3f0f79d597bdfb903d50a0e42ec98be993e52319444270702121e420f3b97d38c52c56ac7fe1a14618ede6fadad69ea519f96bc1093966f820ac9c63396ac72d40847d0c6e623c0673968847423841a5c7902991a21ebad610fdca47930869307ef71b2697a03a05d90b0e281ac82a2e4c5181c5a290de50c55a9df9b314dc18f7307bd8041fc5745443e3156b25e148de1e8ee9f4b6fd3d6db27fcd77b2c1610656a46fffce5dfc7a5de759664e9a8aa6b9d71c4350121fca3114dde39252bfb47539118e0c6b9fbb6e45666b1dca62e98ad6d222108d2718d202a0189aaeba43568bbe3310fce61392b3b75615e4e0f44f509039faa9118c29774e399f1a4bd1ab9b1a5aa9df5b763f6d63ca6a78d08e3da783fe06d3bcefb012da4e4322d44ae09738e3f943808de116cf86e1e4a38c084051638649a6f1675d1a20872d4f7f946ec5a6e5b90ebb5e89915dbb5c245751882579e97ab85d4964086a322c2cf252d390bef6fab0b4a00bab9c8f04e7416f52dc00a5c20f946a868b3d06a2c89853f2de8d1b3847a537d0ccaffe71a82ef17ea6c354a4418a748f515cc12ffa8024450b49d7bad02ee70e638ae03f4d779366a631825d773a8ef723c923dd562ca4739e810b7967fb39f51a050d6d36b4bf30f4226f09cb9688b79e475f7fd3afe9a0aa5b70c70f3a4210d15521d46b9ab653877ac83c509b119e33c98bfafbb0f78b17aaefec21c3edbceb530b438a995dad0c7a91b4d3f65f535fe092ee053046ca2eb898758a5174ea7949d389dc661ed14d923c94c993c33828c9a7b694d69585eb8a6cc704831f8b81f2b13b19bc866aeb287dcbfb4906655bb34bc9d01d03210210d339e09c7a39d8e0105b90f770f33cb420d0e8324618d6943103f8f96201dc6270069e617af4786a37a1f3f9d0dba9f6c17e4b78183d7787e55235398dfcd361caa8557da2f6a2ab663047807f81bd2f866ab0d20e1420a1e6f349a79515904c608f6bb8582dcbddfe549e53ef74d9b995609f6456cbac5b1d83d5dfff82df37e2720e03dcf1293e43c1defe034e90061d0af5494253fa94bacd6841749977d5a72d7ead27aa96eba6fdb3298497b5f71e896ba6de5418e1cedf34fbadb04c8d254f067149f7643759d2c02f3420328c87e772f4faf77b26b8a49720d4849ca5555f422d7aa5c7c5d0715d5ad79741d42c9b2dd00205c53a378f75d020464654ca5c200d4a6ff3a6d54a6c10739e9dbbf552c5ba0fc33e5f2ac225d8620249f444bc4e66d14f39fd2fb8818e81f5b9db4aab5331a8c50b1787b8e430279636fa1f40eb9e02e2e822408fdf19c9d1bf69dacc379c9d3c2742b826a3e27d74512f1bdd3025b50f02cacd5ffa92e2dd2e69eb0e3d9bafbaa6e9fba882f0276f8f1f74bfd0c72c261e27ad3a6f06fb3861502d47edbe25ef7575c07aff6a3cb1e5780bc2cc49fcd0ad8a4bbaa056ff28f2d8ccd38c1b14bb615cc2ef6addb10b4721bd784ac51f0d0df22fa43699b9f11bb6276216d95047fd6c74cded57b1a59946e0b495d32e40ace8a0ee19d5f7850726a560f85d92ede07cf3aa5e78205bf8fe044d56c8ab0c094ab063888b843e749d270d7c925fac36513db680b732000db97ef9b922e05f29ef2573bac25917b9baa36662f9494cca621954a388db2756b96ec95140ef9b36b7f3414cd49a8747d4ae2810086760469ef580f315f6bcdd0ea9bd125aebe855a480d39eef1a08d3d4e09581c1aa6f958aebcb78bd7a77284076437ac3a5ebcbfffc9ad8c072dbb6cf20aa9f053bf07533956750322b71b18a575647556e2ae7c241c0531fc5ea0a7bb2da9ce396057959fbb45e172e3bb225589aec31d41968ac9c3f301b8488c9c16c61976a71629fde548b3e89e3639e6351e12e62cd261fcda2820d2d3df59b7ac1f3f84d1374c5a814c0eefc9e9273f9544a1a60ff8ad95fe7d4e993de5d38951807467bba11614a0c171dd799181a282c97e59b643968b508244e38f623965e54e4f101f544b55b898666f555cc9da8c75fed2f511d2310622b21e658752854737e07bfc9657a216f45650434bdccea1b98e056c1bc0ed2a7bdc26b8aa454a30a2b6eb8cad8158b91739ba9ded0007c9bf4de940b4a6957d974acb69b9442d9fdfc73d677de73a3a438068fb2248c735d51a43dea080ed27fb3d299e8b97ffc39049837bfc2ae0dbe19f46d748cc310380875f5d02f2790697026a2aa183a1ca0da060f576a6400e240ac2c017e59fe23df30dccfb1337bd6b0bdfff31a2252fe9eca4ba21458bc0b15ea934f9d218919317ecadd32b3164305b4f46504cd3640645ecf537c2dfb751b6e7a784713b2fd7095f640a2a2a6ee89ddf5c31c3844d32145cae6877d1ff5b1e4fa7decaae51cb3b18296f611027b176dcd64c6cf92c1fce693a6d29f7432493ef1d0a507acd82753b47e0e49da9c7f6084bcdce32dbe4be946a4e3cb2d7ef0e696e35c23f8f437b3bea8d4e5acb4b13e99528aa71bc0ca3daf50c7d4c95e0fb0253d174c69677a2d9e0fc302479d79a8e41db36dae91735b1559c6ca3e17eaa2efc8425f8d22e93996fe6d775c70858ade0906dbaaacde1912d15d097c2e4184bc7d84e495d32c1667200acd23b0d21f11d41ca4701ebf83c66e6d6d59a53ecca0fe0a9e362c3ecf5b82f65532ca73595c905912a3ae30a81ae1ef87acd1efff67d68849dcecf59913097c0ce92c655e2b0f78091a982378f8725761cb63a061e22ee286a97e9a0da84eba6f526e5a655d54c76ad566cd194e248f94ce7fbd30c4ff91719ec8fc490e5de97d2707795126a053fa624e4eafd41a6b486e7a5384bf2a9c5989f8a170f06111a88273981fd768a7c6640502503c972defd7506ba323604bec519c2d95ef71c84a74fef1d1e6686f3a83d68f9a8b6c89dc3e6a980f1ab447649736ce829f3a8b36