{"layers":[{"layerType":"flattened","id":"flat_0","compiledFragmentShaders":["#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;\n\nuniform vec2 uMousePos;\nuniform float uL0_ElemOpacity;\nuniform sampler2D uL1_SourceImage;\nuniform vec2 uArtboardResolution;\nuniform float uL1_ElemOpacity;\n\nconst float PI = 3.14159265359;\nconst float TAU = 6.28318530718;\n\nout vec4 fragColor;\n\nvec2 rotate_L0(vec2 coord, float angle) {\nfloat s = sin(angle);\nfloat c = cos(angle);\nreturn vec2(\ncoord.x * c - coord.y * s,\ncoord.x * s + coord.y * c\n);\n}\nvec3 getBgColor_L0(vec2 uv) {\nreturn vec3(0, 0, 0);\n}\nvec2 rotate2D_L1(vec2 p, float angle) {\nfloat s = sin(angle);\nfloat c = cos(angle);\nreturn vec2(p.x * c - p.y * s, p.x * s + p.y * c);\n}\nvec2 getAnchorOffsets_L1() {\nreturn vec2(0.5, 0.5);\n}\nvec4 sampleImage_L1(vec2 canvasUV, vec2 mouseOffset, vec2 mouseRotOffset) {\nvec2 canvasPos = vec2(canvasUV.x * uArtboardResolution.x, (1.0 - canvasUV.y) * uArtboardResolution.y);\nvec2 imageUV;\nfloat absWidth = 680.0000;\nfloat absHeight = 680.0000 * uArtboardResolution.y;\nabsWidth = absWidth;\nabsHeight = (1 != 2 && 2 == 2) ? absWidth / 1.0000 : absHeight;\nvec2 elementSizePx = vec2(absWidth, absHeight);\nvec2 elementPosPx = vec2(0.5000, 0.5648) * uArtboardResolution - getAnchorOffsets_L1() * elementSizePx;\nvec2 centerPos = elementPosPx + (elementSizePx * 0.5);\nvec2 relPos = canvasPos - centerPos + mouseOffset;\nvec2 unrotatedRelPos = rotate2D_L1(relPos, 0.0000 * -TAU);\nvec2 elementPos = unrotatedRelPos + (elementSizePx * 0.5);\nimageUV = elementPos / elementSizePx;\nvec2 flippedUV = vec2(imageUV.x, 1.0 - imageUV.y);\nvec4 color = textureLod(uL1_SourceImage, flippedUV, 0.0);\nif (imageUV.x >= 0.0 && imageUV.x <= 1.0 && imageUV.y >= 0.0 && imageUV.y <= 1.0) {\nreturn color;\n}\nelse {\nreturn vec4(0.0);\n}\n}\nvec4 applyImageAdjustments_L1(vec4 color) {\nvec3 exposureColor = clamp(color.rgb + -0.0600, 0.0, 1.0);\ncolor.rgb = mix(color.rgb, exposureColor, color.a);\nvec3 contrasted = 1.2800 * (color.rgb - 0.5) + 0.5;\ncolor.rgb = mix(color.rgb, contrasted, color.a);\ncolor.rgb = clamp(color.rgb, 0.0, 1.0);\ncolor.rgb *= color.a;\nreturn color;\n}\n\nvec4 computeLayer_L0(vec2 uv) {\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nuv -= pos;\nuv /= max(0.6200*2., 1e-5);\nuv = rotate_L0(uv, (0.0000 - 0.5) * 2. * PI);\nvec4 color = vec4(getBgColor_L0(uv), 1.0000);\nreturn color;\n}\nvec4 computeLayer_L1(vec2 uv) {\nvec2 mouseOffsetUV = (uMousePos - 0.5) * 0.0000;\nvec2 mouseOffsetPx = mouseOffsetUV;\nvec2 mouseRotOffset = (uMousePos - 0.5) * 0.0000 * PI * 0.5;\nuv -= mouseOffsetUV;\nvec4 imgColor = sampleImage_L1(uv, mouseOffsetPx, mouseRotOffset);\nimgColor = applyImageAdjustments_L1(imgColor);\nreturn imgColor;\n}\n\nvoid main() {\nvec2 uv = vTextureCoord;\nvec4 topOcc = vec4(0.0);\nvec4 occ1 = computeLayer_L1(uv);\nocc1 *= uL1_ElemOpacity;\ntopOcc = topOcc + occ1 * (1.0 - topOcc.a);\nif (topOcc.a >= 0.9999) { fragColor = topOcc; return; }\nvec4 occ0 = computeLayer_L0(uv);\nocc0 *= uL0_ElemOpacity;\ntopOcc = topOcc + occ0 * (1.0 - topOcc.a);\nif (topOcc.a >= 0.9999) { fragColor = topOcc; return; }\nvec4 result = vec4(0.0);\nvec4 c0 = occ0;\nresult = c0 + result * (1.0 - c0.a);\nvec4 c1 = occ1;\nresult = c1 + result * (1.0 - c1.a);\nfragColor = result;\n}"],"compiledVertexShaders":["#version 300 es\nprecision highp float;\nin vec3 aVertexPosition;\nin vec2 aTextureCoord;\nuniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nout vec2 vTextureCoord;\nout vec3 vVertexPosition;\nvoid main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvVertexPosition = aVertexPosition;\nvTextureCoord = aTextureCoord;\n}"],"sublayers":[{"id":"gradient","layerType":"effect","type":"gradient","sublayerIndex":0,"opacity":1,"animating":false},{"id":"image","layerType":"image","sublayerIndex":1,"opacity":1,"animating":false,"src":"/unicorn/hero-portrait.png","imageNaturalSize":{"type":"Vec2","_x":2017,"_y":2035},"width":680,"widthMode":1,"height":680,"heightMode":2,"left":0.5,"top":0.5648148148148148,"anchorPoint":8,"aspectRatio":1}],"data":{"uniforms":{"resolution":{"name":"uResolution","type":"2f","value":{"type":"Vec2","_x":1080,"_y":1080}},"mousePos":{"name":"uMousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L0_elemOpacity":{"name":"uL0_ElemOpacity","type":"1f","value":1},"artboardResolution":{"name":"uArtboardResolution","type":"2f","value":{"type":"Vec2","_x":1080,"_y":1080}},"L1_aspectRatio":{"name":"uAspectRatio","type":"1f","value":1},"L1_elemOpacity":{"name":"uL1_ElemOpacity","type":"1f","value":1}},"textures":[{"sampler":"uL1_SourceImage","type":"image","src":"/unicorn/hero-portrait.png","sublayerIndex":1}],"timeUniforms":[],"mouseUniforms":[],"hasMouseTracking":false,"hasVideoSublayers":false,"estimatedSublayerWorkRaw":54,"occlusion":{"candidateLayers":1}},"states":{"appear":[],"scroll":[],"hover":[],"mousemove":[]},"breakpoints":[],"userDownsample":1,"visible":true},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"noiseFill","usesPingPong":false,"speed":1,"trackMouse":0,"mouseMomentum":0,"mouseSpring":0,"trackAxes":"xy","texture":false,"animating":true,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;uniform sampler2D uTexture;\nuniform float uTime;\nuniform vec2 uMousePos;\nuniform vec2 uResolution;vec4 permute(vec4 t) {\nreturn t * (t * 34.0 + 133.0);\n}vec3 grad(float hash) {\nvec3 cube = mod(floor(hash / vec3(1.0, 2.0, 4.0)), 2.0) * 2.0 - 1.0;\nvec3 cuboct = cube;float index0 = step(0.0, 1.0 - floor(hash / 16.0));\nfloat index1 = step(0.0, floor(hash / 16.0) - 1.0);cuboct.x *= 1.0 - index0;\ncuboct.y *= 1.0 - index1;\ncuboct.z *= 1.0 - (1.0 - index0 - index1);float type = mod(floor(hash / 8.0), 2.0);\nvec3 rhomb = (1.0 - type) * cube + type * (cuboct + cross(cube, cuboct));vec3 grad = cuboct * 1.22474487139 + rhomb;grad *= (1.0 - 0.042942436724648037 * type) * 3.5946317686139184;return grad;\n}\nvec4 bccNoiseDerivativesPart(vec3 X) {\nvec3 b = floor(X);\nvec4 i4 = vec4(X - b, 2.5);\nvec3 v1 = b + floor(dot(i4, vec4(.25)));\nvec3 v2 = b + vec3(1, 0, 0) + vec3(-1, 1, 1) * floor(dot(i4, vec4(-.25, .25, .25, .35)));\nvec3 v3 = b + vec3(0, 1, 0) + vec3(1, -1, 1) * floor(dot(i4, vec4(.25, -.25, .25, .35)));\nvec3 v4 = b + vec3(0, 0, 1) + vec3(1, 1, -1) * floor(dot(i4, vec4(.25, .25, -.25, .35)));\nvec4 hashes = permute(mod(vec4(v1.x, v2.x, v3.x, v4.x), 289.0));\nhashes = permute(mod(hashes + vec4(v1.y, v2.y, v3.y, v4.y), 289.0));\nhashes = mod(permute(mod(hashes + vec4(v1.z, v2.z, v3.z, v4.z), 289.0)), 48.0);\nvec3 d1 = X - v1; vec3 d2 = X - v2; vec3 d3 = X - v3; vec3 d4 = X - v4;\nvec4 a = max(0.75 - vec4(dot(d1, d1), dot(d2, d2), dot(d3, d3), dot(d4, d4)), 0.0);\nvec4 aa = a * a; vec4 aaaa = aa * aa;\nvec3 g1 = grad(hashes.x); vec3 g2 = grad(hashes.y);\nvec3 g3 = grad(hashes.z); vec3 g4 = grad(hashes.w);\nvec4 extrapolations = vec4(dot(d1, g1), dot(d2, g2), dot(d3, g3), dot(d4, g4));\nvec3 derivative = -8.0 * mat4x3(d1, d2, d3, d4) * (aa * a * extrapolations)\n+ mat4x3(g1, g2, g3, g4) * aaaa;\nreturn vec4(derivative, dot(aaaa, extrapolations));\n}\nvec4 bccNoiseDerivatives_XYBeforeZ(vec3 X) {\nmat3 orthonormalMap = mat3(\n0.788675134594813, -0.211324865405187, -0.577350269189626,\n-0.211324865405187, 0.788675134594813, -0.577350269189626,\n0.577350269189626, 0.577350269189626, 0.577350269189626);\nX = orthonormalMap * X;\nvec4 result = bccNoiseDerivativesPart(X) + bccNoiseDerivativesPart(X + 144.5);\nreturn vec4(result.xyz * orthonormalMap, result.w);\n}vec3 blend (int blendMode, vec3 src, vec3 dst) {\nreturn src * dst;\n}\nvec4 applyLayerMix(vec4 color, vec4 bg, float amount) {\ncolor.rgb = mix(bg.rgb, color.rgb, amount);\ncolor.a = max(bg.a, amount);\nreturn color;\n}\nuvec2 pcg2d(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}float randFibo(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}\nfloat deband() {\nreturn (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;\n}out vec4 fragColor;const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;vec3 anchoredPal(float t, vec3 col1, vec3 col2, float chroma) {\nvec3 mid = 0.5 * (col1 + col2);\nvec3 axisAmp = 0.5 * (col2 - col1);vec3 base = mid + axisAmp * cos(TAU * t);vec3 axis = length(axisAmp) > 0.0001 ? normalize(axisAmp) : vec3(1.0, 0.0, 0.0);\nvec3 ref = abs(axis.x) > 0.9 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\nvec3 tangent1 = normalize(cross(axis, ref));\nvec3 tangent2 = normalize(cross(axis, tangent1));float richness = 0.24 * length(axisAmp) + 0.02;\nvec3 ripple =\ntangent1 * sin(TAU * (t * 2.0 + 0.123)) +\ntangent2 * sin(TAU * (t * 3.0 + 0.437));vec3 col = base + (richness * chroma) * ripple;\ncol = clamp(col, -10.0, 10.0);\ncol = 1./(1. + exp(-col * 4. + 0.25) * 7.5);\nreturn clamp(col, 0.0, 1.0);\n}mat2 rot(float a) {\nreturn mat2(cos(a),-sin(a),sin(a),cos(a));\n}float get2sNoise(vec2 uv, float turbulence, float driftVal, float time, float scale, float direction, float phase) {\nfloat turb = turbulence * 2.;\nvec2 d = vec2(0, driftVal * time * 0.008) * mix(1., 14., scale);\nvec4 noise = bccNoiseDerivatives_XYBeforeZ(vec3(uv * vec2(direction, 1. - direction) * 0.7 - d, phase + time*0.02));\nreturn mix(0.5, noise.w * 0.5 + 0.5, turb);\n}float getNoise(vec2 uv, float turbulence, float driftVal, float time, float scale, float direction, float phase) {\nreturn get2sNoise(uv, turbulence, driftVal, time, scale, direction, phase);\n}void main() {\nvec2 uv = vTextureCoord;\nfloat aspectRatio = uResolution.x/uResolution.y;\nvec2 aspect = vec2(aspectRatio, 1.0);vec2 mPos = vec2(0.499, 0.5053093259464452) + mix(vec2(0), (uMousePos-0.5), 0.0000);vec2 pos = mix(vec2(0.499, 0.5053093259464452), mPos, 0.0000);\nfloat scale = mix(1., 14., 1.2520);\nvec2 drift = vec2(0, 0.5400 * uTime * 0.0125);\nmat2 rotation = rot(-0.0027 * 2. * PI);vec2 st = (uv - pos) * aspect * scale * rotation;\nfloat noise = getNoise(st, 0.7400, 0.5400, uTime, 1.2520, 0.5000, 0.0000);\nvec4 color = texture(uTexture, uv);\nvec4 bg = color;\nfloat shift = 0.7700 + (0.0000 * uTime * 0.01);\nvec3 noiseColor = anchoredPal(noise + shift, vec3(1, 1, 1), vec3(1, 1, 1), 0.7600);\ncolor.rgb = noiseColor.rgb;float dither = deband();\ncolor.rgb += dither * 0.5;color.rgb = blend(3, bg.rgb, color.rgb);color = applyLayerMix(clamp(color, 0.0, 1.0), bg, 1.0000);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"data":{"depth":false,"uniforms":{},"isBackground":false},"id":"noise_fill"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"glyphDither","usesPingPong":false,"texture":{"src":"data:image/png;base64,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","sampler":"uCustomTexture"},"trackMouse":0,"mouseMomentum":0,"mouseSpring":0,"trackAxes":"xy","animating":false,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform sampler2D uSprite;\nuniform sampler2D uCustomTexture;uniform vec2 uMousePos;\nuniform vec2 uResolution;vec4 applyLayerMixAlpha(vec4 color, vec4 bg, float amount) {\nreturn mix(bg, color, amount);\n}out vec4 fragColor;void main() {\nvec2 uv = vTextureCoord;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nfloat aspectRatio = uResolution.x / uResolution.y;\nfloat aspectCorrection = mix(aspectRatio, 1./aspectRatio, 0.5);float gridSize = mix(0.05, 0.005, 1.0000);float baseGrid = 1.0 / gridSize;\nvec2 cellSize = vec2(1.0/(baseGrid * aspectRatio), 1.0/baseGrid) * aspectCorrection;\nvec2 offsetUv = uv - pos;\nvec2 cell = floor(offsetUv / cellSize);\nvec2 cellCenter = (cell + 0.5) * cellSize;\nvec2 pixelatedCoord = cellCenter + pos;\nvec4 bg = texture(uTexture, vTextureCoord);\nvec4 color = texture(uTexture, pixelatedCoord);float luminance = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));\nluminance = mix(luminance, 1.0 - luminance, float(0));\nfloat gamma = pow(mix(0.2, 2.2, 0.6000), 2.2);ivec2 uTextureSize = textureSize(uSprite, 0);uTextureSize = textureSize(uCustomTexture, 0);float selectedWidth = float(uTextureSize.x);\nfloat GLYPH_HEIGHT = float(uTextureSize.y);\nfloat scaleFactor = gridSize / GLYPH_HEIGHT;\nfloat numSprites = max(1.0, selectedWidth / GLYPH_HEIGHT);\nfloat numGlyphRows = 1.0;float spriteIndex = clamp(floor(luminance * numSprites), 0.0, numSprites - 1.0);\nfloat spriteIndexWithGamma = clamp(floor(luminance * numSprites * gamma), 0.0, numSprites - 1.0);\nfloat phaseOffset = floor(0.0000 * numSprites + 0.5);\nspriteIndexWithGamma = mod(spriteIndexWithGamma + phaseOffset, numSprites);\nfloat glyphIndex = 0.0;float normalizedSpriteSizeX = 1.0 / numSprites;\nfloat normalizedSpriteSizeY = 1.0 / numGlyphRows;float spriteX = (spriteIndexWithGamma * normalizedSpriteSizeX);vec2 spriteSheetUV = vec2(spriteX, glyphIndex / numGlyphRows);vec2 spriteSize = vec2(GLYPH_HEIGHT / aspectRatio, GLYPH_HEIGHT) * scaleFactor * aspectCorrection;\nvec2 localOffset = mod(uv - pos, spriteSize) / spriteSize;float inset = 0.5 / GLYPH_HEIGHT;\nlocalOffset = clamp(localOffset, inset, 1.0 - inset);spriteSheetUV += vec2(localOffset.x * normalizedSpriteSizeX, localOffset.y * normalizedSpriteSizeY);vec4 spriteColor = vec4(0.0);spriteColor = texture(uCustomTexture, spriteSheetUV);\nfloat alpha = smoothstep(0.0, 1.0, spriteColor.r);vec3 cc = (color.rgb - spriteIndex * 0.04) * 1.4;\nvec3 col = cc;vec3 result = mix(mix(vec3(0.0), vec3(1.0), float(0)), col, alpha);\ncolor.rgb = result;\ncolor = applyLayerMixAlpha(color, bg, 0.7000);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"data":{"depth":false,"uniforms":{},"isBackground":false,"texture":{"src":"","sampler":"uSprite"}},"id":"glyph_dither"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"bloomFast","usesPingPong":false,"texture":false,"animating":false,"mouseMomentum":0,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nprecision highp int;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;\nout vec4 fragColor;const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;float luma(vec4 color) {\nreturn dot(color.rgb, vec3(0.299, 0.587, 0.114));\n}float getGaussianWeight(int index) {\nswitch(index) {\ncase 0: return 1.000000;\ncase 1: return 0.687719;\ncase 2: return 0.497017;\ncase 3: return 0.369784;\ncase 4: return 0.279890;\ncase 5: return 0.213571;\ncase 6: return 0.163045;\ncase 7: return 0.123612;\ncase 8: return 0.092212;\ncase 9: return 0.066840;\ncase 10: return 0.046045;\ncase 11: return 0.000000;\ndefault: return 0.0;\n}\n}vec4 thresholdPass(vec4 color) {\ncolor.rgb = pow(color.rgb, vec3(1.0/2.2));\ncolor.rgb = 1.2 * (color.rgb - 0.5) + 0.5;\nvec4 bloom = color * smoothstep(0.3000 - 0.1, 0.3000, luma(color));\nreturn vec4(bloom.rgb, color.a);\n}vec4 blur(vec2 uv, bool vertical, float radius, bool diamond, bool threshold) {\nvec4 color = vec4(0.0);\nfloat total_weight = 0.0;\nfloat aspectRatio = uResolution.x/uResolution.y;vec2 dir;\nif (diamond) {\ndir = vertical ? vec2(1, 1) : vec2(1, -1);\n} else {\ndir = vertical ? vec2(0, 1) : vec2(1, 0);\n}\ndir.x /= aspectRatio;\nvec4 center = texture(uTexture, uv);\nif (threshold) center = thresholdPass(center);\nfloat center_weight = getGaussianWeight(0);\ncolor += center * center_weight;\ntotal_weight += center_weight;radius *= (0.2 + 1.0000) * 1.8;\nfor (int i = 1; i <= 12; i++) {\nfloat weight = getGaussianWeight(i);\nfloat step = float(i)/12.;\nfloat offset = mix(0.015, 0.025, radius) * step;\nvec4 sample1 = texture(uTexture, uv + offset * dir);\nvec4 sample2 = texture(uTexture, uv - offset * dir);\nif (threshold) {\nsample1 = thresholdPass(sample1);\nsample2 = thresholdPass(sample2);\n}\ncolor += (sample1 + sample2) * weight;\ntotal_weight += 2.0 * weight;\n}return color / total_weight;\n}vec4 blurPass(vec2 uv, bool vertical, float radius, bool diamond, bool threshold) {\nreturn blur(uv, vertical, radius, diamond, threshold);\n}vec4 getColor(vec4 color) {\nreturn blurPass(vTextureCoord, false, 7.5, false, true);\n}void main() {\nvec2 uv = vTextureCoord;\nvec4 color = texture(uTexture, uv);color = getColor(color);\nfragColor = color;}","#version 300 es\nprecision highp float;\nprecision highp int;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;\nout vec4 fragColor;const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;float luma(vec4 color) {\nreturn dot(color.rgb, vec3(0.299, 0.587, 0.114));\n}float getGaussianWeight(int index) {\nswitch(index) {\ncase 0: return 1.000000;\ncase 1: return 0.687719;\ncase 2: return 0.497017;\ncase 3: return 0.369784;\ncase 4: return 0.279890;\ncase 5: return 0.213571;\ncase 6: return 0.163045;\ncase 7: return 0.123612;\ncase 8: return 0.092212;\ncase 9: return 0.066840;\ncase 10: return 0.046045;\ncase 11: return 0.000000;\ndefault: return 0.0;\n}\n}vec4 thresholdPass(vec4 color) {\ncolor.rgb = pow(color.rgb, vec3(1.0/2.2));\ncolor.rgb = 1.2 * (color.rgb - 0.5) + 0.5;\nvec4 bloom = color * smoothstep(0.3000 - 0.1, 0.3000, luma(color));\nreturn vec4(bloom.rgb, color.a);\n}vec4 blur(vec2 uv, bool vertical, float radius, bool diamond, bool threshold) {\nvec4 color = vec4(0.0);\nfloat total_weight = 0.0;\nfloat aspectRatio = uResolution.x/uResolution.y;vec2 dir;\nif (diamond) {\ndir = vertical ? vec2(1, 1) : vec2(1, -1);\n} else {\ndir = vertical ? vec2(0, 1) : vec2(1, 0);\n}\ndir.x /= aspectRatio;\nvec4 center = texture(uTexture, uv);\nif (threshold) center = thresholdPass(center);\nfloat center_weight = getGaussianWeight(0);\ncolor += center * center_weight;\ntotal_weight += center_weight;radius *= (0.2 + 1.0000) * 1.8;\nfor (int i = 1; i <= 12; i++) {\nfloat weight = getGaussianWeight(i);\nfloat step = float(i)/12.;\nfloat offset = mix(0.015, 0.025, radius) * step;\nvec4 sample1 = texture(uTexture, uv + offset * dir);\nvec4 sample2 = texture(uTexture, uv - offset * dir);\nif (threshold) {\nsample1 = thresholdPass(sample1);\nsample2 = thresholdPass(sample2);\n}\ncolor += (sample1 + sample2) * weight;\ntotal_weight += 2.0 * weight;\n}return color / total_weight;\n}vec4 blurPass(vec2 uv, bool vertical, float radius, bool diamond, bool threshold) {\nreturn blur(uv, vertical, radius, diamond, threshold);\n}vec4 getColor(vec4 color) {\nreturn blurPass(vTextureCoord, true, 7.5, false, false);\n}void main() {\nvec2 uv = vTextureCoord;\nvec4 color = texture(uTexture, uv);color = getColor(color);\nfragColor = color;}","#version 300 es\nprecision highp float;\nprecision highp int;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uTexture;\nuniform sampler2D uBgTexture;\nout vec4 fragColor;const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;float interleavedGradientNoise(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}vec4 finalPass(vec4 bloomColor) {\nfloat nx = interleavedGradientNoise(gl_FragCoord.xy) - 0.5;\nvec2 jitter = vec2(nx) * 0.02 * (1.0000 + 0.1);\nbloomColor = texture(uTexture, vTextureCoord + jitter);\nbloomColor.rgb *= vec3(0.9647058823529412, 0.7803921568627451, 1);\nvec4 sceneColor = texture(uBgTexture, vTextureCoord);\nvec4 finalColor = mix(sceneColor, sceneColor + bloomColor, 0.3400 * 3.5);\nreturn finalColor;\n}vec4 getColor(vec4 color) {\nreturn finalPass(color);\n}void main() {\nvec2 uv = vTextureCoord;\nvec4 color = texture(uTexture, uv);color = getColor(color);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"data":{"downSample":0.5,"depth":false,"uniforms":{},"isBackground":false,"passes":[{"prop":"pass","value":1,"downSample":0.5},{"prop":"pass","value":2,"downSample":1,"includeBg":true}]},"id":"fast_bloom"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"mouse","usesPingPong":true,"mouseMomentum":0,"texture":false,"animating":false,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;in vec2 vTextureCoord;\nin vec3 vVertexPosition;uniform sampler2D uTexture;\nuniform sampler2D uPingPongTexture;\nuniform vec2 uResolution;const float PI = 3.14159265359;\nconst float ITERATIONS = 24.0;out vec4 fragColor;vec3 rgb2hsv(vec3 c) {\nvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\nvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\nvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));float d = q.x - min(q.w, q.y);\nfloat e = 1.0e-10;\nreturn vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}vec3 chromatic_aberration(vec3 color, vec2 uv, vec2 offset) {\nvec4 left = texture(uTexture, uv - offset);\nvec4 right = texture(uTexture, uv + offset);color.r = left.r;\ncolor.b = right.b;return color;\n}vec2 angleToDir(float angle) {\nfloat rad = angle * 2.0 * PI;\nreturn vec2(cos(rad), sin(rad));\n}vec4 defaultTrail(vec2 uv, vec2 mouseDir) {\nvec4 color = vec4(0);\nvec2 distorted = mouseDir * 0.4;\nuv -= distorted;\ncolor = texture(uTexture, uv);\ncolor.rgb = chromatic_aberration(color.rgb, uv, distorted * 0.0800 * 0.12);\nreturn color;\n}vec4 getTrailColor(vec2 uv, vec2 mouseDir, float strength, float aspectRatio) {\nvec4 color = vec4(0);return defaultTrail(uv, mouseDir);\n}void main() {\nvec2 uv = vTextureCoord;\nvec2 pingpongUv = uv;\nfloat aspectRatio = uResolution.x / uResolution.y;vec3 mouseRgb = texture(uPingPongTexture, pingpongUv).rgb;\nvec3 mouseTrail = rgb2hsv(mouseRgb);float angle = mouseTrail.x;\nfloat strength = mouseTrail.z * (0.0800 * 1.5);\nvec2 direction = angleToDir(angle);\nvec2 mouseDir = direction * strength;vec4 color = getTrailColor(uv, mouseDir, abs(strength), aspectRatio);\nfragColor = color;\n}","#version 300 es\nprecision highp float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uPingPongTexture;\nuniform vec2 uPreviousMousePos;uniform vec2 uMousePos;\nuniform vec2 uResolution;const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;out vec4 fragColor;vec3 rgb2hsv(vec3 c) {\nvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\nvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\nvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));float d = q.x - min(q.w, q.y);\nfloat e = 1.0e-10;\nreturn vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}vec3 hsv2rgb(vec3 c) {\nvec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\nvec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\nreturn c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}mat2 rot(float a) {\nreturn mat2(cos(a), -sin(a), sin(a), cos(a));\n}vec2 liquify(vec2 st, vec2 dir, float strength) {\nfloat aspectRatio = uResolution.x / uResolution.y;\nst.x *= aspectRatio;\nst -= dir * 0.005;\nfloat amplitude = smoothstep(0.0, 1.0, strength) * 0.005;\nfor (float i = 1.0; i <= 5.0; i++) {\nst = st * rot(i / 5.0 * PI * 2.0);\nst += vec2(\namplitude * cos(i * 5.0 * st.y + strength),\namplitude * sin(i * 5.0 * st.x + strength)\n);\n}\nst.x /= aspectRatio;\nreturn st;\n}vec2 angleToDir(float angle) {\nfloat rad = angle * 2.0 * PI;\nreturn vec2(cos(rad), sin(rad));\n}void main() {\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 aspectVec = vec2(aspectRatio, 1.0);\nvec2 uv = vTextureCoord;\nvec2 correctedUv = uv * aspectVec;vec2 dir = (uMousePos - uPreviousMousePos) * aspectVec;\nfloat dist = length(dir);\nif (dist > 0.0) {\ndir = dir / dist;\n} else {\ndir = vec2(1.0, 0.0);\n}float rad = 0.2000 * 0.4 * mix(aspectRatio, 1.0, 0.5);\nfloat angle = atan(dir.y, dir.x);\nif (angle < 0.0) angle += TAU;\nvec3 lastFrameColor = vec3(0);\nlastFrameColor = texture(uPingPongTexture, uv).rgb;\nvec3 hsv = rgb2hsv(lastFrameColor);\nvec2 prevDir = angleToDir(hsv.x);\nuv = mix(uv, liquify(uv, prevDir/length(prevDir), hsv.z), 0.1400);float t = dist > 0.0 ? clamp(dot(correctedUv - uPreviousMousePos * aspectVec, dir) / dist, 0.0, 1.0) : 0.0;\nvec2 closestPoint = mix(uPreviousMousePos, uMousePos, t) * aspectVec;\nfloat distanceToLine = distance(correctedUv, closestPoint);float shrink = mix(0.5, 1.0, clamp(dist * 20.0, 0.0, 1.0));\nrad *= shrink;float s = 1.0 - smoothstep(rad * 0.0000, rad, distanceToLine);s = s * s;vec3 color = vec3(angle / TAU, 1.0, 1.0);\nvec3 mouseColor = hsv2rgb(color);vec2 sampleUv = mix(uv, uv / (1.0 + 0.2500 * 0.03) + 0.2500 * 0.015, 0.2500);\nfloat blurRadius = 0.003;\nlastFrameColor = texture(uPingPongTexture, sampleUv).rgb * 0.4;\nlastFrameColor += texture(uPingPongTexture, sampleUv + vec2(blurRadius, 0.0)).rgb * 0.15;\nlastFrameColor += texture(uPingPongTexture, sampleUv + vec2(-blurRadius, 0.0)).rgb * 0.15;\nlastFrameColor += texture(uPingPongTexture, sampleUv + vec2(0.0, blurRadius)).rgb * 0.15;\nlastFrameColor += texture(uPingPongTexture, sampleUv + vec2(0.0, -blurRadius)).rgb * 0.15;\nlastFrameColor = pow(lastFrameColor, vec3(2.2));\nmouseColor = pow(mouseColor, vec3(2.2));\nlastFrameColor *= pow(0.1700, 0.2);\nfloat clampedDist = clamp(min(1.0, dist * 10.0) * s, 0.0, 1.0);\nvec3 draw = mix(lastFrameColor, mouseColor, clampedDist);\ndraw = pow(draw, vec3(1.0/2.2));\nif (max(draw.r, max(draw.g, draw.b)) < 0.001) {\ndraw = vec3(0.0);\n}\nfragColor = vec4(draw, 1.0);\n}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}","#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = aTextureCoord;\n}"],"data":{"depth":false,"uniforms":{},"isBackground":false},"id":"mouse_trail"},{"layerType":"flattened","id":"flat_6","compiledFragmentShaders":["#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;\n\nuniform sampler2D uBgTexture;\nuniform vec2 uResolution;\nuniform float uL0_ElemOpacity;\nuniform sampler2D uL1_BlueNoise;\nuniform float uL1_Time;\nuniform float uL1_ElemOpacity;\nuniform vec2 uMousePos;\nuniform float uL2_ElemOpacity;\n\nconst int MAX_LEVEL = 4;\nconst float TAU = 6.28318530718;\nconst float PI = 3.14159265359;\n\nout vec4 fragColor;\n\nfloat luma_L0(vec4 color) {\nreturn dot(color.rgb, vec3(0.299, 0.587, 0.114));\n}\nfloat aastep_L0(float threshold, float value) {\nfloat afwidth = 2.0000*200. * (1./uResolution.x);\nfloat minval = threshold - afwidth;\nfloat maxval = threshold + afwidth;\nreturn smoothstep(minval, maxval, value);\n}\nvec2 rotate2D_L0(vec2 st, float degrees) {\nfloat c = cos(radians(degrees));\nfloat s = sin(radians(degrees));\nreturn mat2(c,-s,s,c) * st;\n}\nfloat halftone_L0(vec2 st, float col, float angle) {\nfloat aspectRatio = uResolution.x / uResolution.y;\nfloat aspectCorrection = mix(aspectRatio, 1./aspectRatio, 0.5);\nst -= vec2(0.5, 0.5);\nst *= vec2(aspectRatio, 1.);\nvec2 r_st = 2.0000*200. * rotate2D_L0(st, angle - 0.0891*360.);\nr_st /= aspectCorrection;\nst = (2. * fract(r_st) - 1.) * 0.82;\nreturn aastep_L0(-0.1500, sqrt(col) - length(st));\n}\nuvec2 pcg2d_L1(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}\nfloat randFibo_L1(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d_L1(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}\nfloat getBlueNoise_L1(vec2 st, float delta, float size) {\nivec2 texSize = textureSize(uL1_BlueNoise, 0);\nvec4 blueNoise = texelFetch(uL1_BlueNoise, ivec2(fract(st * (uResolution/size)/vec2(texSize) * vec2(texSize.x/texSize.y, 1.0)) * vec2(texSize)) % texSize, 0);\nreturn mod((blueNoise.r - 0.5) * TAU + (delta * (1.0 / TAU)), TAU) / TAU - 0.005;\n}\nvec3 dither_L1(vec3 color, vec2 st) {\nfloat delta = floor(uL1_Time);\nvec2 offset = vec2(randFibo_L1(vec2(123,16) + delta), randFibo_L1(vec2(56,96) + delta));\nfloat noise = 0.0;\nnoise = getBlueNoise_L1(st, delta, 2.);\nfloat dither_threshold = max(0.0001, 0.3000);\nfloat num_levels = 1.0 / dither_threshold;\nreturn floor(color * num_levels + noise) / num_levels;\n}\nmat2 rotate2D_L2(float angle) {\nfloat s = sin(angle);\nfloat c = cos(angle);\nreturn mat2(c, s, -s, c);\n}\nvec2 apply3DRotation_L2(vec2 uv, vec2 pivot, vec2 size, vec2 tilt, float perspective) {\nif (abs(tilt.x) < 0.001 && abs(tilt.y) < 0.001) {\nreturn uv;\n}\nvec2 pos = uv - pivot;\nfloat aspect = size.x / max(size.y, 0.0001);\npos.x *= aspect;\nfloat focalLength = mix(0.5, 4.0, perspective);\nfloat cosX = cos(tilt.y);\nfloat sinX = sin(tilt.y);\nfloat cosY = cos(tilt.x);\nfloat sinY = sin(tilt.x);\nvec3 rayDir = normalize(vec3(pos.x, pos.y, focalLength));\nvec3 rotYDir = vec3(\nrayDir.x * cosY - rayDir.z * sinY,\nrayDir.y,\nrayDir.x * sinY + rayDir.z * cosY\n);\nvec3 rotDir = vec3(\nrotYDir.x,\nrotYDir.y * cosX + rotYDir.z * sinX,\n-rotYDir.y * sinX + rotYDir.z * cosX\n);\nvec3 camPos = vec3(0.0, 0.0, -focalLength);\nvec3 rotYCam = vec3(\ncamPos.x * cosY - camPos.z * sinY,\ncamPos.y,\ncamPos.x * sinY + camPos.z * cosY\n);\nvec3 rotCam = vec3(\nrotYCam.x,\nrotYCam.y * cosX + rotYCam.z * sinX,\n-rotYCam.y * sinX + rotYCam.z * cosX\n);\nif (abs(rotDir.z) < 0.01) {\nreturn vec2(-1.0);\n}\nfloat t = -rotCam.z / rotDir.z;\nif (t < 0.0 || t > 50.0) {\nreturn vec2(-1.0);\n}\nvec2 intersection = vec2(rotCam.x + t * rotDir.x, rotCam.y + t * rotDir.y);\nintersection.x /= aspect;\nreturn intersection + pivot;\n}\nvec2 distortUV_L2(vec2 uv) {\nvec2 mouseOffset = mix(vec2(0.0), uMousePos - 0.5, 0.0000);\nvec2 pivot = vec2(0.5, 0.5) + mouseOffset;\nvec2 translatedUV = uv - ((vec2(0.5, 0.5) + (uMousePos - 0.5) * 0.0000 - 0.5) * 2.0);\nvec2 tiltMouseOffset = (uMousePos - 0.5) * 0.0000 * PI;\nvec2 tiltedUV = apply3DRotation_L2(\ntranslatedUV,\npivot,\nuResolution,\n(vec2(0.5, 0.5) - 0.5) * PI + tiltMouseOffset,\n0.5000\n);\nvec2 delta = tiltedUV - pivot;\nfloat aspect = uResolution.x / max(uResolution.y, 0.0001);\ndelta.x *= aspect;\ndelta = rotate2D_L2(0.0000 * TAU) * delta;\ndelta = mat2(1.0, (vec2(0.5, 0.5).y - 0.5) * 2.0, (vec2(0.5, 0.5).x - 0.5) * 2.0, 1.0) * delta;\ndelta /= exp2((vec2(0.5, 0.5) - 0.5) * 4.0) * exp2((0.5000 - 0.5) * 4.0);\ndelta.x /= aspect;\nvec2 transformedUV = pivot + delta;\nreturn transformedUV;\n}\n\nvec4 computeLayer_L0(vec2 uv) {\nvec4 clipColor = texture(uBgTexture, vTextureCoord);\nif(clipColor.a == 0.) {\nreturn vec4(0);\n}\nvec4 color = texture(uBgTexture, uv);\nvec4 cmyk = color;\nfloat alpha = color.a;\nfloat k = halftone_L0(uv, cmyk.w, 45.);\nfloat c = halftone_L0(uv, cmyk.x, 15.);\nfloat m = halftone_L0(uv, cmyk.y, 75.);\nfloat y = halftone_L0(uv, cmyk.z, 0.);\nfloat rC = 1. - halftone_L0(uv, 1. - cmyk.x, 15.);\nfloat rM = 1. - halftone_L0(uv, 1. - cmyk.y, 75.);\nfloat rY = 1. - halftone_L0(uv, 1. - cmyk.z, 0.);\nfloat g = 1. - halftone_L0(uv, 1. - luma_L0(color), 0.);\nvec4 halftone_L0 = vec4(rC,rM,rY,1);\nhalftone_L0 = halftone_L0;\nhalftone_L0 *= color.a;\ncolor = mix(color, halftone_L0, 0.4000);\nreturn color;\n}\nvec4 computeLayer_L1(vec2 uv, vec4 prevLayerColor) {\nfloat delta = floor(uL1_Time);\nvec4 color = prevLayerColor;\ncolor.rgb = mix(color.rgb, dither_L1(color.rgb, vTextureCoord), 0.1800);\nreturn color;\n}\n\nvoid main() {\nvec2 uv = vTextureCoord;\nvec2 uv_z1_raw = distortUV_L2(uv);\nvec2 uv_z1 = mix(uv, uv_z1_raw, clamp(uL2_ElemOpacity, 0.0, 1.0));\nvec4 result = vec4(0.0);\nvec4 c0 = computeLayer_L0(uv_z1);\nc0 *= uL0_ElemOpacity;\nresult = c0 + result * (1.0 - c0.a);\nvec4 c1 = computeLayer_L1(uv_z1, result);\nc1 *= uL1_ElemOpacity;\nresult = c1 + result * (1.0 - c1.a);\nfragColor = result;\n}"],"compiledVertexShaders":["#version 300 es\nprecision highp float;\nin vec3 aVertexPosition;\nin vec2 aTextureCoord;\nuniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nout vec2 vTextureCoord;\nout vec3 vVertexPosition;\nvoid main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvVertexPosition = aVertexPosition;\nvTextureCoord = aTextureCoord;\n}"],"sublayers":[{"id":"halftone","layerType":"effect","type":"halftone","sublayerIndex":0,"opacity":1,"animating":false},{"id":"dither","layerType":"effect","type":"dither","sublayerIndex":1,"opacity":1,"animating":true,"texture":{"src":"/unicorn/blue-noise.png","sampler":"uBlueNoise"}},{"id":"transform","layerType":"effect","type":"transform","sublayerIndex":2,"opacity":1,"animating":false}],"data":{"uniforms":{"resolution":{"name":"uResolution","type":"2f","value":{"type":"Vec2","_x":1080,"_y":1080}},"mousePos":{"name":"uMousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L0_elemOpacity":{"name":"uL0_ElemOpacity","type":"1f","value":1},"L1_time":{"name":"uL1_Time","type":"1f","value":0},"L1_elemOpacity":{"name":"uL1_ElemOpacity","type":"1f","value":1},"L2_elemOpacity":{"name":"uL2_ElemOpacity","type":"1f","value":1}},"textures":[{"sampler":"uL1_BlueNoise","type":"media","src":"/unicorn/blue-noise.png","sublayerIndex":1}],"timeUniforms":[{"key":"L1_time","speed":0.5,"animating":true}],"mouseUniforms":[],"hasMouseTracking":false,"hasVideoSublayers":false,"estimatedSublayerWorkRaw":145,"occlusion":{"candidateLayers":0}},"states":{"appear":[],"scroll":[],"hover":[],"mousemove":[]},"breakpoints":[],"userDownsample":1,"visible":true}],"options":{"name":"ASCII (Remix)","fps":60,"dpi":2,"scale":1,"includeLogo":false,"isProduction":false,"flatten":true,"freePlan":false},"version":"2.1.6","id":"T9OqjsFHvPMkMeWUTcrR"}