tsparticles 1.41.0 → 1.41.4

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 (205) hide show
  1. package/Core/Container.js +2 -2
  2. package/Core/Interfaces/IExternalInteractor.d.ts +1 -1
  3. package/Core/Interfaces/IParticlesInteractor.d.ts +1 -1
  4. package/Core/Particle.js +2 -2
  5. package/Core/Particles.d.ts +3 -3
  6. package/Core/Particles.js +7 -7
  7. package/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  8. package/Core/Utils/FrameManager.d.ts +1 -1
  9. package/Core/Utils/FrameManager.js +2 -2
  10. package/Core/Utils/InteractionManager.d.ts +2 -2
  11. package/Core/Utils/InteractionManager.js +4 -4
  12. package/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  13. package/Interactions/External/Attract/Attractor.d.ts +1 -1
  14. package/Interactions/External/Attract/Attractor.js +1 -1
  15. package/Interactions/External/Bounce/Bouncer.d.ts +1 -1
  16. package/Interactions/External/Bounce/Bouncer.js +1 -1
  17. package/Interactions/External/Bubble/Bubbler.d.ts +1 -1
  18. package/Interactions/External/Bubble/Bubbler.js +1 -1
  19. package/Interactions/External/Connect/Connector.d.ts +1 -1
  20. package/Interactions/External/Connect/Connector.js +1 -1
  21. package/Interactions/External/Grab/Grabber.d.ts +1 -1
  22. package/Interactions/External/Grab/Grabber.js +1 -1
  23. package/Interactions/External/Repulse/Repulser.d.ts +1 -1
  24. package/Interactions/External/Repulse/Repulser.js +1 -1
  25. package/Interactions/External/Trail/TrailMaker.d.ts +1 -1
  26. package/Interactions/External/Trail/TrailMaker.js +1 -1
  27. package/Interactions/Particles/Attract/Attractor.d.ts +1 -1
  28. package/Interactions/Particles/Attract/Attractor.js +1 -1
  29. package/Interactions/Particles/Collisions/Collider.d.ts +1 -1
  30. package/Interactions/Particles/Collisions/Collider.js +1 -1
  31. package/Interactions/Particles/Links/Linker.d.ts +1 -1
  32. package/Interactions/Particles/Links/Linker.js +1 -1
  33. package/Plugins/PolygonMask/PolygonMaskInstance.js +1 -1
  34. package/Updaters/Opacity/OpacityUpdater.js +7 -5
  35. package/Updaters/Size/SizeUpdater.js +6 -5
  36. package/browser/Core/Container.js +2 -2
  37. package/browser/Core/Interfaces/IExternalInteractor.d.ts +1 -1
  38. package/browser/Core/Interfaces/IParticlesInteractor.d.ts +1 -1
  39. package/browser/Core/Particle.js +2 -2
  40. package/browser/Core/Particles.d.ts +3 -3
  41. package/browser/Core/Particles.js +7 -7
  42. package/browser/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  43. package/browser/Core/Utils/FrameManager.d.ts +1 -1
  44. package/browser/Core/Utils/FrameManager.js +2 -2
  45. package/browser/Core/Utils/InteractionManager.d.ts +2 -2
  46. package/browser/Core/Utils/InteractionManager.js +4 -4
  47. package/browser/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  48. package/browser/Interactions/External/Attract/Attractor.d.ts +1 -1
  49. package/browser/Interactions/External/Attract/Attractor.js +1 -1
  50. package/browser/Interactions/External/Bounce/Bouncer.d.ts +1 -1
  51. package/browser/Interactions/External/Bounce/Bouncer.js +1 -1
  52. package/browser/Interactions/External/Bubble/Bubbler.d.ts +1 -1
  53. package/browser/Interactions/External/Bubble/Bubbler.js +1 -1
  54. package/browser/Interactions/External/Connect/Connector.d.ts +1 -1
  55. package/browser/Interactions/External/Connect/Connector.js +1 -1
  56. package/browser/Interactions/External/Grab/Grabber.d.ts +1 -1
  57. package/browser/Interactions/External/Grab/Grabber.js +1 -1
  58. package/browser/Interactions/External/Repulse/Repulser.d.ts +1 -1
  59. package/browser/Interactions/External/Repulse/Repulser.js +1 -1
  60. package/browser/Interactions/External/Trail/TrailMaker.d.ts +1 -1
  61. package/browser/Interactions/External/Trail/TrailMaker.js +1 -1
  62. package/browser/Interactions/Particles/Attract/Attractor.d.ts +1 -1
  63. package/browser/Interactions/Particles/Attract/Attractor.js +1 -1
  64. package/browser/Interactions/Particles/Collisions/Collider.d.ts +1 -1
  65. package/browser/Interactions/Particles/Collisions/Collider.js +1 -1
  66. package/browser/Interactions/Particles/Links/Linker.d.ts +1 -1
  67. package/browser/Interactions/Particles/Links/Linker.js +1 -1
  68. package/browser/Plugins/PolygonMask/PolygonMaskInstance.js +1 -1
  69. package/browser/Updaters/Opacity/OpacityUpdater.js +7 -5
  70. package/browser/Updaters/Size/SizeUpdater.js +6 -5
  71. package/esm/Core/Container.js +2 -2
  72. package/esm/Core/Interfaces/IExternalInteractor.d.ts +1 -1
  73. package/esm/Core/Interfaces/IParticlesInteractor.d.ts +1 -1
  74. package/esm/Core/Particle.js +2 -2
  75. package/esm/Core/Particles.d.ts +3 -3
  76. package/esm/Core/Particles.js +7 -7
  77. package/esm/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  78. package/esm/Core/Utils/FrameManager.d.ts +1 -1
  79. package/esm/Core/Utils/FrameManager.js +2 -2
  80. package/esm/Core/Utils/InteractionManager.d.ts +2 -2
  81. package/esm/Core/Utils/InteractionManager.js +4 -4
  82. package/esm/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  83. package/esm/Interactions/External/Attract/Attractor.d.ts +1 -1
  84. package/esm/Interactions/External/Attract/Attractor.js +1 -1
  85. package/esm/Interactions/External/Bounce/Bouncer.d.ts +1 -1
  86. package/esm/Interactions/External/Bounce/Bouncer.js +1 -1
  87. package/esm/Interactions/External/Bubble/Bubbler.d.ts +1 -1
  88. package/esm/Interactions/External/Bubble/Bubbler.js +1 -1
  89. package/esm/Interactions/External/Connect/Connector.d.ts +1 -1
  90. package/esm/Interactions/External/Connect/Connector.js +1 -1
  91. package/esm/Interactions/External/Grab/Grabber.d.ts +1 -1
  92. package/esm/Interactions/External/Grab/Grabber.js +1 -1
  93. package/esm/Interactions/External/Repulse/Repulser.d.ts +1 -1
  94. package/esm/Interactions/External/Repulse/Repulser.js +1 -1
  95. package/esm/Interactions/External/Trail/TrailMaker.d.ts +1 -1
  96. package/esm/Interactions/External/Trail/TrailMaker.js +1 -1
  97. package/esm/Interactions/Particles/Attract/Attractor.d.ts +1 -1
  98. package/esm/Interactions/Particles/Attract/Attractor.js +1 -1
  99. package/esm/Interactions/Particles/Collisions/Collider.d.ts +1 -1
  100. package/esm/Interactions/Particles/Collisions/Collider.js +1 -1
  101. package/esm/Interactions/Particles/Links/Linker.d.ts +1 -1
  102. package/esm/Interactions/Particles/Links/Linker.js +1 -1
  103. package/esm/Plugins/PolygonMask/PolygonMaskInstance.js +1 -1
  104. package/esm/Updaters/Opacity/OpacityUpdater.js +7 -5
  105. package/esm/Updaters/Size/SizeUpdater.js +6 -5
  106. package/package.json +1 -1
  107. package/report.html +6 -5
  108. package/report.slim.html +6 -5
  109. package/tsparticles.engine.js +17 -17
  110. package/tsparticles.engine.min.js +2 -2
  111. package/tsparticles.interaction.external.attract.js +16 -16
  112. package/tsparticles.interaction.external.attract.min.js +2 -2
  113. package/tsparticles.interaction.external.bounce.js +16 -16
  114. package/tsparticles.interaction.external.bounce.min.js +2 -2
  115. package/tsparticles.interaction.external.bubble.js +16 -16
  116. package/tsparticles.interaction.external.bubble.min.js +2 -2
  117. package/tsparticles.interaction.external.connect.js +16 -16
  118. package/tsparticles.interaction.external.connect.min.js +2 -2
  119. package/tsparticles.interaction.external.grab.js +16 -16
  120. package/tsparticles.interaction.external.grab.min.js +2 -2
  121. package/tsparticles.interaction.external.repulse.js +16 -16
  122. package/tsparticles.interaction.external.repulse.min.js +2 -2
  123. package/tsparticles.interaction.external.trail.js +16 -16
  124. package/tsparticles.interaction.external.trail.min.js +2 -2
  125. package/tsparticles.interaction.particles.attract.js +16 -16
  126. package/tsparticles.interaction.particles.attract.min.js +2 -2
  127. package/tsparticles.interaction.particles.collisions.js +16 -16
  128. package/tsparticles.interaction.particles.collisions.min.js +2 -2
  129. package/tsparticles.interaction.particles.links.js +16 -16
  130. package/tsparticles.interaction.particles.links.min.js +2 -2
  131. package/tsparticles.js +35 -35
  132. package/tsparticles.min.js +2 -2
  133. package/tsparticles.pathseg.min.js +1 -1
  134. package/tsparticles.plugins.absorbers.js +15 -15
  135. package/tsparticles.plugins.absorbers.min.js +1 -1
  136. package/tsparticles.plugins.emitters.js +15 -15
  137. package/tsparticles.plugins.emitters.min.js +1 -1
  138. package/tsparticles.plugins.polygonMask.js +17 -17
  139. package/tsparticles.plugins.polygonMask.min.js +2 -2
  140. package/tsparticles.shape.circle.min.js +1 -1
  141. package/tsparticles.shape.image.js +15 -15
  142. package/tsparticles.shape.image.min.js +1 -1
  143. package/tsparticles.shape.line.min.js +1 -1
  144. package/tsparticles.shape.polygon.min.js +1 -1
  145. package/tsparticles.shape.square.min.js +1 -1
  146. package/tsparticles.shape.star.min.js +1 -1
  147. package/tsparticles.shape.text.js +15 -15
  148. package/tsparticles.shape.text.min.js +1 -1
  149. package/tsparticles.slim.js +32 -32
  150. package/tsparticles.slim.min.js +2 -2
  151. package/tsparticles.updater.angle.js +15 -15
  152. package/tsparticles.updater.angle.min.js +1 -1
  153. package/tsparticles.updater.color.js +15 -15
  154. package/tsparticles.updater.color.min.js +1 -1
  155. package/tsparticles.updater.life.js +15 -15
  156. package/tsparticles.updater.life.min.js +1 -1
  157. package/tsparticles.updater.opacity.js +18 -18
  158. package/tsparticles.updater.opacity.min.js +2 -2
  159. package/tsparticles.updater.outModes.js +15 -15
  160. package/tsparticles.updater.outModes.min.js +1 -1
  161. package/tsparticles.updater.roll.js +15 -15
  162. package/tsparticles.updater.roll.min.js +1 -1
  163. package/tsparticles.updater.size.js +18 -18
  164. package/tsparticles.updater.size.min.js +2 -2
  165. package/tsparticles.updater.strokeColor.js +15 -15
  166. package/tsparticles.updater.strokeColor.min.js +1 -1
  167. package/tsparticles.updater.tilt.js +15 -15
  168. package/tsparticles.updater.tilt.min.js +1 -1
  169. package/tsparticles.updater.wobble.js +15 -15
  170. package/tsparticles.updater.wobble.min.js +1 -1
  171. package/umd/Core/Container.js +2 -2
  172. package/umd/Core/Interfaces/IExternalInteractor.d.ts +1 -1
  173. package/umd/Core/Interfaces/IParticlesInteractor.d.ts +1 -1
  174. package/umd/Core/Particle.js +2 -2
  175. package/umd/Core/Particles.d.ts +3 -3
  176. package/umd/Core/Particles.js +7 -7
  177. package/umd/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  178. package/umd/Core/Utils/FrameManager.d.ts +1 -1
  179. package/umd/Core/Utils/FrameManager.js +2 -2
  180. package/umd/Core/Utils/InteractionManager.d.ts +2 -2
  181. package/umd/Core/Utils/InteractionManager.js +4 -4
  182. package/umd/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  183. package/umd/Interactions/External/Attract/Attractor.d.ts +1 -1
  184. package/umd/Interactions/External/Attract/Attractor.js +1 -1
  185. package/umd/Interactions/External/Bounce/Bouncer.d.ts +1 -1
  186. package/umd/Interactions/External/Bounce/Bouncer.js +1 -1
  187. package/umd/Interactions/External/Bubble/Bubbler.d.ts +1 -1
  188. package/umd/Interactions/External/Bubble/Bubbler.js +1 -1
  189. package/umd/Interactions/External/Connect/Connector.d.ts +1 -1
  190. package/umd/Interactions/External/Connect/Connector.js +1 -1
  191. package/umd/Interactions/External/Grab/Grabber.d.ts +1 -1
  192. package/umd/Interactions/External/Grab/Grabber.js +1 -1
  193. package/umd/Interactions/External/Repulse/Repulser.d.ts +1 -1
  194. package/umd/Interactions/External/Repulse/Repulser.js +1 -1
  195. package/umd/Interactions/External/Trail/TrailMaker.d.ts +1 -1
  196. package/umd/Interactions/External/Trail/TrailMaker.js +1 -1
  197. package/umd/Interactions/Particles/Attract/Attractor.d.ts +1 -1
  198. package/umd/Interactions/Particles/Attract/Attractor.js +1 -1
  199. package/umd/Interactions/Particles/Collisions/Collider.d.ts +1 -1
  200. package/umd/Interactions/Particles/Collisions/Collider.js +1 -1
  201. package/umd/Interactions/Particles/Links/Linker.d.ts +1 -1
  202. package/umd/Interactions/Particles/Links/Linker.js +1 -1
  203. package/umd/Plugins/PolygonMask/PolygonMaskInstance.js +1 -1
  204. package/umd/Updaters/Opacity/OpacityUpdater.js +7 -5
  205. package/umd/Updaters/Size/SizeUpdater.js +6 -5
@@ -544,20 +544,20 @@
544
544
  }
545
545
  }
546
546
  }
547
- externalInteract(delta) {
547
+ async externalInteract(delta) {
548
548
  for (const interactor of this.externalInteractors) {
549
549
  if (interactor.isEnabled()) {
550
- interactor.interact(delta);
550
+ await interactor.interact(delta);
551
551
  }
552
552
  }
553
553
  }
554
- particlesInteract(particle, delta) {
554
+ async particlesInteract(particle, delta) {
555
555
  for (const interactor of this.externalInteractors) {
556
556
  interactor.reset(particle);
557
557
  }
558
558
  for (const interactor of this.particleInteractors) {
559
559
  if (interactor.isEnabled(particle)) {
560
- interactor.interact(particle, delta);
560
+ await interactor.interact(particle, delta);
561
561
  }
562
562
  }
563
563
  }
@@ -2714,10 +2714,10 @@
2714
2714
  return this.getRadius() ** 2 * Math.PI / 2;
2715
2715
  }
2716
2716
  getFillColor() {
2717
- var _a, _b, _c;
2717
+ var _a, _b;
2718
2718
  const color = (_a = this.bubble.color) !== null && _a !== void 0 ? _a : getHslFromAnimation(this.color);
2719
2719
  if (color && this.roll && (this.backColor || this.roll.alter)) {
2720
- const rolled = Math.floor(((_c = (_b = this.roll) === null || _b === void 0 ? void 0 : _b.angle) !== null && _c !== void 0 ? _c : 0) / (Math.PI / 2)) % 2;
2720
+ const backFactor = this.options.roll.mode === "both" ? 2 : 1, backSum = this.options.roll.mode === "horizontal" ? Math.PI / 2 : 0, rolled = Math.floor((((_b = this.roll.angle) !== null && _b !== void 0 ? _b : 0) + backSum) / (Math.PI / backFactor)) % 2;
2721
2721
  if (rolled) {
2722
2722
  if (this.backColor) {
2723
2723
  return this.backColor;
@@ -2949,10 +2949,10 @@
2949
2949
  }
2950
2950
  container.pathGenerator.init(container);
2951
2951
  }
2952
- redraw() {
2952
+ async redraw() {
2953
2953
  this.clear();
2954
2954
  this.init();
2955
- this.draw({
2955
+ await this.draw({
2956
2956
  value: 0,
2957
2957
  factor: 0
2958
2958
  });
@@ -2977,7 +2977,7 @@
2977
2977
  remove(particle, group, override) {
2978
2978
  this.removeAt(this.array.indexOf(particle), undefined, group, override);
2979
2979
  }
2980
- update(delta) {
2980
+ async update(delta) {
2981
2981
  const container = this.container;
2982
2982
  const particlesToDelete = [];
2983
2983
  container.pathGenerator.update();
@@ -3011,23 +3011,23 @@
3011
3011
  for (const particle of particlesToDelete) {
3012
3012
  this.remove(particle);
3013
3013
  }
3014
- this.interactionManager.externalInteract(delta);
3014
+ await this.interactionManager.externalInteract(delta);
3015
3015
  for (const particle of container.particles.array) {
3016
3016
  for (const updater of this.updaters) {
3017
3017
  updater.update(particle, delta);
3018
3018
  }
3019
3019
  if (!particle.destroyed && !particle.spawning) {
3020
- this.interactionManager.particlesInteract(particle, delta);
3020
+ await this.interactionManager.particlesInteract(particle, delta);
3021
3021
  }
3022
3022
  }
3023
3023
  delete container.canvas.resizeFactor;
3024
3024
  }
3025
- draw(delta) {
3025
+ async draw(delta) {
3026
3026
  const container = this.container;
3027
3027
  container.canvas.clear();
3028
3028
  const canvasSize = this.container.canvas.size;
3029
3029
  this.quadTree = new QuadTree(new Rectangle(-canvasSize.width / 4, -canvasSize.height / 4, canvasSize.width * 3 / 2, canvasSize.height * 3 / 2), 4);
3030
- this.update(delta);
3030
+ await this.update(delta);
3031
3031
  if (this.needsSort) {
3032
3032
  this.zArray.sort(((a, b) => b.position.z - a.position.z || a.id - b.id));
3033
3033
  this.lastZIndex = this.zArray[this.zArray.length - 1].position.z;
@@ -3388,12 +3388,12 @@
3388
3388
  }
3389
3389
  draw(force) {
3390
3390
  let refreshTime = force;
3391
- this.drawAnimationFrame = animate()((timestamp => {
3391
+ this.drawAnimationFrame = animate()((async timestamp => {
3392
3392
  if (refreshTime) {
3393
3393
  this.lastFrameTime = undefined;
3394
3394
  refreshTime = false;
3395
3395
  }
3396
- this.drawer.nextFrame(timestamp);
3396
+ await this.drawer.nextFrame(timestamp);
3397
3397
  }));
3398
3398
  }
3399
3399
  getAnimationStatus() {
@@ -1,2 +1,2 @@
1
- /*! tsParticles v1.41.0 by Matteo Bruni */
1
+ /*! tsParticles v1.41.4 by Matteo Bruni */
2
2
  !function(e,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var t=n();for(var o in t)("object"==typeof exports?exports:e)[o]=t[o]}}(window,(function(){return function(){"use strict";var e={d:function(n,t){for(var o in t)e.o(t,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:t[o]})},o:function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},n={};e.r(n),e.d(n,{loadRollUpdater:function(){return b}});class t{}t.generatedAttribute="generated",t.randomColorValue="random",t.midColorValue="mid",t.touchEndEvent="touchend",t.mouseDownEvent="mousedown",t.mouseUpEvent="mouseup",t.mouseMoveEvent="mousemove",t.touchStartEvent="touchstart",t.touchMoveEvent="touchmove",t.mouseLeaveEvent="mouseleave",t.mouseOutEvent="mouseout",t.touchCancelEvent="touchcancel",t.resizeEvent="resize",t.visibilityChangeEvent="visibilitychange",t.noPolygonDataLoaded="No polygon data loaded.",t.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function o(e){const n=l(e);let t=a(e);return n===t&&(t=0),Math.random()*(n-t)+t}function r(e){return"number"==typeof e?e:o(e)}function a(e){return"number"==typeof e?e:e.min}function l(e){return"number"==typeof e?e:e.max}function s(e,n){if(e===n||void 0===n&&"number"==typeof e)return e;const t=a(e),o=l(e);return void 0!==n?{min:Math.min(t,n),max:Math.max(o,n)}:s(t,o)}function i(e,n,t=!0){return e[void 0!==n&&t?n%e.length:function(e){return Math.floor(Math.random()*e.length)}(e)]}function u(e,n,t){let o=t;return o<0&&(o+=1),o>1&&(o-=1),o<1/6?e+6*(n-e)*o:o<.5?n:o<2/3?e+(n-e)*(2/3-o)*6:e}function d(e){if(e.startsWith("rgb")){const n=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.]+)\s*)?\)/i.exec(e);return n?{a:n.length>4?parseFloat(n[5]):1,b:parseInt(n[3],10),g:parseInt(n[2],10),r:parseInt(n[1],10)}:void 0}if(e.startsWith("hsl")){const n=/hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.]+)\s*)?\)/i.exec(e);return n?function(e){const n=v(e);return{a:e.a,b:n.b,g:n.g,r:n.r}}({a:n.length>4?parseFloat(n[5]):1,h:parseInt(n[1],10),l:parseInt(n[3],10),s:parseInt(n[2],10)}):void 0}if(e.startsWith("hsv")){const n=/hsva?\(\s*(\d+)°\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.]+)\s*)?\)/i.exec(e);return n?function(e){const n=h(e);return{a:e.a,b:n.b,g:n.g,r:n.r}}({a:n.length>4?parseFloat(n[5]):1,h:parseInt(n[1],10),s:parseInt(n[2],10),v:parseInt(n[3],10)}):void 0}{const n=/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i,t=e.replace(n,((e,n,t,o,r)=>n+n+t+t+o+o+(void 0!==r?r+r:""))),o=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(t);return o?{a:void 0!==o[4]?parseInt(o[4],16)/255:1,b:parseInt(o[3],16),g:parseInt(o[2],16),r:parseInt(o[1],16)}:void 0}}function c(e,n,o=!0){var r,a,l;if(void 0===e)return;const s="string"==typeof e?{value:e}:e;let u;if("string"==typeof s.value)u=s.value===t.randomColorValue?p():function(e){return d(e)}(s.value);else if(s.value instanceof Array){u=c({value:i(s.value,n,o)})}else{const e=s.value,n=null!==(r=e.rgb)&&void 0!==r?r:s.value;if(void 0!==n.r)u=n;else{const n=null!==(a=e.hsl)&&void 0!==a?a:s.value;if(void 0!==n.h&&void 0!==n.l)u=v(n);else{const n=null!==(l=e.hsv)&&void 0!==l?l:s.value;void 0!==n.h&&void 0!==n.v&&(u=h(n))}}}return u}function f(e,n,t=!0){const o=c(e,n,t);return void 0!==o?function(e){const n=e.r/255,t=e.g/255,o=e.b/255,r=Math.max(n,t,o),a=Math.min(n,t,o),l={h:0,l:(r+a)/2,s:0};r!=a&&(l.s=l.l<.5?(r-a)/(r+a):(r-a)/(2-r-a),l.h=n===r?(t-o)/(r-a):l.h=t===r?2+(o-n)/(r-a):4+(n-t)/(r-a));l.l*=100,l.s*=100,l.h*=60,l.h<0&&(l.h+=360);return l}(o):void 0}function v(e){const n={b:0,g:0,r:0},t={h:e.h/360,l:e.l/100,s:e.s/100};if(0===t.s)n.b=t.l,n.g=t.l,n.r=t.l;else{const e=t.l<.5?t.l*(1+t.s):t.l+t.s-t.l*t.s,o=2*t.l-e;n.r=u(o,e,t.h+1/3),n.g=u(o,e,t.h),n.b=u(o,e,t.h-1/3)}return n.r=Math.floor(255*n.r),n.g=Math.floor(255*n.g),n.b=Math.floor(255*n.b),n}function h(e){const n={b:0,g:0,r:0},t=e.h/60,o=e.s/100,r=e.v/100,a=r*o,l=a*(1-Math.abs(t%2-1));let s;if(t>=0&&t<=1?s={r:a,g:l,b:0}:t>1&&t<=2?s={r:l,g:a,b:0}:t>2&&t<=3?s={r:0,g:a,b:l}:t>3&&t<=4?s={r:0,g:l,b:a}:t>4&&t<=5?s={r:l,g:0,b:a}:t>5&&t<=6&&(s={r:a,g:0,b:l}),s){const e=r-a;n.r=Math.floor(255*(s.r+e)),n.g=Math.floor(255*(s.g+e)),n.b=Math.floor(255*(s.b+e))}return n}function p(e){const n=null!=e?e:0;return{b:Math.floor(o(s(n,256))),g:Math.floor(o(s(n,256))),r:Math.floor(o(s(n,256)))}}new WeakMap;class g{init(e){const n=e.options.roll;if(n.enable)if(e.roll={angle:Math.random()*Math.PI*2,speed:r(n.speed)/360},n.backColor)e.backColor=f(n.backColor);else if(n.darken.enable&&n.enlighten.enable){const t=Math.random()>=.5?"darken":"enlighten";e.roll.alter={type:t,value:"darken"===t?n.darken.value:n.enlighten.value}}else n.darken.enable?e.roll.alter={type:"darken",value:n.darken.value}:n.enlighten.enable&&(e.roll.alter={type:"enlighten",value:n.enlighten.value});else e.roll={angle:0,speed:0}}isEnabled(e){const n=e.options.roll;return!e.destroyed&&!e.spawning&&n.enable}update(e,n){this.isEnabled(e)&&function(e,n){const t=e.options.roll;if(!e.roll||!t.enable)return;const o=e.roll.speed*n.factor,r=2*Math.PI;e.roll.angle+=o,e.roll.angle>r&&(e.roll.angle-=r)}(e,n)}}async function b(e){await e.addParticleUpdater("roll",(()=>new g))}return n}()}));
@@ -544,20 +544,20 @@
544
544
  }
545
545
  }
546
546
  }
547
- externalInteract(delta) {
547
+ async externalInteract(delta) {
548
548
  for (const interactor of this.externalInteractors) {
549
549
  if (interactor.isEnabled()) {
550
- interactor.interact(delta);
550
+ await interactor.interact(delta);
551
551
  }
552
552
  }
553
553
  }
554
- particlesInteract(particle, delta) {
554
+ async particlesInteract(particle, delta) {
555
555
  for (const interactor of this.externalInteractors) {
556
556
  interactor.reset(particle);
557
557
  }
558
558
  for (const interactor of this.particleInteractors) {
559
559
  if (interactor.isEnabled(particle)) {
560
- interactor.interact(particle, delta);
560
+ await interactor.interact(particle, delta);
561
561
  }
562
562
  }
563
563
  }
@@ -2714,10 +2714,10 @@
2714
2714
  return this.getRadius() ** 2 * Math.PI / 2;
2715
2715
  }
2716
2716
  getFillColor() {
2717
- var _a, _b, _c;
2717
+ var _a, _b;
2718
2718
  const color = (_a = this.bubble.color) !== null && _a !== void 0 ? _a : getHslFromAnimation(this.color);
2719
2719
  if (color && this.roll && (this.backColor || this.roll.alter)) {
2720
- const rolled = Math.floor(((_c = (_b = this.roll) === null || _b === void 0 ? void 0 : _b.angle) !== null && _c !== void 0 ? _c : 0) / (Math.PI / 2)) % 2;
2720
+ const backFactor = this.options.roll.mode === "both" ? 2 : 1, backSum = this.options.roll.mode === "horizontal" ? Math.PI / 2 : 0, rolled = Math.floor((((_b = this.roll.angle) !== null && _b !== void 0 ? _b : 0) + backSum) / (Math.PI / backFactor)) % 2;
2721
2721
  if (rolled) {
2722
2722
  if (this.backColor) {
2723
2723
  return this.backColor;
@@ -2949,10 +2949,10 @@
2949
2949
  }
2950
2950
  container.pathGenerator.init(container);
2951
2951
  }
2952
- redraw() {
2952
+ async redraw() {
2953
2953
  this.clear();
2954
2954
  this.init();
2955
- this.draw({
2955
+ await this.draw({
2956
2956
  value: 0,
2957
2957
  factor: 0
2958
2958
  });
@@ -2977,7 +2977,7 @@
2977
2977
  remove(particle, group, override) {
2978
2978
  this.removeAt(this.array.indexOf(particle), undefined, group, override);
2979
2979
  }
2980
- update(delta) {
2980
+ async update(delta) {
2981
2981
  const container = this.container;
2982
2982
  const particlesToDelete = [];
2983
2983
  container.pathGenerator.update();
@@ -3011,23 +3011,23 @@
3011
3011
  for (const particle of particlesToDelete) {
3012
3012
  this.remove(particle);
3013
3013
  }
3014
- this.interactionManager.externalInteract(delta);
3014
+ await this.interactionManager.externalInteract(delta);
3015
3015
  for (const particle of container.particles.array) {
3016
3016
  for (const updater of this.updaters) {
3017
3017
  updater.update(particle, delta);
3018
3018
  }
3019
3019
  if (!particle.destroyed && !particle.spawning) {
3020
- this.interactionManager.particlesInteract(particle, delta);
3020
+ await this.interactionManager.particlesInteract(particle, delta);
3021
3021
  }
3022
3022
  }
3023
3023
  delete container.canvas.resizeFactor;
3024
3024
  }
3025
- draw(delta) {
3025
+ async draw(delta) {
3026
3026
  const container = this.container;
3027
3027
  container.canvas.clear();
3028
3028
  const canvasSize = this.container.canvas.size;
3029
3029
  this.quadTree = new QuadTree(new Rectangle(-canvasSize.width / 4, -canvasSize.height / 4, canvasSize.width * 3 / 2, canvasSize.height * 3 / 2), 4);
3030
- this.update(delta);
3030
+ await this.update(delta);
3031
3031
  if (this.needsSort) {
3032
3032
  this.zArray.sort(((a, b) => b.position.z - a.position.z || a.id - b.id));
3033
3033
  this.lastZIndex = this.zArray[this.zArray.length - 1].position.z;
@@ -3388,12 +3388,12 @@
3388
3388
  }
3389
3389
  draw(force) {
3390
3390
  let refreshTime = force;
3391
- this.drawAnimationFrame = animate()((timestamp => {
3391
+ this.drawAnimationFrame = animate()((async timestamp => {
3392
3392
  if (refreshTime) {
3393
3393
  this.lastFrameTime = undefined;
3394
3394
  refreshTime = false;
3395
3395
  }
3396
- this.drawer.nextFrame(timestamp);
3396
+ await this.drawer.nextFrame(timestamp);
3397
3397
  }));
3398
3398
  }
3399
3399
  getAnimationStatus() {
@@ -4908,7 +4908,7 @@
4908
4908
  const sizeVelocity = ((_a = particle.size.velocity) !== null && _a !== void 0 ? _a : 0) * delta.factor;
4909
4909
  const minValue = particle.size.min;
4910
4910
  const maxValue = particle.size.max;
4911
- if (!(!particle.destroyed && particle.size.enable && (((_b = particle.size.loops) !== null && _b !== void 0 ? _b : 0) <= 0 || ((_c = particle.size.loops) !== null && _c !== void 0 ? _c : 0) < ((_d = particle.size.maxLoops) !== null && _d !== void 0 ? _d : 0)))) {
4911
+ if (particle.destroyed || !particle.size.enable || ((_b = particle.size.maxLoops) !== null && _b !== void 0 ? _b : 0) > 0 && ((_c = particle.size.loops) !== null && _c !== void 0 ? _c : 0) > ((_d = particle.size.maxLoops) !== null && _d !== void 0 ? _d : 0)) {
4912
4912
  return;
4913
4913
  }
4914
4914
  switch (particle.size.status) {
@@ -4943,8 +4943,8 @@
4943
4943
  class SizeUpdater {
4944
4944
  init() {}
4945
4945
  isEnabled(particle) {
4946
- var _a, _b, _c;
4947
- return !particle.destroyed && !particle.spawning && particle.size.enable && (((_a = particle.size.loops) !== null && _a !== void 0 ? _a : 0) <= 0 || ((_b = particle.size.loops) !== null && _b !== void 0 ? _b : 0) < ((_c = particle.size.maxLoops) !== null && _c !== void 0 ? _c : 0));
4946
+ var _a, _b, _c, _d;
4947
+ return !particle.destroyed && !particle.spawning && particle.size.enable && (((_a = particle.size.maxLoops) !== null && _a !== void 0 ? _a : 0) <= 0 || ((_b = particle.size.maxLoops) !== null && _b !== void 0 ? _b : 0) > 0 && ((_c = particle.size.loops) !== null && _c !== void 0 ? _c : 0) < ((_d = particle.size.maxLoops) !== null && _d !== void 0 ? _d : 0));
4948
4948
  }
4949
4949
  update(particle, delta) {
4950
4950
  if (!this.isEnabled(particle)) {
@@ -1,2 +1,2 @@
1
- /*! tsParticles v1.41.0 by Matteo Bruni */
2
- !function(e,o){if("object"==typeof exports&&"object"==typeof module)module.exports=o();else if("function"==typeof define&&define.amd)define([],o);else{var t=o();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(window,(function(){return function(){"use strict";var e={d:function(o,t){for(var n in t)e.o(t,n)&&!e.o(o,n)&&Object.defineProperty(o,n,{enumerable:!0,get:t[n]})},o:function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},o={};e.r(o),e.d(o,{loadSizeUpdater:function(){return s}});class t{}t.generatedAttribute="generated",t.randomColorValue="random",t.midColorValue="mid",t.touchEndEvent="touchend",t.mouseDownEvent="mousedown",t.mouseUpEvent="mouseup",t.mouseMoveEvent="mousemove",t.touchStartEvent="touchstart",t.touchMoveEvent="touchmove",t.mouseLeaveEvent="mouseleave",t.mouseOutEvent="mouseout",t.touchCancelEvent="touchcancel",t.resizeEvent="resize",t.visibilityChangeEvent="visibilitychange",t.noPolygonDataLoaded="No polygon data loaded.",t.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function n(e,o){var t,n,i,s;const a=(null!==(t=e.size.velocity)&&void 0!==t?t:0)*o.factor,u=e.size.min,l=e.size.max;if(!e.destroyed&&e.size.enable&&((null!==(n=e.size.loops)&&void 0!==n?n:0)<=0||(null!==(i=e.size.loops)&&void 0!==i?i:0)<(null!==(s=e.size.maxLoops)&&void 0!==s?s:0))){switch(e.size.status){case 0:e.size.value>=l?(e.size.status=1,e.size.loops||(e.size.loops=0),e.size.loops++):e.size.value+=a;break;case 1:e.size.value<=u?(e.size.status=0,e.size.loops||(e.size.loops=0),e.size.loops++):e.size.value-=a}var r,d,c;!function(e,o,t,n){switch(e.options.size.animation.destroy){case"max":o>=n&&e.destroy();break;case"min":o<=t&&e.destroy()}}(e,e.size.value,u,l),e.destroyed||(e.size.value=(r=e.size.value,d=u,c=l,Math.min(Math.max(r,d),c)))}}new WeakMap;class i{init(){}isEnabled(e){var o,t,n;return!e.destroyed&&!e.spawning&&e.size.enable&&((null!==(o=e.size.loops)&&void 0!==o?o:0)<=0||(null!==(t=e.size.loops)&&void 0!==t?t:0)<(null!==(n=e.size.maxLoops)&&void 0!==n?n:0))}update(e,o){this.isEnabled(e)&&n(e,o)}}async function s(e){await e.addParticleUpdater("size",(()=>new i))}return o}()}));
1
+ /*! tsParticles v1.41.4 by Matteo Bruni */
2
+ !function(e,o){if("object"==typeof exports&&"object"==typeof module)module.exports=o();else if("function"==typeof define&&define.amd)define([],o);else{var t=o();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(window,(function(){return function(){"use strict";var e={d:function(o,t){for(var n in t)e.o(t,n)&&!e.o(o,n)&&Object.defineProperty(o,n,{enumerable:!0,get:t[n]})},o:function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},o={};e.r(o),e.d(o,{loadSizeUpdater:function(){return s}});class t{}t.generatedAttribute="generated",t.randomColorValue="random",t.midColorValue="mid",t.touchEndEvent="touchend",t.mouseDownEvent="mousedown",t.mouseUpEvent="mouseup",t.mouseMoveEvent="mousemove",t.touchStartEvent="touchstart",t.touchMoveEvent="touchmove",t.mouseLeaveEvent="mouseleave",t.mouseOutEvent="mouseout",t.touchCancelEvent="touchcancel",t.resizeEvent="resize",t.visibilityChangeEvent="visibilitychange",t.noPolygonDataLoaded="No polygon data loaded.",t.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function n(e,o){var t,n,i,s;const a=(null!==(t=e.size.velocity)&&void 0!==t?t:0)*o.factor,u=e.size.min,l=e.size.max;if(!(e.destroyed||!e.size.enable||(null!==(n=e.size.maxLoops)&&void 0!==n?n:0)>0&&(null!==(i=e.size.loops)&&void 0!==i?i:0)>(null!==(s=e.size.maxLoops)&&void 0!==s?s:0))){switch(e.size.status){case 0:e.size.value>=l?(e.size.status=1,e.size.loops||(e.size.loops=0),e.size.loops++):e.size.value+=a;break;case 1:e.size.value<=u?(e.size.status=0,e.size.loops||(e.size.loops=0),e.size.loops++):e.size.value-=a}var r,d,c;!function(e,o,t,n){switch(e.options.size.animation.destroy){case"max":o>=n&&e.destroy();break;case"min":o<=t&&e.destroy()}}(e,e.size.value,u,l),e.destroyed||(e.size.value=(r=e.size.value,d=u,c=l,Math.min(Math.max(r,d),c)))}}new WeakMap;class i{init(){}isEnabled(e){var o,t,n,i;return!e.destroyed&&!e.spawning&&e.size.enable&&((null!==(o=e.size.maxLoops)&&void 0!==o?o:0)<=0||(null!==(t=e.size.maxLoops)&&void 0!==t?t:0)>0&&(null!==(n=e.size.loops)&&void 0!==n?n:0)<(null!==(i=e.size.maxLoops)&&void 0!==i?i:0))}update(e,o){this.isEnabled(e)&&n(e,o)}}async function s(e){await e.addParticleUpdater("size",(()=>new i))}return o}()}));
@@ -544,20 +544,20 @@
544
544
  }
545
545
  }
546
546
  }
547
- externalInteract(delta) {
547
+ async externalInteract(delta) {
548
548
  for (const interactor of this.externalInteractors) {
549
549
  if (interactor.isEnabled()) {
550
- interactor.interact(delta);
550
+ await interactor.interact(delta);
551
551
  }
552
552
  }
553
553
  }
554
- particlesInteract(particle, delta) {
554
+ async particlesInteract(particle, delta) {
555
555
  for (const interactor of this.externalInteractors) {
556
556
  interactor.reset(particle);
557
557
  }
558
558
  for (const interactor of this.particleInteractors) {
559
559
  if (interactor.isEnabled(particle)) {
560
- interactor.interact(particle, delta);
560
+ await interactor.interact(particle, delta);
561
561
  }
562
562
  }
563
563
  }
@@ -2714,10 +2714,10 @@
2714
2714
  return this.getRadius() ** 2 * Math.PI / 2;
2715
2715
  }
2716
2716
  getFillColor() {
2717
- var _a, _b, _c;
2717
+ var _a, _b;
2718
2718
  const color = (_a = this.bubble.color) !== null && _a !== void 0 ? _a : getHslFromAnimation(this.color);
2719
2719
  if (color && this.roll && (this.backColor || this.roll.alter)) {
2720
- const rolled = Math.floor(((_c = (_b = this.roll) === null || _b === void 0 ? void 0 : _b.angle) !== null && _c !== void 0 ? _c : 0) / (Math.PI / 2)) % 2;
2720
+ const backFactor = this.options.roll.mode === "both" ? 2 : 1, backSum = this.options.roll.mode === "horizontal" ? Math.PI / 2 : 0, rolled = Math.floor((((_b = this.roll.angle) !== null && _b !== void 0 ? _b : 0) + backSum) / (Math.PI / backFactor)) % 2;
2721
2721
  if (rolled) {
2722
2722
  if (this.backColor) {
2723
2723
  return this.backColor;
@@ -2949,10 +2949,10 @@
2949
2949
  }
2950
2950
  container.pathGenerator.init(container);
2951
2951
  }
2952
- redraw() {
2952
+ async redraw() {
2953
2953
  this.clear();
2954
2954
  this.init();
2955
- this.draw({
2955
+ await this.draw({
2956
2956
  value: 0,
2957
2957
  factor: 0
2958
2958
  });
@@ -2977,7 +2977,7 @@
2977
2977
  remove(particle, group, override) {
2978
2978
  this.removeAt(this.array.indexOf(particle), undefined, group, override);
2979
2979
  }
2980
- update(delta) {
2980
+ async update(delta) {
2981
2981
  const container = this.container;
2982
2982
  const particlesToDelete = [];
2983
2983
  container.pathGenerator.update();
@@ -3011,23 +3011,23 @@
3011
3011
  for (const particle of particlesToDelete) {
3012
3012
  this.remove(particle);
3013
3013
  }
3014
- this.interactionManager.externalInteract(delta);
3014
+ await this.interactionManager.externalInteract(delta);
3015
3015
  for (const particle of container.particles.array) {
3016
3016
  for (const updater of this.updaters) {
3017
3017
  updater.update(particle, delta);
3018
3018
  }
3019
3019
  if (!particle.destroyed && !particle.spawning) {
3020
- this.interactionManager.particlesInteract(particle, delta);
3020
+ await this.interactionManager.particlesInteract(particle, delta);
3021
3021
  }
3022
3022
  }
3023
3023
  delete container.canvas.resizeFactor;
3024
3024
  }
3025
- draw(delta) {
3025
+ async draw(delta) {
3026
3026
  const container = this.container;
3027
3027
  container.canvas.clear();
3028
3028
  const canvasSize = this.container.canvas.size;
3029
3029
  this.quadTree = new QuadTree(new Rectangle(-canvasSize.width / 4, -canvasSize.height / 4, canvasSize.width * 3 / 2, canvasSize.height * 3 / 2), 4);
3030
- this.update(delta);
3030
+ await this.update(delta);
3031
3031
  if (this.needsSort) {
3032
3032
  this.zArray.sort(((a, b) => b.position.z - a.position.z || a.id - b.id));
3033
3033
  this.lastZIndex = this.zArray[this.zArray.length - 1].position.z;
@@ -3388,12 +3388,12 @@
3388
3388
  }
3389
3389
  draw(force) {
3390
3390
  let refreshTime = force;
3391
- this.drawAnimationFrame = animate()((timestamp => {
3391
+ this.drawAnimationFrame = animate()((async timestamp => {
3392
3392
  if (refreshTime) {
3393
3393
  this.lastFrameTime = undefined;
3394
3394
  refreshTime = false;
3395
3395
  }
3396
- this.drawer.nextFrame(timestamp);
3396
+ await this.drawer.nextFrame(timestamp);
3397
3397
  }));
3398
3398
  }
3399
3399
  getAnimationStatus() {
@@ -1,2 +1,2 @@
1
- /*! tsParticles v1.41.0 by Matteo Bruni */
1
+ /*! tsParticles v1.41.4 by Matteo Bruni */
2
2
  !function(o,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t=e();for(var n in t)("object"==typeof exports?exports:o)[n]=t[n]}}(window,(function(){return function(){"use strict";var o={d:function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o:function(o,e){return Object.prototype.hasOwnProperty.call(o,e)},r:function(o){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})}},e={};o.r(e),o.d(e,{loadStrokeColorUpdater:function(){return m}});class t{}t.generatedAttribute="generated",t.randomColorValue="random",t.midColorValue="mid",t.touchEndEvent="touchend",t.mouseDownEvent="mousedown",t.mouseUpEvent="mouseup",t.mouseMoveEvent="mousemove",t.touchStartEvent="touchstart",t.touchMoveEvent="touchmove",t.mouseLeaveEvent="mouseleave",t.mouseOutEvent="mouseout",t.touchCancelEvent="touchcancel",t.resizeEvent="resize",t.visibilityChangeEvent="visibilitychange",t.noPolygonDataLoaded="No polygon data loaded.",t.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function n(o){const e=a(o);let t=r(o);return e===t&&(t=0),Math.random()*(e-t)+t}function r(o){return"number"==typeof o?o:o.min}function a(o){return"number"==typeof o?o:o.max}function l(o,e){if(o===e||void 0===e&&"number"==typeof o)return o;const t=r(o),n=a(o);return void 0!==e?{min:Math.min(t,e),max:Math.max(n,e)}:l(t,n)}function s(o,e,t=!0){return o[void 0!==e&&t?e%o.length:function(o){return Math.floor(Math.random()*o.length)}(o)]}function i(o,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?o+6*(e-o)*n:n<.5?e:n<2/3?o+(e-o)*(2/3-n)*6:o}function u(o){if(o.startsWith("rgb")){const e=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.]+)\s*)?\)/i.exec(o);return e?{a:e.length>4?parseFloat(e[5]):1,b:parseInt(e[3],10),g:parseInt(e[2],10),r:parseInt(e[1],10)}:void 0}if(o.startsWith("hsl")){const e=/hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.]+)\s*)?\)/i.exec(o);return e?function(o){const e=c(o);return{a:o.a,b:e.b,g:e.g,r:e.r}}({a:e.length>4?parseFloat(e[5]):1,h:parseInt(e[1],10),l:parseInt(e[3],10),s:parseInt(e[2],10)}):void 0}if(o.startsWith("hsv")){const e=/hsva?\(\s*(\d+)°\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.]+)\s*)?\)/i.exec(o);return e?function(o){const e=f(o);return{a:o.a,b:e.b,g:e.g,r:e.r}}({a:e.length>4?parseFloat(e[5]):1,h:parseInt(e[1],10),s:parseInt(e[2],10),v:parseInt(e[3],10)}):void 0}{const e=/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i,t=o.replace(e,((o,e,t,n,r)=>e+e+t+t+n+n+(void 0!==r?r+r:""))),n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(t);return n?{a:void 0!==n[4]?parseInt(n[4],16)/255:1,b:parseInt(n[3],16),g:parseInt(n[2],16),r:parseInt(n[1],16)}:void 0}}function d(o,e,n=!0){var r,a,l;if(void 0===o)return;const i="string"==typeof o?{value:o}:o;let v;if("string"==typeof i.value)v=i.value===t.randomColorValue?h():function(o){return u(o)}(i.value);else if(i.value instanceof Array){v=d({value:s(i.value,e,n)})}else{const o=i.value,e=null!==(r=o.rgb)&&void 0!==r?r:i.value;if(void 0!==e.r)v=e;else{const e=null!==(a=o.hsl)&&void 0!==a?a:i.value;if(void 0!==e.h&&void 0!==e.l)v=c(e);else{const e=null!==(l=o.hsv)&&void 0!==l?l:i.value;void 0!==e.h&&void 0!==e.v&&(v=f(e))}}}return v}function v(o,e,t=!0){const n=d(o,e,t);return void 0!==n?function(o){const e=o.r/255,t=o.g/255,n=o.b/255,r=Math.max(e,t,n),a=Math.min(e,t,n),l={h:0,l:(r+a)/2,s:0};r!=a&&(l.s=l.l<.5?(r-a)/(r+a):(r-a)/(2-r-a),l.h=e===r?(t-n)/(r-a):l.h=t===r?2+(n-e)/(r-a):4+(e-t)/(r-a));l.l*=100,l.s*=100,l.h*=60,l.h<0&&(l.h+=360);return l}(n):void 0}function c(o){const e={b:0,g:0,r:0},t={h:o.h/360,l:o.l/100,s:o.s/100};if(0===t.s)e.b=t.l,e.g=t.l,e.r=t.l;else{const o=t.l<.5?t.l*(1+t.s):t.l+t.s-t.l*t.s,n=2*t.l-o;e.r=i(n,o,t.h+1/3),e.g=i(n,o,t.h),e.b=i(n,o,t.h-1/3)}return e.r=Math.floor(255*e.r),e.g=Math.floor(255*e.g),e.b=Math.floor(255*e.b),e}function f(o){const e={b:0,g:0,r:0},t=o.h/60,n=o.s/100,r=o.v/100,a=r*n,l=a*(1-Math.abs(t%2-1));let s;if(t>=0&&t<=1?s={r:a,g:l,b:0}:t>1&&t<=2?s={r:l,g:a,b:0}:t>2&&t<=3?s={r:0,g:a,b:l}:t>3&&t<=4?s={r:0,g:l,b:a}:t>4&&t<=5?s={r:l,g:0,b:a}:t>5&&t<=6&&(s={r:a,g:0,b:l}),s){const o=r-a;e.r=Math.floor(255*(s.r+o)),e.g=Math.floor(255*(s.g+o)),e.b=Math.floor(255*(s.b+o))}return e}function h(o){const e=null!=o?o:0;return{b:Math.floor(n(l(e,256))),g:Math.floor(n(l(e,256))),r:Math.floor(n(l(e,256)))}}function p(o,e,t){if(o.enable=e.enable,o.enable){if(o.velocity=e.speed/100*t,e.sync)return;o.status=0,o.velocity*=Math.random(),o.value&&(o.value*=Math.random())}else o.velocity=0}function b(o,e,t,r,a){var l;const s=e;if(!s||!s.enable)return;const i=n(t.offset),u=(null!==(l=e.velocity)&&void 0!==l?l:0)*o.factor+3.6*i;a&&0!==s.status?(s.value-=u,s.value<0&&(s.status=0,s.value+=s.value)):(s.value+=u,a&&s.value>r&&(s.status=1,s.value-=s.value%r)),s.value>r&&(s.value%=r)}new WeakMap;class g{constructor(o){this.container=o}init(o){var e,t;const n=this.container;o.stroke=o.options.stroke instanceof Array?s(o.options.stroke,o.id,o.options.reduceDuplicates):o.options.stroke,o.strokeWidth=o.stroke.width*n.retina.pixelRatio;const r=null!==(e=v(o.stroke.color))&&void 0!==e?e:o.getFillColor();r&&(o.strokeColor=function(o,e,t){const n={h:{enable:!1,value:o.h},s:{enable:!1,value:o.s},l:{enable:!1,value:o.l}};return e&&(p(n.h,e.h,t),p(n.s,e.s,t),p(n.l,e.l,t)),n}(r,null===(t=o.stroke.color)||void 0===t?void 0:t.animation,n.retina.reduceFactor))}isEnabled(o){var e,t,n,r;const a=null===(e=o.stroke)||void 0===e?void 0:e.color;return!o.destroyed&&!o.spawning&&!!a&&(void 0!==(null===(t=o.strokeColor)||void 0===t?void 0:t.h.value)&&a.animation.h.enable||void 0!==(null===(n=o.strokeColor)||void 0===n?void 0:n.s.value)&&a.animation.s.enable||void 0!==(null===(r=o.strokeColor)||void 0===r?void 0:r.l.value)&&a.animation.l.enable)}update(o,e){this.isEnabled(o)&&function(o,e){var t,n,r,a,l,s,i,u,d,v;if(!(null===(t=o.stroke)||void 0===t?void 0:t.color))return;const c=o.stroke.color.animation,f=null!==(r=null===(n=o.strokeColor)||void 0===n?void 0:n.h)&&void 0!==r?r:null===(a=o.color)||void 0===a?void 0:a.h;f&&b(e,f,c.h,360,!1);const h=null!==(s=null===(l=o.strokeColor)||void 0===l?void 0:l.s)&&void 0!==s?s:null===(i=o.color)||void 0===i?void 0:i.s;h&&b(e,h,c.s,100,!0);const p=null!==(d=null===(u=o.strokeColor)||void 0===u?void 0:u.l)&&void 0!==d?d:null===(v=o.color)||void 0===v?void 0:v.l;p&&b(e,p,c.l,100,!0)}(o,e)}}async function m(o){await o.addParticleUpdater("strokeColor",(o=>new g(o)))}return e}()}));
@@ -544,20 +544,20 @@
544
544
  }
545
545
  }
546
546
  }
547
- externalInteract(delta) {
547
+ async externalInteract(delta) {
548
548
  for (const interactor of this.externalInteractors) {
549
549
  if (interactor.isEnabled()) {
550
- interactor.interact(delta);
550
+ await interactor.interact(delta);
551
551
  }
552
552
  }
553
553
  }
554
- particlesInteract(particle, delta) {
554
+ async particlesInteract(particle, delta) {
555
555
  for (const interactor of this.externalInteractors) {
556
556
  interactor.reset(particle);
557
557
  }
558
558
  for (const interactor of this.particleInteractors) {
559
559
  if (interactor.isEnabled(particle)) {
560
- interactor.interact(particle, delta);
560
+ await interactor.interact(particle, delta);
561
561
  }
562
562
  }
563
563
  }
@@ -2714,10 +2714,10 @@
2714
2714
  return this.getRadius() ** 2 * Math.PI / 2;
2715
2715
  }
2716
2716
  getFillColor() {
2717
- var _a, _b, _c;
2717
+ var _a, _b;
2718
2718
  const color = (_a = this.bubble.color) !== null && _a !== void 0 ? _a : getHslFromAnimation(this.color);
2719
2719
  if (color && this.roll && (this.backColor || this.roll.alter)) {
2720
- const rolled = Math.floor(((_c = (_b = this.roll) === null || _b === void 0 ? void 0 : _b.angle) !== null && _c !== void 0 ? _c : 0) / (Math.PI / 2)) % 2;
2720
+ const backFactor = this.options.roll.mode === "both" ? 2 : 1, backSum = this.options.roll.mode === "horizontal" ? Math.PI / 2 : 0, rolled = Math.floor((((_b = this.roll.angle) !== null && _b !== void 0 ? _b : 0) + backSum) / (Math.PI / backFactor)) % 2;
2721
2721
  if (rolled) {
2722
2722
  if (this.backColor) {
2723
2723
  return this.backColor;
@@ -2949,10 +2949,10 @@
2949
2949
  }
2950
2950
  container.pathGenerator.init(container);
2951
2951
  }
2952
- redraw() {
2952
+ async redraw() {
2953
2953
  this.clear();
2954
2954
  this.init();
2955
- this.draw({
2955
+ await this.draw({
2956
2956
  value: 0,
2957
2957
  factor: 0
2958
2958
  });
@@ -2977,7 +2977,7 @@
2977
2977
  remove(particle, group, override) {
2978
2978
  this.removeAt(this.array.indexOf(particle), undefined, group, override);
2979
2979
  }
2980
- update(delta) {
2980
+ async update(delta) {
2981
2981
  const container = this.container;
2982
2982
  const particlesToDelete = [];
2983
2983
  container.pathGenerator.update();
@@ -3011,23 +3011,23 @@
3011
3011
  for (const particle of particlesToDelete) {
3012
3012
  this.remove(particle);
3013
3013
  }
3014
- this.interactionManager.externalInteract(delta);
3014
+ await this.interactionManager.externalInteract(delta);
3015
3015
  for (const particle of container.particles.array) {
3016
3016
  for (const updater of this.updaters) {
3017
3017
  updater.update(particle, delta);
3018
3018
  }
3019
3019
  if (!particle.destroyed && !particle.spawning) {
3020
- this.interactionManager.particlesInteract(particle, delta);
3020
+ await this.interactionManager.particlesInteract(particle, delta);
3021
3021
  }
3022
3022
  }
3023
3023
  delete container.canvas.resizeFactor;
3024
3024
  }
3025
- draw(delta) {
3025
+ async draw(delta) {
3026
3026
  const container = this.container;
3027
3027
  container.canvas.clear();
3028
3028
  const canvasSize = this.container.canvas.size;
3029
3029
  this.quadTree = new QuadTree(new Rectangle(-canvasSize.width / 4, -canvasSize.height / 4, canvasSize.width * 3 / 2, canvasSize.height * 3 / 2), 4);
3030
- this.update(delta);
3030
+ await this.update(delta);
3031
3031
  if (this.needsSort) {
3032
3032
  this.zArray.sort(((a, b) => b.position.z - a.position.z || a.id - b.id));
3033
3033
  this.lastZIndex = this.zArray[this.zArray.length - 1].position.z;
@@ -3388,12 +3388,12 @@
3388
3388
  }
3389
3389
  draw(force) {
3390
3390
  let refreshTime = force;
3391
- this.drawAnimationFrame = animate()((timestamp => {
3391
+ this.drawAnimationFrame = animate()((async timestamp => {
3392
3392
  if (refreshTime) {
3393
3393
  this.lastFrameTime = undefined;
3394
3394
  refreshTime = false;
3395
3395
  }
3396
- this.drawer.nextFrame(timestamp);
3396
+ await this.drawer.nextFrame(timestamp);
3397
3397
  }));
3398
3398
  }
3399
3399
  getAnimationStatus() {
@@ -1,2 +1,2 @@
1
- /*! tsParticles v1.41.0 by Matteo Bruni */
1
+ /*! tsParticles v1.41.4 by Matteo Bruni */
2
2
  !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var o=t();for(var n in o)("object"==typeof exports?exports:e)[n]=o[n]}}(window,(function(){return function(){"use strict";var e={d:function(t,o){for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{loadTiltUpdater:function(){return u}});class o{}o.generatedAttribute="generated",o.randomColorValue="random",o.midColorValue="mid",o.touchEndEvent="touchend",o.mouseDownEvent="mousedown",o.mouseUpEvent="mouseup",o.mouseMoveEvent="mousemove",o.touchStartEvent="touchstart",o.touchMoveEvent="touchmove",o.mouseLeaveEvent="mouseleave",o.mouseOutEvent="mouseout",o.touchCancelEvent="touchcancel",o.resizeEvent="resize",o.visibilityChangeEvent="visibilitychange",o.noPolygonDataLoaded="No polygon data loaded.",o.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function n(e){return"number"==typeof e?e:function(e){const t=i(e);let o=a(e);return t===o&&(o=0),Math.random()*(t-o)+o}(e)}function a(e){return"number"==typeof e?e:e.min}function i(e){return"number"==typeof e?e:e.max}new WeakMap;class r{constructor(e){this.container=e}init(e){const t=e.options.tilt;e.tilt={enable:t.enable,value:n(t.value)*Math.PI/180,sinDirection:Math.random()>=.5?1:-1,cosDirection:Math.random()>=.5?1:-1};let o=t.direction;if("random"===o){o=Math.floor(2*Math.random())>0?"counter-clockwise":"clockwise"}switch(o){case"counter-clockwise":case"counterClockwise":e.tilt.status=1;break;case"clockwise":e.tilt.status=0}const a=e.options.tilt.animation;a.enable&&(e.tilt.velocity=a.speed/360*this.container.retina.reduceFactor,a.sync||(e.tilt.velocity*=Math.random()))}isEnabled(e){const t=e.options.tilt.animation;return!e.destroyed&&!e.spawning&&t.enable}update(e,t){this.isEnabled(e)&&function(e,t){var o;if(!e.tilt)return;const n=e.options.tilt.animation,a=(null!==(o=e.tilt.velocity)&&void 0!==o?o:0)*t.factor,i=2*Math.PI;if(n.enable)switch(e.tilt.status){case 0:e.tilt.value+=a,e.tilt.value>i&&(e.tilt.value-=i);break;case 1:default:e.tilt.value-=a,e.tilt.value<0&&(e.tilt.value+=i)}}(e,t)}}async function u(e){await e.addParticleUpdater("tilt",(e=>new r(e)))}return t}()}));
@@ -544,20 +544,20 @@
544
544
  }
545
545
  }
546
546
  }
547
- externalInteract(delta) {
547
+ async externalInteract(delta) {
548
548
  for (const interactor of this.externalInteractors) {
549
549
  if (interactor.isEnabled()) {
550
- interactor.interact(delta);
550
+ await interactor.interact(delta);
551
551
  }
552
552
  }
553
553
  }
554
- particlesInteract(particle, delta) {
554
+ async particlesInteract(particle, delta) {
555
555
  for (const interactor of this.externalInteractors) {
556
556
  interactor.reset(particle);
557
557
  }
558
558
  for (const interactor of this.particleInteractors) {
559
559
  if (interactor.isEnabled(particle)) {
560
- interactor.interact(particle, delta);
560
+ await interactor.interact(particle, delta);
561
561
  }
562
562
  }
563
563
  }
@@ -2714,10 +2714,10 @@
2714
2714
  return this.getRadius() ** 2 * Math.PI / 2;
2715
2715
  }
2716
2716
  getFillColor() {
2717
- var _a, _b, _c;
2717
+ var _a, _b;
2718
2718
  const color = (_a = this.bubble.color) !== null && _a !== void 0 ? _a : getHslFromAnimation(this.color);
2719
2719
  if (color && this.roll && (this.backColor || this.roll.alter)) {
2720
- const rolled = Math.floor(((_c = (_b = this.roll) === null || _b === void 0 ? void 0 : _b.angle) !== null && _c !== void 0 ? _c : 0) / (Math.PI / 2)) % 2;
2720
+ const backFactor = this.options.roll.mode === "both" ? 2 : 1, backSum = this.options.roll.mode === "horizontal" ? Math.PI / 2 : 0, rolled = Math.floor((((_b = this.roll.angle) !== null && _b !== void 0 ? _b : 0) + backSum) / (Math.PI / backFactor)) % 2;
2721
2721
  if (rolled) {
2722
2722
  if (this.backColor) {
2723
2723
  return this.backColor;
@@ -2949,10 +2949,10 @@
2949
2949
  }
2950
2950
  container.pathGenerator.init(container);
2951
2951
  }
2952
- redraw() {
2952
+ async redraw() {
2953
2953
  this.clear();
2954
2954
  this.init();
2955
- this.draw({
2955
+ await this.draw({
2956
2956
  value: 0,
2957
2957
  factor: 0
2958
2958
  });
@@ -2977,7 +2977,7 @@
2977
2977
  remove(particle, group, override) {
2978
2978
  this.removeAt(this.array.indexOf(particle), undefined, group, override);
2979
2979
  }
2980
- update(delta) {
2980
+ async update(delta) {
2981
2981
  const container = this.container;
2982
2982
  const particlesToDelete = [];
2983
2983
  container.pathGenerator.update();
@@ -3011,23 +3011,23 @@
3011
3011
  for (const particle of particlesToDelete) {
3012
3012
  this.remove(particle);
3013
3013
  }
3014
- this.interactionManager.externalInteract(delta);
3014
+ await this.interactionManager.externalInteract(delta);
3015
3015
  for (const particle of container.particles.array) {
3016
3016
  for (const updater of this.updaters) {
3017
3017
  updater.update(particle, delta);
3018
3018
  }
3019
3019
  if (!particle.destroyed && !particle.spawning) {
3020
- this.interactionManager.particlesInteract(particle, delta);
3020
+ await this.interactionManager.particlesInteract(particle, delta);
3021
3021
  }
3022
3022
  }
3023
3023
  delete container.canvas.resizeFactor;
3024
3024
  }
3025
- draw(delta) {
3025
+ async draw(delta) {
3026
3026
  const container = this.container;
3027
3027
  container.canvas.clear();
3028
3028
  const canvasSize = this.container.canvas.size;
3029
3029
  this.quadTree = new QuadTree(new Rectangle(-canvasSize.width / 4, -canvasSize.height / 4, canvasSize.width * 3 / 2, canvasSize.height * 3 / 2), 4);
3030
- this.update(delta);
3030
+ await this.update(delta);
3031
3031
  if (this.needsSort) {
3032
3032
  this.zArray.sort(((a, b) => b.position.z - a.position.z || a.id - b.id));
3033
3033
  this.lastZIndex = this.zArray[this.zArray.length - 1].position.z;
@@ -3388,12 +3388,12 @@
3388
3388
  }
3389
3389
  draw(force) {
3390
3390
  let refreshTime = force;
3391
- this.drawAnimationFrame = animate()((timestamp => {
3391
+ this.drawAnimationFrame = animate()((async timestamp => {
3392
3392
  if (refreshTime) {
3393
3393
  this.lastFrameTime = undefined;
3394
3394
  refreshTime = false;
3395
3395
  }
3396
- this.drawer.nextFrame(timestamp);
3396
+ await this.drawer.nextFrame(timestamp);
3397
3397
  }));
3398
3398
  }
3399
3399
  getAnimationStatus() {
@@ -1,2 +1,2 @@
1
- /*! tsParticles v1.41.0 by Matteo Bruni */
1
+ /*! tsParticles v1.41.4 by Matteo Bruni */
2
2
  !function(e,o){if("object"==typeof exports&&"object"==typeof module)module.exports=o();else if("function"==typeof define&&define.amd)define([],o);else{var n=o();for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(window,(function(){return function(){"use strict";var e={d:function(o,n){for(var t in n)e.o(n,t)&&!e.o(o,t)&&Object.defineProperty(o,t,{enumerable:!0,get:n[t]})},o:function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},o={};e.r(o),e.d(o,{loadWobbleUpdater:function(){return u}});class n{}n.generatedAttribute="generated",n.randomColorValue="random",n.midColorValue="mid",n.touchEndEvent="touchend",n.mouseDownEvent="mousedown",n.mouseUpEvent="mouseup",n.mouseMoveEvent="mousemove",n.touchStartEvent="touchstart",n.touchMoveEvent="touchmove",n.mouseLeaveEvent="mouseleave",n.mouseOutEvent="mouseout",n.touchCancelEvent="touchcancel",n.resizeEvent="resize",n.visibilityChangeEvent="visibilitychange",n.noPolygonDataLoaded="No polygon data loaded.",n.noPolygonFound="No polygon found, you need to specify SVG url in config.";new WeakMap;new WeakMap;new WeakMap,new WeakSet;new WeakMap;new WeakMap;new WeakMap;function t(e){return"number"==typeof e?e:function(e){const o=i(e);let n=a(e);return o===n&&(n=0),Math.random()*(o-n)+n}(e)}function a(e){return"number"==typeof e?e:e.min}function i(e){return"number"==typeof e?e:e.max}new WeakMap;class r{constructor(e){this.container=e}init(e){const o=e.options.wobble;o.enable?e.wobble={angle:Math.random()*Math.PI*2,speed:t(o.speed)/360}:e.wobble={angle:0,speed:0},e.retina.wobbleDistance=t(o.distance)*this.container.retina.pixelRatio}isEnabled(e){return!e.destroyed&&!e.spawning&&e.options.wobble.enable}update(e,o){this.isEnabled(e)&&function(e,o){var n;if(!e.options.wobble.enable||!e.wobble)return;const t=e.wobble.speed*o.factor,a=(null!==(n=e.retina.wobbleDistance)&&void 0!==n?n:0)*o.factor/(1e3/60),i=2*Math.PI;e.wobble.angle+=t,e.wobble.angle>i&&(e.wobble.angle-=i),e.position.x+=a*Math.cos(e.wobble.angle),e.position.y+=a*Math.abs(Math.sin(e.wobble.angle))}(e,o)}}async function u(e){await e.addParticleUpdater("wobble",(e=>new r(e)))}return o}()}));
@@ -124,12 +124,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
124
124
  }
125
125
  draw(force) {
126
126
  let refreshTime = force;
127
- this.drawAnimationFrame = (0, Utils_2.animate)()((timestamp) => {
127
+ this.drawAnimationFrame = (0, Utils_2.animate)()(async (timestamp) => {
128
128
  if (refreshTime) {
129
129
  this.lastFrameTime = undefined;
130
130
  refreshTime = false;
131
131
  }
132
- this.drawer.nextFrame(timestamp);
132
+ await this.drawer.nextFrame(timestamp);
133
133
  });
134
134
  }
135
135
  getAnimationStatus() {
@@ -2,5 +2,5 @@ import type { IDelta } from "./IDelta";
2
2
  import type { IInteractor } from "./IInteractor";
3
3
  export interface IExternalInteractor extends IInteractor {
4
4
  isEnabled(): boolean;
5
- interact(delta: IDelta): void;
5
+ interact(delta: IDelta): Promise<void>;
6
6
  }
@@ -3,5 +3,5 @@ import type { IInteractor } from "./IInteractor";
3
3
  import type { Particle } from "../Particle";
4
4
  export interface IParticlesInteractor extends IInteractor {
5
5
  isEnabled(particle: Particle): boolean;
6
- interact(particle: Particle, delta: IDelta): void;
6
+ interact(particle: Particle, delta: IDelta): Promise<void>;
7
7
  }