<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/66712>66712</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [mlir][Bufferization] ASAN error while integrating LLVM into IREE
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            matthias-springer
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          MaheshRavishankar
      </td>
    </tr>
</table>

<pre>
    Filing an issue cause integrating LLVM into IREE seemed to have hit upon an asan error. I am not sure where the error is, but indications are that this is a bug in MLIR. Ill try to create an MLIR only repro, but here are instructions to IREE repro (which hopefully the relevant folks know how to repro)

Checkout https://github.com/openxla/iree/tree/bump-llvm-20230914 and build `iree-opt` in ASAN mode (or check out the PR https://github.com/openxla/iree/pull/14980)

```
module {
 func.func @simple_mul_dispatch_0_generic_4_f32() {
    %c4 = arith.constant 4 : index
    %c0 = arith.constant 0 : index
    %0 = hal.interface.binding.subspan set(0) binding(0) type(storage_buffer) alignment(64) offset(%c0) flags(ReadOnly) : !flow.dispatch.tensor<readonly:tensor<4xf32>>
    %1 = hal.interface.binding.subspan set(0) binding(1) type(storage_buffer) alignment(64) offset(%c0) flags(ReadOnly) : !flow.dispatch.tensor<readonly:tensor<4xf32>>
    %2 = hal.interface.binding.subspan set(0) binding(2) type(storage_buffer) alignment(64) offset(%c0) : !flow.dispatch.tensor<writeonly:tensor<4xf32>>
    %workgroup_id_x = hal.interface.workgroup.id[0] : index
    %workgroup_count_x = hal.interface.workgroup.count[0] : index
    %3 = affine.apply affine_map<()[s0] -> (s0 * 4)>()[%workgroup_id_x]
    %4 = affine.apply affine_map<()[s0] -> (s0 * 4)>()[%workgroup_count_x]
    scf.for %arg0 = %3 to %c4 step %4 {
      %5 = flow.dispatch.tensor.load %2, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<writeonly:tensor<4xf32>> -> tensor<4xf32>
      %6 = flow.dispatch.tensor.load %0, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<readonly:tensor<4xf32>> -> tensor<4xf32>
      %7 = flow.dispatch.tensor.load %1, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<readonly:tensor<4xf32>> -> tensor<4xf32>
      %8 = linalg.generic {indexing_maps = [affine_map<(d0) -> (d0)>, affine_map<(d0) -> (d0)>, affine_map<(d0) -> (d0)>], iterator_types = ["parallel"]} ins(%6, %7 : tensor<4xf32>, tensor<4xf32>) outs(%5 : tensor<4xf32>) attrs = {lowering_config = #iree_codegen.lowering_config\<tile_sizes = [[4]]>} {
 ^bb0(%in: f32, %in_0: f32, %out: f32):
        %9 = arith.mulf %in, %in_0 : f32
        linalg.yield %9 : f32
      } -> tensor<4xf32>
 flow.dispatch.tensor.store %8, %2, offsets = [%arg0], sizes = [4], strides = [1] : tensor<4xf32> -> !flow.dispatch.tensor<writeonly:tensor<4xf32>>
    }
    return
 }
}
```

Running this 

```
$ iree-opt --iree-eliminate-empty-tensors repro.mlir
```

gives the following ASAN error 

```
=================================================================
==410480==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7f2042ba3d41 at pc 0x7f20542da937 bp 0x7ffcc15f3ff0 sp 0x7ffcc15f3fe8 READ of size 1 at 0x7f2042ba3d41 thread T0
    #0 0x7f20542da936 in mlir::bufferization::BufferizationOptions::isOpAllowed(mlir::Operation*) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp:395:8
 #1 0x7f2052fab53a in checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0::operator()(mlir::bufferization::BufferizableOpInterface) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1193:18
 #2 0x7f2052fab53a in std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisSt\ate&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&)::'lambda'(mlir::Operation*)::operator()(mlir::Operation*) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:376:14
 #3 0x7f2052fab53a in mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumption\s(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&)::'lambda'(mlir::Operation*)>(long, mlir::Operation*) /data/mahesh/iree/iree/third_party/llvm-project/llvm/inc\lude/llvm/ADT/STLFunctionalExtras.h:45:12
 #4 0x7f204be5ff27 in mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:274:13
 #5 0x7f204be5ff27 in mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:274:13
 #6 0x7f2052f9daa6 in std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisSt\ate&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:379:10
 #7 0x7f2052f9daa6 in std::enable_if<llvm::function_traits<std::decay<checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0>::type>::num_args == 1, mlir::WalkResult>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneSho\tAnalysisState&)::$_0, mlir::WalkResult>(checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Operation.h:760:12
 #8 0x7f2052f9daa6 in checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1191:31
 #9 0x7f2052f9daa6 in mlir::bufferization::analyzeOp(mlir::Operation*, mlir::bufferization::OneShotAnalysisState&, mlir::bufferization::BufferizationStatistics*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1392:14
 #10 0x7f20505666be in mlir::iree_compiler::(anonymous namespace)::EliminateEmptyTensorsPass::runOnOperation() /data/mahesh/iree/iree/compiler/src/iree/compiler/Codegen/Common/IREEComprehensiveBufferizePass.cpp:191:14
 #11 0x7f204b0dce83 in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1::operator()() const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:503:17
 #12 0x7f204b0dce83 in void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1>(long) /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
 #13 0x7f204b0dce83 in llvm::function_ref<void ()>::operator()() const /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
 #14 0x7f204b0dce83 in void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/MLIRContext.h:275:7
 #15 0x7f204b0dce83 in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:497:21
 #16 0x7f204b0de4e5 in mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:569:16
 #17 0x7f204b0e64ed in mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:880:10
 #18 0x7f204b0e64ed in mlir::PassManager::run(mlir::Operation*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:860:60
 #19 0x7f204b0b6461 in performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:376:17
 #20 0x7f204b0b44e6 in processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPool*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:431:12
 #21 0x7f204b0b44e6 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:472:12
 #22 0x7f204b0b44e6 in 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>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, st\d::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
 #23 0x7f204b0cdcf9 in 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/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
 #24 0x7f204b0cdcf9 in 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/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28:12
 #25 0x7f204b0a7b54 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:475:10
 #26 0x7f204a9a96c7 in ireeOptMainFromCL(int, char**, llvm::StringRef, mlir::DialectRegistry&) /data/mahesh/iree/iree/compiler/src/iree/compiler/API/Internal/IREEOptToolEntryPoint.cpp:128:14
 #27 0x7f204a9a96c7 in ireeOptRunMain /data/mahesh/iree/iree/compiler/src/iree/compiler/API/Internal/IREEOptToolEntryPoint.cpp:150:14
 #28 0x7f204484f689  (/usr/lib64/libc.so.6+0x23689)
    #29 0x7f204484f744 in __libc_start_main (/usr/lib64/libc.so.6+0x23744)
    #30 0x556534130300 in _start (/data/mahesh/iree/build/RelWithDebInfoAsan/tools/iree-opt+0x54300)

Address 0x7f2042ba3d41 is located in stack of thread T0 at offset 1345 in frame
 #0 0x7f2050565baf in mlir::iree_compiler::(anonymous namespace)::EliminateEmptyTensorsPass::runOnOperation() /data/mahesh/iree/iree/compiler/src/iree/compiler/Codegen/Common/IREEComprehensiveBufferizePass.cpp:173

 This frame has 9 object(s):
    [32, 33) 'regionChanged.i'
    [48, 96) 'agg.tmp1049'
    [128, 304) 'patterns' (line 179)
    [368, 384) 'ref.tmp' (line 181)
    [400, 592) 'agg.tmp.ensured'
    [656, 696) 'ref.tmp16' (line 182)
    [736, 776) 'rewriter' (line 188)
    [816, 1096) 'state' (line 189)
    [1168, 1536) 'ref.tmp21' (line 189) <== Memory access at offset 1345 is inside this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp:395:8 in mlir::bufferization::BufferizationOptions::isOpAllowed(mlir::Operation*) const
Shadow bytes around the buggy address:
  0x7f2042ba3a80: f2 f2 f8 f8 f8 f8 f8 f2 f2 f2 f2 f2 00 00 00 00
  0x7f2042ba3b00: 00 f2 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00
  0x7f2042ba3b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7f2042ba3c00: 00 00 00 00 00 00 00 00 00 f2 f2 f2 f2 f2 f2 f2
  0x7f2042ba3c80: f2 f2 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
=>0x7f2042ba3d00: f8 f8 f8 f8 f8 f8 f8 f8[f8]f8 f8 f8 f8 f8 f8 f8
 0x7f2042ba3d80: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
 0x7f2042ba3e00: f3 f3 f3 f3 f3 f3 f3 f3 00 00 00 00 00 00 00 00
 0x7f2042ba3e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x7f2042ba3f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x7f2042ba3f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
 Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
 Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope: f8
  Global redzone:          f9
  Global init order:       f6
 Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal: fe
  Left alloca redzone:     ca
  Right alloca redzone: cb
==410480==ABORTING
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsPEtv4zjSv4Z9IWJI1Ms-9MFx4t0AnUngZHbxnQxKKtncUKQ-kkra8-sXpCRbcmwn3Z30pHcGEPygisV6s4oSSbVmKwHwGUXniJCSGrNmVJ_pSjGxAoUIQdHFJ1qbtVSfr-ka9HpBH5leU_FA1adU5pvPc8aZWGEqMNO6BpzRWgNmwsBKUWNvffnyr2vbIPHV4vISa4AScmwkXtNHwGtmcF1JYTFQTQUGpaQa4StMSyykwbpWgJ_WoACbNTS3MdOIzHBaG8xEzjJqmBQaUwdDDTZrpjHTmOK0XmEm8PWXq8UIX3GOjdrYsTMF1IAd1N7CUvANVlAp2eF1A1qETGij6qwZoWPCgWJExk9rlq3xWlZQ1JxvHIkKODxSYXAh-YPGD0I-4bV8sp3bISbIu0DetPmcrSF7kHZIYyqNgikic0TmK2bWdTrKZInIXFYgvnKKyJwpAETmpvlK67I64_yxPCMeCbyJH2IqcpzWjOcYxZ6FPpOVQbFnxTC9m_6GS5mDJV0qnNmhsR3b0n27-CYSqppzROZ-OBl7eyyh2Gsv97eUec0Bo-S8-Y-LWmQj-4FR6GlWVhyWZc2XOdMVNdl66S1XIECxbBkui4AgMkZk0kOAMUYkykKMggtMFTPrUSaFNlbqtnFq7QK-DqG9Q9DeEegGeE35yNqyKmgGo9Qam1iNdJ3qigqswSDimMftre6v2VSAyFgbqegKlmldFNafJphythIlCNsxDm2LLIoGjyPRthScrjQi4wXQ_EbwjWM9mGJE_ILLp1EnpZEBoaVCwUwBza0Jo2C6bQu_WsEFl_bqM-Z_L2P-B2eMfC9j5IcZO83Ek2IGXsvFk1QPKyXrasny5dcDLG0BRixH0bmHoosjJrxDlclamBewOZjTCIPGgYqCCRjRquKb9s-ypBUKZo2bouhcOyRnKLi0gUZ7GJEptrKz3HZAz5hF0cVguPD9hmsFMhhRZ8WokMqOTNWq8X_HtJFtsNEGqpawfiRyxEYO_pAFjLikuTNQO7c0xqMb7I4qO5glhMywZn_A9lbYNRrF8l2z3-nn-w2uEdXzO0OO4pc58n4WRy_EgdcxlLzMkP9LMTR2A3ImKF-N2gnTmqbzXCZW1k-2RO27Tu4iV-c07p9zl9kzJ_thyEZIzICiRqqlDbU96ZKKKso58CbfRMmFzbma8Brbjq3qpgfkQWaHGic2pWkxRMd6TjA1RrV0JOdcPoFNe5eZFAVbtd4f2FxnmckcViBGezAomqFgZhiH5cAqOsOILuxAyUUvWqDoMk29hjImLGUuu3E8MrH0hi2yNtuGic3Keup3BjDpZTRlzYsGTQ8f7voPerYWs2HA8w7NMzBL-EkrPOhIdv4EZ5stFW8c9J4R01nbG0y-SW8yUGBqJTqtdXd2P4YJbvO5qIWwBY-rPk6kw4iEuEvM8dmZ-wmclUxQA2dQVmZz1pCqm4JhVHKmTgy8Yo-gXQpfSM7lkyXCpfpNsXSKlODil796jIS-F4695vflYnGzsCYzzXMFWt9RwQz7A5Rt04ZmD2e1hjNaGFBnOpMVYFuFNsDY-5oUxAtJSoM89DE1uMraxigkOZ0ECU4r11JkmR8VQVF4WA9bYIwXl9MLLAtn5Njh2cNs1nYqwPdeP_UJvOFYsS3enBEEUxRMm-SU_eHK3qbpvN90U7lqtbnD9E01tVYBOSLjHZKbyoZji4BMbTR0FRFGZJ5TY6u80tX7u3KvKzzXTOXLiiqzQWTuSs9Kyf9AZmwfi53MOUsRmV8wypvmAXGIzK8W_caUw011tc1Is6pCwTSYRCiYjjsHJIHfSYQUNI0CaiXiytdbBQP8U63rshXAcX5nPXFeSOt6IoMrUchGDojEQ5gDIr8RcLeWZioo32im7ww14PpNmvuIhC6go2Aqq2bqa5PRPlmndDmUzE9W0r2iQhdSlRqR-R6vrZJ8fxLYr56ayAE1aZM3jIGwLC1Z4bIF39LV2ehSClhKe-P7RNPX1XFNL2B1qPmcy-zBttoZwTY8Ul7bWSxGJN6Rz_RS0xIGNP6b8ocF6JqbIcpe-wDpi1A2OepB5GAo483vJ8ofmjxriOFG5a5U9YfI51I9UZVfmc72Zh_NYVA0O-gzLyF6lRUMZXuKsQ8mlcMiiYdtCadlmlNEklNB_cXo846TABMZr3PYNbio_y-mmZFKj9Y2yCexDR_hLnwEB8LHIZXiXewoauEWZ5cKiiOuiU_LqPW8jHKe0uxhWQgUzP4OWr9I0ELR7GN46N9B662CluWcS7E65SGTH4xSzo9dlELRrA1Ubdv04h6R-d39l3kbWii__GoUbYJWaBNTn-xiVtil9ClERUGSozHrpIMcd4EXDOFtI-Eza-z89KdNCiQJrYCDnYCjvwX8vgKOd7PuJKc0_jtp_4Xmv7-T9o8glZPz309MqO34vrdz7eS1rn0gyhlFmdH9XDiHjG5QMPsVhN_3ze0fUZdLqlZuXRkFF9j_VtfeMfM_5N0omn1TdrvvpR-Bh4_gi1vWnDMmsbeXKY4POONHld1HWmT0bWjzd3KcHJDjSTapRfkH3FSvlOa3SOq1055tsr2YNizTb1LDvKGQgwnZW4rxt88gvCiO4xSGUm4fjJYV46A6RxtTIcWmlLXGgpagq2bZurl92T3iuiwrs7lvHnDdUt0-p1C1uBE9lYxfJZ8tBWSuVXawfdY8vXW_yrJ9AHF5OZNlpWANQrPHrfeBpaeTibO7gUj8bSXi5RmMg6FI-mnfTXUvbyqLbZrTylUZLZMDE3Ts71vfcbvstHZNBXUvaM5wKiW337VwL3PmmAkzCH1-8_PZIuC7PE5o-Jn3pBh57hFB0pMiOSDFR8ny45WWu9tSfni57hfQwm5V4-3WLn5o4cIPDijim3Twbkb1fRzG430Ow2OmttPm9ZerxUwKA19NmxV_haw2MM2aID4b2smlu2vn6Ob-wDIaQ4pbXb9SkoMlhqlSdLPYW164WvwumHm2etCN9r5JTU8-7fKBtaO-P0e_TFR831AXThIrn16i4sc90UAI0feI5pZVwJmAvdzFgm45jt9cVvuGduVegy9BOHefngLoZT8d7bdUgTD93PSt058DM0_siuG4p45kpw6IQ8fqHhedXLbCp1rDa5PwZ8J9Zw7HY2-v3PfH38zhyeeB70u-K5DiPvmTHflpHMa-Jb8CZZPXJt7qQWBV9GkptVFAy9YHtksVek0V5MvKqMHixp2sVQbXK4WCyyNlUn9C2NfwNWfqpjLXlIlZ857gDsebSuteSq7bRreBg8x7Y3cvyTTPT3uxmHg9AYYhuNKoUjIDrc_bV9pfJ79asP-v4Zn8rqGUatOh6sHnUNCam2UOHAwc79O8dPdqoQ5q3KbCWcCKaaM27f3dOPfuVapbF87e2npfpY8w8PcSEOIf0MdBzj-gXg7L-5XOMFiKO5gr_jyWjgv2HUqg11lKQvYthZy0lC9yxTLKX__2w7DDRxH3i9XbX8Uj-o-4v50TFM3ewxc-RFVKelVplmfF5GRV-ssY_P9w-HujYp2EBxS_06-uODNTkd_uZTN_hhx_QSM8CbErApvvN02d7uqqksq0U-PvhnFmGHRFAHlmBr3lBJqkUfiXSZn-hCwk2qsfyXbBgk7oJM7cuzZ28LbjXMly9gWRcbtGkK1psxqw96bMnVFMrBZQvCyet1nkn95eITJ3bxUIytsl_pvKWDlcCqM2t5IJ063sN0bXW9knyXG-F7WwrP8JZEbePpnb8j4ch0U8nuBmHXFe61b1cdh8ZyMtRzEi595XEsTjyXaDfrvBhEz6mJLQedlyaXsutaHKLMuG55exJ2G4j93tX4miOApCP_ACzx0-0OBtUR6RpDu4AJH5Avi_mVlfQHolCjnVVFjrb216e6iBHT8KA2__-IHp4U08TGMuM2qaVRG3BQjLYrcDB1PT7lTDfhC6tbpC0RJ28u8_EotSWvzlHoklQV_O-H7NdCMjvKYaT7BMm2A01vs7FlF03uxrDIKGi0S597pmaypWkI8YIskAOnQ7CCdthEjoajUyZeV74WQf0rqzReyFLWxFjXUwjUhizY0zAdhP9nwgOg_ipt843FJU2DEG3dyxB0PCPPc6RDQhQ9JGIHStIN8nL252scZbVtph_Hg4ENkfKAlcxyTZdXS7GdWw33i_39h3_XxvO6Junlb3ez2Thu834vCjYI9Q4j_vilEwa9-haeZETDOblj3zIY2Z0CyHZlfkI1WMprx1qX9e_XbvNnXaWyXd4BQwxQXlGnAlNTPsETAr8EbWCldKrhQtca1BYy1LwFmtjSxbR67FExM5LiFbU8F06Wb0J1plzUoelgo_FlI9DLdQuxrsP2XlTk2ZIXKOyDmGrxk0L19gRKZUASJTrJssxqq3ldvd79fX08X_fdsWww-2v-5n7StsJbamuXzC6caAxlTJWuRu12par1abbutlL2r04jcdN3ujibvGw4sMLs_bXgcQpZ5D5Hknuj2_DiEad4i-5TqAKPNeQrRHqbsOITolo6NXb__sZX_CbKg61ik6tx8XxxEOJt_xKVynCevjgZam4PB1WuR9PD-iuh6e4kXNvRLPD9DT8ynM7aTuHi1LAVj37iioFGgQRuMxplXF2zOzGl8czNVtLHNROtgeGYBxz3hvqTKMcr712Q7Y87FHsBdgL8RehL0Ye9u58J9AK8yhMFhB_ocUPewF7YDmCiDHawvapAc9oLwFunPx_iCmonv22gKVLD8wGhkCKbZaP0NVBEMgF8O7UwG2w0VDoFpDC-iCfWPzHcg_uEwpf06OxTPZA2KC2Rkrb2aSFqh7kHkrmZYCcpxu7Ig9EFxspT2TwlAmQGH5CKrg8mlHddYBuZcNcCblA9vTNaZboCthFG0Tuz3q03SL6Y4Kd-ibK2ss313WjL9YRVFuM-995rOt3hdOB8-hsvTY9v7p-c3i_uq3f-wda_Ap_xzkk2BCP8FnP55EXhKFUfJp_RlSL0ijLJ3kceIlaZAlASkKyD0vTfwQik_sc3uE2pgQPwmSEfGLANIoGk-8IAavQKEHJWV8ZCflkVSrT-7Eu89xnPjkE6cpcN0dpefmaXd6nvrs5vC0XmkUepxpo3cIDDPcHb_nOkQXKDofzuXRRf8gh6c146fO1vtUK_75xBFu7brcXlLhuLB1lWPkvwEAAP__7meEVw">