<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58133>58133</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
co_await in a decltype expression causes clang to crash
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jacobsa
</td>
</tr>
</table>
<pre>
Here is a simple C++20 program that contains the expression `decltype(co_await 0)`, reduced from a more realistic example in a real codebase:
```c++
#include <coroutine>
#include <type_traits>
#include <optional>
struct MyTask{
struct promise_type {
MyTask get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
std::suspend_always initial_suspend() { return {}; }
void unhandled_exception();
void return_void() {}
auto await_transform(MyTask task) {
struct Awaiter {
bool await_ready() { return false; }
std::coroutine_handle<promise_type> await_suspend(std::coroutine_handle<promise_type> h) {
caller.resume_when_done = h;
return std::coroutine_handle<promise_type>::from_promise(callee);
}
void await_resume() {
std::coroutine_handle<promise_type>::from_promise(callee).destroy();
}
promise_type& caller;
promise_type& callee;
};
return Awaiter{*this, task.handle.promise()};
}
auto final_suspend() noexcept {
struct Awaiter {
bool await_ready() noexcept { return false; }
std::coroutine_handle<promise_type> await_suspend(std::coroutine_handle<promise_type> h) noexcept {
return to_resume;
}
void await_resume() noexcept;
std::coroutine_handle<promise_type> to_resume;
};
return Awaiter{resume_when_done};
}
// The coroutine to resume when we're done.
std::coroutine_handle<promise_type> resume_when_done;
};
// A handle for the coroutine that returned this task.
std::coroutine_handle<promise_type> handle;
};
MyTask DoSomething() {
static_assert(std::is_same_v<void, decltype(co_await 0)>);
co_return;
}
```
When [compiled with](https://godbolt.org/z/sG9ve59qs) `-std=c++20`, it causes clang to crash:
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: /opt/compiler-explorer/clang-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++20 <source>
1. <source>:57:57: current parser token ')'
2. <source>:56:22: parsing function body 'DoSomething'
3. <source>:56:22: in compound statement ('{}')
#0 0x000055952e63f324 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
#1 0x000055952e63d18c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3a8a18c)
#2 0x000055952e57af58 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
#3 0x00007f2119b57420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#4 0x00005595319d31c0 clang::CallExpr::getCallReturnType(clang::ASTContext const&) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6e201c0)
#5 0x0000559530d2f88c buildCoawaitCalls(clang::Sema&, clang::VarDecl*, clang::SourceLocation, clang::Expr*) SemaCoroutine.cpp:0:0
#6 0x0000559530d35877 clang::Sema::BuildResolvedCoawaitExpr(clang::SourceLocation, clang::Expr*, clang::Expr*, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6182877)
#7 0x0000559530d37e7d clang::Sema::ActOnCoroutineBodyStart(clang::Scope*, clang::SourceLocation, llvm::StringRef) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6184e7d)
#8 0x0000559530d382ad clang::Sema::ActOnCoawaitExpr(clang::Scope*, clang::SourceLocation, clang::Expr*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x61852ad)
#9 0x0000559530ab6223 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f03223)
#10 0x0000559530ab879e clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f0579e)
#11 0x0000559530ab898d clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f0598d)
#12 0x0000559530abd74d clang::Parser::ParseExpression(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f0a74d)
#13 0x0000559530a9a37e clang::Parser::ParseDecltypeSpecifier(clang::DeclSpec&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ee737e)
#14 0x0000559530ad35b3 clang::Parser::ParseOptionalCXXScopeSpecifier(clang::CXXScopeSpec&, clang::OpaquePtr<clang::QualType>, bool, bool, bool*, bool, clang::IdentifierInfo**, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f205b3)
#15 0x0000559530a5338d clang::Parser::TryAnnotateTypeOrScopeToken(clang::ImplicitTypenameContext) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ea038d)
#16 0x0000559530b6078a clang::Parser::isCXXDeclarationSpecifier(clang::ImplicitTypenameContext, clang::Parser::TPResult, bool*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5fad78a)
#17 0x0000559530b634db clang::Parser::isCXXTypeId(clang::Parser::TentativeCXXTypeIdContext, bool&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5fb04db)
#18 0x0000559530b4f998 clang::Parser::ParseTemplateArgument() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f9c998)
#19 0x0000559530b5996e clang::Parser::ParseTemplateArgumentList(llvm::SmallVector<clang::ParsedTemplateArgument, 16u>&, clang::OpaquePtr<clang::TemplateName>, clang::SourceLocation) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5fa696e)
#20 0x0000559530b59ccf clang::Parser::ParseTemplateIdAfterTemplateName(bool, clang::SourceLocation&, llvm::SmallVector<clang::ParsedTemplateArgument, 16u>&, clang::SourceLocation&, clang::OpaquePtr<clang::TemplateName>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5fa6ccf)
#21 0x0000559530b5a03e clang::Parser::AnnotateTemplateIdToken(clang::OpaquePtr<clang::TemplateName>, clang::TemplateNameKind, clang::CXXScopeSpec&, clang::SourceLocation, clang::UnqualifiedId&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5fa703e)
#22 0x0000559530ad3c54 clang::Parser::ParseOptionalCXXScopeSpecifier(clang::CXXScopeSpec&, clang::OpaquePtr<clang::QualType>, bool, bool, bool*, bool, clang::IdentifierInfo**, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f20c54)
#23 0x0000559530a5338d clang::Parser::TryAnnotateTypeOrScopeToken(clang::ImplicitTypenameContext) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ea038d)
#24 0x0000559530ab6a3f clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f03a3f)
#25 0x0000559530ac45ed clang::Parser::ParseConstantExpressionInExprEvalContext(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f115ed)
#26 0x0000559530a9c416 clang::Parser::ParseStaticAssertDeclaration(clang::SourceLocation&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ee9416)
#27 0x0000559530a8beef clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ed8eef)
#28 0x0000559530b36e0e clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::ParsedAttributes&, clang::ParsedAttributes&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f83e0e)
#29 0x0000559530b376b3 clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f846b3)
#30 0x0000559530b385d6 clang::Parser::ParseCompoundStatementBody(bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f855d6)
#31 0x0000559530b39992 clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f86992)
#32 0x0000559530a596a4 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ea66a4)
#33 0x0000559530a8a93f clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ed793f)
#34 0x0000559530a53cbf clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ea0cbf)
#35 0x0000559530a54c40 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.0) Parser.cpp:0:0
#36 0x0000559530a5c70d clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ea970d)
#37 0x0000559530a5dbba clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5eaabba)
#38 0x0000559530a4d3ea clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5e9a3ea)
#39 0x000055952f8b4975 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4d01975)
#40 0x000055952f1b9d21 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4606d21)
#41 0x000055952f13faa3 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x458caa3)
#42 0x000055952f29d1fb clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x46ea1fb)
#43 0x000055952be591d4 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x12a61d4)
#44 0x000055952be527cb ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#45 0x000055952efaa529 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#46 0x000055952e57b6c7 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x39c86c7)
#47 0x000055952efaa75c clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#48 0x000055952ef754a9 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x43c24a9)
#49 0x000055952ef75e9d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x43c2e9d)
#50 0x000055952ef8067c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x43cd67c)
#51 0x000055952be56f01 clang_main(int, char**) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x12a3f01)
#52 0x00007f2119605083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#53 0x000055952be5240e _start (/opt/compiler-explorer/clang-trunk/bin/clang+++0x129f40e)
clang-16: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Compiler returned: 139
```
I wouldn't be surprised to find that `decltype(<co_await expression>)` is not well-formed, but either way it probably shouldn't cause clang to crash.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW9ty4zYS_Rr5BSUV75cHP2jkceLdyXp25M3mTQWCoMyEIhWQtK39-u0GLyIokrYnnCSVXZctU8Tt9EGjcUACQRaerr_ngpM4J5Tk8eGYcLJZGB_g19DIUWR7QQ-keKQFYVla0DjN4Rsn_OUoeJ7HWUoWjhZylhSnI18YHst29JnGBdEWhg9JC2NDBA9LxkMSiewAzRwyaFBwmsR5ETOoispm4xTS8Da0FPKA5nxhrhfazUJrPqE2-csqgPVdw4xTlpQhJwtzwzKRlUWcQtmPQ-mIclcIAJiP5MiOBVhFk3Oy_MwLUbKC_HB6oPkvC7dunJD6PjB1iHOoGuonnWRSlyB7XuwEL0qR7rLgZ84K4AoYwrykuo-XeRGi0ea6tWP3SNMwAXM23SYQnMyHlO7qFFnjuniMc6TevVmYHwj-a6G0tedlfuRpuKPJMz3lwHxcxDTZ1bcHkfXrO9f6lMUhKdMKZ7jjL4xLCqtqoFAva80CXp9bgnpJv2JaFhmRzoQ9luZRJg5Qoia0wH6oC7dF2v5YYzEu-qmEBFmW1JWCr4WnS2MjmqDr9bhT-Hu9d-omzoy-p-zjgF34w2iScLGCgVce-O75kae7MEvRa2-gjHmRvzbotzqVbJb3-xJ_Bryh7eaGY8Ta6ecexNmwrUIOXZ-dBrxuAqnShOHUDF-UHszGe9mqEXLZSt0LtUciB80g3UgnXlUGr7qj2O9WpuCXX9QhEsXpxeBNs2oczjQ8utX9ycbJmKUd6ous8cPf6MBNW4P9_D67xzC92Yv6UWDUYzq3jFv4JQ8wf7cIAQipqiJYFXkGW12Yn7HK1cDU8QbTLpCdYV1a16ZU2NakqpZAsJdCowMURUhFA2gJHEHV8DnPxO_wnDqhgXIBq55kbrJtduDQVrq_jGF5QUG_7Giec1F0XTfOdzkFBp6g5Wqa25BRiQSBTYlXLKt1goJOFUBdpP_GXlvYH1h2OMYwAZPnuHhc2DfQ0GNRHHOEJLndZ2GQJcUqE2DL7X_gL__Of-K2_2suDXO0pbTghjX6r5ZvgJTRMuc5YQlN9-gxTND8cUyeVV8_f_q43n4keRkcoAJKgnIPvXfMRIEV9KAB5DJYgQnwJUmemn9L6LdKK93GeV7yHF0Euo40ek16CGIhAWW_gEpgHBGDNoWSDAQq8JFnpahuY0norYzFtIAEUcLcyER8LGof2hZQCQnLw7E1TYMk_3Mtg6nYg2OnKB3X6LAgFeGzJl4sQRMnIG0F3kOilhBrU9Aot0GcNvcqaslyHz5TES0tuCLLDCujxyNWWRbHsljlZHlAAshy-eI5S5oflvkJ5PcLdE-cFjwhyy2k7RlbFhCx2SMIc0iaxISZ85Qe88esIMuIZZCwDGO6TzPU4dBklGZLyaZ6u-cVKJJrThuJrCNLym1zbbvNB2GlEEAbOVIBQwW6_xd0WcNFx4dPWYUxVIUDH4aBVWBRGIQkKlOG4hImqvCEdSgjtK7LnK4LFhrIT1aCO-AY5tinRI5vt1a6FbZqRMLyQCPaiwY_tu3bBnfMyDQs8llAT0iXeUC_28Z7mIa_l4EF6Paqgb_GoVUl5St2RMfS5F9bt96rO9Q9RuQYqKT6Ka8uNgmnaXm8T6vaoIUyzeESHDnJ0Hi_MuHrvRJ-tReTehQQKOYbCkTbpZHtkQ06yhfOsicuTn3jgRkEpOTZwPqRvxTDLJh1E25k6Lof2K4FjrbDKbIA8DtR989tEgfwCWNi51jLJE7Ll-U-LauEY_GImmWVZytN2qJbUItiidWxxNT90NSZVkW1mmQQdh9haVt9gzUb3vgiw_FDHbzPmdfbh9omXBvnYLGDRsvrWfrC4YYGABUL7K4FWmhEHrhLUMZJuMnkrIKIcxXolh-oBLfp2vojFTcwKUkfVRK2cth8yhitlnFKomSndmuodtPMtcPd6qhoTdtzXdJHJq8-oAlfeJ4lT7wxpWrLeze0sbsobucaJ47uGWCM0jduz1qXu-GwtWtW3Kctdx8glkEgkSKim51l6HKvd885WmwLCEr7Lzya0UwLrFDM9HpmegadNnOsM99q37D7zWSeDegV83zFPBo4hmF2IXyWs1jnekNzaV31PEy1sZsZ88nvf4_T8OyPzf_--OwWxeCDxbc4XV0WnY0PO9JMMLflA-cnrceH5_r82_Lxx5Ngg40KCXqfBN8LJ0lY5zg5o7J4CxU90-azA2Aqdhg9O0LXmrbjj0RPAZyC3lTR-xRC7CT6m3rVtT1yFkcx70UgTMakeuaeBTbnLqBSYFsqbJgGg-mIcl8_g9789JMMkiPwu8mX8eP-SH8t-edC4GPx8-1_ljR5qJ-oXYyhzlgaHI53ITi0RHKXRpnMt74sPZcDGBoQpTCpqh9qm-b4MHwQp3WaZuiTaO-9kFw94OJDpfHucExiFheYK4V1ey3q5vMIqpm9YajqosDRXI-O2RHn0M_oqVTIGXHEGUatGI-nn0FvlUnxTUIoDcEkxWa3Z7NphcGkzWjJXTgRdsAXgZEn3ubt2NzOqXMZFGiAVzFI1UGBFfm-NzmsHzj0Ebjjun6O0DxSmgWfz6B5BZ8qZALb953paNnH9ynGRY3XkZcHWFz8yBmsydSgIouHl_ZtiO6UMtK8MTo1VfyDHpoINSENZ3NWB6jpcmdofe4Yi97E3V24jgouFDsMbyCU9m1xekp-PqoHW_qKrpiPbSBTYVvvsQ0Bc9RT25jeEj4Q0r_Ku7qpjSR982w7uWr5V_orzLoYtEMMaM63mzKpC9Qp3Bp98cFs6__i4y3iA4hSmDT_GuLDsPoLXGpOx7a_2AIXzFX46IlKZtl8ek20wSd8tLuyu0vx-uMTjJqm_37nxZKuA2rFLKe3WGIWyM4ps7byfdZavs7q6M3pJ3BzLpx8QKiYoEpG6gWcT3vqKOwmIRPDuvi1ObKadddFIeKgLPBF1Ptz9NuYz6l56HGuOnVPnJoO16bF37Z5E3IvOixKMdM16i1qcFscijo2m8awJrloPsRCb-ub_gPDr-ybuUaeZwK1Cvc94W26zivr_WHu_yxkz0aU5ajLebOnsk3PDqdD1KZ-b9cSho_OW309G1AbcChAewLV9H3fmAR6W7-n7APthaQRZ1Z8o3pKPqfDOoBeMa-nEW3fodMasTHvhkdy8-CQKojT_TnqvsUpW0UP6q7zRm201CfIex7Z1WJ1xphKHWBBoaknAD3qvyKc0P7vRFYeR9kZVs-vzVZfNdeM8nibiS-QALzH8zIYur4qtUyrL6FZ8DqD96LjbnfAh6jef797CpjkfM1wv0hnsTOfAAcjFRb6TzEtZmlvlTUKGaNj751c9L1jmIvVkYoCX637pEJ4-c4XrevpTpu52muvGKouHRVvX2fRbP3ngwFK__VkqR0GwejT2-rhUHb8xJ94UoX8NzyoaAMHvsodfKbTvmP9IQvLhMMyMhPNmmJGTU4p2KYYrwpLaoUmvzR-vX0Y3YLwTZbr3KeAQwHaVWFG5AWW79rK85ws5N_xdC0HU3Xr4wtn4GD1rfmezlqhpkPrXXiWsqco0gM_NPQuvFuBoT8NB_DNiczRHGhYQaaryMyIUlMlrmrrTq6CGR_mbtyU-fzTsj0G4BT0ymalyPBDPVJeM9Q4z0Y8tZOkN2XkfCHFcjgFUArqrrQwAm77eggKjOm7A-7s6y4E1kLQkwwLG_ZIRSOU1s3zTOUe3OjsQ5sDvG5QB7Ap4K0eeMNlAWl43ugPcqAPr2Xw8degJdJHQhE_jUwzVncSNTj4qA0F5Mbtc0PNbsGdkHzJ1OaAQH2eALfy497RXZSqIbhqu3aGjQ7-cKBp2B-Hg_1yvnnfHibaDG3SQRCy19qtw7sde3nR9epLQPOY7XKZvSZJyYw32sNMVXKvOjAOvbtaM9bpmKXz3HTd7lmriiwMN6GHIKRyE2TDFVhabzL8WxYMd4ijdIjtBg5zO30xtBewSvlSplsa8eSk8Dndd3PtdvSZBzAVb3b7juXajPxPO0ZP_I16gKcy59oW9UeZkz1GL-a2hk4lGPcKYoaxBeJE1rUiQObcqGmZzABbFTfy-2RwP3wvGcB0Ps4EpOKiV2FiKsi2nX-kMfZ7nPbXlZPk1R7yDSkEhroU2uq268jTHHd0JN50rpUpfmBuH6P-d6RwJiVhshA4UUjTe5OxE2m1rmy0RANaRo31vNrAhNYUOI0cqzZ2O5qteSbZ7ZI4wAAGMUWiesPubob7uh3ZjmFBJUorffkEOTip6p_JMj-yOk95qzI6nikgXAgMo-v6dExUi108YyB7P6LtsRzCX_AwDSw8iG5Kzsuck-UTnojJOR6BPovRuqVGh7Ynn7AlKDxxIuiOPGdlEkIdbkECTvJSHEWMR2Gqw4JhdZRKPbctz07X55LOh7vr00mOhgfE06wgzzxJlngQl1cv-ErIDYYBvmd6wpNCR5EFNEhOJH88g5DHh3qnh1ZX_Fp3HMuzdM1wr8JrM_RNn14VcZHw6xaLPBXe4OweOx88knRViuT6688W2Z5umleP1y6seQw9jHyXWbZmGTbVfN_VQCmYDB_-XiU04El-vbDBPYyUPxNZBVwv7Jur-NrQDEPXNBNjmOGuDDOkXhgYEb6FCbm_AFcCr09WiAPPY12JawkpKPc5JOLB-PycSOVWUs5lc1A_LYvHTFz_TBlMD_RKNn0tof8X1QKA1g">