@angular/core 16.0.0-next.6 → 16.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/esm2022/rxjs-interop/src/index.mjs +3 -3
  2. package/esm2022/rxjs-interop/src/to_observable.mjs +39 -0
  3. package/esm2022/rxjs-interop/src/to_signal.mjs +52 -0
  4. package/esm2022/src/application_ref.mjs +3 -5
  5. package/esm2022/src/application_tokens.mjs +11 -1
  6. package/esm2022/src/change_detection/differs/iterable_differs.mjs +1 -1
  7. package/esm2022/src/core_private_export.mjs +3 -3
  8. package/esm2022/src/di/index.mjs +1 -4
  9. package/esm2022/src/errors.mjs +1 -1
  10. package/esm2022/src/hydration/annotate.mjs +45 -34
  11. package/esm2022/src/hydration/api.mjs +52 -55
  12. package/esm2022/src/hydration/error_handling.mjs +8 -24
  13. package/esm2022/src/initial_render_pending_tasks.mjs +10 -10
  14. package/esm2022/src/linker/query_list.mjs +1 -5
  15. package/esm2022/src/linker/view_ref.mjs +1 -1
  16. package/esm2022/src/metadata/ng_module.mjs +1 -2
  17. package/esm2022/src/render3/component_ref.mjs +9 -7
  18. package/esm2022/src/render3/di.mjs +3 -3
  19. package/esm2022/src/render3/hooks.mjs +35 -31
  20. package/esm2022/src/render3/instructions/i18n.mjs +14 -2
  21. package/esm2022/src/render3/instructions/mark_view_dirty.mjs +1 -1
  22. package/esm2022/src/render3/instructions/shared.mjs +29 -20
  23. package/esm2022/src/render3/interfaces/type_checks.mjs +1 -1
  24. package/esm2022/src/render3/interfaces/view.mjs +1 -1
  25. package/esm2022/src/render3/node_manipulation.mjs +9 -9
  26. package/esm2022/src/render3/pipe.mjs +2 -2
  27. package/esm2022/src/render3/reactivity/effect.mjs +1 -1
  28. package/esm2022/src/render3/util/discovery_utils.mjs +1 -1
  29. package/esm2022/src/render3/util/view_traversal_utils.mjs +1 -1
  30. package/esm2022/src/render3/util/view_utils.mjs +2 -2
  31. package/esm2022/src/render3/view_ref.mjs +4 -4
  32. package/esm2022/src/sanitization/url_sanitizer.mjs +7 -6
  33. package/esm2022/src/signals/index.mjs +4 -4
  34. package/esm2022/src/signals/src/graph.mjs +4 -1
  35. package/esm2022/src/signals/src/signal.mjs +15 -1
  36. package/esm2022/src/signals/src/watch.mjs +6 -2
  37. package/esm2022/src/signals/src/weak_ref.mjs +4 -1
  38. package/esm2022/src/util/decorators.mjs +6 -1
  39. package/esm2022/src/version.mjs +1 -1
  40. package/esm2022/testing/src/fake_async.mjs +2 -2
  41. package/esm2022/testing/src/logger.mjs +3 -3
  42. package/esm2022/testing/src/ng_zone_mock.mjs +3 -3
  43. package/fesm2022/core.mjs +8836 -9558
  44. package/fesm2022/core.mjs.map +1 -1
  45. package/fesm2022/rxjs-interop.mjs +704 -56
  46. package/fesm2022/rxjs-interop.mjs.map +1 -1
  47. package/fesm2022/testing.mjs +7918 -8641
  48. package/fesm2022/testing.mjs.map +1 -1
  49. package/index.d.ts +61 -424
  50. package/package.json +2 -2
  51. package/rxjs-interop/index.d.ts +53 -46
  52. package/schematics/migrations/guard-and-resolve-interfaces/bundle.js +13 -13
  53. package/schematics/migrations/remove-module-id/bundle.js +14 -14
  54. package/schematics/ng-generate/standalone-migration/bundle.js +5323 -3817
  55. package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
  56. package/testing/index.d.ts +2 -2
  57. package/esm2022/rxjs-interop/src/from_observable.mjs +0 -46
  58. package/esm2022/rxjs-interop/src/from_signal.mjs +0 -36
  59. package/esm2022/src/di/reflective_errors.mjs +0 -217
  60. package/esm2022/src/di/reflective_injector.mjs +0 -311
  61. package/esm2022/src/di/reflective_key.mjs +0 -73
  62. package/esm2022/src/di/reflective_provider.mjs +0 -209
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v16.0.0-next.6
2
+ * @license Angular v16.0.0-rc.0
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -142,7 +142,7 @@ export declare function discardPeriodicTasks(): void;
142
142
  *
143
143
  * Can be used to wrap `inject()` calls.
144
144
  *
145
- * @param fn The function that you want to wrap in the `fakeAysnc` zone.
145
+ * @param fn The function that you want to wrap in the `fakeAsync` zone.
146
146
  *
147
147
  * @usageNotes
148
148
  * ### Example
@@ -1,46 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { assertInInjectionContext, computed, DestroyRef, inject, signal } from '@angular/core';
9
- export function fromObservable(source, initialValue) {
10
- assertInInjectionContext(fromObservable);
11
- // Note: T is the Observable value type, and U is the initial value type. They don't have to be
12
- // the same - the returned signal gives values of type `T`.
13
- let state;
14
- if (initialValue === undefined && arguments.length !== 2) {
15
- // No initial value was passed, so initially the signal is in a `NoValue` state and will throw
16
- // if accessed.
17
- state = signal({ kind: 0 /* StateKind.NoValue */ });
18
- }
19
- else {
20
- // An initial value was passed, so use it.
21
- state = signal({ kind: 1 /* StateKind.Value */, value: initialValue });
22
- }
23
- const sub = source.subscribe({
24
- next: value => state.set({ kind: 1 /* StateKind.Value */, value }),
25
- error: error => state.set({ kind: 2 /* StateKind.Error */, error }),
26
- // Completion of the Observable is meaningless to the signal. Signals don't have a concept of
27
- // "complete".
28
- });
29
- // Unsubscribe when the current context is destroyed.
30
- inject(DestroyRef).onDestroy(sub.unsubscribe.bind(sub));
31
- // The actual returned signal is a `computed` of the `State` signal, which maps the various states
32
- // to either values or errors.
33
- return computed(() => {
34
- const current = state();
35
- switch (current.kind) {
36
- case 1 /* StateKind.Value */:
37
- return current.value;
38
- case 2 /* StateKind.Error */:
39
- throw current.error;
40
- case 0 /* StateKind.NoValue */:
41
- // TODO(alxhub): use a RuntimeError when we finalize the error semantics
42
- throw new Error(`fromObservable() signal read before the Observable emitted`);
43
- }
44
- });
45
- }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9vYnNlcnZhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9yeGpzLWludGVyb3Avc3JjL2Zyb21fb2JzZXJ2YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQWdEckgsTUFBTSxVQUFVLGNBQWMsQ0FBZSxNQUFxQixFQUFFLFlBQWdCO0lBQ2xGLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXpDLCtGQUErRjtJQUMvRiwyREFBMkQ7SUFDM0QsSUFBSSxLQUFpQyxDQUFDO0lBQ3RDLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN4RCw4RkFBOEY7UUFDOUYsZUFBZTtRQUNmLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBQyxJQUFJLDJCQUFtQixFQUFDLENBQUMsQ0FBQztLQUMzQztTQUFNO1FBQ0wsMENBQTBDO1FBQzFDLEtBQUssR0FBRyxNQUFNLENBQWEsRUFBQyxJQUFJLHlCQUFpQixFQUFFLEtBQUssRUFBRSxZQUFhLEVBQUMsQ0FBQyxDQUFDO0tBQzNFO0lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMzQixJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsSUFBSSx5QkFBaUIsRUFBRSxLQUFLLEVBQUMsQ0FBQztRQUN4RCxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsSUFBSSx5QkFBaUIsRUFBRSxLQUFLLEVBQUMsQ0FBQztRQUN6RCw2RkFBNkY7UUFDN0YsY0FBYztLQUNmLENBQUMsQ0FBQztJQUVILHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFeEQsa0dBQWtHO0lBQ2xHLDhCQUE4QjtJQUM5QixPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDeEIsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3BCO2dCQUNFLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN2QjtnQkFDRSxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDdEI7Z0JBQ0Usd0VBQXdFO2dCQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7U0FDakY7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHthc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBpbmplY3QsIHNpZ25hbCwgU2lnbmFsLCBXcml0YWJsZVNpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBgT2JzZXJ2YWJsZWAgYXMgYSByZWFjdGl2ZSBgU2lnbmFsYC5cbiAqXG4gKiBgZnJvbU9ic2VydmFibGVgIHJldHVybnMgYSBgU2lnbmFsYCB3aGljaCBwcm92aWRlcyBzeW5jaHJvbm91cyByZWFjdGl2ZSBhY2Nlc3MgdG8gdmFsdWVzIHByb2R1Y2VkXG4gKiBieSB0aGUgZ2l2ZW4gYE9ic2VydmFibGVgLCBieSBzdWJzY3JpYmluZyB0byB0aGF0IGBPYnNlcnZhYmxlYC4gVGhlIHJldHVybmVkIGBTaWduYWxgIHdpbGwgYWx3YXlzXG4gKiBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzdWJzY3JpcHRpb24sIGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZVxuICogYE9ic2VydmFibGVgIGVycm9ycy5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9uIHdpbGwgbGFzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjdXJyZW50IGluamVjdGlvbiBjb250ZXh0LiBUaGF0IGlzLCBpZlxuICogYGZyb21PYnNlcnZhYmxlYCBpcyBjYWxsZWQgZnJvbSBhIGNvbXBvbmVudCBjb250ZXh0LCB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICogY29tcG9uZW50IGlzIGRlc3Ryb3llZC4gV2hlbiBjYWxsZWQgb3V0c2lkZSBvZiBhIGNvbXBvbmVudCwgdGhlIGN1cnJlbnQgYEVudmlyb25tZW50SW5qZWN0b3JgJ3NcbiAqIGxpZmV0aW1lIHdpbGwgYmUgdXNlZCAod2hpY2ggaXMgdHlwaWNhbGx5IHRoZSBsaWZldGltZSBvZiB0aGUgYXBwbGljYXRpb24gaXRzZWxmKS5cbiAqXG4gKiBJZiB0aGUgYE9ic2VydmFibGVgIGRvZXMgbm90IHByb2R1Y2UgYSB2YWx1ZSBiZWZvcmUgdGhlIGBTaWduYWxgIGlzIHJlYWQsIHRoZSBgU2lnbmFsYCB3aWxsIHRocm93XG4gKiBhbiBlcnJvci4gVG8gYXZvaWQgdGhpcywgdXNlIGEgc3luY2hyb25vdXMgYE9ic2VydmFibGVgIChwb3RlbnRpYWxseSBjcmVhdGVkIHdpdGggdGhlIGBzdGFydFdpdGhgXG4gKiBvcGVyYXRvcikgb3IgcGFzcyBhbiBpbml0aWFsIHZhbHVlIHRvIGBmcm9tT2JzZXJ2YWJsZWAgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAqXG4gKiBgZnJvbU9ic2VydmFibGVgIG11c3QgYmUgY2FsbGVkIGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU9ic2VydmFibGU8VD4oc291cmNlOiBPYnNlcnZhYmxlPFQ+KTogU2lnbmFsPFQ+O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBgT2JzZXJ2YWJsZWAgYXMgYSByZWFjdGl2ZSBgU2lnbmFsYC5cbiAqXG4gKiBgZnJvbU9ic2VydmFibGVgIHJldHVybnMgYSBgU2lnbmFsYCB3aGljaCBwcm92aWRlcyBzeW5jaHJvbm91cyByZWFjdGl2ZSBhY2Nlc3MgdG8gdmFsdWVzIHByb2R1Y2VkXG4gKiBieSB0aGUgZ2l2ZW4gYE9ic2VydmFibGVgLCBieSBzdWJzY3JpYmluZyB0byB0aGF0IGBPYnNlcnZhYmxlYC4gVGhlIHJldHVybmVkIGBTaWduYWxgIHdpbGwgYWx3YXlzXG4gKiBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzdWJzY3JpcHRpb24sIGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZVxuICogYE9ic2VydmFibGVgIGVycm9ycy5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9uIHdpbGwgbGFzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjdXJyZW50IGluamVjdGlvbiBjb250ZXh0LiBUaGF0IGlzLCBpZlxuICogYGZyb21PYnNlcnZhYmxlYCBpcyBjYWxsZWQgZnJvbSBhIGNvbXBvbmVudCBjb250ZXh0LCB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICogY29tcG9uZW50IGlzIGRlc3Ryb3llZC4gV2hlbiBjYWxsZWQgb3V0c2lkZSBvZiBhIGNvbXBvbmVudCwgdGhlIGN1cnJlbnQgYEVudmlyb25tZW50SW5qZWN0b3JgJ3NcbiAqIGxpZmV0aW1lIHdpbGwgYmUgdXNlZCAod2hpY2ggaXMgdHlwaWNhbGx5IHRoZSBsaWZldGltZSBvZiB0aGUgYXBwbGljYXRpb24gaXRzZWxmKS5cbiAqXG4gKiBCZWZvcmUgdGhlIGBPYnNlcnZhYmxlYCBlbWl0cyBpdHMgZmlyc3QgdmFsdWUsIHRoZSBgU2lnbmFsYCB3aWxsIHJldHVybiB0aGUgY29uZmlndXJlZFxuICogYGluaXRpYWxWYWx1ZWAuIElmIHRoZSBgT2JzZXJ2YWJsZWAgaXMga25vd24gdG8gcHJvZHVjZSBhIHZhbHVlIGJlZm9yZSB0aGUgYFNpZ25hbGAgd2lsbCBiZSByZWFkLFxuICogYGluaXRpYWxWYWx1ZWAgZG9lcyBub3QgbmVlZCB0byBiZSBwYXNzZWQuXG4gKlxuICogYGZyb21PYnNlcnZhYmxlYCBtdXN0IGJlIGNhbGxlZCBpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU9ic2VydmFibGU8VCwgVSBleHRlbmRzIFR8bnVsbHx1bmRlZmluZWQ+KFxuICAgIC8vIGZyb21PYnNlcnZhYmxlKE9ic2VydmFibGU8QW5pbWFsPikgLT4gU2lnbmFsPENhdD5cbiAgICBzb3VyY2U6IE9ic2VydmFibGU8VD4sIGluaXRpYWxWYWx1ZTogVSk6IFNpZ25hbDxUfFU+O1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21PYnNlcnZhYmxlPFQsIFUgPSBuZXZlcj4oc291cmNlOiBPYnNlcnZhYmxlPFQ+LCBpbml0aWFsVmFsdWU/OiBVKTogU2lnbmFsPFR8VT4ge1xuICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoZnJvbU9ic2VydmFibGUpO1xuXG4gIC8vIE5vdGU6IFQgaXMgdGhlIE9ic2VydmFibGUgdmFsdWUgdHlwZSwgYW5kIFUgaXMgdGhlIGluaXRpYWwgdmFsdWUgdHlwZS4gVGhleSBkb24ndCBoYXZlIHRvIGJlXG4gIC8vIHRoZSBzYW1lIC0gdGhlIHJldHVybmVkIHNpZ25hbCBnaXZlcyB2YWx1ZXMgb2YgdHlwZSBgVGAuXG4gIGxldCBzdGF0ZTogV3JpdGFibGVTaWduYWw8U3RhdGU8VHxVPj47XG4gIGlmIChpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBhcmd1bWVudHMubGVuZ3RoICE9PSAyKSB7XG4gICAgLy8gTm8gaW5pdGlhbCB2YWx1ZSB3YXMgcGFzc2VkLCBzbyBpbml0aWFsbHkgdGhlIHNpZ25hbCBpcyBpbiBhIGBOb1ZhbHVlYCBzdGF0ZSBhbmQgd2lsbCB0aHJvd1xuICAgIC8vIGlmIGFjY2Vzc2VkLlxuICAgIHN0YXRlID0gc2lnbmFsKHtraW5kOiBTdGF0ZUtpbmQuTm9WYWx1ZX0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEFuIGluaXRpYWwgdmFsdWUgd2FzIHBhc3NlZCwgc28gdXNlIGl0LlxuICAgIHN0YXRlID0gc2lnbmFsPFN0YXRlPFR8VT4+KHtraW5kOiBTdGF0ZUtpbmQuVmFsdWUsIHZhbHVlOiBpbml0aWFsVmFsdWUhfSk7XG4gIH1cblxuICBjb25zdCBzdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICBuZXh0OiB2YWx1ZSA9PiBzdGF0ZS5zZXQoe2tpbmQ6IFN0YXRlS2luZC5WYWx1ZSwgdmFsdWV9KSxcbiAgICBlcnJvcjogZXJyb3IgPT4gc3RhdGUuc2V0KHtraW5kOiBTdGF0ZUtpbmQuRXJyb3IsIGVycm9yfSksXG4gICAgLy8gQ29tcGxldGlvbiBvZiB0aGUgT2JzZXJ2YWJsZSBpcyBtZWFuaW5nbGVzcyB0byB0aGUgc2lnbmFsLiBTaWduYWxzIGRvbid0IGhhdmUgYSBjb25jZXB0IG9mXG4gICAgLy8gXCJjb21wbGV0ZVwiLlxuICB9KTtcblxuICAvLyBVbnN1YnNjcmliZSB3aGVuIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZGVzdHJveWVkLlxuICBpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KHN1Yi51bnN1YnNjcmliZS5iaW5kKHN1YikpO1xuXG4gIC8vIFRoZSBhY3R1YWwgcmV0dXJuZWQgc2lnbmFsIGlzIGEgYGNvbXB1dGVkYCBvZiB0aGUgYFN0YXRlYCBzaWduYWwsIHdoaWNoIG1hcHMgdGhlIHZhcmlvdXMgc3RhdGVzXG4gIC8vIHRvIGVpdGhlciB2YWx1ZXMgb3IgZXJyb3JzLlxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdGF0ZSgpO1xuICAgIHN3aXRjaCAoY3VycmVudC5raW5kKSB7XG4gICAgICBjYXNlIFN0YXRlS2luZC5WYWx1ZTpcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICBjYXNlIFN0YXRlS2luZC5FcnJvcjpcbiAgICAgICAgdGhyb3cgY3VycmVudC5lcnJvcjtcbiAgICAgIGNhc2UgU3RhdGVLaW5kLk5vVmFsdWU6XG4gICAgICAgIC8vIFRPRE8oYWx4aHViKTogdXNlIGEgUnVudGltZUVycm9yIHdoZW4gd2UgZmluYWxpemUgdGhlIGVycm9yIHNlbWFudGljc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZyb21PYnNlcnZhYmxlKCkgc2lnbmFsIHJlYWQgYmVmb3JlIHRoZSBPYnNlcnZhYmxlIGVtaXR0ZWRgKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBlbnVtIFN0YXRlS2luZCB7XG4gIE5vVmFsdWUsXG4gIFZhbHVlLFxuICBFcnJvcixcbn1cblxuaW50ZXJmYWNlIE5vVmFsdWVTdGF0ZSB7XG4gIGtpbmQ6IFN0YXRlS2luZC5Ob1ZhbHVlO1xufVxuXG5pbnRlcmZhY2UgVmFsdWVTdGF0ZTxUPiB7XG4gIGtpbmQ6IFN0YXRlS2luZC5WYWx1ZTtcbiAgdmFsdWU6IFQ7XG59XG5cbmludGVyZmFjZSBFcnJvclN0YXRlIHtcbiAga2luZDogU3RhdGVLaW5kLkVycm9yO1xuICBlcnJvcjogdW5rbm93bjtcbn1cblxudHlwZSBTdGF0ZTxUPiA9IE5vVmFsdWVTdGF0ZXxWYWx1ZVN0YXRlPFQ+fEVycm9yU3RhdGU7XG4iXX0=
@@ -1,36 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { assertInInjectionContext, effect, inject, Injector } from '@angular/core';
9
- import { Observable } from 'rxjs';
10
- /**
11
- * Exposes the value of an Angular `Signal` as an RxJS `Observable`.
12
- *
13
- * The signal's value will be propagated into the `Observable`'s subscribers using an `effect`.
14
- *
15
- * `fromSignal` must be called in an injection context.
16
- *
17
- * @developerPreview
18
- */
19
- export function fromSignal(source, options) {
20
- !options?.injector && assertInInjectionContext(fromSignal);
21
- const injector = options?.injector ?? inject(Injector);
22
- // Creating a new `Observable` allows the creation of the effect to be lazy. This allows for all
23
- // references to `source` to be dropped if the `Observable` is fully unsubscribed and thrown away.
24
- return new Observable(observer => {
25
- const watcher = effect(() => {
26
- try {
27
- observer.next(source());
28
- }
29
- catch (err) {
30
- observer.error(err);
31
- }
32
- }, { injector, manualCleanup: true });
33
- return () => watcher.destroy();
34
- });
35
- }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3J4anMtaW50ZXJvcC9zcmMvZnJvbV9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFnQmhDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDdEIsTUFBaUIsRUFDakIsT0FBMkI7SUFFN0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNELE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXZELGdHQUFnRztJQUNoRyxrR0FBa0c7SUFDbEcsT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQzFCLElBQUk7Z0JBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3pCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQjtRQUNILENBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUNwQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHthc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGVmZmVjdCwgaW5qZWN0LCBJbmplY3RvciwgU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYGZyb21TaWduYWxgLlxuICpcbiAqIEBkZXZlbG9wZXJQcmV2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVNpZ25hbE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGBJbmplY3RvcmAgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIGVmZmVjdC5cbiAgICpcbiAgICogSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IGluamVjdGlvbiBjb250ZXh0IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIGluamVjdG9yPzogSW5qZWN0b3I7XG59XG5cbi8qKlxuICogRXhwb3NlcyB0aGUgdmFsdWUgb2YgYW4gQW5ndWxhciBgU2lnbmFsYCBhcyBhbiBSeEpTIGBPYnNlcnZhYmxlYC5cbiAqXG4gKiBUaGUgc2lnbmFsJ3MgdmFsdWUgd2lsbCBiZSBwcm9wYWdhdGVkIGludG8gdGhlIGBPYnNlcnZhYmxlYCdzIHN1YnNjcmliZXJzIHVzaW5nIGFuIGBlZmZlY3RgLlxuICpcbiAqIGBmcm9tU2lnbmFsYCBtdXN0IGJlIGNhbGxlZCBpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNpZ25hbDxUPihcbiAgICBzb3VyY2U6IFNpZ25hbDxUPixcbiAgICBvcHRpb25zPzogRnJvbVNpZ25hbE9wdGlvbnMsXG4gICAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICFvcHRpb25zPy5pbmplY3RvciAmJiBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoZnJvbVNpZ25hbCk7XG4gIGNvbnN0IGluamVjdG9yID0gb3B0aW9ucz8uaW5qZWN0b3IgPz8gaW5qZWN0KEluamVjdG9yKTtcblxuICAvLyBDcmVhdGluZyBhIG5ldyBgT2JzZXJ2YWJsZWAgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiB0aGUgZWZmZWN0IHRvIGJlIGxhenkuIFRoaXMgYWxsb3dzIGZvciBhbGxcbiAgLy8gcmVmZXJlbmNlcyB0byBgc291cmNlYCB0byBiZSBkcm9wcGVkIGlmIHRoZSBgT2JzZXJ2YWJsZWAgaXMgZnVsbHkgdW5zdWJzY3JpYmVkIGFuZCB0aHJvd24gYXdheS5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICBjb25zdCB3YXRjaGVyID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoc291cmNlKCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfSwge2luamVjdG9yLCBtYW51YWxDbGVhbnVwOiB0cnVlfSk7XG4gICAgcmV0dXJuICgpID0+IHdhdGNoZXIuZGVzdHJveSgpO1xuICB9KTtcbn1cbiJdfQ==
@@ -1,217 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { ERROR_ORIGINAL_ERROR, wrappedError } from '../util/errors';
9
- import { stringify } from '../util/stringify';
10
- function findFirstClosedCycle(keys) {
11
- const res = [];
12
- for (let i = 0; i < keys.length; ++i) {
13
- if (res.indexOf(keys[i]) > -1) {
14
- res.push(keys[i]);
15
- return res;
16
- }
17
- res.push(keys[i]);
18
- }
19
- return res;
20
- }
21
- function constructResolvingPath(keys) {
22
- if (keys.length > 1) {
23
- const reversed = findFirstClosedCycle(keys.slice().reverse());
24
- const tokenStrs = reversed.map(k => stringify(k.token));
25
- return ' (' + tokenStrs.join(' -> ') + ')';
26
- }
27
- return '';
28
- }
29
- function injectionError(injector, key, constructResolvingMessage, originalError) {
30
- const keys = [key];
31
- const errMsg = constructResolvingMessage(keys);
32
- const error = (originalError ? wrappedError(errMsg, originalError) : Error(errMsg));
33
- error.addKey = addKey;
34
- error.keys = keys;
35
- error.injectors = [injector];
36
- error.constructResolvingMessage = constructResolvingMessage;
37
- error[ERROR_ORIGINAL_ERROR] = originalError;
38
- return error;
39
- }
40
- function addKey(injector, key) {
41
- this.injectors.push(injector);
42
- this.keys.push(key);
43
- // Note: This updated message won't be reflected in the `.stack` property
44
- this.message = this.constructResolvingMessage(this.keys);
45
- }
46
- /**
47
- * Thrown when trying to retrieve a dependency by key from {@link Injector}, but the
48
- * {@link Injector} does not have a {@link Provider} for the given key.
49
- *
50
- * @usageNotes
51
- * ### Example
52
- *
53
- * ```typescript
54
- * class A {
55
- * constructor(b:B) {}
56
- * }
57
- *
58
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
59
- * ```
60
- */
61
- export function noProviderError(injector, key) {
62
- return injectionError(injector, key, function (keys) {
63
- const first = stringify(keys[0].token);
64
- return `No provider for ${first}!${constructResolvingPath(keys)}`;
65
- });
66
- }
67
- /**
68
- * Thrown when dependencies form a cycle.
69
- *
70
- * @usageNotes
71
- * ### Example
72
- *
73
- * ```typescript
74
- * var injector = Injector.resolveAndCreate([
75
- * {provide: "one", useFactory: (two) => "two", deps: [[new Inject("two")]]},
76
- * {provide: "two", useFactory: (one) => "one", deps: [[new Inject("one")]]}
77
- * ]);
78
- *
79
- * expect(() => injector.get("one")).toThrowError();
80
- * ```
81
- *
82
- * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.
83
- */
84
- export function cyclicDependencyError(injector, key) {
85
- return injectionError(injector, key, function (keys) {
86
- return `Cannot instantiate cyclic dependency!${constructResolvingPath(keys)}`;
87
- });
88
- }
89
- /**
90
- * Thrown when a constructing type returns with an Error.
91
- *
92
- * The `InstantiationError` class contains the original error plus the dependency graph which caused
93
- * this object to be instantiated.
94
- *
95
- * @usageNotes
96
- * ### Example
97
- *
98
- * ```typescript
99
- * class A {
100
- * constructor() {
101
- * throw new Error('message');
102
- * }
103
- * }
104
- *
105
- * var injector = Injector.resolveAndCreate([A]);
106
-
107
- * try {
108
- * injector.get(A);
109
- * } catch (e) {
110
- * expect(e instanceof InstantiationError).toBe(true);
111
- * expect(e.originalException.message).toEqual("message");
112
- * expect(e.originalStack).toBeDefined();
113
- * }
114
- * ```
115
- */
116
- export function instantiationError(injector, originalException, originalStack, key) {
117
- return injectionError(injector, key, function (keys) {
118
- const first = stringify(keys[0].token);
119
- return `${originalException.message}: Error during instantiation of ${first}!${constructResolvingPath(keys)}.`;
120
- }, originalException);
121
- }
122
- /**
123
- * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}
124
- * creation.
125
- *
126
- * @usageNotes
127
- * ### Example
128
- *
129
- * ```typescript
130
- * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError();
131
- * ```
132
- */
133
- export function invalidProviderError(provider) {
134
- return Error(`Invalid provider - only instances of Provider and Type are allowed, got: ${provider}`);
135
- }
136
- /**
137
- * Thrown when the class has no annotation information.
138
- *
139
- * Lack of annotation information prevents the {@link Injector} from determining which dependencies
140
- * need to be injected into the constructor.
141
- *
142
- * @usageNotes
143
- * ### Example
144
- *
145
- * ```typescript
146
- * class A {
147
- * constructor(b) {}
148
- * }
149
- *
150
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
151
- * ```
152
- *
153
- * This error is also thrown when the class not marked with {@link Injectable} has parameter types.
154
- *
155
- * ```typescript
156
- * class B {}
157
- *
158
- * class A {
159
- * constructor(b:B) {} // no information about the parameter types of A is available at runtime.
160
- * }
161
- *
162
- * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();
163
- * ```
164
- *
165
- */
166
- export function noAnnotationError(typeOrFunc, params) {
167
- const signature = [];
168
- for (let i = 0, ii = params.length; i < ii; i++) {
169
- const parameter = params[i];
170
- if (!parameter || parameter.length == 0) {
171
- signature.push('?');
172
- }
173
- else {
174
- signature.push(parameter.map(stringify).join(' '));
175
- }
176
- }
177
- return Error('Cannot resolve all parameters for \'' + stringify(typeOrFunc) + '\'(' +
178
- signature.join(', ') + '). ' +
179
- 'Make sure that all the parameters are decorated with Inject or have valid type annotations and that \'' +
180
- stringify(typeOrFunc) + '\' is decorated with Injectable.');
181
- }
182
- /**
183
- * Thrown when getting an object by index.
184
- *
185
- * @usageNotes
186
- * ### Example
187
- *
188
- * ```typescript
189
- * class A {}
190
- *
191
- * var injector = Injector.resolveAndCreate([A]);
192
- *
193
- * expect(() => injector.getAt(100)).toThrowError();
194
- * ```
195
- *
196
- */
197
- export function outOfBoundsError(index) {
198
- return Error(`Index ${index} is out-of-bounds.`);
199
- }
200
- // TODO: add a working example after alpha38 is released
201
- /**
202
- * Thrown when a multi provider and a regular provider are bound to the same token.
203
- *
204
- * @usageNotes
205
- * ### Example
206
- *
207
- * ```typescript
208
- * expect(() => Injector.resolveAndCreate([
209
- * { provide: "Strings", useValue: "string1", multi: true},
210
- * { provide: "Strings", useValue: "string2", multi: false}
211
- * ])).toThrowError();
212
- * ```
213
- */
214
- export function mixingMultiProvidersWithRegularProvidersError(provider1, provider2) {
215
- return Error(`Cannot mix multi providers and regular providers, got: ${provider1} ${provider2}`);
216
- }
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdGl2ZV9lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9kaS9yZWZsZWN0aXZlX2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSzVDLFNBQVMsb0JBQW9CLENBQUMsSUFBVztJQUN2QyxNQUFNLEdBQUcsR0FBVSxFQUFFLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDcEMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQVc7SUFDekMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FB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Q25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtUeXBlfSBmcm9tICcuLi9pbnRlcmZhY2UvdHlwZSc7XG5pbXBvcnQge0VSUk9SX09SSUdJTkFMX0VSUk9SLCB3cmFwcGVkRXJyb3J9IGZyb20gJy4uL3V0aWwvZXJyb3JzJztcbmltcG9ydCB7c3RyaW5naWZ5fSBmcm9tICcuLi91dGlsL3N0cmluZ2lmeSc7XG5cbmltcG9ydCB7UmVmbGVjdGl2ZUluamVjdG9yfSBmcm9tICcuL3JlZmxlY3RpdmVfaW5qZWN0b3InO1xuaW1wb3J0IHtSZWZsZWN0aXZlS2V5fSBmcm9tICcuL3JlZmxlY3RpdmVfa2V5JztcblxuZnVuY3Rpb24gZmluZEZpcnN0Q2xvc2VkQ3ljbGUoa2V5czogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IHJlczogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHJlcy5pbmRleE9mKGtleXNbaV0pID4gLTEpIHtcbiAgICAgIHJlcy5wdXNoKGtleXNbaV0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmVzLnB1c2goa2V5c1tpXSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCByZXZlcnNlZCA9IGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXMuc2xpY2UoKS5yZXZlcnNlKCkpO1xuICAgIGNvbnN0IHRva2VuU3RycyA9IHJldmVyc2VkLm1hcChrID0+IHN0cmluZ2lmeShrLnRva2VuKSk7XG4gICAgcmV0dXJuICcgKCcgKyB0b2tlblN0cnMuam9pbignIC0+ICcpICsgJyknO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBrZXlzOiBSZWZsZWN0aXZlS2V5W107XG4gIGluamVjdG9yczogUmVmbGVjdGl2ZUluamVjdG9yW107XG4gIGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U6IChrZXlzOiBSZWZsZWN0aXZlS2V5W10pID0+IHN0cmluZztcbiAgYWRkS2V5KGluamVjdG9yOiBSZWZsZWN0aXZlSW5qZWN0b3IsIGtleTogUmVmbGVjdGl2ZUtleSk6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdGlvbkVycm9yKFxuICAgIGluamVjdG9yOiBSZWZsZWN0aXZlSW5qZWN0b3IsIGtleTogUmVmbGVjdGl2ZUtleSxcbiAgICBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlOiAoa2V5czogUmVmbGVjdGl2ZUtleVtdKSA9PiBzdHJpbmcsXG4gICAgb3JpZ2luYWxFcnJvcj86IEVycm9yKTogSW5qZWN0aW9uRXJyb3Ige1xuICBjb25zdCBrZXlzID0gW2tleV07XG4gIGNvbnN0IGVyck1zZyA9IGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2Uoa2V5cyk7XG4gIGNvbnN0IGVycm9yID1cbiAgICAgIChvcmlnaW5hbEVycm9yID8gd3JhcHBlZEVycm9yKGVyck1zZywgb3JpZ2luYWxFcnJvcikgOiBFcnJvcihlcnJNc2cpKSBhcyBJbmplY3Rpb25FcnJvcjtcbiAgZXJyb3IuYWRkS2V5ID0gYWRkS2V5O1xuICBlcnJvci5rZXlzID0ga2V5cztcbiAgZXJyb3IuaW5qZWN0b3JzID0gW2luamVjdG9yXTtcbiAgZXJyb3IuY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSA9IGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U7XG4gIChlcnJvciBhcyBhbnkpW0VSUk9SX09SSUdJTkFMX0VSUk9SXSA9IG9yaWdpbmFsRXJyb3I7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gYWRkS2V5KHRoaXM6IEluamVjdGlvbkVycm9yLCBpbmplY3RvcjogUmVmbGVjdGl2ZUluamVjdG9yLCBrZXk6IFJlZmxlY3RpdmVLZXkpOiB2b2lkIHtcbiAgdGhpcy5pbmplY3RvcnMucHVzaChpbmplY3Rvcik7XG4gIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIC8vIE5vdGU6IFRoaXMgdXBkYXRlZCBtZXNzYWdlIHdvbid0IGJlIHJlZmxlY3RlZCBpbiB0aGUgYC5zdGFja2AgcHJvcGVydHlcbiAgdGhpcy5tZXNzYWdlID0gdGhpcy5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlKHRoaXMua2V5cyk7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBieSBrZXkgZnJvbSB7QGxpbmsgSW5qZWN0b3J9LCBidXQgdGhlXG4gKiB7QGxpbmsgSW5qZWN0b3J9IGRvZXMgbm90IGhhdmUgYSB7QGxpbmsgUHJvdmlkZXJ9IGZvciB0aGUgZ2l2ZW4ga2V5LlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiOkIpIHt9XG4gKiB9XG4gKlxuICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vUHJvdmlkZXJFcnJvcihpbmplY3RvcjogUmVmbGVjdGl2ZUluamVjdG9yLCBrZXk6IFJlZmxlY3RpdmVLZXkpOiBJbmplY3Rpb25FcnJvciB7XG4gIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBmdW5jdGlvbihrZXlzOiBSZWZsZWN0aXZlS2V5W10pIHtcbiAgICBjb25zdCBmaXJzdCA9IHN0cmluZ2lmeShrZXlzWzBdLnRva2VuKTtcbiAgICByZXR1cm4gYE5vIHByb3ZpZGVyIGZvciAke2ZpcnN0fSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAge3Byb3ZpZGU6IFwib25lXCIsIHVzZUZhY3Rvcnk6ICh0d28pID0+IFwidHdvXCIsIGRlcHM6IFtbbmV3IEluamVjdChcInR3b1wiKV1dfSxcbiAqICAge3Byb3ZpZGU6IFwidHdvXCIsIHVzZUZhY3Rvcnk6IChvbmUpID0+IFwib25lXCIsIGRlcHM6IFtbbmV3IEluamVjdChcIm9uZVwiKV1dfVxuICogXSk7XG4gKlxuICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldChcIm9uZVwiKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqXG4gKiBSZXRyaWV2aW5nIGBBYCBvciBgQmAgdGhyb3dzIGEgYEN5Y2xpY0RlcGVuZGVuY3lFcnJvcmAgYXMgdGhlIGdyYXBoIGFib3ZlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN5Y2xpY0RlcGVuZGVuY3lFcnJvcihcbiAgICBpbmplY3RvcjogUmVmbGVjdGl2ZUluamVjdG9yLCBrZXk6IFJlZmxlY3RpdmVLZXkpOiBJbmplY3Rpb25FcnJvciB7XG4gIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBmdW5jdGlvbihrZXlzOiBSZWZsZWN0aXZlS2V5W10pIHtcbiAgICByZXR1cm4gYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBjb25zdHJ1Y3RpbmcgdHlwZSByZXR1cm5zIHdpdGggYW4gRXJyb3IuXG4gKlxuICogVGhlIGBJbnN0YW50aWF0aW9uRXJyb3JgIGNsYXNzIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBlcnJvciBwbHVzIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHdoaWNoIGNhdXNlZFxuICogdGhpcyBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UnKTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTtcblxuICogdHJ5IHtcbiAqICAgaW5qZWN0b3IuZ2V0KEEpO1xuICogfSBjYXRjaCAoZSkge1xuICogICBleHBlY3QoZSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25FcnJvcikudG9CZSh0cnVlKTtcbiAqICAgZXhwZWN0KGUub3JpZ2luYWxFeGNlcHRpb24ubWVzc2FnZSkudG9FcXVhbChcIm1lc3NhZ2VcIik7XG4gKiAgIGV4cGVjdChlLm9yaWdpbmFsU3RhY2spLnRvQmVEZWZpbmVkKCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbnRpYXRpb25FcnJvcihcbiAgICBpbmplY3RvcjogUmVmbGVjdGl2ZUluamVjdG9yLCBvcmlnaW5hbEV4Y2VwdGlvbjogYW55LCBvcmlnaW5hbFN0YWNrOiBhbnksXG4gICAga2V5OiBSZWZsZWN0aXZlS2V5KTogSW5qZWN0aW9uRXJyb3Ige1xuICByZXR1cm4gaW5qZWN0aW9uRXJyb3IoaW5qZWN0b3IsIGtleSwgZnVuY3Rpb24oa2V5czogUmVmbGVjdGl2ZUtleVtdKSB7XG4gICAgY29uc3QgZmlyc3QgPSBzdHJpbmdpZnkoa2V5c1swXS50b2tlbik7XG4gICAgcmV0dXJuIGAke29yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2V9OiBFcnJvciBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiAke2ZpcnN0fSEke1xuICAgICAgICBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfS5gO1xuICB9LCBvcmlnaW5hbEV4Y2VwdGlvbik7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYW4gb2JqZWN0IG90aGVyIHRoZW4ge0BsaW5rIFByb3ZpZGVyfSAob3IgYFR5cGVgKSBpcyBwYXNzZWQgdG8ge0BsaW5rIEluamVjdG9yfVxuICogY3JlYXRpb24uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1wibm90IGEgdHlwZVwiXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkUHJvdmlkZXJFcnJvcihwcm92aWRlcjogYW55KSB7XG4gIHJldHVybiBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHByb3ZpZGVyIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogJHtwcm92aWRlcn1gKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgY2xhc3MgaGFzIG5vIGFubm90YXRpb24gaW5mb3JtYXRpb24uXG4gKlxuICogTGFjayBvZiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHByZXZlbnRzIHRoZSB7QGxpbmsgSW5qZWN0b3J9IGZyb20gZGV0ZXJtaW5pbmcgd2hpY2ggZGVwZW5kZW5jaWVzXG4gKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiKSB7fVxuICogfVxuICpcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKlxuICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge0BsaW5rIEluamVjdGFibGV9IGhhcyBwYXJhbWV0ZXIgdHlwZXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQiB7fVxuICpcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiOkIpIHt9IC8vIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgQSBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQSxCXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYzogVHlwZTxhbnk+fEZ1bmN0aW9uLCBwYXJhbXM6IGFueVtdW10pOiBFcnJvciB7XG4gIGNvbnN0IHNpZ25hdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcGFyYW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSBwYXJhbXNbaV07XG4gICAgaWYgKCFwYXJhbWV0ZXIgfHwgcGFyYW1ldGVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICBzaWduYXR1cmUucHVzaCgnPycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYXR1cmUucHVzaChwYXJhbWV0ZXIubWFwKHN0cmluZ2lmeSkuam9pbignICcpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEVycm9yKFxuICAgICAgJ0Nhbm5vdCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciBcXCcnICsgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1xcJygnICtcbiAgICAgIHNpZ25hdHVyZS5qb2luKCcsICcpICsgJykuICcgK1xuICAgICAgJ01ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgcGFyYW1ldGVycyBhcmUgZGVjb3JhdGVkIHdpdGggSW5qZWN0IG9yIGhhdmUgdmFsaWQgdHlwZSBhbm5vdGF0aW9ucyBhbmQgdGhhdCBcXCcnICtcbiAgICAgIHN0cmluZ2lmeSh0eXBlT3JGdW5jKSArICdcXCcgaXMgZGVjb3JhdGVkIHdpdGggSW5qZWN0YWJsZS4nKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBnZXR0aW5nIGFuIG9iamVjdCBieSBpbmRleC5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBBIHt9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pO1xuICpcbiAqIGV4cGVjdCgoKSA9PiBpbmplY3Rvci5nZXRBdCgxMDApKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dE9mQm91bmRzRXJyb3IoaW5kZXg6IG51bWJlcikge1xuICByZXR1cm4gRXJyb3IoYEluZGV4ICR7aW5kZXh9IGlzIG91dC1vZi1ib3VuZHMuYCk7XG59XG5cbi8vIFRPRE86IGFkZCBhIHdvcmtpbmcgZXhhbXBsZSBhZnRlciBhbHBoYTM4IGlzIHJlbGVhc2VkXG4vKipcbiAqIFRocm93biB3aGVuIGEgbXVsdGkgcHJvdmlkZXIgYW5kIGEgcmVndWxhciBwcm92aWRlciBhcmUgYm91bmQgdG8gdGhlIHNhbWUgdG9rZW4uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICB7IHByb3ZpZGU6IFwiU3RyaW5nc1wiLCB1c2VWYWx1ZTogXCJzdHJpbmcxXCIsIG11bHRpOiB0cnVlfSxcbiAqICAgeyBwcm92aWRlOiBcIlN0cmluZ3NcIiwgdXNlVmFsdWU6IFwic3RyaW5nMlwiLCBtdWx0aTogZmFsc2V9XG4gKiBdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihcbiAgICBwcm92aWRlcjE6IGFueSwgcHJvdmlkZXIyOiBhbnkpOiBFcnJvciB7XG4gIHJldHVybiBFcnJvcihgQ2Fubm90IG1peCBtdWx0aSBwcm92aWRlcnMgYW5kIHJlZ3VsYXIgcHJvdmlkZXJzLCBnb3Q6ICR7cHJvdmlkZXIxfSAke3Byb3ZpZGVyMn1gKTtcbn1cbiJdfQ==