<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58643>58643</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MLIR]Crash with incompatible affine passes
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
BealZephyr
</td>
</tr>
</table>
<pre>
Hello. I've found a bug. In the lowering process, I get an assertion error on a specific pass sequence on commit [#451b1ff3](https://github.com/llvm/llvm-project/commit/451b1ff37639e8a6194940fbf5ffdc23b8b4af28). This bug seems related to incompatible affine passes `-affine-parallelize -affine-loop-tile`.
Below is my code [temp.mlir](https://github.com/llvm/llvm-project/files/9876867/temp.mlir.txt) to illustrate the issue:
```
func.func @test_reduce_sum(%arg0: tensor<13x21x3xf32>) -> tensor<21x3xf32> {
%0 = "tosa.reduce_sum"(%arg0) {axis = 0 : i64} : (tensor<13x21x3xf32>) -> tensor<1x21x3xf32>
%1 = "tosa.reshape"(%0) {new_shape = [21, 3]} : (tensor<1x21x3xf32>) -> tensor<21x3xf32>
return %1 : tensor<21x3xf32>
}
```
Steps to reproduce:
```
mlir-opt temp.mlir
-pass-pipeline=func.func(tosa-to-linalg)
-linalg-bufferize
-convert-linalg-to-affine-loops
-affine-parallelize
-affine-loop-tile
```
The execution crashes with following backtrace:
```
mlir-opt: /data/llvm/mlir/lib/Dialect/Affine/Analysis/Utils.cpp:519: mlir::LogicalResult mlir::MemRefRegion::compute(mlir::Operation *, unsigned int, const mlir::ComputationSliceState *, bool): Assertion `isValidSymbol(symbol)' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: mlir-opt temp.mlir -pass-pipeline=func.func(tosa-to-linalg) -linalg-bufferize -convert-linalg-to-affine-loops -affine-parallelize -affine-loop-tile -debug
#0 0x000000000047f08a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /data/llvm/llvm/lib/Support/Unix/Signals.inc:569:11
#1 0x000000000047f23b PrintStackTraceSignalHandler(void*) /data/llvm/llvm/lib/Support/Unix/Signals.inc:636:1
#2 0x000000000047d8b6 llvm::sys::RunSignalHandlers() /data/llvm/llvm/lib/Support/Signals.cpp:103:5
#3 0x000000000047f965 SignalHandler(int) /data/llvm/llvm/lib/Support/Unix/Signals.inc:407:1
#4 0x00007f72a941f980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
#5 0x00007f72a830fe87 raise /build/glibc-CVJwZb/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
#6 0x00007f72a83117f1 abort /build/glibc-CVJwZb/glibc-2.27/stdlib/abort.c:81:0
#7 0x00007f72a83013fa __assert_fail_base /build/glibc-CVJwZb/glibc-2.27/assert/assert.c:89:0
#8 0x00007f72a8301472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
#9 0x00000000029749f0 mlir::MemRefRegion::compute(mlir::Operation*, unsigned int, mlir::ComputationSliceState const*, bool) /data/llvm/mlir/lib/Dialect/Affine/Analysis/Utils.cpp:521:29
#10 0x0000000002978bd7 getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5::operator()(mlir::Operation*) const /data/llvm/mlir/lib/Dialect/Affine/Analysis/Utils.cpp:1302:21
#11 0x0000000002978b0d mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5>(long, mlir::Operation*) /data/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#12 0x0000000002c94acc llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::operator()(mlir::Operation*) const /data/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#13 0x0000000002c94650 mlir::detail::walk(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/llvm/mlir/lib/IR/Visitors.cpp:181:12
#14 0x0000000002c945ce mlir::detail::walk(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/llvm/mlir/lib/IR/Visitors.cpp:174:13
#15 0x0000000002c945ce mlir::detail::walk(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/llvm/mlir/lib/IR/Visitors.cpp:174:13
#16 0x0000000002c945ce mlir::detail::walk(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/llvm/mlir/lib/IR/Visitors.cpp:174:13
#17 0x0000000002978aa2 std::enable_if<llvm::is_one_of<mlir::Operation*, mlir::Operation*, mlir::Region*, mlir::Block*>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5&, mlir::Operation*, mlir::WalkResult>(mlir::Operation*, getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5&) /data/llvm/mlir/include/mlir/IR/Visitors.h:170:10
#18 0x0000000002978a08 std::enable_if<std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::Block::walk<(mlir::WalkOrder)1, getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5, mlir::WalkResult>(llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int)::$_5&&) /data/llvm/mlir/include/mlir/IR/Block.h:311:11
#19 0x000000000297863f getMemoryFootprintBytes(mlir::Block&, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>, int) /data/llvm/mlir/lib/Dialect/Affine/Analysis/Utils.cpp:1293:23
#20 0x00000000029785b9 mlir::getMemoryFootprintBytes(mlir::AffineForOp, int) /data/llvm/mlir/lib/Dialect/Affine/Analysis/Utils.cpp:1333:10
#21 0x000000000067d023 (anonymous namespace)::LoopTiling::getTileSizes(llvm::ArrayRef<mlir::AffineForOp>, llvm::SmallVectorImpl<unsigned int>*) /data/llvm/mlir/lib/Dialect/Affine/Transforms/LoopTiling.cpp:117:26
#22 0x000000000067c7c7 (anonymous namespace)::LoopTiling::runOnOperation() /data/llvm/mlir/lib/Dialect/Affine/Transforms/LoopTiling.cpp:174:9
#23 0x00000000029bbf7a mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/llvm/mlir/lib/Pass/Pass.cpp:471:21
#24 0x00000000029bc574 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/llvm/mlir/lib/Pass/Pass.cpp:534:16
#25 0x00000000029c1988 mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12::operator()(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&) const /data/llvm/mlir/lib/Pass/Pass.cpp:754:36
#26 0x00000000029c15f9 mlir::LogicalResult mlir::failableParallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&) /data/llvm/mlir/include/mlir/IR/Threading.h:46:18
#27 0x00000000029bd853 mlir::LogicalResult mlir::failableParallelForEach<std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>&, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&>(mlir::MLIRContext*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>&, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&) /data/llvm/mlir/include/mlir/IR/Threading.h:92:10
#28 0x00000000029bd10d mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool) /data/llvm/mlir/lib/Pass/Pass.cpp:764:14
#29 0x00000000029bc227 mlir::detail::OpToOpPassAdaptor::runOnOperation(bool) /data/llvm/mlir/lib/Pass/Pass.cpp:655:5
#30 0x00000000029bbf6b mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/llvm/mlir/lib/Pass/Pass.cpp:468:5
#31 0x00000000029bc574 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/llvm/mlir/lib/Pass/Pass.cpp:534:16
#32 0x00000000029bde3c mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /data/llvm/mlir/lib/Pass/Pass.cpp:837:10
#33 0x00000000029bdd5c mlir::PassManager::run(mlir::Operation*) /data/llvm/mlir/lib/Pass/Pass.cpp:817:60
#34 0x00000000029b539c performActions(llvm::raw_ostream&, bool, bool, llvm::SourceMgr&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>) /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:84:17
#35 0x00000000029b50c3 processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, bool, bool, bool, bool, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, llvm::ThreadPool*) /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:124:12
#36 0x00000000029b4ecf mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:164:12
#37 0x00000000029b4ded mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) /data/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#38 0x0000000002ae1789 llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const /data/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#39 0x0000000002ae0d65 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) /data/llvm/mlir/lib/Support/ToolUtilities.cpp:28:12
#40 0x00000000029b4159 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool) /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:169:10
#41 0x00000000029b429a mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::PassPipelineCLParser const&, mlir::DialectRegistry&, bool, bool, bool, bool, bool) /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:187:10
#42 0x00000000029b4c06 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) /data/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:269:14
#43 0x0000000000411c2e main /data/llvm/mlir/tools/mlir-opt/mlir-opt.cpp:237:7
#44 0x00007f72a82f2c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#45 0x0000000000411aca _start (/data/llvm/mlir/build/bin/mlir-opt+0x411aca)
Aborted (core dumped)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztXFtT4zgW_jXhRZWULd8feAgBathqCgrY3qp5ccm2nHjbsT2WDMn8-jmS7dhWSAgQttlu6K5EkWTpXD6dIx1JDvJoffoHTdN8gq5G2HmkKM6rLEIEBdUc8jLEFxSl-RMtk2yOijIPKWMjPENXaE45IhkijNGSJ3mGaFnmJYIEQaygYRInISqgGDH6V0WzkIqyMF8uE47QyDobYcO09ECPY2NknY-wu-C8YCNjOsKX8H-e8EUVTOAB-JGmj-3XGKj4Lw05_Kwbg0TbjmMbHnWJrXumZ2pxEFtxHIXYCNzAJDF2R9iboIdFwgR_QBddMlTSlHAaIZ6jJIMWC8KTIKWIxHGSUckBZWhka-M6Z1yQkqQpTZO_KWrz0jwvxjxJKdSbAHfa-Uib9j_PKEgRQcfLNcggolICnC6LyTJNyjfyH0OHoI1Lz3Vs13YgtWlxwldQw5NcpWnFeAlMSm0mjFVU9FJTZ2vNf_kzrrJwIj7QyNQ4ZdwvaVSF1GcV9A_ys0g51-BpxGnG8nJkzHRjhfWVsYoNPDIuRJ9j-O7Ke4Vo5JzV_QD72NLQyDiHBOY5I5N-R7jXFzQIj5EVyE5UFw9NUWKbI-dcJqHqwbTog-KOEl2hhC1IQTdktDRk9MmXJXVt6wzrYihI9D5HzMFyaSkpKa_KrCVouqcu9Pes_u45LZhQekkBJkKguzSNBErGecHRBjMNbNFYYH5cJAVgPIMGzjeoEOyBhMY8H0MRSefAVvtQnTEOqjgGa_E3bfPDPHsEC9GWw6O9McPaWttjSynpRthz3DwAsOmKhpW0RGFJ2AIG7RMMIbBoYN-ehPkKSPgDxsFumbQiqTV5GRFOurEnxyn8SgL4PE9IWo_BqSRPJIC9NUvEePw30MkmYVFAQ5buiebk09CtMf2Wz5OQpHeUVSnv5V_T5R2N7-gcOKhzhDGqOLTtdrVuCgojWTA5wlOBvipjyTwD-5VkXPwGcbN-szPZiHzkPk1Ces-FIWgeDvI8FSoEAqcbOw7iSNh3kibR_XoZiAouaxIeOAkUE9BCNKlFdvvtYnp_gVgVCLMu_YbAXl5ygcJXWzRpnIQIwbUIlsK0imqzJXXaqXDS4h0yUFQti41Ohf0Vf7dlPi_JEoERqZY046xVgwL616F9G-cvIfw5bG-jGo0jCrJrQA-uUUPaStv8mU6suQRJoUm1sjWrE7fgmbkUw4OENna7SiV58nMw_ZSAqG2hcAkSbxvc7ZcE931VCAUKIGfJSmQAwgggGvQhEG0LwOh6R6uu0goeFymE1W38AWpNKYwj9zFPIonCd1JjG7agpiMGK8REbmA_J7i7KhvQxKSxP5yalox6mOuaIUTTkWGoMvFsC6lCOIY6TM0ZCsBsenZiBxPP1GPP1ZAPjpzxvKQ-jEzJadP6yrV92xTYrVbjeVbVBQVfAGqiCcsn4P3OtJWOoZXO2kM3Vr8b19Bi6jqoJAkT1uUyqJI0EmMeGgvHs-__evoz2PzEEywmK0zyAYnJRPxaswicF6Sqmk3IeJTUAGXwLZueSADq8KF1lNhDSnTdiXVEglxyehglPKqlIZ-SnbhKJ47Crm7EBKRaT399YRP9gBzOe_3cJlF36Q27dNUuTQcfoLtQaM2WWjMAeHigNa8PS-w5phdrb3dCO3zQS95H-qihCzqev8VCcS3LwjhpCstuEDli9QK85uX6Ms95IUzV2ZoLz9Nj8yzNwx-N4ewMSJImMC1OuBCBnJypRRHlgIY6J4Opvg_-BvgHszN7VoQzxEuYkcN3DKNaJqRxFJPGXl6dqDM_FzW1FatbGmHTt-pkXjRESbu6B0BeM2k5FgR0Q8MCA3qHAX0LA1rUg-l_SPqjmZB18hNTAEEjWM54IK1e7X1cCenUQwjcvpi4-DGMqdkX8j4UeRdiBpRn86EdUgG3y-M2M84uY3r-IDzuw7fLBg0kvVjBDJRNFsL3CqjruMPZYPKBQ88kYfgRkHr_2Hobw7arMGyoDNtW35_0MfAEPO51I8eV00D_4rmbMhKTrpdczdUdfHxPWALi3VgUORvo822qfFsh_QX5dkxpTzu-rd-Ub_s35dtRHSchGMF0ue6OZiRIqZ_EQ_PP_DwDcx_vsvTTfca5X9JMRNXsxj1ON-bwkaS153hOgptafF3s1ZkxG8i6L0sZ6Pvy3B_puWuZHYKKoWr3jbQvjX20xnZbmW5m0WQMDc5CmhuxlaBrnblxt8yN5j5vbjaZYG0YWdId5vNFo_Am01Fj5styfBIc7jMOn4v4z0XNFyw_2jy-wUJKgUvzaOhy1dELY6jRO9c24i8tHl2Lx4tEYU9sC-BuQo23opFW4PXM1yHKrHu9zMub4iNoNgxj6JXxcH_HdiING2JdQrI8Wy_ziqEMPDAr5P5TMwa-5XnxAHrL5hvG4Ce9T_6W3HS6nZYlWd8p658-iypO7pckTb8DM3l5tSwAD7NB_FlUfz7G85JAHkqSsTgvl0IkHf2tXHSxzwJDaCMWrIglhH-vFUtZZTdZD7PPb0G9k3K5qusi4ngYtPGCIHbIjoXRTfGQ3xS3hLFpRAo5LhuyB5AUFV6xrmuhd00yMhfTpHYfQN1LeEkWdb_yq2HWdGT8vzOa2FS4DS3HfDW3t-3-8HC5IapumDh4AXMw-_2HRFdXGQOTJnazRehvuq9C3XNd0NB-S0oouMrivLcD83oJW4YMEvQGwjAo5IW657qvlnBvGEzZOgvl2MZud0Shcaw6rtN7QqDH6xCevBYCazz5IfsU2wJzLCEwoycwWxWYFfedwK4jImKXUayAbpuTBGAfL0gIU4WZ78-zyg9Xq7qi72dgDEja96YfKx6Jxc2a7FFa5w_vtNcjyCMP_xecihXhxVbc7egQB7wpsY3rb1d3szzjdNVunX4p_Wco_Uvqv95Qe_Ui7UEejxFTLLkNKI8guZ19V6LmQeRaxrvs---jbnUW9VMs65e4P9Ho8sSEr78cddXRpQ8OcxyDhdfP8Ww5KTY7Kj112YHBLLyDyncQZ1vinIK1oc3QthaAdvDLLADlGYUes_rX-u9j13_DI7diQFIjVAhrWd3IU16r2bt5t0deryfaNZyhFTHUIEgUWS8RvfeczaspkvEku0eRGqiwDC9E0IsI7EzDOtS5_3h3i6L2uxc0y6sypNfzbZhue78DzicMZzBblqA_JLzm9st--TwAxazJlFcw8OU1JG8Kfk2SrBWZBJ7TScxSJaaFRntL7Uwe0H9BYBu3W2XJXxX1Cz4MPNex2LapXv2IxgRY9yOaUk53P7OZwKqq2a2q4wm9r-YmaihOVIAE1lt7AbXPvZXUHIDng_SlY6mw7tiUoQQ-ApOGcR-LXROfRnE_RzEvwWVrqqXVya2o2M8QlKquwwJnh0HKViGlrrXMiEY711pvUeankOCOw8RfQ-c4Q6d_avhT6PujTigbw8UTobrjer_AsPj_snvHOXytXOYhVItsqzc8WJEmfJpFt8qE6HMbgE-huBdrbJmTF5xbd4lPuDmx357whLZrAaxo1lQX6KZueV_zpLcb--NMPeS9127BZqqRBRN75JNraSjxNjIw-3ZLSkbLNi5gfzbRu8rq3VRDDmao2TtF316NX5A6aqKscu-5eLuJOIJyMNdH4QrXgOpihqZyaVjXQ0zREp7Y2R3f7qhNtr3IyEe3aDYH94NdHOPQdZDvi5ujPuOk5H7b4yEXWUMmrp3KG7x1UhbKduSlVuhvtLnVKl_5ovJIQoLqjpvLrc8y2tISCI322D3TVnUbm2uuU3GHF9YA0FiYl1S-HYBGm2LlnQ8n9FS3bdu1HN2xTqJTI_IMj5zwhKf0dGSdifDIyDqfydcPyBdK7H5LzElVpqdvf-eB5dqmcbI4DU0noLHrWiY1vTi2HMuIQFTEidwQh9Q8SUlAU3Yq36GDM_rUvNMFYyD0JDnFGsa6hh3NsbBlTmIb40gPA2LpQeTE5sjUKGg4nQg6Jnk5PylPJUlBNWdQKM7asa4QOBMRSSkM0T6p-CIvT88oSf-kxWJdnsjeTyX1_wCfVWbw">