<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/135381>135381</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
flang-aarch64-libcxx bot fails to build after flang-rt was added to the build
</td>
</tr>
<tr>
<th>Labels</th>
<td>
build-problem
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
DavidSpickett
</td>
</tr>
</table>
<pre>
Since flang-rt builds were added to the flang-aarch64-libcxx bot it has been failing with:
```
FAILED: flang-rt/unittests/Runtime/RuntimeTests
: && /home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/./bin/clang++ --target=aarch64-unknown-linux-gnu -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -O3 -DNDEBUG -Wl,--gc-sections flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/AccessTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Allocatable.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/ArrayConstructor.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/BufferTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/CharacterTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/CommandTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Complex.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/CrashHandlerFixture.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Derived.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/ExternalIOTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Format.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Inquiry.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/ListInputTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/LogicalFormatTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Matmul.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/MatmulTranspose.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/MiscIntrinsic.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Namelist.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Numeric.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/NumericalFormatTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Pointer.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Ragged.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Random.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Reduction.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/RuntimeCrashTest.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Stop.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Support.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Time.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/TemporaryStack.cpp.o flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/Transformational.cpp.o -o flang-rt/unittests/Runtime/RuntimeTests -Wl,-rpath,/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib /home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib/libllvm_gtest_main.a /home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib/libllvm_gtest.a /home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib/clang/21/lib/aarch64-unknown-linux-gnu/libflang_rt.runtime.a /home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib/libLLVMSupport.so.21.0git -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib && :
/usr/bin/ld: flang-rt/unittests/Runtime/CMakeFiles/RuntimeTests.dir/AccessTest.cpp.o: in function `createTemporaryFile[abi:cxx11](char const*, (anonymous namespace)::AccessType const&)':
AccessTest.cpp:(.text._ZL19createTemporaryFileB5cxx11PKcRKN12_GLOBAL__N_110AccessTypeE+0x194): undefined reference to `llvm::Twine::str[abi:cxx11]() const'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
```
The theory is that this is because the host compiler includes libc++ and uses that, but the stage 1 compiler does not. So it's mixing libc++ stuff built by the host compiler with libstdc++ things it has built as part of the runtimes.
https://github.com/llvm/llvm-project/pull/134990 aims to fix this by passing on the LLVM_ENABLE_LIBCXX setting to the runtimes build.
The theory is sound but the bot still failed:
```
FAILED: flang-rt/lib/runtime/CMakeFiles/flang_rt.runtime.static.dir/allocator-registry.cpp.o
/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/./bin/clang++ --target=aarch64-unknown-linux-gnu -D_DEBUG -D_GLIBCXX_ASSERTIONS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/tcwg-buildbot/worker/flang-aarch64-libcxx/llvm-project/flang-rt/include -I/home/tcwg-buildbot/worker/flang-aarch64-libcxx/llvm-project/flang-rt/../flang/include -I/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/runtimes/runtimes-bins/flang-rt -stdlib=libc++ -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -fdiagnostics-color -ffunction-sections -fdata-sections -O3 -DNDEBUG -std=gnu++17 -UNDEBUG -fno-lto -fno-exceptions -fno-rtti -funwind-tables -fno-asynchronous-unwind-tables -U_GLIBCXX_ASSERTIONS -U_LIBCPP_ENABLE_ASSERTIONS -MD -MT flang-rt/lib/runtime/CMakeFiles/flang_rt.runtime.static.dir/allocator-registry.cpp.o -MF flang-rt/lib/runtime/CMakeFiles/flang_rt.runtime.static.dir/allocator-registry.cpp.o.d -o flang-rt/lib/runtime/CMakeFiles/flang_rt.runtime.static.dir/allocator-registry.cpp.o -c /home/tcwg-buildbot/worker/flang-aarch64-libcxx/llvm-project/flang-rt/lib/runtime/allocator-registry.cpp
In file included from /home/tcwg-buildbot/worker/flang-aarch64-libcxx/llvm-project/flang-rt/lib/runtime/allocator-registry.cpp:9:
/home/tcwg-buildbot/worker/flang-aarch64-libcxx/llvm-project/flang-rt/include/flang-rt/runtime/allocator-registry.h:14:10: fatal error: 'cstdint' file not found
14 | #include <cstdint>
| ^~~~~~~~~
```
This makes sense given that libcxx is not in LLVM_ENABLE_RUNTIMES, and the stage 1 compiler has no way to know the other host compiler exists in this particular bot's setup. Which is...
* An llvm release package is copied into /usr/local/ and "cc" and "cxx" are setup to point to clang and clang++ in that package.
* The library directory of that package is added to ld.so.conf. This means that libc++ is not installed system wide, this is important.
So what can we do to fix this?
I think the PR itself is fine, but the bot needs to be updated to work with it.
We need to:
1. Not test flang and flang-rt using mismatched versions of libc++ and/or libstdc++.
2. Not hard code compiler paths into llvm-zorg, which would be a major pain when we come to update the host compiler.
Some routes we could take...
## Pass the include and library paths to the stage 1 compiler
```
cmake -DLLVM_TARGETS_TO_BUILD=AArch64 -DLLVM_INSTALL_UTILS=ON -DCMAKE_CXX_STANDARD=17 \
-DLLVM_ENABLE_WERROR=OFF -DFLANG_ENABLE_WERROR=ON -DBUILD_SHARED_LIBS=ON \
-DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_LIBCXX=On -DCMAKE_BUILD_TYPE=Release \
-DLLVM_RUNTIME_TARGETS=aarch64-unknown-linux-gnu \
-DRUNTIMES_aarch64-unknown-linux-gnu_CMAKE_CXX_FLAGS="-I /usr/local/clang+llvm-19.1.7-aarch64-linux-gnu/include/c++/v1/ -I /usr/local/clang+llvm-19.1.7-aarch64-linux-gnu/include/aarch64-unknown-linux-gnu/c++/v1/ -L/usr/local/clang+llvm-19.1.7-aarch64-linux-gnu/lib/aarch64-unknown-linux-gnu/" \
'-DLLVM_ENABLE_PROJECTS=llvm;clang;mlir;flang' -DLLVM_ENABLE_RUNTIMES=flang-rt \
'-DLLVM_LIT_ARGS=-v -vv' -GNinja ../llvm-project/llvm && \
ninja && \
ninja check-flang check-flang-rt-aarch64-unknown-linux-gnu
```
Note that:
* We must specify LLVM_RUNTIME_TARGETS to be able to pass custom options into the runtimes build.
* Doing so changes the check target name for flang-rt.
This works but we would have to hardcode those paths, or put stable symlinks in our docker image and point to those. Which is not ideal as it's one more step to reproduce outside of the container for what is, in theory, a pretty simple build.
## Build the runtime with the host compiler instead of stage 1
We have to build clang to build flang, but we don't have to use the just built clang:
```
cmake -DLLVM_TARGETS_TO_BUILD=AArch64 -DLLVM_INSTALL_UTILS=ON -DCMAKE_CXX_STANDARD=17 \
-DLLVM_ENABLE_WERROR=OFF -DFLANG_ENABLE_WERROR=ON -DBUILD_SHARED_LIBS=ON \
-DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_LIBCXX=On -DCMAKE_BUILD_TYPE=Release \
-DLLVM_RUNTIME_TARGETS=aarch64-unknown-linux-gnu \
-DRUNTIMES_aarch64-unknown-linux-gnu_CMAKE_CXX_COMPILER="c++" \
-DRUNTIMES_aarch64-unknown-linux-gnu_CMAKE_C_COMPILER="cc" \
'-DLLVM_ENABLE_PROJECTS=llvm;clang;mlir;flang' -DLLVM_ENABLE_RUNTIMES=flang-rt \
-GNinja ../llvm-project/llvm && \
ninja && \
ninja check-flang-rt check-flang-rt-aarch64-unknown-linux-gnu
```
This is basically a standalone build of flang-rt (where you point cmake at flang-rt itself, not llvm) but with more steps. It does work but I'm not sure we're supposed to be doing it this way.
With the way our container is setup, "cc" will be clang and "cxx" clang++. So I'd be fine putting those into llvm-zorg as those names are stable.
## Change the builder type and build flang-rt standalone using host compiler
Unified tree builder doesn't seem like it would accept an extra step easily, but flang-aarch64-out-of-tree uses out of tree builder which might. We end up with a bot that is unusual in 2 ways (out of tree and libc++) not one, but it's easier to fit into llvm-zorg.
Or we look at making it an annotated builder where there's total freedom. It's a bit much for a theoretically simple change though.
# Add libcxx to runtimes (which does not work)
This one does not work, at least for our goals.
```
cmake -DLLVM_TARGETS_TO_BUILD=AArch64 -DLLVM_INSTALL_UTILS=ON -DCMAKE_CXX_STANDARD=17 \
-DLLVM_ENABLE_WERROR=OFF -DFLANG_ENABLE_WERROR=ON -DBUILD_SHARED_LIBS=ON \
-DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_LIBCXX=On -DCMAKE_BUILD_TYPE=Release \
'-DLLVM_ENABLE_PROJECTS=llvm;clang;mlir;flang' -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;flang-rt" \
-GNinja ../llvm-project/llvm && \
ninja && \
ninja check-flang check-flang-rt
```
This does give stage 1 clang a libcxx to use but the tests end up compiling against a newer libcxx than they would find when trying to run:
```
/home/tcwg-buildbot/build-llvm/runtimes/runtimes-bins/flang-rt/unittests/Runtime/./RuntimeTests:
symbol lookup error: /home/tcwg-buildbot/build-llvm/runtimes/runtimes-bins/flang-rt/unittests/Runtime/./RuntimeTests:
undefined symbol: _ZNSt3__113__hash_memoryEPKvm
```
You can fix that with LD_LIBRARY_PATH, but doing that in a bot config is a maintanence problem.
```
$ LD_LIBRARY_PATH=./runtimes/runtimes-bins/libcxxabi/test-suite-install/lib/aarch64-unknown-linux-gnu /home/tcwg-buildbot/build-llvm/runtimes/runtimes-bins/flang-rt/unittests/Runtime/./RuntimeTests
```
Even if we could get the tests to run this way, we now have tests using 1 version of libcxx, and flang using another. If we actually find a real bug, that's one more dimension to deal with.
So I do not think we should pursue this.
# Recommendation
I think we either:
* Tell the runtimes build to use the host compiler, assuming this is not massively against the spirit of the runtimes build. We could also do this as a short term fix, even if it is not a great idea.
* Change the builder type and add a step building a standalone flang-rt.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsW1tz4ziu_jXKC0ouW0o6nYc8KL70-IxzKcd9srMvLlqCLE4oUsuLHe_D-e2nQEq2c-m59Lp3zqnaqaluRSJBkAA-fADTzBi-lojX0cVNdDE6Y85WSl-P2IYXjw3Pn9Has5UqdtePXOYIpWByHWsLK8dFYWCLGoEVBRZgFdiqG8GYzqtP57Hgq_zlBVbKArdQMQMrRAkl44LLNWy5raI0i_pZ9Knf_t_PJtl0Nh5FabZfLkomTnJr0VgTJZO5k5bXeHha0AcgMWkGUfIpSj5BlEwq5QfZfLuOvcIrRaK2Sj-jjpLJR7pGycQPjZJJj565jJJJTgOj5CZKbiCOLdNrtFE66mY6-SzVVsaCS_cSr6WDuHyYDiEupYoN1kxansdcWtSNMtxyJSEuN9zwFRfc7mIuBZdo4ooXBUqIn1BrpaN0VDCLMe3w6J2Ta8d0gUXMNowL1sqQuIX4iQlBQ1-sZhA_SRU76QwWccM0q9Gihvhpq7nF2FjN5dpA_JQzY-N_OEYza24Ml-u45CiKmEtuORP8n6hpIK8bwXNu45IJYSut3Lqi-WqDGovYbLnNq7jAkjlhw_JS4UuOjY3trkH_SsYbrq1jIi6sInUKFGgx_uCLces1GhuTfM0Lmh-0jnMlN6iNP0jSWSAr6D2XBUrLwgk_5ZYVcc12K4ydNK5plLZYQFwWnK2lMpbnJs6VoMXK0smc5sUG_d-GxjHLjn6-TyEe3Y3GN1-_QPwkomQYx-v8MOB33XV4y55xwgWaN77bKzg5ZJbnaAy96eVN01MnkCiEypllK4EnE6k12w2VNFa73Cp9Krk3rixRn3Lzw4ppltsTC1V1zWRxYpGNwJeTidPMVD8xWQjUE_5inT6Z7Ueo-QaLU4kbv1jUkonp_SmPc6J0zU4mbSr_4bjenUrcjBs7lY2zp9zxTK15zkTY-CkF3zJbO3FaaQvNpGmUOZlT3nKTTyUlBsPzUwm9YzUKfrqTvHM16hOqF8T9CJs_KM9UTiVuztbr0yHGnMlC1SeThoXzuftkAsMrj8CntMmjVc3JZAUidCpxC16fLJIXWDdKM717tCx_PplUApzSxwlXknVwFv8B0a_qi5by6YbZKkqG_3qBIfjqBGWK4KvwpxCbermmTSxrxmWP_RjhJ5Tb1lWTZLB_9c2aKozwYpfa9nSwzGk3OZv9920XHkb1kkGvv-b2leFJoecTWj_UqqEGTibO6H3RKYo_VAL_2ZqChHIJXbkD0ad-rpFZ3AcfCYsubtiKR2mWv7wMBtHFKEo-5xXTkBPxj5IsSoYQJZ-ZVHJXK2dAshpNw3KMkivaT5q1K1Ph1876RN-Sy7Dd14rRu-Rzz-KL7S3_PhtcfaDUzYXX5uHnfP7z3SBZfpnd32Sz5fJuORj0D6uNo-Sm_zK4Og-agJMFllxiARpL1ChzBKto4-TUQdfFlksMj8bqj3YfJVfdNi6jfnbUEqA12uI8A3IPpGPyVYLvdGDhGx2AL9xCrgqEAR2dMwjxhjQxiMDlhgo1riRp3c8kl78yEujdBYxVTYPeI4xbvZbee9M_ifrZokKwFSq9A27AVsyCrbihH1aYM1raVgiVMqRR3XCBGrjMhSvQALlq2-2gVZzBIINsvnLWTzWWrWkj-9mFQgNS2R48KuB0SgZq_sLl-liesa4s_Z4srHYfKOFPSvCVsUU3x1a-UdE1kPxcZqBh2oIqvYwWDUwvbL-ytjHeoyZRMllzW7lVL1c1RRWZPPwVN1r9ijmFVuOEiJLJID2_uuoD47Uhu5T8JRzbagcN840RUNIvSEixHN9lN7Pxcja9Gf7tb2DQWhrRNsI6lYIBex_ZxSgni_2JrpQFY7kQrVn_YGMsgJf-GA_ewaWxzPK8hQYWmgNKxxrX3Nh9lRPA6C9sn42WbZdltPwSjneZPT6O54vp_d0jvV0-LkbD5fD-7nGR3S2Wt9lwfn_0YXI_v83ev55Nb6eHt9Pv3-Mb9zkyRxtEP0h6r9f9fKKlOmN13nr0GK-4NEfLQ2xsQd6Wjo4C-j99zFP1MU_SlTS2iNKRp0tknsElxF-7b6VUsbAqPITttBKlirW1HOLSyS2XRewbhu0XZnYyr7SSypn4zfevH4bnVw-JDw8dQB5_ux1BfLv40QAW305-8BK94k0B8UO2kf8L7PbbKPJW1Y_Xj_rZVELJBXbMoIBSq_qvVCnNrvZc-UdB9-uXv6lSFaXZ4Jz-6PuszCwTByoYJZe5sQWXRIbCQUploaSsH_UzABicQ3RJPDrtsDxKh92cdBwGAYRBF-P_af_7iO9xAzV7RgMGpUFY8w3KQPzaOzju2RlR_2PuMv96t5jejh-J2hHX-5DaEe2SCrZsR-SGkrUfp2xFH1_RN3zhVCpzGYgTcTSeO8E0eOtckn7WNT14qnheATe9XkuNoiSDTAKZBzQKZAahYfkz6cIN5KrhWACXxNy7QokMQrzNqx4lSZ5HSbL_gcydANMY1iTdG8WlpQdPSfzIY3LC2yNr1-21ahFrE3xFZQgUXGNuicB56nkYTErub0JFQfVjrmTZg2AbZNIc7NGt19nEWCaoTjA7Y7GGLSc3HO45O6ciyDJp27N6VLAlUTmTsEUo1DFbjdJJGDX1zPnZ2-phDtwaFCWJo2LomMsT85SIhSe9KwTXUL72G6FoCpycd4s_oR8MVoVQHPTgTlmgyjTgoT_WPWtwnjbX3NTM5hUW0CY8Qwf4utKIkonSr8k_rZmEBSqmi1A-7b2NCnITfMKH9T-VXtPGtt65tsqJgvbDoGa_KhrOJWwr9IeWq9qXgWGz7yuR_VHXCFo5iybMIpmWPeOR46ZRksIDM8ZL6UKZTqHzmqBoWxm8ja9WzFFE5xTKEI98pC6y-Zfx4nG5uF_efJ3ORlE6yjIPat2IKbHg2Wz5dTGdPUbp6P4O4tHwNvt5vKTUTBR5lM1p4uASoosh4Uo7tYWBp_F8fj-nqZMJxKPJLLv78v4bifUqLB9_yubjEaX5dr0PpR7yfjf7fdlEX-Re3SB98cvDOEpH8xYFXstuEas7lt-sI_YzO5hbfnPs8nBek1n2heRGSRJP34NNBxje4wZXvUHv8ijLHLpVh3TS-nKUTDYDQqvTSP2tTtm7FWffveDvt-UIZduTppz32soP8_v_Gg-9nUK35SYsnN7UgusovWmrmcs33rFPTOloDyXvF5lNF8ts7q0VbyDebLygL3dc_srAF0tv0r1PL13XrRXnWy0fv8wrzJ_jgGpHz7G28bdP5F12vlMeYJjtuEsGTwi1MxZMgzkvd_CRa7doTFTb5y4CmNwZq2pQLXX30PeNbkOSwUgR9hoFecXkGgM--X1AqMJ91w5Kpfd43TsiFAT-xmeJLbZoWrGNV4bA2GOxrZRP1LYyhLyEss4SxJHWZlcLLp89H1BOQ6HyZ9TAawJAwsd9PvZiDqwgpMUCmQBmum6Skgi1onRu0WdzjY1WhcsRlLOGCqu2HZQraRmXqP3WfKrkXj2f4FHpnec70Gi0dgeGCkJ81ahpQf3GN9-ODjjkwo96Z8YiK0iBFt73ybI7stDIC8Rj_2Pr_cPulAslo-TS7id1nbpfyVlC66uNn__kjP9LOWN4f_swnY3nIW3s4Tf5HnFvheVHcv4t-PonAfSP4Sct8P0Quui618zwnAmxA0aBJgsmCBZCMKnyQDuj5PO2Qo2wU66FmRAhzB4GBUpM4Ud4E1rDVyEUKcz3YGN6MLWhw-0JMY2YRsll7ecZpxG2GCWXNNw1jTKBPK8ongmBedt-37JdR6I7GKGiiqDxAFm8rZHCDUtr_i0XguQd6pZDhXNUwfjmO2nmeS_xfILj0Jb2QP2aKxO4hvf-9ibUSuGXxV7B4NCnj1Ar0EmjBt8HY759vccxOtIjowTm_wong9SvkpdUzFmNB4F0ugH7DGINgj8jnVtIOyzPsbHAJISWoM8AyAwXuw48X5f7ytlYlbFfwd9fKBcuC46XDGVCzdeV7VFGRlmAa4Ltma-KbEgd4KQzjgnKHwmZzJB_HYtsyf4-8K-8Z6hDndXmMNKZTo_KNfvGGu2Z32tKBEKpZ_LVmj23HsQkMCmV9aXZYQvk41SIo5dvlWUCSo1YqJq81r9lsOIWapdXPiGykATRtqHU5r-8s7Jy6-rgAJAVRddEoKTbMQ0fYXSA3c2Pj41we9VFLLnBm89D2hWBtPW6kO-vFRPd1c2_OaX9P8xpPyIFREnSNsjSm_Dg7z_pOXR8Oym-KZZ8b6b4Pqr9jWzg_WrNN0cFdQDHI2cl-tR1OfzVeRfjAZAostiaEXkDBhK3qPeTK-a54q5FoJLLIvQOrN6113zayfc87NudSf8YtxeQf-DC5ZtX_r03N_1BCWLbKyU8crjmuA35Vyl0uHgPqpE2y7_fPdp0uRwM0uWyYqZa1lgrvRs__Lyp3xzlL8r5FlfobLE2K898vM2z-S_Lh2zxUwewIdMGwJYtfOdKlnztO3NQMy4tk_72v9FqJbB-d3GenL-Tno56v304h3BJJnQysXHcYtz29H6_gP5L7PMuosYblMDLQ4uLisND1ARn35MY32NDkGrbFip-UMj3g67B1_X3iKQMDz3BdhiTvn3cg6lflOXW-Vzk44yBptJv5dahC8reFIAFr1H6NawCXyWSZxyao1MolE85oQG6RTCV31XjtHHo93GU4OaYq7pGWYTfv3jVPN0iICdND7X7AoX4oOg-Ltdekx7avjGuDg4aiCxpVzNj-AaJzLYg5NuDDdf83W82tNUp0ZRgICaM8p1fEsjIw02ltAWLuqaIoVWxtSq33ZIM1hpZqK27LsFvsTtWFNDSLf_Nm-6Y5O37BmfFdVpcpVfsDK8Hl-fn6eckuRicVdfFxeVl0T-_TC5WKa4YKy_SpCivknI1-FReMHbGr5N-ctE_HwwG5-llOuix5FOByQoLlhbJxXkSnfexZlz0KBR6Sq_PuDEOrwfpRfp5cCbYCoXx_4QpSULMtAEeJUl0MTrT1z41rdzaROd9wY01B1GWW4HX3_xnSyXjwhzqdVZaPDRLYMvM63_-5EedOS2u__TvoPg9Gf9bKH5bm-vkfwMAAP__N5sQjQ">