Repository: angular
Issue: Linker compliance tests failing with source map errors
Labels: area: compiler

### Which @angular/* package(s) are the source of the bug?

compiler-cli

### Is this a regression?

Yes

### Description

Our linker compliance tests are failing with many hundreds of unmet expectations due to broken source mappings being generated. This started happening as we updated Babel via https://github.com/angular/angular/pull/49914.

Aside from other regressions in compliance output due to the tests not running, the real mapping errors surface a real issue where it's not yet quite clear whether we need to adjust or Babel introduced a bug.

I've investigated this deeply and digged into internals of Babel and have a good understanding of the source map generation when translating AST to text. Let's have a look at one failure.

```ts
i0.elementStart(<..>) // should map to `<div>`
```

Right now **this is broken** and the mapping points to a totally unrelated source span. At first glance, this seems magical and it's unclear why this is happening. Debugging the linker Babel ast factory and host, it turns out that we are actually properly trying to set the source map information for e.g. `CallExpressions` to `elementStart`- still with the right offsets.

An initial assumption was that we somehow regressed/broke our source map flattening in ngtsc. Something that is non-trivial to understand very easy to break. I've tried to look directly at the intermediary sources, instead of relying on the flattened source map- and the incorrect mappings were still visible. Hence the flattening is not the culprit.

Going deeper, with more reversing of Babel's generator/traversal- I've assumed that somehow the printer is not picking up our source map information. e.g. `node.loc` may no longer be correct. Turns out this is still the valid field- so our logic is correct. Going further, I noticed that the traversal and state of "current source span" (it's a shared state in the AST printer in Babel) is unexpectedly reset in node traversal. e.g.

```
CallExpression -- // <div>
     -> MemberExpression
            -> i0 // some other span
            -> elementStart
```

Babel basically sets the span for the call expression, but then when the call expression is printed, it goes deeper into the member expression -> then the core import. The core import then causes another span to become the "current source span" but never is reset to the parent span when the we go up the tree again (in-order printing). This then results in the mapping to be incorrect. Everything after `i0` ends up following the source span of the core import and the actual `CallExpression` source span is ignored.

This started happening with https://github.com/babel/babel/commit/4f4b450f5279947c24eae37b97dc8b5e652fcf51#diff-192a3f85cae6c8a5d19e16b083d4c421b517650b00a0e8ae10cf80cb1ce7d941R590. Previously the source spans were always reset to the previous ones, when e.g. a child node completed printing.

```
1. visit CallExpression 
2. set span to `<div>`
3. visit MemberExpression
4. visit core import
5. set span to X
6. print core import
7. set span back to previous `<div>`
8. visit & print rest of member expressions)
9. visit & print arguments (all using the still active `<div>` mapping)
```

**Possible fixes**:

* Consider working with Babel to see if the changes actually make sense. It seems odd that a child node AST location would affect the source mappings from a higher-level source mapping that spans over the rest of children. The granularity introduced seems acceptable- but also not sure about size here. In either case the locations seem wrong.

* Ensure the import does not have a span. I determined the import always has a span because we are re-using the original AST node from the `ngImport` field of partial declarations. We **cannot** should likely not do this in the translator as that one is agnostic to e.g. Babel/TS AST.

* Keep the source span for the import, but instead make sure that the followed printed text of the call expression (`i0.elementStart(xxx)`) has the proper span to the HTML source 





### Please provide a link to a minimal reproduction of the bug

Here is a reproduction showing the incorrect source mappings:

* [Click here](https://evanw.github.io/source-map-visualization/#MTg3MQBpbXBvcnQgeyBDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7CmltcG9ydCAqIGFzIGkwIGZyb20gIkBhbmd1bGFyL2NvcmUiOwpleHBvcnQgY2xhc3MgVGVzdENtcCB7fQpUZXN0Q21wLsm1ZmFjID0gZnVuY3Rpb24gVGVzdENtcF9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFRlc3RDbXApKCk7Cn07ClRlc3RDbXAuybVjbXAgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lQ29tcG9uZW50KHsKICB0eXBlOiBUZXN0Q21wLAogIHNlbGVjdG9yczogW1sidGVzdC1jbXAiXV0sCiAgZGVjbHM6IDMsCiAgdmFyczogNCwKICB0ZW1wbGF0ZTogZnVuY3Rpb24gVGVzdENtcF9UZW1wbGF0ZShyZiwgY3R4KSB7CiAgICBpZiAocmYgJiAxKSB7CiAgICAgIGkwLsm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICBpMC7Jtcm1dGV4dCgxKTsKICAgICAgaTAuybXJtXBpcGUoMiwgInBlcmNlbnQiKTsKICAgICAgaTAuybXJtWVsZW1lbnRFbmQoKTsKICAgIH0KICAgIGlmIChyZiAmIDIpIHsKICAgICAgaTAuybXJtWFkdmFuY2UoMSk7CiAgICAgIGkwLsm1ybV0ZXh0SW50ZXJwb2xhdGUoaTAuybXJtXBpcGVCaW5kMigyLCAxLCAyMDAuMywgMikpOwogICAgfQogIH0sCiAgZGVwZW5kZW5jaWVzOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gW1BlcmNlbnRQaXBlXTsKICB9LAogIGVuY2Fwc3VsYXRpb246IDIKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFRlc3RDbXAsIFt7CiAgICB0eXBlOiBDb21wb25lbnQsCiAgICBhcmdzOiBbewogICAgICBzZWxlY3RvcjogJ3Rlc3QtY21wJywKICAgICAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicKICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOwpleHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgewogIHRyYW5zZm9ybSgpIHt9Cn0KUGVyY2VudFBpcGUuybVmYWMgPSBmdW5jdGlvbiBQZXJjZW50UGlwZV9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSgpOwp9OwpQZXJjZW50UGlwZS7JtXBpcGUgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lUGlwZSh7CiAgbmFtZTogInBlcmNlbnQiLAogIHR5cGU6IFBlcmNlbnRQaXBlLAogIHB1cmU6IHRydWUKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFBlcmNlbnRQaXBlLCBbewogICAgdHlwZTogUGlwZSwKICAgIGFyZ3M6IFt7CiAgICAgIG5hbWU6ICdwZXJjZW50JwogICAgfV0KICB9XSwgbnVsbCwgbnVsbCk7Cn0pKCk7CmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge30KQXBwTW9kdWxlLsm1ZmFjID0gZnVuY3Rpb24gQXBwTW9kdWxlX0ZhY3RvcnkodCkgewogIHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOwp9OwpBcHBNb2R1bGUuybVtb2QgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lTmdNb2R1bGUoewogIHR5cGU6IEFwcE1vZHVsZQp9KTsKQXBwTW9kdWxlLsm1aW5qID0gLyogQF9fUFVSRV9fICovaTAuybXJtWRlZmluZUluamVjdG9yKHt9KTsKKGZ1bmN0aW9uICgpIHsKICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdEZXZNb2RlKSAmJiBpMC7JtXNldENsYXNzTWV0YWRhdGEoQXBwTW9kdWxlLCBbewogICAgdHlwZTogTmdNb2R1bGUsCiAgICBhcmdzOiBbewogICAgICBkZWNsYXJhdGlvbnM6IFtUZXN0Q21wLCBQZXJjZW50UGlwZV0KICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOzI2NjYAeyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGlvbl93aXRoX3BpcGUuanMiLCJzb3VyY2VzIjpbIi4uL2ludGVycG9sYXRpb25fd2l0aF9waXBlLnRzIl0sIm5hbWVzIjpbIkNvbXBvbmVudCIsIk5nTW9kdWxlIiwiUGlwZSIsImkwIiwiVGVzdENtcCIsIsm1ZmFjIiwiVGVzdENtcF9GYWN0b3J5IiwidCIsIsm1Y21wIiwiybXJtWRlZmluZUNvbXBvbmVudCIsInR5cGUiLCLJtcm1ZWxlbWVudFN0YXJ0IiwiybXJtXRleHQiLCLJtcm1cGlwZSIsIsm1ybVlbGVtZW50RW5kIiwicmYiLCLJtcm1YWR2YW5jZSIsIsm1ybV0ZXh0SW50ZXJwb2xhdGUiLCLJtcm1cGlwZUJpbmQyIiwiZGVwZW5kZW5jaWVzIiwiUGVyY2VudFBpcGUiLCJuZ0Rldk1vZGUiLCLJtXNldENsYXNzTWV0YWRhdGEiLCJhcmdzIiwic2VsZWN0b3IiLCJ0ZW1wbGF0ZSIsInRyYW5zZm9ybSIsIlBlcmNlbnRQaXBlX0ZhY3RvcnkiLCLJtXBpcGUiLCLJtcm1ZGVmaW5lUGlwZSIsIm5hbWUiLCJBcHBNb2R1bGUiLCJBcHBNb2R1bGVfRmFjdG9yeSIsIsm1bW9kIiwiybXJtWRlZmluZU5nTW9kdWxlIiwiybVpbmoiLCLJtcm1ZGVmaW5lSW5qZWN0b3IiLCJkZWNsYXJhdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQ0EsU0FBUyxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FDTSxLQUFLQyxFQUNYLE1BQU0sZUFBZTtBQUdyQixNQUFNLENBQUMsTUFBTUMsT0FBTyxDQUFDO0FBRXJCQSxPQUNNLENBQUNDLElBQUksWUFBQUMsZ0JBQUFDLENBQUE7RUFBQSxZQUFBQSxDQUFBLElBSEVIO0FBQU8sQ0FJQTtBQUFFQSxPQUFPLENBQUNJLElBQUksa0JBSS9CTCxFQUFFLENBQUFNLGlCQUFBO0VBQUFDLElBQUEsRUFSUU47Ozs7O1VBQU87TUFRakJELEVBQUUsQ0FBQVEsY0FBQSxTQVZZLENBQUM7S0FBTixDQVVUUixFQUFFLENBQUFTLE1BQUEsRUFWb0MsQ0FBQztNQVV2Q1QsRUFBRSxDQUFBVSxNQUFBO01BQUZWLEVBQUUsQ0FBQVcsWUFBQSxDQVYwQyxDQUFDO0lBQUE7SUFBQSxJQUFBQyxFQUFBLENBQUM7TUFVOUNaLEVBQUUsQ0FBQWEsU0FBQSxFQVZvQyxDQUFDO01BVXZDYixFQUFFLENBQUFjLGlCQUFBLENBQUZkLEVBQUUsQ0FBQWUsV0FBQSxnQkFWb0MsQ0FBQztJQUFBO0VBQUE7RUFBQUMsWUFBQSxXQUFBQSxDQUFBO0lBQUEsUUFNN0JDOzs7QUFBVyxFQUEyQjtBQUNsRDtFQUFBLFFBQUFDLFNBQUEsb0JBQUFBLFNBQUEsS0FHRWxCLEVBQUUsQ0FBQW1CLGlCQUFBLENBUlFsQixPQUFPLEVBR1osQ0FBQztJQUFjTSxJQUNyQixFQVJEVixTQUFTO0lBQ0N1QixJQUFJLEVBQUUsQ0FETjtNQUNUQyxRQUFRLEVBQUUsVUFBVTtNQUNwQkMsUUFBUSxFQUFFLHFDQUFxQztJQUVwQyxDQURaO0VBQ08sQ0FBQyxDQUFDO0FBQUE7QUFJVixNQUFNLENBQUMsTUFBTUwsV0FBVyxDQUFDO0VBQ3ZCTSxVQUFTLEVBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0FOLFdBQ1UsQ0FBQ2YsSUFBSSxZQUFBc0Isb0JBQUFwQixDQUFBO0VBQUEsWUFBQUEsQ0FBQSxJQUpGYTtBQUFXLENBRXZCO0FBRURBLFdBQVcsQ0FBQ1EsS0FBSyxrQkFBZHpCLEVBQUUsQ0FBQTBCLFlBQUE7RUFBQUMsSUFBQTtFQUFBcEIsSUFBQSxFQUpRVTs7QUFBVyxFQUFvQjtBQUFFO0VBQUEsUUFBQUMsU0FBQSxvQkFBQUEsU0FBQSxLQUkzQ2xCLEVBQUUsQ0FBQW1CLGlCQUFBLENBSlFGLFdBQVcsRUFBYyxDQUFDO0lBQ3RDVixJQUFJLEVBRkpSLElBQUk7SUFBY3FCLElBQUksRUFDdkIsQ0FETTtNQUFDTyxJQUFJLEVBQUUsU0FBUztJQUFDLENBQUE7RUFDZixDQUFDLENBQUM7QUFBQTtBQUtWLE1BQU0sQ0FBQyxNQUFNQyxTQUFTLENBQUM7QUFDckJBLFNBQVMsQ0FBQzFCLElBQUksWUFBQTJCLGtCQUFBekIsQ0FBQTtFQUFBLFlBQUFBLENBQUEsSUFESHdCO0FBQVMsQ0FDeUI7QUFBRUEsU0FBUyxDQUFDRSxJQUFJLGtCQUY1RDlCLEVBQUUsQ0FBQStCLGdCQUFBO0VBQUF4QixJQUFBLEVBQ1FxQjtBQUFTLEVBTE07YUFKZixPQUFPLEVBSVAsV0FBVyxqQ0FBTUEsU0FBUyxDQUFDSSxJQUFJLGtCQUl6Q2hDLEVBQUUsQ0FBQWlDLGdCQUFBLElBRUw7QUFBRTswQ0FEVyxTQUFTLGpEQUNwQixRQUFBZixTQUFBLG9CQUFBQSxTQUFBLEtBRkNsQixFQUFFLENBQUFtQixpQkFBQSxDQUNRUyxTQUFTLEVBQ1gsQ0FBQztJQUFjckIsSUFBSSxFQUY3QlQsUUFBUTtJQUFjc0IsSUFBSSxFQUFFLENBQW5CO01BQUNjLFlBQVksRUFBRSxDQUFDakMsT0FBTyxFQUFFZ0IsV0FBVyxDQUFDO0lBQUMsQ0FBQTtFQUN4QyxDQUFDLENBQUM7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBOZ01vZHVsZSwgUGlwZSwgUGlwZVRyYW5zZm9ybX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rlc3QtY21wJyxcbiAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicsXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDbXAge1xufVxuXG5AUGlwZSh7bmFtZTogJ3BlcmNlbnQnfSlcbmV4cG9ydCBjbGFzcyBQZXJjZW50UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0oKSB7fVxufVxuXG5ATmdNb2R1bGUoe2RlY2xhcmF0aW9uczogW1Rlc3RDbXAsIFBlcmNlbnRQaXBlXX0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIHtcbn0iXX0=)
* Failures: https://gist.github.com/devversion/993e2c0eee657629185dee91365bd7a2
* PR showing failures: https://github.com/angular/angular/pull/51620
* [Possible fixed source map, by cloning the import expression without location](https://evanw.github.io/source-map-visualization/#MTg3MQBpbXBvcnQgeyBDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7CmltcG9ydCAqIGFzIGkwIGZyb20gIkBhbmd1bGFyL2NvcmUiOwpleHBvcnQgY2xhc3MgVGVzdENtcCB7fQpUZXN0Q21wLsm1ZmFjID0gZnVuY3Rpb24gVGVzdENtcF9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFRlc3RDbXApKCk7Cn07ClRlc3RDbXAuybVjbXAgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lQ29tcG9uZW50KHsKICB0eXBlOiBUZXN0Q21wLAogIHNlbGVjdG9yczogW1sidGVzdC1jbXAiXV0sCiAgZGVjbHM6IDMsCiAgdmFyczogNCwKICB0ZW1wbGF0ZTogZnVuY3Rpb24gVGVzdENtcF9UZW1wbGF0ZShyZiwgY3R4KSB7CiAgICBpZiAocmYgJiAxKSB7CiAgICAgIGkwLsm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICBpMC7Jtcm1dGV4dCgxKTsKICAgICAgaTAuybXJtXBpcGUoMiwgInBlcmNlbnQiKTsKICAgICAgaTAuybXJtWVsZW1lbnRFbmQoKTsKICAgIH0KICAgIGlmIChyZiAmIDIpIHsKICAgICAgaTAuybXJtWFkdmFuY2UoMSk7CiAgICAgIGkwLsm1ybV0ZXh0SW50ZXJwb2xhdGUoaTAuybXJtXBpcGVCaW5kMigyLCAxLCAyMDAuMywgMikpOwogICAgfQogIH0sCiAgZGVwZW5kZW5jaWVzOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gW1BlcmNlbnRQaXBlXTsKICB9LAogIGVuY2Fwc3VsYXRpb246IDIKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFRlc3RDbXAsIFt7CiAgICB0eXBlOiBDb21wb25lbnQsCiAgICBhcmdzOiBbewogICAgICBzZWxlY3RvcjogJ3Rlc3QtY21wJywKICAgICAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicKICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOwpleHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgewogIHRyYW5zZm9ybSgpIHt9Cn0KUGVyY2VudFBpcGUuybVmYWMgPSBmdW5jdGlvbiBQZXJjZW50UGlwZV9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSgpOwp9OwpQZXJjZW50UGlwZS7JtXBpcGUgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lUGlwZSh7CiAgbmFtZTogInBlcmNlbnQiLAogIHR5cGU6IFBlcmNlbnRQaXBlLAogIHB1cmU6IHRydWUKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFBlcmNlbnRQaXBlLCBbewogICAgdHlwZTogUGlwZSwKICAgIGFyZ3M6IFt7CiAgICAgIG5hbWU6ICdwZXJjZW50JwogICAgfV0KICB9XSwgbnVsbCwgbnVsbCk7Cn0pKCk7CmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge30KQXBwTW9kdWxlLsm1ZmFjID0gZnVuY3Rpb24gQXBwTW9kdWxlX0ZhY3RvcnkodCkgewogIHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOwp9OwpBcHBNb2R1bGUuybVtb2QgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lTmdNb2R1bGUoewogIHR5cGU6IEFwcE1vZHVsZQp9KTsKQXBwTW9kdWxlLsm1aW5qID0gLyogQF9fUFVSRV9fICovaTAuybXJtWRlZmluZUluamVjdG9yKHt9KTsKKGZ1bmN0aW9uICgpIHsKICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdEZXZNb2RlKSAmJiBpMC7JtXNldENsYXNzTWV0YWRhdGEoQXBwTW9kdWxlLCBbewogICAgdHlwZTogTmdNb2R1bGUsCiAgICBhcmdzOiBbewogICAgICBkZWNsYXJhdGlvbnM6IFtUZXN0Q21wLCBQZXJjZW50UGlwZV0KICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOzI2NjIAeyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGlvbl93aXRoX3BpcGUuanMiLCJzb3VyY2VzIjpbIi4uL2ludGVycG9sYXRpb25fd2l0aF9waXBlLnRzIl0sIm5hbWVzIjpbIkNvbXBvbmVudCIsIk5nTW9kdWxlIiwiUGlwZSIsImkwIiwiVGVzdENtcCIsIsm1ZmFjIiwiVGVzdENtcF9GYWN0b3J5IiwidCIsIsm1Y21wIiwiybXJtWRlZmluZUNvbXBvbmVudCIsInR5cGUiLCLJtcm1ZWxlbWVudFN0YXJ0IiwiybXJtXRleHQiLCLJtcm1cGlwZSIsIsm1ybVlbGVtZW50RW5kIiwicmYiLCLJtcm1YWR2YW5jZSIsIsm1ybV0ZXh0SW50ZXJwb2xhdGUiLCLJtcm1cGlwZUJpbmQyIiwiZGVwZW5kZW5jaWVzIiwiUGVyY2VudFBpcGUiLCJuZ0Rldk1vZGUiLCLJtXNldENsYXNzTWV0YWRhdGEiLCJhcmdzIiwic2VsZWN0b3IiLCJ0ZW1wbGF0ZSIsInRyYW5zZm9ybSIsIlBlcmNlbnRQaXBlX0ZhY3RvcnkiLCLJtXBpcGUiLCLJtcm1ZGVmaW5lUGlwZSIsIm5hbWUiLCJBcHBNb2R1bGUiLCJBcHBNb2R1bGVfRmFjdG9yeSIsIsm1bW9kIiwiybXJtWRlZmluZU5nTW9kdWxlIiwiybVpbmoiLCLJtcm1ZGVmaW5lSW5qZWN0b3IiLCJkZWNsYXJhdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQ0EsU0FBUyxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FDTSxLQUFLQyxFQUNYLE1BQU0sZUFBZTtBQUdyQixNQUFNLENBQUMsTUFBTUMsT0FBTyxDQUFDO0FBRXJCQSxPQUNNLENBQUNDLElBQUksWUFBQUMsZ0JBQUFDLENBQUE7RUFBQSxZQUFBQSxDQUFBLElBSEVIO0FBQU8sQ0FJQTtBQUFFQSxPQUFPLENBQUNJLElBQUksa0JBQUFMLEVBQUEsQ0FBQU0saUJBQUE7RUFBQUMsSUFBQSxFQUpyQk47Ozs7O1VBQU87TUFGUEQsRUFBQSxDQUFBUSxjQUFBLFNBQUksQ0FBQztLQUFOLENBQU1SLEVBQUEsQ0FBQVMsTUFBQSxFQUF1QixDQUFDO01BQUFULEVBQUEsQ0FBQVUsTUFBQTtNQUFBVixFQUFBLENBQUFXLFlBQUEsQ0FBSyxDQUFDO0lBQUE7SUFBQSxJQUFBQyxFQUFBLENBQUM7TUFBL0JaLEVBQUEsQ0FBQWEsU0FBQSxFQUF1QixDQUFDO01BQXhCYixFQUFBLENBQUFjLGlCQUFBLENBQUFkLEVBQUEsQ0FBQWUsV0FBQSxnQkFBdUIsQ0FBQztJQUFBO0VBQUE7RUFBQUMsWUFBQSxXQUFBQSxDQUFBO0lBQUEsUUFNN0JDOzs7QUFBVyxFQUEyQjtBQUNsRDtFQUFBLFFBQUFDLFNBQUEsb0JBQUFBLFNBQUEsS0FBQWxCLEVBQUEsQ0FBQW1CLGlCQUFBLENBTFlsQixPQUFPLEVBR1osQ0FBQztJQUFjTSxJQUNyQixFQVJEVixTQUFTO0lBQ0N1QixJQUFJLEVBQUUsQ0FETjtNQUNUQyxRQUFRLEVBQUUsVUFBVTtNQUNwQkMsUUFBUSxFQUFFLHFDQUFxQztJQUVwQyxDQURaO0VBQ08sQ0FBQyxDQUFDO0FBQUE7QUFJVixNQUFNLENBQUMsTUFBTUwsV0FBVyxDQUFDO0VBQ3ZCTSxVQUFTLEVBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0FOLFdBQ1UsQ0FBQ2YsSUFBSSxZQUFBc0Isb0JBQUFwQixDQUFBO0VBQUEsWUFBQUEsQ0FBQSxJQUpGYTtBQUFXLENBRXZCO0FBRURBLFdBQVcsQ0FBQ1EsS0FBSyxrQkFBQXpCLEVBQUEsQ0FBQTBCLFlBQUE7RUFBQUMsSUFBQTtFQUFBcEIsSUFBQSxFQUpKVTs7QUFBVyxFQUFvQjtBQUFFO0VBQUEsUUFBQUMsU0FBQSxvQkFBQUEsU0FBQSxLQUFBbEIsRUFBQSxDQUFBbUIsaUJBQUEsQ0FBakNGLFdBQVcsRUFBYyxDQUFDO0lBQ3RDVixJQUFJLEVBRkpSLElBQUk7SUFBY3FCLElBQUksRUFDdkIsQ0FETTtNQUFDTyxJQUFJLEVBQUUsU0FBUztJQUFDLENBQUE7RUFDZixDQUFDLENBQUM7QUFBQTtBQUtWLE1BQU0sQ0FBQyxNQUFNQyxTQUFTLENBQUM7QUFDckJBLFNBQVMsQ0FBQzFCLElBQUksWUFBQTJCLGtCQUFBekIsQ0FBQTtFQUFBLFlBQUFBLENBQUEsSUFESHdCO0FBQVMsQ0FDeUI7QUFBRUEsU0FBUyxDQUFDRSxJQUFJLGtCQUFBOUIsRUFBQSxDQUFBK0IsZ0JBQUE7RUFBQXhCLElBQUEsRUFEbERxQjtBQUFTLEVBTE07YUFKZixPQUFPLEVBSVAsV0FBVyxqQ0FBTUEsU0FBUyxDQUFDSSxJQUFJLGtCQUFBaEMsRUFBQSxDQUFBaUMsZ0JBQUEsSUFNNUM7QUFBRTsrRUFEVyw3RUFDWCxRQUFBZixTQUFBLG9CQUFBQSxTQUFBLEtBQUFsQixFQUFBLENBQUFtQixpQkFBQSxDQURXUyxTQUFTLEVBQ1gsQ0FBQztBQURVLElBQ0lyQixJQUFJLEVBRjdCVCxRQUFRO0lBQWNzQixJQUFJLEVBQUUsQ0FBbkI7TUFBQ2MsWUFBWSxFQUFFLENBQUNqQyxPQUFPLEVBQUVnQixXQUFXLENBQUM7SUFBQyxDQUFBO0VBQ3hDLENBQUMsQ0FBQztBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGVzdC1jbXAnLFxuICB0ZW1wbGF0ZTogJzxkaXY+e3syMDAuMyB8IHBlcmNlbnQgOiAyIH19PC9kaXY+Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENtcCB7XG59XG5cbkBQaXBlKHtuYW1lOiAncGVyY2VudCd9KVxuZXhwb3J0IGNsYXNzIFBlcmNlbnRQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSgpIHt9XG59XG5cbkBOZ01vZHVsZSh7ZGVjbGFyYXRpb25zOiBbVGVzdENtcCwgUGVyY2VudFBpcGVdfSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge1xufSJdfQ==)

### Please provide the exception or error you saw

_No response_

### Please provide the environment you discovered this bug in (run `ng version`)

_No response_

### Anything else?

_No response_