angular-three-soba 1.12.4 → 1.14.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 (262) hide show
  1. package/abstractions/lib/billboard/billboard.d.ts +1 -1
  2. package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +1 -1
  3. package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +1 -1
  4. package/abstractions/lib/edges/edges.d.ts +2 -2
  5. package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +1 -1
  6. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +1 -1
  7. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +2 -2
  8. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +1 -1
  9. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +1 -1
  10. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +2 -2
  11. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +1 -1
  12. package/abstractions/lib/line/line-input.d.ts +1 -1
  13. package/abstractions/lib/line/line.d.ts +1 -1
  14. package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +1 -1
  15. package/abstractions/lib/text/text.d.ts +1 -1
  16. package/abstractions/lib/text-3d/text-3d.d.ts +1 -1
  17. package/cameras/lib/camera/camera-content.d.ts +1 -1
  18. package/cameras/lib/camera/camera.d.ts +1 -1
  19. package/cameras/lib/cube-camera/cube-camera.d.ts +1 -1
  20. package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +1 -1
  21. package/controls/lib/orbit-controls/orbit-controls.d.ts +1 -1
  22. package/esm2022/abstractions/lib/billboard/billboard.mjs +74 -0
  23. package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +120 -0
  24. package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +99 -0
  25. package/esm2022/abstractions/lib/edges/edges.mjs +96 -0
  26. package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +213 -0
  27. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +92 -0
  28. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +184 -0
  29. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +46 -0
  30. package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +8 -7
  31. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
  32. package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +8 -7
  33. package/esm2022/abstractions/lib/line/line-input.mjs +76 -0
  34. package/esm2022/abstractions/lib/line/line.mjs +133 -0
  35. package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +128 -0
  36. package/esm2022/abstractions/lib/text/text.mjs +115 -0
  37. package/esm2022/abstractions/lib/text-3d/text-3d.mjs +145 -0
  38. package/esm2022/cameras/lib/camera/camera-content.mjs +21 -0
  39. package/esm2022/cameras/lib/camera/camera.mjs +75 -0
  40. package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +131 -0
  41. package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +93 -0
  42. package/{esm2020 → esm2022}/cameras/lib/perspective-camera/perspective-camera.mjs +8 -7
  43. package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +147 -0
  44. package/esm2022/loaders/index.mjs +6 -0
  45. package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +10 -0
  46. package/esm2022/loaders/lib/loader/loader.mjs +134 -0
  47. package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +75 -0
  48. package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +328 -0
  49. package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +158 -0
  50. package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +238 -0
  51. package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
  52. package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +26 -0
  53. package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +47 -0
  54. package/esm2022/performance/lib/adaptive/adaptive-events.mjs +37 -0
  55. package/esm2022/performance/lib/detailed/detailed.mjs +54 -0
  56. package/esm2022/performance/lib/stats/stats.mjs +80 -0
  57. package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +61 -0
  58. package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +249 -0
  59. package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +201 -0
  60. package/{esm2020 → esm2022}/staging/lib/bounds/bounds.mjs +8 -7
  61. package/esm2022/staging/lib/camera-shake/camera-shake.mjs +122 -0
  62. package/esm2022/staging/lib/caustics/caustics.mjs +364 -0
  63. package/esm2022/staging/lib/center/center.mjs +143 -0
  64. package/esm2022/staging/lib/cloud/cloud.mjs +160 -0
  65. package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +228 -0
  66. package/esm2022/staging/lib/environment/environment-cube.mjs +41 -0
  67. package/esm2022/staging/lib/environment/environment-ground.mjs +67 -0
  68. package/esm2022/staging/lib/environment/environment-inputs.mjs +87 -0
  69. package/esm2022/staging/lib/environment/environment-map.mjs +39 -0
  70. package/esm2022/staging/lib/environment/environment-portal.mjs +111 -0
  71. package/{esm2020 → esm2022}/staging/lib/environment/environment.mjs +13 -11
  72. package/esm2022/staging/lib/float/float.mjs +77 -0
  73. package/esm2022/staging/lib/sky/sky.mjs +109 -0
  74. package/esm2022/staging/lib/sparkles/sparkles.mjs +210 -0
  75. package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +51 -0
  76. package/esm2022/staging/lib/spot-light/spot-light-input.mjs +62 -0
  77. package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +74 -0
  78. package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +126 -0
  79. package/{esm2020 → esm2022}/staging/lib/spot-light/spot-light-shadow.mjs +8 -7
  80. package/esm2022/staging/lib/spot-light/spot-light.mjs +117 -0
  81. package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +86 -0
  82. package/{esm2020 → esm2022}/staging/lib/stage/stage.mjs +13 -11
  83. package/esm2022/staging/lib/stars/stars.mjs +140 -0
  84. package/{fesm2020 → fesm2022}/angular-three-soba-abstractions.mjs +89 -89
  85. package/{fesm2015 → fesm2022}/angular-three-soba-abstractions.mjs.map +1 -1
  86. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs +21 -21
  87. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs.map +1 -1
  88. package/{fesm2020 → fesm2022}/angular-three-soba-controls.mjs +5 -5
  89. package/fesm2022/angular-three-soba-controls.mjs.map +1 -0
  90. package/{fesm2020 → fesm2022}/angular-three-soba-loaders.mjs +15 -8
  91. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -0
  92. package/{fesm2020 → fesm2022}/angular-three-soba-materials.mjs +25 -25
  93. package/fesm2022/angular-three-soba-materials.mjs.map +1 -0
  94. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs +3 -3
  95. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs.map +1 -1
  96. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs +14 -14
  97. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs.map +1 -1
  98. package/{fesm2020 → fesm2022}/angular-three-soba-shaders.mjs +2 -2
  99. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -0
  100. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs +139 -139
  101. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs.map +1 -1
  102. package/loaders/index.d.ts +1 -0
  103. package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +3 -0
  104. package/loaders/lib/loader/loader.d.ts +1 -1
  105. package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +8 -3
  106. package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +1 -1
  107. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +1 -1
  108. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  109. package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +1 -1
  110. package/package.json +43 -68
  111. package/performance/lib/adaptive/adaptive-dpr.d.ts +1 -1
  112. package/performance/lib/detailed/detailed.d.ts +1 -1
  113. package/performance/lib/stats/stats.d.ts +1 -1
  114. package/plugin/package.json +1 -1
  115. package/plugin/src/generators/init/compat.js +1 -1
  116. package/plugin/src/generators/init/compat.js.map +1 -1
  117. package/plugin/src/generators/init/init.d.ts +1 -1
  118. package/plugin/src/generators/init/init.js +1 -1
  119. package/plugin/src/generators/init/init.js.map +1 -1
  120. package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +2 -2
  121. package/staging/lib/accumulative-shadows/randomized-lights.d.ts +1 -1
  122. package/staging/lib/bounds/bounds.d.ts +1 -1
  123. package/staging/lib/camera-shake/camera-shake.d.ts +1 -1
  124. package/staging/lib/caustics/caustics.d.ts +2 -2
  125. package/staging/lib/center/center.d.ts +1 -1
  126. package/staging/lib/cloud/cloud.d.ts +1 -1
  127. package/staging/lib/contact-shadows/contact-shadows.d.ts +1 -1
  128. package/staging/lib/environment/environment-inputs.d.ts +1 -1
  129. package/staging/lib/float/float.d.ts +1 -1
  130. package/staging/lib/sky/sky.d.ts +1 -1
  131. package/staging/lib/sparkles/sparkles.d.ts +2 -2
  132. package/staging/lib/spot-light/shadow-mesh-input.d.ts +1 -1
  133. package/staging/lib/spot-light/spot-light-input.d.ts +1 -1
  134. package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +1 -1
  135. package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +1 -1
  136. package/staging/lib/spot-light/spot-light.d.ts +1 -1
  137. package/staging/lib/spot-light/volumetric-mesh.d.ts +1 -1
  138. package/staging/lib/stage/stage.d.ts +2 -2
  139. package/staging/lib/stars/stars.d.ts +2 -2
  140. package/esm2020/abstractions/lib/billboard/billboard.mjs +0 -73
  141. package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -119
  142. package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -98
  143. package/esm2020/abstractions/lib/edges/edges.mjs +0 -95
  144. package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -211
  145. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -91
  146. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -182
  147. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -45
  148. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -193
  149. package/esm2020/abstractions/lib/line/line-input.mjs +0 -75
  150. package/esm2020/abstractions/lib/line/line.mjs +0 -132
  151. package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -127
  152. package/esm2020/abstractions/lib/text/text.mjs +0 -114
  153. package/esm2020/abstractions/lib/text-3d/text-3d.mjs +0 -144
  154. package/esm2020/cameras/lib/camera/camera-content.mjs +0 -20
  155. package/esm2020/cameras/lib/camera/camera.mjs +0 -74
  156. package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +0 -130
  157. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -92
  158. package/esm2020/controls/lib/orbit-controls/orbit-controls.mjs +0 -146
  159. package/esm2020/loaders/index.mjs +0 -5
  160. package/esm2020/loaders/lib/loader/loader.mjs +0 -133
  161. package/esm2020/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -74
  162. package/esm2020/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -327
  163. package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -157
  164. package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -237
  165. package/esm2020/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -67
  166. package/esm2020/misc/lib/bake-shadows/bake-shadows.mjs +0 -25
  167. package/esm2020/performance/lib/adaptive/adaptive-dpr.mjs +0 -46
  168. package/esm2020/performance/lib/adaptive/adaptive-events.mjs +0 -36
  169. package/esm2020/performance/lib/detailed/detailed.mjs +0 -53
  170. package/esm2020/performance/lib/stats/stats.mjs +0 -79
  171. package/esm2020/shaders/lib/blur-pass/blur-pass.mjs +0 -61
  172. package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -247
  173. package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -199
  174. package/esm2020/staging/lib/camera-shake/camera-shake.mjs +0 -121
  175. package/esm2020/staging/lib/caustics/caustics.mjs +0 -363
  176. package/esm2020/staging/lib/center/center.mjs +0 -142
  177. package/esm2020/staging/lib/cloud/cloud.mjs +0 -159
  178. package/esm2020/staging/lib/contact-shadows/contact-shadows.mjs +0 -227
  179. package/esm2020/staging/lib/environment/environment-cube.mjs +0 -40
  180. package/esm2020/staging/lib/environment/environment-ground.mjs +0 -66
  181. package/esm2020/staging/lib/environment/environment-inputs.mjs +0 -86
  182. package/esm2020/staging/lib/environment/environment-map.mjs +0 -38
  183. package/esm2020/staging/lib/environment/environment-portal.mjs +0 -110
  184. package/esm2020/staging/lib/float/float.mjs +0 -76
  185. package/esm2020/staging/lib/sky/sky.mjs +0 -108
  186. package/esm2020/staging/lib/sparkles/sparkles.mjs +0 -209
  187. package/esm2020/staging/lib/spot-light/shadow-mesh-input.mjs +0 -50
  188. package/esm2020/staging/lib/spot-light/spot-light-input.mjs +0 -61
  189. package/esm2020/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -73
  190. package/esm2020/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -125
  191. package/esm2020/staging/lib/spot-light/spot-light.mjs +0 -116
  192. package/esm2020/staging/lib/spot-light/volumetric-mesh.mjs +0 -85
  193. package/esm2020/staging/lib/stars/stars.mjs +0 -139
  194. package/fesm2015/angular-three-soba-abstractions.mjs +0 -2048
  195. package/fesm2015/angular-three-soba-controls.mjs +0 -153
  196. package/fesm2015/angular-three-soba-controls.mjs.map +0 -1
  197. package/fesm2015/angular-three-soba-loaders.mjs +0 -222
  198. package/fesm2015/angular-three-soba-loaders.mjs.map +0 -1
  199. package/fesm2015/angular-three-soba-materials.mjs +0 -851
  200. package/fesm2015/angular-three-soba-materials.mjs.map +0 -1
  201. package/fesm2015/angular-three-soba-misc.mjs +0 -148
  202. package/fesm2015/angular-three-soba-misc.mjs.map +0 -1
  203. package/fesm2015/angular-three-soba-performance.mjs +0 -210
  204. package/fesm2015/angular-three-soba-performance.mjs.map +0 -1
  205. package/fesm2015/angular-three-soba-shaders.mjs +0 -1239
  206. package/fesm2015/angular-three-soba-shaders.mjs.map +0 -1
  207. package/fesm2015/angular-three-soba-staging.mjs +0 -3772
  208. package/fesm2015/angular-three-soba-staging.mjs.map +0 -1
  209. package/fesm2020/angular-three-soba-abstractions.mjs.map +0 -1
  210. package/fesm2020/angular-three-soba-cameras.mjs +0 -347
  211. package/fesm2020/angular-three-soba-cameras.mjs.map +0 -1
  212. package/fesm2020/angular-three-soba-controls.mjs.map +0 -1
  213. package/fesm2020/angular-three-soba-loaders.mjs.map +0 -1
  214. package/fesm2020/angular-three-soba-materials.mjs.map +0 -1
  215. package/fesm2020/angular-three-soba-shaders.mjs.map +0 -1
  216. package/fesm2020/angular-three-soba.mjs +0 -6
  217. package/fesm2020/angular-three-soba.mjs.map +0 -1
  218. /package/{esm2020 → esm2022}/abstractions/angular-three-soba-abstractions.mjs +0 -0
  219. /package/{esm2020 → esm2022}/abstractions/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -0
  221. /package/{esm2020 → esm2022}/angular-three-soba.mjs +0 -0
  222. /package/{esm2020 → esm2022}/cameras/angular-three-soba-cameras.mjs +0 -0
  223. /package/{esm2020 → esm2022}/cameras/index.mjs +0 -0
  224. /package/{esm2020 → esm2022}/controls/angular-three-soba-controls.mjs +0 -0
  225. /package/{esm2020 → esm2022}/controls/index.mjs +0 -0
  226. /package/{esm2020 → esm2022}/index.mjs +0 -0
  227. /package/{esm2020 → esm2022}/loaders/angular-three-soba-loaders.mjs +0 -0
  228. /package/{esm2020 → esm2022}/loaders/lib/gltf-loader/gltf-loader.mjs +0 -0
  229. /package/{esm2020 → esm2022}/loaders/lib/progress/progress.mjs +0 -0
  230. /package/{esm2020 → esm2022}/loaders/lib/texture-loader/texture-loader.mjs +0 -0
  231. /package/{esm2020 → esm2022}/materials/angular-three-soba-materials.mjs +0 -0
  232. /package/{esm2020 → esm2022}/materials/index.mjs +0 -0
  233. /package/{esm2020 → esm2022}/misc/angular-three-soba-misc.mjs +0 -0
  234. /package/{esm2020 → esm2022}/misc/index.mjs +0 -0
  235. /package/{esm2020 → esm2022}/misc/lib/animations/animations.mjs +0 -0
  236. /package/{esm2020 → esm2022}/misc/lib/depth-buffer/depth-buffer.mjs +0 -0
  237. /package/{esm2020 → esm2022}/misc/lib/fbo/fbo.mjs +0 -0
  238. /package/{esm2020 → esm2022}/performance/angular-three-soba-performance.mjs +0 -0
  239. /package/{esm2020 → esm2022}/performance/index.mjs +0 -0
  240. /package/{esm2020 → esm2022}/shaders/angular-three-soba-shaders.mjs +0 -0
  241. /package/{esm2020 → esm2022}/shaders/index.mjs +0 -0
  242. /package/{esm2020 → esm2022}/shaders/lib/caustics-material/caustics-material.mjs +0 -0
  243. /package/{esm2020 → esm2022}/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -0
  244. /package/{esm2020 → esm2022}/shaders/lib/convolution-material/convolution-material.mjs +0 -0
  245. /package/{esm2020 → esm2022}/shaders/lib/discard-material/discard-material.mjs +0 -0
  246. /package/{esm2020 → esm2022}/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -0
  247. /package/{esm2020 → esm2022}/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -0
  248. /package/{esm2020 → esm2022}/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -0
  249. /package/{esm2020 → esm2022}/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -0
  250. /package/{esm2020 → esm2022}/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -0
  251. /package/{esm2020 → esm2022}/shaders/lib/shader-material/shader-material.mjs +0 -0
  252. /package/{esm2020 → esm2022}/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -0
  253. /package/{esm2020 → esm2022}/shaders/lib/spot-light-material/spot-light-material.mjs +0 -0
  254. /package/{esm2020 → esm2022}/shaders/lib/star-field-material/star-field-material.mjs +0 -0
  255. /package/{esm2020 → esm2022}/staging/angular-three-soba-staging.mjs +0 -0
  256. /package/{esm2020 → esm2022}/staging/index.mjs +0 -0
  257. /package/{esm2020 → esm2022}/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -0
  258. /package/{esm2020 → esm2022}/staging/lib/environment/assets.mjs +0 -0
  259. /package/{esm2020 → esm2022}/staging/lib/environment/utils.mjs +0 -0
  260. /package/{esm2020 → esm2022}/staging/lib/spot-light/common.mjs +0 -0
  261. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs +0 -0
  262. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs.map +0 -0
@@ -0,0 +1,328 @@
1
+ import { NgIf } from '@angular/common';
2
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Input } from '@angular/core';
3
+ import { extend, getLocalState, injectBeforeRender, injectNgtRef, NgtArgs, NgtPush, NgtRxStore, NgtStore, startWithUndefined, } from 'angular-three';
4
+ import { BlurPass, MeshReflectorMaterial } from 'angular-three-soba/shaders';
5
+ import { combineLatest, debounceTime, map } from 'rxjs';
6
+ import * as THREE from 'three';
7
+ import * as i0 from "@angular/core";
8
+ extend({ MeshReflectorMaterial });
9
+ class NgtsMeshReflectorMaterial extends NgtRxStore {
10
+ set resolution(resolution) {
11
+ this.set({ resolution });
12
+ }
13
+ set mixBlur(mixBlur) {
14
+ this.set({ mixBlur });
15
+ }
16
+ set mixStrength(mixStrength) {
17
+ this.set({ mixStrength });
18
+ }
19
+ set blur(blur) {
20
+ this.set({ blur });
21
+ }
22
+ set mirror(mirror) {
23
+ this.set({ mirror });
24
+ }
25
+ set minDepthThreshold(minDepthThreshold) {
26
+ this.set({ minDepthThreshold });
27
+ }
28
+ set maxDepthThreshold(maxDepthThreshold) {
29
+ this.set({ maxDepthThreshold });
30
+ }
31
+ set depthScale(depthScale) {
32
+ this.set({ depthScale });
33
+ }
34
+ set depthToBlurRatioBias(depthToBlurRatioBias) {
35
+ this.set({ depthToBlurRatioBias });
36
+ }
37
+ set distortionMap(distortionMap) {
38
+ this.set({ distortionMap });
39
+ }
40
+ set distortion(distortion) {
41
+ this.set({ distortion });
42
+ }
43
+ set mixContrast(mixContrast) {
44
+ this.set({ mixContrast });
45
+ }
46
+ set reflectorOffset(reflectorOffset) {
47
+ this.set({ reflectorOffset });
48
+ }
49
+ get reflectorProps() {
50
+ return this.get('reflectorEntities', 'reflectorProps');
51
+ }
52
+ initialize() {
53
+ super.initialize();
54
+ this.set({
55
+ mixBlur: 0,
56
+ mixStrength: 1,
57
+ resolution: 256,
58
+ blur: [0, 0],
59
+ minDepthThreshold: 0.9,
60
+ maxDepthThreshold: 1,
61
+ depthScale: 0,
62
+ depthToBlurRatioBias: 0.25,
63
+ mirror: 0,
64
+ distortion: 1,
65
+ mixContrast: 1,
66
+ reflectorOffset: 0,
67
+ });
68
+ }
69
+ constructor() {
70
+ super();
71
+ this.materialRef = injectNgtRef();
72
+ this.defines$ = this.select('reflectorEntities', 'reflectorProps', 'defines').pipe(debounceTime(0));
73
+ this.store = inject(NgtStore);
74
+ this.reflectorPlane = new THREE.Plane();
75
+ this.normal = new THREE.Vector3();
76
+ this.reflectorWorldPosition = new THREE.Vector3();
77
+ this.cameraWorldPosition = new THREE.Vector3();
78
+ this.rotationMatrix = new THREE.Matrix4();
79
+ this.lookAtPosition = new THREE.Vector3(0, 0, -1);
80
+ this.clipPlane = new THREE.Vector4();
81
+ this.view = new THREE.Vector3();
82
+ this.target = new THREE.Vector3();
83
+ this.q = new THREE.Vector4();
84
+ this.textureMatrix = new THREE.Matrix4();
85
+ this.virtualCamera = new THREE.PerspectiveCamera();
86
+ this.connect('normalizedBlur', this.select('blur').pipe(map((blur) => (Array.isArray(blur) ? blur : [blur, blur]))));
87
+ this.connect('hasBlur', this.select('normalizedBlur').pipe(map(([x, y]) => x + y > 0)));
88
+ this.connect('reflectorEntities', combineLatest([
89
+ this.store.select('gl'),
90
+ this.select('normalizedBlur'),
91
+ this.select('resolution'),
92
+ this.select('mirror'),
93
+ this.select('hasBlur'),
94
+ this.select('mixBlur'),
95
+ this.select('mixStrength'),
96
+ this.select('minDepthThreshold'),
97
+ this.select('maxDepthThreshold'),
98
+ this.select('depthScale'),
99
+ this.select('depthToBlurRatioBias'),
100
+ this.select('distortion'),
101
+ this.select('distortionMap').pipe(startWithUndefined()),
102
+ this.select('mixContrast'),
103
+ ]).pipe(map(([gl, blur, resolution, mirror, hasBlur, mixBlur, mixStrength, minDepthThreshold, maxDepthThreshold, depthScale, depthToBlurRatioBias, distortion, distortionMap, mixContrast,]) => {
104
+ const parameters = {
105
+ minFilter: THREE.LinearFilter,
106
+ magFilter: THREE.LinearFilter,
107
+ encoding: gl.outputEncoding,
108
+ type: THREE.HalfFloatType,
109
+ };
110
+ const fbo1 = new THREE.WebGLRenderTarget(resolution, resolution, parameters);
111
+ fbo1.depthBuffer = true;
112
+ fbo1.depthTexture = new THREE.DepthTexture(resolution, resolution);
113
+ fbo1.depthTexture.format = THREE.DepthFormat;
114
+ fbo1.depthTexture.type = THREE.UnsignedShortType;
115
+ const fbo2 = new THREE.WebGLRenderTarget(resolution, resolution, parameters);
116
+ const blurPass = new BlurPass({
117
+ gl,
118
+ resolution,
119
+ width: blur[0],
120
+ height: blur[1],
121
+ minDepthThreshold,
122
+ maxDepthThreshold,
123
+ depthScale,
124
+ depthToBlurRatioBias,
125
+ });
126
+ const reflectorProps = {
127
+ mirror,
128
+ textureMatrix: this.textureMatrix,
129
+ mixBlur,
130
+ tDiffuse: fbo1.texture,
131
+ tDepth: fbo1.depthTexture,
132
+ tDiffuseBlur: fbo2.texture,
133
+ hasBlur,
134
+ mixStrength,
135
+ minDepthThreshold,
136
+ maxDepthThreshold,
137
+ depthScale,
138
+ depthToBlurRatioBias,
139
+ distortion,
140
+ distortionMap,
141
+ mixContrast,
142
+ defines: {
143
+ USE_BLUR: hasBlur ? '' : undefined,
144
+ USE_DEPTH: depthScale > 0 ? '' : undefined,
145
+ USE_DISTORTION: distortionMap ? '' : undefined,
146
+ },
147
+ };
148
+ return { fbo1, fbo2, blurPass, reflectorProps };
149
+ })));
150
+ injectBeforeRender(this.onBeforeRender.bind(this));
151
+ }
152
+ beforeRender(state) {
153
+ const parent = getLocalState(this.materialRef.nativeElement).parent;
154
+ if (!parent)
155
+ return;
156
+ const { camera } = state;
157
+ this.reflectorWorldPosition.setFromMatrixPosition(parent.matrixWorld);
158
+ this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);
159
+ this.rotationMatrix.extractRotation(parent.matrixWorld);
160
+ this.normal.set(0, 0, 1);
161
+ this.normal.applyMatrix4(this.rotationMatrix);
162
+ this.reflectorWorldPosition.addScaledVector(this.normal, this.get('reflectorOffset'));
163
+ this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);
164
+ // Avoid rendering when reflector is facing away
165
+ if (this.view.dot(this.normal) > 0)
166
+ return;
167
+ this.view.reflect(this.normal).negate();
168
+ this.view.add(this.reflectorWorldPosition);
169
+ this.rotationMatrix.extractRotation(camera.matrixWorld);
170
+ this.lookAtPosition.set(0, 0, -1);
171
+ this.lookAtPosition.applyMatrix4(this.rotationMatrix);
172
+ this.lookAtPosition.add(this.cameraWorldPosition);
173
+ this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);
174
+ this.target.reflect(this.normal).negate();
175
+ this.target.add(this.reflectorWorldPosition);
176
+ this.virtualCamera.position.copy(this.view);
177
+ this.virtualCamera.up.set(0, 1, 0);
178
+ this.virtualCamera.up.applyMatrix4(this.rotationMatrix);
179
+ this.virtualCamera.up.reflect(this.normal);
180
+ this.virtualCamera.lookAt(this.target);
181
+ this.virtualCamera.far = camera.far; // Used in WebGLBackground
182
+ this.virtualCamera.updateMatrixWorld();
183
+ this.virtualCamera.projectionMatrix.copy(camera.projectionMatrix);
184
+ // Update the texture matrix
185
+ this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
186
+ this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);
187
+ this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);
188
+ this.textureMatrix.multiply(parent.matrixWorld);
189
+ // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
190
+ // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
191
+ this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);
192
+ this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);
193
+ this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);
194
+ const projectionMatrix = this.virtualCamera.projectionMatrix;
195
+ this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];
196
+ this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];
197
+ this.q.z = -1.0;
198
+ this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];
199
+ // Calculate the scaled plane vector
200
+ this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));
201
+ // Replacing the third row of the projection matrix
202
+ projectionMatrix.elements[2] = this.clipPlane.x;
203
+ projectionMatrix.elements[6] = this.clipPlane.y;
204
+ projectionMatrix.elements[10] = this.clipPlane.z + 1.0;
205
+ projectionMatrix.elements[14] = this.clipPlane.w;
206
+ }
207
+ onBeforeRender(state) {
208
+ if (!this.materialRef.nativeElement)
209
+ return;
210
+ const parent = getLocalState(this.materialRef.nativeElement).parent;
211
+ if (!parent)
212
+ return;
213
+ const { gl, scene } = state;
214
+ const { hasBlur } = this.get();
215
+ const { fbo1, fbo2, blurPass } = this.get('reflectorEntities');
216
+ if (fbo1 && fbo2 && blurPass) {
217
+ parent.visible = false;
218
+ const currentXrEnabled = gl.xr.enabled;
219
+ const currentShadowAutoUpdate = gl.shadowMap.autoUpdate;
220
+ this.beforeRender(state);
221
+ gl.xr.enabled = false;
222
+ gl.shadowMap.autoUpdate = false;
223
+ gl.setRenderTarget(fbo1);
224
+ gl.state.buffers.depth.setMask(true);
225
+ if (!gl.autoClear)
226
+ gl.clear();
227
+ gl.render(scene, this.virtualCamera);
228
+ if (hasBlur)
229
+ blurPass.render(gl, fbo1, fbo2);
230
+ gl.xr.enabled = currentXrEnabled;
231
+ gl.shadowMap.autoUpdate = currentShadowAutoUpdate;
232
+ parent.visible = true;
233
+ gl.setRenderTarget(null);
234
+ }
235
+ }
236
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsMeshReflectorMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
237
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsMeshReflectorMaterial, isStandalone: true, selector: "ngts-mesh-reflector-material", inputs: { materialRef: "materialRef", resolution: "resolution", mixBlur: "mixBlur", mixStrength: "mixStrength", blur: "blur", mirror: "mirror", minDepthThreshold: "minDepthThreshold", maxDepthThreshold: "maxDepthThreshold", depthScale: "depthScale", depthToBlurRatioBias: "depthToBlurRatioBias", distortionMap: "distortionMap", distortion: "distortion", mixContrast: "mixContrast", reflectorOffset: "reflectorOffset" }, usesInheritance: true, ngImport: i0, template: `
238
+ <ngt-mesh-reflector-material
239
+ ngtCompound
240
+ attach="material"
241
+ *ngIf="defines$ | ngtPush as defines"
242
+ [ref]="materialRef"
243
+ [defines]="defines"
244
+ [mirror]="reflectorProps.mirror"
245
+ [textureMatrix]="reflectorProps.textureMatrix"
246
+ [mixBlur]="reflectorProps.mixBlur"
247
+ [tDiffuse]="reflectorProps.tDiffuse"
248
+ [tDepth]="reflectorProps.tDepth"
249
+ [tDiffuseBlur]="reflectorProps.tDiffuseBlur"
250
+ [hasBlur]="reflectorProps.hasBlur"
251
+ [mixStrength]="reflectorProps.mixStrength"
252
+ [minDepthThreshold]="reflectorProps.minDepthThreshold"
253
+ [maxDepthThreshold]="reflectorProps.maxDepthThreshold"
254
+ [depthScale]="reflectorProps.depthScale"
255
+ [depthToBlurRatioBias]="reflectorProps.depthToBlurRatioBias"
256
+ [distortion]="reflectorProps.distortion"
257
+ [distortionMap]="reflectorProps.distortionMap"
258
+ [mixContrast]="reflectorProps.mixContrast"
259
+ >
260
+ <ng-content />
261
+ </ngt-mesh-reflector-material>
262
+ `, isInline: true, dependencies: [{ kind: "pipe", type: NgtPush, name: "ngtPush" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
263
+ }
264
+ export { NgtsMeshReflectorMaterial };
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsMeshReflectorMaterial, decorators: [{
266
+ type: Component,
267
+ args: [{
268
+ selector: 'ngts-mesh-reflector-material',
269
+ standalone: true,
270
+ template: `
271
+ <ngt-mesh-reflector-material
272
+ ngtCompound
273
+ attach="material"
274
+ *ngIf="defines$ | ngtPush as defines"
275
+ [ref]="materialRef"
276
+ [defines]="defines"
277
+ [mirror]="reflectorProps.mirror"
278
+ [textureMatrix]="reflectorProps.textureMatrix"
279
+ [mixBlur]="reflectorProps.mixBlur"
280
+ [tDiffuse]="reflectorProps.tDiffuse"
281
+ [tDepth]="reflectorProps.tDepth"
282
+ [tDiffuseBlur]="reflectorProps.tDiffuseBlur"
283
+ [hasBlur]="reflectorProps.hasBlur"
284
+ [mixStrength]="reflectorProps.mixStrength"
285
+ [minDepthThreshold]="reflectorProps.minDepthThreshold"
286
+ [maxDepthThreshold]="reflectorProps.maxDepthThreshold"
287
+ [depthScale]="reflectorProps.depthScale"
288
+ [depthToBlurRatioBias]="reflectorProps.depthToBlurRatioBias"
289
+ [distortion]="reflectorProps.distortion"
290
+ [distortionMap]="reflectorProps.distortionMap"
291
+ [mixContrast]="reflectorProps.mixContrast"
292
+ >
293
+ <ng-content />
294
+ </ngt-mesh-reflector-material>
295
+ `,
296
+ imports: [NgtArgs, NgtPush, NgIf],
297
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
298
+ }]
299
+ }], ctorParameters: function () { return []; }, propDecorators: { materialRef: [{
300
+ type: Input
301
+ }], resolution: [{
302
+ type: Input
303
+ }], mixBlur: [{
304
+ type: Input
305
+ }], mixStrength: [{
306
+ type: Input
307
+ }], blur: [{
308
+ type: Input
309
+ }], mirror: [{
310
+ type: Input
311
+ }], minDepthThreshold: [{
312
+ type: Input
313
+ }], maxDepthThreshold: [{
314
+ type: Input
315
+ }], depthScale: [{
316
+ type: Input
317
+ }], depthToBlurRatioBias: [{
318
+ type: Input
319
+ }], distortionMap: [{
320
+ type: Input
321
+ }], distortion: [{
322
+ type: Input
323
+ }], mixContrast: [{
324
+ type: Input
325
+ }], reflectorOffset: [{
326
+ type: Input
327
+ }] } });
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9tYXRlcmlhbHMvc3JjL2xpYi9tZXNoLXJlZmxlY3Rvci1tYXRlcmlhbC9tZXNoLXJlZmxlY3Rvci1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFDSCxNQUFNLEVBQ04sYUFBYSxFQUNiLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osT0FBTyxFQUNQLE9BQU8sRUFFUCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGtCQUFrQixHQUNyQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDOztBQUUvQixNQUFNLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7QUFFbEMsTUFnQ2EseUJBQTBCLFNBQVEsVUFBVTtJQUdyRCxJQUFhLFVBQVUsQ0FBQyxVQUFrQjtRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsT0FBZTtRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBYSxXQUFXLENBQUMsV0FBbUI7UUFDeEMsSUFBSSxDQUFD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O1NBR3ZCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQWhDckMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsOEJBQThCO29CQUN4QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBeUJUO29CQUNELE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDcEM7MEVBRVksV0FBVztzQkFBbkIsS0FBSztnQkFFTyxVQUFVO3NCQUF0QixLQUFLO2dCQUlPLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQUlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBSU8saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxVQUFVO3NCQUF0QixLQUFLO2dCQUlPLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSztnQkFJTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIGluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgZXh0ZW5kLFxuICAgIGdldExvY2FsU3RhdGUsXG4gICAgaW5qZWN0QmVmb3JlUmVuZGVyLFxuICAgIGluamVjdE5ndFJlZixcbiAgICBOZ3RBcmdzLFxuICAgIE5ndFB1c2gsXG4gICAgTmd0UmVuZGVyU3RhdGUsXG4gICAgTmd0UnhTdG9yZSxcbiAgICBOZ3RTdG9yZSxcbiAgICBzdGFydFdpdGhVbmRlZmluZWQsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgQmx1clBhc3MsIE1lc2hSZWZsZWN0b3JNYXRlcmlhbCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgbWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5cbmV4dGVuZCh7IE1lc2hSZWZsZWN0b3JNYXRlcmlhbCB9KTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3RzLW1lc2gtcmVmbGVjdG9yLW1hdGVyaWFsJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZ3QtbWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWxcbiAgICAgICAgICAgIG5ndENvbXBvdW5kXG4gICAgICAgICAgICBhdHRhY2g9XCJtYXRlcmlhbFwiXG4gICAgICAgICAgICAqbmdJZj1cImRlZmluZXMkIHwgbmd0UHVzaCBhcyBkZWZpbmVzXCJcbiAgICAgICAgICAgIFtyZWZdPVwibWF0ZXJpYWxSZWZcIlxuICAgICAgICAgICAgW2RlZmluZXNdPVwiZGVmaW5lc1wiXG4gICAgICAgICAgICBbbWlycm9yXT1cInJlZmxlY3RvclByb3BzLm1pcnJvclwiXG4gICAgICAgICAgICBbdGV4dHVyZU1hdHJpeF09XCJyZWZsZWN0b3JQcm9wcy50ZXh0dXJlTWF0cml4XCJcbiAgICAgICAgICAgIFttaXhCbHVyXT1cInJlZmxlY3RvclByb3BzLm1peEJsdXJcIlxuICAgICAgICAgICAgW3REaWZmdXNlXT1cInJlZmxlY3RvclByb3BzLnREaWZmdXNlXCJcbiAgICAgICAgICAgIFt0RGVwdGhdPVwicmVmbGVjdG9yUHJvcHMudERlcHRoXCJcbiAgICAgICAgICAgIFt0RGlmZnVzZUJsdXJdPVwicmVmbGVjdG9yUHJvcHMudERpZmZ1c2VCbHVyXCJcbiAgICAgICAgICAgIFtoYXNCbHVyXT1cInJlZmxlY3RvclByb3BzLmhhc0JsdXJcIlxuICAgICAgICAgICAgW21peFN0cmVuZ3RoXT1cInJlZmxlY3RvclByb3BzLm1peFN0cmVuZ3RoXCJcbiAgICAgICAgICAgIFttaW5EZXB0aFRocmVzaG9sZF09XCJyZWZsZWN0b3JQcm9wcy5taW5EZXB0aFRocmVzaG9sZFwiXG4gICAgICAgICAgICBbbWF4RGVwdGhUaHJlc2hvbGRdPVwicmVmbGVjdG9yUHJvcHMubWF4RGVwdGhUaHJlc2hvbGRcIlxuICAgICAgICAgICAgW2RlcHRoU2NhbGVdPVwicmVmbGVjdG9yUHJvcHMuZGVwdGhTY2FsZVwiXG4gICAgICAgICAgICBbZGVwdGhUb0JsdXJSYXRpb0JpYXNdPVwicmVmbGVjdG9yUHJvcHMuZGVwdGhUb0JsdXJSYXRpb0JpYXNcIlxuICAgICAgICAgICAgW2Rpc3RvcnRpb25dPVwicmVmbGVjdG9yUHJvcHMuZGlzdG9ydGlvblwiXG4gICAgICAgICAgICBbZGlzdG9ydGlvbk1hcF09XCJyZWZsZWN0b3JQcm9wcy5kaXN0b3J0aW9uTWFwXCJcbiAgICAgICAgICAgIFttaXhDb250cmFzdF09XCJyZWZsZWN0b3JQcm9wcy5taXhDb250cmFzdFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgIDwvbmd0LW1lc2gtcmVmbGVjdG9yLW1hdGVyaWFsPlxuICAgIGAsXG4gICAgaW1wb3J0czogW05ndEFyZ3MsIE5ndFB1c2gsIE5nSWZdLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c01lc2hSZWZsZWN0b3JNYXRlcmlhbCBleHRlbmRzIE5ndFJ4U3RvcmUge1xuICAgIEBJbnB1dCgpIG1hdGVyaWFsUmVmID0gaW5qZWN0Tmd0UmVmPE1lc2hSZWZsZWN0b3JNYXRlcmlhbD4oKTtcblxuICAgIEBJbnB1dCgpIHNldCByZXNvbHV0aW9uKHJlc29sdXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJlc29sdXRpb24gfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1peEJsdXIobWl4Qmx1cjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWl4Qmx1ciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgbWl4U3RyZW5ndGgobWl4U3RyZW5ndGg6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1peFN0cmVuZ3RoIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBibHVyKGJsdXI6IFtudW1iZXIsIG51bWJlcl0gfCBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBibHVyIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtaXJyb3IobWlycm9yOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBtaXJyb3IgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1pbkRlcHRoVGhyZXNob2xkKG1pbkRlcHRoVGhyZXNob2xkOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBtaW5EZXB0aFRocmVzaG9sZCB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgbWF4RGVwdGhUaHJlc2hvbGQobWF4RGVwdGhUaHJlc2hvbGQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1heERlcHRoVGhyZXNob2xkIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBkZXB0aFNjYWxlKGRlcHRoU2NhbGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGRlcHRoU2NhbGUgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGRlcHRoVG9CbHVyUmF0aW9CaWFzKGRlcHRoVG9CbHVyUmF0aW9CaWFzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkZXB0aFRvQmx1clJhdGlvQmlhcyB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGlzdG9ydGlvbk1hcChkaXN0b3J0aW9uTWFwOiBUSFJFRS5UZXh0dXJlKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZGlzdG9ydGlvbk1hcCB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGlzdG9ydGlvbihkaXN0b3J0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkaXN0b3J0aW9uIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtaXhDb250cmFzdChtaXhDb250cmFzdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWl4Q29udHJhc3QgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHJlZmxlY3Rvck9mZnNldChyZWZsZWN0b3JPZmZzZXQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJlZmxlY3Rvck9mZnNldCB9KTtcbiAgICB9XG5cbiAgICByZWFkb25seSBkZWZpbmVzJCA9IHRoaXMuc2VsZWN0KCdyZWZsZWN0b3JFbnRpdGllcycsICdyZWZsZWN0b3JQcm9wcycsICdkZWZpbmVzJykucGlwZShkZWJvdW5jZVRpbWUoMCkpO1xuXG4gICAgZ2V0IHJlZmxlY3RvclByb3BzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ3JlZmxlY3RvckVudGl0aWVzJywgJ3JlZmxlY3RvclByb3BzJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvclBsYW5lID0gbmV3IFRIUkVFLlBsYW5lKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmbGVjdG9yV29ybGRQb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYW1lcmFXb3JsZFBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdGF0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvb2tBdFBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgLTEpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpcFBsYW5lID0gbmV3IFRIUkVFLlZlY3RvcjQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXcgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHEgPSBuZXcgVEhSRUUuVmVjdG9yNCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dHVyZU1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2aXJ0dWFsQ2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIG1peEJsdXI6IDAsXG4gICAgICAgICAgICBtaXhTdHJlbmd0aDogMSxcbiAgICAgICAgICAgIHJlc29sdXRpb246IDI1NixcbiAgICAgICAgICAgIGJsdXI6IFswLCAwXSxcbiAgICAgICAgICAgIG1pbkRlcHRoVGhyZXNob2xkOiAwLjksXG4gICAgICAgICAgICBtYXhEZXB0aFRocmVzaG9sZDogMSxcbiAgICAgICAgICAgIGRlcHRoU2NhbGU6IDAsXG4gICAgICAgICAgICBkZXB0aFRvQmx1clJhdGlvQmlhczogMC4yNSxcbiAgICAgICAgICAgIG1pcnJvcjogMCxcbiAgICAgICAgICAgIGRpc3RvcnRpb246IDEsXG4gICAgICAgICAgICBtaXhDb250cmFzdDogMSxcbiAgICAgICAgICAgIHJlZmxlY3Rvck9mZnNldDogMCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0KFxuICAgICAgICAgICAgJ25vcm1hbGl6ZWRCbHVyJyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KCdibHVyJykucGlwZShtYXAoKGJsdXIpID0+IChBcnJheS5pc0FycmF5KGJsdXIpID8gYmx1ciA6IFtibHVyLCBibHVyXSkpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbm5lY3QoJ2hhc0JsdXInLCB0aGlzLnNlbGVjdCgnbm9ybWFsaXplZEJsdXInKS5waXBlKG1hcCgoW3gsIHldKSA9PiB4ICsgeSA+IDApKSk7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdyZWZsZWN0b3JFbnRpdGllcycsXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdCgnZ2wnKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgnbm9ybWFsaXplZEJsdXInKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgncmVzb2x1dGlvbicpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KCdtaXJyb3InKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgnaGFzQmx1cicpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KCdtaXhCbHVyJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoJ21peFN0cmVuZ3RoJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoJ21pbkRlcHRoVGhyZXNob2xkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoJ21heERlcHRoVGhyZXNob2xkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoJ2RlcHRoU2NhbGUnKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgnZGVwdGhUb0JsdXJSYXRpb0JpYXMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgnZGlzdG9ydGlvbicpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KCdkaXN0b3J0aW9uTWFwJykucGlwZShzdGFydFdpdGhVbmRlZmluZWQoKSksXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoJ21peENvbnRyYXN0JyksXG4gICAgICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICAgICAgKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmx1cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNCbHVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWl4Qmx1cixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1peFN0cmVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhEZXB0aFRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoU2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aFRvQmx1clJhdGlvQmlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWl4Q29udHJhc3QsXG4gICAgICAgICAgICAgICAgICAgIF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IGdsLm91dHB1dEVuY29kaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRIUkVFLkhhbGZGbG9hdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmJvMSA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlclRhcmdldChyZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZibzEuZGVwdGhCdWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmJvMS5kZXB0aFRleHR1cmUgPSBuZXcgVEhSRUUuRGVwdGhUZXh0dXJlKHJlc29sdXRpb24sIHJlc29sdXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmJvMS5kZXB0aFRleHR1cmUuZm9ybWF0ID0gVEhSRUUuRGVwdGhGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYm8xLmRlcHRoVGV4dHVyZS50eXBlID0gVEhSRUUuVW5zaWduZWRTaG9ydFR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZibzIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQocmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmx1clswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJsdXJbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhTY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aFRvQmx1clJhdGlvQmlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdG9yUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVNYXRyaXg6IHRoaXMudGV4dHVyZU1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhCbHVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREaWZmdXNlOiBmYm8xLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdERlcHRoOiBmYm8xLmRlcHRoVGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGlmZnVzZUJsdXI6IGZibzIudGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCbHVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peFN0cmVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRlcHRoVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoU2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhUb0JsdXJSYXRpb0JpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peENvbnRyYXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0JMVVI6IGhhc0JsdXIgPyAnJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0RFUFRIOiBkZXB0aFNjYWxlID4gMCA/ICcnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfRElTVE9SVElPTjogZGlzdG9ydGlvbk1hcCA/ICcnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBmYm8xLCBmYm8yLCBibHVyUGFzcywgcmVmbGVjdG9yUHJvcHMgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpbmplY3RCZWZvcmVSZW5kZXIodGhpcy5vbkJlZm9yZVJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlZm9yZVJlbmRlcihzdGF0ZTogTmd0UmVuZGVyU3RhdGUpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0TG9jYWxTdGF0ZSh0aGlzLm1hdGVyaWFsUmVmLm5hdGl2ZUVsZW1lbnQpLnBhcmVudDtcbiAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IGNhbWVyYSB9ID0gc3RhdGU7XG5cbiAgICAgICAgdGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihwYXJlbnQubWF0cml4V29ybGQpO1xuICAgICAgICB0aGlzLmNhbWVyYVdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG4gICAgICAgIHRoaXMucm90YXRpb25NYXRyaXguZXh0cmFjdFJvdGF0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIHRoaXMubm9ybWFsLnNldCgwLCAwLCAxKTtcbiAgICAgICAgdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXg0KHRoaXMucm90YXRpb25NYXRyaXgpO1xuICAgICAgICB0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24uYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLCB0aGlzLmdldCgncmVmbGVjdG9yT2Zmc2V0JykpO1xuICAgICAgICB0aGlzLnZpZXcuc3ViVmVjdG9ycyh0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24sIHRoaXMuY2FtZXJhV29ybGRQb3NpdGlvbik7XG4gICAgICAgIC8vIEF2b2lkIHJlbmRlcmluZyB3aGVuIHJlZmxlY3RvciBpcyBmYWNpbmcgYXdheVxuICAgICAgICBpZiAodGhpcy52aWV3LmRvdCh0aGlzLm5vcm1hbCkgPiAwKSByZXR1cm47XG4gICAgICAgIHRoaXMudmlldy5yZWZsZWN0KHRoaXMubm9ybWFsKS5uZWdhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3LmFkZCh0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnJvdGF0aW9uTWF0cml4LmV4dHJhY3RSb3RhdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuICAgICAgICB0aGlzLmxvb2tBdFBvc2l0aW9uLnNldCgwLCAwLCAtMSk7XG4gICAgICAgIHRoaXMubG9va0F0UG9zaXRpb24uYXBwbHlNYXRyaXg0KHRoaXMucm90YXRpb25NYXRyaXgpO1xuICAgICAgICB0aGlzLmxvb2tBdFBvc2l0aW9uLmFkZCh0aGlzLmNhbWVyYVdvcmxkUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnRhcmdldC5zdWJWZWN0b3JzKHRoaXMucmVmbGVjdG9yV29ybGRQb3NpdGlvbiwgdGhpcy5sb29rQXRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlZmxlY3QodGhpcy5ub3JtYWwpLm5lZ2F0ZSgpO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGQodGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ2FtZXJhLnBvc2l0aW9uLmNvcHkodGhpcy52aWV3KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ2FtZXJhLnVwLnNldCgwLCAxLCAwKTtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ2FtZXJhLnVwLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ2FtZXJhLnVwLnJlZmxlY3QodGhpcy5ub3JtYWwpO1xuICAgICAgICB0aGlzLnZpcnR1YWxDYW1lcmEubG9va0F0KHRoaXMudGFyZ2V0KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7IC8vIFVzZWQgaW4gV2ViR0xCYWNrZ3JvdW5kXG4gICAgICAgIHRoaXMudmlydHVhbENhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuICAgICAgICB0aGlzLnZpcnR1YWxDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB0ZXh0dXJlIG1hdHJpeFxuICAgICAgICB0aGlzLnRleHR1cmVNYXRyaXguc2V0KDAuNSwgMC4wLCAwLjAsIDAuNSwgMC4wLCAwLjUsIDAuMCwgMC41LCAwLjAsIDAuMCwgMC41LCAwLjUsIDAuMCwgMC4wLCAwLjAsIDEuMCk7XG4gICAgICAgIHRoaXMudGV4dHVyZU1hdHJpeC5tdWx0aXBseSh0aGlzLnZpcnR1YWxDYW1lcmEucHJvamVjdGlvbk1hdHJpeCk7XG4gICAgICAgIHRoaXMudGV4dHVyZU1hdHJpeC5tdWx0aXBseSh0aGlzLnZpcnR1YWxDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlTWF0cml4Lm11bHRpcGx5KHBhcmVudC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIC8vIE5vdyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCBuZXcgY2xpcCBwbGFuZSwgaW1wbGVtZW50aW5nIGNvZGUgZnJvbTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS9vYmxpcXVlLmh0bWxcbiAgICAgICAgLy8gUGFwZXIgZXhwbGFpbmluZyB0aGlzIHRlY2huaXF1ZTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vbGVuZ3llbC9MZW5neWVsLU9ibGlxdWUucGRmXG4gICAgICAgIHRoaXMucmVmbGVjdG9yUGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodGhpcy5ub3JtYWwsIHRoaXMucmVmbGVjdG9yV29ybGRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yUGxhbmUuYXBwbHlNYXRyaXg0KHRoaXMudmlydHVhbENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuICAgICAgICB0aGlzLmNsaXBQbGFuZS5zZXQoXG4gICAgICAgICAgICB0aGlzLnJlZmxlY3RvclBsYW5lLm5vcm1hbC54LFxuICAgICAgICAgICAgdGhpcy5yZWZsZWN0b3JQbGFuZS5ub3JtYWwueSxcbiAgICAgICAgICAgIHRoaXMucmVmbGVjdG9yUGxhbmUubm9ybWFsLnosXG4gICAgICAgICAgICB0aGlzLnJlZmxlY3RvclBsYW5lLmNvbnN0YW50XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSB0aGlzLnZpcnR1YWxDYW1lcmEucHJvamVjdGlvbk1hdHJpeDtcbiAgICAgICAgdGhpcy5xLnggPSAoTWF0aC5zaWduKHRoaXMuY2xpcFBsYW5lLngpICsgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s4XSkgLyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzBdO1xuICAgICAgICB0aGlzLnEueSA9IChNYXRoLnNpZ24odGhpcy5jbGlwUGxhbmUueSkgKyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzldKSAvIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV07XG4gICAgICAgIHRoaXMucS56ID0gLTEuMDtcbiAgICAgICAgdGhpcy5xLncgPSAoMS4wICsgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sxMF0pIC8gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sxNF07XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHBsYW5lIHZlY3RvclxuICAgICAgICB0aGlzLmNsaXBQbGFuZS5tdWx0aXBseVNjYWxhcigyLjAgLyB0aGlzLmNsaXBQbGFuZS5kb3QodGhpcy5xKSk7XG4gICAgICAgIC8vIFJlcGxhY2luZyB0aGUgdGhpcmQgcm93IG9mIHRoZSBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzJdID0gdGhpcy5jbGlwUGxhbmUueDtcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s2XSA9IHRoaXMuY2xpcFBsYW5lLnk7XG4gICAgICAgIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMTBdID0gdGhpcy5jbGlwUGxhbmUueiArIDEuMDtcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sxNF0gPSB0aGlzLmNsaXBQbGFuZS53O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25CZWZvcmVSZW5kZXIoc3RhdGU6IE5ndFJlbmRlclN0YXRlKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXRlcmlhbFJlZi5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGdldExvY2FsU3RhdGUodGhpcy5tYXRlcmlhbFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnQ7XG4gICAgICAgIGlmICghcGFyZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgeyBnbCwgc2NlbmUgfSA9IHN0YXRlO1xuICAgICAgICBjb25zdCB7IGhhc0JsdXIgfSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHsgZmJvMSwgZmJvMiwgYmx1clBhc3MgfSA9IHRoaXMuZ2V0KCdyZWZsZWN0b3JFbnRpdGllcycpO1xuXG4gICAgICAgIGlmIChmYm8xICYmIGZibzIgJiYgYmx1clBhc3MpIHtcbiAgICAgICAgICAgIHBhcmVudC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50WHJFbmFibGVkID0gZ2wueHIuZW5hYmxlZDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaGFkb3dBdXRvVXBkYXRlID0gZ2wuc2hhZG93TWFwLmF1dG9VcGRhdGU7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZVJlbmRlcihzdGF0ZSk7XG4gICAgICAgICAgICBnbC54ci5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICBnbC5zaGFkb3dNYXAuYXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wuc2V0UmVuZGVyVGFyZ2V0KGZibzEpO1xuICAgICAgICAgICAgZ2wuc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKHRydWUpO1xuICAgICAgICAgICAgaWYgKCFnbC5hdXRvQ2xlYXIpIGdsLmNsZWFyKCk7XG4gICAgICAgICAgICBnbC5yZW5kZXIoc2NlbmUsIHRoaXMudmlydHVhbENhbWVyYSk7XG4gICAgICAgICAgICBpZiAoaGFzQmx1cikgYmx1clBhc3MucmVuZGVyKGdsLCBmYm8xLCBmYm8yKTtcbiAgICAgICAgICAgIGdsLnhyLmVuYWJsZWQgPSBjdXJyZW50WHJFbmFibGVkO1xuICAgICAgICAgICAgZ2wuc2hhZG93TWFwLmF1dG9VcGRhdGUgPSBjdXJyZW50U2hhZG93QXV0b1VwZGF0ZTtcbiAgICAgICAgICAgIHBhcmVudC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsLnNldFJlbmRlclRhcmdldChudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,158 @@
1
+ import { NgIf } from '@angular/common';
2
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Input } from '@angular/core';
3
+ import { extend, getLocalState, injectBeforeRender, injectNgtRef, NgtPush, NgtRxStore, NgtStore } from 'angular-three';
4
+ import { MeshRefractionMaterial } from 'angular-three-soba/shaders';
5
+ import { combineLatest, map } from 'rxjs';
6
+ import { MeshBVH, SAH } from 'three-mesh-bvh';
7
+ import * as i0 from "@angular/core";
8
+ extend({ MeshRefractionMaterial });
9
+ const isCubeTexture = (def) => def && def.isCubeTexture;
10
+ class NgtsMeshRefractionMaterial extends NgtRxStore {
11
+ /** Environment map */
12
+ set envMap(envMap) {
13
+ this.set({ envMap });
14
+ }
15
+ /** Number of ray-cast bounces, it can be expensive to have too many, 2 */
16
+ set bounces(bounces) {
17
+ this.set({ bounces });
18
+ }
19
+ /** Refraction index, 2.4 */
20
+ set ior(ior) {
21
+ this.set({ ior });
22
+ }
23
+ /** Fresnel (strip light), 0 */
24
+ set fresnel(fresnel) {
25
+ this.set({ fresnel });
26
+ }
27
+ /** RGB shift intensity, can be expensive, 0 */
28
+ set aberrationStrength(aberrationStrength) {
29
+ this.set({ aberrationStrength });
30
+ }
31
+ /** Color, white */
32
+ set color(color) {
33
+ this.set({ color });
34
+ }
35
+ /** If this is on it uses fewer ray casts for the RGB shift sacrificing physical accuracy, true */
36
+ set fastChroma(fastChroma) {
37
+ this.set({ fastChroma });
38
+ }
39
+ initialize() {
40
+ super.initialize();
41
+ this.set({
42
+ aberrationStrength: 0,
43
+ fastChroma: true,
44
+ });
45
+ }
46
+ constructor() {
47
+ super();
48
+ this.materialRef = injectNgtRef();
49
+ this.defines$ = this.select('defines');
50
+ this.store = inject(NgtStore);
51
+ this.connect('defines', combineLatest([this.select('aberrationStrength'), this.select('fastChroma'), this.select('envMap')]).pipe(map(([aberrationStrength, fastChroma, envMap]) => {
52
+ const temp = {};
53
+ // Sampler2D and SamplerCube need different defines
54
+ const isCubeMap = isCubeTexture(envMap);
55
+ const w = (isCubeMap ? envMap.image[0]?.width : envMap.image.width) ?? 1024;
56
+ const cubeSize = w / 4;
57
+ const _lodMax = Math.floor(Math.log2(cubeSize));
58
+ const _cubeSize = Math.pow(2, _lodMax);
59
+ const width = 3 * Math.max(_cubeSize, 16 * 7);
60
+ const height = 4 * _cubeSize;
61
+ if (isCubeMap)
62
+ temp['ENVMAP_TYPE_CUBEM'] = '';
63
+ temp['CUBEUV_TEXEL_WIDTH'] = `${1.0 / width}`;
64
+ temp['CUBEUV_TEXEL_HEIGHT'] = `${1.0 / height}`;
65
+ temp['CUBEUV_MAX_MIP'] = `${_lodMax}.0`;
66
+ // Add defines from chromatic aberration
67
+ if (aberrationStrength > 0)
68
+ temp['CHROMATIC_ABERRATIONS'] = '';
69
+ if (fastChroma)
70
+ temp['FAST_CHROMA'] = '';
71
+ return temp;
72
+ })));
73
+ this.connect('resolution', this.store.select('size').pipe(map((size) => [size.width, size.height])));
74
+ injectBeforeRender(({ camera }) => {
75
+ if (this.materialRef.nativeElement) {
76
+ this.materialRef.nativeElement.viewMatrixInverse = camera.matrixWorld;
77
+ this.materialRef.nativeElement.projectionMatrixInverse = camera.projectionMatrixInverse;
78
+ }
79
+ });
80
+ }
81
+ ngOnInit() {
82
+ this.setupGeometry();
83
+ }
84
+ setupGeometry() {
85
+ this.hold(this.materialRef.$, (material) => {
86
+ const geometry = getLocalState(material).parent?.geometry;
87
+ if (geometry) {
88
+ material.bvh.updateFrom(new MeshBVH(geometry.toNonIndexed(), { lazyGeneration: false, strategy: SAH }));
89
+ }
90
+ });
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsMeshRefractionMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsMeshRefractionMaterial, isStandalone: true, selector: "ngts-mesh-refraction-material", inputs: { materialRef: "materialRef", envMap: "envMap", bounces: "bounces", ior: "ior", fresnel: "fresnel", aberrationStrength: "aberrationStrength", color: "color", fastChroma: "fastChroma" }, usesInheritance: true, ngImport: i0, template: `
94
+ <ngt-mesh-refraction-material
95
+ *ngIf="defines$ | ngtPush as defines"
96
+ [ref]="materialRef"
97
+ [defines]="defines"
98
+ [resolution]="get('resolution')"
99
+ [aberrationStrength]="get('aberrationStrength')"
100
+ [envMap]="get('envMap')"
101
+ [bounces]="get('bounces')"
102
+ [ior]="get('ior')"
103
+ [fresnel]="get('fresnel')"
104
+ [color]="get('color')"
105
+ [fastChroma]="get('fastChroma')"
106
+ ngtCompound
107
+ attach="material"
108
+ >
109
+ <ng-content />
110
+ </ngt-mesh-refraction-material>
111
+ `, isInline: true, dependencies: [{ kind: "pipe", type: NgtPush, name: "ngtPush" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
112
+ }
113
+ export { NgtsMeshRefractionMaterial };
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsMeshRefractionMaterial, decorators: [{
115
+ type: Component,
116
+ args: [{
117
+ selector: 'ngts-mesh-refraction-material',
118
+ standalone: true,
119
+ template: `
120
+ <ngt-mesh-refraction-material
121
+ *ngIf="defines$ | ngtPush as defines"
122
+ [ref]="materialRef"
123
+ [defines]="defines"
124
+ [resolution]="get('resolution')"
125
+ [aberrationStrength]="get('aberrationStrength')"
126
+ [envMap]="get('envMap')"
127
+ [bounces]="get('bounces')"
128
+ [ior]="get('ior')"
129
+ [fresnel]="get('fresnel')"
130
+ [color]="get('color')"
131
+ [fastChroma]="get('fastChroma')"
132
+ ngtCompound
133
+ attach="material"
134
+ >
135
+ <ng-content />
136
+ </ngt-mesh-refraction-material>
137
+ `,
138
+ imports: [NgtPush, NgIf],
139
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
140
+ }]
141
+ }], ctorParameters: function () { return []; }, propDecorators: { materialRef: [{
142
+ type: Input
143
+ }], envMap: [{
144
+ type: Input
145
+ }], bounces: [{
146
+ type: Input
147
+ }], ior: [{
148
+ type: Input
149
+ }], fresnel: [{
150
+ type: Input
151
+ }], aberrationStrength: [{
152
+ type: Input
153
+ }], color: [{
154
+ type: Input
155
+ }], fastChroma: [{
156
+ type: Input
157
+ }] } });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvbWF0ZXJpYWxzL3NyYy9saWIvbWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUU5QyxNQUFNLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7QUFFbkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFzQyxFQUE0QixFQUFFLENBQ3ZGLEdBQUcsSUFBSyxHQUF5QixDQUFDLGFBQWEsQ0FBQztBQUVwRCxNQXlCYSwwQkFBMkIsU0FBUSxVQUFVO0lBRXRELHNCQUFzQjtJQUN0QixJQUFhLE1BQU0sQ0FBQyxNQUF5QztRQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsMEVBQTBFO0lBQzFFLElBQWEsT0FBTyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxDQUFDLEdBQUcs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QUFNLEVBQUUsUUFBUSxDQUFDO1lBQzFELElBQUksUUFBUSxFQUFFO2dCQUNULFFBQWdCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDNUIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFTLENBQUMsQ0FDeEYsQ0FBQzthQUNMO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQTVGUSwwQkFBMEI7a0dBQTFCLDBCQUEwQixrVEF0QnpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQlQsdURBQ1MsT0FBTyxnREFBRSxJQUFJOztTQUdkLDBCQUEwQjsyRkFBMUIsMEJBQTBCO2tCQXpCdEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsK0JBQStCO29CQUN6QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQlQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztvQkFDeEIsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ3BDOzBFQUVZLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRU8sTUFBTTtzQkFBbEIsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLEdBQUc7c0JBQWYsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLGtCQUFrQjtzQkFBOUIsS0FBSztnQkFJTyxLQUFLO3NCQUFqQixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgaW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGdldExvY2FsU3RhdGUsIGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0Tmd0UmVmLCBOZ3RQdXNoLCBOZ3RSeFN0b3JlLCBOZ3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTWVzaFJlZnJhY3Rpb25NYXRlcmlhbCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVzaEJWSCwgU0FIIH0gZnJvbSAndGhyZWUtbWVzaC1idmgnO1xuXG5leHRlbmQoeyBNZXNoUmVmcmFjdGlvbk1hdGVyaWFsIH0pO1xuXG5jb25zdCBpc0N1YmVUZXh0dXJlID0gKGRlZjogVEhSRUUuQ3ViZVRleHR1cmUgfCBUSFJFRS5UZXh0dXJlKTogZGVmIGlzIFRIUkVFLkN1YmVUZXh0dXJlID0+XG4gICAgZGVmICYmIChkZWYgYXMgVEhSRUUuQ3ViZVRleHR1cmUpLmlzQ3ViZVRleHR1cmU7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWxcbiAgICAgICAgICAgICpuZ0lmPVwiZGVmaW5lcyQgfCBuZ3RQdXNoIGFzIGRlZmluZXNcIlxuICAgICAgICAgICAgW3JlZl09XCJtYXRlcmlhbFJlZlwiXG4gICAgICAgICAgICBbZGVmaW5lc109XCJkZWZpbmVzXCJcbiAgICAgICAgICAgIFtyZXNvbHV0aW9uXT1cImdldCgncmVzb2x1dGlvbicpXCJcbiAgICAgICAgICAgIFthYmVycmF0aW9uU3RyZW5ndGhdPVwiZ2V0KCdhYmVycmF0aW9uU3RyZW5ndGgnKVwiXG4gICAgICAgICAgICBbZW52TWFwXT1cImdldCgnZW52TWFwJylcIlxuICAgICAgICAgICAgW2JvdW5jZXNdPVwiZ2V0KCdib3VuY2VzJylcIlxuICAgICAgICAgICAgW2lvcl09XCJnZXQoJ2lvcicpXCJcbiAgICAgICAgICAgIFtmcmVzbmVsXT1cImdldCgnZnJlc25lbCcpXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJnZXQoJ2NvbG9yJylcIlxuICAgICAgICAgICAgW2Zhc3RDaHJvbWFdPVwiZ2V0KCdmYXN0Q2hyb21hJylcIlxuICAgICAgICAgICAgbmd0Q29tcG91bmRcbiAgICAgICAgICAgIGF0dGFjaD1cIm1hdGVyaWFsXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgPC9uZ3QtbWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsPlxuICAgIGAsXG4gICAgaW1wb3J0czogW05ndFB1c2gsIE5nSWZdLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c01lc2hSZWZyYWN0aW9uTWF0ZXJpYWwgZXh0ZW5kcyBOZ3RSeFN0b3JlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBtYXRlcmlhbFJlZiA9IGluamVjdE5ndFJlZjxJbnN0YW5jZVR5cGU8dHlwZW9mIE1lc2hSZWZyYWN0aW9uTWF0ZXJpYWw+PigpO1xuICAgIC8qKiBFbnZpcm9ubWVudCBtYXAgKi9cbiAgICBASW5wdXQoKSBzZXQgZW52TWFwKGVudk1hcDogVEhSRUUuQ3ViZVRleHR1cmUgfCBUSFJFRS5UZXh0dXJlKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZW52TWFwIH0pO1xuICAgIH1cbiAgICAvKiogTnVtYmVyIG9mIHJheS1jYXN0IGJvdW5jZXMsIGl0IGNhbiBiZSBleHBlbnNpdmUgdG8gaGF2ZSB0b28gbWFueSwgMiAqL1xuICAgIEBJbnB1dCgpIHNldCBib3VuY2VzKGJvdW5jZXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJvdW5jZXMgfSk7XG4gICAgfVxuICAgIC8qKiBSZWZyYWN0aW9uIGluZGV4LCAyLjQgKi9cbiAgICBASW5wdXQoKSBzZXQgaW9yKGlvcjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgaW9yIH0pO1xuICAgIH1cbiAgICAvKiogRnJlc25lbCAoc3RyaXAgbGlnaHQpLCAwICovXG4gICAgQElucHV0KCkgc2V0IGZyZXNuZWwoZnJlc25lbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZnJlc25lbCB9KTtcbiAgICB9XG4gICAgLyoqIFJHQiBzaGlmdCBpbnRlbnNpdHksIGNhbiBiZSBleHBlbnNpdmUsIDAgKi9cbiAgICBASW5wdXQoKSBzZXQgYWJlcnJhdGlvblN0cmVuZ3RoKGFiZXJyYXRpb25TdHJlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYWJlcnJhdGlvblN0cmVuZ3RoIH0pO1xuICAgIH1cbiAgICAvKiogQ29sb3IsIHdoaXRlICovXG4gICAgQElucHV0KCkgc2V0IGNvbG9yKGNvbG9yOiBUSFJFRS5Db2xvclJlcHJlc2VudGF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29sb3IgfSk7XG4gICAgfVxuICAgIC8qKiBJZiB0aGlzIGlzIG9uIGl0IHVzZXMgZmV3ZXIgcmF5IGNhc3RzIGZvciB0aGUgUkdCIHNoaWZ0IHNhY3JpZmljaW5nIHBoeXNpY2FsIGFjY3VyYWN5LCB0cnVlICovXG4gICAgQElucHV0KCkgc2V0IGZhc3RDaHJvbWEoZmFzdENocm9tYTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGZhc3RDaHJvbWEgfSk7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgZGVmaW5lcyQgPSB0aGlzLnNlbGVjdCgnZGVmaW5lcycpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGFiZXJyYXRpb25TdHJlbmd0aDogMCxcbiAgICAgICAgICAgIGZhc3RDaHJvbWE6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbm5lY3QoXG4gICAgICAgICAgICAnZGVmaW5lcycsXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdCgnYWJlcnJhdGlvblN0cmVuZ3RoJyksIHRoaXMuc2VsZWN0KCdmYXN0Q2hyb21hJyksIHRoaXMuc2VsZWN0KCdlbnZNYXAnKV0pLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChbYWJlcnJhdGlvblN0cmVuZ3RoLCBmYXN0Q2hyb21hLCBlbnZNYXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSB7fSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGVyMkQgYW5kIFNhbXBsZXJDdWJlIG5lZWQgZGlmZmVyZW50IGRlZmluZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDdWJlTWFwID0gaXNDdWJlVGV4dHVyZShlbnZNYXApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3ID0gKGlzQ3ViZU1hcCA/IGVudk1hcC5pbWFnZVswXT8ud2lkdGggOiBlbnZNYXAuaW1hZ2Uud2lkdGgpID8/IDEwMjQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1YmVTaXplID0gdyAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9sb2RNYXggPSBNYXRoLmZsb29yKE1hdGgubG9nMihjdWJlU2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfY3ViZVNpemUgPSBNYXRoLnBvdygyLCBfbG9kTWF4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSAzICogTWF0aC5tYXgoX2N1YmVTaXplLCAxNiAqIDcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSA0ICogX2N1YmVTaXplO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDdWJlTWFwKSB0ZW1wWydFTlZNQVBfVFlQRV9DVUJFTSddID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBbJ0NVQkVVVl9URVhFTF9XSURUSCddID0gYCR7MS4wIC8gd2lkdGh9YDtcbiAgICAgICAgICAgICAgICAgICAgdGVtcFsnQ1VCRVVWX1RFWEVMX0hFSUdIVCddID0gYCR7MS4wIC8gaGVpZ2h0fWA7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBbJ0NVQkVVVl9NQVhfTUlQJ10gPSBgJHtfbG9kTWF4fS4wYDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGRlZmluZXMgZnJvbSBjaHJvbWF0aWMgYWJlcnJhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWJlcnJhdGlvblN0cmVuZ3RoID4gMCkgdGVtcFsnQ0hST01BVElDX0FCRVJSQVRJT05TJ10gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RDaHJvbWEpIHRlbXBbJ0ZBU1RfQ0hST01BJ10gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0KCdyZXNvbHV0aW9uJywgdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKS5waXBlKG1hcCgoc2l6ZSkgPT4gW3NpemUud2lkdGgsIHNpemUuaGVpZ2h0XSkpKTtcblxuICAgICAgICBpbmplY3RCZWZvcmVSZW5kZXIoKHsgY2FtZXJhIH0pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGVyaWFsUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5tYXRlcmlhbFJlZi5uYXRpdmVFbGVtZW50IGFzIGFueSkhLnZpZXdNYXRyaXhJbnZlcnNlID0gY2FtZXJhLm1hdHJpeFdvcmxkO1xuICAgICAgICAgICAgICAgICh0aGlzLm1hdGVyaWFsUmVmLm5hdGl2ZUVsZW1lbnQgYXMgYW55KSEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldHVwR2VvbWV0cnkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwR2VvbWV0cnkoKSB7XG4gICAgICAgIHRoaXMuaG9sZCh0aGlzLm1hdGVyaWFsUmVmLiQsIChtYXRlcmlhbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBnZXRMb2NhbFN0YXRlKG1hdGVyaWFsKS5wYXJlbnQ/Lmdlb21ldHJ5O1xuICAgICAgICAgICAgaWYgKGdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgKG1hdGVyaWFsIGFzIGFueSkuYnZoLnVwZGF0ZUZyb20oXG4gICAgICAgICAgICAgICAgICAgIG5ldyBNZXNoQlZIKGdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpLCB7IGxhenlHZW5lcmF0aW9uOiBmYWxzZSwgc3RyYXRlZ3k6IFNBSCB9IGFzIGFueSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=