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

    <tr>
        <th>Summary</th>
        <td>
            Scalarizer assert failure "Inconsistent vector sizes", with minimal testcase
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    **Testcase:** [inconsistent-vector-sizes-bug.ll](https://gist.github.com/bjacob/47c1fa440b8d0f470e435f660c1036ba). Inlined here:

```
; RUN: opt %s -passes='function(scalarizer,dce)' -scalarize-load-store -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"

define <64 x i32> @f1(<16 x <64 x i32>*> %src, i32 %index) {
  %1 = extractelement <16 x <64 x i32>*> %src, i32 %index
  %2 = load <64 x i32>, <64 x i32>* %1, align 4
  ret <64 x i32> %2
}
```

**Steps to reproduce:**

1. Configure LLVM *with assertions enabled* (`cmake -DLLVM_ENABLE_ASSERTIONS=ON`).
2. Build `opt` (`cmake --build . --target opt`).
3. Run: `./bin/opt -passes='function(scalarizer,dce)' -scalarize-load-store -S inconsistent-vector-sizes-bug.ll`

**Expected:** should succeed.
**Actual:** assertion failure,
```
opt: /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:296: (anonymous namespace)::Scatterer::Scatterer(llvm::BasicBlock *, BasicBlock::iterator, llvm::Value *, llvm::Type *, (anonymous namespace)::ValueVector *): Assertion `Size == CachePtr->size() && "Inconsistent vector sizes"' failed.
```

**GDB session:**

```
# Starting the testcase in GDB

$ gdb --args ./bin/opt -passes='function(scalarizer,dce)' -scalarize-load-store -S /tmp/inconsistent-vector-sizes-bug.ll 

# Setting my breakpoints. My git state is at commit 8361c5da30588d3d4a48eae648f53be1feb5cfad
# so the line numbers is Scalarizer.cpp correspond to this:
# https://sourcegraph.com/github.com/llvm/llvm-project@8361c5da30588d3d4a48eae648f53be1feb5cfad/-/blob/llvm/lib/Transforms/Scalar/Scalarizer.cpp

# Set breakpoint 1 in ScalarizerVisitor::gather just where it's updating its cache.
# https://sourcegraph.com/github.com/llvm/llvm-project@8361c5da30588d3d4a48eae648f53be1feb5cfad/-/blob/llvm/lib/Transforms/Scalar/Scalarizer.cpp?L435
(gdb) b Scalarizer.cpp:435
Breakpoint 1 at 0x4b6b130: file /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp, line 435.

# Set Breakpoint 2 in ScalarizerVisitor::scatter just where it's going to construct a new Scatterer
# https://sourcegraph.com/github.com/llvm/llvm-project@8361c5da30588d3d4a48eae648f53be1feb5cfad/-/blob/llvm/lib/Transforms/Scalar/Scalarizer.cpp?L403
(gdb) b 403
Breakpoint 2 at 0x4b6a988: file /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp, line 403.


(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /usr/local/google/home/benoitjacob/mlir-build/bin/opt -passes=function\(scalarizer,dce\) -scalarize-load-store -S /tmp/inconsistent-vector-sizes-bug.ll
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, (anonymous namespace)::ScalarizerVisitor::gather (this=0x7fffffffa2e0, Op=0x5fc8070, CV=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:435
435       SV = CV;
(gdb) bt 4
#0  (anonymous namespace)::ScalarizerVisitor::gather (this=0x7fffffffa2e0, Op=0x5fc8070, CV=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:435
#1  0x0000000004b7080f in (anonymous namespace)::ScalarizerVisitor::visitExtractElementInst (this=0x7fffffffa2e0, EEI=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:845
#2  0x0000000004b6a05d in llvm::InstVisitor<(anonymous namespace)::ScalarizerVisitor, bool>::visitExtractElement (
    this=0x7fffffffa2e0, I=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/include/llvm/IR/Instruction.def:214
#3  0x0000000004b69460 in llvm::InstVisitor<(anonymous namespace)::ScalarizerVisitor, bool>::visit (this=0x7fffffffa2e0, 
    I=...) at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/include/llvm/IR/Instruction.def:214

# OK so we are handling the 'extractelement' instruction. At line 845 (frame #1) we are doing
# https://sourcegraph.com/github.com/llvm/llvm-project@8361c5da30588d3d4a48eae648f53be1feb5cfad/-/blob/llvm/lib/Transforms/Scalar/Scalarizer.cpp?L845
#   gather(&EEI, {Res});
# so we are hardcoding the fact that an extractelement extracts something of 'size 1' (that {Res} ValueVector) even if that thing has itself a nested vector length (see testcase).


(More stack frames follow...)
(gdb) p Op
$6 = (llvm::Instruction *) 0x5fc8070
(gdb) p &SV
$7 = ((anonymous namespace)::ValueVector *) 0x5fcf6d8
(gdb) p CV.size()
$8 = 1

# OK so we are associating, to the key 0x5fc8070, the value 0x5fcf6d8 which is a vector of size 1.

(gdb) c
Continuing.

Breakpoint 2, (anonymous namespace)::ScalarizerVisitor::scatter (this=0x7fffffffa2e0, Point=0x5fc8100, V=0x5fc8070, 
    PtrElemTy=0x5fc68b0)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:403
403         return Scatterer(
(gdb) bt 4
#0  (anonymous namespace)::ScalarizerVisitor::scatter (this=0x7fffffffa2e0, Point=0x5fc8100, V=0x5fc8070, 
    PtrElemTy=0x5fc68b0)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:403
#1  0x0000000004b6bcc8 in (anonymous namespace)::ScalarizerVisitor::visitLoadInst (this=0x7fffffffa2e0, LI=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:911
#2  0x0000000004b69aed in llvm::InstVisitor<(anonymous namespace)::ScalarizerVisitor, bool>::visitLoad (
    this=0x7fffffffa2e0, I=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/include/llvm/IR/Instruction.def:172
#3  0x0000000004b691c5 in llvm::InstVisitor<(anonymous namespace)::ScalarizerVisitor, bool>::visit (this=0x7fffffffa2e0, 
    I=...) at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/include/llvm/IR/Instruction.def:172
(More stack frames follow...)

# OK so we are now handling the 'load' instruction in the testcase.

(gdb) p V
$9 = (llvm::Value *) 0x5fc8070

# OK, that is the same key 0x5fc8070 that we had inserted a cache entry for, earlier. 

(gdb) p &Scattered[V]
$10 = (std::map<llvm::Value*, llvm::SmallVector<llvm::Value*, 8>, std::less<llvm::Value*>, std::allocator<std::pair<llvm::Value* const, llvm::SmallVector<llvm::Value*, 8> > > >::mapped_type *) 0x5fcf6d8

# OK, the cached entry is still 0x5fcf6d8 that we had inserted earlier.

(gdb) p Scattered[V].size()
$11 = 1

# OK, that still has size 1 like it had earlier.

(gdb) c
Continuing.
opt: /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:296: (anonymous namespace)::Scatterer::Scatterer(llvm::BasicBlock *, BasicBlock::iterator, llvm::Value *, llvm::Type *, (anonymous namespace)::ValueVector *): Assertion `Size == CachePtr->size() && "Inconsistent vector sizes"' failed.

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:49
49      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt 4
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:49
#1  0x00007ffff7a1e536 in __GI_abort () at abort.c:79
#2  0x00007ffff7a1e41f in __assert_fail_base (fmt=0x7ffff7b84998 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", 
    assertion=0xfc261a "Size == CachePtr->size() && \"Inconsistent vector sizes\"", 
    file=0x1424451 "/usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp", line=296, function=<optimized out>) at assert.c:92
#3  0x00007ffff7a2d212 in __GI___assert_fail (
    assertion=0xfc261a "Size == CachePtr->size() && \"Inconsistent vector sizes\"", 
    file=0x1424451 "/usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp", line=296, 
    function=0x1583778 "(anonymous namespace)::Scatterer::Scatterer(llvm::BasicBlock *, BasicBlock::iterator, llvm::Value *, llvm::Type *, (anonymous namespace)::ValueVector *)") at assert.c:101
(More stack frames follow...)
(gdb) bt 8
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:49
#1  0x00007ffff7a1e536 in __GI_abort () at abort.c:79
#2  0x00007ffff7a1e41f in __assert_fail_base (fmt=0x7ffff7b84998 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", 
    assertion=0xfc261a "Size == CachePtr->size() && \"Inconsistent vector sizes\"", 
    file=0x1424451 "/usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp", line=296, function=<optimized out>) at assert.c:92
#3  0x00007ffff7a2d212 in __GI___assert_fail (
    assertion=0xfc261a "Size == CachePtr->size() && \"Inconsistent vector sizes\"", 
    file=0x1424451 "/usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp", line=296, 
    function=0x1583778 "(anonymous namespace)::Scatterer::Scatterer(llvm::BasicBlock *, BasicBlock::iterator, llvm::Value *, llvm::Type *, (anonymous namespace)::ValueVector *)") at assert.c:101
#4  0x0000000004b6b36e in (anonymous namespace)::Scatterer::Scatterer (this=0x7fffffff9fa8, bb=0x5fc7fa0, bbi=..., 
    v=0x5fc8070, PtrElemTy=0x5fc68b0, cachePtr=0x5fcf6d8)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:296
#5  0x0000000004b6a991 in (anonymous namespace)::ScalarizerVisitor::scatter (this=0x7fffffffa2e0, Point=0x5fc8100, 
    V=0x5fc8070, PtrElemTy=0x5fc68b0)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:403
#6  0x0000000004b6bcc8 in (anonymous namespace)::ScalarizerVisitor::visitLoadInst (this=0x7fffffffa2e0, LI=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:911
#7  0x0000000004b69aed in llvm::InstVisitor<(anonymous namespace)::ScalarizerVisitor, bool>::visitLoad (
    this=0x7fffffffa2e0, I=...)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/include/llvm/IR/Instruction.def:172
(More stack frames follow...)
(gdb) p v
No symbol "v" in current context.
(gdb) frame 4
#4  0x0000000004b6b36e in (anonymous namespace)::Scatterer::Scatterer (this=0x7fffffff9fa8, bb=0x5fc7fa0, bbi=..., 
    v=0x5fc8070, PtrElemTy=0x5fc68b0, cachePtr=0x5fcf6d8)
    at /usr/local/google/home/benoitjacob/iree/third_party/llvm-project/llvm/lib/Transforms/Scalar/Scalarizer.cpp:296
296         assert(Size == CachePtr->size() && "Inconsistent vector sizes");
(gdb) p v
$12 = (llvm::Value *) 0x5fc8070
(gdb) p CachePtr
$13 = ((anonymous namespace)::ValueVector *) 0x5fcf6d8
(gdb) p CachePtr->size()
$14 = 1

# OK, all is still as cached earlier: key=0x5fc8070 ==> value 0x5fcf6d8, ValueVector of size 1.

# So what's wrong?

(gdb) p Size
$15 = 64
(gdb) call Ty->dump()
<64 x i32>
```

**Conclusion:** There seems to be an inconsistency in the notion of 'vector size':

- `visitExtractElement` considers that whatever is being extracted, is of size 1
- `visitLoad` considers that what when a vector is being loaded, its vector size is to be honored (here 64).


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztG11T27ry14QXTTz-jvPAQxKgw1xO22k4vDKyLScqjp2xZCD3199dyZ9xAoXb9tAzYcDYsrTa712t5DCPd-cjewa_t0zIiAo2cma6gYy8Oc-iPBNcSJbJ8SOLZF6MBf8vE-OwXBlpOvIuRnawlnIr1Lgr-F1Bd2PF5boMjSjfQEv4nUZ5CDfuJLIS6rpmGMRm4k5M5jpe4vtmZJmOH9KRPTXIdZbyjMVkzQqFjHkxMuurb1a_-tGZk29_f4ZOJN9KMrI9QcZbKgQDbACxSVJmkeR5BjiKiKa0ANSLkb2IIwZTQQcybtrHaU7jsQAKGRkvyWiyIFc8ZYs1ix4UaD2npMWKSRJTCeN2eQnTOhfw3mbjLSDiu-1lzC34H-DfmAftreXD_-oy5o4NN9VlzHvjk967pPfusf9k2Qi8uY6pCTemfinMLszA7HXMghoZNQ_0WOJL2-7yPWYJiAQoXfgueSYK50sycs3EGiGkheVDc_81KhF2As4VEfAcm_GJZzF7Bu4Dh-caOsFmS_GRPcuCRpKlbAMaR94DuQVpK5Ao1gGAxRCkQgLf0JSvMuLWgAomB4QD7Io9k4vDmqmvyo6Wkm0FkTlA2hZ5XEatiXU7WwZZ5FnCVyUo4M3N3V8wzewJzIigQheoxoKwjIYpizW6AUwXbegD6OsFDri__Dyb31zez5bLy2-3118-L4H-L58RKbArPYttkHnJU-CIb4LNwLUPCOwa3xpwV2m67tVCcAzyrczQ5qDZQOvmYF9XaIA_y_Ze9TqH2Hz5vIWewJvGf4l1XgItoowixmKj23kWyZKmbdeGxSShPAUJAKIHBYvcQNLtq1IANVdpDjSg08vzVQqjrtb5Bv-FLMu5rP0eLxg2yjUv4vstLeQOh6aPmzFoxHdAu3rEfxwH3BY0E0lebAQ8LBWbmhvkoxFt0dvYU19jE9Asz3abvBQkoxsmtlRzGQh0ZjBMSnCmxf6jHahJVeucCh7NgRx0djO0g7ZF9-AwiIIo8F077o6mJauHtM23u23T-gp6CsKdkrIege1k1kgEeL8EmtGY0Z4XNFqzr7IYgyWiUqD6ojexffhFR3zd0R6itYco7UGnBmqHEm7V4bjdfrqYE9BmgTp8yGD3h9oOWYLNSJ6tiFwzIquACupMAFZ_Apes4hCMDGxMkF9jRahwmy1q3yvmRPqoARlMKio2OxIWjD5sc55JYZC_dgTiOhGSSqBKECoJBPgNNAWOb0VeTB3TC4LYiV3qBowy3w0SzwmZlbDQixIat3OIXDEJQz3Jyk3ICoEg-yoO4IsC1CXPYnSgYD-izQgASD_xEHlZRGxV0O26Sjx6WUhtYF2zc80fxty-GqOYUmXQbzfWIYs7vCUWKkk74o4Ljpam7GNFgVEF-V4KSZ4wKSIc_MVEkHILWQjKiUtBIjQL449kjXN1A2lgjXoAhoEGHZKBu2t6zbucAy00n93QDy0HUxuSgHl_DAeNHhH1G_A2DilAhwz7BQUQ2mEf0IBVrpxNTtDAZVFGklCSsSfS-vg_VSFMZ6gQTWOPcbX86TQIPqj8Tacv_z3KKindgj-E6UAoGxIylGzMwEOvcC1EBTSxDH1vAUkOJKnAgnhXgVVxB5SCJEW-UX41ZCueZQADmIkBeEcgCmY42a4zBOeoZnxHVrNJeaHzxSPxqwle3uJQ_MLW6U-IXxU7vfntGplScQ1pKwVeQWJSvbmHkFtn0F6VuP-tuqxzMK1eP3goaLEjKmmohP4c-PewQAKZls_jVVbqF80YQ-QGrCDsnqy7ruoHkqGXYwAM1jHwwnyeJPqH2sxEwF-2qtlLosCcqJbFHbQYhoHAq8UMQWv5ELbR8ebqZkrI8k4t2BDt-cD4Zb0iA19mkhMbh2wExlgEXKFZ_7jhxAzMBCPL-9j1iA-Xekl-qZfk1xBnXuTf5eX1h2ZX4LbssvfY5VPTi5Fd7ToG6W14sngzG4EhYZ6nWGE4xlG1_m4YdZSvv52r4HXTMmZtw_U3vFR5Bnh1I2YJrkGt1jCdfYZOXd_89Qx9USFbdrUs_Gica5K0L__BhdETIxRi4JpmcVqvJiHf6xfHcO3HOzDJTOpsAzQcGZJAUMdhjoUEVyBjTBj_1Jywa7ogTu3M1fLfR6-Dsp7Mv0HmMblQGjRve3eZWsRRHtdsTYChcAP6QLP96mP1KGD0hoHgYUieoCAw-cBoPtGKh8pUT0w61QzkO3uEpI0negoNA3M5WLGxNFHJusB0ripTpCxbyTVCFawtILS1t7308S_MlCAjjB6IkrYgSZ6m-VPXT7QhdIuxrS4_-FXZOuhbZqVMVR2GtHFwAAuYvrxrwE1qcG-u9eg5Ej8OhnMs7oy2wtPMFai5rBdNBzLQPOJqdYx6IXWx4YHtSC-0Y-OjKmA1WMACi0drVd2opQJC1xLfW8TViEa6YZFnMF8JUx5LAO33J4D1GvAlT_cVJ2myF8tUjXf76UzrD7_KAmPQ7a7u4geh-UHDdrP0UzdTRK5gsiyyzlLXHqjQz8kaT7xv1uKDDNMPoyj4PzPMG1j2vZpX3nzstHJqWQ2PBmnllLLfkFbeqI2uPzuZtCZ2w8ZhMgmJximZfJ1zP5YXHA6cWf40yDuxLLOXbaIYunscRyLjlrQpwnSYcXT2joa5Rgc_HaqBzRCVcVaBmW0vmOvXT5jeoaXh1hEWyXRVnEAyV-yAB0rijBYpB7slx1DGzKaKKfHIm981pSIgwjJrKoSMNREbCva_2CNqsB-23NA0rdLCY72Damu6AZ0yIQ733usIsEHvNOymcUv54bl0tfh9-JHOX0P_lsX3stnwG6Z0A1EyLZi4kgyIVUiepp0s7KA8a9Edk9y-2A5lj5Z1LH1stEzjgmm6TvtgWfWAJXeFzMs4HEsFT9vG_7JtY3X9WhXrCxYx_ggKKvgqoylZXn-azb_dIhGzMEfVrYbd33-6vi8oF0y5EL4CzPDqmsoQ4MmvAgp66iuxEzHboizLjD_rhkcl7KzERwXJiDBFqxQc_0_fOJZ8zvGMxFpvnADVMegdkr8z9tV7P5_-5fR0M04ViyfUYp7jY_xRk1PkL6mEiat4fFYgJi0IewDCtRINQh_8uEfh3odU05FsZBv8J2HgTqeB3gfwRPOHRROv1Gakm3qqpxtbrfEWGTRlCko3jWgOnqgZk8j2LYpzvUF1cRvlBe1VrwfzoqzVlJZruy6evlL7HP-8d9KIYiEL0ENHBU_NPhLyYwG-lG-gf0zyUqpIqCWvOKlEPz2QRFait2Pbshvt6cm_nzufBPMDgumg3YoIUPcCZzKpbOZfFmOQpH19s8xm8ffGmhw41ODkUE8O9eRQT4I5OdRDDtVxBxVHx2c_VnE8yImD9Z1pQgNVDgrreuwkoaZu4XWlpyuex_3S7pGC7kKvdOFt3a7WxR-ziIlKWLPdG-yNT6fW-wu9766ht3waVNP_1Bq6f6qhv1pDn5xq6L-tEtypoD3qJqwI7DZhjiHchoRSBfioLAqMuRB-JXuWg-KAPnDgnhz3P-i41c20TbeAZT-xCDY9cDCv0RmsrdpvrPF39_prbjfAnF9zpuAgC9pZ3ZfKwzRN22I1FU0VW9eEce3ywHZdBasYjwXzvXMGan-4g_mxQwYOWebkaU31ge-nIldHeo9WwJGihhZP0eK7-_0ipON2hyyISzxi22FB_7M43Xb8G5lFjk6p94kMuVUn1AVjG_XVW8jwaE3nDG-0q3ePslyt7vShmo62wdOo_-HnGJeABw7P4fdrCnCM34_oTQO4sEdwF1xUp6jrYz0x8hxaG1bvw0bvfwQinrvP2iMhDWzcG6sAS9G1GLVXpahf5xl4YRVWFGdAHnsHes7icyeeOlN6JrlM2Xlr35UZ11-lvW6iC6I-GdzwjG9o2uzPnZVFer7_me4rZ7vAXQlRItwrz3X96dn63KO-ycxJAM4dAnJgxYnlWpPI8-M49CI6OUtpyFJxPvLmgA1-iKBAIGbexRk_t03bNh0b0nvPdgIjnkSQ-nhxDJ7DsRILyxwboNRAPIy8WJ0V5wqlsFwJeJkC1aJ9Cbzhq4wxNR3Ap6Vc58W5_tr4TM18rjD_H2kcjCQ">