angular-three-soba 2.0.0-beta.2 → 2.0.0-beta.21

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 (321) hide show
  1. package/abstractions/billboard/billboard.d.ts +11 -7
  2. package/abstractions/detailed/detailed.d.ts +26 -0
  3. package/abstractions/edges/edges.d.ts +24 -12
  4. package/abstractions/grid/grid.d.ts +50 -0
  5. package/abstractions/index.d.ts +2 -7
  6. package/abstractions/text/text.d.ts +10 -5
  7. package/abstractions/text-3d/text-3d.d.ts +51 -41
  8. package/cameras/camera/camera-content.d.ts +1 -1
  9. package/cameras/camera/camera.d.ts +16 -13
  10. package/cameras/cube-camera/cube-camera.d.ts +50 -23
  11. package/cameras/index.d.ts +0 -1
  12. package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
  13. package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
  14. package/controls/orbit-controls/orbit-controls.d.ts +31 -12
  15. package/esm2022/abstractions/billboard/billboard.mjs +36 -33
  16. package/esm2022/abstractions/detailed/detailed.mjs +64 -0
  17. package/esm2022/abstractions/edges/edges.mjs +58 -63
  18. package/esm2022/abstractions/grid/grid.mjs +180 -0
  19. package/esm2022/abstractions/index.mjs +3 -8
  20. package/esm2022/abstractions/text/text.mjs +123 -124
  21. package/esm2022/abstractions/text-3d/text-3d.mjs +120 -115
  22. package/esm2022/cameras/camera/camera-content.mjs +6 -6
  23. package/esm2022/cameras/camera/camera.mjs +48 -42
  24. package/esm2022/cameras/cube-camera/cube-camera.mjs +129 -99
  25. package/esm2022/cameras/index.mjs +1 -2
  26. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
  27. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
  28. package/esm2022/controls/orbit-controls/orbit-controls.mjs +105 -85
  29. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
  30. package/esm2022/gizmos/gizmo-helper/gizmo-helper.mjs +197 -0
  31. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/constants.mjs +31 -0
  32. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +93 -0
  33. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +150 -0
  34. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.mjs +66 -0
  35. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +71 -0
  36. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
  37. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +272 -0
  38. package/esm2022/gizmos/index.mjs +4 -0
  39. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +3 -6
  40. package/esm2022/loaders/loader/loader.mjs +92 -87
  41. package/esm2022/loaders/progress/progress.mjs +29 -29
  42. package/esm2022/loaders/texture-loader/texture-loader.mjs +4 -4
  43. package/esm2022/materials/index.mjs +2 -1
  44. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
  45. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
  46. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +102 -99
  47. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +167 -146
  48. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
  49. package/esm2022/materials/point-material/point-material.mjs +50 -0
  50. package/esm2022/misc/animations/animations.mjs +36 -32
  51. package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
  52. package/esm2022/misc/caustics/caustics.mjs +387 -0
  53. package/esm2022/misc/decal/decal.mjs +187 -0
  54. package/esm2022/misc/depth-buffer/depth-buffer.mjs +33 -35
  55. package/esm2022/misc/example/example.mjs +160 -0
  56. package/esm2022/misc/fbo/fbo.mjs +35 -35
  57. package/esm2022/misc/html/html-wrapper.mjs +478 -0
  58. package/esm2022/misc/html/html.mjs +304 -0
  59. package/esm2022/misc/index.mjs +10 -1
  60. package/esm2022/misc/sampler/sampler.mjs +142 -0
  61. package/esm2022/misc/shadow/shadow.mjs +111 -0
  62. package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
  63. package/esm2022/misc/trail/trail.mjs +209 -0
  64. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
  65. package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
  66. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
  67. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
  68. package/esm2022/modifiers/index.mjs +2 -0
  69. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
  70. package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
  71. package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
  72. package/esm2022/performances/index.mjs +8 -0
  73. package/esm2022/performances/instances/instances.mjs +220 -0
  74. package/esm2022/performances/instances/position-mesh.mjs +52 -0
  75. package/esm2022/performances/points/points-input.mjs +64 -0
  76. package/esm2022/performances/points/points.mjs +326 -0
  77. package/esm2022/performances/points/position-point.mjs +54 -0
  78. package/esm2022/performances/segments/segment-object.mjs +9 -0
  79. package/esm2022/performances/segments/segments.mjs +182 -0
  80. package/esm2022/shaders/blur-pass/blur-pass.mjs +2 -2
  81. package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
  82. package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
  83. package/esm2022/shaders/convolution-material/convolution-material.mjs +1 -1
  84. package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
  85. package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
  86. package/esm2022/shaders/index.mjs +6 -3
  87. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
  88. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +2 -2
  89. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +2 -2
  90. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +4 -4
  91. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
  92. package/esm2022/shaders/shader-material/shader-material.mjs +1 -1
  93. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +17 -25
  94. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
  95. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +7 -7
  96. package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
  97. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
  98. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +160 -176
  99. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +1 -1
  100. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +126 -128
  101. package/esm2022/staging/backdrop/backdrop.mjs +77 -0
  102. package/esm2022/staging/bb-anchor/bb-anchor.mjs +69 -0
  103. package/esm2022/staging/bounds/bounds.mjs +144 -143
  104. package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
  105. package/esm2022/staging/center/center.mjs +129 -112
  106. package/esm2022/staging/cloud/cloud.mjs +118 -124
  107. package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -134
  108. package/esm2022/staging/environment/assets.mjs +12 -12
  109. package/esm2022/staging/environment/environment-cube.mjs +28 -30
  110. package/esm2022/staging/environment/environment-ground.mjs +17 -19
  111. package/esm2022/staging/environment/environment-input.mjs +98 -85
  112. package/esm2022/staging/environment/environment-map.mjs +33 -33
  113. package/esm2022/staging/environment/environment-portal.mjs +75 -97
  114. package/esm2022/staging/environment/environment.mjs +34 -51
  115. package/esm2022/staging/environment/utils.mjs +37 -15
  116. package/esm2022/staging/float/float.mjs +70 -58
  117. package/esm2022/staging/index.mjs +7 -3
  118. package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
  119. package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
  120. package/esm2022/staging/sky/sky.mjs +85 -80
  121. package/esm2022/staging/sparkles/sparkles.mjs +108 -105
  122. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
  123. package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
  124. package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
  125. package/esm2022/staging/spot-light/spot-light.mjs +51 -64
  126. package/esm2022/staging/spot-light/volumetric-mesh.mjs +67 -70
  127. package/esm2022/staging/stage/stage.mjs +305 -290
  128. package/esm2022/staging/stars/stars.mjs +101 -102
  129. package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
  130. package/esm2022/staging/wireframe/wireframe.mjs +228 -0
  131. package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
  132. package/esm2022/utils/content/content.mjs +15 -0
  133. package/esm2022/utils/index.mjs +2 -0
  134. package/fesm2022/angular-three-soba-abstractions.mjs +514 -1947
  135. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  136. package/fesm2022/angular-three-soba-cameras.mjs +302 -259
  137. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  138. package/fesm2022/angular-three-soba-controls.mjs +104 -83
  139. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  140. package/fesm2022/angular-three-soba-gizmos.mjs +1043 -0
  141. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
  142. package/fesm2022/angular-three-soba-loaders.mjs +121 -117
  143. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  144. package/fesm2022/angular-three-soba-materials.mjs +662 -592
  145. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  146. package/fesm2022/angular-three-soba-misc.mjs +2214 -105
  147. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  148. package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
  149. package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
  150. package/fesm2022/angular-three-soba-performances.mjs +956 -0
  151. package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
  152. package/fesm2022/angular-three-soba-shaders.mjs +549 -252
  153. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  154. package/fesm2022/angular-three-soba-staging.mjs +2899 -2563
  155. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  156. package/fesm2022/angular-three-soba-utils.mjs +22 -0
  157. package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
  158. package/gizmos/README.md +3 -0
  159. package/gizmos/gizmo-helper/gizmo-helper.d.ts +69 -0
  160. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +22 -0
  161. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +29 -0
  162. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.d.ts +33 -0
  163. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +10 -0
  164. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +40 -0
  165. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +30 -0
  166. package/gizmos/index.d.ts +3 -0
  167. package/loaders/gltf-loader/gltf-loader.d.ts +4 -3
  168. package/loaders/loader/loader.d.ts +19 -17
  169. package/loaders/progress/progress.d.ts +1 -1
  170. package/loaders/texture-loader/texture-loader.d.ts +2 -2
  171. package/materials/index.d.ts +1 -0
  172. package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
  173. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
  174. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
  175. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
  176. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
  177. package/materials/point-material/point-material.d.ts +24 -0
  178. package/metadata.json +1 -0
  179. package/misc/animations/animations.d.ts +6 -4
  180. package/misc/caustics/caustics.d.ts +87 -0
  181. package/misc/decal/decal.d.ts +49 -0
  182. package/misc/depth-buffer/depth-buffer.d.ts +2 -2
  183. package/misc/example/example.d.ts +81 -0
  184. package/misc/fbo/fbo.d.ts +2 -2
  185. package/misc/html/html-wrapper.d.ts +559 -0
  186. package/misc/html/html.d.ts +214 -0
  187. package/misc/index.d.ts +9 -0
  188. package/misc/sampler/sampler.d.ts +67 -0
  189. package/misc/shadow/shadow.d.ts +37 -0
  190. package/misc/stats-gl/stats-gl.d.ts +24 -0
  191. package/misc/trail/trail.d.ts +57 -0
  192. package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
  193. package/misc/trail-texture/trail-texture.d.ts +50 -0
  194. package/modifiers/README.md +3 -0
  195. package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
  196. package/modifiers/index.d.ts +1 -0
  197. package/package.json +31 -16
  198. package/performances/README.md +3 -0
  199. package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
  200. package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
  201. package/performances/index.d.ts +7 -0
  202. package/performances/instances/instances.d.ts +79 -0
  203. package/{performance → performances}/instances/position-mesh.d.ts +1 -1
  204. package/performances/points/points-input.d.ts +32 -0
  205. package/performances/points/points.d.ts +92 -0
  206. package/performances/points/position-point.d.ts +11 -0
  207. package/performances/segments/segment-object.d.ts +7 -0
  208. package/performances/segments/segments.d.ts +124 -0
  209. package/shaders/grid-material/grid-material.d.ts +37 -0
  210. package/shaders/index.d.ts +5 -2
  211. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +147 -2
  212. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  213. package/shaders/shader-material/shader-material.d.ts +2 -2
  214. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
  215. package/shaders/sparkles-material/sparkles-material.d.ts +15 -1
  216. package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
  217. package/shaders/star-field-material/star-field-material.d.ts +11 -1
  218. package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
  219. package/staging/accumulative-shadows/accumulative-shadows.d.ts +89 -39
  220. package/staging/accumulative-shadows/randomized-lights.d.ts +40 -27
  221. package/staging/backdrop/backdrop.d.ts +30 -0
  222. package/staging/bb-anchor/bb-anchor.d.ts +27 -0
  223. package/staging/bounds/bounds.d.ts +100 -24
  224. package/staging/camera-shake/camera-shake.d.ts +30 -19
  225. package/staging/center/center.d.ts +43 -35
  226. package/staging/cloud/cloud.d.ts +26 -23
  227. package/staging/contact-shadows/contact-shadows.d.ts +41 -28
  228. package/staging/environment/assets.d.ts +9 -9
  229. package/staging/environment/environment-cube.d.ts +9 -5
  230. package/staging/environment/environment-ground.d.ts +7 -7
  231. package/staging/environment/environment-input.d.ts +37 -37
  232. package/staging/environment/environment-map.d.ts +10 -5
  233. package/staging/environment/environment-portal.d.ts +10 -5
  234. package/staging/environment/environment.d.ts +0 -4
  235. package/staging/environment/utils.d.ts +2 -2
  236. package/staging/float/float.d.ts +14 -10
  237. package/staging/index.d.ts +6 -2
  238. package/staging/matcap-texture/matcap-texture.d.ts +13 -0
  239. package/staging/normal-texture/normal-texture.d.ts +16 -0
  240. package/staging/sky/sky.d.ts +28 -21
  241. package/staging/sparkles/sparkles.d.ts +36 -22
  242. package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
  243. package/staging/spot-light/shadow-mesh.d.ts +37 -0
  244. package/staging/spot-light/spot-light-input.d.ts +25 -25
  245. package/staging/spot-light/spot-light.d.ts +31 -15
  246. package/staging/spot-light/volumetric-mesh.d.ts +15 -9
  247. package/staging/stage/stage.d.ts +89 -65
  248. package/staging/stars/stars.d.ts +28 -17
  249. package/staging/wireframe/wireframe-input.d.ts +65 -0
  250. package/staging/wireframe/wireframe.d.ts +28 -0
  251. package/utils/README.md +3 -0
  252. package/utils/content/content.d.ts +8 -0
  253. package/utils/index.d.ts +1 -0
  254. package/web-types.json +1 -0
  255. package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
  256. package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
  257. package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
  258. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
  259. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
  260. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
  261. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
  262. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
  263. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
  264. package/abstractions/line/line-input.d.ts +0 -42
  265. package/abstractions/line/line.d.ts +0 -35
  266. package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
  267. package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
  268. package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
  269. package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
  270. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  271. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
  272. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
  273. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
  274. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
  275. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
  276. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
  277. package/esm2022/abstractions/line/line-input.mjs +0 -113
  278. package/esm2022/abstractions/line/line.mjs +0 -165
  279. package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
  280. package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
  281. package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
  282. package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
  283. package/esm2022/performance/detailed/detailed.mjs +0 -61
  284. package/esm2022/performance/index.mjs +0 -7
  285. package/esm2022/performance/instances/instance.mjs +0 -48
  286. package/esm2022/performance/instances/instances.mjs +0 -189
  287. package/esm2022/performance/instances/position-mesh.mjs +0 -52
  288. package/esm2022/performance/stats/stats.mjs +0 -79
  289. package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
  290. package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
  291. package/esm2022/staging/caustics/caustisc.mjs +0 -384
  292. package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
  293. package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -256
  294. package/fesm2022/angular-three-soba-performance.mjs +0 -487
  295. package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
  296. package/performance/README.md +0 -3
  297. package/performance/adaptive/adaptive-dpr.d.ts +0 -8
  298. package/performance/detailed/detailed.d.ts +0 -20
  299. package/performance/index.d.ts +0 -6
  300. package/performance/instances/instance.d.ts +0 -9
  301. package/performance/instances/instances.d.ts +0 -35
  302. package/performance/stats/stats.d.ts +0 -18
  303. package/plugin/generators.json +0 -19
  304. package/plugin/libs/plugin/README.md +0 -11
  305. package/plugin/package.json +0 -9
  306. package/plugin/src/generators/init/compat.d.ts +0 -2
  307. package/plugin/src/generators/init/compat.js +0 -6
  308. package/plugin/src/generators/init/compat.js.map +0 -1
  309. package/plugin/src/generators/init/init.d.ts +0 -4
  310. package/plugin/src/generators/init/init.js +0 -22
  311. package/plugin/src/generators/init/init.js.map +0 -1
  312. package/plugin/src/generators/init/schema.json +0 -6
  313. package/plugin/src/index.d.ts +0 -1
  314. package/plugin/src/index.js +0 -6
  315. package/plugin/src/index.js.map +0 -1
  316. package/staging/caustics/caustisc.d.ts +0 -70
  317. package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
  318. package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
  319. /package/{abstractions → gizmos}/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -0
  320. /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
  321. /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
@@ -0,0 +1,478 @@
1
+ var _a;
2
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
3
+ import { Component, ElementRef, EmbeddedViewRef, TemplateRef, ViewChild, ViewContainerRef, computed, effect, inject, untracked, } from '@angular/core';
4
+ import { HTML, injectBeforeRender, injectNgtStore, is, safeDetectChanges } from 'angular-three';
5
+ import * as THREE from 'three';
6
+ import { injectNgtsHtmlInputs } from './html';
7
+ import * as i0 from "@angular/core";
8
+ const v1 = new THREE.Vector3();
9
+ const v2 = new THREE.Vector3();
10
+ const v3 = new THREE.Vector3();
11
+ export function defaultCalculatePosition(el, camera, size) {
12
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
13
+ objectPos.project(camera);
14
+ const widthHalf = size.width / 2;
15
+ const heightHalf = size.height / 2;
16
+ return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
17
+ }
18
+ function isObjectBehindCamera(el, camera) {
19
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
20
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
21
+ const deltaCamObj = objectPos.sub(cameraPos);
22
+ const camDir = camera.getWorldDirection(v3);
23
+ return deltaCamObj.angleTo(camDir) > Math.PI / 2;
24
+ }
25
+ function isObjectVisible(el, camera, raycaster, occlude) {
26
+ const elPos = v1.setFromMatrixPosition(el.matrixWorld);
27
+ const screenPos = elPos.clone();
28
+ screenPos.project(camera);
29
+ raycaster.setFromCamera(screenPos, camera);
30
+ const intersects = raycaster.intersectObjects(occlude, true);
31
+ if (intersects.length) {
32
+ const intersectionDistance = intersects[0].distance;
33
+ const pointDistance = elPos.distanceTo(raycaster.ray.origin);
34
+ return pointDistance < intersectionDistance;
35
+ }
36
+ return true;
37
+ }
38
+ function objectScale(el, camera) {
39
+ if (camera instanceof THREE.OrthographicCamera) {
40
+ return camera.zoom;
41
+ }
42
+ else if (camera instanceof THREE.PerspectiveCamera) {
43
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
44
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
45
+ const vFOV = (camera.fov * Math.PI) / 180;
46
+ const dist = objectPos.distanceTo(cameraPos);
47
+ const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
48
+ return 1 / scaleFOV;
49
+ }
50
+ else {
51
+ return 1;
52
+ }
53
+ }
54
+ function objectZIndex(el, camera, zIndexRange) {
55
+ if (camera instanceof THREE.PerspectiveCamera || camera instanceof THREE.OrthographicCamera) {
56
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
57
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
58
+ const dist = objectPos.distanceTo(cameraPos);
59
+ const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
60
+ const B = zIndexRange[1] - A * camera.far;
61
+ return Math.round(A * dist + B);
62
+ }
63
+ return undefined;
64
+ }
65
+ const epsilon = (value) => (Math.abs(value) < 1e-10 ? 0 : value);
66
+ function getCSSMatrix(matrix, multipliers, prepend = '') {
67
+ let matrix3d = 'matrix3d(';
68
+ for (let i = 0; i !== 16; i++) {
69
+ matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
70
+ }
71
+ return prepend + matrix3d;
72
+ }
73
+ const getCameraCSSMatrix = ((multipliers) => {
74
+ return (matrix) => getCSSMatrix(matrix, multipliers);
75
+ })([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
76
+ const getObjectCSSMatrix = ((scaleMultipliers) => {
77
+ return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
78
+ })((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
79
+ export class NgtsHtmlWrapper {
80
+ static { _a = HTML; }
81
+ static { this[_a] = true; }
82
+ constructor() {
83
+ this.htmlInputs = injectNgtsHtmlInputs();
84
+ this.store = injectNgtStore();
85
+ this.gl = this.store.select('gl');
86
+ this.connected = this.store.select('events', 'connected', { equal: Object.is });
87
+ this.viewport = this.store.select('viewport');
88
+ this.scene = this.store.select('scene');
89
+ this.camera = this.store.select('camera');
90
+ this.size = this.store.select('size');
91
+ this.raycaster = this.store.select('raycaster');
92
+ this.isMeshSizeSet = false;
93
+ this.document = inject(DOCUMENT);
94
+ this.vcr = inject(ViewContainerRef);
95
+ this.portalElement = computed(() => {
96
+ const portal = this.htmlInputs.portal();
97
+ if (!portal)
98
+ return null;
99
+ return is.ref(portal) ? portal.nativeElement : portal;
100
+ });
101
+ this.element = computed(() => this.document.createElement(this.htmlInputs.as()));
102
+ this.target = computed(() => {
103
+ const portalElement = this.portalElement();
104
+ if (portalElement)
105
+ return portalElement;
106
+ const connected = this.connected();
107
+ if (connected)
108
+ return connected;
109
+ return this.gl().domElement.parentElement;
110
+ });
111
+ this.styles = computed(() => {
112
+ const [style, center, transform, size, fullscreen] = [
113
+ this.htmlInputs.style(),
114
+ this.htmlInputs.center(),
115
+ this.htmlInputs.transform(),
116
+ this.size(),
117
+ this.htmlInputs.fullscreen(),
118
+ ];
119
+ if (transform) {
120
+ return {
121
+ position: 'absolute',
122
+ top: 0,
123
+ left: 0,
124
+ width: size.width,
125
+ height: size.height,
126
+ transformStyle: 'preserve-3d',
127
+ pointerEvents: 'none',
128
+ };
129
+ }
130
+ return {
131
+ position: 'absolute',
132
+ transform: center ? 'translate3d(-50%,-50%,0)' : 'none',
133
+ ...(fullscreen && {
134
+ top: -size.height / 2,
135
+ left: -size.width / 2,
136
+ width: size.width,
137
+ height: size.height,
138
+ }),
139
+ ...(style || {}),
140
+ };
141
+ });
142
+ this.transformInnerStyles = computed(() => ({ position: 'absolute', pointerEvents: this.htmlInputs.pointerEvents() }));
143
+ this.setCanvasElementStyle();
144
+ this.appendElement();
145
+ this.setWrapperClass();
146
+ this.render();
147
+ this.beforeRender();
148
+ }
149
+ setCanvasElementStyle() {
150
+ effect(() => {
151
+ const el = untracked(this.gl).domElement;
152
+ const occlude = this.htmlInputs.occlude();
153
+ if (occlude && occlude === 'blending') {
154
+ el.style.zIndex = `${Math.floor(untracked(this.htmlInputs.zIndexRange)[0] / 2)}`;
155
+ el.style.position = 'absolute';
156
+ el.style.pointerEvents = 'none';
157
+ }
158
+ else {
159
+ el.style.zIndex = null;
160
+ el.style.position = null;
161
+ el.style.pointerEvents = null;
162
+ }
163
+ });
164
+ }
165
+ appendElement() {
166
+ effect((onCleanup) => {
167
+ const [group, element] = [this.htmlInputs.groupRef.nativeElement, this.element()];
168
+ if (group && element) {
169
+ const [target, transform, scene, camera, size, calculatePosition, prepend] = [
170
+ this.target(),
171
+ this.htmlInputs.transform(),
172
+ untracked(this.scene),
173
+ untracked(this.camera),
174
+ untracked(this.size),
175
+ untracked(this.htmlInputs.calculatePosition),
176
+ untracked(this.htmlInputs.prepend),
177
+ ];
178
+ scene.updateMatrixWorld();
179
+ if (transform) {
180
+ element.style.cssText = `position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;`;
181
+ }
182
+ else {
183
+ const vec = calculatePosition(group, camera, size);
184
+ element.style.cssText = `position:absolute;top:0;left:0;transform:translate3d(${vec[0]}px,${vec[1]}px,0);transform-origin:0 0;`;
185
+ }
186
+ if (target) {
187
+ if (prepend)
188
+ target.prepend(element);
189
+ else
190
+ target.appendChild(element);
191
+ }
192
+ onCleanup(() => {
193
+ if (target)
194
+ target.removeChild(element);
195
+ this.vcr.clear();
196
+ });
197
+ }
198
+ });
199
+ }
200
+ setWrapperClass() {
201
+ effect(() => {
202
+ const [element, wrapperClass] = [this.element(), this.htmlInputs.wrapperClass()];
203
+ if (element && wrapperClass) {
204
+ element.className = wrapperClass;
205
+ }
206
+ });
207
+ }
208
+ render() {
209
+ effect((onCleanup) => {
210
+ const [{ transform }, element, content] = [
211
+ this.htmlInputs.state(),
212
+ this.element(),
213
+ this.htmlInputs.content(),
214
+ ];
215
+ if (element) {
216
+ this.isMeshSizeSet = false;
217
+ const params = transform
218
+ ? [this.transformTemplate, {}]
219
+ : [this.renderTemplate, { styles: this.styles }];
220
+ const ref = this.vcr.createEmbeddedView(...params);
221
+ if (ref.rootNodes?.[0]) {
222
+ if (element.hasChildNodes()) {
223
+ element.replaceChildren(...ref.rootNodes);
224
+ }
225
+ else {
226
+ element.append(...ref.rootNodes);
227
+ }
228
+ }
229
+ safeDetectChanges(ref);
230
+ let contentRef;
231
+ let contentParent;
232
+ /**
233
+ * NOTE: utilizing rAF here so that renderAnchor (ViewContainerRef) has a chance to be resolved
234
+ * TODO: Another approach is to call render() in ngOnInit and pass in an injector to the effect
235
+ */
236
+ const rAF = requestAnimationFrame(() => {
237
+ if (content && this.renderAnchor) {
238
+ contentRef = this.renderAnchor.createEmbeddedView(content);
239
+ contentParent = ref.rootNodes[0].lastElementChild || ref.rootNodes[0];
240
+ while (contentParent && contentParent.lastElementChild) {
241
+ contentParent = contentParent.lastElementChild;
242
+ }
243
+ if (contentRef.rootNodes?.[0]) {
244
+ if (contentParent.hasChildNodes()) {
245
+ contentParent.replaceChildren(...contentRef.rootNodes);
246
+ }
247
+ else {
248
+ contentParent.append(...contentRef.rootNodes);
249
+ }
250
+ }
251
+ safeDetectChanges(contentRef);
252
+ }
253
+ });
254
+ onCleanup(() => {
255
+ cancelAnimationFrame(rAF);
256
+ if (contentRef && contentParent) {
257
+ contentRef.rootNodes.forEach((node) => {
258
+ if (contentParent.hasChildNodes()) {
259
+ contentParent.removeChild(node);
260
+ }
261
+ node.remove();
262
+ });
263
+ contentRef.destroy();
264
+ }
265
+ ref.rootNodes.forEach((node) => {
266
+ if (element.hasChildNodes()) {
267
+ element.removeChild(node);
268
+ }
269
+ node.remove();
270
+ });
271
+ ref.destroy();
272
+ this.renderAnchor?.clear();
273
+ this.vcr.clear();
274
+ });
275
+ }
276
+ });
277
+ }
278
+ beforeRender() {
279
+ let oldPosition = [0, 0];
280
+ let oldZoom = 0;
281
+ let visible = true;
282
+ injectBeforeRender((gl) => {
283
+ const [group, camera, transform, calculatePosition, size, eps, isRayCastOcclusion, occlude, scene, raycaster, element, zIndexRange, sprite, distanceFactor, occlusionMeshRef, geometry, viewport, scale,] = [
284
+ this.htmlInputs.groupRef.nativeElement,
285
+ this.camera(),
286
+ this.htmlInputs.transform(),
287
+ this.htmlInputs.calculatePosition(),
288
+ this.size(),
289
+ this.htmlInputs.eps(),
290
+ this.htmlInputs.isRayCastOcclusion(),
291
+ this.htmlInputs.occlude(),
292
+ this.scene(),
293
+ this.raycaster(),
294
+ this.element(),
295
+ this.htmlInputs.zIndexRange(),
296
+ this.htmlInputs.sprite(),
297
+ this.htmlInputs.distanceFactor(),
298
+ this.htmlInputs.occlusionMeshRef.nativeElement,
299
+ this.htmlInputs.geometry(),
300
+ this.viewport(),
301
+ this.htmlInputs.scale(),
302
+ ];
303
+ if (group && element) {
304
+ camera.updateMatrixWorld();
305
+ group.updateWorldMatrix(true, false);
306
+ const vec = transform ? oldPosition : calculatePosition(group, camera, size);
307
+ if (transform ||
308
+ Math.abs(oldZoom - camera.zoom) > eps ||
309
+ Math.abs(oldPosition[0] - vec[0]) > eps ||
310
+ Math.abs(oldPosition[1] - vec[1]) > eps) {
311
+ const isBehindCamera = isObjectBehindCamera(group, camera);
312
+ let raytraceTarget = false;
313
+ if (isRayCastOcclusion) {
314
+ if (Array.isArray(occlude)) {
315
+ raytraceTarget = occlude.map((item) => (is.ref(item) ? item.nativeElement : item));
316
+ }
317
+ else if (occlude !== 'blending') {
318
+ raytraceTarget = [scene];
319
+ }
320
+ }
321
+ const previouslyVisible = visible;
322
+ if (raytraceTarget) {
323
+ const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
324
+ visible = isVisible && !isBehindCamera;
325
+ }
326
+ else {
327
+ visible = !isBehindCamera;
328
+ }
329
+ if (previouslyVisible !== visible) {
330
+ if (this.htmlInputs.occluded.observed) {
331
+ this.htmlInputs.occluded.emit(!visible);
332
+ }
333
+ else {
334
+ element.style.display = visible ? 'block' : 'none';
335
+ }
336
+ }
337
+ const halfRange = Math.floor(zIndexRange[0] / 2);
338
+ const zRange = occlude
339
+ ? isRayCastOcclusion //
340
+ ? [zIndexRange[0], halfRange]
341
+ : [halfRange - 1, 0]
342
+ : zIndexRange;
343
+ element.style.zIndex = `${objectZIndex(group, camera, zRange)}`;
344
+ if (transform) {
345
+ const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
346
+ const fov = camera.projectionMatrix.elements[5] * heightHalf;
347
+ const { isOrthographicCamera, top, left, bottom, right } = camera;
348
+ const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
349
+ const cameraTransform = isOrthographicCamera
350
+ ? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
351
+ : `translateZ(${fov}px)`;
352
+ let matrix = group.matrixWorld;
353
+ if (sprite) {
354
+ matrix = camera.matrixWorldInverse
355
+ .clone()
356
+ .transpose()
357
+ .copyPosition(matrix)
358
+ .scale(group.scale);
359
+ matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
360
+ matrix.elements[15] = 1;
361
+ }
362
+ element.style.width = size.width + 'px';
363
+ element.style.height = size.height + 'px';
364
+ element.style.perspective = isOrthographicCamera ? '' : `${fov}px`;
365
+ if (this.outerDiv?.nativeElement && this.innerDiv?.nativeElement) {
366
+ this.outerDiv.nativeElement.style.width = size.width + 'px';
367
+ this.outerDiv.nativeElement.style.height = size.height + 'px';
368
+ this.outerDiv.nativeElement.style.transform = `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`;
369
+ this.innerDiv.nativeElement.style.transform = getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400));
370
+ }
371
+ }
372
+ else {
373
+ const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
374
+ element.style.transform = `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`;
375
+ }
376
+ oldPosition = vec;
377
+ oldZoom = camera.zoom;
378
+ }
379
+ }
380
+ if (!isRayCastOcclusion && occlusionMeshRef && !this.isMeshSizeSet) {
381
+ if (transform) {
382
+ if (this.outerDiv?.nativeElement) {
383
+ const el = this.outerDiv.nativeElement.children[0];
384
+ if (el?.clientWidth && el?.clientHeight) {
385
+ const { isOrthographicCamera } = camera;
386
+ if (isOrthographicCamera || geometry) {
387
+ if (scale !== 1) {
388
+ if (!Array.isArray(scale)) {
389
+ occlusionMeshRef.scale.setScalar(1 / scale);
390
+ }
391
+ else if (scale instanceof THREE.Vector3) {
392
+ occlusionMeshRef.scale.copy(scale.clone().divideScalar(1));
393
+ }
394
+ else {
395
+ occlusionMeshRef.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
396
+ }
397
+ }
398
+ }
399
+ else {
400
+ const ratio = (distanceFactor || 10) / 400;
401
+ const w = el.clientWidth * ratio;
402
+ const h = el.clientHeight * ratio;
403
+ occlusionMeshRef.scale.set(w, h, 1);
404
+ }
405
+ this.isMeshSizeSet = true;
406
+ }
407
+ }
408
+ }
409
+ else {
410
+ const ele = element.children[0];
411
+ if (ele?.clientWidth && ele?.clientHeight) {
412
+ const ratio = 1 / viewport.factor;
413
+ const w = ele.clientWidth * ratio;
414
+ const h = ele.clientHeight * ratio;
415
+ occlusionMeshRef.scale.set(w, h, 1);
416
+ this.isMeshSizeSet = true;
417
+ }
418
+ occlusionMeshRef.lookAt(gl.camera.position);
419
+ }
420
+ }
421
+ });
422
+ }
423
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtsHtmlWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
424
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtsHtmlWrapper, isStandalone: true, selector: "ngts-html-wrapper", viewQueries: [{ propertyName: "transformTemplate", first: true, predicate: ["transformTemplate"], descendants: true, static: true }, { propertyName: "renderTemplate", first: true, predicate: ["renderTemplate"], descendants: true, static: true }, { propertyName: "outerDiv", first: true, predicate: ["transformedOuterDiv"], descendants: true }, { propertyName: "innerDiv", first: true, predicate: ["transformedInnerDiv"], descendants: true }, { propertyName: "renderAnchor", first: true, predicate: ["renderAnchor"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
425
+ <ng-template #transformTemplate>
426
+ <div #transformedOuterDiv [style]="styles()">
427
+ <div #transformedInnerDiv [style]="transformInnerStyles()">
428
+ <ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
429
+ </div>
430
+ </div>
431
+ </ng-template>
432
+
433
+ <ng-template #renderTemplate let-renderedStyles="styles">
434
+ <div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
435
+ <ng-container #renderAnchor />
436
+ </div>
437
+ </ng-template>
438
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
439
+ }
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtsHtmlWrapper, decorators: [{
441
+ type: Component,
442
+ args: [{
443
+ selector: 'ngts-html-wrapper',
444
+ standalone: true,
445
+ template: `
446
+ <ng-template #transformTemplate>
447
+ <div #transformedOuterDiv [style]="styles()">
448
+ <div #transformedInnerDiv [style]="transformInnerStyles()">
449
+ <ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
450
+ </div>
451
+ </div>
452
+ </ng-template>
453
+
454
+ <ng-template #renderTemplate let-renderedStyles="styles">
455
+ <div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
456
+ <ng-container #renderAnchor />
457
+ </div>
458
+ </ng-template>
459
+ `,
460
+ imports: [NgTemplateOutlet],
461
+ }]
462
+ }], ctorParameters: function () { return []; }, propDecorators: { transformTemplate: [{
463
+ type: ViewChild,
464
+ args: ['transformTemplate', { static: true }]
465
+ }], renderTemplate: [{
466
+ type: ViewChild,
467
+ args: ['renderTemplate', { static: true }]
468
+ }], outerDiv: [{
469
+ type: ViewChild,
470
+ args: ['transformedOuterDiv']
471
+ }], innerDiv: [{
472
+ type: ViewChild,
473
+ args: ['transformedInnerDiv']
474
+ }], renderAnchor: [{
475
+ type: ViewChild,
476
+ args: ['renderAnchor', { read: ViewContainerRef }]
477
+ }] } });
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2h0bWwvaHRtbC13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUU5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUUvQixNQUFNLFVBQVUsd0JBQXdCLENBQ3ZDLEVBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLElBQXVDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJ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LEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFWCxRQUFRO3NCQUF6QyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDRSxRQUFRO3NCQUF6QyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDdUIsWUFBWTtzQkFBbEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdEVtYmVkZGVkVmlld1JlZixcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZCxcblx0Vmlld0NvbnRhaW5lclJlZixcblx0Y29tcHV0ZWQsXG5cdGVmZmVjdCxcblx0aW5qZWN0LFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSFRNTCwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3ROZ3RTdG9yZSwgaXMsIHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RzSHRtbElucHV0cyB9IGZyb20gJy4vaHRtbCc7XG5cbmNvbnN0IHYxID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IHYyID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IHYzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDYWxjdWxhdGVQb3NpdGlvbihcblx0ZWw6IFRIUkVFLk9iamVjdDNELFxuXHRjYW1lcmE6IFRIUkVFLkNhbWVyYSxcblx0c2l6ZTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuKSB7XG5cdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdG9iamVjdFBvcy5wcm9qZWN0KGNhbWVyYSk7XG5cdGNvbnN0IHdpZHRoSGFsZiA9IHNpemUud2lkdGggLyAyO1xuXHRjb25zdCBoZWlnaHRIYWxmID0gc2l6ZS5oZWlnaHQgLyAyO1xuXHRyZXR1cm4gW29iamVjdFBvcy54ICogd2lkdGhIYWxmICsgd2lkdGhIYWxmLCAtKG9iamVjdFBvcy55ICogaGVpZ2h0SGFsZikgKyBoZWlnaHRIYWxmXTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RCZWhpbmRDYW1lcmEoZWw6IFRIUkVFLk9iamVjdDNELCBjYW1lcmE6IFRIUkVFLkNhbWVyYSkge1xuXHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRjb25zdCBjYW1lcmFQb3MgPSB2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTtcblx0Y29uc3QgZGVsdGFDYW1PYmogPSBvYmplY3RQb3Muc3ViKGNhbWVyYVBvcyk7XG5cdGNvbnN0IGNhbURpciA9IGNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbih2Myk7XG5cdHJldHVybiBkZWx0YUNhbU9iai5hbmdsZVRvKGNhbURpcikgPiBNYXRoLlBJIC8gMjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RWaXNpYmxlKFxuXHRlbDogVEhSRUUuT2JqZWN0M0QsXG5cdGNhbWVyYTogVEhSRUUuQ2FtZXJhLFxuXHRyYXljYXN0ZXI6IFRIUkVFLlJheWNhc3Rlcixcblx0b2NjbHVkZTogVEhSRUUuT2JqZWN0M0RbXSxcbikge1xuXHRjb25zdCBlbFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IHNjcmVlblBvcyA9IGVsUG9zLmNsb25lKCk7XG5cdHNjcmVlblBvcy5wcm9qZWN0KGNhbWVyYSk7XG5cdHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHNjcmVlblBvcyBhcyBhbnksIGNhbWVyYSk7XG5cdGNvbnN0IGludGVyc2VjdHMgPSByYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvY2NsdWRlLCB0cnVlKTtcblx0aWYgKGludGVyc2VjdHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRGlzdGFuY2UgPSBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlO1xuXHRcdGNvbnN0IHBvaW50RGlzdGFuY2UgPSBlbFBvcy5kaXN0YW5jZVRvKHJheWNhc3Rlci5yYXkub3JpZ2luKTtcblx0XHRyZXR1cm4gcG9pbnREaXN0YW5jZSA8IGludGVyc2VjdGlvbkRpc3RhbmNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmplY3RTY2FsZShlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSB7XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEpIHtcblx0XHRyZXR1cm4gY2FtZXJhLnpvb207XG5cdH0gZWxzZSBpZiAoY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpIHtcblx0XHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IHZGT1YgPSAoY2FtZXJhLmZvdiAqIE1hdGguUEkpIC8gMTgwO1xuXHRcdGNvbnN0IGRpc3QgPSBvYmplY3RQb3MuZGlzdGFuY2VUbyhjYW1lcmFQb3MpO1xuXHRcdGNvbnN0IHNjYWxlRk9WID0gMiAqIE1hdGgudGFuKHZGT1YgLyAyKSAqIGRpc3Q7XG5cdFx0cmV0dXJuIDEgLyBzY2FsZUZPVjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gMTtcblx0fVxufVxuXG5mdW5jdGlvbiBvYmplY3RaSW5kZXgoZWw6IFRIUkVFLk9iamVjdDNELCBjYW1lcmE6IFRIUkVFLkNhbWVyYSwgekluZGV4UmFuZ2U6IEFycmF5PG51bWJlcj4pIHtcblx0aWYgKGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhIHx8IGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3QgQSA9ICh6SW5kZXhSYW5nZVsxXSAtIHpJbmRleFJhbmdlWzBdKSAvIChjYW1lcmEuZmFyIC0gY2FtZXJhLm5lYXIpO1xuXHRcdGNvbnN0IEIgPSB6SW5kZXhSYW5nZVsxXSAtIEEgKiBjYW1lcmEuZmFyO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKEEgKiBkaXN0ICsgQik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZXBzaWxvbiA9ICh2YWx1ZTogbnVtYmVyKSA9PiAoTWF0aC5hYnModmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWUpO1xuXG5mdW5jdGlvbiBnZXRDU1NNYXRyaXgobWF0cml4OiBUSFJFRS5NYXRyaXg0LCBtdWx0aXBsaWVyczogbnVtYmVyW10sIHByZXBlbmQgPSAnJykge1xuXHRsZXQgbWF0cml4M2QgPSAnbWF0cml4M2QoJztcblx0Zm9yIChsZXQgaSA9IDA7IGkgIT09IDE2OyBpKyspIHtcblx0XHRtYXRyaXgzZCArPSBlcHNpbG9uKG11bHRpcGxpZXJzW2ldICogbWF0cml4LmVsZW1lbnRzW2ldKSArIChpICE9PSAxNSA/ICcsJyA6ICcpJyk7XG5cdH1cblx0cmV0dXJuIHByZXBlbmQgKyBtYXRyaXgzZDtcbn1cblxuY29uc3QgZ2V0Q2FtZXJhQ1NTTWF0cml4ID0gKChtdWx0aXBsaWVyczogbnVtYmVyW10pID0+IHtcblx0cmV0dXJuIChtYXRyaXg6IFRIUkVFLk1hdHJpeDQpID0+IGdldENTU01hdHJpeChtYXRyaXgsIG11bHRpcGxpZXJzKTtcbn0pKFsxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMV0pO1xuXG5jb25zdCBnZXRPYmplY3RDU1NNYXRyaXggPSAoKHNjYWxlTXVsdGlwbGllcnM6IChuOiBudW1iZXIpID0+IG51bWJlcltdKSA9PiB7XG5cdHJldHVybiAobWF0cml4OiBUSFJFRS5NYXRyaXg0LCBmYWN0b3I6IG51bWJlcikgPT5cblx0XHRnZXRDU1NNYXRyaXgobWF0cml4LCBzY2FsZU11bHRpcGxpZXJzKGZhY3RvciksICd0cmFuc2xhdGUoLTUwJSwtNTAlKScpO1xufSkoKGY6IG51bWJlcikgPT4gWzEgLyBmLCAxIC8gZiwgMSAvIGYsIDEsIC0xIC8gZiwgLTEgLyBmLCAtMSAvIGYsIC0xLCAxIC8gZiwgMSAvIGYsIDEgLyBmLCAxLCAxLCAxLCAxLCAxXSk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtaHRtbC13cmFwcGVyJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctdGVtcGxhdGUgI3RyYW5zZm9ybVRlbXBsYXRlPlxuXHRcdFx0PGRpdiAjdHJhbnNmb3JtZWRPdXRlckRpdiBbc3R5bGVdPVwic3R5bGVzKClcIj5cblx0XHRcdFx0PGRpdiAjdHJhbnNmb3JtZWRJbm5lckRpdiBbc3R5bGVdPVwidHJhbnNmb3JtSW5uZXJTdHlsZXMoKVwiPlxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW5kZXJUZW1wbGF0ZTsgY29udGV4dDogeyBzdHlsZXM6IGh0bWxJbnB1dHMuc3R5bGUgfVwiIC8+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjcmVuZGVyVGVtcGxhdGUgbGV0LXJlbmRlcmVkU3R5bGVzPVwic3R5bGVzXCI+XG5cdFx0XHQ8ZGl2ICNyZW5kZXJlZERpdiBbY2xhc3NdPVwiaHRtbElucHV0cy5yZW5kZXJlZERpdkNsYXNzKClcIiBbc3R5bGVdPVwicmVuZGVyZWRTdHlsZXMoKVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICNyZW5kZXJBbmNob3IgLz5cblx0XHRcdDwvZGl2PlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdGAsXG5cdGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0XSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0h0bWxXcmFwcGVyIHtcblx0c3RhdGljIFtIVE1MXSA9IHRydWU7XG5cblx0aHRtbElucHV0cyA9IGluamVjdE5ndHNIdG1sSW5wdXRzKCk7XG5cblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0cmFuc2Zvcm1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXHRAVmlld0NoaWxkKCdyZW5kZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtZWRPdXRlckRpdicpIG91dGVyRGl2PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cdEBWaWV3Q2hpbGQoJ3RyYW5zZm9ybWVkSW5uZXJEaXYnKSBpbm5lckRpdj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXHRAVmlld0NoaWxkKCdyZW5kZXJBbmNob3InLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgcmVuZGVyQW5jaG9yPzogVmlld0NvbnRhaW5lclJlZjtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdldmVudHMnLCAnY29ubmVjdGVkJywgeyBlcXVhbDogT2JqZWN0LmlzIH0pO1xuXHRwcml2YXRlIHZpZXdwb3J0ID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cdHByaXZhdGUgc2NlbmUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2NlbmUnKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgc2l6ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyk7XG5cdHByaXZhdGUgcmF5Y2FzdGVyID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3JheWNhc3RlcicpO1xuXG5cdHByaXZhdGUgaXNNZXNoU2l6ZVNldCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXHRwcml2YXRlIHZjciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcblxuXHRwcml2YXRlIHBvcnRhbEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcG9ydGFsID0gdGhpcy5odG1sSW5wdXRzLnBvcnRhbCgpO1xuXHRcdGlmICghcG9ydGFsKSByZXR1cm4gbnVsbDtcblx0XHRyZXR1cm4gaXMucmVmKHBvcnRhbCkgPyBwb3J0YWwubmF0aXZlRWxlbWVudCA6IHBvcnRhbDtcblx0fSk7XG5cblx0cHJpdmF0ZSBlbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuaHRtbElucHV0cy5hcygpKSBhcyBIVE1MRWxlbWVudCk7XG5cdHByaXZhdGUgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHBvcnRhbEVsZW1lbnQgPSB0aGlzLnBvcnRhbEVsZW1lbnQoKTtcblx0XHRpZiAocG9ydGFsRWxlbWVudCkgcmV0dXJuIHBvcnRhbEVsZW1lbnQ7XG5cdFx0Y29uc3QgY29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQoKTtcblx0XHRpZiAoY29ubmVjdGVkKSByZXR1cm4gY29ubmVjdGVkIGFzIEhUTUxFbGVtZW50O1xuXHRcdHJldHVybiB0aGlzLmdsKCkuZG9tRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcblx0fSk7XG5cblx0c3R5bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtzdHlsZSwgY2VudGVyLCB0cmFuc2Zvcm0sIHNpemUsIGZ1bGxzY3JlZW5dID0gW1xuXHRcdFx0dGhpcy5odG1sSW5wdXRzLnN0eWxlKCksXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMuY2VudGVyKCksXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMudHJhbnNmb3JtKCksXG5cdFx0XHR0aGlzLnNpemUoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy5mdWxsc2NyZWVuKCksXG5cdFx0XTtcblxuXHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdHdpZHRoOiBzaXplLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuXHRcdFx0XHR0cmFuc2Zvcm1TdHlsZTogJ3ByZXNlcnZlLTNkJyxcblx0XHRcdFx0cG9pbnRlckV2ZW50czogJ25vbmUnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHR0cmFuc2Zvcm06IGNlbnRlciA/ICd0cmFuc2xhdGUzZCgtNTAlLC01MCUsMCknIDogJ25vbmUnLFxuXHRcdFx0Li4uKGZ1bGxzY3JlZW4gJiYge1xuXHRcdFx0XHR0b3A6IC1zaXplLmhlaWdodCAvIDIsXG5cdFx0XHRcdGxlZnQ6IC1zaXplLndpZHRoIC8gMixcblx0XHRcdFx0d2lkdGg6IHNpemUud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogc2l6ZS5oZWlnaHQsXG5cdFx0XHR9KSxcblx0XHRcdC4uLihzdHlsZSB8fCB7fSksXG5cdFx0fTtcblx0fSk7XG5cdHRyYW5zZm9ybUlubmVyU3R5bGVzID0gY29tcHV0ZWQoKCkgPT4gKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHBvaW50ZXJFdmVudHM6IHRoaXMuaHRtbElucHV0cy5wb2ludGVyRXZlbnRzKCkgfSkpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuc2V0Q2FudmFzRWxlbWVudFN0eWxlKCk7XG5cdFx0dGhpcy5hcHBlbmRFbGVtZW50KCk7XG5cdFx0dGhpcy5zZXRXcmFwcGVyQ2xhc3MoKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuYmVmb3JlUmVuZGVyKCk7XG5cdH1cblxuXHRwcml2YXRlIHNldENhbnZhc0VsZW1lbnRTdHlsZSgpIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZWwgPSB1bnRyYWNrZWQodGhpcy5nbCkuZG9tRWxlbWVudCE7XG5cdFx0XHRjb25zdCBvY2NsdWRlID0gdGhpcy5odG1sSW5wdXRzLm9jY2x1ZGUoKTtcblx0XHRcdGlmIChvY2NsdWRlICYmIG9jY2x1ZGUgPT09ICdibGVuZGluZycpIHtcblx0XHRcdFx0ZWwuc3R5bGUuekluZGV4ID0gYCR7TWF0aC5mbG9vcih1bnRyYWNrZWQodGhpcy5odG1sSW5wdXRzLnpJbmRleFJhbmdlKVswXSAvIDIpfWA7XG5cdFx0XHRcdGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRcdFx0ZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsLnN0eWxlLnpJbmRleCA9IG51bGwhO1xuXHRcdFx0XHRlbC5zdHlsZS5wb3NpdGlvbiA9IG51bGwhO1xuXHRcdFx0XHRlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gbnVsbCE7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGVuZEVsZW1lbnQoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IFtncm91cCwgZWxlbWVudF0gPSBbdGhpcy5odG1sSW5wdXRzLmdyb3VwUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCgpXTtcblx0XHRcdGlmIChncm91cCAmJiBlbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IFt0YXJnZXQsIHRyYW5zZm9ybSwgc2NlbmUsIGNhbWVyYSwgc2l6ZSwgY2FsY3VsYXRlUG9zaXRpb24sIHByZXBlbmRdID0gW1xuXHRcdFx0XHRcdHRoaXMudGFyZ2V0KCksXG5cdFx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnRyYW5zZm9ybSgpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLnNjZW5lKSxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy5jYW1lcmEpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLnNpemUpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMuY2FsY3VsYXRlUG9zaXRpb24pLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMucHJlcGVuZCksXG5cdFx0XHRcdF07XG5cdFx0XHRcdHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgcG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BvaW50ZXItZXZlbnRzOm5vbmU7b3ZlcmZsb3c6aGlkZGVuO2A7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgdmVjID0gY2FsY3VsYXRlUG9zaXRpb24oZ3JvdXAsIGNhbWVyYSwgc2l6ZSk7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYHBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoJHt2ZWNbMF19cHgsJHt2ZWNbMV19cHgsMCk7dHJhbnNmb3JtLW9yaWdpbjowIDA7YDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdFx0XHRpZiAocHJlcGVuZCkgdGFyZ2V0LnByZXBlbmQoZWxlbWVudCk7XG5cdFx0XHRcdFx0ZWxzZSB0YXJnZXQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdGlmICh0YXJnZXQpIHRhcmdldC5yZW1vdmVDaGlsZChlbGVtZW50KTtcblx0XHRcdFx0XHR0aGlzLnZjci5jbGVhcigpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0V3JhcHBlckNsYXNzKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbZWxlbWVudCwgd3JhcHBlckNsYXNzXSA9IFt0aGlzLmVsZW1lbnQoKSwgdGhpcy5odG1sSW5wdXRzLndyYXBwZXJDbGFzcygpXTtcblx0XHRcdGlmIChlbGVtZW50ICYmIHdyYXBwZXJDbGFzcykge1xuXHRcdFx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IHdyYXBwZXJDbGFzcztcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyKCkge1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBbeyB0cmFuc2Zvcm0gfSwgZWxlbWVudCwgY29udGVudF0gPSBbXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zdGF0ZSgpLFxuXHRcdFx0XHR0aGlzLmVsZW1lbnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmNvbnRlbnQoKSxcblx0XHRcdF07XG5cblx0XHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRcdHRoaXMuaXNNZXNoU2l6ZVNldCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBwYXJhbXM6IFBhcmFtZXRlcnM8Vmlld0NvbnRhaW5lclJlZlsnY3JlYXRlRW1iZWRkZWRWaWV3J10+ID0gdHJhbnNmb3JtXG5cdFx0XHRcdFx0PyBbdGhpcy50cmFuc2Zvcm1UZW1wbGF0ZSwge31dXG5cdFx0XHRcdFx0OiBbdGhpcy5yZW5kZXJUZW1wbGF0ZSwgeyBzdHlsZXM6IHRoaXMuc3R5bGVzIH1dO1xuXG5cdFx0XHRcdGNvbnN0IHJlZiA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldyguLi5wYXJhbXMpO1xuXHRcdFx0XHRpZiAocmVmLnJvb3ROb2Rlcz8uWzBdKSB7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnJlcGxhY2VDaGlsZHJlbiguLi5yZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5hcHBlbmQoLi4ucmVmLnJvb3ROb2Rlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNhZmVEZXRlY3RDaGFuZ2VzKHJlZik7XG5cblx0XHRcdFx0bGV0IGNvbnRlbnRSZWY6IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblx0XHRcdFx0bGV0IGNvbnRlbnRQYXJlbnQ6IEhUTUxFbGVtZW50O1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogTk9URTogdXRpbGl6aW5nIHJBRiBoZXJlIHNvIHRoYXQgcmVuZGVyQW5jaG9yIChWaWV3Q29udGFpbmVyUmVmKSBoYXMgYSBjaGFuY2UgdG8gYmUgcmVzb2x2ZWRcblx0XHRcdFx0ICogVE9ETzogQW5vdGhlciBhcHByb2FjaCBpcyB0byBjYWxsIHJlbmRlcigpIGluIG5nT25Jbml0IGFuZCBwYXNzIGluIGFuIGluamVjdG9yIHRvIHRoZSBlZmZlY3Rcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNvbnN0IHJBRiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQgJiYgdGhpcy5yZW5kZXJBbmNob3IpIHtcblx0XHRcdFx0XHRcdGNvbnRlbnRSZWYgPSB0aGlzLnJlbmRlckFuY2hvci5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGVudCk7XG5cdFx0XHRcdFx0XHRjb250ZW50UGFyZW50ID0gcmVmLnJvb3ROb2Rlc1swXS5sYXN0RWxlbWVudENoaWxkIHx8IHJlZi5yb290Tm9kZXNbMF07XG5cdFx0XHRcdFx0XHR3aGlsZSAoY29udGVudFBhcmVudCAmJiBjb250ZW50UGFyZW50Lmxhc3RFbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRcdFx0Y29udGVudFBhcmVudCA9IGNvbnRlbnRQYXJlbnQubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjb250ZW50UmVmLnJvb3ROb2Rlcz8uWzBdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50UGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQucmVwbGFjZUNoaWxkcmVuKC4uLmNvbnRlbnRSZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50LmFwcGVuZCguLi5jb250ZW50UmVmLnJvb3ROb2Rlcyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHNhZmVEZXRlY3RDaGFuZ2VzKGNvbnRlbnRSZWYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0b25DbGVhbnVwKCgpID0+IHtcblx0XHRcdFx0XHRjYW5jZWxBbmltYXRpb25GcmFtZShyQUYpO1xuXG5cdFx0XHRcdFx0aWYgKGNvbnRlbnRSZWYgJiYgY29udGVudFBhcmVudCkge1xuXHRcdFx0XHRcdFx0Y29udGVudFJlZi5yb290Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudFBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG5vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0Y29udGVudFJlZi5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVmLnJvb3ROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG5vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmVmLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR0aGlzLnJlbmRlckFuY2hvcj8uY2xlYXIoKTtcblx0XHRcdFx0XHR0aGlzLnZjci5jbGVhcigpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYmVmb3JlUmVuZGVyKCkge1xuXHRcdGxldCBvbGRQb3NpdGlvbiA9IFswLCAwXTtcblx0XHRsZXQgb2xkWm9vbSA9IDA7XG5cdFx0bGV0IHZpc2libGUgPSB0cnVlO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoZ2wpID0+IHtcblx0XHRcdGNvbnN0IFtcblx0XHRcdFx0Z3JvdXAsXG5cdFx0XHRcdGNhbWVyYSxcblx0XHRcdFx0dHJhbnNmb3JtLFxuXHRcdFx0XHRjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdFx0c2l6ZSxcblx0XHRcdFx0ZXBzLFxuXHRcdFx0XHRpc1JheUNhc3RPY2NsdXNpb24sXG5cdFx0XHRcdG9jY2x1ZGUsXG5cdFx0XHRcdHNjZW5lLFxuXHRcdFx0XHRyYXljYXN0ZXIsXG5cdFx0XHRcdGVsZW1lbnQsXG5cdFx0XHRcdHpJbmRleFJhbmdlLFxuXHRcdFx0XHRzcHJpdGUsXG5cdFx0XHRcdGRpc3RhbmNlRmFjdG9yLFxuXHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLFxuXHRcdFx0XHRnZW9tZXRyeSxcblx0XHRcdFx0dmlld3BvcnQsXG5cdFx0XHRcdHNjYWxlLFxuXHRcdFx0XSA9IFtcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmdyb3VwUmVmLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy50cmFuc2Zvcm0oKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmNhbGN1bGF0ZVBvc2l0aW9uKCksXG5cdFx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZXBzKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5pc1JheUNhc3RPY2NsdXNpb24oKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1ZGUoKSxcblx0XHRcdFx0dGhpcy5zY2VuZSgpLFxuXHRcdFx0XHR0aGlzLnJheWNhc3RlcigpLFxuXHRcdFx0XHR0aGlzLmVsZW1lbnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnpJbmRleFJhbmdlKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zcHJpdGUoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmRpc3RhbmNlRmFjdG9yKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5vY2NsdXNpb25NZXNoUmVmLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5nZW9tZXRyeSgpLFxuXHRcdFx0XHR0aGlzLnZpZXdwb3J0KCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zY2FsZSgpLFxuXHRcdFx0XTtcblx0XHRcdGlmIChncm91cCAmJiBlbGVtZW50KSB7XG5cdFx0XHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRncm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdGNvbnN0IHZlYyA9IHRyYW5zZm9ybSA/IG9sZFBvc2l0aW9uIDogY2FsY3VsYXRlUG9zaXRpb24oZ3JvdXAsIGNhbWVyYSwgc2l6ZSk7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRyYW5zZm9ybSB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFpvb20gLSBjYW1lcmEuem9vbSkgPiBlcHMgfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRQb3NpdGlvblswXSAtIHZlY1swXSkgPiBlcHMgfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRQb3NpdGlvblsxXSAtIHZlY1sxXSkgPiBlcHNcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNCZWhpbmRDYW1lcmEgPSBpc09iamVjdEJlaGluZENhbWVyYShncm91cCwgY2FtZXJhKTtcblx0XHRcdFx0XHRsZXQgcmF5dHJhY2VUYXJnZXQ6IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgVEhSRUUuT2JqZWN0M0RbXSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKGlzUmF5Q2FzdE9jY2x1c2lvbikge1xuXHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob2NjbHVkZSkpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBvY2NsdWRlLm1hcCgoaXRlbSkgPT4gKGlzLnJlZihpdGVtKSA/IGl0ZW0ubmF0aXZlRWxlbWVudCA6IGl0ZW0pKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob2NjbHVkZSAhPT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0XHRyYXl0cmFjZVRhcmdldCA9IFtzY2VuZV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNseVZpc2libGUgPSB2aXNpYmxlO1xuXHRcdFx0XHRcdGlmIChyYXl0cmFjZVRhcmdldCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNWaXNpYmxlID0gaXNPYmplY3RWaXNpYmxlKGdyb3VwLCBjYW1lcmEsIHJheWNhc3RlciwgcmF5dHJhY2VUYXJnZXQpO1xuXHRcdFx0XHRcdFx0dmlzaWJsZSA9IGlzVmlzaWJsZSAmJiAhaXNCZWhpbmRDYW1lcmE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZpc2libGUgPSAhaXNCZWhpbmRDYW1lcmE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzbHlWaXNpYmxlICE9PSB2aXNpYmxlKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5odG1sSW5wdXRzLm9jY2x1ZGVkLm9ic2VydmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaHRtbElucHV0cy5vY2NsdWRlZC5lbWl0KCF2aXNpYmxlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGhhbGZSYW5nZSA9IE1hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKTtcblx0XHRcdFx0XHRjb25zdCB6UmFuZ2UgPSBvY2NsdWRlXG5cdFx0XHRcdFx0XHQ/IGlzUmF5Q2FzdE9jY2x1c2lvbiAvL1xuXHRcdFx0XHRcdFx0XHQ/IFt6SW5kZXhSYW5nZVswXSwgaGFsZlJhbmdlXVxuXHRcdFx0XHRcdFx0XHQ6IFtoYWxmUmFuZ2UgLSAxLCAwXVxuXHRcdFx0XHRcdFx0OiB6SW5kZXhSYW5nZTtcblxuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuekluZGV4ID0gYCR7b2JqZWN0WkluZGV4KGdyb3VwLCBjYW1lcmEsIHpSYW5nZSl9YDtcblxuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IFt3aWR0aEhhbGYsIGhlaWdodEhhbGZdID0gW3NpemUud2lkdGggLyAyLCBzaXplLmhlaWdodCAvIDJdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZm92ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0gKiBoZWlnaHRIYWxmO1xuXHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSBjYW1lcmEgYXMgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhTWF0cml4ID0gZ2V0Q2FtZXJhQ1NTTWF0cml4KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhVHJhbnNmb3JtID0gaXNPcnRob2dyYXBoaWNDYW1lcmFcblx0XHRcdFx0XHRcdFx0PyBgc2NhbGUoJHtmb3Z9KXRyYW5zbGF0ZSgke2Vwc2lsb24oLShyaWdodCArIGxlZnQpIC8gMil9cHgsJHtlcHNpbG9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0KHRvcCArIGJvdHRvbSkgLyAyLFxuXHRcdFx0XHRcdFx0XHQgICl9cHgpYFxuXHRcdFx0XHRcdFx0XHQ6IGB0cmFuc2xhdGVaKCR7Zm92fXB4KWA7XG5cdFx0XHRcdFx0XHRsZXQgbWF0cml4ID0gZ3JvdXAubWF0cml4V29ybGQ7XG5cdFx0XHRcdFx0XHRpZiAoc3ByaXRlKSB7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2Vcblx0XHRcdFx0XHRcdFx0XHQuY2xvbmUoKVxuXHRcdFx0XHRcdFx0XHRcdC50cmFuc3Bvc2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5jb3B5UG9zaXRpb24obWF0cml4KVxuXHRcdFx0XHRcdFx0XHRcdC5zY2FsZShncm91cC5zY2FsZSk7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1szXSA9IG1hdHJpeC5lbGVtZW50c1s3XSA9IG1hdHJpeC5lbGVtZW50c1sxMV0gPSAwO1xuXHRcdFx0XHRcdFx0XHRtYXRyaXguZWxlbWVudHNbMTVdID0gMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgJ3B4Jztcblx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGlzT3J0aG9ncmFwaGljQ2FtZXJhID8gJycgOiBgJHtmb3Z9cHhgO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub3V0ZXJEaXY/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5pbm5lckRpdj8ubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgJ3B4Jztcblx0XHRcdFx0XHRcdFx0dGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdFx0XHRcdFx0dGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGAke2NhbWVyYVRyYW5zZm9ybX0ke2NhbWVyYU1hdHJpeH10cmFuc2xhdGUoJHt3aWR0aEhhbGZ9cHgsJHtoZWlnaHRIYWxmfXB4KWA7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaW5uZXJEaXYubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBnZXRPYmplY3RDU1NNYXRyaXgoXG5cdFx0XHRcdFx0XHRcdFx0bWF0cml4LFxuXHRcdFx0XHRcdFx0XHRcdDEgLyAoKGRpc3RhbmNlRmFjdG9yIHx8IDEwKSAvIDQwMCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNjYWxlID0gZGlzdGFuY2VGYWN0b3IgPT09IHVuZGVmaW5lZCA/IDEgOiBvYmplY3RTY2FsZShncm91cCwgY2FtZXJhKSAqIGRpc3RhbmNlRmFjdG9yO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt2ZWNbMF19cHgsJHt2ZWNbMV19cHgsMCkgc2NhbGUoJHtzY2FsZX0pYDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2xkUG9zaXRpb24gPSB2ZWM7XG5cdFx0XHRcdFx0b2xkWm9vbSA9IGNhbWVyYS56b29tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNSYXlDYXN0T2NjbHVzaW9uICYmIG9jY2x1c2lvbk1lc2hSZWYgJiYgIXRoaXMuaXNNZXNoU2l6ZVNldCkge1xuXHRcdFx0XHRpZiAodHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMub3V0ZXJEaXY/Lm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGVsID0gdGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZWw/LmNsaWVudFdpZHRoICYmIGVsPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSB9ID0gY2FtZXJhIGFzIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaXNPcnRob2dyYXBoaWNDYW1lcmEgfHwgZ2VvbWV0cnkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NhbGUgIT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShzY2FsZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5zZXRTY2FsYXIoMSAvIChzY2FsZSBhcyBudW1iZXIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc2NhbGUgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuY29weShzY2FsZS5jbG9uZSgpLmRpdmlkZVNjYWxhcigxKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldCgxIC8gc2NhbGVbMF0sIDEgLyBzY2FsZVsxXSwgMSAvIHNjYWxlWzJdKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmF0aW8gPSAoZGlzdGFuY2VGYWN0b3IgfHwgMTApIC8gNDAwO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbC5jbGllbnRXaWR0aCAqIHJhdGlvO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbC5jbGllbnRIZWlnaHQgKiByYXRpbztcblxuXHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KHcsIGgsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZWxlID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuXHRcdFx0XHRcdGlmIChlbGU/LmNsaWVudFdpZHRoICYmIGVsZT8uY2xpZW50SGVpZ2h0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IDEgLyB2aWV3cG9ydC5mYWN0b3I7XG5cdFx0XHRcdFx0XHRjb25zdCB3ID0gZWxlLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRjb25zdCBoID0gZWxlLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldCh3LCBoLCAxKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLmxvb2tBdChnbC5jYW1lcmEucG9zaXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==