Security Research
Three npm Vulnerabilities in lunary-ai: SAML XSS, IDOR, and Privilege Escalation on the Same Trust Chain
Thinking
2024-12-19
8 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Web Security
The same npm package lunary-ai/lunary (before 1.6.7) exposed three CVEs at once — Stored XSS in SAML metadata, IDOR in the PATCH score endpoint, and Privilege Escalation in the PATCH model endpoint. All three trace to the same root: the boundary between authentication and authorization, the one that’s so easy to overlook.
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bd3be957629ccd2db73774053a86548c5e84c12678e6350d2d67e07c6bdf967eac1abdb0c797a9737e6cb8a5d9f051d6148a34bcc010afc50e90b2685e07cc06a2c24ba3ceed7af8a5338d4b68b8dcd26c8997f35576d133e14dd01ea7209ca45d9a6bec56b9e4b66fe6ce7796a1253563558a63f3658863b044a2cc463088fcbc13328e6a1e31940ac3b81b4cb7eff6f8f95e0ede061b9c1c2dd56589df856a5453b019f3e25b6844ac1400cbd640d3a515d7c4129bca3cccfbc6fe9d8981022de95bd1e29089f5db09f71d1695e9edc4be4a8a110fb12dc73655e9af67696087dfd8bac287a8dc327f0960a27872774c277e8ee4d38d169a63cebb8ac89fafcfbea8cfd94e6524a160f99c9ff1416c5af814489a4623d69b4dd3da62bfecaf22957757be4ff625bdfd0c95dcc360ea7a6980055443cc39424c3bfad6d0dffb50995670a19ec84db6c1e02e1f3ac812f4978367229dd9fa50a53f477ceaab2507450723173e0eefaef479a66ee126ed880174ed77b0c95053c6492fb061ea1cdf430120741e798d585ec8aa01e8a3389492c14d31ff1a76b2b38b1fc81afa58b14606ccc66048dc1bf2e9a13dfa81b9815d8feda44c2cd4729214e93ceb8ecb868742ad511aa74edb7769f91128c5cac0ddfdab87dab166461a8e7b1eb2af6facf4e7352c939079208462eec0a19532a999d0fa56f31366b4419792a7814b6dd8e2d8cd167089d4479a06bcdbcb2a8059a8665cb61fd1bf5dea6fe58a0d6abcd17afb0543f1948ac717a0208d0317e4b95bb5a9dd82bfe2107b63cacfd816651374f3c83747a130a30e4dbf4f7176ea3eac9c22b626b5a14defc2b1212e1197b86d07c261fee2dfcbfbcd005d97498dbeca9b401a63ba5587eed324cc073c54aa28499935342395a2cf846e4dec46e859e8858aa830c6a197fca52496c39e490d30145775c0a8553570457006738c6b3e5c0077d5147b4247ad092d61586d42d718dcdd903c1baff7c13ad1158b2636d60fc3c5dc179bbc0fee4b3ee4702d2e797270ccadd1a249dc3df57797492044e35dcd391d2242960b438883780e0b4e338878e004e14d27a575990ad0857acc59a73673fa9842e3e3734a1ec10c9c221b8554b7623079676c9c4024cd6f2c18d001dd2aa370d066216f8859d2102e8c8d01334584eaad64049290c32396b402f3a7a134104832a859b623f88e5c519f75afe596adc5c2ddc4addf382eeaf4f647ac2e7b315c8a57f5b0b93315a42ee5582206b7a01012934c0ab7d1c8e33a4257378510e93e6b04d5b10c6078d5811d170a030dcd98dcde160665cc433d7b194362b5677f1f19b431550b8637fe6449202cb2912e206220437a6d81a35f08b25e593c2bfc3fede5da0201dfa1f9f87af7176e7ab14265d623f2fcd97f02531c55651bfe22b17a1f5f952ab70fe3e3cbbb71b208623382e832e5431ba5038d09524728926771d3546d7857e1cd7289a751acada3d01fbaf0ae32fe8d0bfa630d2d5a7301a0f7f7bd4d875a0bfd67b506d341055d842cd874b72db2d735ea6b0ba718d8da0399ab727aefe4bf874eff14692598d022bd3dfb45ad1b6ea1d35fde046efb6aaa28852ab13658fee2ce021f8dfd79e1c4dab1d55a3a63c19d057b02d948d47b352a519f6621e1688cb5b74456a053472b73c6db80ceb6cc662c0eb3e687ba1aedbfd4a6e0c3630b5166272a0ca73dba75c43e589aeb0b4d3808f81c61fcadfb13413eab81d98fa271b208b2e8ed41146ee1a870077f50cf3ab769b28025b4fc5b4c941a4744a105a625964c7ad43226aaa4e69587a73fefbac4d2e6b643ddc5bd94323953df1b20a15411fa33dcdd8c045d2ec75258fd594d77d56ab648ecd8698efab0e0fd82c8cd63c03be888069b40f147ca81c735fda0ee93290037824801a66e2cd93ae119681591848b7e8dea1bf872bd2269e32518c8c0872840175be65ccef907d764029b4782d5845343c9abbd12c1c2c3c0261092ccc9b5c1e72108ac2df25992f671875980a60b8ce4d2aa560692c119d1a4d4a5986e7f9f5264065c6161d90ae36700a480e17fa790f6fda4ad919f8bd5cbc36451cc5dd468d686ce1c39c96b346feb381a954d11a23f709396a8e16673bba4808d6c2e6dd1d7bd9ffdaa2bfe0c927ac7ec6c598a9da62c860f7c9bbbf10a7716975d0402d879441556c32749441e62614b6ee2e65b08ccfae425360578c4efad262703b023b55c6b36538f1e43de5fd75c96921547b57a64abcf56aa709912ee3a7e27ef46dc6e76050776006d0ce2d609deebe4ac489a41739aeb5c7ed390c70a854f3c5988019fabdb7188334cfc6aaa83a0738fa9302595a240fd7dee1dba14bda826fdf2f9f81ca50c76ae43a5354db5fed977630569686d77cfc1357623c769350b1376b17996b174003ff5f816f6411fad1f542fc0d1c3cfc50770c36e9f60c608f383b882e5961c9b1d6adda3b519b18ca06f860c8958701aa5cde2f5d5e14b656b69da14192f0197dd793886f17f8ef71d4c3d2cc5a054faf12944c2aba330e43666627b09ee2df6eb9e46b76c7a9219b8a4748accb71875e59a1a4b8580984d488e5b1e0189b2036463b6f3bbf9d61bb41c62bee4813f735cba3359c8a82dce11625a7dc1868cbf04066636e9c61333d68e3ae332422e3a981b2ce784bcf56c2ef43b115b55ab00a156c1f1eb2093dafbe4593ab5841e487855ce5aede12f0e9070c327dbc4a56e25dc242f5f413235ec1a1b9b9f49a131b8b6c2b5c832828e71b355a76b2f4747a1b95504cf328a59709e954ca2e9516d89607c2672c9c70592fa71ea3e2a247d7d50b07cb3346f5dfe063c159c555d673a65834db4f5095e55eadfeea126876992825d7790f8a942984a66c84b9352f309daac0756a18ff1fb4b3265ad7dd4f1e3206530eb8ef8db21e450a4cc20d67a473a177bb665d8891e2963c64fcad6bc91360404b68034e4d0c0ae6ebd5749bec38e8d1259f3af84ff50cb2d27bfbf590c0766a31124fec4b6808dea2c34f38d9816ddb7583d68700f162c1744682ba751894c6d9277f9b52cc572a41d06b59777b27a6d6d179ae7124fc34538747ae1c7a213fe0df77cc02a09dbddd5301d89f17252c734d96f2c1043c99ba695658adcb44069cc2c4b00625230ea8447e0bc61364c9aef53246cdf656e951b06f0b3319f224eb7c49304782a5622d916b776e24d65440c0d68e11c73df270aaedf0acdb3d4c1415f3c1075dfe8f8982232d0f11c615e8a16a37cd822fcd056155e6122c3a025f7c4d2a2600a041179fb20c15f9bce4cbbb97aea61057656f7173aaf1ff5b264cfd7ff0f8bc389d6e7a6ecb6a4e0b2a75b8c5a987c8508c10e9a3e545f786d07dc87742e9834749d0c4c83f61f101a5c5ff8179fc124db552d46eff31bb6e7a9f357ad5879ab369216486729c81d5029343d0cc8069280114d81a13ba64a84b769c90328872642f71a5ae2e6801d2ddbb8e180b3545f1f1f226a9eac8daa89b26a245ffe4d67d3e9710bc9017f2d3a1f8d475f1ed7ad4e865179ae1c9a7c8dad263179f7c2cf125f8bfa1546f4cedef660dbff495830d6860bce5ebfb771a6f23ba1f11522620bb75d317c6c5c8c80d2d5e43d6a5657a387d8e07496e3857a43aadfeb3dbf585fc228105b9f59710391993afca8bc479ede1a4bce564db34c9fd822bd6e13c4fa57e8c772df3b518eb4edf4b2b77163f45ebf8fb356c8b45051463f281251baaf6105db9e5ca34ad70c8cbf3fa37d03dca149cb64585db7e554120342958be42cd7ab02e3f38d06d88ddcbdadbf73636c261d4761c97eed458e25d1df6e1bd2c72dee5106344c9393229ec2d53774276993cd597db20aeefab7f9301dbff684aad74f854c6a5fb47ff646b775f8e87416874e5efca008d9ed9a899aebe595244adffaf03c04d96bed8d517fd1d5f5f98920b91a47d8fd5fb6a79c0a2cdde45fee8c0a8c6830fdc84c6553d8c13bca00692b038c71f9d1fa2b964540e3282e08fe14f0208d2fe9b6079cf6d68ac410200ea509199869e37075c3f3a4d88c7dfb02361b45916c70d240d97515a45d006a0f827734c2a115f60227bef320b4033940ca11544d76f7be4a486940e42e9f5d4bc39cf8845bb3f14dd40bd341247cb6d32b270a40e2348bb30efbc78def5109d72224b29317e7c18735ea4c9e617dd87ebcfd6e74d83a5b768d4ce825d0e378d98ab305dc18836fb39a064878350078a4f8ff822f39f84c583e5aa44c5153b8cf651ca5ea8ddc49c0baa3b24bcf5c6e31b298dff9e1cf8bb122a2ea57ce423d28f8d875f78a5dac453349a3d5b5d253cb7ffac43d7e2ebc9d034cae82154e91a5e96d81c5c47995d49268b6698f7adb1b8e2fa1a53810342f55bb294d587121020005225bb3560e3a86dfad475c218bd2db6e2bc94fd6fe0df88aca281a0ed59f581e4969b60b37e2786bafee2a698852de04acb8657f0b7706a2c26e5f6fa4f11813564e8cac9e69e01e74df4a8d1439958154823c7b58e9cee8e1d1f4e1da17443bf438df6c27b7da29bd5a63db8fda65365d4af4056c97040960ff5de32c9cebd7fe7da0824332c850e400e708ad6e743b0fa10c2e0c75f60edcf18599103c8b3e90fa5a134fecc6eada3d8649fdad89c24468f2e4a701f5854e4c6cf0af2a5b68e99b58a9e3124e1cd18ac56621dec8f0bdbc12ec0af16ad4a02f45132157f7a053d747038f7e49c3360b5306bd5070c3e14339cf0987e88ec55ac4b4f7282aa03b78105a837c40f46355bbe91b194fc5742bf52dbac4bb1412c8d83cbd07748e59b8d3e89c7402f00580c13bc80e3e355381b3532bb8b340648cbf2f195f96ed13a47caaedb1350176820f188299d052f5a43d034813019ec72b562c10c77ec2de3a0e085c46e0bf2c918f51307c69b7ca01048d3dfba3df5043510d020d58dd10684db3003c8fdef19c34895aed748b3705a2e17f1258237644b6b83bd282dd3fcf6ab1312901795b01bd619ef9b28ff5ae12ec5b4c76754fa48089aa704af6ef6adcbff831c418beb2fb7fc4040972897f7c228599992656b3f9f9f0cad9e3a11435675062023767712eace849db221f9e8160bac484e2763ced7c713ddef2aadca3f75edb024ecdfaa4e4d928609566ff99b8aa8b2b880a41d98e5cc2e0314bb79f685aeff0a63c3728c9e7ac70442d644a763fa147e338474af3fe5caa4cdb960dd9ab69fa3666badbf70c8ffc9a3a7b0b6a4d39ff15adff5459b49719bb60705700e00d469eacc5b9379417f4d277e284fcf3824e8f061005a4da0642e81d723b95c355fb6d11f18895fcdb09171fb2f410ee2ac0127ede2e2612248d5ac5a05a19b5a3400b6fe112c42ba96d37c6a7e5d755349466913f5f984be9e3769c116403cc04ae2b280a1bd6d2143bf20226d299abcc8f64ec31f5c862b50b3c4017e743be797d678bbc6fca2cbccdb35fa303bfc7d26e72ec6d785039cae5bd9043dbc0686b9f193b77f1625ed9fe3980f4760f3cd4726c310785457f1a26d89a0cf59c53282b1204857b9377f4496914970ea6cd9d4652360234ab403ca9e4c3502179bc476d4d469b9d7d5278e32531cd9fc2e5bd2c1cc8c8d4fefef3e353163c496238425d077a01faa7ed2f1440e477a1d220a5cc67fcd35dda10b278bc1fce2d679c146a03b2a240b2f80f83ab865f77000c65831e18bf54da223b89df1cce1e0f7b435b9dc671577da0a45f7527c650bea68feccdd97805a7273119d961b25248e2734787aef7af70ed9c95df449b6f972da5342fdc5d6332b7a5f760aa81ac08f01e3dab4bdd68c643d51af2724f146d375fd7dcbeddf5c985f5652bac3a6897075aa6c26f8cddc18220fd18e71b3c76ccfaacbd53bd6bf798b5325b89d7d3fa295a5af43b6427e3f8af4d874a208ea4e54dcb8b7c37103bddd8cda4035665b4bf1d22abb95fa710af16a9bdd9312ee59f3cfbcde36991a5820256cc6d07dbd305baf2c81b30ae4f1388fb4d59c8cffd1a135f21b88adfca38d0ba319141a133c1252a7a2868a549a15e7d9647d7ae6b0a02a3d35eaf46fa519e9aaebe382fa40e4e47dac2e7dab816000082a709938ad9e1eee47f9067217b9e4000b6696fbcf668cabcc8815a63059cce75d1481fc3a84c352300409cfca7f83e9a44ffdda101935a7e2c9cd9f1b3010d6201a082cdd103b0c08b12aaad7d2a34f152dd78db0dbb572990cd89b4d1adf8a1fb4f9e8d51fed5d31ef4a2590da2a94aa7b417a909a313513e6c93c2f0044cb4ff07f2acf6c875042b634077e96049067ae0736aaf829a602f707c35b71701d0deeeaeef642723366819bbd189e6fee85a2117c5150ce24a339cb8767d4adbc8626dfd71c8502a32da3d2caa21cb0f0f641d99a5a09dd826bcfe33b3088a1aaf2e78453ffcf506bd47c3a780780f1e3f9937bc7a2386e35a4410e88dff3098c8c1e89756d9db9cadfdaae7c5d72d0c7a3816c597abfa7afb2f7e2b07d3633d008a5a3ab8730f667033b22cb795a918f3f55cef020bd7c9070ed83944322740617a36a00e12863366ab9b64987d7414ade14a48bb02a8ecf4a4e44ad3725576ad1cf8693394ed8a33ca7305e39db0e5e4757b44c1ebc89b10fe325a4ba08e1a90f17b566d12101e0e018685897f22982954c0b46362148ada823951f0d56c32a6dd2274d86156faf728c91f24e87c4d03ac1bfb060c2996b3ef5b5c5f572ee7397a348f6430f09cd7335edbb6dc8b13b8ee696587d69a0be8fe66b806696d54352b550f83c9ddb70321ae550c07b942f387f14c9f7297c3c740bb6c5ec90897d0d1f0978c27b0fae462795ea880b0c0c718d36e92e310ab08bd119b286c56e53c42a5cc655bb381217d1fa0ae4edd2b399640c6414a5f6f62d7f33b17fbc3a934d7313d00c6452072558d7eddcb8e8f81f39e06e1ffc38ed4bdea4d582612e22ff537ba98e83701f32336f22216f6f357c6819c7c12a843bf09e59a782050831c97d224b6c65607f84f1822bffe3643d31114fd43886314f558a40f5224d80f73286fa74dc7256cad87dd74386491319cd880151a772151c7cfe08349712982aba1ab4e9f9425574791fc28694ae8ab9850fd8918a9980833d827360d11cd52a6549ee7bcfc656d73e83ea9d0aa235ae7f0a8f13e2f2ae1be1e95958599117f32b76398236bbe92e9dd1107b5eb0e98f7be618c8e7c3f25525c617be75958251a06191090d8661aaeb1e046a1b9e979aa812e10a5bfc69cb360bcfd6288d73819ff00f25b8a8b9b6f995114213f2d5d8712d4eb2ae6e2ac047fcfa66a89009d6c913c849b089b5a810658e3019afc8b8e65197823360e0ca9720f07a9dc2b7aed2721b32817e7d96962f185af4b0c6d8cbb61a8053f559186b4997dafdb156144a9db124699e9316c33917d7644ea443455ac355806424835ca4e720db76e72b0c5d36cc2f7903e59c278e38b49ec7b014311cf7aaae3274edd12bb7f9a4c32f872c1e2fafcdeb400d0e5711972e5354ce97da099180eb5bba852ac97a78f52ff985c8e8afb09d5743e16459153aec3278a892045fa1ca60132f3a1fc4a80900bf0bef03e6e28f279aac6087d569224e792470e9a42978d38f83e05bc187566e6f226db38d6bb7f72ffd1aa129b5f839a6ecf5c9830e7620f71540cb1cd585bfb51803e4747e41851928fafb25f0ab950ff4f76967f87b61382d29eceff51d71503f3e173a5715e57457afb1498bb9993fd1eef53e379f859ef6b841f277226fdac39280b7b0158f4cffc7888b4e6900086cf6d88934d7d5fa43b7d248e3e2deac7a0704d3577f2e0facbbadc9f5ff2f69dfb2711daf34f858e4f4cd2e7c06f66660bb51a224cc66927a37d6e9e379831e4e0408de0ccfaa3724709998cd00afff2e8d7d44f610ed2f818950770e25b751ee76970ab374b99a9399b8cd937a3d6ec2a9eb61a9d0e2f06d57197adee2a117c30a8aea2c85cd94dfa099f6cbef3dba0d7965b2cc8dae016b6e109b7ea2ecf5ff878a69b05f7f3ffa490e8b10b390647bfd112585a79346ff259feec3d55ac84f4a2e493ee557bebd4787173ef2e1e30b9018febb25fb31f3ab40c6b0ee8499a1e0ca7d0b57c0c080bae54e992b22943333a3eb8cbda434a530a87bf6e1dcbc15b271dbc1f9fe74acead839ae7dac54c7536d4a300ecc1737ea929c31eae63b16bf8a2dee54f3ceeb0d35ff042961b7f4b873dc4f40082e1ff91ac8a10600b143f7c0a7b465d199b19eb285139e1c54d330971136d709b862d8cd3c57e1d58c58cc1418ee5f4404d9a2240782cfbfc92cb4285964b88e4628ecad27f109a7a7f5e4e85ad3cf1bf05adc74ddb752cd2b5f5657db5d38c02720a0cd6ef9d2ed2e97f16c96ce9c972618bbacb7f2c02d865bd174f9e5fd55341de65f4d7c8d1072bd311df72f29b2363a9b7eb388ab20efabf7a22f1582a058930932880833d13a9d331d6b4359878997438d5a4f5b2e5f2015b385ebf6a87d07d6e1373068f1aa07009a2ba934721f92ccd971f92bf9076dafd6d143923bbc685eb586b4d5722e22c4fffe7a51f59ce4f54d694d661ffd4a4bf52749543ddfa16960177bb7adfe7cf03d4317464be6a9dc787922e4606b9f2baf49903062f186d59bad69d6133f1da28e6ad272331842fcf060ccfbb71273e1e7d0efa5604e01210484dbfe076a62f2faa1ccfffe2b8310ecd08c9692cd26be4ab34820557d959ce3a162b454a4fcd5cd7fbe1e390e8ea0667209f238e0917b58b9ed9eb91284ab85b8ca970eb58a32733a8062caef2f7d07205a19efc03e4a9bee1ca75c9eb95733426308a3d1b8ba52e32211ee218716b9d1d1a601f3322c14c0709277d04beda8c137950f539f6d7a0ac7590277d5eec095d89275e8eea635a339e9efe154e3efc1dd80d9e2691d82abd4a99acfe56a33e0f3f95b3472042411b2b1450af49bc0885334377e2f4c1edfcbd18fdc0f97ac10c8a41648fe44908f53431b2b4c0501a49d3dcf807d2adbfc1f1e6d6533a897cd5efce71eb210a645edfa3662ea886eb96c7d034f058f4c420501e79d522b1332bc1cacaea154570711ac7a70b6a852ad1407cad0357f8905b8f866b4db1b3c80763eca4107590646cb33e2a9bbf08657923ecabd9ee426d3b1373f65d6d908be4922b4e90b66e442ae84803f7bd247b30bc2938e3f3f11db42cc2cffb7f1bdb76d78e03ac3b70800837d40af60798720db9f44989a38b7239726c53b5b3910217469dfc0ffd36e4a88f35c7bbd6a6c92dcde5a8753619945ef28029dd1e25435b2c757df4aeaf833751a597113873dcdbffe11aa850e75b4632e8495c675b632a38faf364855fc56b271ce327c49169e85f0264fb05f166ae88501f26058134b69721b6e66616b2548848c727c61a9dadb5a5f34c27471e46b4a98cded0afcb79c51780598d7109aa6cdc5181035892df1e151cd9a36f999e5e9ac40609cf1cc7456f34b08b90b8faa00bf085840163dc1df9b52bb01fc683417abaed59181b8af65b15965a6e5c48a07a32275f6fd2cc4929abda4511a3d3982202f5490bb772b6ce440af59c2d0323f70fd1205a8db986b6deaa3b6f8d96e94b6a4bd0b5c403e6bd9210024598365bb4c9f061d21b3854e0aa9832b765c4ae53c754e5117f8fd41e53f318b493f2cae2901f19b0c9bd9d014feb4ad7b5080d794d6f8d070968bc35e4efcb98e57e1f56917896b377571a9dc61ef0cd13f3d096ea97a647b279d475e291d53a8a1c00a02950c8d1252c4d7290959362f69d7048750919b34c936de243e38b8813d0204a360512ccbc498fa85293295a768c989ebdae139197a487f283e78e631ed933876963356af6bf0b71228eab4fa89ca8fa30aa6349a186e31b966f1cd3f28298d6600963a037076262a64c28f7f720564fb83853595e004bed749ebdc048708652a20ae58319cb1320edf030d280ccb006c1903d3d4ae9cd515c54facaca318c11fe1306ac250558e35545ff0197527fb46d2058ba3e5f7f43f6ba373cf13e692671b41f76cf9c44bb94641ff476d169596ebf0fd6208158eb92cb9f955675492364396f0ed4293d652c42610703a1bcc7eefb08daa410cbe1a28ed6aaf5687b4af454fc5b93352eadf56cbefb4531ee8f3b513528f22b0f404813c3b3040b6334bd10b6eceb53f0fdd80ccf0a819f1b41902c245666da11565162c9261d6b3ca418e6e1cf706738d7aefae148a95f1e7bf8a32155762de0fbaed6606416aa22b5472c86a84a7e3a04a8c1e888636d8095fd5b210b1880829e45e517f094c281a28f55edbb8cdd3d4f52e6a866d562d30ab51205fd25aecae4b802fdf8c2d1bf8939b58e7bee3313a59b8f21f183b4389d141ae702b1dec61b66ce66f93d46cf379408edfe39a4c732b47846db3234f14446d8f2b3e916668460513718a0cc3200464e7f340758deae1639f79f8c6d1ead16578fa3726377688c543446bcabda3512933674db5f220e6e9ffc91992fa1d81189c1ac6ea128850ab549433ca96feb0ed316ab3746f2da608485367c9ce865935f337dad4297c69658fddfe2863108bed8043c47c1bdc64c498041f0587070e99d903bf57ce7945303b9fd4200a06685e565b6220814efa7798555c60268e47de09854ba4835a66b8caa2eb1dc33a198fbae78afc19af3f7eebd53561afc15615b83cf446ad5e24bf90e7540f5764d75ef4d037271b33a65655d33964792c003e5e086f332db71f493e7d36fd8810a4f5276707880f61a4d4583a0331857e6abd54bbf3bc0dad3623975523f3b5b914b5c34ed00924d929aa1a71c2917efb45df31f16d434fc54bc9d62f69ccd9455c164e010bce79bb8f9f4c45c0dea14737229bac49452406fc5e2413b4dfde6eb889c556f61d7ab3b65acceea0d48794a9a56807bfd525896184e875923e363dea1c3145b18d0a7b2532d819a6bff4184affddb2c37a0d04ac705200f9c33c6c5adc4317273bd8d284c3bb2d1c1b159aecd4140cd97eb95ed7055378867417aa4b8c5e07359729b144741d6cbe2e0dbce897ed58726672ad0c9061903e126f8ca53996cb953acf50ab28f35b35fb6bacc092c9a1f89040a5183aeb8bc9ea33274d9f5fd367e61c13b7e014f8e461ce6a389d3c2429f61a4ccc120dd4f8df288a2a3594f4bb8bd778cac73b97c65104dc0a68b0e65c576dfd91e2e9f5f2b6a2670b51f3fd3d90806a5944cee0f5f23addab16f1f0bba5ba9502fa0aef62318c68b73a167846ade65f5ecd17192343fa3979e476fc355a302646c6fa3294a6487b9d145ed8c4c575a4e33ed9f8e037dd15ae0e021cc13dcaf0a8d9495689c992582d9d08d8b26aa4e0c0913999450db13abd77e5e64664fb2bba13c1b7a5913f50c8aaca9e0c074a676fe59742cea055f26c592efa891efea4e770a16396a152f687b76320c805b5b69606c75f178c7e377f11e7ce274322afc66c94844e87dc8b14171cd091f754f03568b9c77df074edf855757d68f08d5b1b1a7aa8927a621f139e2e5f0eab147986d12c8344c71c10150cccc12807636047572ea702493849c12d344b0f324510fa0d0a7c21107f0548069c1a3e0fd0636ed8bc159b199c69116f60ff632bd4a0c118613ce7df478b4602f4fb2d7cbb81c36902e4bcb23bf1633b5058e9e09f5c26990c8ca44a10abae8e5c57030cb2eb59c8f7895c7ead35a40830ac39e0947ec2ec4b8fd11c4103f8e7f15d70fb0d0b6285b2e33074dd2732bd8a9565a0151f5d3d8e95d859e91f1231b11a64da401781c745989bcd4a330dc09e5355346e8c092ce1bda0434b7a81e00ee85488d43a269666a420b07917bd5dc94b6b271fbca85c2146e5d7b3edd45c587178162b6a15f1dd252a7a334777526fb38a64e63c78f106729e41321815ed5b2cbb52e3aba67d4219f4e2fe23cbe91b35f1fc64374b28ebda8abca1509d8fb2dc10c5efae2b93678934f2f0bdf66d3ec065fb83ce2fd03588f66df45103101401f00089008c187a317d8d0efa78998e0337bdb6e1d1672dd7b417d2befe241bcbf88d6420cfc3b3e9bdbaf741ac2f54784be45ccb2ec6c0b1b8881e3d633c35e1f9dc176d0fb16f9da8518b9c3b55aa45a247daaafb5715893bdf96e22312858521dfc1b6c56faabfa32b988a8aa1f3fcd5392ebd2d6ee174206f795a3f3f3ceb7b3cf10c114f2e08e4db1e7d5f72b1730520d6532766697bdfe5ebc68247d6664a772c76335929423874357209974656e03647d6d67ff49cb4265487a4044e0e779145c21c8d47003cb99277247259eacd2352c20030402d70552f79ba57cb66099f1325ba46960c1b0297f136edfbd7cd839ae1b7158530d0c544cd3538cf27f14118808896c823842ad231122843f6f123a74dc45473bd80dcab5f182fc98c590a0916f1853183cfe8eb24e5168f2a2c4955e5abd48c9064854f3283d51f8c31a5844f64f644323dcc6dd04972228c4dc2e7ee2dd1695793fb70b5f4df13d29a3f0ee72fef2b2a3435161723ec3e5d8269653060f8474936dc487f99cbdce38e971bc39ab32f27a168c2a772ef568de52d807a0d8f6e822ad886a6e3898351b763f326d84018b1b5ef25af7d84bb1197174d479a87e70de8c3f0fcacdb29ba31e8b2e33e31d4a8d483f08a2232fc47d058062dd113eee1110ba6599d1dbf311dc992f194bd0af47a2c95ae5cdb145bf723b57d15129b5986a677186fcc2b421eb0d4c7096e9de0a4825cfcd7ffe255131be4fc1f44a029310ef31fd0d6904a043882db60f32602fe5381ef3824adbc26c03fa4759205af679f907a01065fe97e2ea955148b877f7b2c6dbf1033ae015d9bab6e861147c2a84d288b744d6328b8d9fb76614cf4963cf4f7361350626c8ddbcdd86e0c52eb7e7ea1f924c17a7171b9da9037371130130526f726ddf1ee7abf156488a5ec46023c3c1b930abf179732def68e627f80ab82ae8683907fe32995092dafe484f4e427a5e76449c4d7ff186c163e6bb3fef44e33f1538954f3901219a0990c7ed3e418d1bd03f36cc2d45d9045de1fc58eae4f7dfb38b743a3f32ca50126477ebc15cb041349a1811b93b61e597a807fca1f55472d231be89e7a2667e5c4bd1d6e8c6ae11173796a269e989319e179577eea03bb569416e14ddd04f48354b97c90bf60c2f2be9a01b68c4cc6ef1e56c1628742827f3a8b62cb58304a87c263db5bdbbff68813313c79cbdb57c79a6db6f5defebc9cd9f5ab8b17acdeac1a4e014633db119d6c4672c5ccdab22768c69f1c2330b10e7373f0348dd2979edd955ca3b3f5772a3adf8d87897a2c9b85f6444a3e54b9114f5483459a1dc9e0dc3cc31644f3f277291de6fa51bf1171c501a64d10ace3b8cf124ac0c181985075a6b4eb7d298bb2d4b433936467cbaeaffb209c28a329b0c13d339fb79e2f397c51d2112692b4b7e8ecf3437dbe5faf700b78948a978393c6cd9e9c072ab2487058db4b82e9a97beeb41dcc7dfd364111a48937b2a3e851dfe8a134508bf48dea56b6e0a981fd9056f8fd4c91d5e9f367ecc9328205731612ac307649f00f45d4225f1a9e86a5c2f16b97ec51e559e8f65a3d2f6e8083fb5b7cf988fc920340639d0ddbea4e51df377039c0f0772a3b9810e97d2274130e32d663adf743b89143d7c8e88f32f8539e5a6ffce781bfa063f5c7b4c9e783db046e8afe4798cab0f2d40b5724d811a0822a9ab3826d24bf633b2eacdedb93aa5a822b7d1ff96ec7b21834aaab88bae9c7b5fd1fb7a97e4eb1fca4bcd5f31a64bf708726a316fead676981a1fc2017cdef2f371f814fd8c58e865dd43674be546e1477508734c1f65b90555bbf9bceaa6595431735dcbb218199096405f07e562bc92c092fbb949c15cc80677b3becc389abf8499dddaf2f13081e98c77b7b3f037866455aa30807585edf615a721d460b20c1d0b6610743d068ba111e4f578e962415b4aaff4eee158b2c24a589488c6e50a4eed61334456c435c1545e4faedc38915e6231098ca746f0a05bb6e8ab39c4629dbd137027b0ab0c312665ab47db0bd8239f20c028e8b4348f1d518b4234005d40bee5feb230c783bd0333fb7da2d818d70a6d9840677874acf0a451cd85c546ccee41e8026013347df020afc1ceb25ce7ba3b25a999558af6dc28194c6b014f311f7476cd376f3c1d97f20e2fc9a0bffcbc2ea5ccb97d68d0c2332787cfd889f9e9160fd90dffdde4b5d7ba14315195be0ef49641e061eb03ce280fe34e09fe9d425dc8306eae42cca87c8327c9289fbdc082bf8b11fc2c384e68da1652ed68a42938fb83c8f01688d98610ca7cb9da180668a55173cd4c3fb97f03a8dc1ee1279993386e1d0a5260755c2b5af4a6708b65bff8dee11e934fc7f7cca4ab3c781beb3e7ed27880d060f063f0c5528b1de15a1d97abb855b3cae78d9cf1cdd0d6444309a31da38b51f405127400b0acf09fb35d7cda6c49736b092092789e2ba80a5ddc79b3ced9e023610a81df2d66c61488d4aa77b1f7fe6b560e296c4d458015a0c233ff08a301919a2e172357f18fbceb1c8b9d5b69f357ca4e67b1cfda62777598a5c9b6478fb612bad78bb59671088adf8ceac172b4d2f0216f51a050ccb255cd7907618abb1ad62e32920f592a616175c0f5342fbb201b2f5ddfa6d81143481684924ffb6b95f5ddead82fbe7b102ccf3f034d9403023dcd4cc9dafa47056442cf42336977e88bb6abfb626f8a0a49a883bef2e8e8abb4df0a0e797a4941d7b101119e8b8711db67d21e4daf8240ff88a7a7071b0023bcdcf74d3c6f1049acdf07dee7e855ca85386254911dd1ec32257a8580cefa8e0d23490e0c71467b6003ef1525203350e278acbf5e7a98efba79e45ec5887fb3fdd8fadcdd8cec0046cda02309a0862818e62bb1bb3f1aa7dffa93a5cecf900d4edc35e67886e1fd2566f3944f7d459a1b773538dadd7ef62f05bbf1a5ffe6f1e137915772e2e0fcd1e55fbd6225c17a1b93d97a457b537ac756563c9392216a45b4923120ca49b5dfba3e73f093709fa171fd480765ab25774eacf00b3a6f8a7e15cab902f69ffeaaa2bac01533a2b73e9c4d09b88d30ab02ab875617ec0340bc7e348b78ed613d7ea5d94af95df8397bfb9ea43dc29b32c4e6558d58b78b639b622331168b4cbad4b141081467a22413a7c30550c0ad50b48c83eb51dc5e8f7c4d8b34a7332a2076a7c338ef0e81a7c39ff63fc1a1f12a61736f11d3c0be0bf18c0361b9a3a08593ee71c03273dbe62f9393339c182ecc3523571a3a8d62be3a9df88f00e3d697bcf9620b353661815193169cf5331f89bf836dc5df4ccfc74d7e88ec83cc37995ad1fdad4b537492ee8a597836588c8b08b6e6ff47904498eba070fb80760d95a39735554759141e5153eb6f520b99d6840250106232cdf46c23aa602307792b99d659cef19b61fa3eceed7693f7310df1f0f8d0281966d32d9cfb0