angular-three-soba 2.0.0-beta.9 → 2.1.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 (425) hide show
  1. package/README.md +62 -4
  2. package/abstractions/README.md +279 -2
  3. package/abstractions/index.d.ts +13 -6
  4. package/abstractions/lib/billboard.d.ts +19 -0
  5. package/abstractions/lib/catmull-rom-line.d.ts +617 -0
  6. package/abstractions/lib/cubic-bezier-line.d.ts +19 -0
  7. package/abstractions/lib/edges.d.ts +800 -0
  8. package/abstractions/lib/gradient-texture.d.ts +24 -0
  9. package/abstractions/lib/grid.d.ts +315 -0
  10. package/abstractions/lib/helper.d.ts +25 -0
  11. package/abstractions/lib/line.d.ts +41 -0
  12. package/abstractions/lib/prism-geometry.d.ts +32 -0
  13. package/abstractions/lib/quadratic-bezier-line.d.ts +21 -0
  14. package/abstractions/lib/rounded-box.d.ts +41 -0
  15. package/abstractions/lib/text-3d.d.ts +314 -0
  16. package/abstractions/lib/text.d.ts +54 -0
  17. package/cameras/README.md +91 -2
  18. package/cameras/index.d.ts +4 -4
  19. package/cameras/lib/camera-content.d.ts +10 -0
  20. package/cameras/lib/cube-camera.d.ts +38 -0
  21. package/cameras/lib/orthographic-camera.d.ts +40 -0
  22. package/cameras/lib/perspective-camera.d.ts +36 -0
  23. package/controls/README.md +96 -2
  24. package/controls/index.d.ts +4 -1
  25. package/controls/lib/camera-controls.d.ts +31 -0
  26. package/controls/lib/orbit-controls.d.ts +38 -0
  27. package/controls/lib/pivot-controls/axis-arrow.d.ts +31 -0
  28. package/controls/lib/pivot-controls/axis-rotator.d.ts +30 -0
  29. package/controls/lib/pivot-controls/pivot-controls.d.ts +110 -0
  30. package/controls/lib/pivot-controls/plane-slider.d.ts +32 -0
  31. package/controls/lib/pivot-controls/scaling-sphere.d.ts +32 -0
  32. package/controls/lib/scroll-controls.d.ts +78 -0
  33. package/esm2022/abstractions/index.mjs +14 -7
  34. package/esm2022/abstractions/lib/billboard.mjs +69 -0
  35. package/esm2022/abstractions/lib/catmull-rom-line.mjs +76 -0
  36. package/esm2022/abstractions/lib/cubic-bezier-line.mjs +51 -0
  37. package/esm2022/abstractions/lib/edges.mjs +70 -0
  38. package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
  39. package/esm2022/abstractions/lib/grid.mjs +103 -0
  40. package/esm2022/abstractions/lib/helper.mjs +76 -0
  41. package/esm2022/abstractions/lib/line.mjs +126 -0
  42. package/esm2022/abstractions/lib/prism-geometry.mjs +46 -0
  43. package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +73 -0
  44. package/esm2022/abstractions/lib/rounded-box.mjs +111 -0
  45. package/esm2022/abstractions/lib/text-3d.mjs +98 -0
  46. package/esm2022/abstractions/lib/text.mjs +91 -0
  47. package/esm2022/cameras/index.mjs +5 -5
  48. package/esm2022/cameras/lib/camera-content.mjs +14 -0
  49. package/esm2022/cameras/lib/cube-camera.mjs +111 -0
  50. package/esm2022/cameras/lib/orthographic-camera.mjs +131 -0
  51. package/esm2022/cameras/lib/perspective-camera.mjs +104 -0
  52. package/esm2022/controls/index.mjs +5 -2
  53. package/esm2022/controls/lib/camera-controls.mjs +127 -0
  54. package/esm2022/controls/lib/orbit-controls.mjs +132 -0
  55. package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +263 -0
  56. package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +264 -0
  57. package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +340 -0
  58. package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +266 -0
  59. package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +232 -0
  60. package/esm2022/controls/lib/scroll-controls.mjs +268 -0
  61. package/esm2022/loaders/index.mjs +6 -5
  62. package/esm2022/loaders/lib/font-loader.mjs +49 -0
  63. package/esm2022/loaders/lib/gltf-loader.mjs +51 -0
  64. package/esm2022/loaders/lib/loader.mjs +109 -0
  65. package/esm2022/loaders/lib/progress.mjs +51 -0
  66. package/esm2022/loaders/lib/texture-loader.mjs +32 -0
  67. package/esm2022/materials/index.mjs +8 -7
  68. package/esm2022/materials/lib/custom-shader-material.mjs +71 -0
  69. package/esm2022/materials/lib/mesh-distort-material.mjs +42 -0
  70. package/esm2022/materials/lib/mesh-reflector-material.mjs +278 -0
  71. package/esm2022/materials/lib/mesh-refraction-material.mjs +144 -0
  72. package/esm2022/materials/lib/mesh-transmission-material.mjs +188 -0
  73. package/esm2022/materials/lib/mesh-wobble-material.mjs +42 -0
  74. package/esm2022/materials/lib/point-material.mjs +33 -0
  75. package/esm2022/misc/index.mjs +14 -14
  76. package/esm2022/misc/lib/animations.mjs +71 -0
  77. package/esm2022/misc/lib/bake-shadows.mjs +26 -0
  78. package/esm2022/misc/lib/computed-attribute.mjs +55 -0
  79. package/esm2022/misc/lib/constants.mjs +5 -0
  80. package/esm2022/misc/lib/decal.mjs +139 -0
  81. package/esm2022/misc/lib/deprecated.mjs +15 -0
  82. package/esm2022/misc/lib/depth-buffer.mjs +39 -0
  83. package/esm2022/misc/lib/fbo.mjs +86 -0
  84. package/esm2022/misc/lib/html/html-content.mjs +327 -0
  85. package/esm2022/misc/lib/html/html.mjs +129 -0
  86. package/esm2022/misc/lib/html/utils.mjs +74 -0
  87. package/esm2022/misc/lib/intersect.mjs +52 -0
  88. package/esm2022/misc/lib/sampler.mjs +122 -0
  89. package/esm2022/misc/lib/scale-factor.mjs +29 -0
  90. package/esm2022/performances/index.mjs +7 -6
  91. package/esm2022/performances/lib/adaptive-dpr.mjs +52 -0
  92. package/esm2022/performances/lib/adaptive-events.mjs +28 -0
  93. package/esm2022/performances/lib/detailed.mjs +57 -0
  94. package/esm2022/performances/lib/instances/instances.mjs +183 -0
  95. package/esm2022/performances/lib/instances/position-mesh.mjs +51 -0
  96. package/esm2022/performances/lib/points/points.mjs +278 -0
  97. package/esm2022/performances/lib/points/position-point.mjs +53 -0
  98. package/esm2022/performances/lib/segments/segment-object.mjs +9 -0
  99. package/esm2022/performances/lib/segments/segments.mjs +129 -0
  100. package/esm2022/shaders/index.mjs +4 -18
  101. package/esm2022/shaders/lib/grid-material.mjs +81 -0
  102. package/esm2022/shaders/lib/mesh-refraction-material.mjs +163 -0
  103. package/esm2022/shaders/lib/point-material.mjs +24 -0
  104. package/esm2022/staging/index.mjs +20 -22
  105. package/esm2022/staging/lib/accumulative-shadows.mjs +182 -0
  106. package/esm2022/staging/lib/backdrop.mjs +73 -0
  107. package/esm2022/staging/lib/bb-anchor.mjs +58 -0
  108. package/esm2022/staging/lib/bounds.mjs +286 -0
  109. package/esm2022/staging/lib/camera-shake.mjs +69 -0
  110. package/esm2022/staging/lib/caustics.mjs +188 -0
  111. package/esm2022/staging/lib/center.mjs +118 -0
  112. package/esm2022/staging/lib/contact-shadows.mjs +214 -0
  113. package/esm2022/staging/lib/environment.mjs +481 -0
  114. package/esm2022/staging/lib/float.mjs +70 -0
  115. package/esm2022/staging/lib/lightformer.mjs +107 -0
  116. package/esm2022/staging/lib/mask.mjs +78 -0
  117. package/esm2022/staging/lib/matcap-texture.mjs +81 -0
  118. package/esm2022/staging/lib/normal-texture.mjs +81 -0
  119. package/esm2022/staging/lib/randomized-lights.mjs +104 -0
  120. package/esm2022/staging/lib/render-texture.mjs +203 -0
  121. package/esm2022/staging/lib/sky.mjs +86 -0
  122. package/esm2022/staging/lib/spot-light.mjs +453 -0
  123. package/esm2022/staging/lib/stage.mjs +236 -0
  124. package/esm2022/{utils/angular-three-soba-utils.mjs → stats/angular-three-soba-stats.mjs} +1 -1
  125. package/esm2022/stats/index.mjs +2 -0
  126. package/esm2022/stats/lib/stats.mjs +63 -0
  127. package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
  128. package/esm2022/vanilla-exports/index.mjs +3 -0
  129. package/fesm2022/angular-three-soba-abstractions.mjs +884 -697
  130. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  131. package/fesm2022/angular-three-soba-cameras.mjs +261 -308
  132. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  133. package/fesm2022/angular-three-soba-controls.mjs +1776 -109
  134. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  135. package/fesm2022/angular-three-soba-loaders.mjs +191 -145
  136. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  137. package/fesm2022/angular-three-soba-materials.mjs +527 -748
  138. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  139. package/fesm2022/angular-three-soba-misc.mjs +783 -1935
  140. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  141. package/fesm2022/angular-three-soba-performances.mjs +591 -475
  142. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  143. package/fesm2022/angular-three-soba-shaders.mjs +51 -1369
  144. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  145. package/fesm2022/angular-three-soba-staging.mjs +2421 -3521
  146. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  147. package/fesm2022/angular-three-soba-stats.mjs +70 -0
  148. package/fesm2022/angular-three-soba-stats.mjs.map +1 -0
  149. package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
  150. package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
  151. package/loaders/README.md +130 -2
  152. package/loaders/index.d.ts +5 -4
  153. package/loaders/lib/font-loader.d.ts +27 -0
  154. package/loaders/lib/gltf-loader.d.ts +24 -0
  155. package/loaders/lib/loader.d.ts +29 -0
  156. package/loaders/lib/progress.d.ts +9 -0
  157. package/loaders/lib/texture-loader.d.ts +13 -0
  158. package/materials/README.md +160 -2
  159. package/materials/index.d.ts +7 -6
  160. package/materials/lib/custom-shader-material.d.ts +20 -0
  161. package/materials/lib/mesh-distort-material.d.ts +17 -0
  162. package/materials/lib/mesh-reflector-material.d.ts +51 -0
  163. package/materials/lib/mesh-refraction-material.d.ts +42 -0
  164. package/materials/lib/mesh-transmission-material.d.ts +77 -0
  165. package/materials/lib/mesh-wobble-material.d.ts +15 -0
  166. package/materials/lib/point-material.d.ts +11 -0
  167. package/metadata.json +1 -1
  168. package/misc/README.md +217 -2
  169. package/misc/index.d.ts +13 -13
  170. package/misc/lib/animations.d.ts +17 -0
  171. package/misc/lib/computed-attribute.d.ts +64 -0
  172. package/misc/lib/constants.d.ts +1 -0
  173. package/misc/lib/decal.d.ts +27 -0
  174. package/misc/lib/deprecated.d.ts +14 -0
  175. package/misc/lib/depth-buffer.d.ts +8 -0
  176. package/misc/lib/fbo.d.ts +46 -0
  177. package/misc/lib/html/html-content.d.ts +47 -0
  178. package/misc/lib/html/html.d.ts +30 -0
  179. package/misc/lib/html/utils.d.ts +14 -0
  180. package/misc/lib/intersect.d.ts +13 -0
  181. package/misc/lib/sampler.d.ts +73 -0
  182. package/misc/lib/scale-factor.d.ts +3 -0
  183. package/package.json +90 -50
  184. package/performances/index.d.ts +6 -5
  185. package/performances/lib/adaptive-dpr.d.ts +7 -0
  186. package/performances/{adaptive-events → lib}/adaptive-events.d.ts +0 -3
  187. package/performances/lib/detailed.d.ts +17 -0
  188. package/performances/lib/instances/instances.d.ts +122 -0
  189. package/performances/lib/instances/position-mesh.d.ts +20 -0
  190. package/performances/lib/points/points.d.ts +224 -0
  191. package/performances/lib/points/position-point.d.ts +21 -0
  192. package/performances/lib/segments/segment-object.d.ts +17 -0
  193. package/performances/lib/segments/segments.d.ts +97 -0
  194. package/shaders/index.d.ts +3 -17
  195. package/shaders/lib/grid-material.d.ts +69 -0
  196. package/shaders/lib/mesh-refraction-material.d.ts +11 -0
  197. package/shaders/lib/point-material.d.ts +14 -0
  198. package/staging/README.md +473 -2
  199. package/staging/index.d.ts +19 -21
  200. package/staging/lib/accumulative-shadows.d.ts +75 -0
  201. package/staging/lib/backdrop.d.ts +22 -0
  202. package/staging/lib/bb-anchor.d.ts +17 -0
  203. package/staging/lib/bounds.d.ts +47 -0
  204. package/staging/lib/camera-shake.d.ts +29 -0
  205. package/staging/lib/caustics.d.ts +53 -0
  206. package/staging/lib/center.d.ts +390 -0
  207. package/staging/lib/contact-shadows.d.ts +55 -0
  208. package/staging/lib/environment.d.ts +132 -0
  209. package/staging/lib/float.d.ts +20 -0
  210. package/staging/lib/lightformer.d.ts +310 -0
  211. package/staging/lib/mask.d.ts +30 -0
  212. package/staging/lib/matcap-texture.d.ts +32 -0
  213. package/staging/lib/normal-texture.d.ts +37 -0
  214. package/staging/lib/randomized-lights.d.ts +54 -0
  215. package/staging/lib/render-texture.d.ts +64 -0
  216. package/staging/lib/sky.d.ts +32 -0
  217. package/staging/lib/spot-light.d.ts +119 -0
  218. package/staging/lib/stage.d.ts +352 -0
  219. package/stats/README.md +3 -0
  220. package/stats/index.d.ts +1 -0
  221. package/stats/lib/stats.d.ts +14 -0
  222. package/vanilla-exports/README.md +3 -0
  223. package/vanilla-exports/index.d.ts +27 -0
  224. package/web-types.json +1 -1
  225. package/abstractions/billboard/billboard.d.ts +0 -28
  226. package/abstractions/detailed/detailed.d.ts +0 -26
  227. package/abstractions/edges/edges.d.ts +0 -34
  228. package/abstractions/grid/grid.d.ts +0 -50
  229. package/abstractions/text/text.d.ts +0 -82
  230. package/abstractions/text-3d/text-3d.d.ts +0 -81
  231. package/assets/distort.vert.glsl +0 -1
  232. package/cameras/camera/camera-content.d.ts +0 -13
  233. package/cameras/camera/camera.d.ts +0 -26
  234. package/cameras/cube-camera/cube-camera.d.ts +0 -69
  235. package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
  236. package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
  237. package/controls/orbit-controls/orbit-controls.d.ts +0 -54
  238. package/esm2022/abstractions/billboard/billboard.mjs +0 -74
  239. package/esm2022/abstractions/detailed/detailed.mjs +0 -64
  240. package/esm2022/abstractions/edges/edges.mjs +0 -88
  241. package/esm2022/abstractions/grid/grid.mjs +0 -180
  242. package/esm2022/abstractions/text/text.mjs +0 -274
  243. package/esm2022/abstractions/text-3d/text-3d.mjs +0 -165
  244. package/esm2022/cameras/camera/camera-content.mjs +0 -20
  245. package/esm2022/cameras/camera/camera.mjs +0 -77
  246. package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
  247. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
  248. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
  249. package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -181
  250. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
  251. package/esm2022/loaders/loader/loader.mjs +0 -138
  252. package/esm2022/loaders/progress/progress.mjs +0 -45
  253. package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
  254. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
  255. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
  256. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
  257. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
  258. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  259. package/esm2022/materials/point-material/point-material.mjs +0 -46
  260. package/esm2022/misc/animations/animations.mjs +0 -59
  261. package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
  262. package/esm2022/misc/caustics/caustics.mjs +0 -387
  263. package/esm2022/misc/decal/decal.mjs +0 -187
  264. package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
  265. package/esm2022/misc/example/example.mjs +0 -160
  266. package/esm2022/misc/fbo/fbo.mjs +0 -47
  267. package/esm2022/misc/html/html-wrapper.mjs +0 -478
  268. package/esm2022/misc/html/html.mjs +0 -304
  269. package/esm2022/misc/sampler/sampler.mjs +0 -142
  270. package/esm2022/misc/shadow/shadow.mjs +0 -111
  271. package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
  272. package/esm2022/misc/trail/trail.mjs +0 -209
  273. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
  274. package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
  275. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
  276. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
  277. package/esm2022/modifiers/index.mjs +0 -2
  278. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
  279. package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
  280. package/esm2022/performances/points/points-input.mjs +0 -64
  281. package/esm2022/performances/points/points.mjs +0 -329
  282. package/esm2022/performances/points/position-point.mjs +0 -54
  283. package/esm2022/performances/segments/segment-object.mjs +0 -9
  284. package/esm2022/performances/segments/segments.mjs +0 -182
  285. package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
  286. package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
  287. package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
  288. package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
  289. package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
  290. package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
  291. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
  292. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  293. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
  294. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  295. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  296. package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
  297. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
  298. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
  299. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
  300. package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
  301. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
  302. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
  303. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
  304. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
  305. package/esm2022/staging/backdrop/backdrop.mjs +0 -77
  306. package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -70
  307. package/esm2022/staging/bounds/bounds.mjs +0 -308
  308. package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
  309. package/esm2022/staging/center/center.mjs +0 -163
  310. package/esm2022/staging/cloud/cloud.mjs +0 -158
  311. package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
  312. package/esm2022/staging/environment/assets.mjs +0 -13
  313. package/esm2022/staging/environment/environment-cube.mjs +0 -47
  314. package/esm2022/staging/environment/environment-ground.mjs +0 -41
  315. package/esm2022/staging/environment/environment-input.mjs +0 -119
  316. package/esm2022/staging/environment/environment-map.mjs +0 -53
  317. package/esm2022/staging/environment/environment-portal.mjs +0 -113
  318. package/esm2022/staging/environment/environment.mjs +0 -61
  319. package/esm2022/staging/environment/utils.mjs +0 -105
  320. package/esm2022/staging/float/float.mjs +0 -94
  321. package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
  322. package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
  323. package/esm2022/staging/sky/sky.mjs +0 -119
  324. package/esm2022/staging/sparkles/sparkles.mjs +0 -164
  325. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
  326. package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
  327. package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
  328. package/esm2022/staging/spot-light/spot-light.mjs +0 -81
  329. package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
  330. package/esm2022/staging/stage/stage.mjs +0 -388
  331. package/esm2022/staging/stars/stars.mjs +0 -147
  332. package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
  333. package/esm2022/staging/wireframe/wireframe.mjs +0 -224
  334. package/esm2022/utils/content/content.mjs +0 -15
  335. package/esm2022/utils/index.mjs +0 -2
  336. package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
  337. package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
  338. package/fesm2022/angular-three-soba-utils.mjs +0 -22
  339. package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
  340. package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
  341. package/loaders/loader/loader.d.ts +0 -33
  342. package/loaders/progress/progress.d.ts +0 -9
  343. package/loaders/texture-loader/texture-loader.d.ts +0 -7
  344. package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
  345. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
  346. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
  347. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
  348. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
  349. package/materials/point-material/point-material.d.ts +0 -24
  350. package/misc/animations/animations.d.ts +0 -15
  351. package/misc/caustics/caustics.d.ts +0 -87
  352. package/misc/decal/decal.d.ts +0 -49
  353. package/misc/depth-buffer/depth-buffer.d.ts +0 -9
  354. package/misc/example/example.d.ts +0 -81
  355. package/misc/fbo/fbo.d.ts +0 -17
  356. package/misc/html/html-wrapper.d.ts +0 -559
  357. package/misc/html/html.d.ts +0 -214
  358. package/misc/sampler/sampler.d.ts +0 -67
  359. package/misc/shadow/shadow.d.ts +0 -37
  360. package/misc/stats-gl/stats-gl.d.ts +0 -24
  361. package/misc/trail/trail.d.ts +0 -57
  362. package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
  363. package/misc/trail-texture/trail-texture.d.ts +0 -50
  364. package/modifiers/README.md +0 -3
  365. package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
  366. package/modifiers/index.d.ts +0 -1
  367. package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
  368. package/performances/points/points-input.d.ts +0 -32
  369. package/performances/points/points.d.ts +0 -92
  370. package/performances/points/position-point.d.ts +0 -11
  371. package/performances/segments/segment-object.d.ts +0 -7
  372. package/performances/segments/segments.d.ts +0 -124
  373. package/shaders/blur-pass/blur-pass.d.ts +0 -23
  374. package/shaders/caustics/caustics-material.d.ts +0 -4
  375. package/shaders/caustics/caustics-projection-material.d.ts +0 -4
  376. package/shaders/convolution-material/convolution-material.d.ts +0 -7
  377. package/shaders/discard-material/discard-material.d.ts +0 -3
  378. package/shaders/grid-material/grid-material.d.ts +0 -37
  379. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
  380. package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
  381. package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
  382. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
  383. package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
  384. package/shaders/shader-material/shader-material.d.ts +0 -6
  385. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
  386. package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
  387. package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
  388. package/shaders/star-field-material/star-field-material.d.ts +0 -13
  389. package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
  390. package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
  391. package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
  392. package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
  393. package/staging/backdrop/backdrop.d.ts +0 -30
  394. package/staging/bb-anchor/bb-anchor.d.ts +0 -27
  395. package/staging/bounds/bounds.d.ts +0 -134
  396. package/staging/camera-shake/camera-shake.d.ts +0 -43
  397. package/staging/center/center.d.ts +0 -70
  398. package/staging/cloud/cloud.d.ts +0 -51
  399. package/staging/contact-shadows/contact-shadows.d.ts +0 -70
  400. package/staging/environment/assets.d.ts +0 -13
  401. package/staging/environment/environment-cube.d.ts +0 -15
  402. package/staging/environment/environment-ground.d.ts +0 -13
  403. package/staging/environment/environment-input.d.ts +0 -68
  404. package/staging/environment/environment-map.d.ts +0 -16
  405. package/staging/environment/environment-portal.d.ts +0 -18
  406. package/staging/environment/environment.d.ts +0 -8
  407. package/staging/environment/utils.d.ts +0 -7
  408. package/staging/float/float.d.ts +0 -31
  409. package/staging/matcap-texture/matcap-texture.d.ts +0 -13
  410. package/staging/normal-texture/normal-texture.d.ts +0 -16
  411. package/staging/sky/sky.d.ts +0 -48
  412. package/staging/sparkles/sparkles.d.ts +0 -63
  413. package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
  414. package/staging/spot-light/shadow-mesh.d.ts +0 -37
  415. package/staging/spot-light/spot-light-input.d.ts +0 -38
  416. package/staging/spot-light/spot-light.d.ts +0 -39
  417. package/staging/spot-light/volumetric-mesh.d.ts +0 -24
  418. package/staging/stage/stage.d.ts +0 -130
  419. package/staging/stars/stars.d.ts +0 -45
  420. package/staging/wireframe/wireframe-input.d.ts +0 -65
  421. package/staging/wireframe/wireframe.d.ts +0 -28
  422. package/utils/README.md +0 -3
  423. package/utils/content/content.d.ts +0 -8
  424. package/utils/index.d.ts +0 -1
  425. /package/misc/{bake-shadows → lib}/bake-shadows.d.ts +0 -0
@@ -1,308 +0,0 @@
1
- import { CUSTOM_ELEMENTS_SCHEMA, Component, EventEmitter, Input, Output, computed, effect, forwardRef, untracked, } from '@angular/core';
2
- import { createInjectionToken, extend, injectBeforeRender, injectNgtRef, injectNgtStore, is, signalStore, } from 'angular-three';
3
- import * as THREE from 'three';
4
- import { Group } from 'three';
5
- import * as i0 from "@angular/core";
6
- extend({ Group });
7
- const isBox3 = (def) => def && def.isBox3;
8
- function equals(a, b, eps) {
9
- return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps && Math.abs(a.z - b.z) < eps;
10
- }
11
- function damp(v, t, lambda, delta) {
12
- v.x = THREE.MathUtils.damp(v.x, t.x, lambda, delta);
13
- v.y = THREE.MathUtils.damp(v.y, t.y, lambda, delta);
14
- v.z = THREE.MathUtils.damp(v.z, t.z, lambda, delta);
15
- }
16
- export const [injectNgtsBoundsApi, provideNgtsBoundsApi] = createInjectionToken((bounds) => bounds.api, {
17
- isRoot: false,
18
- deps: [forwardRef(() => NgtsBounds)],
19
- });
20
- export class NgtsBounds {
21
- set _damping(damping) {
22
- this.inputs.set({ damping });
23
- }
24
- set _fit(fit) {
25
- this.inputs.set({ fit });
26
- }
27
- set _clip(clip) {
28
- this.inputs.set({ clip });
29
- }
30
- set _observe(observe) {
31
- this.inputs.set({ observe });
32
- }
33
- set _margin(margin) {
34
- this.inputs.set({ margin });
35
- }
36
- set _eps(eps) {
37
- this.inputs.set({ eps });
38
- }
39
- constructor() {
40
- this.inputs = signalStore({
41
- damping: 6,
42
- fit: false,
43
- clip: false,
44
- observe: false,
45
- margin: 1.2,
46
- eps: 0.01,
47
- });
48
- this.boundsRef = injectNgtRef();
49
- this.fitted = new EventEmitter();
50
- this.store = injectNgtStore();
51
- this.controls = this.store.select('controls');
52
- this.size = this.store.select('size');
53
- this.camera = this.store.select('camera');
54
- this.invalidate = this.store.select('invalidate');
55
- this.fit = this.inputs.select('fit');
56
- this.clip = this.inputs.select('clip');
57
- this.observe = this.inputs.select('observe');
58
- this.margin = this.inputs.select('margin');
59
- this.damping = this.inputs.select('damping');
60
- this.current = { animating: false, focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
61
- this.goal = { focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
62
- this.box = new THREE.Box3();
63
- this.api = computed(() => {
64
- const { box, boundsRef, current, goal, fitted } = this;
65
- const [camera, margin, controls, invalidate, damping] = [
66
- this.camera(),
67
- this.margin(),
68
- this.controls(),
69
- this.invalidate(),
70
- this.damping(),
71
- ];
72
- function getSize() {
73
- const size = box.getSize(new THREE.Vector3());
74
- const center = box.getCenter(new THREE.Vector3());
75
- const maxSize = Math.max(size.x, size.y, size.z);
76
- const fitHeightDistance = is.orthographicCamera(camera)
77
- ? maxSize * 4
78
- : maxSize / (2 * Math.atan((Math.PI * camera.fov) / 360));
79
- const fitWidthDistance = is.orthographicCamera(camera) ? maxSize * 4 : fitHeightDistance / camera.aspect;
80
- const distance = margin * Math.max(fitHeightDistance, fitWidthDistance);
81
- return { box, size, center, distance };
82
- }
83
- return {
84
- getSize,
85
- refresh(object) {
86
- if (isBox3(object))
87
- box.copy(object);
88
- else {
89
- const target = object || boundsRef.nativeElement;
90
- if (!target)
91
- return this;
92
- target.updateWorldMatrix(true, true);
93
- box.setFromObject(target);
94
- }
95
- if (box.isEmpty()) {
96
- const max = camera.position.length() || 10;
97
- box.setFromCenterAndSize(new THREE.Vector3(), new THREE.Vector3(max, max, max));
98
- }
99
- if (controls?.constructor.name === 'OrthographicTrackballControls') {
100
- // Put camera on a sphere along which it should move
101
- const { distance } = getSize();
102
- const direction = camera.position.clone().sub(controls.target).normalize().multiplyScalar(distance);
103
- const newPos = controls.target.clone().add(direction);
104
- camera.position.copy(newPos);
105
- }
106
- return this;
107
- },
108
- clip() {
109
- const { distance } = getSize();
110
- if (controls)
111
- controls.maxDistance = distance * 10;
112
- camera.near = distance / 100;
113
- camera.far = distance * 100;
114
- camera.updateProjectionMatrix();
115
- if (controls)
116
- controls.update();
117
- invalidate();
118
- return this;
119
- },
120
- to({ position, target }) {
121
- current.camera.copy(camera.position);
122
- const { center } = getSize();
123
- goal.camera.set(...position);
124
- if (target) {
125
- goal.focus.set(...target);
126
- }
127
- else {
128
- goal.focus.copy(center);
129
- }
130
- if (damping) {
131
- current.animating = true;
132
- }
133
- else {
134
- camera.position.set(...position);
135
- }
136
- return this;
137
- },
138
- fit() {
139
- current.camera.copy(camera.position);
140
- if (controls)
141
- current.focus.copy(controls.target);
142
- const { center, distance } = getSize();
143
- const direction = center.clone().sub(camera.position).normalize().multiplyScalar(distance);
144
- goal.camera.copy(center).sub(direction);
145
- goal.focus.copy(center);
146
- if (is.orthographicCamera(camera)) {
147
- current.zoom = camera.zoom;
148
- let maxHeight = 0, maxWidth = 0;
149
- const vertices = [
150
- new THREE.Vector3(box.min.x, box.min.y, box.min.z),
151
- new THREE.Vector3(box.min.x, box.max.y, box.min.z),
152
- new THREE.Vector3(box.min.x, box.min.y, box.max.z),
153
- new THREE.Vector3(box.min.x, box.max.y, box.max.z),
154
- new THREE.Vector3(box.max.x, box.max.y, box.max.z),
155
- new THREE.Vector3(box.max.x, box.max.y, box.min.z),
156
- new THREE.Vector3(box.max.x, box.min.y, box.max.z),
157
- new THREE.Vector3(box.max.x, box.min.y, box.min.z),
158
- ];
159
- // Transform the center and each corner to camera space
160
- center.applyMatrix4(camera.matrixWorldInverse);
161
- for (const v of vertices) {
162
- v.applyMatrix4(camera.matrixWorldInverse);
163
- maxHeight = Math.max(maxHeight, Math.abs(v.y - center.y));
164
- maxWidth = Math.max(maxWidth, Math.abs(v.x - center.x));
165
- }
166
- maxHeight *= 2;
167
- maxWidth *= 2;
168
- const zoomForHeight = (camera.top - camera.bottom) / maxHeight;
169
- const zoomForWidth = (camera.right - camera.left) / maxWidth;
170
- goal.zoom = Math.min(zoomForHeight, zoomForWidth) / margin;
171
- if (!damping) {
172
- camera.zoom = goal.zoom;
173
- camera.updateProjectionMatrix();
174
- }
175
- }
176
- if (damping) {
177
- current.animating = true;
178
- }
179
- else {
180
- camera.position.copy(goal.camera);
181
- camera.lookAt(goal.focus);
182
- if (controls) {
183
- controls.target.copy(goal.focus);
184
- controls.update();
185
- }
186
- }
187
- if (fitted.observed) {
188
- fitted.emit(this.getSize());
189
- }
190
- invalidate();
191
- return this;
192
- },
193
- };
194
- });
195
- this.preventDragHijacking();
196
- this.scalePointer();
197
- this.beforeRender();
198
- }
199
- preventDragHijacking() {
200
- effect((onCleanup) => {
201
- const controls = this.controls();
202
- if (controls) {
203
- const callback = () => (this.current.animating = false);
204
- controls.addEventListener('start', callback);
205
- onCleanup(() => controls.removeEventListener('start', callback));
206
- }
207
- });
208
- }
209
- scalePointer() {
210
- let count = 0;
211
- effect(() => {
212
- const [observe, fit, clip, api] = [
213
- this.observe(),
214
- this.fit(),
215
- this.clip(),
216
- untracked(this.api),
217
- this.camera(),
218
- this.controls(),
219
- this.size(),
220
- ];
221
- if (observe || count++ === 0) {
222
- api.refresh();
223
- if (fit)
224
- api.fit();
225
- if (clip)
226
- api.clip();
227
- }
228
- });
229
- }
230
- beforeRender() {
231
- injectBeforeRender(({ delta }) => {
232
- const [{ damping, eps }, camera, controls, invalidate] = [
233
- this.inputs.get(),
234
- this.camera(),
235
- this.controls(),
236
- this.invalidate(),
237
- ];
238
- if (this.current.animating) {
239
- damp(this.current.focus, this.goal.focus, damping, delta);
240
- damp(this.current.camera, this.goal.camera, damping, delta);
241
- this.current.zoom = THREE.MathUtils.damp(this.current.zoom, this.goal.zoom, damping, delta);
242
- camera.position.copy(this.current.camera);
243
- if (is.orthographicCamera(camera)) {
244
- camera.zoom = this.current.zoom;
245
- camera.updateProjectionMatrix();
246
- }
247
- if (!controls) {
248
- camera.lookAt(this.current.focus);
249
- }
250
- else {
251
- controls.target.copy(this.current.focus);
252
- controls.update();
253
- }
254
- invalidate();
255
- if (is.orthographicCamera(camera) && !(Math.abs(this.current.zoom - this.goal.zoom) < eps))
256
- return;
257
- if (!is.orthographicCamera(camera) && !equals(this.current.camera, this.goal.camera, eps))
258
- return;
259
- if (controls && !equals(this.current.focus, this.goal.focus, eps))
260
- return;
261
- this.current.animating = false;
262
- }
263
- });
264
- }
265
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
266
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { boundsRef: "boundsRef", _damping: ["damping", "_damping"], _fit: ["fit", "_fit"], _clip: ["clip", "_clip"], _observe: ["observe", "_observe"], _margin: ["margin", "_margin"], _eps: ["eps", "_eps"] }, outputs: { fitted: "fitted" }, providers: [provideNgtsBoundsApi()], ngImport: i0, template: `
267
- <ngt-group [ref]="boundsRef">
268
- <ng-content />
269
- </ngt-group>
270
- `, isInline: true }); }
271
- }
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsBounds, decorators: [{
273
- type: Component,
274
- args: [{
275
- selector: 'ngts-bounds',
276
- standalone: true,
277
- template: `
278
- <ngt-group [ref]="boundsRef">
279
- <ng-content />
280
- </ngt-group>
281
- `,
282
- providers: [provideNgtsBoundsApi()],
283
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
284
- }]
285
- }], ctorParameters: function () { return []; }, propDecorators: { boundsRef: [{
286
- type: Input
287
- }], _damping: [{
288
- type: Input,
289
- args: [{ alias: 'damping' }]
290
- }], _fit: [{
291
- type: Input,
292
- args: [{ alias: 'fit' }]
293
- }], _clip: [{
294
- type: Input,
295
- args: [{ alias: 'clip' }]
296
- }], _observe: [{
297
- type: Input,
298
- args: [{ alias: 'observe' }]
299
- }], _margin: [{
300
- type: Input,
301
- args: [{ alias: 'margin' }]
302
- }], _eps: [{
303
- type: Input,
304
- args: [{ alias: 'eps' }]
305
- }], fitted: [{
306
- type: Output
307
- }] } });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osY0FBYyxFQUNkLEVBQUUsRUFDRixXQUFXLEdBRVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFFOUIsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQWlCbEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFRLEVBQXFCLEVBQUUsQ0FBQyxHQUFHLElBQUssR0FBa0IsQ0FBQyxNQUFNLENBQUM7QUFFbEYsU0FBUyxNQUFNLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLEdBQVc7SUFDOUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM1RixDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsQ0FBZ0IsRUFBRSxDQUFn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QUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUMvQjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0F6UVcsVUFBVTtrR0FBVixVQUFVLDJTQUhYLENBQUMsb0JBQW9CLEVBQUUsQ0FBQywwQkFMekI7Ozs7RUFJVDs7MkZBSVcsVUFBVTtrQkFYdEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7OztFQUlUO29CQUNELFNBQVMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNqQzswRUFXUyxTQUFTO3NCQUFqQixLQUFLO2dCQUUyQixRQUFRO3NCQUF4QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFJRSxJQUFJO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtnQkFJTyxLQUFLO3NCQUFsQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFJUyxRQUFRO3NCQUF4QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFJSyxPQUFPO3NCQUF0QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFJRyxJQUFJO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtnQkFJYixNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRDb21wb25lbnQsXG5cdEV2ZW50RW1pdHRlcixcblx0SW5wdXQsXG5cdE91dHB1dCxcblx0U2lnbmFsLFxuXHRjb21wdXRlZCxcblx0ZWZmZWN0LFxuXHRmb3J3YXJkUmVmLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Y3JlYXRlSW5qZWN0aW9uVG9rZW4sXG5cdGV4dGVuZCxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3ROZ3RSZWYsXG5cdGluamVjdE5ndFN0b3JlLFxuXHRpcyxcblx0c2lnbmFsU3RvcmUsXG5cdHR5cGUgTmd0R3JvdXAsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5leHBvcnQgdHlwZSBOZ3RzQm91bmRzU2l6ZSA9IHtcblx0Ym94OiBUSFJFRS5Cb3gzO1xuXHRzaXplOiBUSFJFRS5WZWN0b3IzO1xuXHRjZW50ZXI6IFRIUkVFLlZlY3RvcjM7XG5cdGRpc3RhbmNlOiBudW1iZXI7XG59O1xuXG50eXBlIENvbnRyb2xzUHJvdG8gPSB7XG5cdHVwZGF0ZSgpOiB2b2lkO1xuXHR0YXJnZXQ6IFRIUkVFLlZlY3RvcjM7XG5cdG1heERpc3RhbmNlOiBudW1iZXI7XG5cdGFkZEV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBpc0JveDMgPSAoZGVmOiBhbnkpOiBkZWYgaXMgVEhSRUUuQm94MyA9PiBkZWYgJiYgKGRlZiBhcyBUSFJFRS5Cb3gzKS5pc0JveDM7XG5cbmZ1bmN0aW9uIGVxdWFscyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBlcHM6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5hYnMoYS54IC0gYi54KSA8IGVwcyAmJiBNYXRoLmFicyhhLnkgLSBiLnkpIDwgZXBzICYmIE1hdGguYWJzKGEueiAtIGIueikgPCBlcHM7XG59XG5cbmZ1bmN0aW9uIGRhbXAodjogVEhSRUUuVmVjdG9yMywgdDogVEhSRUUuVmVjdG9yMywgbGFtYmRhOiBudW1iZXIsIGRlbHRhOiBudW1iZXIpIHtcblx0di54ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi54LCB0LngsIGxhbWJkYSwgZGVsdGEpO1xuXHR2LnkgPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LnksIHQueSwgbGFtYmRhLCBkZWx0YSk7XG5cdHYueiA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueiwgdC56LCBsYW1iZGEsIGRlbHRhKTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0c0JvdW5kc1N0YXRlID0ge1xuXHRkYW1waW5nOiBudW1iZXI7XG5cdGZpdDogYm9vbGVhbjtcblx0Y2xpcDogYm9vbGVhbjtcblx0b2JzZXJ2ZTogYm9vbGVhbjtcblx0bWFyZ2luOiBudW1iZXI7XG5cdGVwczogbnVtYmVyO1xufTtcblxuZGVjbGFyZSBnbG9iYWwge1xuXHRpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcblx0XHQvKipcblx0XHQgKiBAZXh0ZW5kcyBuZ3QtZ3JvdXBcblx0XHQgKi9cblx0XHQnbmd0cy1ib3VuZHMnOiBOZ3RzQm91bmRzU3RhdGUgJiBOZ3RHcm91cDtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgW2luamVjdE5ndHNCb3VuZHNBcGksIHByb3ZpZGVOZ3RzQm91bmRzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKChib3VuZHM6IE5ndHNCb3VuZHMpID0+IGJvdW5kcy5hcGksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gTmd0c0JvdW5kcyldLFxufSk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwIFtyZWZdPVwiYm91bmRzUmVmXCI+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlTmd0c0JvdW5kc0FwaSgpXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQm91bmRzIHtcblx0cHJpdmF0ZSBpbnB1dHMgPSBzaWduYWxTdG9yZTxOZ3RzQm91bmRzU3RhdGU+KHtcblx0XHRkYW1waW5nOiA2LFxuXHRcdGZpdDogZmFsc2UsXG5cdFx0Y2xpcDogZmFsc2UsXG5cdFx0b2JzZXJ2ZTogZmFsc2UsXG5cdFx0bWFyZ2luOiAxLjIsXG5cdFx0ZXBzOiAwLjAxLFxuXHR9KTtcblxuXHRASW5wdXQoKSBib3VuZHNSZWYgPSBpbmplY3ROZ3RSZWY8R3JvdXA+KCk7XG5cblx0QElucHV0KHsgYWxpYXM6ICdkYW1waW5nJyB9KSBzZXQgX2RhbXBpbmcoZGFtcGluZzogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGFtcGluZyB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZml0JyB9KSBzZXQgX2ZpdChmaXQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBmaXQgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2NsaXAnIH0pIHNldCBfY2xpcChjbGlwOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgY2xpcCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnb2JzZXJ2ZScgfSkgc2V0IF9vYnNlcnZlKG9ic2VydmU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBvYnNlcnZlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdtYXJnaW4nIH0pIHNldCBfbWFyZ2luKG1hcmdpbjogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgbWFyZ2luIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdlcHMnIH0pIHNldCBfZXBzKGVwczogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZXBzIH0pO1xuXHR9XG5cblx0QE91dHB1dCgpIGZpdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd0c0JvdW5kc1NpemU+KCk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0cHJpdmF0ZSBmaXQgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2ZpdCcpO1xuXHRwcml2YXRlIGNsaXAgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2NsaXAnKTtcblx0cHJpdmF0ZSBvYnNlcnZlID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdvYnNlcnZlJyk7XG5cdHByaXZhdGUgbWFyZ2luID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdtYXJnaW4nKTtcblx0cHJpdmF0ZSBkYW1waW5nID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdkYW1waW5nJyk7XG5cblx0cHJpdmF0ZSBjdXJyZW50ID0geyBhbmltYXRpbmc6IGZhbHNlLCBmb2N1czogbmV3IFRIUkVFLlZlY3RvcjMoKSwgY2FtZXJhOiBuZXcgVEhSRUUuVmVjdG9yMygpLCB6b29tOiAxIH07XG5cdHByaXZhdGUgZ29hbCA9IHsgZm9jdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksIGNhbWVyYTogbmV3IFRIUkVFLlZlY3RvcjMoKSwgem9vbTogMSB9O1xuXHRwcml2YXRlIGJveCA9IG5ldyBUSFJFRS5Cb3gzKCk7XG5cblx0YXBpID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHsgYm94LCBib3VuZHNSZWYsIGN1cnJlbnQsIGdvYWwsIGZpdHRlZCB9ID0gdGhpcztcblx0XHRjb25zdCBbY2FtZXJhLCBtYXJnaW4sIGNvbnRyb2xzLCBpbnZhbGlkYXRlLCBkYW1waW5nXSA9IFtcblx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHR0aGlzLm1hcmdpbigpLFxuXHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHR0aGlzLmRhbXBpbmcoKSxcblx0XHRdO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0U2l6ZSgpIHtcblx0XHRcdGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcblx0XHRcdGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG5cdFx0XHRjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoc2l6ZS54LCBzaXplLnksIHNpemUueik7XG5cdFx0XHRjb25zdCBmaXRIZWlnaHREaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpXG5cdFx0XHRcdD8gbWF4U2l6ZSAqIDRcblx0XHRcdFx0OiBtYXhTaXplIC8gKDIgKiBNYXRoLmF0YW4oKE1hdGguUEkgKiBjYW1lcmEuZm92KSAvIDM2MCkpO1xuXHRcdFx0Y29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IG1hcmdpbiAqIE1hdGgubWF4KGZpdEhlaWdodERpc3RhbmNlLCBmaXRXaWR0aERpc3RhbmNlKTtcblx0XHRcdHJldHVybiB7IGJveCwgc2l6ZSwgY2VudGVyLCBkaXN0YW5jZSB9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRnZXRTaXplLFxuXHRcdFx0cmVmcmVzaChvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCB8IFRIUkVFLkJveDMpIHtcblx0XHRcdFx0aWYgKGlzQm94MyhvYmplY3QpKSBib3guY29weShvYmplY3QpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXQgPSBvYmplY3QgfHwgYm91bmRzUmVmLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKCF0YXJnZXQpIHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcblx0XHRcdFx0XHRib3guc2V0RnJvbU9iamVjdCh0YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChib3guaXNFbXB0eSgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWF4ID0gY2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpIHx8IDEwO1xuXHRcdFx0XHRcdGJveC5zZXRGcm9tQ2VudGVyQW5kU2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpLCBuZXcgVEhSRUUuVmVjdG9yMyhtYXgsIG1heCwgbWF4KSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29udHJvbHM/LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPcnRob2dyYXBoaWNUcmFja2JhbGxDb250cm9scycpIHtcblx0XHRcdFx0XHQvLyBQdXQgY2FtZXJhIG9uIGEgc3BoZXJlIGFsb25nIHdoaWNoIGl0IHNob3VsZCBtb3ZlXG5cdFx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yihjb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdQb3MgPSBjb250cm9scy50YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uKTtcblx0XHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weShuZXdQb3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Y2xpcCgpIHtcblx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLm1heERpc3RhbmNlID0gZGlzdGFuY2UgKiAxMDtcblx0XHRcdFx0Y2FtZXJhLm5lYXIgPSBkaXN0YW5jZSAvIDEwMDtcblx0XHRcdFx0Y2FtZXJhLmZhciA9IGRpc3RhbmNlICogMTAwO1xuXHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdHRvKHsgcG9zaXRpb24sIHRhcmdldCB9OiB7IHBvc2l0aW9uOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IHRhcmdldD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9KSB7XG5cdFx0XHRcdGN1cnJlbnQuY2FtZXJhLmNvcHkoY2FtZXJhLnBvc2l0aW9uKTtcblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIgfSA9IGdldFNpemUoKTtcblx0XHRcdFx0Z29hbC5jYW1lcmEuc2V0KC4uLnBvc2l0aW9uKTtcblxuXHRcdFx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRcdFx0Z29hbC5mb2N1cy5zZXQoLi4udGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnb2FsLmZvY3VzLmNvcHkoY2VudGVyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYW1waW5nKSB7XG5cdFx0XHRcdFx0Y3VycmVudC5hbmltYXRpbmcgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5zZXQoLi4ucG9zaXRpb24pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Zml0KCkge1xuXHRcdFx0XHRjdXJyZW50LmNhbWVyYS5jb3B5KGNhbWVyYS5wb3NpdGlvbik7XG5cdFx0XHRcdGlmIChjb250cm9scykgY3VycmVudC5mb2N1cy5jb3B5KGNvbnRyb2xzLnRhcmdldCk7XG5cblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIsIGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG5cdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNlbnRlci5jbG9uZSgpLnN1YihjYW1lcmEucG9zaXRpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblxuXHRcdFx0XHRnb2FsLmNhbWVyYS5jb3B5KGNlbnRlcikuc3ViKGRpcmVjdGlvbik7XG5cdFx0XHRcdGdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuXG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSkge1xuXHRcdFx0XHRcdGN1cnJlbnQuem9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdFx0bGV0IG1heEhlaWdodCA9IDAsXG5cdFx0XHRcdFx0XHRtYXhXaWR0aCA9IDA7XG5cdFx0XHRcdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5taW4ueSwgYm94Lm1pbi56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1heC55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWluLnksIGJveC5tYXgueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5tYXgueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1heC55LCBib3gubWF4LnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWF4LnksIGJveC5taW4ueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5taW4ueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1pbi55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0Ly8gVHJhbnNmb3JtIHRoZSBjZW50ZXIgYW5kIGVhY2ggY29ybmVyIHRvIGNhbWVyYSBzcGFjZVxuXHRcdFx0XHRcdGNlbnRlci5hcHBseU1hdHJpeDQoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHZlcnRpY2VzKSB7XG5cdFx0XHRcdFx0XHR2LmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHRcdFx0XHRcdG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgTWF0aC5hYnModi55IC0gY2VudGVyLnkpKTtcblx0XHRcdFx0XHRcdG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIE1hdGguYWJzKHYueCAtIGNlbnRlci54KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1heEhlaWdodCAqPSAyO1xuXHRcdFx0XHRcdG1heFdpZHRoICo9IDI7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvckhlaWdodCA9IChjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyBtYXhIZWlnaHQ7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvcldpZHRoID0gKGNhbWVyYS5yaWdodCAtIGNhbWVyYS5sZWZ0KSAvIG1heFdpZHRoO1xuXHRcdFx0XHRcdGdvYWwuem9vbSA9IE1hdGgubWluKHpvb21Gb3JIZWlnaHQsIHpvb21Gb3JXaWR0aCkgLyBtYXJnaW47XG5cdFx0XHRcdFx0aWYgKCFkYW1waW5nKSB7XG5cdFx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IGdvYWwuem9vbTtcblx0XHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhbXBpbmcpIHtcblx0XHRcdFx0XHRjdXJyZW50LmFuaW1hdGluZyA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2FtZXJhLnBvc2l0aW9uLmNvcHkoZ29hbC5jYW1lcmEpO1xuXHRcdFx0XHRcdGNhbWVyYS5sb29rQXQoZ29hbC5mb2N1cyk7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weShnb2FsLmZvY3VzKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaXR0ZWQub2JzZXJ2ZWQpIHtcblx0XHRcdFx0XHRmaXR0ZWQuZW1pdCh0aGlzLmdldFNpemUoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0fTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5wcmV2ZW50RHJhZ0hpamFja2luZygpO1xuXHRcdHRoaXMuc2NhbGVQb2ludGVyKCk7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgcHJldmVudERyYWdIaWphY2tpbmcoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGNvbnRyb2xzID0gdGhpcy5jb250cm9scygpO1xuXHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gKHRoaXMuY3VycmVudC5hbmltYXRpbmcgPSBmYWxzZSk7XG5cdFx0XHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgY2FsbGJhY2spO1xuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4gY29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBjYWxsYmFjaykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzY2FsZVBvaW50ZXIoKSB7XG5cdFx0bGV0IGNvdW50ID0gMDtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW29ic2VydmUsIGZpdCwgY2xpcCwgYXBpXSA9IFtcblx0XHRcdFx0dGhpcy5vYnNlcnZlKCksXG5cdFx0XHRcdHRoaXMuZml0KCksXG5cdFx0XHRcdHRoaXMuY2xpcCgpLFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy5hcGkpLFxuXHRcdFx0XHR0aGlzLmNhbWVyYSgpLFxuXHRcdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKG9ic2VydmUgfHwgY291bnQrKyA9PT0gMCkge1xuXHRcdFx0XHRhcGkucmVmcmVzaCgpO1xuXHRcdFx0XHRpZiAoZml0KSBhcGkuZml0KCk7XG5cdFx0XHRcdGlmIChjbGlwKSBhcGkuY2xpcCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdGNvbnN0IFt7IGRhbXBpbmcsIGVwcyB9LCBjYW1lcmEsIGNvbnRyb2xzLCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdFx0dGhpcy5pbnB1dHMuZ2V0KCksXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuY29udHJvbHMoKSxcblx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50LmFuaW1hdGluZykge1xuXHRcdFx0XHRkYW1wKHRoaXMuY3VycmVudC5mb2N1cywgdGhpcy5nb2FsLmZvY3VzLCBkYW1waW5nLCBkZWx0YSk7XG5cdFx0XHRcdGRhbXAodGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuem9vbSA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHRoaXMuY3VycmVudC56b29tLCB0aGlzLmdvYWwuem9vbSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLmN1cnJlbnQuY2FtZXJhKTtcblxuXHRcdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IHRoaXMuY3VycmVudC56b29tO1xuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0Y2FtZXJhLmxvb2tBdCh0aGlzLmN1cnJlbnQuZm9jdXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRyb2xzLnRhcmdldC5jb3B5KHRoaXMuY3VycmVudC5mb2N1cyk7XG5cdFx0XHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAhKE1hdGguYWJzKHRoaXMuY3VycmVudC56b29tIC0gdGhpcy5nb2FsLnpvb20pIDwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICFlcXVhbHModGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoY29udHJvbHMgJiYgIWVxdWFscyh0aGlzLmN1cnJlbnQuZm9jdXMsIHRoaXMuZ29hbC5mb2N1cywgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
@@ -1,123 +0,0 @@
1
- import { Directive, Input, computed, effect } from '@angular/core';
2
- import { injectBeforeRender, injectNgtStore, signalStore } from 'angular-three';
3
- import { SimplexNoise } from 'three-stdlib';
4
- import * as i0 from "@angular/core";
5
- export class NgtsCameraShake {
6
- set _intensity(intensity) {
7
- this.inputs.set({ intensity });
8
- }
9
- set _decay(decay) {
10
- this.inputs.set({ decay });
11
- }
12
- set _decayRate(decayRate) {
13
- this.inputs.set({ decayRate });
14
- }
15
- set _maxYaw(maxYaw) {
16
- this.inputs.set({ maxYaw });
17
- }
18
- set _maxPitch(maxPitch) {
19
- this.inputs.set({ maxPitch });
20
- }
21
- set _maxRoll(maxRoll) {
22
- this.inputs.set({ maxRoll });
23
- }
24
- set _yawFrequency(yawFrequency) {
25
- this.inputs.set({ yawFrequency });
26
- }
27
- set _pitchFrequency(pitchFrequency) {
28
- this.inputs.set({ pitchFrequency });
29
- }
30
- set _rollFrequency(rollFrequency) {
31
- this.inputs.set({ rollFrequency });
32
- }
33
- constructor() {
34
- this.inputs = signalStore({
35
- intensity: 1,
36
- decayRate: 0.65,
37
- maxYaw: 0.1,
38
- maxPitch: 0.1,
39
- maxRoll: 0.1,
40
- yawFrequency: 0.1,
41
- pitchFrequency: 0.1,
42
- rollFrequency: 0.1,
43
- });
44
- this.store = injectNgtStore();
45
- this.camera = this.store.select('camera');
46
- this.controls = this.store.select('controls');
47
- this.initialRotation = this.store.get('camera').rotation.clone();
48
- this.yawNoise = new SimplexNoise();
49
- this.rollNoise = new SimplexNoise();
50
- this.pitchNoise = new SimplexNoise();
51
- this.intensity = this.inputs.select('intensity');
52
- this.constrainedIntensity = computed(() => {
53
- const intensity = this.intensity();
54
- if (intensity < 0 || intensity > 1) {
55
- return intensity < 0 ? 0 : 1;
56
- }
57
- return intensity;
58
- });
59
- this.beforeRender();
60
- this.setEvents();
61
- }
62
- beforeRender() {
63
- injectBeforeRender(({ clock, delta }) => {
64
- const [{ maxYaw, yawFrequency, maxPitch, pitchFrequency, maxRoll, rollFrequency, decay, decayRate }, intensity, camera,] = [this.inputs.get(), this.constrainedIntensity(), this.camera()];
65
- const shake = Math.pow(intensity, 2);
66
- const yaw = maxYaw * shake * this.yawNoise.noise(clock.elapsedTime * yawFrequency, 1);
67
- const pitch = maxPitch * shake * this.pitchNoise.noise(clock.elapsedTime * pitchFrequency, 1);
68
- const roll = maxRoll * shake * this.rollNoise.noise(clock.elapsedTime * rollFrequency, 1);
69
- camera.rotation.set(this.initialRotation.x + pitch, this.initialRotation.y + yaw, this.initialRotation.z + roll);
70
- if (decay && intensity > 0) {
71
- this.inputs.set((state) => ({ intensity: state.intensity - decayRate * delta }));
72
- }
73
- });
74
- }
75
- setEvents() {
76
- effect((onCleanup) => {
77
- const [camera, controls] = [this.camera(), this.controls()];
78
- if (controls) {
79
- const callback = () => void (this.initialRotation = camera.rotation.clone());
80
- controls.addEventListener('change', callback);
81
- callback();
82
- onCleanup(() => void controls.removeEventListener('change', callback));
83
- }
84
- });
85
- }
86
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsCameraShake, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
87
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: NgtsCameraShake, isStandalone: true, selector: "ngts-camera-shake", inputs: { _intensity: ["intensity", "_intensity"], _decay: ["decay", "_decay"], _decayRate: ["decayRate", "_decayRate"], _maxYaw: ["maxYaw", "_maxYaw"], _maxPitch: ["maxPitch", "_maxPitch"], _maxRoll: ["maxRoll", "_maxRoll"], _yawFrequency: ["yawFrequency", "_yawFrequency"], _pitchFrequency: ["pitchFrequency", "_pitchFrequency"], _rollFrequency: ["rollFrequency", "_rollFrequency"] }, ngImport: i0 }); }
88
- }
89
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsCameraShake, decorators: [{
90
- type: Directive,
91
- args: [{
92
- selector: 'ngts-camera-shake',
93
- standalone: true,
94
- }]
95
- }], ctorParameters: function () { return []; }, propDecorators: { _intensity: [{
96
- type: Input,
97
- args: [{ alias: 'intensity' }]
98
- }], _decay: [{
99
- type: Input,
100
- args: [{ alias: 'decay' }]
101
- }], _decayRate: [{
102
- type: Input,
103
- args: [{ alias: 'decayRate' }]
104
- }], _maxYaw: [{
105
- type: Input,
106
- args: [{ alias: 'maxYaw' }]
107
- }], _maxPitch: [{
108
- type: Input,
109
- args: [{ alias: 'maxPitch' }]
110
- }], _maxRoll: [{
111
- type: Input,
112
- args: [{ alias: 'maxRoll' }]
113
- }], _yawFrequency: [{
114
- type: Input,
115
- args: [{ alias: 'yawFrequency' }]
116
- }], _pitchFrequency: [{
117
- type: Input,
118
- args: [{ alias: 'pitchFrequency' }]
119
- }], _rollFrequency: [{
120
- type: Input,
121
- args: [{ alias: 'rollFrequency' }]
122
- }] } });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLXNoYWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2NhbWVyYS1zaGFrZS9jYW1lcmEtc2hha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQStCNUMsTUFBTSxPQUFPLGVBQWU7SUFZM0IsSUFBbUMsVUFBVSxDQUFDLFNBQWlCO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBK0IsTUFBTSxDQUFDLEtBQWM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFtQyxVQUFVLENBQUMsU0FBaUI7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFnQyxPQUFPLENBQUMsTUFBYztRQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQWtDLFNBQVMsQ0FBQyxRQUFnQjtRQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQWlDLFFBQVEsQ0FBQyxPQUFlO1FBQ3hELElBQUksQ0FBQyxNQUFNLENB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LENBQUMsQ0FBQztnQkFDOUMsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3ZFO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQTFHVyxlQUFlO2tHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBSjNCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ2hCOzBFQWFtQyxVQUFVO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtnQkFJRSxNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtnQkFJVSxVQUFVO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtnQkFJRyxPQUFPO3NCQUF0QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFJUSxTQUFTO3NCQUExQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtnQkFJSyxRQUFRO3NCQUF4QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFJVyxhQUFhO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtnQkFJUSxlQUFlO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO2dCQUlLLGNBQWM7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgU2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIsIGluamVjdE5ndFN0b3JlLCBzaWduYWxTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgU2ltcGxleE5vaXNlIH0gZnJvbSAndGhyZWUtc3RkbGliJztcblxudHlwZSBDb250cm9sc1Byb3RvID0ge1xuXHR1cGRhdGUoKTogdm9pZDtcblx0dGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuXHRhZGRFdmVudExpc3RlbmVyOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xuXHRyZW1vdmVFdmVudExpc3RlbmVyOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0c0NhbWVyYVNoYWtlU3RhdGUgPSB7XG5cdGRlY2F5PzogYm9vbGVhbjtcblx0aW50ZW5zaXR5OiBudW1iZXI7XG5cdGRlY2F5UmF0ZTogbnVtYmVyO1xuXHRtYXhZYXc6IG51bWJlcjtcblx0bWF4UGl0Y2g6IG51bWJlcjtcblx0bWF4Um9sbDogbnVtYmVyO1xuXHR5YXdGcmVxdWVuY3k6IG51bWJlcjtcblx0cGl0Y2hGcmVxdWVuY3k6IG51bWJlcjtcblx0cm9sbEZyZXF1ZW5jeTogbnVtYmVyO1xufTtcblxuZGVjbGFyZSBnbG9iYWwge1xuXHRpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcblx0XHQnbmd0cy1jYW1lcmEtc2hha2UnOiBOZ3RzQ2FtZXJhU2hha2VTdGF0ZTtcblx0fVxufVxuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICduZ3RzLWNhbWVyYS1zaGFrZScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDYW1lcmFTaGFrZSB7XG5cdHByaXZhdGUgaW5wdXRzID0gc2lnbmFsU3RvcmU8Tmd0c0NhbWVyYVNoYWtlU3RhdGU+KHtcblx0XHRpbnRlbnNpdHk6IDEsXG5cdFx0ZGVjYXlSYXRlOiAwLjY1LFxuXHRcdG1heFlhdzogMC4xLFxuXHRcdG1heFBpdGNoOiAwLjEsXG5cdFx0bWF4Um9sbDogMC4xLFxuXHRcdHlhd0ZyZXF1ZW5jeTogMC4xLFxuXHRcdHBpdGNoRnJlcXVlbmN5OiAwLjEsXG5cdFx0cm9sbEZyZXF1ZW5jeTogMC4xLFxuXHR9KTtcblxuXHRASW5wdXQoeyBhbGlhczogJ2ludGVuc2l0eScgfSkgc2V0IF9pbnRlbnNpdHkoaW50ZW5zaXR5OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBpbnRlbnNpdHkgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2RlY2F5JyB9KSBzZXQgX2RlY2F5KGRlY2F5OiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGVjYXkgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2RlY2F5UmF0ZScgfSkgc2V0IF9kZWNheVJhdGUoZGVjYXlSYXRlOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBkZWNheVJhdGUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ21heFlhdycgfSkgc2V0IF9tYXhZYXcobWF4WWF3OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBtYXhZYXcgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ21heFBpdGNoJyB9KSBzZXQgX21heFBpdGNoKG1heFBpdGNoOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBtYXhQaXRjaCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnbWF4Um9sbCcgfSkgc2V0IF9tYXhSb2xsKG1heFJvbGw6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IG1heFJvbGwgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3lhd0ZyZXF1ZW5jeScgfSkgc2V0IF95YXdGcmVxdWVuY3koeWF3RnJlcXVlbmN5OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyB5YXdGcmVxdWVuY3kgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3BpdGNoRnJlcXVlbmN5JyB9KSBzZXQgX3BpdGNoRnJlcXVlbmN5KHBpdGNoRnJlcXVlbmN5OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBwaXRjaEZyZXF1ZW5jeSB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAncm9sbEZyZXF1ZW5jeScgfSkgc2V0IF9yb2xsRnJlcXVlbmN5KHJvbGxGcmVxdWVuY3k6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHJvbGxGcmVxdWVuY3kgfSk7XG5cdH1cblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblxuXHRwcml2YXRlIGluaXRpYWxSb3RhdGlvbiA9IHRoaXMuc3RvcmUuZ2V0KCdjYW1lcmEnKS5yb3RhdGlvbi5jbG9uZSgpO1xuXHRwcml2YXRlIHlhd05vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXHRwcml2YXRlIHJvbGxOb2lzZSA9IG5ldyBTaW1wbGV4Tm9pc2UoKTtcblx0cHJpdmF0ZSBwaXRjaE5vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXG5cdHByaXZhdGUgaW50ZW5zaXR5ID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdpbnRlbnNpdHknKTtcblx0cHJpdmF0ZSBjb25zdHJhaW5lZEludGVuc2l0eSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBpbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eSgpO1xuXHRcdGlmIChpbnRlbnNpdHkgPCAwIHx8IGludGVuc2l0eSA+IDEpIHtcblx0XHRcdHJldHVybiBpbnRlbnNpdHkgPCAwID8gMCA6IDE7XG5cdFx0fVxuXHRcdHJldHVybiBpbnRlbnNpdHk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuYmVmb3JlUmVuZGVyKCk7XG5cdFx0dGhpcy5zZXRFdmVudHMoKTtcblx0fVxuXG5cdHByaXZhdGUgYmVmb3JlUmVuZGVyKCkge1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBjbG9jaywgZGVsdGEgfSkgPT4ge1xuXHRcdFx0Y29uc3QgW1xuXHRcdFx0XHR7IG1heFlhdywgeWF3RnJlcXVlbmN5LCBtYXhQaXRjaCwgcGl0Y2hGcmVxdWVuY3ksIG1heFJvbGwsIHJvbGxGcmVxdWVuY3ksIGRlY2F5LCBkZWNheVJhdGUgfSxcblx0XHRcdFx0aW50ZW5zaXR5LFxuXHRcdFx0XHRjYW1lcmEsXG5cdFx0XHRdID0gW3RoaXMuaW5wdXRzLmdldCgpLCB0aGlzLmNvbnN0cmFpbmVkSW50ZW5zaXR5KCksIHRoaXMuY2FtZXJhKCldO1xuXG5cdFx0XHRjb25zdCBzaGFrZSA9IE1hdGgucG93KGludGVuc2l0eSwgMik7XG5cdFx0XHRjb25zdCB5YXcgPSBtYXhZYXcgKiBzaGFrZSAqIHRoaXMueWF3Tm9pc2Uubm9pc2UoY2xvY2suZWxhcHNlZFRpbWUgKiB5YXdGcmVxdWVuY3ksIDEpO1xuXHRcdFx0Y29uc3QgcGl0Y2ggPSBtYXhQaXRjaCAqIHNoYWtlICogdGhpcy5waXRjaE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcGl0Y2hGcmVxdWVuY3ksIDEpO1xuXHRcdFx0Y29uc3Qgcm9sbCA9IG1heFJvbGwgKiBzaGFrZSAqIHRoaXMucm9sbE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcm9sbEZyZXF1ZW5jeSwgMSk7XG5cblx0XHRcdGNhbWVyYS5yb3RhdGlvbi5zZXQoXG5cdFx0XHRcdHRoaXMuaW5pdGlhbFJvdGF0aW9uLnggKyBwaXRjaCxcblx0XHRcdFx0dGhpcy5pbml0aWFsUm90YXRpb24ueSArIHlhdyxcblx0XHRcdFx0dGhpcy5pbml0aWFsUm90YXRpb24ueiArIHJvbGwsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZGVjYXkgJiYgaW50ZW5zaXR5ID4gMCkge1xuXHRcdFx0XHR0aGlzLmlucHV0cy5zZXQoKHN0YXRlKSA9PiAoeyBpbnRlbnNpdHk6IHN0YXRlLmludGVuc2l0eSAtIGRlY2F5UmF0ZSAqIGRlbHRhIH0pKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0RXZlbnRzKCkge1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBbY2FtZXJhLCBjb250cm9sc10gPSBbdGhpcy5jYW1lcmEoKSwgdGhpcy5jb250cm9scygpXTtcblx0XHRcdGlmIChjb250cm9scykge1xuXHRcdFx0XHRjb25zdCBjYWxsYmFjayA9ICgpID0+IHZvaWQgKHRoaXMuaW5pdGlhbFJvdGF0aW9uID0gY2FtZXJhLnJvdGF0aW9uLmNsb25lKCkpO1xuXHRcdFx0XHRjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjYWxsYmFjayk7XG5cdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdG9uQ2xlYW51cCgoKSA9PiB2b2lkIGNvbnRyb2xzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNhbGxiYWNrKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==