UNPKG

@wolsok/thanos

Version:

Wolf Soko's implementation of a cool Thanos snapping vaporizing effect for destroying dom elements

194 lines 29.6 kB
class SimplexNoise { constructor(options) { const { min, max, random, amplitude, frequency, octaves, persistence } = createOptionsWithDefaults(options); this.random = random; this.amplitude = amplitude; this.frequency = frequency; this.octaves = octaves; this.persistence = persistence; this.scale = min === -1 && max === 1 ? (value) => value : (value) => min + ((value + 1) / 2) * (max - min); const p = new Uint8Array(256); for (let i = 0; i < 256; i++) { p[i] = i; } let n; let q; for (let i = 255; i > 0; i--) { n = Math.floor((i + 1) * this.random()); q = p[i]; p[i] = p[n]; p[n] = q; } this.perm = new Uint8Array(512); this.permMod12 = new Uint8Array(512); for (let i = 0; i < 512; i++) { this.perm[i] = p[i & 255]; this.permMod12[i] = this.perm[i] % 12; } } static G3 = 1.0 / 6.0; static GRAD3D = [ [1, 1, 0], [-1, 1, 0], [1, -1, 0], [-1, -1, 0], [1, 0, 1], [-1, 0, 1], [1, 0, -1], [-1, 0, -1], [0, 1, 1], [0, -1, -1], [0, 1, -1], [0, -1, -1], ]; amplitude; frequency; octaves; perm; permMod12; persistence; random; scale; memScale3D = {}; dot(gs, coords) { return gs.slice(0, Math.min(gs.length, coords.length)).reduce((total, g, i) => total + g * coords[i], 0); } raw3D(x, y, z) { // Skew the input space to determine which simplex cell we're in const s = (x + y + z) / 3.0; // Very nice and simple skew factor for 3D const i = Math.floor(x + s); const j = Math.floor(y + s); const k = Math.floor(z + s); const t = (i + j + k) * SimplexNoise.G3; const X0 = i - t; // Unskew the cell origin back to (x,y,z) space const Y0 = j - t; const Z0 = k - t; const x0 = x - X0; // The x,y,z distances from the cell origin const y0 = y - Y0; const z0 = z - Z0; // Determine which simplex we are in let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords if (x0 >= y0) { if (y0 >= z0) { i1 = i2 = j2 = 1; j1 = k1 = k2 = 0; } else if (x0 >= z0) { i1 = i2 = k2 = 1; j1 = k1 = j2 = 0; } else { k1 = i2 = k2 = 1; i1 = j1 = j2 = 0; } } else { if (y0 < z0) { k1 = j2 = k2 = 1; i1 = j1 = i2 = 0; } else if (x0 < z0) { j1 = j2 = k2 = 1; i1 = k1 = i2 = 0; } else { j1 = i2 = j2 = 1; i1 = k1 = k2 = 0; } } const x1 = x0 - i1 + SimplexNoise.G3; // Offsets for second corner in (x,y,z) coords const y1 = y0 - j1 + SimplexNoise.G3; const z1 = z0 - k1 + SimplexNoise.G3; const x2 = x0 - i2 + 2.0 * SimplexNoise.G3; // Offsets for third corner in (x,y,z) coords const y2 = y0 - j2 + 2.0 * SimplexNoise.G3; const z2 = z0 - k2 + 2.0 * SimplexNoise.G3; const x3 = x0 - 1.0 + 3.0 * SimplexNoise.G3; // Offsets for last corner in (x,y,z) coords const y3 = y0 - 1.0 + 3.0 * SimplexNoise.G3; const z3 = z0 - 1.0 + 3.0 * SimplexNoise.G3; // Work out the hashed gradient indices of the four simplex corners const ii = i & 255; const jj = j & 255; const kk = k & 255; const gi0 = this.permMod12[ii + this.perm[jj + this.perm[kk]]]; const gi1 = this.permMod12[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]]; const gi2 = this.permMod12[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]]; const gi3 = this.permMod12[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]]; // Calculate the contribution from the four corners const t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0; const n0 = t0 < 0 ? 0.0 : Math.pow(t0, 4) * this.dot(SimplexNoise.GRAD3D[gi0], [x0, y0, z0]); const t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1; const n1 = t1 < 0 ? 0.0 : Math.pow(t1, 4) * this.dot(SimplexNoise.GRAD3D[gi1], [x1, y1, z1]); const t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2; const n2 = t2 < 0 ? 0.0 : Math.pow(t2, 4) * this.dot(SimplexNoise.GRAD3D[gi2], [x2, y2, z2]); const t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3; const n3 = t3 < 0 ? 0.0 : Math.pow(t3, 4) * this.dot(SimplexNoise.GRAD3D[gi3], [x3, y3, z3]); // Add contributions from each corner to get the final noise value. // The result is scaled to stay just inside [-1,1] return 94.68493150681972 * (n0 + n1 + n2 + n3); } scaled3D(x, y, z, resolution) { const memIndex = `${Math.round(x * resolution)}${Math.round(y * resolution)}${Math.round(z * resolution)}`; const memElem = this.memScale3D[memIndex]; if (memElem != null) { return memElem; } let amplitude = this.amplitude; let frequency = this.frequency; let maxAmplitude = 0; let noise = 0; for (let i = 0; i < this.octaves; i++) { noise += this.raw3D(x * frequency, y * frequency, z * frequency) * amplitude; maxAmplitude += amplitude; amplitude *= this.persistence; frequency *= 2; } const result = this.scale(noise / maxAmplitude); this.memScale3D[memIndex] = result; return result; } } export { SimplexNoise }; function createOptionsWithDefaults(options) { if (options != null) { if (options['amplitude'] && typeof options.amplitude !== 'number') { throw new Error('options.amplitude must be a number'); } if (options['frequency'] && typeof options.frequency !== 'number') { throw new Error('options.frequency must be a number'); } if (options['octaves'] && (typeof options.octaves !== 'number' || !isFinite(options.octaves) || Math.floor(options.octaves) !== options.octaves)) { throw new Error('options.octaves must be an integer'); } if (options['persistence'] && typeof options.persistence !== 'number') { throw new Error('options.persistence must be a number'); } if (options['random'] && typeof options.random !== 'function') { throw new Error('options.random must be a function'); } if (options['min'] && typeof options.min !== 'number') { throw new Error('options.min must be a number'); } if (options['max'] && typeof options.max !== 'number') { throw new Error('options.max must be a number'); } } const optionsResult = { amplitude: 1.0, frequency: 1.0, max: 1.0, min: -1.0, octaves: 1, persistence: 0.5, random: Math.random, ...options, }; if (optionsResult.min > optionsResult.max) { throw new Error('min must be smaller max'); } return optionsResult; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxleC1ub2lzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvbGliL3NpbXBsZXgtbm9pc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBYSxZQUFZO0lBQ3ZCLFlBQVksT0FBc0M7UUFDaEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRS9CLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUUzRyxNQUFNLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDVjtRQUVELElBQUksQ0FBUyxDQUFDO1FBQ2QsSUFBSSxDQUFTLENBQUM7UUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNWO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRXRCLE1BQU0sQ0FBQyxNQUFNLEdBQUc7UUFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxD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LENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0UsbURBQW1EO1FBQ25ELE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RixNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RixtRUFBbUU7UUFDbkUsa0RBQWtEO1FBQ2xELE9BQU8saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsUUFBUSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLFVBQWtCO1FBQzFELE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMzRyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRWQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDN0UsWUFBWSxJQUFJLFNBQVMsQ0FBQztZQUMxQixTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixTQUFTLElBQUksQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDbkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7U0FqS1UsWUFBWTtBQW9LekIsU0FBUyx5QkFBeUIsQ0FBQyxPQUFzQztJQUN2RSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQ2pFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQ0UsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNsQixDQUFDLE9BQU8sT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUNsQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ2xEO1lBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtRQUVELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7S0FDRjtJQUVELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLFNBQVMsRUFBRSxHQUFHO1FBQ2QsU0FBUyxFQUFFLEdBQUc7UUFDZCxHQUFHLEVBQUUsR0FBRztRQUNSLEdBQUcsRUFBRSxDQUFDLEdBQUc7UUFDVCxPQUFPLEVBQUUsQ0FBQztRQUNWLFdBQVcsRUFBRSxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixHQUFHLE9BQU87S0FDWCxDQUFDO0lBQ0YsSUFBSSxhQUFhLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUU7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0tBQzVDO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2ltcGxleE5vaXNlT3B0aW9ucyB9IGZyb20gJy4vc2ltcGxleC1ub2lzZS1vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIFNpbXBsZXhOb2lzZSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFNpbXBsZXhOb2lzZU9wdGlvbnM+KSB7XG4gICAgY29uc3QgeyBtaW4sIG1heCwgcmFuZG9tLCBhbXBsaXR1ZGUsIGZyZXF1ZW5jeSwgb2N0YXZlcywgcGVyc2lzdGVuY2UgfSA9IGNyZWF0ZU9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG5cbiAgICB0aGlzLnJhbmRvbSA9IHJhbmRvbTtcbiAgICB0aGlzLmFtcGxpdHVkZSA9IGFtcGxpdHVkZTtcbiAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLm9jdGF2ZXMgPSBvY3RhdmVzO1xuICAgIHRoaXMucGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZTtcblxuICAgIHRoaXMuc2NhbGUgPSBtaW4gPT09IC0xICYmIG1heCA9PT0gMSA/ICh2YWx1ZSkgPT4gdmFsdWUgOiAodmFsdWUpID0+IG1pbiArICgodmFsdWUgKyAxKSAvIDIpICogKG1heCAtIG1pbik7XG5cbiAgICBjb25zdCBwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBwW2ldID0gaTtcbiAgICB9XG5cbiAgICBsZXQgbjogbnVtYmVyO1xuICAgIGxldCBxOiBudW1iZXI7XG4gICAgZm9yIChsZXQgaSA9IDI1NTsgaSA+IDA7IGktLSkge1xuICAgICAgbiA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIHRoaXMucmFuZG9tKCkpO1xuICAgICAgcSA9IHBbaV07XG4gICAgICBwW2ldID0gcFtuXTtcbiAgICAgIHBbbl0gPSBxO1xuICAgIH1cblxuICAgIHRoaXMucGVybSA9IG5ldyBVaW50OEFycmF5KDUxMik7XG4gICAgdGhpcy5wZXJtTW9kMTIgPSBuZXcgVWludDhBcnJheSg1MTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTEyOyBpKyspIHtcbiAgICAgIHRoaXMucGVybVtpXSA9IHBbaSAmIDI1NV07XG4gICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBHMyA9IDEuMCAvIDYuMDtcblxuICBzdGF0aWMgR1JBRDNEID0gW1xuICAgIFsxLCAxLCAwXSxcbiAgICBbLTEsIDEsIDBdLFxuICAgIFsxLCAtMSwgMF0sXG4gICAgWy0xLCAtMSwgMF0sXG4gICAgWzEsIDAsIDFdLFxuICAgIFstMSwgMCwgMV0sXG4gICAgWzEsIDAsIC0xXSxcbiAgICBbLTEsIDAsIC0xXSxcbiAgICBbMCwgMSwgMV0sXG4gICAgWzAsIC0xLCAtMV0sXG4gICAgWzAsIDEsIC0xXSxcbiAgICBbMCwgLTEsIC0xXSxcbiAgXTtcblxuICByZWFkb25seSBhbXBsaXR1ZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgZnJlcXVlbmN5OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9jdGF2ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcGVybTogVWludDhBcnJheTtcbiAgcmVhZG9ubHkgcGVybU1vZDEyOiBVaW50OEFycmF5O1xuICByZWFkb25seSBwZXJzaXN0ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSByYW5kb206ICgpID0+IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6ICh2YWx1ZTogbnVtYmVyKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgbWVtU2NhbGUzRDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIGRvdChnczogbnVtYmVyW10sIGNvb3JkczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiBncy5zbGljZSgwLCBNYXRoLm1pbihncy5sZW5ndGgsIGNvb3Jkcy5sZW5ndGgpKS5yZWR1Y2UoKHRvdGFsLCBnLCBpKSA9PiB0b3RhbCArIGcgKiBjb29yZHNbaV0sIDApO1xuICB9XG5cbiAgcmF3M0QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gU2tldyB0aGUgaW5wdXQgc3BhY2UgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpbXBsZXggY2VsbCB3ZSdyZSBpblxuICAgIGNvbnN0IHMgPSAoeCArIHkgKyB6KSAvIDMuMDsgLy8gVmVyeSBuaWNlIGFuZCBzaW1wbGUgc2tldyBmYWN0b3IgZm9yIDNEXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoeCArIHMpO1xuICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKHkgKyBzKTtcbiAgICBjb25zdCBrID0gTWF0aC5mbG9vcih6ICsgcyk7XG4gICAgY29uc3QgdCA9IChpICsgaiArIGspICogU2ltcGxleE5vaXNlLkczO1xuICAgIGNvbnN0IFgwID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlXG4gICAgY29uc3QgWTAgPSBqIC0gdDtcbiAgICBjb25zdCBaMCA9IGsgLSB0O1xuICAgIGNvbnN0IHgwID0geCAtIFgwOyAvLyBUaGUgeCx5LHogZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXG4gICAgY29uc3QgeTAgPSB5IC0gWTA7XG4gICAgY29uc3QgejAgPSB6IC0gWjA7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc2ltcGxleCB3ZSBhcmUgaW5cbiAgICBsZXQgaTE6IG51bWJlciwgajE6IG51bWJlciwgazE6IG51bWJlcjsgLy8gT2Zmc2V0cyBmb3Igc2Vjb25kIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXG4gICAgbGV0IGkyOiBudW1iZXIsIGoyOiBudW1iZXIsIGsyOiBudW1iZXI7IC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXG4gICAgaWYgKHgwID49IHkwKSB7XG4gICAgICBpZiAoeTAgPj0gejApIHtcbiAgICAgICAgaTEgPSBpMiA9IGoyID0gMTtcbiAgICAgICAgajEgPSBrMSA9IGsyID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoeDAgPj0gejApIHtcbiAgICAgICAgaTEgPSBpMiA9IGsyID0gMTtcbiAgICAgICAgajEgPSBrMSA9IGoyID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsxID0gaTIgPSBrMiA9IDE7XG4gICAgICAgIGkxID0gajEgPSBqMiA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5MCA8IHowKSB7XG4gICAgICAgIGsxID0gajIgPSBrMiA9IDE7XG4gICAgICAgIGkxID0gajEgPSBpMiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHgwIDwgejApIHtcbiAgICAgICAgajEgPSBqMiA9IGsyID0gMTtcbiAgICAgICAgaTEgPSBrMSA9IGkyID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGoxID0gaTIgPSBqMiA9IDE7XG4gICAgICAgIGkxID0gazEgPSBrMiA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeDEgPSB4MCAtIGkxICsgU2ltcGxleE5vaXNlLkczOyAvLyBPZmZzZXRzIGZvciBzZWNvbmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXG4gICAgY29uc3QgeTEgPSB5MCAtIGoxICsgU2ltcGxleE5vaXNlLkczO1xuICAgIGNvbnN0IHoxID0gejAgLSBrMSArIFNpbXBsZXhOb2lzZS5HMztcbiAgICBjb25zdCB4MiA9IHgwIC0gaTIgKyAyLjAgKiBTaW1wbGV4Tm9pc2UuRzM7IC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xuICAgIGNvbnN0IHkyID0geTAgLSBqMiArIDIuMCAqIFNpbXBsZXhOb2lzZS5HMztcbiAgICBjb25zdCB6MiA9IHowIC0gazIgKyAyLjAgKiBTaW1wbGV4Tm9pc2UuRzM7XG4gICAgY29uc3QgeDMgPSB4MCAtIDEuMCArIDMuMCAqIFNpbXBsZXhOb2lzZS5HMzsgLy8gT2Zmc2V0cyBmb3IgbGFzdCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcbiAgICBjb25zdCB5MyA9IHkwIC0gMS4wICsgMy4wICogU2ltcGxleE5vaXNlLkczO1xuICAgIGNvbnN0IHozID0gejAgLSAxLjAgKyAzLjAgKiBTaW1wbGV4Tm9pc2UuRzM7XG5cbiAgICAvLyBXb3JrIG91dCB0aGUgaGFzaGVkIGdyYWRpZW50IGluZGljZXMgb2YgdGhlIGZvdXIgc2ltcGxleCBjb3JuZXJzXG4gICAgY29uc3QgaWkgPSBpICYgMjU1O1xuICAgIGNvbnN0IGpqID0gaiAmIDI1NTtcbiAgICBjb25zdCBrayA9IGsgJiAyNTU7XG4gICAgY29uc3QgZ2kwID0gdGhpcy5wZXJtTW9kMTJbaWkgKyB0aGlzLnBlcm1bamogKyB0aGlzLnBlcm1ba2tdXV07XG4gICAgY29uc3QgZ2kxID0gdGhpcy5wZXJtTW9kMTJbaWkgKyBpMSArIHRoaXMucGVybVtqaiArIGoxICsgdGhpcy5wZXJtW2trICsgazFdXV07XG4gICAgY29uc3QgZ2kyID0gdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV07XG4gICAgY29uc3QgZ2kzID0gdGhpcy5wZXJtTW9kMTJbaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDFdXV07XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmb3VyIGNvcm5lcnNcbiAgICBjb25zdCB0MCA9IDAuNSAtIHgwICogeDAgLSB5MCAqIHkwIC0gejAgKiB6MDtcbiAgICBjb25zdCBuMCA9IHQwIDwgMCA/IDAuMCA6IE1hdGgucG93KHQwLCA0KSAqIHRoaXMuZG90KFNpbXBsZXhOb2lzZS5HUkFEM0RbZ2kwXSwgW3gwLCB5MCwgejBdKTtcbiAgICBjb25zdCB0MSA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTtcbiAgICBjb25zdCBuMSA9IHQxIDwgMCA/IDAuMCA6IE1hdGgucG93KHQxLCA0KSAqIHRoaXMuZG90KFNpbXBsZXhOb2lzZS5HUkFEM0RbZ2kxXSwgW3gxLCB5MSwgejFdKTtcbiAgICBjb25zdCB0MiA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyIC0gejIgKiB6MjtcbiAgICBjb25zdCBuMiA9IHQyIDwgMCA/IDAuMCA6IE1hdGgucG93KHQyLCA0KSAqIHRoaXMuZG90KFNpbXBsZXhOb2lzZS5HUkFEM0RbZ2kyXSwgW3gyLCB5MiwgejJdKTtcbiAgICBjb25zdCB0MyA9IDAuNSAtIHgzICogeDMgLSB5MyAqIHkzIC0gejMgKiB6MztcbiAgICBjb25zdCBuMyA9IHQzIDwgMCA/IDAuMCA6IE1hdGgucG93KHQzLCA0KSAqIHRoaXMuZG90KFNpbXBsZXhOb2lzZS5HUkFEM0RbZ2kzXSwgW3gzLCB5MywgejNdKTtcblxuICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIHNjYWxlZCB0byBzdGF5IGp1c3QgaW5zaWRlIFstMSwxXVxuICAgIHJldHVybiA5NC42ODQ5MzE1MDY4MTk3MiAqIChuMCArIG4xICsgbjIgKyBuMyk7XG4gIH1cblxuICBzY2FsZWQzRCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCByZXNvbHV0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1lbUluZGV4ID0gYCR7TWF0aC5yb3VuZCh4ICogcmVzb2x1dGlvbil9JHtNYXRoLnJvdW5kKHkgKiByZXNvbHV0aW9uKX0ke01hdGgucm91bmQoeiAqIHJlc29sdXRpb24pfWA7XG4gICAgY29uc3QgbWVtRWxlbSA9IHRoaXMubWVtU2NhbGUzRFttZW1JbmRleF07XG4gICAgaWYgKG1lbUVsZW0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1lbUVsZW07XG4gICAgfVxuXG4gICAgbGV0IGFtcGxpdHVkZSA9IHRoaXMuYW1wbGl0dWRlO1xuICAgIGxldCBmcmVxdWVuY3kgPSB0aGlzLmZyZXF1ZW5jeTtcbiAgICBsZXQgbWF4QW1wbGl0dWRlID0gMDtcbiAgICBsZXQgbm9pc2UgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9jdGF2ZXM7IGkrKykge1xuICAgICAgbm9pc2UgKz0gdGhpcy5yYXczRCh4ICogZnJlcXVlbmN5LCB5ICogZnJlcXVlbmN5LCB6ICogZnJlcXVlbmN5KSAqIGFtcGxpdHVkZTtcbiAgICAgIG1heEFtcGxpdHVkZSArPSBhbXBsaXR1ZGU7XG4gICAgICBhbXBsaXR1ZGUgKj0gdGhpcy5wZXJzaXN0ZW5jZTtcbiAgICAgIGZyZXF1ZW5jeSAqPSAyO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjYWxlKG5vaXNlIC8gbWF4QW1wbGl0dWRlKTtcbiAgICB0aGlzLm1lbVNjYWxlM0RbbWVtSW5kZXhdID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zPzogUGFydGlhbDxTaW1wbGV4Tm9pc2VPcHRpb25zPikge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgaWYgKG9wdGlvbnNbJ2FtcGxpdHVkZSddICYmIHR5cGVvZiBvcHRpb25zLmFtcGxpdHVkZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5hbXBsaXR1ZGUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydmcmVxdWVuY3knXSAmJiB0eXBlb2Ygb3B0aW9ucy5mcmVxdWVuY3kgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuZnJlcXVlbmN5IG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zWydvY3RhdmVzJ10gJiZcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5vY3RhdmVzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAhaXNGaW5pdGUob3B0aW9ucy5vY3RhdmVzKSB8fFxuICAgICAgICBNYXRoLmZsb29yKG9wdGlvbnMub2N0YXZlcykgIT09IG9wdGlvbnMub2N0YXZlcylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5vY3RhdmVzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydwZXJzaXN0ZW5jZSddICYmIHR5cGVvZiBvcHRpb25zLnBlcnNpc3RlbmNlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLnBlcnNpc3RlbmNlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uc1sncmFuZG9tJ10gJiYgdHlwZW9mIG9wdGlvbnMucmFuZG9tICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMucmFuZG9tIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydtaW4nXSAmJiB0eXBlb2Ygb3B0aW9ucy5taW4gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMubWluIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uc1snbWF4J10gJiYgdHlwZW9mIG9wdGlvbnMubWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLm1heCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3B0aW9uc1Jlc3VsdCA9IHtcbiAgICBhbXBsaXR1ZGU6IDEuMCxcbiAgICBmcmVxdWVuY3k6IDEuMCxcbiAgICBtYXg6IDEuMCxcbiAgICBtaW46IC0xLjAsXG4gICAgb2N0YXZlczogMSxcbiAgICBwZXJzaXN0ZW5jZTogMC41LFxuICAgIHJhbmRvbTogTWF0aC5yYW5kb20sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcbiAgaWYgKG9wdGlvbnNSZXN1bHQubWluID4gb3B0aW9uc1Jlc3VsdC5tYXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbiBtdXN0IGJlIHNtYWxsZXIgbWF4Jyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNSZXN1bHQ7XG59XG4iXX0=