| // Random number generator - requires a PRNG backend, e.g. prng4.js | 
| import { prng_newstate, rng_psize } from "./prng4"; | 
| var rng_state; | 
| var rng_pool = null; | 
| var rng_pptr; | 
| // Initialize the pool with junk if needed. | 
| if (rng_pool == null) { | 
|     rng_pool = []; | 
|     rng_pptr = 0; | 
|     var t = void 0; | 
|     if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) { | 
|         // Extract entropy (2048 bits) from RNG if available | 
|         var z = new Uint32Array(256); | 
|         window.crypto.getRandomValues(z); | 
|         for (t = 0; t < z.length; ++t) { | 
|             rng_pool[rng_pptr++] = z[t] & 255; | 
|         } | 
|     } | 
|     // Use mouse events for entropy, if we do not have enough entropy by the time | 
|     // we need it, entropy will be generated by Math.random. | 
|     var count = 0; | 
|     var onMouseMoveListener_1 = function (ev) { | 
|         count = count || 0; | 
|         if (count >= 256 || rng_pptr >= rng_psize) { | 
|             if (window.removeEventListener) { | 
|                 window.removeEventListener("mousemove", onMouseMoveListener_1, false); | 
|             } | 
|             else if (window.detachEvent) { | 
|                 window.detachEvent("onmousemove", onMouseMoveListener_1); | 
|             } | 
|             return; | 
|         } | 
|         try { | 
|             var mouseCoordinates = ev.x + ev.y; | 
|             rng_pool[rng_pptr++] = mouseCoordinates & 255; | 
|             count += 1; | 
|         } | 
|         catch (e) { | 
|             // Sometimes Firefox will deny permission to access event properties for some reason. Ignore. | 
|         } | 
|     }; | 
|     if (typeof window !== 'undefined') { | 
|         if (window.addEventListener) { | 
|             window.addEventListener("mousemove", onMouseMoveListener_1, false); | 
|         } | 
|         else if (window.attachEvent) { | 
|             window.attachEvent("onmousemove", onMouseMoveListener_1); | 
|         } | 
|     } | 
| } | 
| function rng_get_byte() { | 
|     if (rng_state == null) { | 
|         rng_state = prng_newstate(); | 
|         // At this point, we may not have collected enough entropy.  If not, fall back to Math.random | 
|         while (rng_pptr < rng_psize) { | 
|             var random = Math.floor(65536 * Math.random()); | 
|             rng_pool[rng_pptr++] = random & 255; | 
|         } | 
|         rng_state.init(rng_pool); | 
|         for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) { | 
|             rng_pool[rng_pptr] = 0; | 
|         } | 
|         rng_pptr = 0; | 
|     } | 
|     // TODO: allow reseeding after first request | 
|     return rng_state.next(); | 
| } | 
| var SecureRandom = /** @class */ (function () { | 
|     function SecureRandom() { | 
|     } | 
|     SecureRandom.prototype.nextBytes = function (ba) { | 
|         for (var i = 0; i < ba.length; ++i) { | 
|             ba[i] = rng_get_byte(); | 
|         } | 
|     }; | 
|     return SecureRandom; | 
| }()); | 
| export { SecureRandom }; |