angular-three 2.0.0-beta.26 → 2.0.0-beta.260

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 (121) hide show
  1. package/README.md +221 -4
  2. package/esm2022/index.mjs +4 -12
  3. package/esm2022/lib/canvas.mjs +124 -196
  4. package/esm2022/lib/directives/args.mjs +46 -20
  5. package/esm2022/lib/dom/events.mjs +2 -2
  6. package/esm2022/lib/events.mjs +33 -31
  7. package/esm2022/lib/instance.mjs +43 -36
  8. package/esm2022/lib/loader.mjs +50 -32
  9. package/esm2022/lib/loop.mjs +28 -25
  10. package/esm2022/lib/portal.mjs +173 -193
  11. package/esm2022/lib/renderer/catalogue.mjs +3 -3
  12. package/esm2022/lib/renderer/constants.mjs +5 -6
  13. package/esm2022/lib/renderer/index.mjs +347 -231
  14. package/esm2022/lib/renderer/state.mjs +49 -0
  15. package/esm2022/lib/renderer/utils.mjs +94 -87
  16. package/esm2022/lib/roots.mjs +87 -76
  17. package/esm2022/lib/routed-scene.mjs +6 -7
  18. package/esm2022/lib/store.mjs +170 -194
  19. package/esm2022/lib/three-types.mjs +2 -2
  20. package/esm2022/lib/utils/apply-props.mjs +24 -28
  21. package/esm2022/lib/utils/attach.mjs +6 -6
  22. package/esm2022/lib/utils/before-render.mjs +23 -0
  23. package/esm2022/lib/utils/is.mjs +6 -5
  24. package/esm2022/lib/utils/make.mjs +19 -17
  25. package/esm2022/lib/utils/parameters.mjs +61 -0
  26. package/esm2022/lib/utils/resolve-ref.mjs +8 -0
  27. package/esm2022/lib/utils/signal-store.mjs +59 -60
  28. package/esm2022/lib/utils/update.mjs +6 -2
  29. package/fesm2022/angular-three.mjs +2012 -2432
  30. package/fesm2022/angular-three.mjs.map +1 -1
  31. package/index.d.ts +6 -11
  32. package/lib/canvas.d.ts +398 -53
  33. package/lib/directives/args.d.ts +14 -7
  34. package/lib/dom/events.d.ts +3 -3
  35. package/lib/events.d.ts +15 -15
  36. package/lib/instance.d.ts +25 -20
  37. package/lib/loader.d.ts +17 -7
  38. package/lib/loop.d.ts +9 -56
  39. package/lib/portal.d.ts +55 -48
  40. package/lib/renderer/catalogue.d.ts +6 -2
  41. package/lib/renderer/constants.d.ts +4 -5
  42. package/lib/renderer/index.d.ts +65 -4
  43. package/lib/renderer/state.d.ts +23 -0
  44. package/lib/renderer/utils.d.ts +8 -26
  45. package/lib/roots.d.ts +12 -6
  46. package/lib/store.d.ts +30 -32
  47. package/lib/three-types.d.ts +142 -145
  48. package/lib/utils/apply-props.d.ts +2 -3
  49. package/lib/utils/attach.d.ts +4 -4
  50. package/lib/utils/before-render.d.ts +10 -0
  51. package/lib/utils/is.d.ts +13 -13
  52. package/lib/utils/make.d.ts +10 -9
  53. package/lib/utils/parameters.d.ts +15 -0
  54. package/lib/utils/resolve-ref.d.ts +2 -0
  55. package/lib/utils/signal-store.d.ts +13 -4
  56. package/lib/utils/update.d.ts +1 -1
  57. package/metadata.json +1 -1
  58. package/package.json +30 -11
  59. package/web-types.json +1 -1
  60. package/esm2022/lib/before-render.mjs +0 -13
  61. package/esm2022/lib/directives/common.mjs +0 -41
  62. package/esm2022/lib/directives/key.mjs +0 -29
  63. package/esm2022/lib/directives/parent.mjs +0 -35
  64. package/esm2022/lib/directives/repeat.mjs +0 -17
  65. package/esm2022/lib/ref.mjs +0 -48
  66. package/esm2022/lib/renderer/store.mjs +0 -408
  67. package/esm2022/lib/utils/assert-injection-context.mjs +0 -14
  68. package/esm2022/lib/utils/create-injection-token.mjs +0 -47
  69. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
  70. package/lib/before-render.d.ts +0 -6
  71. package/lib/directives/common.d.ts +0 -15
  72. package/lib/directives/key.d.ts +0 -10
  73. package/lib/directives/parent.d.ts +0 -11
  74. package/lib/directives/repeat.d.ts +0 -7
  75. package/lib/ref.d.ts +0 -8
  76. package/lib/renderer/store.d.ts +0 -67
  77. package/lib/utils/assert-injection-context.d.ts +0 -2
  78. package/lib/utils/create-injection-token.d.ts +0 -27
  79. package/lib/utils/safe-detect-changes.d.ts +0 -2
  80. package/plugin/README.md +0 -11
  81. package/plugin/generators.json +0 -49
  82. package/plugin/package.json +0 -6
  83. package/plugin/src/generators/init/compat.d.ts +0 -4
  84. package/plugin/src/generators/init/compat.js +0 -6
  85. package/plugin/src/generators/init/compat.js.map +0 -1
  86. package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +0 -4
  87. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +0 -18
  88. package/plugin/src/generators/init/generator.d.ts +0 -6
  89. package/plugin/src/generators/init/generator.js +0 -160
  90. package/plugin/src/generators/init/generator.js.map +0 -1
  91. package/plugin/src/generators/init/schema.json +0 -17
  92. package/plugin/src/generators/init-cannon/compat.d.ts +0 -2
  93. package/plugin/src/generators/init-cannon/compat.js +0 -6
  94. package/plugin/src/generators/init-cannon/compat.js.map +0 -1
  95. package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
  96. package/plugin/src/generators/init-cannon/generator.js +0 -22
  97. package/plugin/src/generators/init-cannon/generator.js.map +0 -1
  98. package/plugin/src/generators/init-cannon/schema.json +0 -6
  99. package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
  100. package/plugin/src/generators/init-postprocessing/compat.js +0 -6
  101. package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
  102. package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
  103. package/plugin/src/generators/init-postprocessing/generator.js +0 -20
  104. package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
  105. package/plugin/src/generators/init-postprocessing/schema.json +0 -6
  106. package/plugin/src/generators/init-soba/compat.d.ts +0 -2
  107. package/plugin/src/generators/init-soba/compat.js +0 -6
  108. package/plugin/src/generators/init-soba/compat.js.map +0 -1
  109. package/plugin/src/generators/init-soba/generator.d.ts +0 -2
  110. package/plugin/src/generators/init-soba/generator.js +0 -26
  111. package/plugin/src/generators/init-soba/generator.js.map +0 -1
  112. package/plugin/src/generators/init-soba/schema.json +0 -6
  113. package/plugin/src/generators/utils.d.ts +0 -2
  114. package/plugin/src/generators/utils.js +0 -34
  115. package/plugin/src/generators/utils.js.map +0 -1
  116. package/plugin/src/generators/versions.d.ts +0 -12
  117. package/plugin/src/generators/versions.js +0 -16
  118. package/plugin/src/generators/versions.js.map +0 -1
  119. package/plugin/src/index.d.ts +0 -3
  120. package/plugin/src/index.js +0 -10
  121. package/plugin/src/index.js.map +0 -1
@@ -1,21 +1,18 @@
1
- import { DestroyRef, effect, inject, runInInjectionContext } from '@angular/core';
2
- import * as THREE from 'three';
1
+ import { assertInjector } from 'ngxtension/assert-injector';
2
+ import { ACESFilmicToneMapping, BasicShadowMap, ColorManagement, NoToneMapping, PCFShadowMap, PCFSoftShadowMap, Raycaster, Scene, VSMShadowMap, Vector3, } from 'three';
3
3
  import { prepare } from './instance';
4
- import { injectNgtLoop } from './loop';
5
- import { injectNgtStore } from './store';
4
+ import { injectLoop } from './loop';
5
+ import { injectStore } from './store';
6
6
  import { applyProps } from './utils/apply-props';
7
- import { assertInjectionContext } from './utils/assert-injection-context';
8
7
  import { is } from './utils/is';
9
- import { makeDefaultCamera, makeDefaultRenderer, makeDpr } from './utils/make';
8
+ import { makeCameraInstance, makeDpr, makeRendererInstance } from './utils/make';
10
9
  import { checkNeedsUpdate } from './utils/update';
11
10
  const shallowLoose = { objects: 'shallow', strict: false };
12
11
  export const roots = new Map();
13
12
  export function injectCanvasRootInitializer(injector) {
14
- injector = assertInjectionContext(injectCanvasRootInitializer, injector);
15
- return runInInjectionContext(injector, () => {
16
- const injectedStore = injectNgtStore();
17
- const loop = injectNgtLoop();
18
- const destroyRef = inject(DestroyRef);
13
+ return assertInjector(injectCanvasRootInitializer, injector, () => {
14
+ const injectedStore = injectStore();
15
+ const loop = injectLoop();
19
16
  return (canvas) => {
20
17
  const exist = roots.has(canvas);
21
18
  let store = roots.get(canvas);
@@ -30,65 +27,70 @@ export function injectCanvasRootInitializer(injector) {
30
27
  roots.set(canvas, store);
31
28
  }
32
29
  let isConfigured = false;
33
- let invalidateRef;
34
- destroyRef.onDestroy(() => invalidateRef?.destroy());
30
+ let lastCamera;
35
31
  return {
36
32
  isConfigured,
37
33
  destroy: (timeout = 500) => {
38
34
  const root = roots.get(canvas);
39
35
  if (root) {
40
- root.set((state) => ({ internal: { ...state.internal, active: false } }));
41
- setTimeout(() => {
42
- try {
43
- const state = root.get();
44
- state.events.disconnect?.();
45
- state.gl?.renderLists?.dispose?.();
46
- state.gl?.forceContextLoss?.();
47
- if (state.gl?.xr)
48
- state.xr.disconnect();
49
- dispose(state);
50
- roots.delete(canvas);
51
- }
52
- catch (e) {
53
- console.error('[NGT] Unexpected error while destroying Canvas Root', e);
54
- }
55
- }, timeout);
36
+ root.update((state) => ({ internal: { ...state.internal, active: false } }));
37
+ try {
38
+ const state = root.get();
39
+ state.events.disconnect?.();
40
+ state.gl?.renderLists?.dispose?.();
41
+ state.gl?.forceContextLoss?.();
42
+ if (state.gl?.xr)
43
+ state.xr.disconnect();
44
+ dispose(state);
45
+ roots.delete(canvas);
46
+ }
47
+ catch (e) {
48
+ console.error('[NGT] Unexpected error while destroying Canvas Root', e);
49
+ }
56
50
  }
57
51
  },
58
52
  configure: (inputs) => {
59
- const { gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, scene: sceneOptions, events, orthographic, lookAt, shadows, linear, legacy, flat, dpr, frameloop, performance, } = inputs;
60
- const state = store.get();
53
+ const { shadows = false, linear = false, flat = false, legacy = false, orthographic = false, frameloop = 'always', dpr = [1, 2], gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, scene: sceneOptions, events, lookAt, performance, } = inputs;
54
+ const state = store.snapshot;
61
55
  const stateToUpdate = {};
62
56
  // setup renderer
63
57
  let gl = state.gl;
64
58
  if (!state.gl)
65
- stateToUpdate.gl = gl = makeDefaultRenderer(glOptions, canvas);
59
+ stateToUpdate.gl = gl = makeRendererInstance(glOptions, canvas);
66
60
  // setup raycaster
67
61
  let raycaster = state.raycaster;
68
62
  if (!raycaster)
69
- stateToUpdate.raycaster = raycaster = new THREE.Raycaster();
63
+ stateToUpdate.raycaster = raycaster = new Raycaster();
70
64
  // set raycaster options
71
65
  const { params, ...options } = raycasterOptions || {};
72
66
  if (!is.equ(options, raycaster, shallowLoose))
73
- applyProps(raycaster, { ...options });
67
+ applyProps(raycaster, options);
74
68
  if (!is.equ(params, raycaster.params, shallowLoose)) {
75
69
  applyProps(raycaster, { params: { ...raycaster.params, ...(params || {}) } });
76
70
  }
77
- // create default camera
78
- if (!state.camera) {
71
+ // Create default camera, don't overwrite any user-set state
72
+ if (!state.camera || (state.camera === lastCamera && !is.equ(lastCamera, cameraOptions, shallowLoose))) {
73
+ lastCamera = cameraOptions;
79
74
  const isCamera = is.camera(cameraOptions);
80
- let camera = isCamera ? cameraOptions : makeDefaultCamera(orthographic || false, state.size);
75
+ let camera = isCamera ? cameraOptions : makeCameraInstance(orthographic, state.size);
81
76
  if (!isCamera) {
82
- if (cameraOptions)
77
+ camera.position.z = 5;
78
+ if (cameraOptions) {
83
79
  applyProps(camera, cameraOptions);
84
- // set position.z
85
- if (!cameraOptions?.position)
86
- camera.position.z = 5;
80
+ if ('aspect' in cameraOptions ||
81
+ 'left' in cameraOptions ||
82
+ 'right' in cameraOptions ||
83
+ 'top' in cameraOptions ||
84
+ 'bottom' in cameraOptions) {
85
+ Object.assign(camera, { manual: true });
86
+ camera?.updateProjectionMatrix();
87
+ }
88
+ }
87
89
  // always look at center or passed-in lookAt by default
88
- if (!cameraOptions?.rotation && !cameraOptions?.quaternion) {
90
+ if (!state.camera && !cameraOptions?.rotation && !cameraOptions?.quaternion) {
89
91
  if (Array.isArray(lookAt))
90
92
  camera.lookAt(lookAt[0], lookAt[1], lookAt[2]);
91
- else if (lookAt instanceof THREE.Vector3)
93
+ else if (lookAt instanceof Vector3)
92
94
  camera.lookAt(lookAt);
93
95
  else
94
96
  camera.lookAt(0, 0, 0);
@@ -99,32 +101,35 @@ export function injectCanvasRootInitializer(injector) {
99
101
  if (!is.instance(camera))
100
102
  camera = prepare(camera, { store });
101
103
  stateToUpdate.camera = camera;
104
+ // Configure raycaster
105
+ // https://github.com/pmndrs/react-xr/issues/300
106
+ raycaster.camera = camera;
102
107
  }
103
108
  // Set up scene (one time only!)
104
109
  if (!state.scene) {
105
110
  let scene;
106
- if (sceneOptions instanceof THREE.Scene) {
107
- scene = prepare(sceneOptions, { store });
111
+ if (sceneOptions instanceof Scene) {
112
+ scene = sceneOptions;
108
113
  }
109
114
  else {
110
- scene = prepare(new THREE.Scene(), { store });
115
+ scene = new Scene();
111
116
  if (sceneOptions)
112
117
  applyProps(scene, sceneOptions);
113
118
  }
114
- stateToUpdate.scene = scene;
119
+ stateToUpdate.scene = prepare(scene, { store });
115
120
  }
116
121
  // Set up XR (one time only!)
117
122
  if (!state.xr) {
118
123
  // Handle frame behavior in WebXR
119
124
  const handleXRFrame = (timestamp, frame) => {
120
- const state = store.get();
125
+ const state = store.snapshot;
121
126
  if (state.frameloop === 'never')
122
127
  return;
123
128
  loop.advance(timestamp, true, store, frame);
124
129
  };
125
130
  // Toggle render switching on session
126
131
  const handleSessionChange = () => {
127
- const state = store.get();
132
+ const state = store.snapshot;
128
133
  state.gl.xr.enabled = state.gl.xr.isPresenting;
129
134
  state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null);
130
135
  if (!state.gl.xr.isPresenting)
@@ -152,16 +157,16 @@ export function injectCanvasRootInitializer(injector) {
152
157
  const oldType = gl.shadowMap.type;
153
158
  gl.shadowMap.enabled = !!shadows;
154
159
  if (typeof shadows === 'boolean') {
155
- gl.shadowMap.type = THREE.PCFSoftShadowMap;
160
+ gl.shadowMap.type = PCFSoftShadowMap;
156
161
  }
157
162
  else if (typeof shadows === 'string') {
158
163
  const types = {
159
- basic: THREE.BasicShadowMap,
160
- percentage: THREE.PCFShadowMap,
161
- soft: THREE.PCFSoftShadowMap,
162
- variance: THREE.VSMShadowMap,
164
+ basic: BasicShadowMap,
165
+ percentage: PCFShadowMap,
166
+ soft: PCFSoftShadowMap,
167
+ variance: VSMShadowMap,
163
168
  };
164
- gl.shadowMap.type = types[shadows] ?? THREE.PCFSoftShadowMap;
169
+ gl.shadowMap.type = types[shadows] ?? PCFSoftShadowMap;
165
170
  }
166
171
  else if (is.obj(shadows)) {
167
172
  Object.assign(gl.shadowMap, shadows);
@@ -170,21 +175,23 @@ export function injectCanvasRootInitializer(injector) {
170
175
  checkNeedsUpdate(gl.shadowMap);
171
176
  }
172
177
  // Safely set color management if available.
173
- // Avoid accessing THREE.ColorManagement to play nice with older versions
174
- if (THREE.ColorManagement) {
175
- const ColorManagement = THREE.ColorManagement;
176
- if ('enabled' in ColorManagement)
177
- ColorManagement['enabled'] = !legacy ?? false;
178
- else if ('legacyMode' in ColorManagement)
179
- ColorManagement['legacyMode'] = legacy ?? true;
178
+ // Avoid accessing ColorManagement to play nice with older versions
179
+ if (ColorManagement) {
180
+ const colorManagement = ColorManagement;
181
+ if ('enabled' in colorManagement)
182
+ colorManagement['enabled'] = !legacy ?? false;
183
+ else if ('legacyMode' in colorManagement)
184
+ colorManagement['legacyMode'] = legacy ?? true;
185
+ }
186
+ if (!isConfigured) {
187
+ // set color space and tonemapping preferences once
188
+ const LinearEncoding = 3000;
189
+ const sRGBEncoding = 3001;
190
+ applyProps(gl, {
191
+ outputEncoding: linear ? LinearEncoding : sRGBEncoding,
192
+ toneMapping: flat ? NoToneMapping : ACESFilmicToneMapping,
193
+ });
180
194
  }
181
- // set color space and tonemapping preferences
182
- const LinearEncoding = 3000;
183
- const sRGBEncoding = 3001;
184
- applyProps(gl, {
185
- outputEncoding: linear ? LinearEncoding : sRGBEncoding,
186
- toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
187
- });
188
195
  // Update color management state
189
196
  if (state.legacy !== legacy)
190
197
  stateToUpdate.legacy = legacy;
@@ -209,7 +216,9 @@ export function injectCanvasRootInitializer(injector) {
209
216
  if (performance && !is.equ(performance, state.performance, shallowLoose)) {
210
217
  stateToUpdate.performance = { ...state.performance, ...performance };
211
218
  }
212
- store.set(stateToUpdate);
219
+ if (Object.keys(stateToUpdate).length) {
220
+ store.update(stateToUpdate);
221
+ }
213
222
  // Check size, allow it to take on container bounds initially
214
223
  const size = computeInitialSize(canvas, sizeOptions);
215
224
  if (!is.equ(size, state.size, shallowLoose)) {
@@ -222,23 +231,25 @@ export function injectCanvasRootInitializer(injector) {
222
231
  if (state.frameloop !== frameloop)
223
232
  state.setFrameloop(frameloop);
224
233
  isConfigured = true;
225
- invalidateRef?.destroy();
226
- invalidateRef = effect(() => void store.state().invalidate(), { manualCleanup: true, injector });
227
234
  },
228
235
  };
229
236
  };
230
237
  });
231
238
  }
232
239
  function computeInitialSize(canvas, defaultSize) {
233
- if (defaultSize)
240
+ if (defaultSize) {
234
241
  return defaultSize;
235
- if (canvas instanceof HTMLCanvasElement && canvas.parentElement) {
242
+ }
243
+ if (typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement && canvas.parentElement) {
236
244
  return canvas.parentElement.getBoundingClientRect();
237
245
  }
246
+ if (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {
247
+ return { width: canvas.width, height: canvas.height, top: 0, left: 0 };
248
+ }
238
249
  return { width: 0, height: 0, top: 0, left: 0 };
239
250
  }
240
251
  // Disposes an object and all its properties
241
- function dispose(obj) {
252
+ export function dispose(obj) {
242
253
  if (obj.dispose && obj.type !== 'Scene')
243
254
  obj.dispose();
244
255
  for (const p in obj) {
@@ -246,4 +257,4 @@ function dispose(obj) {
246
257
  delete obj[p];
247
258
  }
248
259
  }
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yb290cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQWlDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUErQixNQUFNLFNBQVMsQ0FBQztBQUV0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE1BQU0sWUFBWSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBK0MsQ0FBQztBQUU1RSxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBbUI7SUFDOUQsUUFBUSxHQUFHLHNCQUFzQixDQUFDLDJCQUEyQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXpFLE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLGFBQWEsR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUN2QyxNQUFN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ekIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDbEcsQ0FBQzthQUNELENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFJRCxTQUFTLGtCQUFrQixDQUFDLE1BQWlELEVBQUUsV0FBcUI7SUFDbkcsSUFBSSxXQUFXO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFFcEMsSUFBSSxNQUFNLFlBQVksaUJBQWlCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtRQUNoRSxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztLQUNwRDtJQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELDRDQUE0QztBQUM1QyxTQUFTLE9BQU8sQ0FBMkUsR0FBUztJQUNuRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPO1FBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZELEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO1FBQ25CLENBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Q7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgZWZmZWN0LCBpbmplY3QsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCwgdHlwZSBFZmZlY3RSZWYsIHR5cGUgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB0eXBlIHsgTmd0Q2FudmFzSW5wdXRzIH0gZnJvbSAnLi9jYW52YXMnO1xuaW1wb3J0IHsgcHJlcGFyZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0TG9vcCB9IGZyb20gJy4vbG9vcCc7XG5pbXBvcnQgeyBpbmplY3ROZ3RTdG9yZSwgdHlwZSBOZ3RTaXplLCB0eXBlIE5ndFN0YXRlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7IE5ndEFueVJlY29yZCwgTmd0RXF1Q29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi91dGlscy9hcHBseS1wcm9wcyc7XG5pbXBvcnQgeyBhc3NlcnRJbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnLi91dGlscy9hc3NlcnQtaW5qZWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VEZWZhdWx0Q2FtZXJhLCBtYWtlRGVmYXVsdFJlbmRlcmVyLCBtYWtlRHByIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB0eXBlIHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBjaGVja05lZWRzVXBkYXRlIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5jb25zdCBzaGFsbG93TG9vc2UgPSB7IG9iamVjdHM6ICdzaGFsbG93Jywgc3RyaWN0OiBmYWxzZSB9IGFzIE5ndEVxdUNvbmZpZztcblxuZXhwb3J0IGNvbnN0IHJvb3RzID0gbmV3IE1hcDxIVE1MQ2FudmFzRWxlbWVudCwgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q2FudmFzUm9vdEluaXRpYWxpemVyKGluamVjdG9yPzogSW5qZWN0b3IpIHtcblx0aW5qZWN0b3IgPSBhc3NlcnRJbmplY3Rpb25Db250ZXh0KGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplciwgaW5qZWN0b3IpO1xuXG5cdHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCBpbmplY3RlZFN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0XHRjb25zdCBsb29wID0gaW5qZWN0Tmd0TG9vcCgpO1xuXHRcdGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cblx0XHRyZXR1cm4gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpID0+IHtcblx0XHRcdGNvbnN0IGV4aXN0ID0gcm9vdHMuaGFzKGNhbnZhcyk7XG5cdFx0XHRsZXQgc3RvcmUgPSByb290cy5nZXQoY2FudmFzKSBhcyBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5cblx0XHRcdGlmIChzdG9yZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ1tOR1RdIFNhbWUgY2FudmFzIHJvb3QgaXMgYmVpbmcgY3JlYXRlZCB0d2ljZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdG9yZSB8fD0gaW5qZWN0ZWRTdG9yZTtcblxuXHRcdFx0aWYgKCFzdG9yZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tOR1RdIE5vIHN0b3JlIGluaXRpYWxpemVkJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghZXhpc3QpIHtcblx0XHRcdFx0cm9vdHMuc2V0KGNhbnZhcywgc3RvcmUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgaXNDb25maWd1cmVkID0gZmFsc2U7XG5cdFx0XHRsZXQgaW52YWxpZGF0ZVJlZjogRWZmZWN0UmVmO1xuXG5cdFx0XHRkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBpbnZhbGlkYXRlUmVmPy5kZXN0cm95KCkpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpc0NvbmZpZ3VyZWQsXG5cdFx0XHRcdGRlc3Ryb3k6ICh0aW1lb3V0ID0gNTAwKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IHJvb3RzLmdldChjYW52YXMpO1xuXHRcdFx0XHRcdGlmIChyb290KSB7XG5cdFx0XHRcdFx0XHRyb290LnNldCgoc3RhdGUpID0+ICh7IGludGVybmFsOiB7IC4uLnN0YXRlLmludGVybmFsLCBhY3RpdmU6IGZhbHNlIH0gfSkpO1xuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSByb290LmdldCgpO1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmV2ZW50cy5kaXNjb25uZWN0Py4oKTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5nbD8ucmVuZGVyTGlzdHM/LmRpc3Bvc2U/LigpO1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmdsPy5mb3JjZUNvbnRleHRMb3NzPy4oKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3RhdGUuZ2w/LnhyKSBzdGF0ZS54ci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0ZGlzcG9zZShzdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0cm9vdHMuZGVsZXRlKGNhbnZhcyk7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdbTkdUXSBVbmV4cGVjdGVkIGVycm9yIHdoaWxlIGRlc3Ryb3lpbmcgQ2FudmFzIFJvb3QnLCBlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgdGltZW91dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb25maWd1cmU6IChpbnB1dHM6IE5ndENhbnZhc0lucHV0cykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtcblx0XHRcdFx0XHRcdGdsOiBnbE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRzaXplOiBzaXplT3B0aW9ucyxcblx0XHRcdFx0XHRcdGNhbWVyYTogY2FtZXJhT3B0aW9ucyxcblx0XHRcdFx0XHRcdHJheWNhc3RlcjogcmF5Y2FzdGVyT3B0aW9ucyxcblx0XHRcdFx0XHRcdHNjZW5lOiBzY2VuZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRldmVudHMsXG5cdFx0XHRcdFx0XHRvcnRob2dyYXBoaWMsXG5cdFx0XHRcdFx0XHRsb29rQXQsXG5cdFx0XHRcdFx0XHRzaGFkb3dzLFxuXHRcdFx0XHRcdFx0bGluZWFyLFxuXHRcdFx0XHRcdFx0bGVnYWN5LFxuXHRcdFx0XHRcdFx0ZmxhdCxcblx0XHRcdFx0XHRcdGRwcixcblx0XHRcdFx0XHRcdGZyYW1lbG9vcCxcblx0XHRcdFx0XHRcdHBlcmZvcm1hbmNlLFxuXHRcdFx0XHRcdH0gPSBpbnB1dHM7XG5cblx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IHN0b3JlLmdldCgpO1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRlVG9VcGRhdGU6IFBhcnRpYWw8Tmd0U3RhdGU+ID0ge307XG5cblx0XHRcdFx0XHQvLyBzZXR1cCByZW5kZXJlclxuXHRcdFx0XHRcdGxldCBnbCA9IHN0YXRlLmdsO1xuXHRcdFx0XHRcdGlmICghc3RhdGUuZ2wpIHN0YXRlVG9VcGRhdGUuZ2wgPSBnbCA9IG1ha2VEZWZhdWx0UmVuZGVyZXIoZ2xPcHRpb25zLCBjYW52YXMpO1xuXG5cdFx0XHRcdFx0Ly8gc2V0dXAgcmF5Y2FzdGVyXG5cdFx0XHRcdFx0bGV0IHJheWNhc3RlciA9IHN0YXRlLnJheWNhc3Rlcjtcblx0XHRcdFx0XHRpZiAoIXJheWNhc3Rlcikgc3RhdGVUb1VwZGF0ZS5yYXljYXN0ZXIgPSByYXljYXN0ZXIgPSBuZXcgVEhSRUUuUmF5Y2FzdGVyKCk7XG5cblx0XHRcdFx0XHQvLyBzZXQgcmF5Y2FzdGVyIG9wdGlvbnNcblx0XHRcdFx0XHRjb25zdCB7IHBhcmFtcywgLi4ub3B0aW9ucyB9ID0gcmF5Y2FzdGVyT3B0aW9ucyB8fCB7fTtcblx0XHRcdFx0XHRpZiAoIWlzLmVxdShvcHRpb25zLCByYXljYXN0ZXIsIHNoYWxsb3dMb29zZSkpIGFwcGx5UHJvcHMocmF5Y2FzdGVyLCB7IC4uLm9wdGlvbnMgfSk7XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUocGFyYW1zLCByYXljYXN0ZXIucGFyYW1zLCBzaGFsbG93TG9vc2UpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVByb3BzKHJheWNhc3RlciwgeyBwYXJhbXM6IHsgLi4ucmF5Y2FzdGVyLnBhcmFtcywgLi4uKHBhcmFtcyB8fCB7fSkgfSB9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBjcmVhdGUgZGVmYXVsdCBjYW1lcmFcblx0XHRcdFx0XHRpZiAoIXN0YXRlLmNhbWVyYSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNDYW1lcmEgPSBpcy5jYW1lcmEoY2FtZXJhT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRsZXQgY2FtZXJhID0gaXNDYW1lcmEgPyBjYW1lcmFPcHRpb25zIDogbWFrZURlZmF1bHRDYW1lcmEob3J0aG9ncmFwaGljIHx8IGZhbHNlLCBzdGF0ZS5zaXplKTtcblxuXHRcdFx0XHRcdFx0aWYgKCFpc0NhbWVyYSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoY2FtZXJhT3B0aW9ucykgYXBwbHlQcm9wcyhjYW1lcmEsIGNhbWVyYU9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIHNldCBwb3NpdGlvbi56XG5cdFx0XHRcdFx0XHRcdGlmICghY2FtZXJhT3B0aW9ucz8ucG9zaXRpb24pIGNhbWVyYS5wb3NpdGlvbi56ID0gNTtcblxuXHRcdFx0XHRcdFx0XHQvLyBhbHdheXMgbG9vayBhdCBjZW50ZXIgb3IgcGFzc2VkLWluIGxvb2tBdCBieSBkZWZhdWx0XG5cdFx0XHRcdFx0XHRcdGlmICghY2FtZXJhT3B0aW9ucz8ucm90YXRpb24gJiYgIWNhbWVyYU9wdGlvbnM/LnF1YXRlcm5pb24pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShsb29rQXQpKSBjYW1lcmEubG9va0F0KGxvb2tBdFswXSwgbG9va0F0WzFdLCBsb29rQXRbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGxvb2tBdCBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIGNhbWVyYS5sb29rQXQobG9va0F0KTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlIGNhbWVyYS5sb29rQXQoMCwgMCwgMCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggYWZ0ZXIgYXBwbHlwcm9wc1xuXHRcdFx0XHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeD8uKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICghaXMuaW5zdGFuY2UoY2FtZXJhKSkgY2FtZXJhID0gcHJlcGFyZShjYW1lcmEsIHsgc3RvcmUgfSk7XG5cblx0XHRcdFx0XHRcdHN0YXRlVG9VcGRhdGUuY2FtZXJhID0gY2FtZXJhO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFNldCB1cCBzY2VuZSAob25lIHRpbWUgb25seSEpXG5cdFx0XHRcdFx0aWYgKCFzdGF0ZS5zY2VuZSkge1xuXHRcdFx0XHRcdFx0bGV0IHNjZW5lOiBUSFJFRS5TY2VuZTtcblxuXHRcdFx0XHRcdFx0aWYgKHNjZW5lT3B0aW9ucyBpbnN0YW5jZW9mIFRIUkVFLlNjZW5lKSB7XG5cdFx0XHRcdFx0XHRcdHNjZW5lID0gcHJlcGFyZShzY2VuZU9wdGlvbnMsIHsgc3RvcmUgfSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzY2VuZSA9IHByZXBhcmUobmV3IFRIUkVFLlNjZW5lKCksIHsgc3RvcmUgfSk7XG5cdFx0XHRcdFx0XHRcdGlmIChzY2VuZU9wdGlvbnMpIGFwcGx5UHJvcHMoc2NlbmUsIHNjZW5lT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXRlVG9VcGRhdGUuc2NlbmUgPSBzY2VuZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgdXAgWFIgKG9uZSB0aW1lIG9ubHkhKVxuXHRcdFx0XHRcdGlmICghc3RhdGUueHIpIHtcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmcmFtZSBiZWhhdmlvciBpbiBXZWJYUlxuXHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlWFJGcmFtZTogWFJGcmFtZVJlcXVlc3RDYWxsYmFjayA9ICh0aW1lc3RhbXA6IG51bWJlciwgZnJhbWU/OiBYUkZyYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzdGF0ZS5mcmFtZWxvb3AgPT09ICduZXZlcicpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0bG9vcC5hZHZhbmNlKHRpbWVzdGFtcCwgdHJ1ZSwgc3RvcmUsIGZyYW1lKTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFRvZ2dsZSByZW5kZXIgc3dpdGNoaW5nIG9uIHNlc3Npb25cblx0XHRcdFx0XHRcdGNvbnN0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmdsLnhyLmVuYWJsZWQgPSBzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmc7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZ2wueHIuc2V0QW5pbWF0aW9uTG9vcChzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmcgPyBoYW5kbGVYUkZyYW1lIDogbnVsbCk7XG5cdFx0XHRcdFx0XHRcdGlmICghc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nKSBsb29wLmludmFsaWRhdGUoc3RvcmUpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0Ly8gV2ViWFIgc2Vzc2lvbiBtYW5hZ2VyXG5cdFx0XHRcdFx0XHRjb25zdCB4ciA9IHtcblx0XHRcdFx0XHRcdFx0Y29ubmVjdDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25zdGFydCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25lbmQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25zdGFydCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25lbmQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFN1YnNjcmliZSB0byBXZWJYUiBzZXNzaW9uIGV2ZW50c1xuXHRcdFx0XHRcdFx0aWYgKGdsLnhyICYmIHR5cGVvZiBnbC54ci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB4ci5jb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnhyID0geHI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IHNoYWRvd21hcFxuXHRcdFx0XHRcdGlmIChnbC5zaGFkb3dNYXApIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9sZEVuYWJsZWQgPSBnbC5zaGFkb3dNYXAuZW5hYmxlZDtcblx0XHRcdFx0XHRcdGNvbnN0IG9sZFR5cGUgPSBnbC5zaGFkb3dNYXAudHlwZTtcblx0XHRcdFx0XHRcdGdsLnNoYWRvd01hcC5lbmFibGVkID0gISFzaGFkb3dzO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHNoYWRvd3MgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRcdFx0XHRnbC5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzaGFkb3dzID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0eXBlcyA9IHtcblx0XHRcdFx0XHRcdFx0XHRiYXNpYzogVEhSRUUuQmFzaWNTaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdFx0cGVyY2VudGFnZTogVEhSRUUuUENGU2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHNvZnQ6IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdFx0dmFyaWFuY2U6IFRIUkVFLlZTTVNoYWRvd01hcCxcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Z2wuc2hhZG93TWFwLnR5cGUgPSB0eXBlc1tzaGFkb3dzXSA/PyBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpcy5vYmooc2hhZG93cykpIHtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihnbC5zaGFkb3dNYXAsIHNoYWRvd3MpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob2xkRW5hYmxlZCAhPT0gZ2wuc2hhZG93TWFwLmVuYWJsZWQgfHwgb2xkVHlwZSAhPT0gZ2wuc2hhZG93TWFwLnR5cGUpXG5cdFx0XHRcdFx0XHRcdGNoZWNrTmVlZHNVcGRhdGUoZ2wuc2hhZG93TWFwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTYWZlbHkgc2V0IGNvbG9yIG1hbmFnZW1lbnQgaWYgYXZhaWxhYmxlLlxuXHRcdFx0XHRcdC8vIEF2b2lkIGFjY2Vzc2luZyBUSFJFRS5Db2xvck1hbmFnZW1lbnQgdG8gcGxheSBuaWNlIHdpdGggb2xkZXIgdmVyc2lvbnNcblx0XHRcdFx0XHRpZiAoVEhSRUUuQ29sb3JNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBDb2xvck1hbmFnZW1lbnQgPSBUSFJFRS5Db2xvck1hbmFnZW1lbnQgYXMgTmd0QW55UmVjb3JkO1xuXHRcdFx0XHRcdFx0aWYgKCdlbmFibGVkJyBpbiBDb2xvck1hbmFnZW1lbnQpIENvbG9yTWFuYWdlbWVudFsnZW5hYmxlZCddID0gIWxlZ2FjeSA/PyBmYWxzZTtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKCdsZWdhY3lNb2RlJyBpbiBDb2xvck1hbmFnZW1lbnQpIENvbG9yTWFuYWdlbWVudFsnbGVnYWN5TW9kZSddID0gbGVnYWN5ID8/IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gc2V0IGNvbG9yIHNwYWNlIGFuZCB0b25lbWFwcGluZyBwcmVmZXJlbmNlc1xuXHRcdFx0XHRcdGNvbnN0IExpbmVhckVuY29kaW5nID0gMzAwMDtcblx0XHRcdFx0XHRjb25zdCBzUkdCRW5jb2RpbmcgPSAzMDAxO1xuXHRcdFx0XHRcdGFwcGx5UHJvcHMoZ2wsIHtcblx0XHRcdFx0XHRcdG91dHB1dEVuY29kaW5nOiBsaW5lYXIgPyBMaW5lYXJFbmNvZGluZyA6IHNSR0JFbmNvZGluZyxcblx0XHRcdFx0XHRcdHRvbmVNYXBwaW5nOiBmbGF0ID8gVEhSRUUuTm9Ub25lTWFwcGluZyA6IFRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZyxcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBjb2xvciBtYW5hZ2VtZW50IHN0YXRlXG5cdFx0XHRcdFx0aWYgKHN0YXRlLmxlZ2FjeSAhPT0gbGVnYWN5KSBzdGF0ZVRvVXBkYXRlLmxlZ2FjeSA9IGxlZ2FjeTtcblx0XHRcdFx0XHRpZiAoc3RhdGUubGluZWFyICE9PSBsaW5lYXIpIHN0YXRlVG9VcGRhdGUubGluZWFyID0gbGluZWFyO1xuXHRcdFx0XHRcdGlmIChzdGF0ZS5mbGF0ICE9PSBmbGF0KSBzdGF0ZVRvVXBkYXRlLmZsYXQgPSBmbGF0O1xuXG5cdFx0XHRcdFx0Ly8gU2V0IGdsIHByb3BzXG5cdFx0XHRcdFx0Z2wuc2V0Q2xlYXJBbHBoYSgwKTtcblx0XHRcdFx0XHRnbC5zZXRQaXhlbFJhdGlvKG1ha2VEcHIoc3RhdGUudmlld3BvcnQuZHByKSk7XG5cdFx0XHRcdFx0Z2wuc2V0U2l6ZShzdGF0ZS5zaXplLndpZHRoLCBzdGF0ZS5zaXplLmhlaWdodCk7XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRpcy5vYmooZ2xPcHRpb25zKSAmJlxuXHRcdFx0XHRcdFx0ISh0eXBlb2YgZ2xPcHRpb25zID09PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0XHRcdFx0IWlzLnJlbmRlcmVyKGdsT3B0aW9ucykgJiZcblx0XHRcdFx0XHRcdCFpcy5lcXUoZ2xPcHRpb25zLCBnbCwgc2hhbGxvd0xvb3NlKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0YXBwbHlQcm9wcyhnbCwgZ2xPcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBldmVudHMgaW50ZXJuYWxseVxuXHRcdFx0XHRcdGlmIChldmVudHMgJiYgIXN0YXRlLmV2ZW50cy5oYW5kbGVycykgc3RhdGVUb1VwZGF0ZS5ldmVudHMgPSBldmVudHMoc3RvcmUpO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGVyZm9ybWFuY2Vcblx0XHRcdFx0XHRpZiAocGVyZm9ybWFuY2UgJiYgIWlzLmVxdShwZXJmb3JtYW5jZSwgc3RhdGUucGVyZm9ybWFuY2UsIHNoYWxsb3dMb29zZSkpIHtcblx0XHRcdFx0XHRcdHN0YXRlVG9VcGRhdGUucGVyZm9ybWFuY2UgPSB7IC4uLnN0YXRlLnBlcmZvcm1hbmNlLCAuLi5wZXJmb3JtYW5jZSB9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHN0b3JlLnNldChzdGF0ZVRvVXBkYXRlKTtcblxuXHRcdFx0XHRcdC8vIENoZWNrIHNpemUsIGFsbG93IGl0IHRvIHRha2Ugb24gY29udGFpbmVyIGJvdW5kcyBpbml0aWFsbHlcblx0XHRcdFx0XHRjb25zdCBzaXplID0gY29tcHV0ZUluaXRpYWxTaXplKGNhbnZhcywgc2l6ZU9wdGlvbnMpO1xuXHRcdFx0XHRcdGlmICghaXMuZXF1KHNpemUsIHN0YXRlLnNpemUsIHNoYWxsb3dMb29zZSkpIHtcblx0XHRcdFx0XHRcdHN0YXRlLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHNpemUudG9wLCBzaXplLmxlZnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDaGVjayBwaXhlbHJhdGlvXG5cdFx0XHRcdFx0aWYgKGRwciAmJiBzdGF0ZS52aWV3cG9ydC5kcHIgIT09IG1ha2VEcHIoZHByKSkgc3RhdGUuc2V0RHByKGRwcik7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZnJhbWVsb29wXG5cdFx0XHRcdFx0aWYgKHN0YXRlLmZyYW1lbG9vcCAhPT0gZnJhbWVsb29wKSBzdGF0ZS5zZXRGcmFtZWxvb3AoZnJhbWVsb29wKTtcblxuXHRcdFx0XHRcdGlzQ29uZmlndXJlZCA9IHRydWU7XG5cblx0XHRcdFx0XHRpbnZhbGlkYXRlUmVmPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0aW52YWxpZGF0ZVJlZiA9IGVmZmVjdCgoKSA9PiB2b2lkIHN0b3JlLnN0YXRlKCkuaW52YWxpZGF0ZSgpLCB7IG1hbnVhbENsZWFudXA6IHRydWUsIGluamVjdG9yIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblx0XHR9O1xuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0Q2FudmFzQ29uZmlndXJhdG9yID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBpbmplY3RDYW52YXNSb290SW5pdGlhbGl6ZXI+PjtcblxuZnVuY3Rpb24gY29tcHV0ZUluaXRpYWxTaXplKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBUSFJFRS5PZmZzY3JlZW5DYW52YXMsIGRlZmF1bHRTaXplPzogTmd0U2l6ZSk6IE5ndFNpemUge1xuXHRpZiAoZGVmYXVsdFNpemUpIHJldHVybiBkZWZhdWx0U2l6ZTtcblxuXHRpZiAoY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgJiYgY2FudmFzLnBhcmVudEVsZW1lbnQpIHtcblx0XHRyZXR1cm4gY2FudmFzLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdH1cblxuXHRyZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTtcbn1cblxuLy8gRGlzcG9zZXMgYW4gb2JqZWN0IGFuZCBhbGwgaXRzIHByb3BlcnRpZXNcbmZ1bmN0aW9uIGRpc3Bvc2U8VE9iaiBleHRlbmRzIHsgZGlzcG9zZT86ICgpID0+IHZvaWQ7IHR5cGU/OiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IGFueSB9PihvYmo6IFRPYmopIHtcblx0aWYgKG9iai5kaXNwb3NlICYmIG9iai50eXBlICE9PSAnU2NlbmUnKSBvYmouZGlzcG9zZSgpO1xuXHRmb3IgKGNvbnN0IHAgaW4gb2JqKSB7XG5cdFx0KHAgYXMgYW55KS5kaXNwb3NlPy4oKTtcblx0XHRkZWxldGUgb2JqW3BdO1xuXHR9XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yb290cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUNOLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE9BQU8sR0FDUCxNQUFNLE9BQU8sQ0FBQztBQUVmLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQXFCLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWxELE1BQU0sWUFBWSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQztBQUUzRSxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBbUI7SUFDOUQsT0FBTyxjQUFjLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNqRSxNQUFNLGFBQWEsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUs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QUFDO0lBQ3hFLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsTUFBTSxVQUFVLE9BQU8sQ0FBMkUsR0FBUztJQUMxRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPO1FBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZELEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEIsQ0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhc3NlcnRJbmplY3RvciB9IGZyb20gJ25neHRlbnNpb24vYXNzZXJ0LWluamVjdG9yJztcbmltcG9ydCB7XG5cdEFDRVNGaWxtaWNUb25lTWFwcGluZyxcblx0QmFzaWNTaGFkb3dNYXAsXG5cdENvbG9yTWFuYWdlbWVudCxcblx0Tm9Ub25lTWFwcGluZyxcblx0UENGU2hhZG93TWFwLFxuXHRQQ0ZTb2Z0U2hhZG93TWFwLFxuXHRSYXljYXN0ZXIsXG5cdFNjZW5lLFxuXHRWU01TaGFkb3dNYXAsXG5cdFZlY3RvcjMsXG59IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE5ndENhbnZhc0lucHV0cyB9IGZyb20gJy4vY2FudmFzJztcbmltcG9ydCB7IHByZXBhcmUgfSBmcm9tICcuL2luc3RhbmNlJztcbmltcG9ydCB7IGluamVjdExvb3AgfSBmcm9tICcuL2xvb3AnO1xuaW1wb3J0IHsgTmd0U2l6ZSwgTmd0U3RhdGUsIGluamVjdFN0b3JlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQsIE5ndEVxdUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VDYW1lcmFJbnN0YW5jZSwgbWFrZURwciwgbWFrZVJlbmRlcmVySW5zdGFuY2UgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuaW1wb3J0IHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBjaGVja05lZWRzVXBkYXRlIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5leHBvcnQgdHlwZSBOZ3RDYW52YXNFbGVtZW50ID0gSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG5cbmNvbnN0IHNoYWxsb3dMb29zZSA9IHsgb2JqZWN0czogJ3NoYWxsb3cnLCBzdHJpY3Q6IGZhbHNlIH0gYXMgTmd0RXF1Q29uZmlnO1xuXG5leHBvcnQgY29uc3Qgcm9vdHMgPSBuZXcgTWFwPE5ndENhbnZhc0VsZW1lbnQsIE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplcihpbmplY3Rvcj86IEluamVjdG9yKSB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3RDYW52YXNSb290SW5pdGlhbGl6ZXIsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgaW5qZWN0ZWRTdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdFx0Y29uc3QgbG9vcCA9IGluamVjdExvb3AoKTtcblxuXHRcdHJldHVybiAoY2FudmFzOiBOZ3RDYW52YXNFbGVtZW50KSA9PiB7XG5cdFx0XHRjb25zdCBleGlzdCA9IHJvb3RzLmhhcyhjYW52YXMpO1xuXHRcdFx0bGV0IHN0b3JlID0gcm9vdHMuZ2V0KGNhbnZhcykgYXMgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXG5cdFx0XHRpZiAoc3RvcmUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbTkdUXSBTYW1lIGNhbnZhcyByb290IGlzIGJlaW5nIGNyZWF0ZWQgdHdpY2UnKTtcblx0XHRcdH1cblxuXHRcdFx0c3RvcmUgfHw9IGluamVjdGVkU3RvcmU7XG5cblx0XHRcdGlmICghc3RvcmUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdbTkdUXSBObyBzdG9yZSBpbml0aWFsaXplZCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWV4aXN0KSB7XG5cdFx0XHRcdHJvb3RzLnNldChjYW52YXMsIHN0b3JlKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlO1xuXHRcdFx0bGV0IGxhc3RDYW1lcmE6IE5ndENhbnZhc0lucHV0c1snY2FtZXJhJ107XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlzQ29uZmlndXJlZCxcblx0XHRcdFx0ZGVzdHJveTogKHRpbWVvdXQgPSA1MDApID0+IHtcblx0XHRcdFx0XHRjb25zdCByb290ID0gcm9vdHMuZ2V0KGNhbnZhcyk7XG5cdFx0XHRcdFx0aWYgKHJvb3QpIHtcblx0XHRcdFx0XHRcdHJvb3QudXBkYXRlKChzdGF0ZSkgPT4gKHsgaW50ZXJuYWw6IHsgLi4uc3RhdGUuaW50ZXJuYWwsIGFjdGl2ZTogZmFsc2UgfSB9KSk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IHJvb3QuZ2V0KCk7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmV2ZW50cy5kaXNjb25uZWN0Py4oKTtcblx0XHRcdFx0XHRcdFx0c3RhdGUuZ2w/LnJlbmRlckxpc3RzPy5kaXNwb3NlPy4oKTtcblx0XHRcdFx0XHRcdFx0c3RhdGUuZ2w/LmZvcmNlQ29udGV4dExvc3M/LigpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3RhdGUuZ2w/LnhyKSBzdGF0ZS54ci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGRpc3Bvc2Uoc3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRyb290cy5kZWxldGUoY2FudmFzKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignW05HVF0gVW5leHBlY3RlZCBlcnJvciB3aGlsZSBkZXN0cm95aW5nIENhbnZhcyBSb290JywgZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb25maWd1cmU6IChpbnB1dHM6IE5ndENhbnZhc0lucHV0cykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtcblx0XHRcdFx0XHRcdHNoYWRvd3MgPSBmYWxzZSxcblx0XHRcdFx0XHRcdGxpbmVhciA9IGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmxhdCA9IGZhbHNlLFxuXHRcdFx0XHRcdFx0bGVnYWN5ID0gZmFsc2UsXG5cdFx0XHRcdFx0XHRvcnRob2dyYXBoaWMgPSBmYWxzZSxcblx0XHRcdFx0XHRcdGZyYW1lbG9vcCA9ICdhbHdheXMnLFxuXHRcdFx0XHRcdFx0ZHByID0gWzEsIDJdLFxuXHRcdFx0XHRcdFx0Z2w6IGdsT3B0aW9ucyxcblx0XHRcdFx0XHRcdHNpemU6IHNpemVPcHRpb25zLFxuXHRcdFx0XHRcdFx0Y2FtZXJhOiBjYW1lcmFPcHRpb25zLFxuXHRcdFx0XHRcdFx0cmF5Y2FzdGVyOiByYXljYXN0ZXJPcHRpb25zLFxuXHRcdFx0XHRcdFx0c2NlbmU6IHNjZW5lT3B0aW9ucyxcblx0XHRcdFx0XHRcdGV2ZW50cyxcblx0XHRcdFx0XHRcdGxvb2tBdCxcblx0XHRcdFx0XHRcdHBlcmZvcm1hbmNlLFxuXHRcdFx0XHRcdH0gPSBpbnB1dHM7XG5cblx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IHN0b3JlLnNuYXBzaG90O1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRlVG9VcGRhdGU6IFBhcnRpYWw8Tmd0U3RhdGU+ID0ge307XG5cblx0XHRcdFx0XHQvLyBzZXR1cCByZW5kZXJlclxuXHRcdFx0XHRcdGxldCBnbCA9IHN0YXRlLmdsO1xuXHRcdFx0XHRcdGlmICghc3RhdGUuZ2wpIHN0YXRlVG9VcGRhdGUuZ2wgPSBnbCA9IG1ha2VSZW5kZXJlckluc3RhbmNlKGdsT3B0aW9ucywgY2FudmFzKTtcblxuXHRcdFx0XHRcdC8vIHNldHVwIHJheWNhc3RlclxuXHRcdFx0XHRcdGxldCByYXljYXN0ZXIgPSBzdGF0ZS5yYXljYXN0ZXI7XG5cdFx0XHRcdFx0aWYgKCFyYXljYXN0ZXIpIHN0YXRlVG9VcGRhdGUucmF5Y2FzdGVyID0gcmF5Y2FzdGVyID0gbmV3IFJheWNhc3RlcigpO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHJheWNhc3RlciBvcHRpb25zXG5cdFx0XHRcdFx0Y29uc3QgeyBwYXJhbXMsIC4uLm9wdGlvbnMgfSA9IHJheWNhc3Rlck9wdGlvbnMgfHwge307XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUob3B0aW9ucywgcmF5Y2FzdGVyLCBzaGFsbG93TG9vc2UpKSBhcHBseVByb3BzKHJheWNhc3Rlciwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUocGFyYW1zLCByYXljYXN0ZXIucGFyYW1zLCBzaGFsbG93TG9vc2UpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVByb3BzKHJheWNhc3RlciwgeyBwYXJhbXM6IHsgLi4ucmF5Y2FzdGVyLnBhcmFtcywgLi4uKHBhcmFtcyB8fCB7fSkgfSB9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgZGVmYXVsdCBjYW1lcmEsIGRvbid0IG92ZXJ3cml0ZSBhbnkgdXNlci1zZXQgc3RhdGVcblx0XHRcdFx0XHRpZiAoIXN0YXRlLmNhbWVyYSB8fCAoc3RhdGUuY2FtZXJhID09PSBsYXN0Q2FtZXJhICYmICFpcy5lcXUobGFzdENhbWVyYSwgY2FtZXJhT3B0aW9ucywgc2hhbGxvd0xvb3NlKSkpIHtcblx0XHRcdFx0XHRcdGxhc3RDYW1lcmEgPSBjYW1lcmFPcHRpb25zO1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNDYW1lcmEgPSBpcy5jYW1lcmEoY2FtZXJhT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRsZXQgY2FtZXJhID0gaXNDYW1lcmEgPyBjYW1lcmFPcHRpb25zIDogbWFrZUNhbWVyYUluc3RhbmNlKG9ydGhvZ3JhcGhpYywgc3RhdGUuc2l6ZSk7XG5cblx0XHRcdFx0XHRcdGlmICghaXNDYW1lcmEpIHtcblx0XHRcdFx0XHRcdFx0Y2FtZXJhLnBvc2l0aW9uLnogPSA1O1xuXHRcdFx0XHRcdFx0XHRpZiAoY2FtZXJhT3B0aW9ucykge1xuXHRcdFx0XHRcdFx0XHRcdGFwcGx5UHJvcHMoY2FtZXJhLCBjYW1lcmFPcHRpb25zKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHQnYXNwZWN0JyBpbiBjYW1lcmFPcHRpb25zIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQnbGVmdCcgaW4gY2FtZXJhT3B0aW9ucyB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0J3JpZ2h0JyBpbiBjYW1lcmFPcHRpb25zIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQndG9wJyBpbiBjYW1lcmFPcHRpb25zIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQnYm90dG9tJyBpbiBjYW1lcmFPcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGNhbWVyYSwgeyBtYW51YWw6IHRydWUgfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYW1lcmE/LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBhbHdheXMgbG9vayBhdCBjZW50ZXIgb3IgcGFzc2VkLWluIGxvb2tBdCBieSBkZWZhdWx0XG5cdFx0XHRcdFx0XHRcdGlmICghc3RhdGUuY2FtZXJhICYmICFjYW1lcmFPcHRpb25zPy5yb3RhdGlvbiAmJiAhY2FtZXJhT3B0aW9ucz8ucXVhdGVybmlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGxvb2tBdCkpIGNhbWVyYS5sb29rQXQobG9va0F0WzBdLCBsb29rQXRbMV0sIGxvb2tBdFsyXSk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAobG9va0F0IGluc3RhbmNlb2YgVmVjdG9yMykgY2FtZXJhLmxvb2tBdChsb29rQXQpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2UgY2FtZXJhLmxvb2tBdCgwLCAwLCAwKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBhZnRlciBhcHBseXByb3BzXG5cdFx0XHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4Py4oKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCFpcy5pbnN0YW5jZShjYW1lcmEpKSBjYW1lcmEgPSBwcmVwYXJlKGNhbWVyYSwgeyBzdG9yZSB9KTtcblxuXHRcdFx0XHRcdFx0c3RhdGVUb1VwZGF0ZS5jYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0XHRcdC8vIENvbmZpZ3VyZSByYXljYXN0ZXJcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QteHIvaXNzdWVzLzMwMFxuXHRcdFx0XHRcdFx0cmF5Y2FzdGVyLmNhbWVyYSA9IGNhbWVyYTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgdXAgc2NlbmUgKG9uZSB0aW1lIG9ubHkhKVxuXHRcdFx0XHRcdGlmICghc3RhdGUuc2NlbmUpIHtcblx0XHRcdFx0XHRcdGxldCBzY2VuZTogU2NlbmU7XG5cblx0XHRcdFx0XHRcdGlmIChzY2VuZU9wdGlvbnMgaW5zdGFuY2VvZiBTY2VuZSkge1xuXHRcdFx0XHRcdFx0XHRzY2VuZSA9IHNjZW5lT3B0aW9ucztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNjZW5lID0gbmV3IFNjZW5lKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzY2VuZU9wdGlvbnMpIGFwcGx5UHJvcHMoc2NlbmUsIHNjZW5lT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXRlVG9VcGRhdGUuc2NlbmUgPSBwcmVwYXJlKHNjZW5lLCB7IHN0b3JlIH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFNldCB1cCBYUiAob25lIHRpbWUgb25seSEpXG5cdFx0XHRcdFx0aWYgKCFzdGF0ZS54cikge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZyYW1lIGJlaGF2aW9yIGluIFdlYlhSXG5cdFx0XHRcdFx0XHRjb25zdCBoYW5kbGVYUkZyYW1lOiBYUkZyYW1lUmVxdWVzdENhbGxiYWNrID0gKHRpbWVzdGFtcDogbnVtYmVyLCBmcmFtZT86IFhSRnJhbWUpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRcdFx0aWYgKHN0YXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJykgcmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRsb29wLmFkdmFuY2UodGltZXN0YW1wLCB0cnVlLCBzdG9yZSwgZnJhbWUpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0Ly8gVG9nZ2xlIHJlbmRlciBzd2l0Y2hpbmcgb24gc2Vzc2lvblxuXHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlU2Vzc2lvbkNoYW5nZSA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRcdFx0c3RhdGUuZ2wueHIuZW5hYmxlZCA9IHN0YXRlLmdsLnhyLmlzUHJlc2VudGluZztcblx0XHRcdFx0XHRcdFx0c3RhdGUuZ2wueHIuc2V0QW5pbWF0aW9uTG9vcChzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmcgPyBoYW5kbGVYUkZyYW1lIDogbnVsbCk7XG5cdFx0XHRcdFx0XHRcdGlmICghc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nKSBsb29wLmludmFsaWRhdGUoc3RvcmUpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0Ly8gV2ViWFIgc2Vzc2lvbiBtYW5hZ2VyXG5cdFx0XHRcdFx0XHRjb25zdCB4ciA9IHtcblx0XHRcdFx0XHRcdFx0Y29ubmVjdDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25zdGFydCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25lbmQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25zdGFydCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuXHRcdFx0XHRcdFx0XHRcdGdsLnhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nlc3Npb25lbmQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFN1YnNjcmliZSB0byBXZWJYUiBzZXNzaW9uIGV2ZW50c1xuXHRcdFx0XHRcdFx0aWYgKGdsLnhyICYmIHR5cGVvZiBnbC54ci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB4ci5jb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnhyID0geHI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IHNoYWRvd21hcFxuXHRcdFx0XHRcdGlmIChnbC5zaGFkb3dNYXApIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9sZEVuYWJsZWQgPSBnbC5zaGFkb3dNYXAuZW5hYmxlZDtcblx0XHRcdFx0XHRcdGNvbnN0IG9sZFR5cGUgPSBnbC5zaGFkb3dNYXAudHlwZTtcblx0XHRcdFx0XHRcdGdsLnNoYWRvd01hcC5lbmFibGVkID0gISFzaGFkb3dzO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHNoYWRvd3MgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRcdFx0XHRnbC5zaGFkb3dNYXAudHlwZSA9IFBDRlNvZnRTaGFkb3dNYXA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzaGFkb3dzID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0eXBlcyA9IHtcblx0XHRcdFx0XHRcdFx0XHRiYXNpYzogQmFzaWNTaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdFx0cGVyY2VudGFnZTogUENGU2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHNvZnQ6IFBDRlNvZnRTaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdFx0dmFyaWFuY2U6IFZTTVNoYWRvd01hcCxcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Z2wuc2hhZG93TWFwLnR5cGUgPSB0eXBlc1tzaGFkb3dzXSA/PyBQQ0ZTb2Z0U2hhZG93TWFwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpcy5vYmooc2hhZG93cykpIHtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihnbC5zaGFkb3dNYXAsIHNoYWRvd3MpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob2xkRW5hYmxlZCAhPT0gZ2wuc2hhZG93TWFwLmVuYWJsZWQgfHwgb2xkVHlwZSAhPT0gZ2wuc2hhZG93TWFwLnR5cGUpIGNoZWNrTmVlZHNVcGRhdGUoZ2wuc2hhZG93TWFwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTYWZlbHkgc2V0IGNvbG9yIG1hbmFnZW1lbnQgaWYgYXZhaWxhYmxlLlxuXHRcdFx0XHRcdC8vIEF2b2lkIGFjY2Vzc2luZyBDb2xvck1hbmFnZW1lbnQgdG8gcGxheSBuaWNlIHdpdGggb2xkZXIgdmVyc2lvbnNcblx0XHRcdFx0XHRpZiAoQ29sb3JNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb2xvck1hbmFnZW1lbnQgPSBDb2xvck1hbmFnZW1lbnQgYXMgTmd0QW55UmVjb3JkO1xuXHRcdFx0XHRcdFx0aWYgKCdlbmFibGVkJyBpbiBjb2xvck1hbmFnZW1lbnQpIGNvbG9yTWFuYWdlbWVudFsnZW5hYmxlZCddID0gIWxlZ2FjeSA/PyBmYWxzZTtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKCdsZWdhY3lNb2RlJyBpbiBjb2xvck1hbmFnZW1lbnQpIGNvbG9yTWFuYWdlbWVudFsnbGVnYWN5TW9kZSddID0gbGVnYWN5ID8/IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFpc0NvbmZpZ3VyZWQpIHtcblx0XHRcdFx0XHRcdC8vIHNldCBjb2xvciBzcGFjZSBhbmQgdG9uZW1hcHBpbmcgcHJlZmVyZW5jZXMgb25jZVxuXHRcdFx0XHRcdFx0Y29uc3QgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1JHQkVuY29kaW5nID0gMzAwMTtcblx0XHRcdFx0XHRcdGFwcGx5UHJvcHMoZ2wsIHtcblx0XHRcdFx0XHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGxpbmVhciA/IExpbmVhckVuY29kaW5nIDogc1JHQkVuY29kaW5nLFxuXHRcdFx0XHRcdFx0XHR0b25lTWFwcGluZzogZmxhdCA/IE5vVG9uZU1hcHBpbmcgOiBBQ0VTRmlsbWljVG9uZU1hcHBpbmcsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgY29sb3IgbWFuYWdlbWVudCBzdGF0ZVxuXHRcdFx0XHRcdGlmIChzdGF0ZS5sZWdhY3kgIT09IGxlZ2FjeSkgc3RhdGVUb1VwZGF0ZS5sZWdhY3kgPSBsZWdhY3k7XG5cdFx0XHRcdFx0aWYgKHN0YXRlLmxpbmVhciAhPT0gbGluZWFyKSBzdGF0ZVRvVXBkYXRlLmxpbmVhciA9IGxpbmVhcjtcblx0XHRcdFx0XHRpZiAoc3RhdGUuZmxhdCAhPT0gZmxhdCkgc3RhdGVUb1VwZGF0ZS5mbGF0ID0gZmxhdDtcblxuXHRcdFx0XHRcdC8vIFNldCBnbCBwcm9wc1xuXHRcdFx0XHRcdGdsLnNldENsZWFyQWxwaGEoMCk7XG5cdFx0XHRcdFx0Z2wuc2V0UGl4ZWxSYXRpbyhtYWtlRHByKHN0YXRlLnZpZXdwb3J0LmRwcikpO1xuXHRcdFx0XHRcdGdsLnNldFNpemUoc3RhdGUuc2l6ZS53aWR0aCwgc3RhdGUuc2l6ZS5oZWlnaHQpO1xuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0aXMub2JqKGdsT3B0aW9ucykgJiZcblx0XHRcdFx0XHRcdCEodHlwZW9mIGdsT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgJiZcblx0XHRcdFx0XHRcdCFpcy5yZW5kZXJlcihnbE9wdGlvbnMpICYmXG5cdFx0XHRcdFx0XHQhaXMuZXF1KGdsT3B0aW9ucywgZ2wsIHNoYWxsb3dMb29zZSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGFwcGx5UHJvcHMoZ2wsIGdsT3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgZXZlbnRzIGludGVybmFsbHlcblx0XHRcdFx0XHRpZiAoZXZlbnRzICYmICFzdGF0ZS5ldmVudHMuaGFuZGxlcnMpIHN0YXRlVG9VcGRhdGUuZXZlbnRzID0gZXZlbnRzKHN0b3JlKTtcblxuXHRcdFx0XHRcdC8vIENoZWNrIHBlcmZvcm1hbmNlXG5cdFx0XHRcdFx0aWYgKHBlcmZvcm1hbmNlICYmICFpcy5lcXUocGVyZm9ybWFuY2UsIHN0YXRlLnBlcmZvcm1hbmNlLCBzaGFsbG93TG9vc2UpKSB7XG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnBlcmZvcm1hbmNlID0geyAuLi5zdGF0ZS5wZXJmb3JtYW5jZSwgLi4ucGVyZm9ybWFuY2UgfTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoc3RhdGVUb1VwZGF0ZSkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRzdG9yZS51cGRhdGUoc3RhdGVUb1VwZGF0ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgc2l6ZSwgYWxsb3cgaXQgdG8gdGFrZSBvbiBjb250YWluZXIgYm91bmRzIGluaXRpYWxseVxuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSBjb21wdXRlSW5pdGlhbFNpemUoY2FudmFzLCBzaXplT3B0aW9ucyk7XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUoc2l6ZSwgc3RhdGUuc2l6ZSwgc2hhbGxvd0xvb3NlKSkge1xuXHRcdFx0XHRcdFx0c3RhdGUuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCwgc2l6ZS50b3AsIHNpemUubGVmdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGl4ZWxyYXRpb1xuXHRcdFx0XHRcdGlmIChkcHIgJiYgc3RhdGUudmlld3BvcnQuZHByICE9PSBtYWtlRHByKGRwcikpIHN0YXRlLnNldERwcihkcHIpO1xuXHRcdFx0XHRcdC8vIENoZWNrIGZyYW1lbG9vcFxuXHRcdFx0XHRcdGlmIChzdGF0ZS5mcmFtZWxvb3AgIT09IGZyYW1lbG9vcCkgc3RhdGUuc2V0RnJhbWVsb29wKGZyYW1lbG9vcCk7XG5cblx0XHRcdFx0XHRpc0NvbmZpZ3VyZWQgPSB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblx0XHR9O1xuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0Q2FudmFzQ29uZmlndXJhdG9yID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBpbmplY3RDYW52YXNSb290SW5pdGlhbGl6ZXI+PjtcblxuZnVuY3Rpb24gY29tcHV0ZUluaXRpYWxTaXplKGNhbnZhczogTmd0Q2FudmFzRWxlbWVudCwgZGVmYXVsdFNpemU/OiBOZ3RTaXplKTogTmd0U2l6ZSB7XG5cdGlmIChkZWZhdWx0U2l6ZSkge1xuXHRcdHJldHVybiBkZWZhdWx0U2l6ZTtcblx0fVxuXG5cdGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICYmIGNhbnZhcy5wYXJlbnRFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNhbnZhcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIGNhbnZhcyBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcykge1xuXHRcdHJldHVybiB7IHdpZHRoOiBjYW52YXMud2lkdGgsIGhlaWdodDogY2FudmFzLmhlaWdodCwgdG9wOiAwLCBsZWZ0OiAwIH07XG5cdH1cblxuXHRyZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTtcbn1cblxuLy8gRGlzcG9zZXMgYW4gb2JqZWN0IGFuZCBhbGwgaXRzIHByb3BlcnRpZXNcbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlPFRPYmogZXh0ZW5kcyB7IGRpc3Bvc2U/OiAoKSA9PiB2b2lkOyB0eXBlPzogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfT4ob2JqOiBUT2JqKSB7XG5cdGlmIChvYmouZGlzcG9zZSAmJiBvYmoudHlwZSAhPT0gJ1NjZW5lJykgb2JqLmRpc3Bvc2UoKTtcblx0Zm9yIChjb25zdCBwIGluIG9iaikge1xuXHRcdChwIGFzIGFueSkuZGlzcG9zZT8uKCk7XG5cdFx0ZGVsZXRlIG9ialtwXTtcblx0fVxufVxuIl19
@@ -4,7 +4,6 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { ActivationEnd, Router, RouterOutlet } from '@angular/router';
5
5
  import { filter } from 'rxjs';
6
6
  import { ROUTED_SCENE } from './renderer/constants';
7
- import { safeDetectChanges } from './utils/safe-detect-changes';
8
7
  import * as i0 from "@angular/core";
9
8
  import * as i1 from "@angular/router";
10
9
  export class NgtRoutedScene {
@@ -13,14 +12,14 @@ export class NgtRoutedScene {
13
12
  constructor(router, cdr) {
14
13
  router.events
15
14
  .pipe(filter((event) => event instanceof ActivationEnd), takeUntilDestroyed())
16
- .subscribe(() => safeDetectChanges(cdr));
15
+ .subscribe(cdr.detectChanges.bind(cdr));
17
16
  }
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
19
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.6", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `
20
19
  <router-outlet />
21
20
  `, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
22
21
  }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRoutedScene, decorators: [{
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtRoutedScene, decorators: [{
24
23
  type: Component,
25
24
  args: [{
26
25
  standalone: true,
@@ -30,5 +29,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImpor
30
29
  `,
31
30
  imports: [RouterOutlet],
32
31
  }]
33
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.ChangeDetectorRef }]; } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFVaEUsTUFBTSxPQUFPLGNBQWM7a0JBQ2xCLFlBQVk7YUFBYixRQUFjLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFN0IsWUFBWSxNQUFjLEVBQUUsR0FBc0I7UUFDakQsTUFBTSxDQUFDLE1BQU07YUFDWCxJQUFJLENBQ0osTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLEVBQ2pELGtCQUFrQixFQUFFLENBQ3BCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs4R0FWVyxjQUFjO2tHQUFkLGNBQWMsNEVBTGhCOztFQUVULDREQUNTLFlBQVk7OzJGQUVWLGNBQWM7a0JBUjFCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBST1VURURfU0NFTkUgfSBmcm9tICcuL3JlbmRlcmVyL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzYWZlRGV0ZWN0Q2hhbmdlcyB9IGZyb20gJy4vdXRpbHMvc2FmZS1kZXRlY3QtY2hhbmdlcyc7XG5cbkBDb21wb25lbnQoe1xuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzZWxlY3RvcjogJ25ndC1yb3V0ZWQtc2NlbmUnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxyb3V0ZXItb3V0bGV0IC8+XG5cdGAsXG5cdGltcG9ydHM6IFtSb3V0ZXJPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSb3V0ZWRTY2VuZSB7XG5cdHN0YXRpYyBbUk9VVEVEX1NDRU5FXSA9IHRydWU7XG5cblx0Y29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRyb3V0ZXIuZXZlbnRzXG5cdFx0XHQucGlwZShcblx0XHRcdFx0ZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kKSxcblx0XHRcdFx0dGFrZVVudGlsRGVzdHJveWVkKCksXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKCgpID0+IHNhZmVEZXRlY3RDaGFuZ2VzKGNkcikpO1xuXHR9XG59XG4iXX0=
32
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i0.ChangeDetectorRef }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFVcEQsTUFBTSxPQUFPLGNBQWM7a0JBQ2xCLFlBQVk7YUFBYixRQUFjLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFN0IsWUFBWSxNQUFjLEVBQUUsR0FBc0I7UUFDakQsTUFBTSxDQUFDLE1BQU07YUFDWCxJQUFJLENBQ0osTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLEVBQ2pELGtCQUFrQixFQUFFLENBQ3BCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs4R0FWVyxjQUFjO2tHQUFkLGNBQWMsNEVBTGhCOztFQUVULDREQUNTLFlBQVk7OzJGQUVWLGNBQWM7a0JBUjFCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBST1VURURfU0NFTkUgfSBmcm9tICcuL3JlbmRlcmVyL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzZWxlY3RvcjogJ25ndC1yb3V0ZWQtc2NlbmUnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxyb3V0ZXItb3V0bGV0IC8+XG5cdGAsXG5cdGltcG9ydHM6IFtSb3V0ZXJPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSb3V0ZWRTY2VuZSB7XG5cdHN0YXRpYyBbUk9VVEVEX1NDRU5FXSA9IHRydWU7XG5cblx0Y29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRyb3V0ZXIuZXZlbnRzXG5cdFx0XHQucGlwZShcblx0XHRcdFx0ZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kKSxcblx0XHRcdFx0dGFrZVVudGlsRGVzdHJveWVkKCksXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKGNkci5kZXRlY3RDaGFuZ2VzLmJpbmQoY2RyKSk7XG5cdH1cbn1cbiJdfQ==