Security Research
CVE-2023-25157 GeoServer SQLi: Property Injection in OGC API Filters
Thinking
2023-04-22
5 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Web Security
GeoServer’s WFS/WMS GetFeature requests accept OGC Filter parameters — but the property name field has zero SQL escape, and attackers can splice arbitrary SQL subqueries straight into it to harvest the entire database.
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bfc9dbe3a6985cd89376a1917f3331ad5bb4a1f33e6122ddc893e5a83bbf57eeadceec1422d55803dd08e9b44940458724fbe4dc8445ed0269e562e978d1ba5683e26a63af2c8ab96445f9c80eab0f369eb8862334b295d072aeb0dac583ae30ccbf9ead132c71f77821c841068346d0e7069d01c6e04d57d580872857b50dca2cf2c34eab0f20e0e9d3d8da68267f47b8bdbc4f8e77abbc08fd15658dcf876a5453b20a11d71e59249c5460cef744d3a714564003ebfb4dbd9bc72e8918b1f228cc68f220041dc50a7cc7bd07c5d84d65ca3efa140ac53d16f725f90ed71df1b6ee692a6342e828225f89f4fe567e974f444cfa6652fcc55a229f6a2b0ccb8a5b3e791e2c78d060f1813968daa4d4ca6f99f58cded342125bcd538eb2ab8d1e17a517868f4e47217c2c1df15cf2802ace0d4512b013181d86b80f4af6f6fecb54ad926594af19ac13a4d04ece0bc9a3f0565276461d08ca40712b826f9a0f24c7a5c723325ad91baea04cb02ab5c3a8b9c1806c47962dc533c27deba554da08bef2341014cf488ce95a097b108c2319444305cd304a7fc012d388ced96b7b4db0a7c6bcb6804d498b167875198f454db4cd7f8841ecbdc5833374f84c7b68dc90b0f2ac81fa87a96e3088bc757bf58a738c4d4f456c62a3678a6e7e2fa37ede8a7211331ae391ad3175d7cb644584a3ec7d90ff63e6b6a395f5c40085b5488fea936ebe4521abb6d2dfa6f99b3baa9058f857f8a2faf5f9afc8bba6ea6d3b1dc5eaffb7f0b367cab5b55333ef1306c4ba8bd4d8dd33cec13249f33d4e2936062177d708d6c390d1c3be4dce6e45c63bca2fde82b626b5a14c2ef601f0da91b238bcf2a6510e33ffcf1a38012cf629cc8fda2f142a720b41031e33140c83ad97e888499935342395a30ac1df79dcb63979ec647fa941a7c1d6cdb590c2f38ff819b4048745b03cb4f222a4b590e3eca83aad340265c739e247ad092d61586c8757c929b9a0ccca8ff320cfd064ea4677e71f7791ec062aa88b0e8b2f45609c8b18b5a19d9b505269fc2c6487d759504462ebbf5a8c46c6926e37e8570d4a3f4bd6cc9ed70674ddb6a57428faf145ea6dedb5c6b39bb83673d3673b4a502ccd269f14b4a703707c44bd4b44c40dee380800f49fccd2c600c305ab6898b2134d5ea84023c4446a9d4147f0a607b3c2e6919014b3f124dc60b9f8d652c89bbb63dc81fff1577c41d398949c6efcee6e0001264cee4be478682755d0d91221923c077a2006d017367021398a95858c765ba0f73645e4adab0b25e5b10c619d25019d423fe7ecfcf8d95a26060478c3ccaa6993627556cf7b7db117013f36161cc449202d76101e245720d77f5865426e68b7da693c4a48bf1c34aad201ff4099fc6e12e5defb7577b603360269dddc62a79d6487bbfe22b0be5bcaf52f478f63b6fe5f90836867b7b2e85351c3ea74735d0982468986e7a06790ce19f654c8c19d44c3ced88781ceab51aeb34e394f7bd3fded9b83c543b021787d475b9b3c1664f677a5e06de5183ce5771d5692757afbaee1ae4aeef299ead32e7f742b47caee75ac07f844d19c2d9a35cc8fee45e1dd78f66b0f7adf08855b05b62dcdb31b338f0c9dbab2462ea1a5fa4ad7117c54ce22f95df47a41db41da5635f0188851276547907347aa4206d9e0af774c064ccd7015772f2decdf6506e0e3877a459076da2df7ac8b25940f293e3aab1d3d288ce9119cadff4325bebf93f90fd310d37d872dd97100ffb45e3003aba48baed3394231f45148bf0d544e1655556097c0b22d0a410236aac4c2d55766eefffea462c6327229600f33141f45ef1ff4551181bbe2181d0c8409fdb7777ca86d196331aa720969cce99abb14f0ed121dd9b4042b8849c62e9521f27bb783c0b9f03ab7edf402f62d76666a181d2fd428b83171508f2eac0a3a4d9789f209e6c5782901f7fc71b38f45591e4837e77492bfe566e6b493401c3e6cf7a50062e0c731b22dd9b53022457ced3927dd873341779d85f3dea8f1069ff6335734bcc174157179ee3e3e4765010e3010883ab37355e604b14db780171d047cc1ff7e311fc63174ac5de5f95727bee8cdc80f110aaf9d3b541b64b23fa096c278c036a3dfb1c6cc6c2edc0053feb84bcaae1a7c912a07fc6d889afc46ece2ba4d9babe18e6257034de4526858b0869535e209004b03514b3e4312ab886c28861606d69884eaed17f226b39307583ac7435b0ee3dfcf92ac737625f714af12efbf520e65fd061afb1e278be6b82fd7518716102d086306adda2ed69ca89a41a34b2bfd0e7660a31ab52ee82caaa58b9fef24bd0348c95acef680b38bb8f1f44193a0684ebc1fd816bd7896ecf3add84c546d13de62c341c9077ed8e73281edcce902a9313142a7935d831f2686a0d9c635d0c0fe548d8217303e8c6f110fe06433de057324039eab80a6a94387cc5561160808de587941a4d9e1fc71db66e9bd78355b95c96271c6b09bc01a09bef6a92f81f7685daa6795ad6c80286dfc7da5d4e1ef35add5861c4335a0b236677fedef6d36af3a12f71d0e427d78d5d5efd8d238e485ba9a2b25d459ede90f9bce11b9a373c0d6b163ba3de2eff04d824ee0f43b832c2fc6acf8bc3c1e0007efc92546389fa4a2c2a639e753c3d76a8f347363ce4bb95a1de3410d449dc8017f21bb51be40a41381e57b45b31b7b0558ffa5a5fe08d854fbbedc550beef07497c7fbd044ce245d312ebc21e6618c6a8b4acf48c141798656e5ac86016e11a7b1b22a9e5267a18821c46f86dbd9604f358d721d713d58616d9223cd476457caf02f16402beccd50a1c9f6140edc4e46edc17cb1bd26eb31af73aae09e6c77baab9ef04687d822a699e79068dd820dfe8599ea5352d3c93efdb7f7409ad08fba52c1ec6d10a5fb2e5b80ebfbd87be04110f4bc75976a73a9646d75568a1d8e3992c7dfcaa25d40e60565679035850111deced815dfad61acd8f259b33ef45b01f353691bfa590c16a2e740b53ec4b615cdebe8d1b32c9d52ec76c98c39411b50de7421283b8771d8bcac820649408856c2c08d32a466a7031e8978b762998dcb15f1ec247fe5d397671e3d32dd251e19cf4c30c78f2d54029587446d39fc008318bba2751d6274e230a9df2ceac0329225aac497e17960e64c995da1446e6f049e914a43d033a50c907983f61275da1b223368239662633935640d5d5961bdd549071a3e3da091efd4c5917f5cf014be9d988957c2716069c71abf83933ca902fda137c64cf225369021664082c3d0cef5f46ccff5948e9c2ac8ae9c5aaa5001266692340aae6cd5b2314a87afd9bf07d9b7b776acf4744033d3bebd0e383d95a820ae3b6ec5a84869c34e44d2ed0aa7c25f0e9ff2262e91295d4edd379e72450e15b8e7be379bf6c61e3005ffce9d1ca054e05e275898e918963edcc95916c305a6cb35b5cff12ad48719796598a7b684c0f88e6043e04d0d9bd9b0f215950b4dec043e0f8c8ee92ba0fdd7f96edec5c1c9859bb9717a4d986c7f543b2e51cd1e52b55d9afd4fe80999e3a5f877168b27cbab2f8112741c2930700e1acda8e727132869984ec4f203d77f75d500c1b40de45b607e68ad3c9452d6871e8e0391c0a1da7484d667a59b73de8e4bedfbd8eb119a960c090d70f220ca9b5858dc372daa8a2b1ab66df3ad8b8cd62a5cc5027db0cf54768ced17c940192197b4f28451cbfa7e8762492452d2458c1c2325eb886227e9bdd993bbb3195d6f6f4649968d150d2e5458bdb7e531430786656e810d016b86b184ef038ca9f9c9c85ae6b60d369de3f34dafed543e06b1bb7c3bb3653defd1d6401c6543334f9387374436bba75dddfdb508acf8b199a028dba2f42e260ef57c5aaa747fe682f2c0c99db112e6d9d80f00b8d9ed9b282acbc1c5642e1c29b3d814691b8d4c20af1011112f3eb3c98a538f8f5da255385b9fecf57e3f9d7ed8f9f468d97d149248c0aaeab10c1e436935b8803a6b50b753f7d8aae8ae4540303c8a6d26276df2473aa04561daf4294828082204e43373a4c82dbdf31c287e6531cc248220c9c160854c916e5ff3b644d6f5756602f6bef24580f3ac641a11f459a6b7fe4f097c61040ecb0c7ec2ac29243f66b11d74ff6334057d67667b670e5082b46c552b4bc6afdda58917435472f647872547c48e68ffb0dd587ebcfc1a258d1899148d59a9e1c033ec08ee2331cddc675f577a76c95805b149b449ff827f3858b8a99f7aa43cc1e728bfe46ce0ae3d3dfc8814fc170b4b6c4fb133590b61fba0cf20e2838b879e429d9dbc284597ca389d84f36d4acfdbb6d2bf8f1bc0487e1ebcbd4679bec2f43f85d5cc2de060f11dc46512b8d61c0b6aeb3b9e0b1713aca0010cc5a96beb6a05a143a535739b93c25f0e96bfade7ad313f82ba3b1ff9efd69e5d1c196a988f5e649e5c4ff95d448b72c3a85b1fab6ab82d66ce652de815affaf64652927edafe74512d1366bbcdbd2de9608e64decfb9805d25a5e1ca93243808be986120f1316a4664ea74885e18c7d6fb7c4d4e43fadbeaf586889b44c55cd3c408109e38766db80b82de6d21276303bdc4f663b52ab97da4e83bb11cbed864d64ebc75e68b92bc8a7f402ebb671d7d172bdbbce2dab86909c3f16887c007f1c5054edd1cc57f4eaacc89dafc59a3b67e6ca19ba586c4bff9c1e9dcb3ad7aa1caa4f188d3472143f780e2f6a1b25e1f599267daf7d3f8536350f5662c3ae8b20d6b014ea5c00678fe71bffc950ff3ec95b426706fe90b78ebb4659a542d8b158d24f6299fab9f62557a9db942284cf4a310e500604b897fee55478533332b0db65474ecbac92edfc6dc52306c6acb55a52443a06d4ed6bc11569010bc26fd57d5ac62b9d41eb4321896aaaa0afc8f53c4e95c11ec21219d5de7ce93168b0968f74bb0235119f7887bde56acbe5300cdfedf319dc04bf6c77bde664620031884dd07166132f92a0273a98aefee378099a0186bb1e851ec5bc7db64de932c3bdc16d45f64e0f94a75ca77de1af8d80d059408ebd22a4e614588d7e95e9c238108e9c62047193db07b189680c5b4368496c6d3e626bea9cd1d3d525f5cf0618b641452768d89bc9139af37abccb3f72eaac25afcff95850d6de5e4472bcda97b4e0af90a2558af9d1331410a13cfbcbfbc60e67823199983bc14154c841bc71a9556539c169a877f4d7a4cba264ddd8e5debf7725e8a87ad3adcbb5e6e392adc2d6f95891f45682472ccfd110034d0c52cb7fb8ce40927648274b237e6d589a2937e4e766531e0230c4cec9d253b74f3537d097055dc34082b18c6dfa650814efa34f63eee6ff68705d92ac0c01a1df192104bffe2a0364bab5df7962725814615f466819b59588b99d2664c3040166e6378ee8cfe0af6d074ba82367706fc8a7ccf64ef71b50860040a6d100693174c695c560bbdff8f68af4f34bbf752cf77526dd24c092a411ccfa60dd026ba60d8cecb5a0da4e5a25f28beac10c4d62f6ca1a28a0155c111ef6ea7e80b68011d92b97b26f5e46b9233a5ede85546ae02496d5793529104af64ae7d15b3c1f189b8174e6c46fa79e54c43c3a763af9ba7b59c3cb980168b2a3bd37362661a1db238d24bd79a75eb77597b24917567c13284f5b803ae166d9a11d278bdff5e2c375d20fa03f23615f2bc9e32eff78f03402875c7e236e0819e831a2dcf389e7fbfbfb38f68a2c0725985f00ba4e2e3112af79e5c0d192801e2f6154dbc54f7122da75306861f66dfe42d48157ef0cbce1728d168e5d0485342c7d5f770cac018c8648e1d0b4a1c8cb623447af6277fd40c07ffc2fcaead81d96524a17bcd8f98978498a3808c2be9d326312de8d70a8987f8eecc7df39cdb273c51537b78e257684bf99d743ac542a2a8dbad023b802b85055c1a1f0c56416b19d8dc75067575d4aa2f531a68bf37d43b66fdbcb9403dc41f3c9a1c20fd0074360242287ec5bdc131b983f9eed659ca662e684cfb0caa8c1f361ff47d1ecbee3d20b91031f48133653689894869752df66f6fb5b2970ca97e10a3d35eaad11e948afaa96fb91eb10d6d755845d40b9ff0f3e2c0948ca3ade8818ef41f91c6c178cf853037d96fbc769d8838d8e16b66019e0c0561280e82f84a316391709c3cd2caed78d4c959b43153cf7d0f9f6854b3e75826f594713880730080fe220bacf81e6520b35dd96b4c8a86893428d874e48d8c21aa8bebec91da3572ded4d6c9dc77e99e27d0e4698ae317c16eec3257b085e920ef47924da6e864710eb7b46758a419271b90765b8aa2aa31aa505de4c3f462f35abffbbc06068763ddedebf018369e5d1bb027f4b408a2db42b86c029dff8a68874d3990e8506bb2da3cfc3e72bd1dcd902cf80474291832ac8eb7c32c0afafbd8aeb5cfc83021fd8786e54428ef8ecfe8a7dc6c9465332af4f64879bee1b8f85158170349db2d4c882bf1a1d7295898681735c6debf3a6b4b4eba17d2060ed4c86e6a59736fe771b6f338a5574b5ca2d1bc5a22ae27c9163ff89950e2126070eea7d06ed6d6c2e6abbbf40cef44551e41eb8dda230cfcb4b4e4bbe31235d349e8d859c2e1cc9eb29e2117c1c8833594355f75103f393fe59e221afff1ee1bf0719bd61cd3501caa00a6d4a8bf0299f955b583c620b47a2a567921c174adf7126d03a5e9f4c63a76ca891f24ddbc09130d6b6fc6fcd987a2eafa2d9be3ae34fc3e31ba9031a599b6565b0fa159efc6fe0a7c2197331f0a59ee06fdb2799824048f103bf6ece8f717a55dd109678992d7e7f10c9ff2f7e19573d93e2d4f7d32b4e0d5d69823f60fc466bdaa0db431116218865a721052289af885bfc89c56415dd6d468657a1372120e6a45da7ff95f6ce71651c6f8fb0a462323ee57fad6e875f3d5d9d0a7e434f31549daec0a1b2f91c25b37f05ef7dff28d6a2db856d333afa0132b38e8c614d32296262606b6e35616304d98a35c41fd9b971e5db4c5525816c30095e42357c87e3f17bbab0276278094faa67da2b0c158a40ef644c91a15b8af835c86319c29d7dc4429d14111fd6db1903ec3706447ef811799803c378e607f2fef95116256e599adbcab19bf3c3508d9d90df908c30976476820c82227d02f172a0805bb37accfedf07be25a66d0a831cb8f3b310bdc344580bd410ec2a60779b68efbb68d1827e296895ceaf61a7539da1f0c10c1fc930942ab5c9219632ad433bbb379dce2d5e5f3ed78ef1a47b8f2a119d16fb4c47809f7c8f719b83b35c05bfbbb5e2d3a67e1439b3818c302d53b2f1272a9f0bd6da46f7d119ced0539b10e8dfebcd45368e7d1facccf1ee41cc82287ae9cd8523f050dd82f7b3cf6d6223b773668d876c7c0fa9eb81838ff57fd24ddf595d2773a0a7de876b334a80a63f6c8bdd59812924ce7256bd7536138d128f7112d01ba9d82bb221bb6e5f5f6983107105ebd2298439fad9dfa7072255bee2ed782aed9d74e9a0e6d122d572607ffc9aa11b091c5f09d8773619c1889942d3d9e652b0952396342eaf3ee38f818beab99f5701be16544763b20e598bb56d30d6a533507d7319d5a91f51c70de029fbf1833ce9c825d4966b3951693e61a394697fd6eafac447cec257112d7128e28b66b6e76ec0769d10f0e62ffb8fbbc9c25a2265b74540820ed092e0e45f12e3623b53991d2cb98266a2e2c55beeba697fed767d793824b8eafe07275f3f71112c4011a77555c7e306dcea9a22976d58db628e929fb8d00ebd3c221c8e81c091bae421b922f3aae7c71e2f522c6cf488ec708296ae0af8916288a380b1191415dd4771390be9aaeeafb9ac2f29e8924d2ee37eb146e6ffd3382742b26170a208b62c9a24d56831d1e4b16ec60e036a51de1bc1a3307f399487c655bfb975c43e52f95dfc2b9d99476c0834ff1dac739147b26cbb949f9db7d5886c2768c1bfe763bfc3e6fb20551331a2fcf942ee10f481279adc96c5c9cbb780bb3cfb1b6303fb82c6ae412337449707b8e3fabed7da67fc6d540aa81f478f16ef99796af10d358fbd8110e07d87edc4df5087366408013ce557ffe418d86a68b1b0a4579809f4a730be23e9f227d0a1c3819ae0ebd731164c89d19bff8d6ca41879cc702ca3f882bdd27de664e15eb9f1c4ef56a279b3dae2ef3aa1eed32ff3950ae6c7200c27510edc7270a3dc9c77a6a96c719cb77fa440b6431efa67eb133439abe6b96cca52571d3208f954bf933d43e74be4dfa7b86283ddec8efcdf549a1856c5278d157faa0ce22e89826863e7c4cb4fde010f805948088aaa7f1d8bc7fac238f1315171d998073ff6b029eb51b2b8f3ede842cf9a1cd346dd70d3ad4fcd3747026de06546e51c2db2e46e9f9bb504bdfc6cbe8e8b8c6b56acb89ef99e308c4a9169e9f497557948b50b4d24de0958ee654fbe6c7db24e37a337ad8eac30f6f0f7e77e0ae1e419c7407dc61333bc55ab7f5d6f4d168084801588420142385f7c14bf87e9a5ab3849e2cf017b7bbef25a63d865f4693348d592d177ef22ec4273ae98e2068313bf6658a391f192260200ed91ec745cad8afabb5b6c416f07b76069cd58277505ff941435107bb58daa72ec2549490f5debe7c8717f6deb746a9d3fbc02956222bdda86d1e8709f4e6b55eb9377c9397b2273ce8072dda7e37c3ab3a293bbe56e64436d54d0a288393c18adbbe18fafa27fcd5adcfae5f2fdbf75a34be311294470a3b4c5915eb94aa6e7c4c065db042f0b84c3282623d872b7d7296da5ed938e0b84ffc0bed98007daa0573d7ed060c2f5381f68327975d8ec180eddec44e740d1f745721c004cac82fbb841f22159ff329f49c0d185ee44f3727341da408672ca0de8a8de73eb47169f180866c7091364c6f79fc1df8f31f0dff11ff669adaeb511b0efc2da93c9b12162ccac87a9c98caa3876eefe8d11020338762d959165249a99e0a81d7b372c6a0f5c8ddb8593dc43d2b75fd5b7720dac17d8c60343583348141eb4977548618d6fc8cd55342c3067e0d2830ab5f310b411b15f92a97330eacb2ff76c3e4b034b9c4c1a1040e6d04c547735ef1cffa8b652404878d27562a5e621fd515489827c22dd7beea723deba3d1aaf3369b650080b5308983cf8aebeb2900edd22ceda9a9d7f9df2377930989a1ba54939e4bb4a398a0eebd6886d3e834be11cc085df254e3bdb428f63b1e4a5bdec6031a326f8f25454846a54d56968907f8aa21ed5df29b02dcf6c824e631c7e607a638f8fdf9a61069eae1403f86a3192c1de08c24b218f4ff93f58fbcbe24130a6cb29df0ea8f66120540a2f07852d96ebf956b5dc262cdb1b6b9e959d75ff7ba386fa66490ea845ed36d06a050a59ccc0f07b4fed184c0dad9f0ebe2fd6fbaa2736546e25292e6603849c687660b185894b217c8b2771b63e0498d6fb4df6b8c83e3c05da8e10c8e39ccb4d4e70dc6198850f80b279d2c7f0dddb666bdab6d15e02a11e4db95686b163ac765d521856a7c69805e931e1127858e2fa94c5c8f7b10ec94d3fe6e5ca9d16f6335fd1f838eef9eeaca64a13326d91693d1b89a6732738ce78997debdd2d57629e7e63dea28d3437e7b2a8aeab699db2a0e3141301707ec97b093814db37fb53c5181c61e58f5916a89875604059f2637e14514feee44de82c6a9d472032aa7d3888944edafe9219d2a0b07d109aca9ac7a3da699dc2cc2e1baff8c4669794106af21c4a7a63c0e774f80fe07e722628cd040b1f70933373311d49cdb8c01601951b8d1252c4d7262042382825fd52ed10d1bc61c731e472393ab4983d521ef3230e7ed390b2fc8a3b18f09e6b87c8c29fef1e08695d713f6c31eb23f7d2337b862d39ef24a4914026fee0e0c7dfca92388f1ba871430b9340b9d82c7130916216913d4c22773a0a6785c258071f71c48398339ae814afd250e0a517c85a553762a9583180b630198d0f0a371a86476b1f57dc80b290c1508b4ca3ffa419c112ef2d65cf1e1fca7a5543af19666df107d315c3b2f8f7f4297ba17dc509b285260052dd2bbe807cfc444ded09621f95c592b3ae62070292ca1e94b8256b4f871f6da0f0cb65b9d644d03c56092f468f44eeb0d0802f4f893a02c918a017b08f9e7f04b58d107acfc333dba9f61a16e6f5fd12508c3cacfa19802d771a3efa3007852562c49f510ec981dae8ab19f1f7444bc5430536eb15451638cd32ada6cf53fd4450a348449a64e2a30dcb83fdeebef25d1803209160a9fb6b045c6ec4684b7dcf7dccffbcf44ac35b859436c2181b91e20ef1ce4b6af81509245639011636d35e81b588d69ca2723d8e631c2d76ef43734d9e5de3840dc63dd9cc685be1c6c71da7d9b52135508fff4d57602a99cd70b3312e0ae534b46ee07b85df66ab26139294b9cf1829785d8773b42a4e5e0534cf34659e232801445641870b8f652147c8b756658fa8b2349c78d2c5cae4db7a78ed3066366a92df1b543bc8a9b95775212854aeb73eeab8ba92599ee65b9558c80cc6ea16ed14b100860fd38dfaf0bc3177e93b171eb209302d37bd87b16710f2258a9568231c39d39f9361470a82bb8041815439bf01f192090701811d6bfdda49f131d37f417c4b8ae80c37416d45413404439265b335c70e01391eb1228357d61cac835a73f0c2e3ab58dc750f9ae8fa8cf909bc3168bfd53526f183135a9955d30ead1d3fa49bf1454ad8c4a1fe13912a37590f8e6136dc5052373b1523410f78762ef60d4f346278a5c017f1d45433288840498eff740d277dc0437bbf4db7e4e805900417e41d6cb09fba02fbf355cc1833c208eb1d358b9c75bf11da35bf442274f26b8cc1322dcbd35e57420f0302ce69a1cd8f4c6f8bcab54620308ebb49063500f9464a1cee8cff0b9db8b167b9126ef7f55c8eeeaacf9ad7fcad68073a2ccfce508aea6f9e3e6254e4003a4fbbc30d7a2e228050bdb4a60e4efad6e6c2561601e53c1900f5c6792f49d510576926a093d7d4a6360c1b4093a99d1c43c73ff017ca0e517ad6740baf06920a7f709940d414272723a72453f9cbf0935855787fb01dc225826210708db2219cc59d32cc518d66f64f27f737be8d84d5a1e68c5ae60c74f68e80f933390cc5279224fb1f41ece15ff0ae62890b3bc4397b7ab01d44d84e11c4bdde71c8343982f8a7d68d7191b973d6925117cb1b3daae90e4128fad0b1fbe1eaafa86f5a12a3b5639fd364434cc1a8f5a038c0b658beb4b2a6e89b0ae70bf82236f87dfb217a311ef0810a0dd8401f2517be326ca43be7395a7c2509d6f77e9eb40db066ba5ed8c8c375f2aa368db1f276cc5cb7464d7fd359e0f4a79d7863bce8bb0b67cb4985ba75a1f7c98636d05808e5bd4d9eabc440eb15c1e813d0fba1bb3a4cc4a6c5db4a0145627eeb8d4d9cb41a8c050d02e6841ff7acf679b13cc5ee15f6c7f37d07864aa2bcd806da1b0981793c2b09ea816e562faaca22ffd60fd6cbd968175fdf9fea54b93760f0cd79b07faeac53377b6bf88e1e141879cf8570405403872f5415ed512ada916212e56458360d5ebfc16b53626a5a046da4115d0210cf7e33401e3f5e0ceb1a076d21126e6a0652dd4b5a5c846323e3b015d749d326007d73e26e2bdea382102e3eebd658c10002f4bf375591d0f06546ebf9b773e3702d4a1cfdaf9b5d6e99058cac6e54e5e69919565f16b5e14889f4db5756b070ab08af0596cad83bcce31fce9d105a02bde8b01c70ff1a0a7599e1b1396e983166e09d8f72ed1f00553bc390cf53b91b492db70772d00c179dcf48988b88127058cf9410552732da667ea8bff751576cd2e71eaf4993c37f278423b470b26d0fb455d7187f2e0aa7a3012154a8ceb8beda191a797c4e6a315beedd242574334b235965fd8560f17060bc1e35d12a3b7b1ae31b45d95df3a6e36a467874011524cafc4822b9ed6f39186be7c69cb7a7520c60519923b883a57e85228a25fee1feea48348469f9869828c1228fe828b75c0e120348f713899263e534313bc87ae078ca9d063bbdf7e5997a31d3ac5e8be0bf2f6dd2ef9f713390d4b8a5abeee346ac3011755ea35cd927c1dcb1a18f1f74712078fee1d5067a0fa76580f85898de3a0ce76d8f7196aaa51c58e81fde8cc6710f9b896ddfc8b7c545bffcb62f9cde87afe4f093b6c1441c23b626613f6a4769622bf76c7ee202090c2a47edd00bb7d5f7b2314864b3c8d7847573cde1bfce99098f3d663720752b4f33ab9bdb417b1ed21351f22b47dade6ab28dae261aa5ed125c0664df43c4139b636969ebc2786d430f84864b3eeb5331503c3e2c1f80444912bed4d9865d5d75a939845bd1