angular-three 1.10.2 → 2.0.0-beta.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/README.md +89 -5
  2. package/esm2022/index.mjs +5 -7
  3. package/esm2022/lib/canvas.mjs +138 -99
  4. package/esm2022/lib/di/before-render.mjs +7 -10
  5. package/esm2022/lib/di/ref.mjs +38 -59
  6. package/esm2022/lib/directives/args.mjs +5 -8
  7. package/esm2022/lib/directives/common.mjs +20 -13
  8. package/esm2022/lib/directives/parent.mjs +5 -8
  9. package/esm2022/lib/{web → dom}/events.mjs +1 -1
  10. package/esm2022/lib/events.mjs +2 -2
  11. package/esm2022/lib/loader.mjs +58 -44
  12. package/esm2022/lib/loop.mjs +6 -8
  13. package/esm2022/lib/portal.mjs +76 -63
  14. package/esm2022/lib/renderer/provider.mjs +3 -2
  15. package/esm2022/lib/renderer/renderer.mjs +53 -52
  16. package/esm2022/lib/renderer/store.mjs +14 -19
  17. package/esm2022/lib/renderer/utils.mjs +27 -18
  18. package/esm2022/lib/routed-scene.mjs +12 -10
  19. package/esm2022/lib/stores/signal.store.mjs +60 -0
  20. package/esm2022/lib/stores/store.mjs +69 -48
  21. package/esm2022/lib/three-types.mjs +2 -0
  22. package/esm2022/lib/types.mjs +1 -1
  23. package/esm2022/lib/utils/apply-props.mjs +11 -7
  24. package/esm2022/lib/utils/attach.mjs +1 -1
  25. package/esm2022/lib/utils/instance.mjs +14 -14
  26. package/esm2022/lib/utils/safe-detect-changes.mjs +1 -1
  27. package/fesm2022/angular-three.mjs +1673 -1744
  28. package/fesm2022/angular-three.mjs.map +1 -1
  29. package/index.d.ts +4 -6
  30. package/lib/canvas.d.ts +11 -20
  31. package/lib/di/before-render.d.ts +5 -1
  32. package/lib/di/ref.d.ts +5 -11
  33. package/lib/directives/args.d.ts +6 -6
  34. package/lib/directives/common.d.ts +1 -4
  35. package/lib/directives/parent.d.ts +1 -1
  36. package/lib/{web → dom}/events.d.ts +2 -2
  37. package/lib/events.d.ts +3 -3
  38. package/lib/loader.d.ts +6 -2
  39. package/lib/loop.d.ts +4 -4
  40. package/lib/portal.d.ts +11 -18
  41. package/lib/renderer/renderer.d.ts +7 -9
  42. package/lib/renderer/store.d.ts +3 -5
  43. package/lib/renderer/utils.d.ts +6 -4
  44. package/lib/routed-scene.d.ts +4 -2
  45. package/lib/stores/signal.store.d.ts +19 -0
  46. package/lib/stores/store.d.ts +4 -7
  47. package/lib/three-types.d.ts +306 -0
  48. package/lib/types.d.ts +22 -25
  49. package/lib/utils/attach.d.ts +2 -2
  50. package/lib/utils/instance.d.ts +1 -1
  51. package/package.json +6 -7
  52. package/plugin/package.json +1 -1
  53. package/plugin/src/generators/init/init.d.ts +1 -1
  54. package/plugin/src/generators/init/init.js +1 -1
  55. package/esm2022/lib/di/destroy.mjs +0 -23
  56. package/esm2022/lib/di/run-in-context.mjs +0 -40
  57. package/esm2022/lib/pipes/push.mjs +0 -50
  58. package/esm2022/lib/stores/rx-store.mjs +0 -108
  59. package/lib/di/destroy.d.ts +0 -9
  60. package/lib/di/run-in-context.d.ts +0 -6
  61. package/lib/pipes/push.d.ts +0 -16
  62. package/lib/stores/rx-store.d.ts +0 -42
@@ -1,55 +1,69 @@
1
- import { ChangeDetectorRef, inject } from '@angular/core';
2
- import { ReplaySubject, catchError, forkJoin, from, isObservable, map, of, retry, share, switchMap, take, tap, } from 'rxjs';
1
+ import { ChangeDetectorRef, Injector, assertInInjectionContext, computed, effect, inject, runInInjectionContext, signal, untracked, } from '@angular/core';
3
2
  import { makeObjectGraph } from './utils/make';
4
3
  import { safeDetectChanges } from './utils/safe-detect-changes';
5
4
  const cached = new Map();
6
- function load(loaderConstructorFactory, input, extensions, onProgress) {
7
- const urls$ = isObservable(input) ? input : of(input);
8
- return urls$.pipe(map((inputs) => {
9
- const loaderConstructor = loaderConstructorFactory(inputs);
5
+ function load(loaderConstructorFactory, inputs, { extensions, onProgress, } = {}) {
6
+ const computedUrls = computed(() => {
7
+ const input = inputs();
8
+ if (Array.isArray(input))
9
+ return input;
10
+ if (typeof input === 'string')
11
+ return [input];
12
+ return Object.values(input);
13
+ });
14
+ return () => {
15
+ const urls = computedUrls();
16
+ const loaderConstructor = loaderConstructorFactory(urls);
10
17
  const loader = new loaderConstructor();
11
18
  if (extensions)
12
19
  extensions(loader);
13
- const urls = Array.isArray(inputs) ? inputs : typeof inputs === 'string' ? [inputs] : Object.values(inputs);
14
- return [
15
- urls.map((url) => {
16
- if (!cached.has(url)) {
17
- cached.set(url, from(loader.loadAsync(url, onProgress)).pipe(tap((data) => {
18
- if (data['scene'])
19
- Object.assign(data, makeObjectGraph(data['scene']));
20
- }), retry(2), catchError((err) => {
21
- console.error(`[NGT] Error loading ${url}: ${err.message}`);
22
- return of([]);
23
- }), share({ connector: () => new ReplaySubject(1) })));
24
- }
25
- return cached.get(url);
26
- }),
27
- inputs,
28
- ];
29
- }));
30
- }
31
- export function injectNgtLoader(loaderConstructorFactory, input, extensions, onProgress) {
32
- const cdr = inject(ChangeDetectorRef);
33
- return load(loaderConstructorFactory, input, extensions, onProgress).pipe(switchMap(([observables$, inputs]) => {
34
- return forkJoin(observables$).pipe(map((results) => {
35
- if (Array.isArray(inputs))
36
- return results;
37
- if (typeof inputs === 'string')
38
- return results[0];
39
- const keys = Object.keys(inputs);
40
- return keys.reduce((result, key) => {
41
- result[key] = results[keys.indexOf(key)];
42
- return result;
43
- }, {});
44
- }), tap(() => {
45
- requestAnimationFrame(() => void safeDetectChanges(cdr));
20
+ return urls.map((url) => new Promise((resolve, reject) => {
21
+ if (cached.has(url)) {
22
+ resolve(cached.get(url));
23
+ }
24
+ else {
25
+ loader.load(url, (data) => {
26
+ if ('scene' in data)
27
+ Object.assign(data, makeObjectGraph(data['scene']));
28
+ cached.set(url, data);
29
+ resolve(data);
30
+ }, onProgress, (error) => reject(new Error(`[NGT] Could not load ${url}: ${error}`)));
31
+ }
46
32
  }));
47
- }));
33
+ };
34
+ }
35
+ export function injectNgtLoader(loaderConstructorFactory, inputs, { extensions, onProgress, injector = inject(Injector, { optional: true }), } = {}) {
36
+ !injector && assertInInjectionContext(injectNgtLoader);
37
+ return runInInjectionContext(injector, () => {
38
+ const cdr = inject(ChangeDetectorRef);
39
+ const response = signal(null);
40
+ const effector = load(loaderConstructorFactory, inputs, { extensions, onProgress });
41
+ effect(() => {
42
+ const originalUrls = untracked(inputs);
43
+ Promise.all(effector())
44
+ .then((results) => {
45
+ if (Array.isArray(originalUrls))
46
+ return results;
47
+ if (typeof originalUrls === 'string')
48
+ return results[0];
49
+ const keys = Object.keys(originalUrls);
50
+ return keys.reduce((result, key) => {
51
+ result[key] = results[keys.indexOf(key)];
52
+ return result;
53
+ }, {});
54
+ })
55
+ .then((value) => {
56
+ response.set(value);
57
+ safeDetectChanges(cdr);
58
+ });
59
+ }, { injector: injector, allowSignalWrites: true });
60
+ return response.asReadonly();
61
+ });
48
62
  }
63
+ injectNgtLoader['preload'] = (loaderConstructorFactory, inputs, extensions) => {
64
+ Promise.all(load(loaderConstructorFactory, inputs, { extensions })());
65
+ };
49
66
  injectNgtLoader['destroy'] = () => {
50
67
  cached.clear();
51
68
  };
52
- injectNgtLoader['preLoad'] = (loaderConstructorFactory, inputs, extensions) => {
53
- load(loaderConstructorFactory, inputs, extensions).pipe(take(1)).subscribe();
54
- };
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUNILGFBQWEsRUFDYixVQUFVLEVBQ1YsUUFBUSxFQUNSLElBQUksRUFDSixZQUFZLEVBQ1osR0FBRyxFQUNILEVBQUUsRUFDRixLQUFLLEVBQ0wsS0FBSyxFQUNMLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUVOLE1BQU0sTUFBTSxDQUFDO0FBVWQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQU9oRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztBQUVsRCxTQUFTLElBQUksQ0FLVCx3QkFBOEQsRUFDOUQsS0FBOEIsRUFDOUIsVUFBb0QsRUFDcEQsVUFBMkM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDWCxNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFVBQVU7WUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFB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Q0FBQyxHQUFHLEdBQUcsRUFBRTtJQUM5QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBS3pCLHdCQUE4RCxFQUM5RCxNQUErQixFQUMvQixVQUFvRCxFQUN0RCxFQUFFO0lBQ0EsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDakYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBSZXBsYXlTdWJqZWN0LFxuICAgIGNhdGNoRXJyb3IsXG4gICAgZm9ya0pvaW4sXG4gICAgZnJvbSxcbiAgICBpc09ic2VydmFibGUsXG4gICAgbWFwLFxuICAgIG9mLFxuICAgIHJldHJ5LFxuICAgIHNoYXJlLFxuICAgIHN3aXRjaE1hcCxcbiAgICB0YWtlLFxuICAgIHRhcCxcbiAgICB0eXBlIE9ic2VydmFibGUsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBHTFRGIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvR0xURkxvYWRlcic7XG5pbXBvcnQgdHlwZSB7XG4gICAgTmd0QW55UmVjb3JkLFxuICAgIE5ndEJyYW5jaGluZ1JldHVybixcbiAgICBOZ3RMb2FkZXJFeHRlbnNpb25zLFxuICAgIE5ndExvYWRlclByb3RvLFxuICAgIE5ndExvYWRlclJldHVyblR5cGUsXG4gICAgTmd0T2JqZWN0TWFwLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IG1ha2VPYmplY3RHcmFwaCB9IGZyb20gJy4vdXRpbHMvbWFrZSc7XG5pbXBvcnQgeyBzYWZlRGV0ZWN0Q2hhbmdlcyB9IGZyb20gJy4vdXRpbHMvc2FmZS1kZXRlY3QtY2hhbmdlcyc7XG5cbmV4cG9ydCB0eXBlIE5ndExvYWRlclJlc3VsdHM8XG4gICAgVElucHV0IGV4dGVuZHMgc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIFRSZXR1cm5cbj4gPSBUSW5wdXQgZXh0ZW5kcyBzdHJpbmdbXSA/IFRSZXR1cm5bXSA6IFRJbnB1dCBleHRlbmRzIG9iamVjdCA/IHsgW2tleSBpbiBrZXlvZiBUSW5wdXRdOiBUUmV0dXJuIH0gOiBUUmV0dXJuO1xuXG5jb25zdCBjYWNoZWQgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxhbnk+PigpO1xuXG5mdW5jdGlvbiBsb2FkPFxuICAgIFREYXRhLFxuICAgIFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgVExvYWRlckNvbnN0cnVjdG9yIGV4dGVuZHMgTmd0TG9hZGVyUHJvdG88VERhdGE+XG4+KFxuICAgIGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogVFVybCkgPT4gVExvYWRlckNvbnN0cnVjdG9yLFxuICAgIGlucHV0OiBUVXJsIHwgT2JzZXJ2YWJsZTxUVXJsPixcbiAgICBleHRlbnNpb25zPzogTmd0TG9hZGVyRXh0ZW5zaW9uczxUTG9hZGVyQ29uc3RydWN0b3I+LFxuICAgIG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWRcbikge1xuICAgIGNvbnN0IHVybHMkID0gaXNPYnNlcnZhYmxlKGlucHV0KSA/IGlucHV0IDogb2YoaW5wdXQpO1xuICAgIHJldHVybiB1cmxzJC5waXBlKFxuICAgICAgICBtYXAoKGlucHV0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQ29uc3RydWN0b3IgPSBsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnkoaW5wdXRzKTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBsb2FkZXJDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMpIGV4dGVuc2lvbnMobG9hZGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVybHMgPSBBcnJheS5pc0FycmF5KGlucHV0cykgPyBpbnB1dHMgOiB0eXBlb2YgaW5wdXRzID09PSAnc3RyaW5nJyA/IFtpbnB1dHNdIDogT2JqZWN0LnZhbHVlcyhpbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB1cmxzLm1hcCgodXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWQuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKGxvYWRlci5sb2FkQXN5bmModXJsLCBvblByb2dyZXNzKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRhdGEgYXMgTmd0QW55UmVjb3JkKVsnc2NlbmUnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGFzIE5ndEFueVJlY29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZU9iamVjdEdyYXBoKChkYXRhIGFzIE5ndEFueVJlY29yZClbJ3NjZW5lJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtOR1RdIEVycm9yIGxvYWRpbmcgJHt1cmx9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5nZXQodXJsKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBdIGFzIFtBcnJheTxPYnNlcnZhYmxlPGFueT4+LCBUVXJsIHwgVFVybFtdXTtcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Tmd0TG9hZGVyPFxuICAgIFREYXRhLFxuICAgIFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgVExvYWRlckNvbnN0cnVjdG9yIGV4dGVuZHMgTmd0TG9hZGVyUHJvdG88VERhdGE+LFxuICAgIFRSZXR1cm4gPSBOZ3RMb2FkZXJSZXR1cm5UeXBlPFREYXRhLCBUTG9hZGVyQ29uc3RydWN0b3I+XG4+KFxuICAgIGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogVFVybCkgPT4gVExvYWRlckNvbnN0cnVjdG9yLFxuICAgIGlucHV0OiBUVXJsIHwgT2JzZXJ2YWJsZTxUVXJsPixcbiAgICBleHRlbnNpb25zPzogTmd0TG9hZGVyRXh0ZW5zaW9uczxUTG9hZGVyQ29uc3RydWN0b3I+LFxuICAgIG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IE9ic2VydmFibGU8Tmd0TG9hZGVyUmVzdWx0czxUVXJsLCBOZ3RCcmFuY2hpbmdSZXR1cm48VFJldHVybiwgR0xURiwgR0xURiAmIE5ndE9iamVjdE1hcD4+PiB7XG4gICAgY29uc3QgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIHJldHVybiBsb2FkKGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeSwgaW5wdXQsIGV4dGVuc2lvbnMsIG9uUHJvZ3Jlc3MpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoW29ic2VydmFibGVzJCwgaW5wdXRzXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzJCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRzKSkgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRzID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIHR5cGVvZiByZXN1bHRdID0gcmVzdWx0c1trZXlzLmluZGV4T2Yoa2V5KV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSBhcyB7IFtrZXkgaW4ga2V5b2YgVFVybF06IE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuLCBHTFRGLCBHTFRGICYgTmd0T2JqZWN0TWFwPiB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCBzYWZlRGV0ZWN0Q2hhbmdlcyhjZHIpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5pbmplY3ROZ3RMb2FkZXJbJ2Rlc3Ryb3knXSA9ICgpID0+IHtcbiAgICBjYWNoZWQuY2xlYXIoKTtcbn07XG5cbmluamVjdE5ndExvYWRlclsncHJlTG9hZCddID0gPFxuICAgIFREYXRhLFxuICAgIFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgVExvYWRlckNvbnN0cnVjdG9yIGV4dGVuZHMgTmd0TG9hZGVyUHJvdG88VERhdGE+XG4+KFxuICAgIGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogVFVybCkgPT4gVExvYWRlckNvbnN0cnVjdG9yLFxuICAgIGlucHV0czogVFVybCB8IE9ic2VydmFibGU8VFVybD4sXG4gICAgZXh0ZW5zaW9ucz86IE5ndExvYWRlckV4dGVuc2lvbnM8VExvYWRlckNvbnN0cnVjdG9yPlxuKSA9PiB7XG4gICAgbG9hZChsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnksIGlucHV0cywgZXh0ZW5zaW9ucykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcbn07XG4iXX0=
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQVV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBT2hFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFekIsU0FBUyxJQUFJLENBS1Qsd0JBQWtFLEVBQ2xFLE1BQWtCLEVBQ2xCLEVBQ0ksVUFBVSxFQUNWLFVBQVUsTUFJVixFQUFFO0lBRU4sTUFBTSxZQUFZLEdBQXFCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZDLElBQUksVUFBVTtZ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RSxRQUFRLEVBQUUsUUFBUyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUNuRCxDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBS3pCLHdCQUFrRSxFQUNsRSxNQUFvQixFQUNwQixVQUFvRCxFQUN0RCxFQUFFO0lBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBRUYsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRTtJQUM5QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBJbmplY3RvcixcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsXG4gICAgY29tcHV0ZWQsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbiAgICB0eXBlIFNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEdMVEYgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcbmltcG9ydCB0eXBlIHtcbiAgICBOZ3RBbnlSZWNvcmQsXG4gICAgTmd0QnJhbmNoaW5nUmV0dXJuLFxuICAgIE5ndExvYWRlckV4dGVuc2lvbnMsXG4gICAgTmd0TG9hZGVyUHJvdG8sXG4gICAgTmd0TG9hZGVyUmV0dXJuVHlwZSxcbiAgICBOZ3RPYmplY3RNYXAsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWFrZU9iamVjdEdyYXBoIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB7IHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcblxuZXhwb3J0IHR5cGUgTmd0TG9hZGVyUmVzdWx0czxcbiAgICBUSW5wdXQgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgVFJldHVyblxuPiA9IFRJbnB1dCBleHRlbmRzIHN0cmluZ1tdID8gVFJldHVybltdIDogVElucHV0IGV4dGVuZHMgb2JqZWN0ID8geyBba2V5IGluIGtleW9mIFRJbnB1dF06IFRSZXR1cm4gfSA6IFRSZXR1cm47XG5cbmNvbnN0IGNhY2hlZCA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gbG9hZDxcbiAgICBURGF0YSxcbiAgICBUVXJsIGV4dGVuZHMgc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIFRMb2FkZXJDb25zdHJ1Y3RvciBleHRlbmRzIE5ndExvYWRlclByb3RvPFREYXRhPlxuPihcbiAgICBsb2FkZXJDb25zdHJ1Y3RvckZhY3Rvcnk6IChpbnB1dHM6IHN0cmluZ1tdKSA9PiBUTG9hZGVyQ29uc3RydWN0b3IsXG4gICAgaW5wdXRzOiAoKSA9PiBUVXJsLFxuICAgIHtcbiAgICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgICAgb25Qcm9ncmVzcyxcbiAgICB9OiB7XG4gICAgICAgIGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zPFRMb2FkZXJDb25zdHJ1Y3Rvcj47XG4gICAgICAgIG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWQ7XG4gICAgfSA9IHt9XG4pIHtcbiAgICBjb25zdCBjb21wdXRlZFVybHM6IFNpZ25hbDxzdHJpbmdbXT4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzKCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGlucHV0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVybHMgPSBjb21wdXRlZFVybHMoKTtcbiAgICAgICAgY29uc3QgbG9hZGVyQ29uc3RydWN0b3IgPSBsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnkodXJscyk7XG4gICAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBsb2FkZXJDb25zdHJ1Y3RvcigpO1xuICAgICAgICBpZiAoZXh0ZW5zaW9ucykgZXh0ZW5zaW9ucyhsb2FkZXIpO1xuXG4gICAgICAgIHJldHVybiB1cmxzLm1hcChcbiAgICAgICAgICAgICh1cmwpID0+XG4gICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhY2hlZC5nZXQodXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubG9hZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzY2VuZScgaW4gKGRhdGEgYXMgTmd0QW55UmVjb3JkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBhcyBOZ3RBbnlSZWNvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZU9iamVjdEdyYXBoKChkYXRhIGFzIE5ndEFueVJlY29yZClbJ3NjZW5lJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWQuc2V0KHVybCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4gcmVqZWN0KG5ldyBFcnJvcihgW05HVF0gQ291bGQgbm90IGxvYWQgJHt1cmx9OiAke2Vycm9yfWApKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5ndExvYWRlcjxcbiAgICBURGF0YSxcbiAgICBUVXJsIGV4dGVuZHMgc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIFRMb2FkZXJDb25zdHJ1Y3RvciBleHRlbmRzIE5ndExvYWRlclByb3RvPFREYXRhPixcbiAgICBUUmV0dXJuID0gTmd0TG9hZGVyUmV0dXJuVHlwZTxURGF0YSwgVExvYWRlckNvbnN0cnVjdG9yPlxuPihcbiAgICBsb2FkZXJDb25zdHJ1Y3RvckZhY3Rvcnk6IChpbnB1dHM6IHN0cmluZ1tdKSA9PiBUTG9hZGVyQ29uc3RydWN0b3IsXG4gICAgaW5wdXRzOiAoKSA9PiBUVXJsLFxuICAgIHtcbiAgICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgICAgb25Qcm9ncmVzcyxcbiAgICAgICAgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IsIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgfToge1xuICAgICAgICBleHRlbnNpb25zPzogTmd0TG9hZGVyRXh0ZW5zaW9uczxUTG9hZGVyQ29uc3RydWN0b3I+O1xuICAgICAgICBvblByb2dyZXNzPzogKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICAgICAgICBpbmplY3Rvcj86IEluamVjdG9yIHwgbnVsbDtcbiAgICB9ID0ge31cbik6IFNpZ25hbDxOZ3RMb2FkZXJSZXN1bHRzPFRVcmwsIE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuLCBHTFRGLCBHTFRGICYgTmd0T2JqZWN0TWFwPj4+IHtcbiAgICAhaW5qZWN0b3IgJiYgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KGluamVjdE5ndExvYWRlcik7XG5cbiAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yISwgKCkgPT4ge1xuICAgICAgICBjb25zdCBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHNpZ25hbDxOZ3RMb2FkZXJSZXN1bHRzPFRVcmwsIE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuLCBHTFRGLCBHTFRGICYgTmd0T2JqZWN0TWFwPj4+KG51bGwhKTtcbiAgICAgICAgY29uc3QgZWZmZWN0b3IgPSBsb2FkKGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeSwgaW5wdXRzLCB7IGV4dGVuc2lvbnMsIG9uUHJvZ3Jlc3MgfSk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJscyA9IHVudHJhY2tlZChpbnB1dHMpO1xuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGVmZmVjdG9yKCkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW5hbFVybHMpKSByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxVcmxzID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxVcmxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0IGFzIE5ndEFueVJlY29yZClba2V5XSA9IHJlc3VsdHNba2V5cy5pbmRleE9mKGtleSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSBhcyB7IFtrZXkgaW4ga2V5b2YgVFVybF06IE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuLCBHTFRGLCBHTFRGICYgTmd0T2JqZWN0TWFwPiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgTmd0TG9hZGVyUmVzdWx0czxUVXJsLCBOZ3RCcmFuY2hpbmdSZXR1cm48VFJldHVybiwgR0xURiwgR0xURiAmIE5ndE9iamVjdE1hcD4+XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2FmZURldGVjdENoYW5nZXMoY2RyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogaW5qZWN0b3IhLCBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFzUmVhZG9ubHkoKTtcbiAgICB9KTtcbn1cblxuaW5qZWN0Tmd0TG9hZGVyWydwcmVsb2FkJ10gPSA8XG4gICAgVERhdGEsXG4gICAgVFVybCBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBUTG9hZGVyQ29uc3RydWN0b3IgZXh0ZW5kcyBOZ3RMb2FkZXJQcm90bzxURGF0YT5cbj4oXG4gICAgbG9hZGVyQ29uc3RydWN0b3JGYWN0b3J5OiAoaW5wdXRzOiBzdHJpbmdbXSkgPT4gVExvYWRlckNvbnN0cnVjdG9yLFxuICAgIGlucHV0czogU2lnbmFsPFRVcmw+LFxuICAgIGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zPFRMb2FkZXJDb25zdHJ1Y3Rvcj5cbikgPT4ge1xuICAgIFByb21pc2UuYWxsKGxvYWQobG9hZGVyQ29uc3RydWN0b3JGYWN0b3J5LCBpbnB1dHMsIHsgZXh0ZW5zaW9ucyB9KSgpKTtcbn07XG5cbmluamVjdE5ndExvYWRlclsnZGVzdHJveSddID0gKCkgPT4ge1xuICAgIGNhY2hlZC5jbGVhcigpO1xufTtcbiJdfQ==
@@ -49,15 +49,14 @@ function render(timestamp, store, frame) {
49
49
  state.clock.elapsedTime = timestamp;
50
50
  }
51
51
  // Call subscribers (useFrame)
52
- // subscribers = state.internal.subscribers;
53
- for (let i = 0; i < state.internal.subscribers.length; i++) {
54
- const subscriber = state.internal.subscribers[i];
55
- subscriber.callback({ ...state, delta, frame });
52
+ const subscribers = state.internal.subscribers;
53
+ for (let i = 0; i < subscribers.length; i++) {
54
+ const subscription = subscribers[i];
55
+ subscription.callback({ ...subscription.store.get(), delta, frame });
56
56
  }
57
57
  // Render content
58
- if (!state.internal.priority && state.gl.render) {
58
+ if (!state.internal.priority && state.gl.render)
59
59
  state.gl.render(state.scene, state.camera);
60
- }
61
60
  // Decrease frame count
62
61
  state.internal.frames = Math.max(0, state.internal.frames - 1);
63
62
  return state.frameloop === 'always' ? 1 : state.internal.frames;
@@ -114,7 +113,6 @@ export function createLoop(roots) {
114
113
  if (!state)
115
114
  for (const root of roots.values())
116
115
  render(timestamp, root);
117
- // safe to assume store is available here
118
116
  else
119
117
  render(timestamp, store, frame);
120
118
  if (runGlobalEffects)
@@ -134,4 +132,4 @@ export function createLoop(roots) {
134
132
  advance,
135
133
  };
136
134
  }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS9zcmMvbGliL2xvb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsU0FBUyxVQUFVLENBQUMsUUFBaUMsRUFBRSxJQUFxQjtJQUN4RSxNQUFNLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxrQkFBa0IsR0FBb0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN0RCxNQUFNLGlCQUFpQixHQUFvQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFcEc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBaUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlHOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUV0RyxTQUFTLEdBQUcsQ0FBQyxPQUF3QixFQUFFLFNBQWlCO0lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDMUIsS0FBSyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksT0FBTyxDQUFDLE1B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QUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNyRSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCxTQUFTLE9BQU8sQ0FDWixTQUFpQixFQUNqQixtQkFBNEIsSUFBSSxFQUNoQyxLQUE0QixFQUM1QixLQUFlO1FBRWYsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksZ0JBQWdCO1lBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkUseUNBQXlDOztZQUNwQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLGdCQUFnQjtZQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsT0FBTztRQUNILElBQUk7UUFDSjs7O1dBR0c7UUFDSCxVQUFVO1FBQ1Y7OztXQUdHO1FBQ0gsT0FBTztLQUNWLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmd0UnhTdG9yZSB9IGZyb20gJy4vc3RvcmVzL3J4LXN0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0U3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2sgPSAodGltZXN0YW1wOiBudW1iZXIpID0+IHZvaWQ7XG50eXBlIE5ndFN1Ykl0ZW0gPSB7IGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjayB9O1xuXG5mdW5jdGlvbiBjcmVhdGVTdWJzKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaywgc3ViczogU2V0PE5ndFN1Ykl0ZW0+KTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3Qgc3ViID0geyBjYWxsYmFjayB9O1xuICAgIHN1YnMuYWRkKHN1Yik7XG4gICAgcmV0dXJuICgpID0+IHZvaWQgc3Vicy5kZWxldGUoc3ViKTtcbn1cblxuY29uc3QgZ2xvYmFsRWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuY29uc3QgZ2xvYmFsQWZ0ZXJFZmZlY3RzOiBTZXQ8Tmd0U3ViSXRlbT4gPSBuZXcgU2V0KCk7XG5jb25zdCBnbG9iYWxUYWlsRWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuXG4vKipcbiAqIEFkZHMgYSBnbG9iYWwgcmVuZGVyIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkZEVmZmVjdFxuICovXG5leHBvcnQgY29uc3QgYWRkRWZmZWN0ID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsRWZmZWN0cyk7XG5cbi8qKlxuICogQWRkcyBhIGdsb2JhbCBhZnRlci1yZW5kZXIgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGVhY2ggZnJhbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjYWRkQWZ0ZXJFZmZlY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEFmdGVyRWZmZWN0ID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsQWZ0ZXJFZmZlY3RzKTtcblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBzdG9wcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNhZGRUYWlsXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUYWlsID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsVGFpbEVmZmVjdHMpO1xuXG5mdW5jdGlvbiBydW4oZWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+LCB0aW1lc3RhbXA6IG51bWJlcikge1xuICAgIGlmICghZWZmZWN0cy5zaXplKSByZXR1cm47XG4gICAgZm9yIChjb25zdCB7IGNhbGxiYWNrIH0gb2YgZWZmZWN0cy52YWx1ZXMoKSkge1xuICAgICAgICBjYWxsYmFjayh0aW1lc3RhbXApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgR2xvYmFsRWZmZWN0VHlwZSA9ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICd0YWlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoR2xvYmFsRWZmZWN0cyh0eXBlOiBHbG9iYWxFZmZlY3RUeXBlLCB0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgcmV0dXJuIHJ1bihnbG9iYWxFZmZlY3RzLCB0aW1lc3RhbXApO1xuICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICByZXR1cm4gcnVuKGdsb2JhbEFmdGVyRWZmZWN0cywgdGltZXN0YW1wKTtcbiAgICAgICAgY2FzZSAndGFpbCc6XG4gICAgICAgICAgICByZXR1cm4gcnVuKGdsb2JhbFRhaWxFZmZlY3RzLCB0aW1lc3RhbXApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyKHRpbWVzdGFtcDogbnVtYmVyLCBzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4sIGZyYW1lPzogWFJGcmFtZSkge1xuICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG4gICAgLy8gUnVuIGxvY2FsIGVmZmVjdHNcbiAgICBsZXQgZGVsdGEgPSBzdGF0ZS5jbG9jay5nZXREZWx0YSgpO1xuICAgIC8vIEluIGZyYW1lbG9vcD0nbmV2ZXInIG1vZGUsIGNsb2NrIHRpbWVzIGFyZSB1cGRhdGVkIHVzaW5nIHRoZSBwcm92aWRlZCB0aW1lc3RhbXBcbiAgICBpZiAoc3RhdGUuZnJhbWVsb29wID09PSAnbmV2ZXInICYmIHR5cGVvZiB0aW1lc3RhbXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRlbHRhID0gdGltZXN0YW1wIC0gc3RhdGUuY2xvY2suZWxhcHNlZFRpbWU7XG4gICAgICAgIHN0YXRlLmNsb2NrLm9sZFRpbWUgPSBzdGF0ZS5jbG9jay5lbGFwc2VkVGltZTtcbiAgICAgICAgc3RhdGUuY2xvY2suZWxhcHNlZFRpbWUgPSB0aW1lc3RhbXA7XG4gICAgfVxuICAgIC8vIENhbGwgc3Vic2NyaWJlcnMgKHVzZUZyYW1lKVxuICAgIC8vIHN1YnNjcmliZXJzID0gc3RhdGUuaW50ZXJuYWwuc3Vic2NyaWJlcnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS5pbnRlcm5hbC5zdWJzY3JpYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gc3RhdGUuaW50ZXJuYWwuc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIHN1YnNjcmliZXIuY2FsbGJhY2soeyAuLi5zdGF0ZSwgZGVsdGEsIGZyYW1lIH0pO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgY29udGVudFxuICAgIGlmICghc3RhdGUuaW50ZXJuYWwucHJpb3JpdHkgJiYgc3RhdGUuZ2wucmVuZGVyKSB7XG4gICAgICAgIHN0YXRlLmdsLnJlbmRlcihzdGF0ZS5zY2VuZSwgc3RhdGUuY2FtZXJhKTtcbiAgICB9XG4gICAgLy8gRGVjcmVhc2UgZnJhbWUgY291bnRcbiAgICBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1heCgwLCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgLSAxKTtcbiAgICByZXR1cm4gc3RhdGUuZnJhbWVsb29wID09PSAnYWx3YXlzJyA/IDEgOiBzdGF0ZS5pbnRlcm5hbC5mcmFtZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb29wPFRDYW52YXM+KHJvb3RzOiBNYXA8VENhbnZhcywgTmd0UnhTdG9yZTxOZ3RTdGF0ZT4+KSB7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsZXQgcmVwZWF0OiBudW1iZXI7XG4gICAgbGV0IGZyYW1lOiBudW1iZXI7XG5cbiAgICBmdW5jdGlvbiBsb29wKHRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVwZWF0ID0gMDtcblxuICAgICAgICAvLyBSdW4gZWZmZWN0c1xuICAgICAgICBmbHVzaEdsb2JhbEVmZmVjdHMoJ2JlZm9yZScsIHRpbWVzdGFtcCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIGFsbCByb290c1xuICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gcm9vdC5nZXQoKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBmcmFtZWxvb3AgaXMgaW52YWxpZGF0ZWQsIGRvIG5vdCBydW4gYW5vdGhlciBmcmFtZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0YXRlLmludGVybmFsLmFjdGl2ZSAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5mcmFtZWxvb3AgPT09ICdhbHdheXMnIHx8IHN0YXRlLmludGVybmFsLmZyYW1lcyA+IDApICYmXG4gICAgICAgICAgICAgICAgIXN0YXRlLmdsLnhyPy5pc1ByZXNlbnRpbmdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJlcGVhdCArPSByZW5kZXIodGltZXN0YW1wLCByb290KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biBhZnRlci1lZmZlY3RzXG4gICAgICAgIGZsdXNoR2xvYmFsRWZmZWN0cygnYWZ0ZXInLCB0aW1lc3RhbXApO1xuXG4gICAgICAgIC8vIFN0b3AgdGhlIGxvb3AgaWYgbm90aGluZyBpbnZhbGlkYXRlcyBpdFxuICAgICAgICBpZiAocmVwZWF0ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUYWlsIGNhbGwgZWZmZWN0cywgdGhleSBhcmUgY2FsbGVkIHdoZW4gcmVuZGVyaW5nIHN0b3BzXG4gICAgICAgICAgICBmbHVzaEdsb2JhbEVmZmVjdHMoJ3RhaWwnLCB0aW1lc3RhbXApO1xuXG4gICAgICAgICAgICAvLyBGbGFnIGVuZCBvZiBvcGVyYXRpb25cbiAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkYXRlKHN0b3JlPzogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4sIGZyYW1lcyA9IDEpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZT8uZ2V0KCk7XG4gICAgICAgIGlmICghc3RhdGUpIHJldHVybiByb290cy5mb3JFYWNoKChyb290KSA9PiBpbnZhbGlkYXRlKHJvb3QsIGZyYW1lcykpO1xuICAgICAgICBpZiAoc3RhdGUuZ2wueHI/LmlzUHJlc2VudGluZyB8fCAhc3RhdGUuaW50ZXJuYWwuYWN0aXZlIHx8IHN0YXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJykgcmV0dXJuO1xuICAgICAgICAvLyBJbmNyZWFzZSBmcmFtZXMsIGRvIG5vdCBnbyBoaWdoZXIgdGhhbiA2MFxuICAgICAgICBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1pbig2MCwgc3RhdGUuaW50ZXJuYWwuZnJhbWVzICsgZnJhbWVzKTtcbiAgICAgICAgLy8gSWYgdGhlIHJlbmRlci1sb29wIGlzbid0IGFjdGl2ZSwgc3RhcnQgaXRcbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkdmFuY2UoXG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyLFxuICAgICAgICBydW5HbG9iYWxFZmZlY3RzOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgc3RvcmU/OiBOZ3RSeFN0b3JlPE5ndFN0YXRlPixcbiAgICAgICAgZnJhbWU/OiBYUkZyYW1lXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmU/LmdldCgpO1xuICAgICAgICBpZiAocnVuR2xvYmFsRWZmZWN0cykgZmx1c2hHbG9iYWxFZmZlY3RzKCdiZWZvcmUnLCB0aW1lc3RhbXApO1xuICAgICAgICBpZiAoIXN0YXRlKSBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMudmFsdWVzKCkpIHJlbmRlcih0aW1lc3RhbXAsIHJvb3QpO1xuICAgICAgICAvLyBzYWZlIHRvIGFzc3VtZSBzdG9yZSBpcyBhdmFpbGFibGUgaGVyZVxuICAgICAgICBlbHNlIHJlbmRlcih0aW1lc3RhbXAsIHN0b3JlISwgZnJhbWUpO1xuICAgICAgICBpZiAocnVuR2xvYmFsRWZmZWN0cykgZmx1c2hHbG9iYWxFZmZlY3RzKCdhZnRlcicsIHRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9vcCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludmFsaWRhdGVzIHRoZSB2aWV3LCByZXF1ZXN0aW5nIGEgZnJhbWUgdG8gYmUgcmVuZGVyZWQuIFdpbGwgZ2xvYmFsbHkgaW52YWxpZGF0ZSB1bmxlc3MgcGFzc2VkIGEgcm9vdCdzIHN0YXRlLlxuICAgICAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjaW52YWxpZGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgaW52YWxpZGF0ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkdmFuY2VzIHRoZSBmcmFtZWxvb3AgYW5kIHJ1bnMgcmVuZGVyIGVmZmVjdHMsIHVzZWZ1bCBmb3Igd2hlbiBtYW51YWxseSByZW5kZXJpbmcgdmlhIGBmcmFtZWxvb3A9XCJuZXZlclwiYC5cbiAgICAgICAgICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkdmFuY2VcbiAgICAgICAgICovXG4gICAgICAgIGFkdmFuY2UsXG4gICAgfTtcbn1cbiJdfQ==
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS9zcmMvbGliL2xvb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsU0FBUyxVQUFVLENBQUMsUUFBaUMsRUFBRSxJQUFxQjtJQUN4RSxNQUFNLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxrQkFBa0IsR0FBb0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN0RCxNQUFNLGlCQUFpQixHQUFvQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFcEc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBaUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlHOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUV0RyxTQUFTLEdBQUcsQ0FBQyxPQUF3QixFQUFFLFNBQWlCO0lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDMUIsS0FBSyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksT0FBTyxDQUFDLE1B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LENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNyRSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCxTQUFTLE9BQU8sQ0FDWixTQUFpQixFQUNqQixtQkFBNEIsSUFBSSxFQUNoQyxLQUFnQyxFQUNoQyxLQUFlO1FBRWYsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksZ0JBQWdCO1lBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7O1lBQ2xFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksZ0JBQWdCO1lBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSTtRQUNKOzs7V0FHRztRQUNILFVBQVU7UUFDVjs7O1dBR0c7UUFDSCxPQUFPO0tBQ1YsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi9zdG9yZXMvc2lnbmFsLnN0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0U3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2sgPSAodGltZXN0YW1wOiBudW1iZXIpID0+IHZvaWQ7XG50eXBlIE5ndFN1Ykl0ZW0gPSB7IGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjayB9O1xuXG5mdW5jdGlvbiBjcmVhdGVTdWJzKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaywgc3ViczogU2V0PE5ndFN1Ykl0ZW0+KTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3Qgc3ViID0geyBjYWxsYmFjayB9O1xuICAgIHN1YnMuYWRkKHN1Yik7XG4gICAgcmV0dXJuICgpID0+IHZvaWQgc3Vicy5kZWxldGUoc3ViKTtcbn1cblxuY29uc3QgZ2xvYmFsRWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuY29uc3QgZ2xvYmFsQWZ0ZXJFZmZlY3RzOiBTZXQ8Tmd0U3ViSXRlbT4gPSBuZXcgU2V0KCk7XG5jb25zdCBnbG9iYWxUYWlsRWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuXG4vKipcbiAqIEFkZHMgYSBnbG9iYWwgcmVuZGVyIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkZEVmZmVjdFxuICovXG5leHBvcnQgY29uc3QgYWRkRWZmZWN0ID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsRWZmZWN0cyk7XG5cbi8qKlxuICogQWRkcyBhIGdsb2JhbCBhZnRlci1yZW5kZXIgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGVhY2ggZnJhbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjYWRkQWZ0ZXJFZmZlY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEFmdGVyRWZmZWN0ID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsQWZ0ZXJFZmZlY3RzKTtcblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBzdG9wcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNhZGRUYWlsXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUYWlsID0gKGNhbGxiYWNrOiBOZ3RHbG9iYWxSZW5kZXJDYWxsYmFjaykgPT4gY3JlYXRlU3VicyhjYWxsYmFjaywgZ2xvYmFsVGFpbEVmZmVjdHMpO1xuXG5mdW5jdGlvbiBydW4oZWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+LCB0aW1lc3RhbXA6IG51bWJlcikge1xuICAgIGlmICghZWZmZWN0cy5zaXplKSByZXR1cm47XG4gICAgZm9yIChjb25zdCB7IGNhbGxiYWNrIH0gb2YgZWZmZWN0cy52YWx1ZXMoKSkge1xuICAgICAgICBjYWxsYmFjayh0aW1lc3RhbXApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgR2xvYmFsRWZmZWN0VHlwZSA9ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICd0YWlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoR2xvYmFsRWZmZWN0cyh0eXBlOiBHbG9iYWxFZmZlY3RUeXBlLCB0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgcmV0dXJuIHJ1bihnbG9iYWxFZmZlY3RzLCB0aW1lc3RhbXApO1xuICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICByZXR1cm4gcnVuKGdsb2JhbEFmdGVyRWZmZWN0cywgdGltZXN0YW1wKTtcbiAgICAgICAgY2FzZSAndGFpbCc6XG4gICAgICAgICAgICByZXR1cm4gcnVuKGdsb2JhbFRhaWxFZmZlY3RzLCB0aW1lc3RhbXApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyKHRpbWVzdGFtcDogbnVtYmVyLCBzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+LCBmcmFtZT86IFhSRnJhbWUpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldCgpO1xuICAgIC8vIFJ1biBsb2NhbCBlZmZlY3RzXG4gICAgbGV0IGRlbHRhID0gc3RhdGUuY2xvY2suZ2V0RGVsdGEoKTtcbiAgICAvLyBJbiBmcmFtZWxvb3A9J25ldmVyJyBtb2RlLCBjbG9jayB0aW1lcyBhcmUgdXBkYXRlZCB1c2luZyB0aGUgcHJvdmlkZWQgdGltZXN0YW1wXG4gICAgaWYgKHN0YXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJyAmJiB0eXBlb2YgdGltZXN0YW1wID09PSAnbnVtYmVyJykge1xuICAgICAgICBkZWx0YSA9IHRpbWVzdGFtcCAtIHN0YXRlLmNsb2NrLmVsYXBzZWRUaW1lO1xuICAgICAgICBzdGF0ZS5jbG9jay5vbGRUaW1lID0gc3RhdGUuY2xvY2suZWxhcHNlZFRpbWU7XG4gICAgICAgIHN0YXRlLmNsb2NrLmVsYXBzZWRUaW1lID0gdGltZXN0YW1wO1xuICAgIH1cbiAgICAvLyBDYWxsIHN1YnNjcmliZXJzICh1c2VGcmFtZSlcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IHN0YXRlLmludGVybmFsLnN1YnNjcmliZXJzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjayh7IC4uLnN1YnNjcmlwdGlvbi5zdG9yZS5nZXQoKSwgZGVsdGEsIGZyYW1lIH0pO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgY29udGVudFxuICAgIGlmICghc3RhdGUuaW50ZXJuYWwucHJpb3JpdHkgJiYgc3RhdGUuZ2wucmVuZGVyKSBzdGF0ZS5nbC5yZW5kZXIoc3RhdGUuc2NlbmUsIHN0YXRlLmNhbWVyYSk7XG4gICAgLy8gRGVjcmVhc2UgZnJhbWUgY291bnRcbiAgICBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1heCgwLCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgLSAxKTtcbiAgICByZXR1cm4gc3RhdGUuZnJhbWVsb29wID09PSAnYWx3YXlzJyA/IDEgOiBzdGF0ZS5pbnRlcm5hbC5mcmFtZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb29wPFRDYW52YXM+KHJvb3RzOiBNYXA8VENhbnZhcywgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+Pikge1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHJlcGVhdDogbnVtYmVyO1xuICAgIGxldCBmcmFtZTogbnVtYmVyO1xuXG4gICAgZnVuY3Rpb24gbG9vcCh0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgICAgIHJlcGVhdCA9IDA7XG5cbiAgICAgICAgLy8gUnVuIGVmZmVjdHNcbiAgICAgICAgZmx1c2hHbG9iYWxFZmZlY3RzKCdiZWZvcmUnLCB0aW1lc3RhbXApO1xuXG4gICAgICAgIC8vIFJlbmRlciBhbGwgcm9vdHNcbiAgICAgICAgZm9yIChjb25zdCByb290IG9mIHJvb3RzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHJvb3QuZ2V0KCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZnJhbWVsb29wIGlzIGludmFsaWRhdGVkLCBkbyBub3QgcnVuIGFub3RoZXIgZnJhbWVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdGF0ZS5pbnRlcm5hbC5hY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUuZnJhbWVsb29wID09PSAnYWx3YXlzJyB8fCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPiAwKSAmJlxuICAgICAgICAgICAgICAgICFzdGF0ZS5nbC54cj8uaXNQcmVzZW50aW5nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXBlYXQgKz0gcmVuZGVyKHRpbWVzdGFtcCwgcm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gYWZ0ZXItZWZmZWN0c1xuICAgICAgICBmbHVzaEdsb2JhbEVmZmVjdHMoJ2FmdGVyJywgdGltZXN0YW1wKTtcblxuICAgICAgICAvLyBTdG9wIHRoZSBsb29wIGlmIG5vdGhpbmcgaW52YWxpZGF0ZXMgaXRcbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGFpbCBjYWxsIGVmZmVjdHMsIHRoZXkgYXJlIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBzdG9wc1xuICAgICAgICAgICAgZmx1c2hHbG9iYWxFZmZlY3RzKCd0YWlsJywgdGltZXN0YW1wKTtcblxuICAgICAgICAgICAgLy8gRmxhZyBlbmQgb2Ygb3BlcmF0aW9uXG4gICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZGF0ZShzdG9yZT86IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgZnJhbWVzID0gMSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlPy5nZXQoKTtcbiAgICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIHJvb3RzLmZvckVhY2goKHJvb3QpID0+IGludmFsaWRhdGUocm9vdCwgZnJhbWVzKSk7XG4gICAgICAgIGlmIChzdGF0ZS5nbC54cj8uaXNQcmVzZW50aW5nIHx8ICFzdGF0ZS5pbnRlcm5hbC5hY3RpdmUgfHwgc3RhdGUuZnJhbWVsb29wID09PSAnbmV2ZXInKSByZXR1cm47XG4gICAgICAgIC8vIEluY3JlYXNlIGZyYW1lcywgZG8gbm90IGdvIGhpZ2hlciB0aGFuIDYwXG4gICAgICAgIHN0YXRlLmludGVybmFsLmZyYW1lcyA9IE1hdGgubWluKDYwLCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgKyBmcmFtZXMpO1xuICAgICAgICAvLyBJZiB0aGUgcmVuZGVyLWxvb3AgaXNuJ3QgYWN0aXZlLCBzdGFydCBpdFxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWR2YW5jZShcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXIsXG4gICAgICAgIHJ1bkdsb2JhbEVmZmVjdHM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBzdG9yZT86IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPixcbiAgICAgICAgZnJhbWU/OiBYUkZyYW1lXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmU/LmdldCgpO1xuICAgICAgICBpZiAocnVuR2xvYmFsRWZmZWN0cykgZmx1c2hHbG9iYWxFZmZlY3RzKCdiZWZvcmUnLCB0aW1lc3RhbXApO1xuICAgICAgICBpZiAoIXN0YXRlKSBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMudmFsdWVzKCkpIHJlbmRlcih0aW1lc3RhbXAsIHJvb3QpO1xuICAgICAgICBlbHNlIHJlbmRlcih0aW1lc3RhbXAsIHN0b3JlISwgZnJhbWUpO1xuICAgICAgICBpZiAocnVuR2xvYmFsRWZmZWN0cykgZmx1c2hHbG9iYWxFZmZlY3RzKCdhZnRlcicsIHRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9vcCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludmFsaWRhdGVzIHRoZSB2aWV3LCByZXF1ZXN0aW5nIGEgZnJhbWUgdG8gYmUgcmVuZGVyZWQuIFdpbGwgZ2xvYmFsbHkgaW52YWxpZGF0ZSB1bmxlc3MgcGFzc2VkIGEgcm9vdCdzIHN0YXRlLlxuICAgICAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjaW52YWxpZGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgaW52YWxpZGF0ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkdmFuY2VzIHRoZSBmcmFtZWxvb3AgYW5kIHJ1bnMgcmVuZGVyIGVmZmVjdHMsIHVzZWZ1bCBmb3Igd2hlbiBtYW51YWxseSByZW5kZXJpbmcgdmlhIGBmcmFtZWxvb3A9XCJuZXZlclwiYC5cbiAgICAgICAgICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkdmFuY2VcbiAgICAgICAgICovXG4gICAgICAgIGFkdmFuY2UsXG4gICAgfTtcbn1cbiJdfQ==
@@ -1,11 +1,13 @@
1
1
  import { NgIf } from '@angular/common';
2
- import { Component, ContentChild, Directive, EventEmitter, inject, Input, Output, SkipSelf, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
2
+ import { Component, ContentChild, DestroyRef, Directive, EventEmitter, Injector, Input, NgZone, Output, SkipSelf, TemplateRef, ViewChild, ViewContainerRef, effect, inject, } from '@angular/core';
3
3
  import * as THREE from 'three';
4
4
  import { injectNgtRef } from './di/ref';
5
- import { NgtRxStore } from './stores/rx-store';
5
+ import { SPECIAL_INTERNAL_ADD_COMMENT } from './renderer/utils';
6
+ import { NgtSignalStore } from './stores/signal.store';
6
7
  import { NgtStore } from './stores/store';
7
8
  import { getLocalState, prepare } from './utils/instance';
8
9
  import { is } from './utils/is';
10
+ import { safeDetectChanges } from './utils/safe-detect-changes';
9
11
  import { updateCamera } from './utils/update';
10
12
  import * as i0 from "@angular/core";
11
13
  const privateKeys = [
@@ -20,20 +22,23 @@ const privateKeys = [
20
22
  'advance',
21
23
  'size',
22
24
  'viewport',
23
- 'addInteraction',
24
- 'removeInteraction',
25
25
  ];
26
26
  class NgtPortalBeforeRender {
27
+ #portalStore;
28
+ #subscription;
27
29
  constructor() {
28
- this.portalStore = inject(NgtStore);
30
+ this.#portalStore = inject(NgtStore);
29
31
  this.renderPriority = 1;
30
32
  this.beforeRender = new EventEmitter();
33
+ inject(DestroyRef).onDestroy(() => {
34
+ this.#subscription?.();
35
+ });
31
36
  }
32
37
  ngOnInit() {
33
38
  let oldClear;
34
- this.subscription = this.portalStore.get('internal').subscribe(({ delta, frame }) => {
35
- this.beforeRender.emit({ ...this.portalStore.get(), delta, frame });
36
- const { gl, scene, camera } = this.portalStore.get();
39
+ this.#subscription = this.#portalStore.get('internal').subscribe(({ delta, frame }) => {
40
+ this.beforeRender.emit({ ...this.#portalStore.get(), delta, frame });
41
+ const { gl, scene, camera } = this.#portalStore.get();
37
42
  oldClear = gl.autoClear;
38
43
  if (this.renderPriority === 1) {
39
44
  // clear scene and render with default
@@ -46,10 +51,7 @@ class NgtPortalBeforeRender {
46
51
  gl.render(scene, camera);
47
52
  // restore
48
53
  gl.autoClear = oldClear;
49
- }, this.renderPriority, this.portalStore);
50
- }
51
- ngOnDestroy() {
52
- this.subscription?.();
54
+ }, this.renderPriority, this.#portalStore);
53
55
  }
54
56
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
55
57
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtPortalBeforeRender, isStandalone: true, selector: "[ngtPortalBeforeRender]", inputs: { renderPriority: "renderPriority", parentScene: "parentScene", parentCamera: "parentCamera" }, outputs: { beforeRender: "beforeRender" }, ngImport: i0 }); }
@@ -58,21 +60,23 @@ export { NgtPortalBeforeRender };
58
60
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
59
61
  type: Directive,
60
62
  args: [{ selector: '[ngtPortalBeforeRender]', standalone: true }]
61
- }], propDecorators: { renderPriority: [{
63
+ }], ctorParameters: function () { return []; }, propDecorators: { renderPriority: [{
62
64
  type: Input
63
65
  }], parentScene: [{
64
- type: Input
66
+ type: Input,
67
+ args: [{ required: true }]
65
68
  }], parentCamera: [{
66
- type: Input
69
+ type: Input,
70
+ args: [{ required: true }]
67
71
  }], beforeRender: [{
68
72
  type: Output
69
73
  }] } });
70
74
  class NgtPortalContent {
71
75
  constructor(vcr, parentVcr) {
72
76
  const commentNode = vcr.element.nativeElement;
73
- if (commentNode['__ngt_renderer_add_comment__']) {
74
- commentNode['__ngt_renderer_add_comment__'](parentVcr.element.nativeElement);
75
- delete commentNode['__ngt_renderer_add_comment__'];
77
+ if (commentNode[SPECIAL_INTERNAL_ADD_COMMENT]) {
78
+ commentNode[SPECIAL_INTERNAL_ADD_COMMENT](parentVcr.element.nativeElement);
79
+ delete commentNode[SPECIAL_INTERNAL_ADD_COMMENT];
76
80
  }
77
81
  }
78
82
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalContent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ViewContainerRef, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
@@ -85,32 +89,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
85
89
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ViewContainerRef, decorators: [{
86
90
  type: SkipSelf
87
91
  }] }]; } });
88
- class NgtPortal extends NgtRxStore {
89
- constructor() {
90
- super(...arguments);
91
- this.autoRender = true;
92
- this.autoRenderPriority = 1;
93
- this.beforeRender = new EventEmitter();
94
- this.parentStore = inject(NgtStore, { skipSelf: true });
95
- this.parentScene = this.parentStore.get('scene');
96
- this.parentCamera = this.parentStore.get('camera');
97
- this.portalStore = inject(NgtStore, { self: true });
98
- this.raycaster = new THREE.Raycaster();
99
- this.pointer = new THREE.Vector2();
100
- this.portalContentRendered = false;
101
- }
92
+ class NgtPortal extends NgtSignalStore {
102
93
  set container(container) {
103
94
  this.set({ container });
104
95
  }
105
96
  set state(state) {
106
97
  this.set({ state });
107
98
  }
108
- initialize() {
109
- super.initialize();
110
- this.set({ container: injectNgtRef(prepare(new THREE.Scene())) });
99
+ #parentStore;
100
+ #portalStore;
101
+ #injector;
102
+ #zone;
103
+ #raycaster;
104
+ #pointer;
105
+ #portalContentView;
106
+ constructor() {
107
+ super({ container: injectNgtRef(prepare(new THREE.Scene())) });
108
+ this.autoRender = true;
109
+ this.autoRenderPriority = 1;
110
+ this.beforeRender = new EventEmitter();
111
+ this.#parentStore = inject(NgtStore, { skipSelf: true });
112
+ this.parentScene = this.#parentStore.get('scene');
113
+ this.parentCamera = this.#parentStore.get('camera');
114
+ this.#portalStore = inject(NgtStore, { self: true });
115
+ this.#injector = inject(Injector);
116
+ this.#zone = inject(NgZone);
117
+ this.#raycaster = new THREE.Raycaster();
118
+ this.#pointer = new THREE.Vector2();
119
+ this.portalContentRendered = false;
120
+ inject(DestroyRef).onDestroy(() => {
121
+ if (this.#portalContentView && !this.#portalContentView.destroyed) {
122
+ this.#portalContentView.destroy();
123
+ }
124
+ });
111
125
  }
112
126
  ngOnInit() {
113
- const previousState = this.parentStore.get();
127
+ const previousState = this.#parentStore.get();
114
128
  const inputsState = this.get();
115
129
  if (!inputsState.state && this.autoRender) {
116
130
  inputsState.state = { events: { priority: this.autoRenderPriority + 1 } };
@@ -120,43 +134,42 @@ class NgtPortal extends NgtRxStore {
120
134
  const container = is.ref(containerState) ? containerState.nativeElement : containerState;
121
135
  const localState = getLocalState(container);
122
136
  if (!localState.store) {
123
- localState.store = this.portalStore;
137
+ localState.store = this.#portalStore;
124
138
  }
125
- this.portalStore.set({
139
+ this.#portalStore.set({
126
140
  ...previousState,
127
141
  scene: container,
128
- raycaster: this.raycaster,
129
- pointer: this.pointer,
130
- previousStore: this.parentStore,
142
+ raycaster: this.#raycaster,
143
+ pointer: this.#pointer,
144
+ previousStore: this.#parentStore,
131
145
  events: { ...previousState.events, ...(events || {}) },
132
146
  size: { ...previousState.size, ...(size || {}) },
133
147
  ...restInputsState,
134
- get: this.portalStore.get.bind(this.portalStore),
135
- set: this.portalStore.set.bind(this.portalStore),
136
- select: this.portalStore.select.bind(this.portalStore),
137
- setEvents: (events) => this.portalStore.set((state) => ({ ...state, events: { ...state.events, ...events } })),
148
+ get: this.#portalStore.get.bind(this.#portalStore),
149
+ set: this.#portalStore.set.bind(this.#portalStore),
150
+ setEvents: (events) => this.#portalStore.set((state) => ({ ...state, events: { ...state.events, ...events } })),
138
151
  });
139
- this.hold(this.parentStore.select(), (previous) => this.portalStore.set((state) => this.inject(previous, state)));
152
+ const parentState = this.#parentStore.select();
153
+ effect(() => {
154
+ const previous = parentState();
155
+ this.#zone.runOutsideAngular(() => {
156
+ this.#portalStore.set((state) => this.#inject(previous, state));
157
+ });
158
+ }, { injector: this.#injector, allowSignalWrites: true });
140
159
  requestAnimationFrame(() => {
141
- this.portalStore.set((injectState) => this.inject(this.parentStore.get(), injectState));
160
+ this.#portalStore.set((injectState) => this.#inject(this.#parentStore.get(), injectState));
142
161
  });
143
- this.portalContentView = this.portalContentAnchor.createEmbeddedView(this.portalContentTemplate);
144
- this.portalContentView.detectChanges();
162
+ this.#portalContentView = this.portalContentAnchor.createEmbeddedView(this.portalContentTemplate);
163
+ safeDetectChanges(this.#portalContentView);
145
164
  this.portalContentRendered = true;
146
165
  }
147
166
  onBeforeRender(portal) {
148
167
  this.beforeRender.emit({
149
- root: { ...this.parentStore.get(), delta: portal.delta, frame: portal.frame },
168
+ root: { ...this.#parentStore.get(), delta: portal.delta, frame: portal.frame },
150
169
  portal,
151
170
  });
152
171
  }
153
- ngOnDestroy() {
154
- if (this.portalContentView && !this.portalContentView.destroyed) {
155
- this.portalContentView.destroy();
156
- }
157
- super.ngOnDestroy();
158
- }
159
- inject(rootState, injectState) {
172
+ #inject(rootState, injectState) {
160
173
  const intersect = { ...rootState };
161
174
  Object.keys(intersect).forEach((key) => {
162
175
  if (privateKeys.includes(key) ||
@@ -176,16 +189,16 @@ class NgtPortal extends NgtRxStore {
176
189
  return {
177
190
  ...intersect,
178
191
  scene: is.ref(inputs.container) ? inputs.container.nativeElement : inputs.container,
179
- raycaster: this.raycaster,
180
- pointer: this.pointer,
181
- previousStore: this.parentStore,
192
+ raycaster: this.#raycaster,
193
+ pointer: this.#pointer,
194
+ previousStore: this.#parentStore,
182
195
  events: { ...rootState.events, ...(injectState?.events || {}), ...events },
183
196
  size: { ...rootState.size, ...size },
184
197
  viewport: { ...rootState.viewport, ...(viewport || {}) },
185
198
  ...restInputsState,
186
199
  };
187
200
  }
188
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortal, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
189
202
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { container: "container", state: "state", autoRender: "autoRender", autoRenderPriority: "autoRenderPriority" }, outputs: { beforeRender: "beforeRender" }, providers: [NgtStore], queries: [{ propertyName: "portalContentTemplate", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "portalContentAnchor", first: true, predicate: ["portalContentAnchor"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: `
190
203
  <ng-container #portalContentAnchor>
191
204
  <ng-container
@@ -220,7 +233,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
220
233
  imports: [NgIf, NgtPortalBeforeRender],
221
234
  providers: [NgtStore],
222
235
  }]
223
- }], propDecorators: { container: [{
236
+ }], ctorParameters: function () { return []; }, propDecorators: { container: [{
224
237
  type: Input
225
238
  }], state: [{
226
239
  type: Input
@@ -237,4 +250,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
237
250
  type: ViewChild,
238
251
  args: ['portalContentAnchor', { read: ViewContainerRef, static: true }]
239
252
  }] } });
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBR1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixHQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFOUMsTUFBTSxXQUFXLEdBQUc7SUFDaEIsS0FBSztJQUNMLEtBQUs7SUFDTCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixjQUFjO0lBQ2QsUUFBUTtJQUNSLFlBQVk7SUFDWixTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsbUJBQW1CO0NBQ2IsQ0FBQztBQWNYLE1BQ2EscUJBQXFCO0lBRGxDO1FBRXFCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBSWxCLGlCQUFZLEdBQUcs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USxDQUFDO2lCQUN4Qjs4QkFFZ0IsU0FBUztzQkFBckIsS0FBSztnQkFJTyxLQUFLO3NCQUFqQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0UscUJBQXFCO3NCQUQ3QixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkxRCxtQkFBbUI7c0JBRDNCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGluamVjdE5ndFJlZiB9IGZyb20gJy4vZGkvcmVmJztcbmltcG9ydCB7IE5ndFJ4U3RvcmUgfSBmcm9tICcuL3N0b3Jlcy9yeC1zdG9yZSc7XG5pbXBvcnQgeyBOZ3RTdG9yZSB9IGZyb20gJy4vc3RvcmVzL3N0b3JlJztcbmltcG9ydCB7IE5ndEV2ZW50TWFuYWdlciwgTmd0UmVuZGVyU3RhdGUsIE5ndFNpemUsIE5ndFN0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlLCBwcmVwYXJlIH0gZnJvbSAnLi91dGlscy9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgdXBkYXRlQ2FtZXJhIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5jb25zdCBwcml2YXRlS2V5cyA9IFtcbiAgICAnZ2V0JyxcbiAgICAnc2V0JyxcbiAgICAnc2VsZWN0JyxcbiAgICAnc2V0U2l6ZScsXG4gICAgJ3NldERwcicsXG4gICAgJ3NldEZyYW1lbG9vcCcsXG4gICAgJ2V2ZW50cycsXG4gICAgJ2ludmFsaWRhdGUnLFxuICAgICdhZHZhbmNlJyxcbiAgICAnc2l6ZScsXG4gICAgJ3ZpZXdwb3J0JyxcbiAgICAnYWRkSW50ZXJhY3Rpb24nLFxuICAgICdyZW1vdmVJbnRlcmFjdGlvbicsXG5dIGFzIGNvbnN0O1xudHlwZSBQcml2YXRlS2V5cyA9ICh0eXBlb2YgcHJpdmF0ZUtleXMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0UG9ydGFsSW5wdXRzIHtcbiAgICBjb250YWluZXI6IEVsZW1lbnRSZWY8VEhSRUUuT2JqZWN0M0Q+IHwgVEhSRUUuT2JqZWN0M0Q7XG4gICAgY2FtZXJhOiBFbGVtZW50UmVmPFRIUkVFLkNhbWVyYT4gfCBUSFJFRS5DYW1lcmE7XG4gICAgc3RhdGU6IFBhcnRpYWw8XG4gICAgICAgIE9taXQ8Tmd0U3RhdGUsIFByaXZhdGVLZXlzPiAmIHtcbiAgICAgICAgICAgIGV2ZW50czogUGFydGlhbDxQaWNrPE5ndEV2ZW50TWFuYWdlcjxhbnk+LCAnZW5hYmxlZCcgfCAncHJpb3JpdHknIHwgJ2NvbXB1dGUnIHwgJ2Nvbm5lY3RlZCc+PjtcbiAgICAgICAgICAgIHNpemU6IE5ndFNpemU7XG4gICAgICAgIH1cbiAgICA+O1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd0UG9ydGFsQmVmb3JlUmVuZGVyXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxCZWZvcmVSZW5kZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3J0YWxTdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICBASW5wdXQoKSByZW5kZXJQcmlvcml0eSA9IDE7XG4gICAgQElucHV0KCkgcGFyZW50U2NlbmUhOiBUSFJFRS5TY2VuZTtcbiAgICBASW5wdXQoKSBwYXJlbnRDYW1lcmEhOiBUSFJFRS5DYW1lcmE7XG5cbiAgICBAT3V0cHV0KCkgYmVmb3JlUmVuZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3RSZW5kZXJTdGF0ZT4oKTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogKCkgPT4gdm9pZDtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBsZXQgb2xkQ2xlYXI6IGJvb2xlYW47XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5wb3J0YWxTdG9yZS5nZXQoJ2ludGVybmFsJykuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHsgZGVsdGEsIGZyYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJlZm9yZVJlbmRlci5lbWl0KHsgLi4udGhpcy5wb3J0YWxTdG9yZS5nZXQoKSwgZGVsdGEsIGZyYW1lIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZ2wsIHNjZW5lLCBjYW1lcmEgfSA9IHRoaXMucG9ydGFsU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgb2xkQ2xlYXIgPSBnbC5hdXRvQ2xlYXI7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyUHJpb3JpdHkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgc2NlbmUgYW5kIHJlbmRlciB3aXRoIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgZ2wuYXV0b0NsZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZ2wucmVuZGVyKHRoaXMucGFyZW50U2NlbmUsIHRoaXMucGFyZW50Q2FtZXJhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBjbGVhbmluZ1xuICAgICAgICAgICAgICAgIGdsLmF1dG9DbGVhciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLmNsZWFyRGVwdGgoKTtcbiAgICAgICAgICAgICAgICBnbC5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZVxuICAgICAgICAgICAgICAgIGdsLmF1dG9DbGVhciA9IG9sZENsZWFyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUHJpb3JpdHksXG4gICAgICAgICAgICB0aGlzLnBvcnRhbFN0b3JlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy4oKTtcbiAgICB9XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW25ndFBvcnRhbENvbnRlbnRdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIE5ndFBvcnRhbENvbnRlbnQge1xuICAgIGNvbnN0cnVjdG9yKHZjcjogVmlld0NvbnRhaW5lclJlZiwgQFNraXBTZWxmKCkgcGFyZW50VmNyOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnROb2RlID0gdmNyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGNvbW1lbnROb2RlWydfX25ndF9yZW5kZXJlcl9hZGRfY29tbWVudF9fJ10pIHtcbiAgICAgICAgICAgIGNvbW1lbnROb2RlWydfX25ndF9yZW5kZXJlcl9hZGRfY29tbWVudF9fJ10ocGFyZW50VmNyLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBkZWxldGUgY29tbWVudE5vZGVbJ19fbmd0X3JlbmRlcmVyX2FkZF9jb21tZW50X18nXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtcG9ydGFsJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIgI3BvcnRhbENvbnRlbnRBbmNob3I+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJhdXRvUmVuZGVyICYmIHBvcnRhbENvbnRlbnRSZW5kZXJlZFwiXG4gICAgICAgICAgICAgICAgbmd0UG9ydGFsQmVmb3JlUmVuZGVyXG4gICAgICAgICAgICAgICAgW3JlbmRlclByaW9yaXR5XT1cImF1dG9SZW5kZXJQcmlvcml0eVwiXG4gICAgICAgICAgICAgICAgW3BhcmVudFNjZW5lXT1cInBhcmVudFNjZW5lXCJcbiAgICAgICAgICAgICAgICBbcGFyZW50Q2FtZXJhXT1cInBhcmVudENhbWVyYVwiXG4gICAgICAgICAgICAgICAgKGJlZm9yZVJlbmRlcik9XCJvbkJlZm9yZVJlbmRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIGAsXG4gICAgaW1wb3J0czogW05nSWYsIE5ndFBvcnRhbEJlZm9yZVJlbmRlcl0sXG4gICAgcHJvdmlkZXJzOiBbTmd0U3RvcmVdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWwgZXh0ZW5kcyBOZ3RSeFN0b3JlPE5ndFBvcnRhbElucHV0cz4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgc2V0IGNvbnRhaW5lcihjb250YWluZXI6IE5ndFBvcnRhbElucHV0c1snY29udGFpbmVyJ10pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjb250YWluZXIgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHN0YXRlKHN0YXRlOiBOZ3RQb3J0YWxJbnB1dHNbJ3N0YXRlJ10pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzdGF0ZSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBhdXRvUmVuZGVyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBhdXRvUmVuZGVyUHJpb3JpdHkgPSAxO1xuXG4gICAgQE91dHB1dCgpIGJlZm9yZVJlbmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyByb290OiBOZ3RSZW5kZXJTdGF0ZTsgcG9ydGFsOiBOZ3RSZW5kZXJTdGF0ZSB9PigpO1xuXG4gICAgQENvbnRlbnRDaGlsZChOZ3RQb3J0YWxDb250ZW50LCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICByZWFkb25seSBwb3J0YWxDb250ZW50VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3BvcnRhbENvbnRlbnRBbmNob3InLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHJlYWRvbmx5IHBvcnRhbENvbnRlbnRBbmNob3IhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdG9yZSA9IGluamVjdChOZ3RTdG9yZSwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcbiAgICByZWFkb25seSBwYXJlbnRTY2VuZSA9IHRoaXMucGFyZW50U3RvcmUuZ2V0KCdzY2VuZScpO1xuICAgIHJlYWRvbmx5IHBhcmVudENhbWVyYSA9IHRoaXMucGFyZW50U3RvcmUuZ2V0KCdjYW1lcmEnKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9ydGFsU3RvcmUgPSBpbmplY3QoTmd0U3RvcmUsIHsgc2VsZjogdHJ1ZSB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9pbnRlciA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG5cbiAgICBwb3J0YWxDb250ZW50UmVuZGVyZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBvcnRhbENvbnRlbnRWaWV3PzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG4gICAgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLnNldCh7IGNvbnRhaW5lcjogaW5qZWN0Tmd0UmVmPFRIUkVFLlNjZW5lPihwcmVwYXJlKG5ldyBUSFJFRS5TY2VuZSgpKSkgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0aGlzLnBhcmVudFN0b3JlLmdldCgpO1xuICAgICAgICBjb25zdCBpbnB1dHNTdGF0ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAgICAgaWYgKCFpbnB1dHNTdGF0ZS5zdGF0ZSAmJiB0aGlzLmF1dG9SZW5kZXIpIHtcbiAgICAgICAgICAgIGlucHV0c1N0YXRlLnN0YXRlID0geyBldmVudHM6IHsgcHJpb3JpdHk6IHRoaXMuYXV0b1JlbmRlclByaW9yaXR5ICsgMSB9IH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGV2ZW50cywgc2l6ZSwgLi4ucmVzdElucHV0c1N0YXRlIH0gPSBpbnB1dHNTdGF0ZS5zdGF0ZSB8fCB7fTtcblxuICAgICAgICBjb25zdCBjb250YWluZXJTdGF0ZSA9IGlucHV0c1N0YXRlLmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gaXMucmVmKGNvbnRhaW5lclN0YXRlKSA/IGNvbnRhaW5lclN0YXRlLm5hdGl2ZUVsZW1lbnQgOiBjb250YWluZXJTdGF0ZTtcblxuICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShjb250YWluZXIpO1xuICAgICAgICBpZiAoIWxvY2FsU3RhdGUuc3RvcmUpIHtcbiAgICAgICAgICAgIGxvY2FsU3RhdGUuc3RvcmUgPSB0aGlzLnBvcnRhbFN0b3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3J0YWxTdG9yZS5zZXQoe1xuICAgICAgICAgICAgLi4ucHJldmlvdXNTdGF0ZSxcbiAgICAgICAgICAgIHNjZW5lOiBjb250YWluZXIgYXMgVEhSRUUuU2NlbmUsXG4gICAgICAgICAgICByYXljYXN0ZXI6IHRoaXMucmF5Y2FzdGVyLFxuICAgICAgICAgICAgcG9pbnRlcjogdGhpcy5wb2ludGVyLFxuICAgICAgICAgICAgcHJldmlvdXNTdG9yZTogdGhpcy5wYXJlbnRTdG9yZSxcbiAgICAgICAgICAgIGV2ZW50czogeyAuLi5wcmV2aW91c1N0YXRlLmV2ZW50cywgLi4uKGV2ZW50cyB8fCB7fSkgfSxcbiAgICAgICAgICAgIHNpemU6IHsgLi4ucHJldmlvdXNTdGF0ZS5zaXplLCAuLi4oc2l6ZSB8fCB7fSkgfSxcbiAgICAgICAgICAgIC4uLnJlc3RJbnB1dHNTdGF0ZSxcbiAgICAgICAgICAgIGdldDogdGhpcy5wb3J0YWxTdG9yZS5nZXQuYmluZCh0aGlzLnBvcnRhbFN0b3JlKSxcbiAgICAgICAgICAgIHNldDogdGhpcy5wb3J0YWxTdG9yZS5zZXQuYmluZCh0aGlzLnBvcnRhbFN0b3JlKSxcbiAgICAgICAgICAgIHNlbGVjdDogdGhpcy5wb3J0YWxTdG9yZS5zZWxlY3QuYmluZCh0aGlzLnBvcnRhbFN0b3JlKSxcbiAgICAgICAgICAgIHNldEV2ZW50czogKGV2ZW50cykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBvcnRhbFN0b3JlLnNldCgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBldmVudHM6IHsgLi4uc3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSB9KSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaG9sZCh0aGlzLnBhcmVudFN0b3JlLnNlbGVjdCgpLCAocHJldmlvdXMpID0+XG4gICAgICAgICAgICB0aGlzLnBvcnRhbFN0b3JlLnNldCgoc3RhdGUpID0+IHRoaXMuaW5qZWN0KHByZXZpb3VzLCBzdGF0ZSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucG9ydGFsU3RvcmUuc2V0KChpbmplY3RTdGF0ZSkgPT4gdGhpcy5pbmplY3QodGhpcy5wYXJlbnRTdG9yZS5nZXQoKSwgaW5qZWN0U3RhdGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9ydGFsQ29udGVudFZpZXcgPSB0aGlzLnBvcnRhbENvbnRlbnRBbmNob3IuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMucG9ydGFsQ29udGVudFRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5wb3J0YWxDb250ZW50Vmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucG9ydGFsQ29udGVudFJlbmRlcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkJlZm9yZVJlbmRlcihwb3J0YWw6IE5ndFJlbmRlclN0YXRlKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlUmVuZGVyLmVtaXQoe1xuICAgICAgICAgICAgcm9vdDogeyAuLi50aGlzLnBhcmVudFN0b3JlLmdldCgpLCBkZWx0YTogcG9ydGFsLmRlbHRhLCBmcmFtZTogcG9ydGFsLmZyYW1lIH0sXG4gICAgICAgICAgICBwb3J0YWwsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wb3J0YWxDb250ZW50VmlldyAmJiAhdGhpcy5wb3J0YWxDb250ZW50Vmlldy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucG9ydGFsQ29udGVudFZpZXcuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmplY3Qocm9vdFN0YXRlOiBOZ3RTdGF0ZSwgaW5qZWN0U3RhdGU6IE5ndFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdDogUGFydGlhbDxOZ3RTdGF0ZT4gPSB7IC4uLnJvb3RTdGF0ZSB9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGludGVyc2VjdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5IGFzIFByaXZhdGVLZXlzKSB8fFxuICAgICAgICAgICAgICAgIHJvb3RTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdICE9PSBpbmplY3RTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaW50ZXJzZWN0W2tleSBhcyBrZXlvZiBOZ3RTdGF0ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgZXZlbnRzLCAuLi5yZXN0SW5wdXRzU3RhdGUgfSA9IGlucHV0cy5zdGF0ZSB8fCB7fTtcblxuICAgICAgICBsZXQgdmlld3BvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbmplY3RTdGF0ZSAmJiBzaXplKSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lcmEgPSBpbmplY3RTdGF0ZS5jYW1lcmE7XG4gICAgICAgICAgICB2aWV3cG9ydCA9IHJvb3RTdGF0ZS52aWV3cG9ydC5nZXRDdXJyZW50Vmlld3BvcnQoY2FtZXJhLCBuZXcgVEhSRUUuVmVjdG9yMygpLCBzaXplKTtcbiAgICAgICAgICAgIGlmIChjYW1lcmEgIT09IHJvb3RTdGF0ZS5jYW1lcmEpIHVwZGF0ZUNhbWVyYShjYW1lcmEsIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmludGVyc2VjdCxcbiAgICAgICAgICAgIHNjZW5lOiBpcy5yZWYoaW5wdXRzLmNvbnRhaW5lcikgPyBpbnB1dHMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgOiBpbnB1dHMuY29udGFpbmVyLFxuICAgICAgICAgICAgcmF5Y2FzdGVyOiB0aGlzLnJheWNhc3RlcixcbiAgICAgICAgICAgIHBvaW50ZXI6IHRoaXMucG9pbnRlcixcbiAgICAgICAgICAgIHByZXZpb3VzU3RvcmU6IHRoaXMucGFyZW50U3RvcmUsXG4gICAgICAgICAgICBldmVudHM6IHsgLi4ucm9vdFN0YXRlLmV2ZW50cywgLi4uKGluamVjdFN0YXRlPy5ldmVudHMgfHwge30pLCAuLi5ldmVudHMgfSxcbiAgICAgICAgICAgIHNpemU6IHsgLi4ucm9vdFN0YXRlLnNpemUsIC4uLnNpemUgfSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7IC4uLnJvb3RTdGF0ZS52aWV3cG9ydCwgLi4uKHZpZXdwb3J0IHx8IHt9KSB9LFxuICAgICAgICAgICAgLi4ucmVzdElucHV0c1N0YXRlLFxuICAgICAgICB9IGFzIE5ndFN0YXRlO1xuICAgIH1cbn1cbiJdfQ==
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixNQUFNLEdBSVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRTlDLE1BQU0sV0FBVyxHQUFHO0lBQ2hCLEtBQUs7SUFDTCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsY0FBYztJQUNkLFFBQVE7SUFDUixZQUFZO0lBQ1osU0FBUztJQUNULE1BQU07SUFDTixVQUFVO0NBQ0osQ0FBQztBQWNY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b3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT3V0cHV0LFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgdHlwZSBFbGVtZW50UmVmLFxuICAgIHR5cGUgRW1iZWRkZWRWaWV3UmVmLFxuICAgIHR5cGUgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGluamVjdE5ndFJlZiB9IGZyb20gJy4vZGkvcmVmJztcbmltcG9ydCB7IFNQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlQgfSBmcm9tICcuL3JlbmRlcmVyL3V0aWxzJztcbmltcG9ydCB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi9zdG9yZXMvc2lnbmFsLnN0b3JlJztcbmltcG9ydCB7IE5ndFN0b3JlIH0gZnJvbSAnLi9zdG9yZXMvc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RFdmVudE1hbmFnZXIsIE5ndFJlbmRlclN0YXRlLCBOZ3RTaXplLCBOZ3RTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4vdXRpbHMvaW5zdGFuY2UnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcbmltcG9ydCB7IHVwZGF0ZUNhbWVyYSB9IGZyb20gJy4vdXRpbHMvdXBkYXRlJztcblxuY29uc3QgcHJpdmF0ZUtleXMgPSBbXG4gICAgJ2dldCcsXG4gICAgJ3NldCcsXG4gICAgJ3NlbGVjdCcsXG4gICAgJ3NldFNpemUnLFxuICAgICdzZXREcHInLFxuICAgICdzZXRGcmFtZWxvb3AnLFxuICAgICdldmVudHMnLFxuICAgICdpbnZhbGlkYXRlJyxcbiAgICAnYWR2YW5jZScsXG4gICAgJ3NpemUnLFxuICAgICd2aWV3cG9ydCcsXG5dIGFzIGNvbnN0O1xudHlwZSBQcml2YXRlS2V5cyA9ICh0eXBlb2YgcHJpdmF0ZUtleXMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0UG9ydGFsSW5wdXRzIHtcbiAgICBjb250YWluZXI6IEVsZW1lbnRSZWY8VEhSRUUuT2JqZWN0M0Q+IHwgVEhSRUUuT2JqZWN0M0Q7XG4gICAgY2FtZXJhOiBFbGVtZW50UmVmPFRIUkVFLkNhbWVyYT4gfCBUSFJFRS5DYW1lcmE7XG4gICAgc3RhdGU6IFBhcnRpYWw8XG4gICAgICAgIE9taXQ8Tmd0U3RhdGUsIFByaXZhdGVLZXlzPiAmIHtcbiAgICAgICAgICAgIGV2ZW50czogUGFydGlhbDxQaWNrPE5ndEV2ZW50TWFuYWdlcjxhbnk+LCAnZW5hYmxlZCcgfCAncHJpb3JpdHknIHwgJ2NvbXB1dGUnIHwgJ2Nvbm5lY3RlZCc+PjtcbiAgICAgICAgICAgIHNpemU6IE5ndFNpemU7XG4gICAgICAgIH1cbiAgICA+O1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd0UG9ydGFsQmVmb3JlUmVuZGVyXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxCZWZvcmVSZW5kZXIgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHJlYWRvbmx5ICNwb3J0YWxTdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICBASW5wdXQoKSByZW5kZXJQcmlvcml0eSA9IDE7XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcGFyZW50U2NlbmUhOiBUSFJFRS5TY2VuZTtcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwYXJlbnRDYW1lcmEhOiBUSFJFRS5DYW1lcmE7XG5cbiAgICBAT3V0cHV0KCkgYmVmb3JlUmVuZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3RSZW5kZXJTdGF0ZT4oKTtcblxuICAgICNzdWJzY3JpcHRpb24/OiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uPy4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGxldCBvbGRDbGVhcjogYm9vbGVhbjtcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uID0gdGhpcy4jcG9ydGFsU3RvcmUuZ2V0KCdpbnRlcm5hbCcpLnN1YnNjcmliZShcbiAgICAgICAgICAgICh7IGRlbHRhLCBmcmFtZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iZWZvcmVSZW5kZXIuZW1pdCh7IC4uLnRoaXMuI3BvcnRhbFN0b3JlLmdldCgpLCBkZWx0YSwgZnJhbWUgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBnbCwgc2NlbmUsIGNhbWVyYSB9ID0gdGhpcy4jcG9ydGFsU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgb2xkQ2xlYXIgPSBnbC5hdXRvQ2xlYXI7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyUHJpb3JpdHkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgc2NlbmUgYW5kIHJlbmRlciB3aXRoIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgZ2wuYXV0b0NsZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZ2wucmVuZGVyKHRoaXMucGFyZW50U2NlbmUsIHRoaXMucGFyZW50Q2FtZXJhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBjbGVhbmluZ1xuICAgICAgICAgICAgICAgIGdsLmF1dG9DbGVhciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLmNsZWFyRGVwdGgoKTtcbiAgICAgICAgICAgICAgICBnbC5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZVxuICAgICAgICAgICAgICAgIGdsLmF1dG9DbGVhciA9IG9sZENsZWFyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUHJpb3JpdHksXG4gICAgICAgICAgICB0aGlzLiNwb3J0YWxTdG9yZVxuICAgICAgICApO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbbmd0UG9ydGFsQ29udGVudF0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgTmd0UG9ydGFsQ29udGVudCB7XG4gICAgY29uc3RydWN0b3IodmNyOiBWaWV3Q29udGFpbmVyUmVmLCBAU2tpcFNlbGYoKSBwYXJlbnRWY3I6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgY29uc3QgY29tbWVudE5vZGUgPSB2Y3IuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoY29tbWVudE5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF0pIHtcbiAgICAgICAgICAgIGNvbW1lbnROb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdKHBhcmVudFZjci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgZGVsZXRlIGNvbW1lbnROb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1wb3J0YWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAjcG9ydGFsQ29udGVudEFuY2hvcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImF1dG9SZW5kZXIgJiYgcG9ydGFsQ29udGVudFJlbmRlcmVkXCJcbiAgICAgICAgICAgICAgICBuZ3RQb3J0YWxCZWZvcmVSZW5kZXJcbiAgICAgICAgICAgICAgICBbcmVuZGVyUHJpb3JpdHldPVwiYXV0b1JlbmRlclByaW9yaXR5XCJcbiAgICAgICAgICAgICAgICBbcGFyZW50U2NlbmVdPVwicGFyZW50U2NlbmVcIlxuICAgICAgICAgICAgICAgIFtwYXJlbnRDYW1lcmFdPVwicGFyZW50Q2FtZXJhXCJcbiAgICAgICAgICAgICAgICAoYmVmb3JlUmVuZGVyKT1cIm9uQmVmb3JlUmVuZGVyKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmd0UG9ydGFsQmVmb3JlUmVuZGVyXSxcbiAgICBwcm92aWRlcnM6IFtOZ3RTdG9yZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndFBvcnRhbCBleHRlbmRzIE5ndFNpZ25hbFN0b3JlPE5ndFBvcnRhbElucHV0cz4gaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHNldCBjb250YWluZXIoY29udGFpbmVyOiBOZ3RQb3J0YWxJbnB1dHNbJ2NvbnRhaW5lciddKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29udGFpbmVyIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBzdGF0ZShzdGF0ZTogTmd0UG9ydGFsSW5wdXRzWydzdGF0ZSddKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc3RhdGUgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgYXV0b1JlbmRlciA9IHRydWU7XG4gICAgQElucHV0KCkgYXV0b1JlbmRlclByaW9yaXR5ID0gMTtcblxuICAgIEBPdXRwdXQoKSBiZWZvcmVSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcm9vdDogTmd0UmVuZGVyU3RhdGU7IHBvcnRhbDogTmd0UmVuZGVyU3RhdGUgfT4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoTmd0UG9ydGFsQ29udGVudCwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcmVhZG9ubHkgcG9ydGFsQ29udGVudFRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgICBAVmlld0NoaWxkKCdwb3J0YWxDb250ZW50QW5jaG9yJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICByZWFkb25seSBwb3J0YWxDb250ZW50QW5jaG9yITogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIHJlYWRvbmx5ICNwYXJlbnRTdG9yZSA9IGluamVjdChOZ3RTdG9yZSwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcbiAgICByZWFkb25seSBwYXJlbnRTY2VuZSA9IHRoaXMuI3BhcmVudFN0b3JlLmdldCgnc2NlbmUnKTtcbiAgICByZWFkb25seSBwYXJlbnRDYW1lcmEgPSB0aGlzLiNwYXJlbnRTdG9yZS5nZXQoJ2NhbWVyYScpO1xuXG4gICAgcmVhZG9ubHkgI3BvcnRhbFN0b3JlID0gaW5qZWN0KE5ndFN0b3JlLCB7IHNlbGY6IHRydWUgfSk7XG4gICAgcmVhZG9ubHkgI2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICByZWFkb25seSAjem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gICAgcmVhZG9ubHkgI3JheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcbiAgICByZWFkb25seSAjcG9pbnRlciA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG5cbiAgICBwb3J0YWxDb250ZW50UmVuZGVyZWQgPSBmYWxzZTtcbiAgICAjcG9ydGFsQ29udGVudFZpZXc/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBjb250YWluZXI6IGluamVjdE5ndFJlZjxUSFJFRS5TY2VuZT4ocHJlcGFyZShuZXcgVEhSRUUuU2NlbmUoKSkpIH0pO1xuICAgICAgICBpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwb3J0YWxDb250ZW50VmlldyAmJiAhdGhpcy4jcG9ydGFsQ29udGVudFZpZXcuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcG9ydGFsQ29udGVudFZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHRoaXMuI3BhcmVudFN0b3JlLmdldCgpO1xuICAgICAgICBjb25zdCBpbnB1dHNTdGF0ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAgICAgaWYgKCFpbnB1dHNTdGF0ZS5zdGF0ZSAmJiB0aGlzLmF1dG9SZW5kZXIpIHtcbiAgICAgICAgICAgIGlucHV0c1N0YXRlLnN0YXRlID0geyBldmVudHM6IHsgcHJpb3JpdHk6IHRoaXMuYXV0b1JlbmRlclByaW9yaXR5ICsgMSB9IH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGV2ZW50cywgc2l6ZSwgLi4ucmVzdElucHV0c1N0YXRlIH0gPSBpbnB1dHNTdGF0ZS5zdGF0ZSB8fCB7fTtcblxuICAgICAgICBjb25zdCBjb250YWluZXJTdGF0ZSA9IGlucHV0c1N0YXRlLmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gaXMucmVmKGNvbnRhaW5lclN0YXRlKSA/IGNvbnRhaW5lclN0YXRlLm5hdGl2ZUVsZW1lbnQgOiBjb250YWluZXJTdGF0ZTtcblxuICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShjb250YWluZXIpO1xuICAgICAgICBpZiAoIWxvY2FsU3RhdGUuc3RvcmUpIHtcbiAgICAgICAgICAgIGxvY2FsU3RhdGUuc3RvcmUgPSB0aGlzLiNwb3J0YWxTdG9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3BvcnRhbFN0b3JlLnNldCh7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1N0YXRlLFxuICAgICAgICAgICAgc2NlbmU6IGNvbnRhaW5lciBhcyBUSFJFRS5TY2VuZSxcbiAgICAgICAgICAgIHJheWNhc3RlcjogdGhpcy4jcmF5Y2FzdGVyLFxuICAgICAgICAgICAgcG9pbnRlcjogdGhpcy4jcG9pbnRlcixcbiAgICAgICAgICAgIHByZXZpb3VzU3RvcmU6IHRoaXMuI3BhcmVudFN0b3JlLFxuICAgICAgICAgICAgZXZlbnRzOiB7IC4uLnByZXZpb3VzU3RhdGUuZXZlbnRzLCAuLi4oZXZlbnRzIHx8IHt9KSB9LFxuICAgICAgICAgICAgc2l6ZTogeyAuLi5wcmV2aW91c1N0YXRlLnNpemUsIC4uLihzaXplIHx8IHt9KSB9LFxuICAgICAgICAgICAgLi4ucmVzdElucHV0c1N0YXRlLFxuICAgICAgICAgICAgZ2V0OiB0aGlzLiNwb3J0YWxTdG9yZS5nZXQuYmluZCh0aGlzLiNwb3J0YWxTdG9yZSksXG4gICAgICAgICAgICBzZXQ6IHRoaXMuI3BvcnRhbFN0b3JlLnNldC5iaW5kKHRoaXMuI3BvcnRhbFN0b3JlKSxcbiAgICAgICAgICAgIHNldEV2ZW50czogKGV2ZW50cykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLiNwb3J0YWxTdG9yZS5zZXQoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJlbnRTdGF0ZSA9IHRoaXMuI3BhcmVudFN0b3JlLnNlbGVjdCgpO1xuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXJlbnRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwb3J0YWxTdG9yZS5zZXQoKHN0YXRlKSA9PiB0aGlzLiNpbmplY3QocHJldmlvdXMsIHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy4jaW5qZWN0b3IsIGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcG9ydGFsU3RvcmUuc2V0KChpbmplY3RTdGF0ZSkgPT4gdGhpcy4jaW5qZWN0KHRoaXMuI3BhcmVudFN0b3JlLmdldCgpLCBpbmplY3RTdGF0ZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jcG9ydGFsQ29udGVudFZpZXcgPSB0aGlzLnBvcnRhbENvbnRlbnRBbmNob3IuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMucG9ydGFsQ29udGVudFRlbXBsYXRlKTtcbiAgICAgICAgc2FmZURldGVjdENoYW5nZXModGhpcy4jcG9ydGFsQ29udGVudFZpZXcpO1xuICAgICAgICB0aGlzLnBvcnRhbENvbnRlbnRSZW5kZXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgb25CZWZvcmVSZW5kZXIocG9ydGFsOiBOZ3RSZW5kZXJTdGF0ZSkge1xuICAgICAgICB0aGlzLmJlZm9yZVJlbmRlci5lbWl0KHtcbiAgICAgICAgICAgIHJvb3Q6IHsgLi4udGhpcy4jcGFyZW50U3RvcmUuZ2V0KCksIGRlbHRhOiBwb3J0YWwuZGVsdGEsIGZyYW1lOiBwb3J0YWwuZnJhbWUgfSxcbiAgICAgICAgICAgIHBvcnRhbCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI2luamVjdChyb290U3RhdGU6IE5ndFN0YXRlLCBpbmplY3RTdGF0ZTogTmd0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgaW50ZXJzZWN0OiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHsgLi4ucm9vdFN0YXRlIH07XG5cbiAgICAgICAgT2JqZWN0LmtleXMoaW50ZXJzZWN0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkgYXMgUHJpdmF0ZUtleXMpIHx8XG4gICAgICAgICAgICAgICAgcm9vdFN0YXRlW2tleSBhcyBrZXlvZiBOZ3RTdGF0ZV0gIT09IGluamVjdFN0YXRlW2tleSBhcyBrZXlvZiBOZ3RTdGF0ZV1cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnRlcnNlY3Rba2V5IGFzIGtleW9mIE5ndFN0YXRlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5nZXQoKTtcbiAgICAgICAgY29uc3QgeyBzaXplLCBldmVudHMsIC4uLnJlc3RJbnB1dHNTdGF0ZSB9ID0gaW5wdXRzLnN0YXRlIHx8IHt9O1xuXG4gICAgICAgIGxldCB2aWV3cG9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluamVjdFN0YXRlICYmIHNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IGluamVjdFN0YXRlLmNhbWVyYTtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0gcm9vdFN0YXRlLnZpZXdwb3J0LmdldEN1cnJlbnRWaWV3cG9ydChjYW1lcmEsIG5ldyBUSFJFRS5WZWN0b3IzKCksIHNpemUpO1xuICAgICAgICAgICAgaWYgKGNhbWVyYSAhPT0gcm9vdFN0YXRlLmNhbWVyYSkgdXBkYXRlQ2FtZXJhKGNhbWVyYSwgc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaW50ZXJzZWN0LFxuICAgICAgICAgICAgc2NlbmU6IGlzLnJlZihpbnB1dHMuY29udGFpbmVyKSA/IGlucHV0cy5jb250YWluZXIubmF0aXZlRWxlbWVudCA6IGlucHV0cy5jb250YWluZXIsXG4gICAgICAgICAgICByYXljYXN0ZXI6IHRoaXMuI3JheWNhc3RlcixcbiAgICAgICAgICAgIHBvaW50ZXI6IHRoaXMuI3BvaW50ZXIsXG4gICAgICAgICAgICBwcmV2aW91c1N0b3JlOiB0aGlzLiNwYXJlbnRTdG9yZSxcbiAgICAgICAgICAgIGV2ZW50czogeyAuLi5yb290U3RhdGUuZXZlbnRzLCAuLi4oaW5qZWN0U3RhdGU/LmV2ZW50cyB8fCB7fSksIC4uLmV2ZW50cyB9LFxuICAgICAgICAgICAgc2l6ZTogeyAuLi5yb290U3RhdGUuc2l6ZSwgLi4uc2l6ZSB9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHsgLi4ucm9vdFN0YXRlLnZpZXdwb3J0LCAuLi4odmlld3BvcnQgfHwge30pIH0sXG4gICAgICAgICAgICAuLi5yZXN0SW5wdXRzU3RhdGUsXG4gICAgICAgIH0gYXMgTmd0U3RhdGU7XG4gICAgfVxufVxuIl19