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

    <tr>
        <th>Summary</th>
        <td>
            [llvm-cov][MC/DC] "Branch not found in Decisions" when handling complicated macros
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            tools:llvm-cov
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

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

<pre>
    Example file `perfmon.c` (It currently looks tedious and should be able to be further minimized, I'll work on that)

```c
// A example simplified from https://elixir.bootlin.com/linux/v6.8.1/source/drivers/iommu/intel/perfmon.c
// Reproducible with clang version 18.1.3 (git@github.com:llvm/llvm-project.git
// 2498e3a07f3df2272fec885f53f09ae13214ca38) and Ubuntu clang version 18.1.3
// (++20240322073153+ef6d1ec07c69-1~exp1~20240322193300.86).
//
// Note that assertions *might* have to be enabled, therefore prebuilt packages
// from apt.llvm.org etc *might* not behave the same. E.g. as of Mar 28,
// llvm-cov-18 from apt.llvm.org ends up with "Segmentation fault", llvm-cov-19
// doesn't fail at least explicitly. On the other hand, if we build LLVM from
// source and enable assertion, we can observe explicit "UNREACHABLE executed"
// messages.
//
// Steps:
//
//   $ rm -rf a.out *.profraw *.profdata
//   $ clang -Wno-c23-extensions -fprofile-instr-generate -fcoverage-mapping -fcoverage-mcdc perfmon.c
// $ ./a.out
//   $ llvm-profdata merge default.profraw -o default.profdata
//   $ llvm-cov show --show-mcdc -instr-profile default.profdata a.out
//

// Dummy definitions to make this file compile.
// (Some of them are also kernel code but incomplete or modified)

struct attr {
        long config1;
        long config2;
};

struct hw_perf_event {
        long idx;
        long config;
};

struct perf_event {
        struct hw_perf_event hw;
        struct attr attr;
};

struct iommu_pmu {
        long filter;
        long cfg_reg;
        struct perf_event *event_list[100];
        long num_cntr;
        long used_mask;
};

long test_and_set_bit(long, long) { return 0; }
long iommu_pmu_validate_per_cntr_event(struct iommu_pmu *, long, struct perf_event *) { return 1; }
void clear_bit(long, long) {}
void writeq(long, long) {}
void writel(long, long) {}
long iommu_config_base(struct iommu_pmu *, long) { return 0; }
long variable_ffs(long) { return 1; }

#define UL(X) X##UL

// Actually copied from kernel source

#define BIT(nr)                 (UL(1) << (nr))

#define ffs(x) (__builtin_constant_p(x) ? __builtin_ffs(x) : variable_ffs(x))

#define dmar_readq(a) readq(a)
#define dmar_writeq(a,v) writeq(v,a)
#define dmar_readl(a) readl(a)
#define dmar_writel(a, v) writel(v, a)

#define iommu_pmu_en_requester_id(e)            ((e) & 0x1)
#define iommu_pmu_en_domain(e)                  (((e) >> 1) & 0x1)
#define iommu_pmu_en_pasid(e)                   (((e) >> 2) & 0x1)
#define iommu_pmu_en_ats(e)                     (((e) >> 3) & 0x1)
#define iommu_pmu_en_page_table(e)              (((e) >> 4) & 0x1)
#define iommu_pmu_get_requester_id(filter)      (((filter) >> 16) & 0xffff)
#define iommu_pmu_get_domain(filter)            (((filter) >> 32) & 0xffff)
#define iommu_pmu_get_pasid(filter)             ((filter) & 0x3fffff)
#define iommu_pmu_get_ats(filter)               (((filter) >> 24) & 0x1f)
#define iommu_pmu_get_page_table(filter)        (((filter) >> 32) & 0x1f)

#define IOMMU_PMU_NUM_OFF_REGS                  4
#define IOMMU_PMU_OFF_REGS_STEP                 4

#define IOMMU_PMU_FILTER_REQUESTER_ID           0x01
#define IOMMU_PMU_FILTER_DOMAIN                 0x02
#define IOMMU_PMU_FILTER_PASID                  0x04
#define IOMMU_PMU_FILTER_ATS                    0x08
#define IOMMU_PMU_FILTER_PAGE_TABLE             0x10

#define IOMMU_PMU_FILTER_EN                     BIT(31)

#define IOMMU_PMU_CFG_OFFSET                    0x100
#define IOMMU_PMU_CFG_CNTRCAP_OFFSET            0x80
#define IOMMU_PMU_CFG_CNTREVCAP_OFFSET          0x84
#define IOMMU_PMU_CFG_SIZE                      0x8
#define IOMMU_PMU_CFG_FILTERS_OFFSET            0x4

#define IOMMU_PMU_CAP_REGS_STEP                 8

#define iommu_pmu_set_filter(_name, _config, _filter, _idx, _econfig)           \
{                                                                               \
        if ((iommu_pmu->filter & _filter) && iommu_pmu_en_##_name(_econfig)) {   \
                dmar_writel(iommu_pmu->cfg_reg + _idx * IOMMU_PMU_CFG_OFFSET +       \
                            IOMMU_PMU_CFG_SIZE +                                \
                            (ffs(_filter) - 1) * IOMMU_PMU_CFG_FILTERS_OFFSET,  \
                         iommu_pmu_get_##_name(_config) | IOMMU_PMU_FILTER_EN);\
        }                                                                       \
}

// Part of https://elixir.bootlin.com/linux/v6.8.1/source/drivers/iommu/intel/perfmon.c#L408

static int iommu_pmu_assign_event(struct iommu_pmu *iommu_pmu,
                                  struct perf_event *event)
{
        int idx;

        iommu_pmu_set_filter(requester_id, event->attr.config1,
                             IOMMU_PMU_FILTER_REQUESTER_ID, idx,
                             event->attr.config1);
        // iommu_pmu_set_filter(domain, event->attr.config1,
        //                   IOMMU_PMU_FILTER_DOMAIN, idx,
        //                   event->attr.config1);

        return 0;
}

// Dummy main

int main(void) {
        struct iommu_pmu iommu_pmu;
        struct perf_event event;
        iommu_pmu_assign_event(&iommu_pmu, &event);
        return 0;
}
```

Steps to reproduce:

```shell
rm -rf a.out *.profraw *.profdata
clang -Wno-c23-extensions -fprofile-instr-generate -fcoverage-mapping -fcoverage-mcdc perfmon.c
./a.out
llvm-profdata merge default.profraw -o default.profdata
# Crash
llvm-cov show --show-mcdc -instr-profile default.profdata a.out
```

Message:

```text
Branch not found in Decisions
UNREACHABLE executed at /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:784!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llvm-cov "llvm-cov show" --show-mcdc -instr-profile default.profdata a.out
 #0 0x000055cfdb4bf61f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Unix/Signals.inc:727:3
 #1 0x000055cfdb4bd30f llvm::sys::RunSignalHandlers() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Signals.cpp:105:20
 #2 0x000055cfdb4bd666 SignalHandler(int) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/Support/Unix/Signals.inc:413:1
 #3 0x00007f0aefc5e520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f0aefcb29fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007f0aefcb29fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007f0aefcb29fc pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007f0aefc5e476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007f0aefc447f3 abort ./stdlib/abort.c:81:7
 #9 0x000055cfdb46736e (/users/wtj/have-been/llvm-project/build/bin/llvm-cov+0x45436e)
#10 0x000055cfdb55527f (anonymous namespace)::MCDCDecisionRecorder::processBranch(llvm::coverage::CounterMappingRegion const&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:784:5
#11 0x000055cfdb55b030 llvm::coverage::CoverageMapping::loadFunctionRecord(llvm::coverage::CoverageMappingRecord const&, llvm::IndexedInstrProfReader&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:879:5
#12 0x000055cfdb55c260 llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#13 0x000055cfdb55c260 llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#14 0x000055cfdb55c260 llvm::coverage::CoverageMapping::loadFromReaders(llvm::ArrayRef<std::unique_ptr<llvm::coverage::CoverageMappingReader, std::default_delete<llvm::coverage::CoverageMappingReader>>>, llvm::IndexedInstrProfReader&, llvm::coverage::CoverageMapping&) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:933:71
#15 0x000055cfdb55c8b9 llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#16 0x000055cfdb55c8b9 llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#17 0x000055cfdb55c8b9 llvm::coverage::CoverageMapping::loadFromFile(llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::IndexedInstrProfReader&, llvm::coverage::CoverageMapping&, bool&, llvm::SmallVectorImpl<llvm::SmallVector<unsigned char, 10u>>*) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:992:66
#18 0x000055cfdb55d35a llvm::Error::setChecked(bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:307:22
#19 0x000055cfdb55d35a llvm::Error::operator bool() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:239:15
#20 0x000055cfdb55d35a llvm::coverage::CoverageMapping::load(llvm::ArrayRef<llvm::StringRef>, llvm::StringRef, llvm::vfs::FileSystem&, llvm::ArrayRef<llvm::StringRef>, llvm::StringRef, llvm::object::BuildIDFetcher const*, bool) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp:1020:80
#21 0x000055cfdb2ad4c2 llvm::Expected<std::unique_ptr<llvm::coverage::CoverageMapping, std::default_delete<llvm::coverage::CoverageMapping>>>::takeError() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/include/llvm/Support/Error.h:603:15
#22 0x000055cfdb2ad4c2 (anonymous namespace)::CodeCoverageTool::load() /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:486:41
#23 0x000055cfdb2b118f (anonymous namespace)::CodeCoverageTool::doShow(int, char const**, llvm::function_ref<int (int, char const**)>) (.constprop.0) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:1143:3
#24 0x000055cfdb2b6d58 (anonymous namespace)::CodeCoverageTool::run((anonymous namespace)::CodeCoverageTool::Command, int, char const**) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:980:18
#25 0x000055cfdb2b764f showMain(int, char const**) /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/CodeCoverage.cpp:1348:1
#26 0x000055cfdb29908d std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() /usr/include/c++/11/bits/basic_string.h:672:19
#27 0x000055cfdb29908d main /users/wtj/have-been/enhanced-gcov/llvm-mcdc/llvm/llvm/tools/llvm-cov/llvm-cov.cpp:82:5
#28 0x00007f0aefc45d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#29 0x00007f0aefc45e40 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007f0aefc45e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#31 0x000055cfdb298625 _start (/users/wtj/have-been/llvm-project/build/bin/llvm-cov+0x285625)
Aborted
```

It somewhat looks like https://github.com/llvm/llvm-project/issues/77871 and perhaps has something to do with region ordering. 

cc @chapuni @evodius96 


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUW1tzo7i2_jXKi8ouEBfDQx4cYs9OVWemT9w9Z9d5oWRY2JoAYiSROOdhfvsuCTDgYMc903PZVakYg9a37tLSkqFSsl0JcIu8O-Td39Ba7bm4fd1DqfgvdVHdbHn6drs60KLKAWcsB4x8qwKRFbycJ8i3MCLBg8JJLQSUKn_DOefPEitIGa8lpmWK5Z7XeYq3gOk2B6y4vsxqofYgcMFKVrD_hxSRCD8gsshz_MrFM-YlVnuqEAmRdY-sZfvft5q_pP1O1ois8RJDK6NkRZWzjEGKM8ELvFeqkshpB0LODkzMt5yrnJXzhBeIrHNW1gdE1i_-PJjbiKwlr0UCiKxTwV5ASETWjBdFrT9LBTki694EQzGeoBI8rROm9Xxlao-TnJY7rEEYL7EdzO25o022Ywq51o6pfb01YjjLPH8x0uQvxawS_BdI1FwPGzIgbhiAQ61F5qQZIQuSQRIEXuY5mRVSsB1iuwl1AkRCY_qv27pU9aQUI1xEAkTuELkjFnEthxBr4dieg8gdZH5qQ2ItEj-c2b_BobJ_6wbZoeNY1jzwEQnnQ7wR9o9cgXElplKCUIyXEiOyLNhurxBZ4j196aICSh0iJhZ0dEDGBeBKwLZmucIVTZ7pDuQI3niZVmquDTfnYodBJSP8kiu8hYbLHrCkBczxar6bYyoxz_AjFVjrH41wjR8S_jKzgykeZSpxXTVORoRsYFdAqajWDme0zhUiRKvRw4Qj-JSDLBFZKJxRlmOqcA5UKgyHKmcJU_nbHP9UGoG5SZQ9LY1dWIZfAWuDpPjTp58fjXAj6CZ8jf8be_aG1wCvgBNaYr6VIF7gyFBr8fXHp9Uy-tfy7tMKwwGSWmlfkBF6AVJqJ5x3-EZBk3LnBmCMiItFgWciw3TOa818Oa8EzwR9PV6nVNEJuiaYZ_9b8llCnBkcFJTSBNUs02QshxkrpRKzHZQgqAI8yxL-AoLuYFbQqmKafnArSRM8ndCa3xyRtRFyQpYuWY2suACxA5yC8f9RnRkf3TqjVRcnerZ8xbOZ_mgka5VpVXuHhd_JNpovGx73dVG8aVJWsiYBFccFfdYZwWQzsSe8qFgO89OJYcML0Gmi9lBgKgDTXHL8DKKEHCc81cGoMCs1fQ4KMBe44KmZg09mb6lEnShMlRIYLe66R2HOyx1OeJmxnY2cyfukv7-4H4wZwO5fY-3FGF6gVO_xWXo4g_0x9BncScb71yGbocr638e8zFITV0X9XoWM5QrEey2yXSxgN8F2KDdZmos4Z1Ih7862LOTdv8Mq6yJOSvWeSS0hjQsqny9oYAYqkCqmZRpLUPGWKUQCfd9MhuYz1IphAaoWJbaQc4c1Ug9wNED8QnOWUgXavEaqRhdEgve2IsueQ4Qn9T9hbY9Yv3CW4iQHKs4LPR78KpiCX68emX8wcqB7E5bxlkr4UNePrPlCBdOLQJxl8ijBBTt06e-Y2QLw10-IBP_WJP9GxEHE-fppYoJZJqqmef6GE14da692jmjLqUn0u4cviASlMBNF90cCw9Q2cjoRciJ8HHRSDh6BGu0OhoQEcWwqBlZqU0pFSxVXx8fOGvfPh3TO8tRah0ss04KKWABNdQxQjTD8Mjn6GDIUkehFkxzvvCASnaXTwPmQS_4hl3ZEhHs2ecsG07M69bkHZSzg1xqkAhGzFJEAeifpcsl8x4j42DrYE6KMoFJeUFaOQTqcI5SzQs4K298AW1F5KtoZVPINqFTJqzCdb5J0B7HSoTVhyRNc91rcHahTJ7VLBBmBH28ebez3LLIsyz7kcvTfCP8SC4d8I4vOl5McBvAG0cmuwmw8ebXMZGj5ayQe-PQ6ww-tMuRwwufhp8fHr_Hnx6_xj18f45_W6_hp9cPmGI3u-fHd2HjzZfX5HcFZsvXDpy-rp_hp9T9fVxt99XDfUFoHy_6Q7P6nx-XDj0du1sEiH9J8Xm46Hg3JBaVakuWXzZAguILHD6v4i97OdES2daUlVr06zRrl2Fd4K1r_oD2wWX0ZCKorrYsU0Y9fnqLl5xGldQiuoFr9PEF3wZCabvPwf6uBdBesqEc35tic8PgwnrRY78Mw-GjR0SVjlzNBXNIC9HLV1kPmsnsa4VgX9PoTusddfnvdTl7Xz-Glv-NIK2RZ0wUJjtLMkLNq2JmEjUdzkL4zmuCb4qiVORgK1dZ5Y3bICsdr9YhtW9FjRO6MnrrkmwwzPeI9MrJCjPGE37vhUwbo6fTEZcqfgcqzbl0-leMkQEg0DTueOU-MdbQVRotoMhdJqLcaQ9jF_VWOPS1rTbX6mQqlt7R_enOQOJ9cKxhv8qhiCWbloKCPmz7sxc3N8Uvfpxroi6c3PC1gOEiHLto1_9GGuHswnYvjKiPCBllHqt7Tzrut-zvR8DgMp1YZEuEmkadIz7AJh7vT1qdnBO8Kl2tEblseFyRvF7oJmd_RXiF6SzvYu10K2qaHY7QZPNSObEszvdU8TjbjPkAfSn0cXewWNJEzGHI2WBHxh7Gp58Zj2A3oLyjZtfSHapkeIlYci7alDn1DcUwl95Dnzb1v6Cj-JU3Ek87hH2wWOjgSVO4HWH-4XThl-cemv3vO3AoOLfWdoGWyN931jNdlilmJ7yFhxozNkKl-MqbaN-taNnPnq_oFkfWevsBsC1Dqabjc0zKBdLZL-Et3IKJVa68HH2yLyPpzo-m9NhVZR61DBpePjbfmSVUhZ7kIXETakvbzp9Vys8Ky3hZMYYq39U4HHBdKh954dRic1Yzk6M5q9PwvZQ1aKdN7Z2WS12lz5pBoz-EtTZ6VoEnXY90omjzjtC6qo7WtObLCz4LvBC0wFbu6gFJpIfoGMSJk5H1EyO8NAIyIY2HrYFmW5XlJlm7dbebbmWGmZXKW8k02F58FK5WR-ItWAZGgHyToa8ylEkALUxpFen1ryoXv6OhNXWnXILL-WjK9Jm_YrqS5nLMy0Y4lC-QsnV4z-0Sz1LEmNXuqywbpX7RMcyNt8CcK30ndhKNtechZEqsXm5yK7fs-Hgmoq8W_3r6u7Wh5e0GdVtBFZlHIEg88YjU1dAt4CPzYd2emhJrtyrp5kMwln_uI3FkHl3jEOtYnGtMdY25JmCU4jiu1F0DT-JnlecyKKof-tE3PsmWlTOE1GDY3Mrs6MPwe37sGv1QgSppfRF4Exnk9sj-FPCS7CBeEJ3CLU-O6Cx_vpPGIQWouEVnPzbc3mUKl46Di0jhPUCbBYJu8GNggGEO77iJzMN3qWc9AqbRxn7nVSGdrjXuEcByi_sLxofX8-XA8mSzNCab-ZMeHJkx1WHiu48Ow_WKPZynP88jC7Ndoycu3gtcS672ErMzMFDZ5_RjdR92C9AQJFymI5kkleAJSNivYaCbr1vPmW8RrHQvtAvIEOx1vpqNsprnvnH-_YyFzll5vI_vERlvLsfB51UaYzc2c03Rdl4k6WuyicUYIzfiBdaIB74cyhQOkD3pl0mo-AdXO-PuNGCzCsRHJiRET4g-NuBKCt0EkQUV7SJ5BG2nLef4ddWlrh_5GPzcbCeZ7vdRZOrH743nHdq4Wnle6qOUCN4J_z_XuKtmJYya8geHdy7JfG72CF01wyVHoLoWgb0-QISeSKm3u1SX7tYa4UgI50dVR3gRuhI8wbYEVp5CDgm-GMn1h_XdtwkRXW-XvT6_Q0TXDou8g296pm4Nt-F-TX_7Vwv_z8mtxWfZvyK81y8fl_0YJE8_ZODi_7fZ3i_iotfkJ4aagef4zJIqLh6LKR3k6eIacqC7NryJTnOypSXXbqrscXf7tGRUSXc35vWODE8emjkf_azIqvFr4f1xGkdOa9ET2KzPq3DI1lTCnq8SZVHrJ2p2tztTNm1RQvEuH78OJb001b67vdEH_cL8GlexBdIXgsk_IvzdxbItYuuDrT9XIuGAmNHUTMgy-QwWJgvSP1gzfpVro6wTzVNFnaJLjr88E33JOMoFMGfKD3VnEU-h0_KLjY5gR31ElxXkuRzvM9ZB1Gx1u4JsWR6_TuJYmW9sOPtxxTuuU8o1p0zVNm8gsK4P0WI5TKmv3X7EwycnMSc550tCkqvnR09w8qASv5tZfbkDbdp2-_aYN6J4Y0E-94PcZUNRlczT77aQRL4ruh9NnTfjXWioM9Dxk9-fuxDux1MJ3M9PafWwOdv4pktuOG_QtQC35uCAmYWgFaT_XxXFyONh282VLJUtiadYR5ERdbXUcrG_ESlCmZPe4WYSOI2ie84Q2NVr3vJsPfxvBDyYQMZrVkuYtB0TWtm16T0prPaRtZriFLrL6X-w7ZDGlaEFZ-Sd6oLvsWhVk1Kkgp208Lw0tHMc522pdqFBxQvM8NkLOte6yft8tbPuRU0TGEp5xeF9tkvCUK7gWNjSsZOqUUXOp0WcG3XQTbRIMWt6IOMcziBHoSJUpLSbBnZOGzskpAAkDn3i4Qf2OLUsSeD7xji3L5ZYLXTmcP2Z7UFjyAl73VLWvTOXsGf7AmdNiESxsc_BUgdjTSuI9lYaH2rNyhxXHKW_eVxFNI9M0RHXI46FgSYKRayV7WtUl05fwwlNWy9AfDbtJb500dEJ6A7f2wrZ9z3dd_2Z_6wVukriQLRLPdcFLfctP3dAPwi2kkG3TG3bbvj8UEMtaEH8OPrhB5m7DxXYBTgqaZ0FZfnzb5sYoeRssLMu6yekWcmneWCOkyRpn2fuCIO_-RtyaG9t6J5Fr5Uwq2YMppnLzxtuRyLtH3t1jhMj6PkLePUaEXD7cJAS_7qE07-TkzLxHUFQ5S6gCPSskgsubWuS3v9-bRtf_BAAA__8RWegn">