three-nebula 11.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/three-nebula.cjs +109 -0
  3. package/dist/three-nebula.cjs.map +1 -0
  4. package/dist/three-nebula.mjs +2968 -0
  5. package/dist/three-nebula.mjs.map +1 -0
  6. package/dist/three-nebula.umd.js +109 -0
  7. package/dist/three-nebula.umd.js.map +1 -0
  8. package/package.json +23 -47
  9. package/specs/01-emitter-hierarchy.md +200 -0
  10. package/specs/02-determinism-scrubbing.md +188 -0
  11. package/specs/03-sound-renderer.md +183 -0
  12. package/specs/04-schema-versioning.md +140 -0
  13. package/specs/05-content-addressed-assets.md +288 -0
  14. package/specs/README.md +80 -0
  15. package/build/cjs/behaviour/Alpha.js +0 -189
  16. package/build/cjs/behaviour/Attraction.js +0 -189
  17. package/build/cjs/behaviour/Behaviour.js +0 -253
  18. package/build/cjs/behaviour/Collision.js +0 -146
  19. package/build/cjs/behaviour/Color.js +0 -148
  20. package/build/cjs/behaviour/CrossZone.js +0 -141
  21. package/build/cjs/behaviour/Force.js +0 -126
  22. package/build/cjs/behaviour/Gravity.js +0 -78
  23. package/build/cjs/behaviour/RandomDrift.js +0 -153
  24. package/build/cjs/behaviour/Repulsion.js +0 -123
  25. package/build/cjs/behaviour/Rotate.js +0 -265
  26. package/build/cjs/behaviour/Scale.js +0 -177
  27. package/build/cjs/behaviour/Spring.js +0 -133
  28. package/build/cjs/behaviour/constants.js +0 -28
  29. package/build/cjs/behaviour/index.js +0 -112
  30. package/build/cjs/behaviour/types.js +0 -33
  31. package/build/cjs/constants/index.js +0 -61
  32. package/build/cjs/core/Particle.js +0 -390
  33. package/build/cjs/core/Pool.js +0 -203
  34. package/build/cjs/core/System.js +0 -366
  35. package/build/cjs/core/constants.js +0 -163
  36. package/build/cjs/core/fromJSON.js +0 -128
  37. package/build/cjs/core/fromJSONAsync.js +0 -239
  38. package/build/cjs/core/index.js +0 -32
  39. package/build/cjs/core/three/Euler.js +0 -233
  40. package/build/cjs/core/three/Math.js +0 -91
  41. package/build/cjs/core/three/Matrix4.js +0 -745
  42. package/build/cjs/core/three/Quaternion.js +0 -451
  43. package/build/cjs/core/three/Vector3.js +0 -464
  44. package/build/cjs/core/three/constants.js +0 -298
  45. package/build/cjs/core/three/index.js +0 -48
  46. package/build/cjs/core/types.js +0 -13
  47. package/build/cjs/debug/Debug.js +0 -209
  48. package/build/cjs/debug/constants.js +0 -19
  49. package/build/cjs/debug/index.js +0 -24
  50. package/build/cjs/debug/log.js +0 -38
  51. package/build/cjs/ease/index.js +0 -149
  52. package/build/cjs/emitter/Emitter.js +0 -798
  53. package/build/cjs/emitter/FollowEmitter.js +0 -146
  54. package/build/cjs/emitter/constants.js +0 -20
  55. package/build/cjs/emitter/index.js +0 -24
  56. package/build/cjs/emitter/types.js +0 -11
  57. package/build/cjs/events/EventDispatcher.js +0 -105
  58. package/build/cjs/events/constants.js +0 -23
  59. package/build/cjs/events/index.js +0 -27
  60. package/build/cjs/index.js +0 -151
  61. package/build/cjs/initializer/Body.js +0 -122
  62. package/build/cjs/initializer/BodySprite.js +0 -146
  63. package/build/cjs/initializer/Initializer.js +0 -109
  64. package/build/cjs/initializer/InitializerUtil.js +0 -54
  65. package/build/cjs/initializer/Life.js +0 -106
  66. package/build/cjs/initializer/Mass.js +0 -101
  67. package/build/cjs/initializer/Position.js +0 -152
  68. package/build/cjs/initializer/Radius.js +0 -118
  69. package/build/cjs/initializer/Rate.js +0 -150
  70. package/build/cjs/initializer/Rotation.js +0 -95
  71. package/build/cjs/initializer/Texture.js +0 -139
  72. package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
  73. package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
  74. package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
  75. package/build/cjs/initializer/Velocity/Velocity.js +0 -94
  76. package/build/cjs/initializer/Velocity/index.js +0 -32
  77. package/build/cjs/initializer/constants.js +0 -43
  78. package/build/cjs/initializer/index.js +0 -108
  79. package/build/cjs/initializer/types.js +0 -37
  80. package/build/cjs/math/ArraySpan.js +0 -103
  81. package/build/cjs/math/Box.js +0 -46
  82. package/build/cjs/math/ColorSpan.js +0 -113
  83. package/build/cjs/math/MathUtils.js +0 -57
  84. package/build/cjs/math/Polar3D.js +0 -115
  85. package/build/cjs/math/Span.js +0 -88
  86. package/build/cjs/math/Vector3D.js +0 -76
  87. package/build/cjs/math/constants.js +0 -35
  88. package/build/cjs/math/index.js +0 -122
  89. package/build/cjs/math/integration.js +0 -59
  90. package/build/cjs/math/types.js +0 -19
  91. package/build/cjs/renderer/BaseRenderer.js +0 -108
  92. package/build/cjs/renderer/CustomRenderer.js +0 -65
  93. package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -371
  94. package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
  95. package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
  96. package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
  97. package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -385
  98. package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
  99. package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
  100. package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
  101. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -58
  102. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
  103. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
  104. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
  105. package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
  106. package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
  107. package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
  108. package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -45
  109. package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
  110. package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
  111. package/build/cjs/renderer/GPURenderer/index.js +0 -97
  112. package/build/cjs/renderer/MeshRenderer.js +0 -136
  113. package/build/cjs/renderer/SpriteRenderer.js +0 -68
  114. package/build/cjs/renderer/index.js +0 -40
  115. package/build/cjs/renderer/types.js +0 -21
  116. package/build/cjs/utils/ColorUtil.js +0 -39
  117. package/build/cjs/utils/PUID.js +0 -26
  118. package/build/cjs/utils/THREEUtil.js +0 -40
  119. package/build/cjs/utils/Util.js +0 -69
  120. package/build/cjs/utils/index.js +0 -61
  121. package/build/cjs/utils/uid.js +0 -12
  122. package/build/cjs/zone/BoxZone.js +0 -178
  123. package/build/cjs/zone/LineZone.js +0 -101
  124. package/build/cjs/zone/MeshZone.js +0 -101
  125. package/build/cjs/zone/PointZone.js +0 -99
  126. package/build/cjs/zone/ScreenZone.js +0 -164
  127. package/build/cjs/zone/SphereZone.js +0 -155
  128. package/build/cjs/zone/Zone.js +0 -172
  129. package/build/cjs/zone/index.js +0 -56
  130. package/build/cjs/zone/types.js +0 -21
  131. package/build/esm/behaviour/Alpha.js +0 -134
  132. package/build/esm/behaviour/Attraction.js +0 -135
  133. package/build/esm/behaviour/Behaviour.js +0 -215
  134. package/build/esm/behaviour/Collision.js +0 -100
  135. package/build/esm/behaviour/Color.js +0 -101
  136. package/build/esm/behaviour/CrossZone.js +0 -82
  137. package/build/esm/behaviour/Force.js +0 -83
  138. package/build/esm/behaviour/Gravity.js +0 -40
  139. package/build/esm/behaviour/RandomDrift.js +0 -97
  140. package/build/esm/behaviour/Repulsion.js +0 -81
  141. package/build/esm/behaviour/Rotate.js +0 -214
  142. package/build/esm/behaviour/Scale.js +0 -131
  143. package/build/esm/behaviour/Spring.js +0 -90
  144. package/build/esm/behaviour/constants.js +0 -11
  145. package/build/esm/behaviour/index.js +0 -14
  146. package/build/esm/behaviour/types.js +0 -14
  147. package/build/esm/constants/index.js +0 -42
  148. package/build/esm/core/Particle.js +0 -357
  149. package/build/esm/core/Pool.js +0 -161
  150. package/build/esm/core/System.js +0 -320
  151. package/build/esm/core/constants.js +0 -127
  152. package/build/esm/core/fromJSON.js +0 -107
  153. package/build/esm/core/fromJSONAsync.js +0 -210
  154. package/build/esm/core/index.js +0 -4
  155. package/build/esm/core/three/Euler.js +0 -224
  156. package/build/esm/core/three/Math.js +0 -84
  157. package/build/esm/core/three/Matrix4.js +0 -739
  158. package/build/esm/core/three/Quaternion.js +0 -445
  159. package/build/esm/core/three/Vector3.js +0 -457
  160. package/build/esm/core/three/constants.js +0 -148
  161. package/build/esm/core/three/index.js +0 -5
  162. package/build/esm/core/types.js +0 -4
  163. package/build/esm/debug/Debug.js +0 -195
  164. package/build/esm/debug/constants.js +0 -7
  165. package/build/esm/debug/index.js +0 -3
  166. package/build/esm/debug/log.js +0 -31
  167. package/build/esm/ease/index.js +0 -113
  168. package/build/esm/emitter/Emitter.js +0 -708
  169. package/build/esm/emitter/FollowEmitter.js +0 -97
  170. package/build/esm/emitter/constants.js +0 -7
  171. package/build/esm/emitter/index.js +0 -3
  172. package/build/esm/emitter/types.js +0 -3
  173. package/build/esm/events/EventDispatcher.js +0 -82
  174. package/build/esm/events/constants.js +0 -9
  175. package/build/esm/events/index.js +0 -4
  176. package/build/esm/index.js +0 -13
  177. package/build/esm/initializer/Body.js +0 -83
  178. package/build/esm/initializer/BodySprite.js +0 -108
  179. package/build/esm/initializer/Initializer.js +0 -84
  180. package/build/esm/initializer/InitializerUtil.js +0 -48
  181. package/build/esm/initializer/Life.js +0 -66
  182. package/build/esm/initializer/Mass.js +0 -60
  183. package/build/esm/initializer/Position.js +0 -98
  184. package/build/esm/initializer/Radius.js +0 -75
  185. package/build/esm/initializer/Rate.js +0 -107
  186. package/build/esm/initializer/Rotation.js +0 -54
  187. package/build/esm/initializer/Texture.js +0 -101
  188. package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
  189. package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
  190. package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
  191. package/build/esm/initializer/Velocity/Velocity.js +0 -52
  192. package/build/esm/initializer/Velocity/index.js +0 -4
  193. package/build/esm/initializer/constants.js +0 -26
  194. package/build/esm/initializer/index.js +0 -12
  195. package/build/esm/initializer/types.js +0 -16
  196. package/build/esm/math/ArraySpan.js +0 -62
  197. package/build/esm/math/Box.js +0 -25
  198. package/build/esm/math/ColorSpan.js +0 -71
  199. package/build/esm/math/MathUtils.js +0 -48
  200. package/build/esm/math/Polar3D.js +0 -81
  201. package/build/esm/math/Span.js +0 -63
  202. package/build/esm/math/Vector3D.js +0 -34
  203. package/build/esm/math/constants.js +0 -24
  204. package/build/esm/math/index.js +0 -10
  205. package/build/esm/math/integration.js +0 -47
  206. package/build/esm/math/types.js +0 -7
  207. package/build/esm/renderer/BaseRenderer.js +0 -78
  208. package/build/esm/renderer/CustomRenderer.js +0 -23
  209. package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -357
  210. package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -30
  211. package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
  212. package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -36
  213. package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -375
  214. package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -27
  215. package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
  216. package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -33
  217. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -30
  218. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
  219. package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
  220. package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
  221. package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
  222. package/build/esm/renderer/GPURenderer/common/index.js +0 -4
  223. package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
  224. package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -26
  225. package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
  226. package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
  227. package/build/esm/renderer/GPURenderer/index.js +0 -57
  228. package/build/esm/renderer/MeshRenderer.js +0 -93
  229. package/build/esm/renderer/SpriteRenderer.js +0 -30
  230. package/build/esm/renderer/index.js +0 -5
  231. package/build/esm/renderer/types.js +0 -8
  232. package/build/esm/utils/ColorUtil.js +0 -32
  233. package/build/esm/utils/PUID.js +0 -19
  234. package/build/esm/utils/THREEUtil.js +0 -31
  235. package/build/esm/utils/Util.js +0 -60
  236. package/build/esm/utils/index.js +0 -13
  237. package/build/esm/utils/uid.js +0 -3
  238. package/build/esm/zone/BoxZone.js +0 -133
  239. package/build/esm/zone/LineZone.js +0 -61
  240. package/build/esm/zone/MeshZone.js +0 -60
  241. package/build/esm/zone/PointZone.js +0 -59
  242. package/build/esm/zone/ScreenZone.js +0 -116
  243. package/build/esm/zone/SphereZone.js +0 -113
  244. package/build/esm/zone/Zone.js +0 -141
  245. package/build/esm/zone/index.js +0 -7
  246. package/build/esm/zone/types.js +0 -8
  247. package/build/three-nebula.js +0 -2
  248. package/build/three-nebula.js.map +0 -1
@@ -1,445 +0,0 @@
1
- /**
2
- * @author mikael emtinger / http://gomo.se/
3
- * @author alteredq / http://alteredqualia.com/
4
- * @author WestLangley / http://github.com/WestLangley
5
- * @author bhouston / http://clara.io
6
- */
7
- import { _Math } from './Math.js';
8
-
9
- function Quaternion(x, y, z, w) {
10
- this._x = x || 0;
11
- this._y = y || 0;
12
- this._z = z || 0;
13
- this._w = w !== undefined ? w : 1;
14
- }
15
-
16
- Object.assign(Quaternion, {
17
- slerp: function (qa, qb, qm, t) {
18
- return qm.copy(qa).slerp(qb, t);
19
- },
20
- slerpFlat: function (dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {
21
- // fuzz-free, array-based Quaternion SLERP operation
22
- var x0 = src0[srcOffset0 + 0],
23
- y0 = src0[srcOffset0 + 1],
24
- z0 = src0[srcOffset0 + 2],
25
- w0 = src0[srcOffset0 + 3],
26
- x1 = src1[srcOffset1 + 0],
27
- y1 = src1[srcOffset1 + 1],
28
- z1 = src1[srcOffset1 + 2],
29
- w1 = src1[srcOffset1 + 3];
30
-
31
- if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {
32
- var s = 1 - t,
33
- cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
34
- dir = cos >= 0 ? 1 : -1,
35
- sqrSin = 1 - cos * cos; // Skip the Slerp for tiny steps to avoid numeric problems:
36
-
37
- if (sqrSin > Number.EPSILON) {
38
- var sin = Math.sqrt(sqrSin),
39
- len = Math.atan2(sin, cos * dir);
40
- s = Math.sin(s * len) / sin;
41
- t = Math.sin(t * len) / sin;
42
- }
43
-
44
- var tDir = t * dir;
45
- x0 = x0 * s + x1 * tDir;
46
- y0 = y0 * s + y1 * tDir;
47
- z0 = z0 * s + z1 * tDir;
48
- w0 = w0 * s + w1 * tDir; // Normalize in case we just did a lerp:
49
-
50
- if (s === 1 - t) {
51
- var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);
52
- x0 *= f;
53
- y0 *= f;
54
- z0 *= f;
55
- w0 *= f;
56
- }
57
- }
58
-
59
- dst[dstOffset] = x0;
60
- dst[dstOffset + 1] = y0;
61
- dst[dstOffset + 2] = z0;
62
- dst[dstOffset + 3] = w0;
63
- }
64
- });
65
- Object.defineProperties(Quaternion.prototype, {
66
- x: {
67
- get: function () {
68
- return this._x;
69
- },
70
- set: function (value) {
71
- this._x = value;
72
-
73
- this._onChangeCallback();
74
- }
75
- },
76
- y: {
77
- get: function () {
78
- return this._y;
79
- },
80
- set: function (value) {
81
- this._y = value;
82
-
83
- this._onChangeCallback();
84
- }
85
- },
86
- z: {
87
- get: function () {
88
- return this._z;
89
- },
90
- set: function (value) {
91
- this._z = value;
92
-
93
- this._onChangeCallback();
94
- }
95
- },
96
- w: {
97
- get: function () {
98
- return this._w;
99
- },
100
- set: function (value) {
101
- this._w = value;
102
-
103
- this._onChangeCallback();
104
- }
105
- }
106
- });
107
- Object.assign(Quaternion.prototype, {
108
- isQuaternion: true,
109
- set: function (x, y, z, w) {
110
- this._x = x;
111
- this._y = y;
112
- this._z = z;
113
- this._w = w;
114
-
115
- this._onChangeCallback();
116
-
117
- return this;
118
- },
119
- clone: function () {
120
- return new this.constructor(this._x, this._y, this._z, this._w);
121
- },
122
- copy: function (quaternion) {
123
- this._x = quaternion.x;
124
- this._y = quaternion.y;
125
- this._z = quaternion.z;
126
- this._w = quaternion.w;
127
-
128
- this._onChangeCallback();
129
-
130
- return this;
131
- },
132
- setFromEuler: function (euler, update) {
133
- if (!(euler && euler.isEuler)) {
134
- throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');
135
- }
136
-
137
- var x = euler._x,
138
- y = euler._y,
139
- z = euler._z,
140
- order = euler.order; // http://www.mathworks.com/matlabcentral/fileexchange/
141
- // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
142
- // content/SpinCalc.m
143
-
144
- var cos = Math.cos;
145
- var sin = Math.sin;
146
- var c1 = cos(x / 2);
147
- var c2 = cos(y / 2);
148
- var c3 = cos(z / 2);
149
- var s1 = sin(x / 2);
150
- var s2 = sin(y / 2);
151
- var s3 = sin(z / 2);
152
-
153
- if (order === 'XYZ') {
154
- this._x = s1 * c2 * c3 + c1 * s2 * s3;
155
- this._y = c1 * s2 * c3 - s1 * c2 * s3;
156
- this._z = c1 * c2 * s3 + s1 * s2 * c3;
157
- this._w = c1 * c2 * c3 - s1 * s2 * s3;
158
- } else if (order === 'YXZ') {
159
- this._x = s1 * c2 * c3 + c1 * s2 * s3;
160
- this._y = c1 * s2 * c3 - s1 * c2 * s3;
161
- this._z = c1 * c2 * s3 - s1 * s2 * c3;
162
- this._w = c1 * c2 * c3 + s1 * s2 * s3;
163
- } else if (order === 'ZXY') {
164
- this._x = s1 * c2 * c3 - c1 * s2 * s3;
165
- this._y = c1 * s2 * c3 + s1 * c2 * s3;
166
- this._z = c1 * c2 * s3 + s1 * s2 * c3;
167
- this._w = c1 * c2 * c3 - s1 * s2 * s3;
168
- } else if (order === 'ZYX') {
169
- this._x = s1 * c2 * c3 - c1 * s2 * s3;
170
- this._y = c1 * s2 * c3 + s1 * c2 * s3;
171
- this._z = c1 * c2 * s3 - s1 * s2 * c3;
172
- this._w = c1 * c2 * c3 + s1 * s2 * s3;
173
- } else if (order === 'YZX') {
174
- this._x = s1 * c2 * c3 + c1 * s2 * s3;
175
- this._y = c1 * s2 * c3 + s1 * c2 * s3;
176
- this._z = c1 * c2 * s3 - s1 * s2 * c3;
177
- this._w = c1 * c2 * c3 - s1 * s2 * s3;
178
- } else if (order === 'XZY') {
179
- this._x = s1 * c2 * c3 - c1 * s2 * s3;
180
- this._y = c1 * s2 * c3 - s1 * c2 * s3;
181
- this._z = c1 * c2 * s3 + s1 * s2 * c3;
182
- this._w = c1 * c2 * c3 + s1 * s2 * s3;
183
- }
184
-
185
- if (update !== false) this._onChangeCallback();
186
- return this;
187
- },
188
- setFromAxisAngle: function (axis, angle) {
189
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
190
- // assumes axis is normalized
191
- var halfAngle = angle / 2,
192
- s = Math.sin(halfAngle);
193
- this._x = axis.x * s;
194
- this._y = axis.y * s;
195
- this._z = axis.z * s;
196
- this._w = Math.cos(halfAngle);
197
-
198
- this._onChangeCallback();
199
-
200
- return this;
201
- },
202
- setFromRotationMatrix: function (m) {
203
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
204
- // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
205
- var te = m.elements,
206
- m11 = te[0],
207
- m12 = te[4],
208
- m13 = te[8],
209
- m21 = te[1],
210
- m22 = te[5],
211
- m23 = te[9],
212
- m31 = te[2],
213
- m32 = te[6],
214
- m33 = te[10],
215
- trace = m11 + m22 + m33,
216
- s;
217
-
218
- if (trace > 0) {
219
- s = 0.5 / Math.sqrt(trace + 1.0);
220
- this._w = 0.25 / s;
221
- this._x = (m32 - m23) * s;
222
- this._y = (m13 - m31) * s;
223
- this._z = (m21 - m12) * s;
224
- } else if (m11 > m22 && m11 > m33) {
225
- s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
226
- this._w = (m32 - m23) / s;
227
- this._x = 0.25 * s;
228
- this._y = (m12 + m21) / s;
229
- this._z = (m13 + m31) / s;
230
- } else if (m22 > m33) {
231
- s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
232
- this._w = (m13 - m31) / s;
233
- this._x = (m12 + m21) / s;
234
- this._y = 0.25 * s;
235
- this._z = (m23 + m32) / s;
236
- } else {
237
- s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
238
- this._w = (m21 - m12) / s;
239
- this._x = (m13 + m31) / s;
240
- this._y = (m23 + m32) / s;
241
- this._z = 0.25 * s;
242
- }
243
-
244
- this._onChangeCallback();
245
-
246
- return this;
247
- },
248
- setFromUnitVectors: function (vFrom, vTo) {
249
- // assumes direction vectors vFrom and vTo are normalized
250
- var EPS = 0.000001;
251
- var r = vFrom.dot(vTo) + 1;
252
-
253
- if (r < EPS) {
254
- r = 0;
255
-
256
- if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {
257
- this._x = -vFrom.y;
258
- this._y = vFrom.x;
259
- this._z = 0;
260
- this._w = r;
261
- } else {
262
- this._x = 0;
263
- this._y = -vFrom.z;
264
- this._z = vFrom.y;
265
- this._w = r;
266
- }
267
- } else {
268
- // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
269
- this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
270
- this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
271
- this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
272
- this._w = r;
273
- }
274
-
275
- return this.normalize();
276
- },
277
- angleTo: function (q) {
278
- return 2 * Math.acos(Math.abs(_Math.clamp(this.dot(q), -1, 1)));
279
- },
280
- rotateTowards: function (q, step) {
281
- var angle = this.angleTo(q);
282
- if (angle === 0) return this;
283
- var t = Math.min(1, step / angle);
284
- this.slerp(q, t);
285
- return this;
286
- },
287
- inverse: function () {
288
- // quaternion is assumed to have unit length
289
- return this.conjugate();
290
- },
291
- conjugate: function () {
292
- this._x *= -1;
293
- this._y *= -1;
294
- this._z *= -1;
295
-
296
- this._onChangeCallback();
297
-
298
- return this;
299
- },
300
- dot: function (v) {
301
- return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
302
- },
303
- lengthSq: function () {
304
- return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
305
- },
306
- length: function () {
307
- return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
308
- },
309
- normalize: function () {
310
- var l = this.length();
311
-
312
- if (l === 0) {
313
- this._x = 0;
314
- this._y = 0;
315
- this._z = 0;
316
- this._w = 1;
317
- } else {
318
- l = 1 / l;
319
- this._x = this._x * l;
320
- this._y = this._y * l;
321
- this._z = this._z * l;
322
- this._w = this._w * l;
323
- }
324
-
325
- this._onChangeCallback();
326
-
327
- return this;
328
- },
329
- multiply: function (q, p) {
330
- if (p !== undefined) {
331
- console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
332
- return this.multiplyQuaternions(q, p);
333
- }
334
-
335
- return this.multiplyQuaternions(this, q);
336
- },
337
- premultiply: function (q) {
338
- return this.multiplyQuaternions(q, this);
339
- },
340
- multiplyQuaternions: function (a, b) {
341
- // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
342
- var qax = a._x,
343
- qay = a._y,
344
- qaz = a._z,
345
- qaw = a._w;
346
- var qbx = b._x,
347
- qby = b._y,
348
- qbz = b._z,
349
- qbw = b._w;
350
- this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
351
- this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
352
- this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
353
- this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
354
-
355
- this._onChangeCallback();
356
-
357
- return this;
358
- },
359
- slerp: function (qb, t) {
360
- if (t === 0) return this;
361
- if (t === 1) return this.copy(qb);
362
- var x = this._x,
363
- y = this._y,
364
- z = this._z,
365
- w = this._w; // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
366
-
367
- var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
368
-
369
- if (cosHalfTheta < 0) {
370
- this._w = -qb._w;
371
- this._x = -qb._x;
372
- this._y = -qb._y;
373
- this._z = -qb._z;
374
- cosHalfTheta = -cosHalfTheta;
375
- } else {
376
- this.copy(qb);
377
- }
378
-
379
- if (cosHalfTheta >= 1.0) {
380
- this._w = w;
381
- this._x = x;
382
- this._y = y;
383
- this._z = z;
384
- return this;
385
- }
386
-
387
- var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
388
-
389
- if (sqrSinHalfTheta <= Number.EPSILON) {
390
- var s = 1 - t;
391
- this._w = s * w + t * this._w;
392
- this._x = s * x + t * this._x;
393
- this._y = s * y + t * this._y;
394
- this._z = s * z + t * this._z;
395
- this.normalize();
396
-
397
- this._onChangeCallback();
398
-
399
- return this;
400
- }
401
-
402
- var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);
403
- var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);
404
- var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,
405
- ratioB = Math.sin(t * halfTheta) / sinHalfTheta;
406
- this._w = w * ratioA + this._w * ratioB;
407
- this._x = x * ratioA + this._x * ratioB;
408
- this._y = y * ratioA + this._y * ratioB;
409
- this._z = z * ratioA + this._z * ratioB;
410
-
411
- this._onChangeCallback();
412
-
413
- return this;
414
- },
415
- equals: function (quaternion) {
416
- return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w;
417
- },
418
- fromArray: function (array, offset) {
419
- if (offset === undefined) offset = 0;
420
- this._x = array[offset];
421
- this._y = array[offset + 1];
422
- this._z = array[offset + 2];
423
- this._w = array[offset + 3];
424
-
425
- this._onChangeCallback();
426
-
427
- return this;
428
- },
429
- toArray: function (array, offset) {
430
- if (array === undefined) array = [];
431
- if (offset === undefined) offset = 0;
432
- array[offset] = this._x;
433
- array[offset + 1] = this._y;
434
- array[offset + 2] = this._z;
435
- array[offset + 3] = this._w;
436
- return array;
437
- },
438
- _onChange: function (callback) {
439
- this._onChangeCallback = callback;
440
- return this;
441
- },
442
- _onChangeCallback: function () {}
443
- });
444
- export { Quaternion };
445
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL1F1YXRlcm5pb24uanMiXSwibmFtZXMiOlsiX01hdGgiLCJRdWF0ZXJuaW9uIiwieCIsInkiLCJ6IiwidyIsIl94IiwiX3kiLCJfeiIsIl93IiwidW5kZWZpbmVkIiwiT2JqZWN0IiwiYXNzaWduIiwic2xlcnAiLCJxYSIsInFiIiwicW0iLCJ0IiwiY29weSIsInNsZXJwRmxhdCIsImRzdCIsImRzdE9mZnNldCIsInNyYzAiLCJzcmNPZmZzZXQwIiwic3JjMSIsInNyY09mZnNldDEiLCJ4MCIsInkwIiwiejAiLCJ3MCIsIngxIiwieTEiLCJ6MSIsIncxIiwicyIsImNvcyIsImRpciIsInNxclNpbiIsIk51bWJlciIsIkVQU0lMT04iLCJzaW4iLCJNYXRoIiwic3FydCIsImxlbiIsImF0YW4yIiwidERpciIsImYiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvdG90eXBlIiwiZ2V0Iiwic2V0IiwidmFsdWUiLCJfb25DaGFuZ2VDYWxsYmFjayIsImlzUXVhdGVybmlvbiIsImNsb25lIiwiY29uc3RydWN0b3IiLCJxdWF0ZXJuaW9uIiwic2V0RnJvbUV1bGVyIiwiZXVsZXIiLCJ1cGRhdGUiLCJpc0V1bGVyIiwiRXJyb3IiLCJvcmRlciIsImMxIiwiYzIiLCJjMyIsInMxIiwiczIiLCJzMyIsInNldEZyb21BeGlzQW5nbGUiLCJheGlzIiwiYW5nbGUiLCJoYWxmQW5nbGUiLCJzZXRGcm9tUm90YXRpb25NYXRyaXgiLCJtIiwidGUiLCJlbGVtZW50cyIsIm0xMSIsIm0xMiIsIm0xMyIsIm0yMSIsIm0yMiIsIm0yMyIsIm0zMSIsIm0zMiIsIm0zMyIsInRyYWNlIiwic2V0RnJvbVVuaXRWZWN0b3JzIiwidkZyb20iLCJ2VG8iLCJFUFMiLCJyIiwiZG90IiwiYWJzIiwibm9ybWFsaXplIiwiYW5nbGVUbyIsInEiLCJhY29zIiwiY2xhbXAiLCJyb3RhdGVUb3dhcmRzIiwic3RlcCIsIm1pbiIsImludmVyc2UiLCJjb25qdWdhdGUiLCJ2IiwibGVuZ3RoU3EiLCJsZW5ndGgiLCJsIiwibXVsdGlwbHkiLCJwIiwiY29uc29sZSIsIndhcm4iLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicHJlbXVsdGlwbHkiLCJhIiwiYiIsInFheCIsInFheSIsInFheiIsInFhdyIsInFieCIsInFieSIsInFieiIsInFidyIsImNvc0hhbGZUaGV0YSIsInNxclNpbkhhbGZUaGV0YSIsInNpbkhhbGZUaGV0YSIsImhhbGZUaGV0YSIsInJhdGlvQSIsInJhdGlvQiIsImVxdWFscyIsImZyb21BcnJheSIsImFycmF5Iiwib2Zmc2V0IiwidG9BcnJheSIsIl9vbkNoYW5nZSIsImNhbGxiYWNrIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxTQUFTQSxLQUFULFFBQXNCLFdBQXRCOztBQUVBLFNBQVNDLFVBQVQsQ0FBcUJDLENBQXJCLEVBQXdCQyxDQUF4QixFQUEyQkMsQ0FBM0IsRUFBOEJDLENBQTlCLEVBQWtDO0FBRWpDLE9BQUtDLEVBQUwsR0FBVUosQ0FBQyxJQUFJLENBQWY7QUFDQSxPQUFLSyxFQUFMLEdBQVVKLENBQUMsSUFBSSxDQUFmO0FBQ0EsT0FBS0ssRUFBTCxHQUFVSixDQUFDLElBQUksQ0FBZjtBQUNBLE9BQUtLLEVBQUwsR0FBWUosQ0FBQyxLQUFLSyxTQUFSLEdBQXNCTCxDQUF0QixHQUEwQixDQUFwQztBQUVBOztBQUVETSxNQUFNLENBQUNDLE1BQVAsQ0FBZVgsVUFBZixFQUEyQjtBQUUxQlksRUFBQUEsS0FBSyxFQUFFLFVBQVdDLEVBQVgsRUFBZUMsRUFBZixFQUFtQkMsRUFBbkIsRUFBdUJDLENBQXZCLEVBQTJCO0FBRWpDLFdBQU9ELEVBQUUsQ0FBQ0UsSUFBSCxDQUFTSixFQUFULEVBQWNELEtBQWQsQ0FBcUJFLEVBQXJCLEVBQXlCRSxDQUF6QixDQUFQO0FBRUEsR0FOeUI7QUFRMUJFLEVBQUFBLFNBQVMsRUFBRSxVQUFXQyxHQUFYLEVBQWdCQyxTQUFoQixFQUEyQkMsSUFB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O0FBQ0E0SCxJQUFBQSxLQUFLLENBQUVDLE1BQU0sR0FBRyxDQUFYLENBQUwsR0FBc0IsS0FBSzVILEVBQTNCO0FBRUEsV0FBTzJILEtBQVA7QUFFQSxHQTFjbUM7QUE0Y3BDRyxFQUFBQSxTQUFTLEVBQUUsVUFBV0MsUUFBWCxFQUFzQjtBQUVoQyxTQUFLcEYsaUJBQUwsR0FBeUJvRixRQUF6QjtBQUVBLFdBQU8sSUFBUDtBQUVBLEdBbGRtQztBQW9kcENwRixFQUFBQSxpQkFBaUIsRUFBRSxZQUFZLENBQUU7QUFwZEcsQ0FBckM7QUF5ZEEsU0FBU25ELFVBQVQiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuL01hdGguanMnO1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHRpc1F1YXRlcm5pb246IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl93ID0gdztcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyO1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdHZhciBjMSA9IGNvcyggeCAvIDIgKTtcblx0XHR2YXIgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0dmFyIGMzID0gY29zKCB6IC8gMiApO1xuXG5cdFx0dmFyIHMxID0gc2luKCB4IC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHR2YXIgczMgPSBzaW4oIHogLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR2YXIgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHZhciByID0gdkZyb20uZG90KCB2VG8gKSArIDE7XG5cblx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdHIgPSAwO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAtIHZGcm9tLnk7XG5cdFx0XHRcdHRoaXMuX3kgPSB2RnJvbS54O1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3kgPSAtIHZGcm9tLno7XG5cdFx0XHRcdHRoaXMuX3ogPSB2RnJvbS55O1xuXHRcdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7IC8vIGlubGluZWQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY3kgb24gVmVjdG9yM1xuXG5cdFx0XHR0aGlzLl94ID0gdkZyb20ueSAqIHZUby56IC0gdkZyb20ueiAqIHZUby55O1xuXHRcdFx0dGhpcy5feSA9IHZGcm9tLnogKiB2VG8ueCAtIHZGcm9tLnggKiB2VG8uejtcblx0XHRcdHRoaXMuX3ogPSB2RnJvbS54ICogdlRvLnkgLSB2RnJvbS55ICogdlRvLng7XG5cdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIDIgKiBNYXRoLmFjb3MoIE1hdGguYWJzKCBfTWF0aC5jbGFtcCggdGhpcy5kb3QoIHEgKSwgLSAxLCAxICkgKSApO1xuXG5cdH0sXG5cblx0cm90YXRlVG93YXJkczogZnVuY3Rpb24gKCBxLCBzdGVwICkge1xuXG5cdFx0dmFyIGFuZ2xlID0gdGhpcy5hbmdsZVRvKCBxICk7XG5cblx0XHRpZiAoIGFuZ2xlID09PSAwICkgcmV0dXJuIHRoaXM7XG5cblx0XHR2YXIgdCA9IE1hdGgubWluKCAxLCBzdGVwIC8gYW5nbGUgKTtcblxuXHRcdHRoaXMuc2xlcnAoIHEsIHQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aW52ZXJzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblxuXHRcdHJldHVybiB0aGlzLmNvbmp1Z2F0ZSgpO1xuXG5cdH0sXG5cblx0Y29uanVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl94ICo9IC0gMTtcblx0XHR0aGlzLl95ICo9IC0gMTtcblx0XHR0aGlzLl96ICo9IC0gMTtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7XG5cblx0XHRpZiAoIHAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5UXVhdGVybmlvbnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxuXG5cdFx0dmFyIHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XG5cdFx0dmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwL1xuXG5cdFx0dmFyIGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejtcblxuXHRcdGlmICggY29zSGFsZlRoZXRhIDwgMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IC0gcWIuX3c7XG5cdFx0XHR0aGlzLl94ID0gLSBxYi5feDtcblx0XHRcdHRoaXMuX3kgPSAtIHFiLl95O1xuXHRcdFx0dGhpcy5feiA9IC0gcWIuX3o7XG5cblx0XHRcdGNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdztcblx0XHRcdHRoaXMuX3ggPSB4O1xuXHRcdFx0dGhpcy5feSA9IHk7XG5cdFx0XHR0aGlzLl96ID0gejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgc3FyU2luSGFsZlRoZXRhID0gMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhO1xuXG5cdFx0aWYgKCBzcXJTaW5IYWxmVGhldGEgPD0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdHZhciBzID0gMSAtIHQ7XG5cdFx0XHR0aGlzLl93ID0gcyAqIHcgKyB0ICogdGhpcy5fdztcblx0XHRcdHRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94O1xuXHRcdFx0dGhpcy5feSA9IHMgKiB5ICsgdCAqIHRoaXMuX3k7XG5cdFx0XHR0aGlzLl96ID0gcyAqIHogKyB0ICogdGhpcy5fejtcblxuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCBzcXJTaW5IYWxmVGhldGEgKTtcblx0XHR2YXIgaGFsZlRoZXRhID0gTWF0aC5hdGFuMiggc2luSGFsZlRoZXRhLCBjb3NIYWxmVGhldGEgKTtcblx0XHR2YXIgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcblxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0cmV0dXJuICggcXVhdGVybmlvbi5feCA9PT0gdGhpcy5feCApICYmICggcXVhdGVybmlvbi5feSA9PT0gdGhpcy5feSApICYmICggcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiApICYmICggcXVhdGVybmlvbi5fdyA9PT0gdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy5fdyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0X29uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRfb25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG5cbmV4cG9ydCB7IFF1YXRlcm5pb24gfTsiXX0=