{
  "version": 3,
  "sources": ["../../../javascript/shards/scene_data.js", "../../../javascript/shards/renderer.js", "../../../javascript/shards/index.js"],
  "sourcesContent": ["// Chip geometry, camera matrix, and ring matrix exported from the Spline scene.\n// The 16 chip transforms are not stored here: the renderer derives them each\n// frame from the cloner parameters (see updateChips in renderer.js).\nexport const SHARD_SCENE = {\"pos\":[50,0,3.5,50,0,3.5,46.482,-0.051,7,46.482,-0.051,0,49.168,7.13,3.5,49.168,7.13,3.5,45.727,6.418,7,45.727,6.418,0,46.909,14.646,3.5,46.909,14.646,3.5,43.613,13.451,7,43.613,13.451,0,43.575,22.445,3.5,43.575,22.445,3.5,40.402,20.963,7,40.402,20.963,0,39.522,30.425,3.5,39.522,30.425,3.5,36.427,28.79,7,36.427,28.79,0,35.104,38.483,3.5,35.104,38.483,3.5,32.037,36.797,7,32.037,36.797,0,30.673,46.518,3.5,30.673,46.518,3.5,27.596,44.85,7,27.596,44.85,0,26.483,54.378,3.5,26.483,54.378,3.5,23.411,52.699,7,23.411,52.699,0,22.377,61.71,3.5,22.377,61.71,3.5,19.39,59.879,7,19.39,59.879,0,18.098,68.112,3.5,18.098,68.112,3.5,15.343,65.935,7,15.343,65.935,0,13.388,73.183,3.5,13.388,73.183,3.5,11.146,70.454,7,11.146,70.454,0,7.99,76.52,3.5,7.99,76.52,3.5,6.701,73.202,7,6.701,73.202,0,1.645,77.722,3.5,1.645,77.722,3.5,1.666,74.156,7,1.666,74.156,0,-5.962,76.19,3.5,-5.962,76.19,3.5,-4.649,72.884,7,-4.649,72.884,0,-12.763,71.95,3.5,-12.763,71.95,3.5,-10.537,69.213,7,-10.537,69.213,0,-18.892,65.536,3.5,-18.892,65.536,3.5,-16.172,63.316,7,-16.172,63.316,0,-24.482,57.482,3.5,-24.482,57.482,3.5,-21.515,55.618,7,-21.515,55.618,0,-29.666,48.32,3.5,-29.666,48.32,3.5,-26.579,46.669,7,-26.579,46.669,0,-34.578,38.584,3.5,-34.578,38.584,3.5,-31.457,37,7,-31.457,37,0,-38.119,31.641,3.5,-38.119,31.641,3.5,-35.01,30.033,7,-35.01,30.033,0,-41.663,24.887,3.5,-41.663,24.887,3.5,-38.546,23.294,7,-38.546,23.294,0,-44.923,18.332,3.5,-44.923,18.332,3.5,-41.741,16.869,7,-41.741,16.869,0,-47.608,11.992,3.5,-47.608,11.992,3.5,-44.31,10.805,7,-44.31,10.805,0,-49.431,5.876,3.5,-49.431,5.876,3.5,-45.989,5.172,7,-45.989,5.172,0,-50.103,0,3.5,-50.103,0,3.5,-46.585,-0.043,7,-46.585,-0.043,0,-49.371,-8.191,3.5,-49.371,-8.191,3.5,-45.909,-7.61,7,-45.909,-7.61,0,-47.293,-16.56,3.5,-47.293,-16.56,3.5,-43.949,-15.503,7,-43.949,-15.503,0,-44.046,-24.959,3.5,-44.046,-24.959,3.5,-40.847,-23.527,7,-40.847,-23.527,0,-39.809,-33.242,3.5,-39.809,-33.242,3.5,-36.764,-31.51,7,-36.764,-31.51,0,-34.759,-41.264,3.5,-34.759,-41.264,3.5,-31.871,-39.282,7,-31.871,-39.282,0,-29.073,-48.879,3.5,-29.073,-48.879,3.5,-26.323,-46.713,7,-26.323,-46.713,0,-24.763,-54.071,3.5,-24.763,-54.071,3.5,-22.125,-51.769,7,-22.125,-51.769,0,-20.292,-58.945,3.5,-20.292,-58.945,3.5,-17.817,-56.466,7,-17.817,-56.466,0,-15.616,-63.222,3.5,-15.616,-63.222,3.5,-13.431,-60.477,7,-13.431,-60.477,0,-10.688,-66.622,3.5,-10.688,-66.622,3.5,-8.987,-63.544,7,-8.987,-63.544,0,-5.464,-68.867,3.5,-5.464,-68.867,3.5,-4.504,-65.469,7,-4.504,-65.469,0,0.103,-69.677,3.5,0.103,-69.677,3.5,0.089,-66.138,7,0.089,-66.138,0,6.728,-68.658,3.5,6.728,-68.658,3.5,5.705,-65.274,7,5.705,-65.274,0,12.837,-65.82,3.5,12.837,-65.82,3.5,11.013,-62.808,7,11.013,-62.808,0,18.487,-61.491,3.5,18.487,-61.491,3.5,16.144,-58.877,7,16.144,-58.877,0,23.738,-55.997,3.5,23.738,-55.997,3.5,21.084,-53.709,7,21.084,-53.709,0,28.65,-49.667,3.5,28.65,-49.667,3.5,25.816,-47.611,7,25.816,-47.611,0,33.282,-42.829,3.5,33.282,-42.829,3.5,30.344,-40.925,7,30.344,-40.925,0,37.653,-35.765,3.5,37.653,-35.765,3.5,34.632,-33.996,7,34.632,-33.996,0,41.626,-28.585,3.5,41.626,-28.585,3.5,38.508,-26.992,7,38.508,-26.992,0,45.024,-21.354,3.5,45.024,-21.354,3.5,41.791,-20.005,7,41.791,-20.005,0,47.671,-14.136,3.5,47.671,-14.136,3.5,44.315,-13.121,7,44.315,-13.121,0,49.388,-6.997,3.5,49.388,-6.997,3.5,45.924,-6.432,7,45.924,-6.432,0,50,0,3.5,50,0,3.5,46.482,-0.051,7,46.482,-0.051,0,45.727,6.418,7,45.727,6.418,0,45.924,-6.432,7,45.924,-6.432,0,46.482,-0.051,7,46.482,-0.051,0,44.315,-13.121,7,44.315,-13.121,0,43.613,13.451,7,43.613,13.451,0,41.791,-20.005,7,41.791,-20.005,0,40.402,20.963,7,40.402,20.963,0,38.508,-26.992,7,38.508,-26.992,0,36.427,28.79,7,36.427,28.79,0,34.632,-33.996,7,34.632,-33.996,0,32.037,36.797,7,32.037,36.797,0,30.344,-40.925,7,30.344,-40.925,0,27.596,44.85,7,27.596,44.85,0,25.816,-47.611,7,25.816,-47.611,0,23.411,52.699,7,23.411,52.699,0,21.084,-53.709,7,21.084,-53.709,0,19.39,59.879,7,19.39,59.879,0,16.144,-58.877,7,16.144,-58.877,0,15.343,65.935,7,15.343,65.935,0,11.146,70.454,7,11.146,70.454,0,11.013,-62.808,7,11.013,-62.808,0,6.701,73.202,7,6.701,73.202,0,5.705,-65.274,7,5.705,-65.274,0,1.666,74.156,7,1.666,74.156,0,0.089,-66.138,7,0.089,-66.138,0,-4.504,-65.469,7,-4.504,-65.469,0,-4.649,72.884,7,-4.649,72.884,0,-8.987,-63.544,7,-8.987,-63.544,0,-10.537,69.213,7,-10.537,69.213,0,-13.431,-60.477,7,-13.431,-60.477,0,-16.172,63.316,7,-16.172,63.316,0,-17.817,-56.466,7,-17.817,-56.466,0,-21.515,55.618,7,-21.515,55.618,0,-22.125,-51.769,7,-22.125,-51.769,0,-26.323,-46.713,7,-26.323,-46.713,0,-26.579,46.669,7,-26.579,46.669,0,-31.457,37,7,-31.457,37,0,-31.871,-39.282,7,-31.871,-39.282,0,-35.01,30.033,7,-35.01,30.033,0,-36.764,-31.51,7,-36.764,-31.51,0,-38.546,23.294,7,-38.546,23.294,0,-40.847,-23.527,7,-40.847,-23.527,0,-41.741,16.869,7,-41.741,16.869,0,-43.949,-15.503,7,-43.949,-15.503,0,-44.31,10.805,7,-44.31,10.805,0,-45.909,-7.61,7,-45.909,-7.61,0,-45.989,5.172,7,-45.989,5.172,0,-46.585,-0.043,7,-46.585,-0.043,0],\"nor\":[0.9933,0.1159,0,0.9933,0.1159,0,0,0,1,0,0,-1,0.9577,0.2879,0,0.9577,0.2879,0,0,0,1,0,0,-1,0.9195,0.393,0,0.9195,0.393,0,0,0,1,0,0,-1,0.8916,0.4528,0,0.8916,0.4528,0,0,0,1,0,0,-1,0.8768,0.4808,0,0.8768,0.4808,0,0,0,1,0,0,-1,0.8757,0.4829,0,0.8757,0.4829,0,0,0,1,0,0,-1,0.8824,0.4705,0,0.8824,0.4705,0,0,0,1,0,0,-1,0.8725,0.4886,0,0.8725,0.4886,0,0,0,1,0,0,-1,0.8314,0.5557,0,0.8314,0.5557,0,0,0,1,0,0,-1,0.7327,0.6805,0,0.7327,0.6805,0,0,0,1,0,0,-1,0.5258,0.8506,0,0.5258,0.8506,0,0,0,1,0,0,-1,0.1861,0.9825,0,0.1861,0.9825,0,0,0,1,0,0,-1,-0.1974,0.9803,0,-0.1974,0.9803,0,0,0,1,0,0,-1,-0.529,0.8486,0,-0.529,0.8486,0,0,0,1,0,0,-1,-0.723,0.6909,0,-0.723,0.6909,0,0,0,1,0,0,-1,-0.8215,0.5701,0,-0.8215,0.5701,0,0,0,1,0,0,-1,-0.8703,0.4925,0,-0.8703,0.4925,0,0,0,1,0,0,-1,-0.8928,0.4504,0,-0.8928,0.4504,0,0,0,1,0,0,-1,-0.8908,0.4544,0,-0.8908,0.4544,0,0,0,1,0,0,-1,-0.8855,0.4647,0,-0.8855,0.4647,0,0,0,1,0,0,-1,-0.8954,0.4453,0,-0.8954,0.4453,0,0,0,1,0,0,-1,-0.9208,0.39,0,-0.9208,0.39,0,0,0,1,0,0,-1,-0.9583,0.2857,0,-0.9583,0.2857,0,0,0,1,0,0,-1,-0.9935,0.1136,0,-0.9935,0.1136,0,0,0,1,0,0,-1,-0.996,-0.089,0,-0.996,-0.089,0,0,0,1,0,0,-1,-0.9705,-0.241,0,-0.9705,-0.241,0,0,0,1,0,0,-1,-0.9327,-0.3605,0,-0.9327,-0.3605,0,0,0,1,0,0,-1,-0.8903,-0.4554,0,-0.8903,-0.4554,0,0,0,1,0,0,-1,-0.8463,-0.5327,0,-0.8463,-0.5327,0,0,0,1,0,0,-1,-0.8013,-0.5983,0,-0.8013,-0.5983,0,0,0,1,0,0,-1,-0.7694,-0.6387,0,-0.7694,-0.6387,0,0,0,1,0,0,-1,-0.7369,-0.676,0,-0.7369,-0.676,0,0,0,1,0,0,-1,-0.6748,-0.738,0,-0.6748,-0.738,0,0,0,1,0,0,-1,-0.5679,-0.8231,0,-0.5679,-0.8231,0,0,0,1,0,0,-1,-0.3948,-0.9188,0,-0.3948,-0.9188,0,0,0,1,0,0,-1,-0.144,-0.9896,0,-0.144,-0.9896,0,0,0,1,0,0,-1,0.152,-0.9884,0,0.152,-0.9884,0,0,0,1,0,0,-1,0.4214,-0.9069,0,0.4214,-0.9069,0,0,0,1,0,0,-1,0.6082,-0.7938,0,0.6082,-0.7938,0,0,0,1,0,0,-1,0.7229,-0.691,0,0.7229,-0.691,0,0,0,1,0,0,-1,0.79,-0.6131,0,0.79,-0.6131,0,0,0,1,0,0,-1,0.828,-0.5608,0,0.828,-0.5608,0,0,0,1,0,0,-1,0.8503,-0.5262,0,0.8503,-0.5262,0,0,0,1,0,0,-1,0.875,-0.4842,0,0.875,-0.4842,0,0,0,1,0,0,-1,0.905,-0.4253,0,0.905,-0.4253,0,0,0,1,0,0,-1,0.9389,-0.3442,0,0.9389,-0.3442,0,0,0,1,0,0,-1,0.9723,-0.2339,0,0.9723,-0.2339,0,0,0,1,0,0,-1,0.9962,-0.0871,0,0.9962,-0.0871,0,0,0,1,0,0,-1,0.9933,0.1159,0,0.9933,0.1159,0,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1,0,0,1,0,0,-1],\"idx\":[2,0,4,2,4,6,5,1,3,5,3,7,6,4,8,6,8,10,9,5,7,9,7,11,10,8,12,10,12,14,13,9,11,13,11,15,14,12,16,14,16,18,17,13,15,17,15,19,18,16,20,18,20,22,21,17,19,21,19,23,22,20,24,22,24,26,25,21,23,25,23,27,26,24,28,26,28,30,29,25,27,29,27,31,30,28,32,30,32,34,33,29,31,33,31,35,34,32,36,34,36,38,37,33,35,37,35,39,38,36,40,38,40,42,41,37,39,41,39,43,42,40,44,42,44,46,45,41,43,45,43,47,46,44,48,46,48,50,49,45,47,49,47,51,50,48,52,50,52,54,53,49,51,53,51,55,54,52,56,54,56,58,57,53,55,57,55,59,58,56,60,58,60,62,61,57,59,61,59,63,62,60,64,62,64,66,65,61,63,65,63,67,66,64,68,66,68,70,69,65,67,69,67,71,70,68,72,70,72,74,73,69,71,73,71,75,74,72,76,74,76,78,77,73,75,77,75,79,78,76,80,78,80,82,81,77,79,81,79,83,82,80,84,82,84,86,85,81,83,85,83,87,86,84,88,86,88,90,89,85,87,89,87,91,90,88,92,90,92,94,93,89,91,93,91,95,94,92,96,94,96,98,97,93,95,97,95,99,98,96,100,98,100,102,101,97,99,101,99,103,102,100,104,102,104,106,105,101,103,105,103,107,106,104,108,106,108,110,109,105,107,109,107,111,110,108,112,110,112,114,113,109,111,113,111,115,114,112,116,114,116,118,117,113,115,117,115,119,118,116,120,118,120,122,121,117,119,121,119,123,122,120,124,122,124,126,125,121,123,125,123,127,126,124,128,126,128,130,129,125,127,129,127,131,130,128,132,130,132,134,133,129,131,133,131,135,134,132,136,134,136,138,137,133,135,137,135,139,138,136,140,138,140,142,141,137,139,141,139,143,142,140,144,142,144,146,145,141,143,145,143,147,146,144,148,146,148,150,149,145,147,149,147,151,150,148,152,150,152,154,153,149,151,153,151,155,154,152,156,154,156,158,157,153,155,157,155,159,158,156,160,158,160,162,161,157,159,161,159,163,162,160,164,162,164,166,165,161,163,165,163,167,166,164,168,166,168,170,169,165,167,169,167,171,170,168,172,170,172,174,173,169,171,173,171,175,174,172,176,174,176,178,177,173,175,177,175,179,178,176,180,178,180,182,181,177,179,181,179,183,182,180,184,182,184,186,185,181,183,185,183,187,186,184,188,186,188,190,189,185,187,189,187,191,190,188,192,190,192,194,193,189,191,193,191,195,196,198,200,201,199,197,196,202,198,199,203,197,204,202,196,197,203,205,204,206,202,203,207,205,208,206,204,205,207,209,208,210,206,207,211,209,212,210,208,209,211,213,212,214,210,211,215,213,216,214,212,213,215,217,216,218,214,215,219,217,220,218,216,217,219,221,220,222,218,219,223,221,224,222,220,221,223,225,224,226,222,223,227,225,228,226,224,225,227,229,228,230,226,227,231,229,232,230,228,229,231,233,234,230,232,233,231,235,234,236,230,231,237,235,238,236,234,235,237,239,238,240,236,237,241,239,242,240,238,239,241,243,242,244,240,241,245,243,242,246,244,245,247,243,248,246,242,243,247,249,248,250,246,247,251,249,252,250,248,249,251,253,252,254,250,251,255,253,256,254,252,253,255,257,256,258,254,255,259,257,260,258,256,257,259,261,260,262,258,259,263,261,260,264,262,263,265,261,266,264,260,261,265,267,268,264,266,267,265,269,268,270,264,265,271,269,272,270,268,269,271,273,272,274,270,271,275,273,276,274,272,273,275,277,276,278,274,275,279,277,280,278,276,277,279,281,280,282,278,279,283,281,284,282,280,281,283,285,284,286,282,283,287,285,288,286,284,285,287,289,286,288,290,291,289,287],\"cam\":[0.31934,0,-0.94764,0,-0.230073,0.97008,-0.077531,0,0.919287,0.242785,0.309785,0,675.760384,178.469589,227.720435,1],\"parent\":[-0.432849,0.901098,0.025768,0,-0.877597,-0.42775,0.216457,0,0.206071,0.071079,0.975952,0,0,0,0,1]};\n", "// WebGL rendering of the QUL shard ring, ported from the Spline scene.\n//\n// The scene is drawn with plain WebGL 1 rather than a scene graph library: one\n// chip mesh drawn 16 times, two shadow-mapped spot lights, and a Kawase bloom\n// pass composited over the result. The constants below come from the Spline\n// scene (scene.splinecode) unless noted otherwise.\nimport { SHARD_SCENE as SCENE } from \"./scene_data\";\n\nconst CHIP_COUNT = 16;\nconst CHIP_TWEEN_SECONDS = 50; // Linear ping-pong between the two cloner states.\n// One noise value per chip. It drives the spin, tilt, and scale of that chip.\nconst CHIP_NOISE = [\n  0.4239, 0.4784, 0.5042, 0.5926, 0.5997, 0.6124, 0.6174, 0.6647,\n  0.6308, 0.5483, 0.503, 0.6069, 0.4789, 0.4357, 0.4091, 0.4264,\n];\nconst NOISE_DRIFT = 0.02; // Approximates the slow noise movement in Spline.\nconst NOISE_DRIFT_SPEED = 0.075; // Radians per second.\n\n// Spot lights. \"Spot Light 2\" eases between two states, 5 seconds each way.\nconst LIGHT_TWEEN_SECONDS = 5;\nconst LIGHT_FROM = { position: [940.784, 70.04, 389.408], color: [0.55286, 0.22562, 0.88805], intensity: 1.877 };\nconst LIGHT_TO = { position: [1390.78, -237.96, 443.41], color: [0.84625, 0.18895, 0.18895], intensity: 2 };\nconst SPOT1_POSITION = [751.69, -220.43, -298.17];\nconst SPOT1_COLOR = [2.68581, 2.38266, 0.241]; // Color multiplied by intensity.\nconst SPOT_AXES = [[0.99923, 0.00694, 0.03857], [0.9734, -0.04056, -0.22549]];\nconst SPOT_RANGES = [7010, 8628];\nconst SPOT_ANGLE = Math.PI / 6;\nconst SHADOW_NEAR = 100;\nconst SHADOW_MAP_SIZE = 1024;\n\nconst FOV_Y = (45 * Math.PI) / 180;\nconst BOUNDING_RADIUS = 300; // Contains the ring at every animation state.\nconst BACKGROUND = [0.01363, 0.01363, 0.0153];\nconst BLOOM_KERNEL = [0, 1, 2, 2, 3];\nconst BLOOM_BLUR_SCALE = 0.389;\nconst BLOOM_INTENSITY = 1.259;\nconst BLOOM_OPACITY = 0.7;\n\n// Framing. The authored Spline camera assumes a full-window canvas; here the\n// ring sits in a hero half-column or a short devise panel, so the viewing angle\n// is kept but the distance is re-derived per container shape. These are the\n// fraction of the container's shorter side the ring should span.\nconst FILL_LARGE = 0.92;\n// Small panels (the devise hero is only 30vh tall on phones) are short and wide,\n// so a ring bounded by the inscribed circle leaves the box looking empty. Going\n// past 1 lets the outermost chips clip the short edge at full fan-out, which\n// fills the panel without the ring losing its silhouette.\nconst FILL_SMALL = 1.2;\nconst SMALL_CANVAS = 380;\nconst FIT_SAMPLES = [0, 0.25, 0.5, 0.75, 1]; // Tween states sampled for the fit.\nconst FIT_CANDIDATES = 256; // Outermost sample points kept for the fit passes.\nconst FIT_PASSES = 6;\n\n// Performance limits.\nconst MAX_DEVICE_PIXEL_RATIO = 2;\n\n// The camera leans toward the pointer as it moves over the ring. This is a\n// parallax lean of the whole scene, independent of the drag spin below, and the\n// two layer: you can tilt by hovering and turn by grabbing at the same time.\nconst TILT_MAX = 0.3; // Radians of lean at the canvas edges.\nconst TILT_EASE = 0.06; // Share of the remaining lean applied per 60 Hz frame.\n\n// Grab the ring and swing it around its centre, like turning a wheel. The ring\n// tracks the pointer's angle 1:1 while held; on release it is a spring-damper,\n// so how hard you threw it decides how far it carries before settling back to\n// the authored angle.\nconst SPIN_SIGN = 1; // Maps screen-clockwise pointer travel to a clockwise ring, so it follows the hand.\nconst SPIN_MAX = 2 * Math.PI; // Clamp, so a long drag cannot wind up forever.\nconst SPIN_MAX_VELOCITY = 16; // rad/s ceiling on a flick.\nconst SPIN_STIFFNESS = 26; // Spring pulling the ring home, rad/s^2 per rad.\nconst SPIN_DAMPING = 7.5; // ~0.73 of critical: settles in under a second, barely overshoots.\nconst SPIN_STEP = 1 / 120; // Fixed integration step, so a long frame cannot blow the spring up.\nconst GRAB_MIN_RADIUS = 28; // px. Nearer the centre than this, the grab angle is too noisy to use.\nconst MAX_PIXELS = 4.2e6; // Upper limit for the drawing buffer size.\nconst MIN_FRAME_MS = 12.5; // Limits rendering to about 60 frames per second.\n\n// Colors are Display P3 values, as in Spline. Without a P3 canvas, this converts them to sRGB.\nconst P3_TO_SRGB = `\n  vec3 outputColor(vec3 color) {\n    #ifdef CONVERT_P3\n    // Display P3 and sRGB use the same transfer function.\n    vec3 c = clamp(color, 0.0, 1.0);\n    vec3 linear = mix(pow((c + 0.055) / 1.055, vec3(2.4)), c / 12.92, step(c, vec3(0.04045)));\n    linear = clamp(mat3(1.2249401, -0.0420569, -0.0196376, -0.2249404, 1.0420571, -0.0786361,\n                        0.0, 0.0, 1.0982735) * linear, 0.0, 1.0);\n    return mix(1.055 * pow(linear, vec3(1.0 / 2.4)) - 0.055, linear * 12.92, step(linear, vec3(0.0031308)));\n    #else\n    return color;\n    #endif\n  }`;\n\nconst CHIP_VS = `\n  attribute vec3 aPosition;\n  attribute vec3 aNormal;\n  uniform mat4 uModel;\n  uniform mat4 uViewProjection;\n  uniform mat3 uNormalMatrix;\n  uniform vec3 uSpotPosition[2];\n  uniform vec3 uCameraPosition;\n  uniform mat4 uShadowMatrix[2];\n  varying vec3 vNormal;\n  varying vec3 vToCamera;\n  varying vec3 vToSpot0;\n  varying vec3 vToSpot1;\n  varying vec4 vShadow0;\n  varying vec4 vShadow1;\n  varying float vGradient;\n  const float SHADOW_NORMAL_BIAS = 1.0;\n  void main() {\n    vec4 world = uModel * vec4(aPosition, 1.0);\n    vNormal = uNormalMatrix * aNormal;\n    // Vectors to the camera and the lights are linear in the position,\n    // so interpolation is exact and medium precision is sufficient.\n    vToCamera = uCameraPosition - world.xyz;\n    vToSpot0 = uSpotPosition[0] - world.xyz;\n    vToSpot1 = uSpotPosition[1] - world.xyz;\n    vec4 biased = vec4(world.xyz + normalize(vNormal) * SHADOW_NORMAL_BIAS, 1.0);\n    vShadow0 = uShadowMatrix[0] * biased;\n    vShadow1 = uShadowMatrix[1] * biased;\n    // Linear gradient along the local x axis of the chip.\n    vGradient = (132.0 - aPosition.x) / 190.0;\n    gl_Position = uViewProjection * world;\n  }`;\n\nconst CHIP_FS = `\n  precision mediump float;\n  #ifdef GL_FRAGMENT_PRECISION_HIGH\n  precision highp float;\n  #endif\n  uniform vec3 uSpotColor[2];\n  uniform sampler2D uShadowMap0;\n  uniform sampler2D uShadowMap1;\n  varying vec3 vNormal;\n  varying vec3 vToCamera;\n  varying vec3 vToSpot0;\n  varying vec3 vToSpot1;\n  varying vec4 vShadow0;\n  varying vec4 vShadow1;\n  varying float vGradient;\n  ${P3_TO_SRGB}\n\n  const vec3 COLOR0 = vec3(0.88402, 0.92133, 0.97012);\n  const vec3 COLOR1 = vec3(0.53969, 1.0, 0.47573);\n  const vec3 COLOR2 = vec3(0.33333, 0.84706, 0.60664);\n  const float STOP0 = 0.026684;\n  const float STOP1 = 0.408671;\n  const float STOP2 = 0.976755;\n  const vec3 SKY = vec3(0.62059);      // Hemisphere light, intensity included.\n  const vec3 GROUND = vec3(0.38235);\n  const vec3 SPOT0_AXIS = vec3(${SPOT_AXES[0].join(\", \")});\n  const vec3 SPOT1_AXIS = vec3(${SPOT_AXES[1].join(\", \")});\n  const float SHADOW_MAP_SIZE = ${SHADOW_MAP_SIZE.toFixed(1)};\n  const float SHADOW_NORMAL_BIAS = 1.0;\n  const float SHADOW_DEPTH_BIAS = 0.5;\n\n  float unpackDepth(vec4 color) {\n    return dot(color, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n  }\n\n  float shadowSample(sampler2D map, vec2 texel, float depth) {\n    return step(depth, unpackDepth(texture2D(map, (texel + 0.5) / SHADOW_MAP_SIZE)));\n  }\n\n  // Percentage-closer filtering with bilinear weights over 4 texels.\n  float shadow(sampler2D map, vec4 coord, vec3 toLight, vec3 n, float range) {\n    vec2 uv = coord.xy / coord.w * 0.5 + 0.5;\n    if (coord.w <= 0.0 || any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) return 1.0;\n    float depth = (length(n * SHADOW_NORMAL_BIAS - toLight) - SHADOW_DEPTH_BIAS) / range;\n    vec2 p = uv * SHADOW_MAP_SIZE - 0.5;\n    vec2 i = floor(p);\n    vec2 f = p - i;\n    float a = shadowSample(map, i, depth);\n    float b = shadowSample(map, i + vec2(1.0, 0.0), depth);\n    float c = shadowSample(map, i + vec2(0.0, 1.0), depth);\n    float d = shadowSample(map, i + vec2(1.0, 1.0), depth);\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n\n  vec3 spotLight(vec3 toLight, vec3 axis, vec3 color, float coneCos, float penumbraCos,\n                 float range, float visibility, vec3 n, vec3 v, vec3 albedo, inout vec3 specular) {\n    float dist = length(toLight);\n    vec3 l = toLight / dist;\n    float attenuation = smoothstep(coneCos, penumbraCos, dot(l, axis))\n                      * clamp(1.0 - dist / range, 0.0, 1.0) * visibility;\n    vec3 irradiance = color * attenuation * max(dot(n, l), 0.0);\n    // Blinn-Phong with specular color 0.2 and shininess 5 (three.js r149).\n    vec3 h = normalize(l + v);\n    float vh = max(dot(v, h), 0.0);\n    float fresnel = exp2((-5.55473 * vh - 6.98316) * vh);\n    float blinn = 0.875 * pow(max(dot(n, h), 0.0), 5.0);\n    specular += irradiance * (0.2 + 0.8 * fresnel) * blinn;\n    return irradiance * albedo;\n  }\n\n  void main() {\n    vec3 n = normalize(vNormal);\n    vec3 v = normalize(vToCamera);\n\n    // Spline \"rainbow\" layer: a gray band pattern that depends on the view angle.\n    float phase = -9.0 * dot(v, n);\n    float band = cos(phase);\n    #ifdef HAS_DERIVATIVES\n    // Average the bands over the pixel footprint to prevent shimmer on the rims.\n    float halfWidth = max(0.5 * fwidth(phase), 1e-3);\n    band *= clamp(sin(halfWidth) / halfWidth, 0.0, 1.0);\n    #endif\n    float bandGray = 0.5 + 0.5 * band;\n\n    vec3 gradient = mix(COLOR0, COLOR1, clamp((vGradient - STOP0) / (STOP1 - STOP0), 0.0, 1.0));\n    gradient = mix(gradient, COLOR2, clamp((vGradient - STOP1) / (STOP2 - STOP1), 0.0, 1.0));\n\n    // Overlay blend of the band pattern and the gradient.\n    vec3 albedo = clamp(mix(1.0 - 2.0 * (1.0 - bandGray) * (1.0 - gradient),\n                            2.0 * bandGray * gradient, step(bandGray, 0.5)), 0.0, 1.0);\n\n    float shadow0 = shadow(uShadowMap0, vShadow0, vToSpot0, n, ${SPOT_RANGES[0].toFixed(1)});\n    float shadow1 = shadow(uShadowMap1, vShadow1, vToSpot1, n, ${SPOT_RANGES[1].toFixed(1)});\n\n    vec3 specular = vec3(0.0);\n    vec3 lit = albedo * mix(GROUND, SKY, 0.5 * n.y + 0.5);\n    lit += spotLight(vToSpot0, SPOT0_AXIS, uSpotColor[0], 0.8660, 0.8666, ${SPOT_RANGES[0].toFixed(1)},\n                     shadow0, n, v, albedo, specular);\n    lit += spotLight(vToSpot1, SPOT1_AXIS, uSpotColor[1], 0.8660, 0.9135, ${SPOT_RANGES[1].toFixed(1)},\n                     shadow1, n, v, albedo, specular);\n    lit += specular;\n\n    // The lighting layer has 60% opacity over the unlit color.\n    vec3 color = mix(albedo, lit, 0.6);\n\n    #ifdef BRIGHT\n    float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));\n    // Stored at half value so that colors above 1 survive the 8-bit target.\n    gl_FragColor = vec4(0.5 * color * smoothstep(0.52, 0.545, luminance), 1.0);\n    #else\n    float noise = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));\n    gl_FragColor = vec4(outputColor(color) + (noise - 0.5) / 255.0, 1.0);\n    #endif\n  }`;\n\n// Stores the distance to the light, divided by the light range, in 8-bit channels.\nconst SHADOW_VS = `\n  attribute vec3 aPosition;\n  uniform mat4 uModel;\n  uniform mat4 uViewProjection;\n  uniform vec3 uLightPosition;\n  varying vec3 vFromLight;\n  void main() {\n    vec4 world = uModel * vec4(aPosition, 1.0);\n    vFromLight = world.xyz - uLightPosition;\n    gl_Position = uViewProjection * world;\n  }`;\n\nconst SHADOW_FS = `\n  precision mediump float;\n  #ifdef GL_FRAGMENT_PRECISION_HIGH\n  precision highp float;\n  #endif\n  uniform float uInverseRange;\n  varying vec3 vFromLight;\n  void main() {\n    vec4 encoded = fract(length(vFromLight) * uInverseRange * vec4(1.0, 255.0, 65025.0, 16581375.0));\n    gl_FragColor = encoded - encoded.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);\n  }`;\n\n// Kawase blur, matching the bloom effect that Spline uses.\nconst BLUR_VS = `\n  attribute vec2 aPosition;\n  uniform vec2 uOffset;\n  varying vec2 vUv0;\n  varying vec2 vUv1;\n  varying vec2 vUv2;\n  varying vec2 vUv3;\n  void main() {\n    vec2 uv = aPosition * 0.5 + 0.5;\n    vUv0 = uv + vec2(-uOffset.x, uOffset.y);\n    vUv1 = uv + uOffset;\n    vUv2 = uv - uOffset;\n    vUv3 = uv + vec2(uOffset.x, -uOffset.y);\n    gl_Position = vec4(aPosition, 0.0, 1.0);\n  }`;\n\nconst BLUR_FS = `\n  precision mediump float;\n  uniform sampler2D uTexture;\n  varying vec2 vUv0;\n  varying vec2 vUv1;\n  varying vec2 vUv2;\n  varying vec2 vUv3;\n  void main() {\n    gl_FragColor = 0.25 * (texture2D(uTexture, vUv0) + texture2D(uTexture, vUv1)\n                         + texture2D(uTexture, vUv2) + texture2D(uTexture, vUv3));\n  }`;\n\nconst COMPOSITE_VS = `\n  attribute vec2 aPosition;\n  void main() { gl_Position = vec4(aPosition, 0.0, 1.0); }`;\n\n// Drawn with screen blending: result = bloom + scene * (1 - bloom).\nconst COMPOSITE_FS = `\n  precision mediump float;\n  uniform sampler2D uTexture;\n  uniform vec2 uInverseSize;\n  ${P3_TO_SRGB}\n  void main() {\n    vec3 bloom = min(texture2D(uTexture, gl_FragCoord.xy * uInverseSize).rgb * ${(2 * BLOOM_INTENSITY).toFixed(4)}, 1.0);\n    gl_FragColor = vec4(outputColor(bloom) * ${BLOOM_OPACITY.toFixed(2)}, 1.0);\n  }`;\n\n// ---------- Matrix helpers (column-major) ----------\n\nfunction multiply(a, b, out, offset) {\n  for (let col = 0; col < 4; col++) {\n    for (let row = 0; row < 4; row++) {\n      let sum = 0;\n      for (let k = 0; k < 4; k++) sum += a[k * 4 + row] * b[col * 4 + k];\n      out[offset + col * 4 + row] = sum;\n    }\n  }\n}\n\nfunction perspective(fovY, aspect, near, far) {\n  const f = 1 / Math.tan(fovY / 2);\n  return [f / aspect, 0, 0, 0, 0, f, 0, 0,\n    0, 0, (far + near) / (near - far), -1, 0, 0, (2 * far * near) / (near - far), 0];\n}\n\n// View matrix from the camera axes (x, y, z) and position.\nfunction view(x, y, z, p) {\n  const dot = (a) => a[0] * p[0] + a[1] * p[1] + a[2] * p[2];\n  return [x[0], y[0], z[0], 0, x[1], y[1], z[1], 0, x[2], y[2], z[2], 0, -dot(x), -dot(y), -dot(z), 1];\n}\n\n// CSS \"ease-in-out\", cubic-bezier(0.42, 0, 0.58, 1).\nfunction easeInOut(x) {\n  const curve = (t, p1, p2) => 3 * (1 - t) * (1 - t) * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t;\n  let t = x;\n  for (let i = 0; i < 8; i++) {\n    const slope = 3 * (1 - t) * (1 - t) * 0.42 + 6 * (1 - t) * t * 0.16 + 3 * t * t * 0.42;\n    t = Math.min(1, Math.max(0, t - (curve(t, 0.42, 0.58) - x) / Math.max(slope, 1e-4)));\n  }\n  return curve(t, 0, 1);\n}\n\nfunction pingPong(time, seconds) {\n  const cycle = (time / seconds) % 2;\n  return cycle < 1 ? cycle : 2 - cycle;\n}\n\nexport default class ShardRing {\n  constructor(canvas, container) {\n    this.canvas = canvas;\n    this.container = container || canvas.parentElement;\n    this.disposed = false;\n    this.running = false;\n    this.frameId = 0;\n    this.lastFrame = 0;\n    this.contextLost = false;\n    this.hasRendered = false;\n\n    this.gl = canvas.getContext(\"webgl\", {\n      alpha: false, antialias: true, depth: true, stencil: false,\n      premultipliedAlpha: false, preserveDrawingBuffer: false,\n    });\n    if (!this.gl) throw new Error(\"WebGL unavailable\");\n    this.convertP3 = !this.useDisplayP3();\n\n    this.width = 0;\n    this.height = 0;\n    this.halfWidth = 0;\n    this.halfHeight = 0;\n    this.scissor = [0, 0, 0, 0];\n    this.projection = null;\n    this.viewProjection = new Float32Array(16);\n    this.cameraPosition = new Float32Array(3);\n    this.models = new Float32Array(16 * CHIP_COUNT);\n    this.normals = new Float32Array(9 * CHIP_COUNT);\n    this.spotPositions = new Float32Array([0, 0, 0].concat(SPOT1_POSITION));\n    this.spotColors = new Float32Array([0, 0, 0].concat(SPOT1_COLOR));\n    this.shadowMatrices = new Float32Array(32);\n    this.ring = SCENE.parent;\n    this.ringSpun = SCENE.parent.slice(); // ring's 3x3, re-derived per frame from `spin`.\n    this.time = 0;\n    this.tilt = { x: 0, y: 0, targetX: 0, targetY: 0 };\n    this.spin = 0;\n    this.spinVelocity = 0;\n    this.centre = { x: 0, y: 0 };\n    this.drag = { active: false, pointerId: null, angle: 0, time: 0 };\n\n    // The authored camera gives the viewing angle; resize() re-derives the\n    // distance along it so the ring frames itself in any container shape.\n    const c = SCENE.cam;\n    this.cameraAxes = [[c[0], c[1], c[2]], [c[4], c[5], c[6]], [c[8], c[9], c[10]]];\n    const authored = [c[12], c[13], c[14]];\n    this.cameraDistance = Math.hypot(authored[0], authored[1], authored[2]) || 735;\n    this.cameraDirection = authored.map((value) => value / this.cameraDistance);\n\n    this.buildFitSamples();\n\n    this.boundResize = () => this.handleResize();\n    this.boundPointerMove = (event) => this.handlePointerMove(event);\n    this.boundPointerDown = (event) => this.handlePointerDown(event);\n    this.boundPointerUp = (event) => this.handlePointerUp(event);\n    this.boundMouseOut = (event) => {\n      // Leaving the window entirely, rather than crossing between elements.\n      if (!event.relatedTarget) this.tilt.targetX = this.tilt.targetY = 0;\n    };\n    this.boundContextLost = (event) => {\n      event.preventDefault();\n      this.contextLost = true;\n      this.stop();\n    };\n    this.boundContextRestored = () => {\n      this.contextLost = false;\n      this.initResources();\n      this.handleResize();\n    };\n\n    window.addEventListener(\"resize\", this.boundResize);\n    window.addEventListener(\"pointermove\", this.boundPointerMove, { passive: true });\n    document.addEventListener(\"mouseout\", this.boundMouseOut);\n    canvas.addEventListener(\"pointerdown\", this.boundPointerDown);\n    canvas.addEventListener(\"pointerup\", this.boundPointerUp);\n    canvas.addEventListener(\"pointercancel\", this.boundPointerUp);\n    canvas.style.cursor = \"grab\";\n    // Vertical panning still belongs to the page, so on touch only the sideways\n    // part of a swing reaches us and dragging the ring never traps the scroll.\n    canvas.style.touchAction = \"pan-y\";\n    canvas.addEventListener(\"webglcontextlost\", this.boundContextLost);\n    canvas.addEventListener(\"webglcontextrestored\", this.boundContextRestored);\n\n    // The hero column can change size without the window doing so (layout\n    // shifts, the devise modal), so track the canvas box directly too.\n    if (\"ResizeObserver\" in window) {\n      this.resizeObserver = new ResizeObserver(this.boundResize);\n      this.resizeObserver.observe(canvas);\n    }\n\n    this.initResources();\n    this.handleResize();\n  }\n\n  // ---------- WebGL setup ----------\n\n  // Some browsers accept a Display P3 canvas but still show it as sRGB. This draws a P3 color\n  // and reads it back through an sRGB 2D canvas: with real P3 output, the browser converts it.\n  useDisplayP3() {\n    const gl = this.gl;\n    if (!(\"drawingBufferColorSpace\" in gl)) return false;\n    gl.drawingBufferColorSpace = \"display-p3\";\n    if (gl.drawingBufferColorSpace !== \"display-p3\") return false;\n    let red = 0;\n    try {\n      const probe = document.createElement(\"canvas\").getContext(\"2d\", { willReadFrequently: true });\n      gl.clearColor(0.3, 0.6, 0.4, 1); // In sRGB about (36, 158, 97). Unconverted, red stays 77.\n      gl.clear(gl.COLOR_BUFFER_BIT);\n      probe.drawImage(this.canvas, 0, 0, 1, 1);\n      red = probe.getImageData(0, 0, 1, 1).data[0];\n    } catch (error) {\n      return true; // Cannot check. Trust the setting.\n    }\n    if (red < 56) return true;\n    gl.drawingBufferColorSpace = \"srgb\";\n    return false;\n  }\n\n  compile(type, source) {\n    const gl = this.gl;\n    const shader = gl.createShader(type);\n    gl.shaderSource(shader, source);\n    gl.compileShader(shader);\n    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS) && !gl.isContextLost()) {\n      throw new Error(gl.getShaderInfoLog(shader));\n    }\n    return shader;\n  }\n\n  createProgram(vertexSource, fragmentSource, uniformNames) {\n    const gl = this.gl;\n    const program = gl.createProgram();\n    gl.attachShader(program, this.compile(gl.VERTEX_SHADER, vertexSource));\n    gl.attachShader(program, this.compile(gl.FRAGMENT_SHADER, fragmentSource));\n    gl.bindAttribLocation(program, 0, \"aPosition\");\n    gl.bindAttribLocation(program, 1, \"aNormal\");\n    gl.linkProgram(program);\n    const uniforms = {};\n    uniformNames.forEach((name) => { uniforms[name] = gl.getUniformLocation(program, name); });\n    return { program, uniforms };\n  }\n\n  createTarget(withDepth, filter) {\n    const gl = this.gl;\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    const framebuffer = gl.createFramebuffer();\n    const depth = withDepth ? gl.createRenderbuffer() : null;\n    return { texture, framebuffer, depth };\n  }\n\n  sizeTarget(target, w, h) {\n    const gl = this.gl;\n    gl.bindTexture(gl.TEXTURE_2D, target.texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target.texture, 0);\n    if (target.depth) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, target.depth);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, target.depth);\n    }\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n  }\n\n  initResources() {\n    const gl = this.gl;\n    const colorHeader = this.convertP3 ? \"#define CONVERT_P3\\n\" : \"\";\n    const header = colorHeader + (gl.getExtension(\"OES_standard_derivatives\")\n      ? \"#extension GL_OES_standard_derivatives : enable\\n#define HAS_DERIVATIVES\\n\" : \"\");\n    const chipUniforms = [\"uModel\", \"uViewProjection\", \"uNormalMatrix\", \"uSpotPosition\", \"uSpotColor\",\n      \"uCameraPosition\", \"uShadowMatrix\", \"uShadowMap0\", \"uShadowMap1\"];\n    this.programs = {\n      chip: this.createProgram(CHIP_VS, header + CHIP_FS, chipUniforms),\n      bright: this.createProgram(CHIP_VS, header + \"#define BRIGHT\\n\" + CHIP_FS, chipUniforms),\n      shadow: this.createProgram(SHADOW_VS, SHADOW_FS, [\"uModel\", \"uViewProjection\", \"uLightPosition\", \"uInverseRange\"]),\n      blur: this.createProgram(BLUR_VS, BLUR_FS, [\"uTexture\", \"uOffset\"]),\n      composite: this.createProgram(COMPOSITE_VS, colorHeader + COMPOSITE_FS, [\"uTexture\", \"uInverseSize\"]),\n    };\n    [this.programs.chip, this.programs.bright].forEach((entry) => {\n      gl.useProgram(entry.program);\n      gl.uniform1i(entry.uniforms.uShadowMap0, 1);\n      gl.uniform1i(entry.uniforms.uShadowMap1, 2);\n    });\n\n    const vertices = new Float32Array(SCENE.pos.length * 2);\n    for (let i = 0; i < SCENE.pos.length; i += 3) {\n      vertices.set(SCENE.pos.slice(i, i + 3), i * 2);\n      vertices.set(SCENE.nor.slice(i, i + 3), i * 2 + 3);\n    }\n    this.chipBuffers = { vertex: gl.createBuffer(), index: gl.createBuffer() };\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.chipBuffers.vertex);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.chipBuffers.index);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(SCENE.idx), gl.STATIC_DRAW);\n\n    this.quadBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n\n    this.bloomTargets = [this.createTarget(true, gl.LINEAR), this.createTarget(false, gl.LINEAR)];\n    this.shadowTargets = [this.createTarget(true, gl.NEAREST), this.createTarget(true, gl.NEAREST)];\n    this.shadowTargets.forEach((target) => this.sizeTarget(target, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE));\n    this.updateShadowMatrix(1, SPOT1_POSITION);\n    gl.enable(gl.CULL_FACE);\n    this.width = 0; // Forces the next resize to size the bloom targets.\n  }\n\n  // Shadow camera of a spot light: looks along the light axis, with world up.\n  updateShadowMatrix(index, position) {\n    const z = SPOT_AXES[index];\n    const length = Math.hypot(z[2], z[0]);\n    const x = [z[2] / length, 0, -z[0] / length];\n    const y = [z[1] * x[2], z[2] * x[0] - z[0] * x[2], -z[1] * x[0]];\n    const matrix = perspective(2 * SPOT_ANGLE, 1, SHADOW_NEAR, SPOT_RANGES[index]);\n    multiply(matrix, view(x, y, z, position), this.shadowMatrices, index * 16);\n  }\n\n  // ---------- Framing ----------\n\n  // World-space chip vertices at a few tween states. resize() projects these to\n  // find the ring's true on-screen extent, the same way the authored camera is\n  // framed in Spline, so the ring fills its container at any aspect ratio.\n  buildFitSamples() {\n    const points = [];\n    const models = new Float32Array(16 * CHIP_COUNT);\n    const normals = new Float32Array(9 * CHIP_COUNT);\n\n    FIT_SAMPLES.forEach((w) => {\n      this.writeChipMatrices(models, normals, w, 0);\n      for (let chip = 0; chip < CHIP_COUNT; chip++) {\n        const m = chip * 16;\n        for (let i = 0; i < SCENE.pos.length; i += 3) {\n          const x = SCENE.pos[i];\n          const y = SCENE.pos[i + 1];\n          const z = SCENE.pos[i + 2];\n          points.push(\n            models[m] * x + models[m + 4] * y + models[m + 8] * z + models[m + 12],\n            models[m + 1] * x + models[m + 5] * y + models[m + 9] * z + models[m + 13],\n            models[m + 2] * x + models[m + 6] * y + models[m + 10] * z + models[m + 14],\n          );\n        }\n      }\n    });\n\n    this.fitPoints = new Float32Array(points);\n  }\n\n  // Projected radius of the sample set, in \"half-height\" units: NDC runs -1..1\n  // on both axes, so scaling x by the aspect ratio makes a radius here match\n  // pixels on screen. `indices` limits the scan to the outermost candidates.\n  fitRadius(distance, aspect, indices) {\n    this.setCamera(distance, aspect);\n    const matrix = new Float32Array(16);\n    multiply(this.projection, this.cameraView, matrix, 0);\n    const points = this.fitPoints;\n    const count = indices ? indices.length : points.length / 3;\n    const radii = new Float64Array(count);\n\n    for (let n = 0; n < count; n++) {\n      const i = (indices ? indices[n] : n) * 3;\n      const x = points[i];\n      const y = points[i + 1];\n      const z = points[i + 2];\n      const w = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15];\n      const sx = (matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12]) / w;\n      const sy = (matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13]) / w;\n      radii[n] = Math.hypot(sx * aspect, sy);\n    }\n\n    let outer = 0;\n    for (let n = 0; n < count; n++) if (radii[n] > outer) outer = radii[n];\n    return { outer, radii };\n  }\n\n  // Distance at which the ring spans `fill` of the shorter side. The projected\n  // radius is very nearly inversely proportional to distance, so a couple of\n  // correction passes converge.\n  fitDistance(fill, aspect) {\n    let distance = this.cameraDistance;\n\n    // First pass over every sample; later passes only need the outermost ones,\n    // which a pure change of distance barely reorders.\n    const first = this.fitRadius(distance, aspect, null);\n    const order = Array.from(first.radii.keys())\n      .sort((a, b) => first.radii[b] - first.radii[a])\n      .slice(0, FIT_CANDIDATES);\n\n    // In these units the frame reaches 1 vertically but `aspect` horizontally,\n    // so the ring has to clear the smaller of the two or it overflows the\n    // narrow axis as it turns.\n    const limit = fill * Math.min(1, aspect);\n    let outer = first.outer;\n\n    for (let pass = 0; pass < FIT_PASSES; pass++) {\n      const correction = outer / limit;\n      if (Math.abs(correction - 1) < 0.002) break;\n      distance *= correction;\n      outer = this.fitRadius(distance, aspect, order).outer;\n    }\n\n    this.setCamera(distance, aspect);\n    return distance;\n  }\n\n  // Publish the ring's centre so the QUL lockup can sit on it. The authored\n  // camera aims at the origin, so the ring turns about this point on screen.\n  publishRingCentre() {\n    const m = this.viewProjection;\n    const w = m[15];\n    // Also kept in CSS pixels: the drag measures its angle around this point.\n    this.centre.x = ((m[12] / w) * 0.5 + 0.5) * this.canvas.clientWidth;\n    this.centre.y = ((-m[13] / w) * 0.5 + 0.5) * this.canvas.clientHeight;\n    if (!this.container) return;\n    const style = this.container.style;\n    style.setProperty(\"--qul-ring-cx\", `${this.centre.x.toFixed(1)}px`);\n    style.setProperty(\"--qul-ring-cy\", `${this.centre.y.toFixed(1)}px`);\n    this.container.dataset.qulRingReady = \"true\";\n  }\n\n  // ---------- Sizing ----------\n\n  resize() {\n    const cssWidth = this.canvas.clientWidth || 1;\n    const cssHeight = this.canvas.clientHeight || 1;\n    let ratio = Math.min(window.devicePixelRatio || 1, MAX_DEVICE_PIXEL_RATIO);\n    ratio = Math.min(ratio, Math.sqrt(MAX_PIXELS / (cssWidth * cssHeight)));\n    const w = Math.max(1, Math.round(cssWidth * ratio));\n    const h = Math.max(1, Math.round(cssHeight * ratio));\n    if (w === this.width && h === this.height) return false;\n\n    const gl = this.gl;\n    this.width = this.canvas.width = w;\n    this.height = this.canvas.height = h;\n    this.halfWidth = Math.max(1, w >> 1);\n    this.halfHeight = Math.max(1, h >> 1);\n    this.bloomTargets.forEach((target) => this.sizeTarget(target, this.halfWidth, this.halfHeight));\n\n    const aspect = w / h;\n    const fill = Math.min(cssWidth, cssHeight) < SMALL_CANVAS ? FILL_SMALL : FILL_LARGE;\n    // fitDistance leaves the camera at the distance it settled on.\n    this.fitDistance(fill, aspect);\n    this.updateView();\n    this.publishRingCentre();\n\n    // Screen rectangle that contains the bounding sphere. Bloom work stays inside it.\n    const m = this.viewProjection;\n    let x0 = 1, y0 = 1, x1 = -1, y1 = -1;\n    for (let i = 0; i < 8; i++) {\n      const x = i & 1 ? BOUNDING_RADIUS : -BOUNDING_RADIUS;\n      const y = i & 2 ? BOUNDING_RADIUS : -BOUNDING_RADIUS;\n      const z = i & 4 ? BOUNDING_RADIUS : -BOUNDING_RADIUS;\n      const clipW = m[3] * x + m[7] * y + m[11] * z + m[15];\n      const sx = (m[0] * x + m[4] * y + m[8] * z + m[12]) / clipW;\n      const sy = (m[1] * x + m[5] * y + m[9] * z + m[13]) / clipW;\n      x0 = Math.min(x0, sx); x1 = Math.max(x1, sx);\n      y0 = Math.min(y0, sy); y1 = Math.max(y1, sy);\n    }\n    const margin = 16;\n    const left = Math.max(0, Math.floor((x0 * 0.5 + 0.5) * this.width) - margin);\n    const bottom = Math.max(0, Math.floor((y0 * 0.5 + 0.5) * this.height) - margin);\n    const right = Math.min(this.width, Math.ceil((x1 * 0.5 + 0.5) * this.width) + margin);\n    const top = Math.min(this.height, Math.ceil((y1 * 0.5 + 0.5) * this.height) + margin);\n    this.scissor = [left, bottom, Math.max(0, right - left), Math.max(0, top - bottom)];\n    return true;\n  }\n\n  // ---------- Animation ----------\n\n  // View matrix for a camera at `distance` along the authored direction, and the\n  // matching projection. Near and far bracket the ring at whatever distance the\n  // fit lands on, so a wide or very short container cannot clip it.\n  setCamera(distance, aspect) {\n    const position = this.cameraDirection.map((value) => value * distance);\n    const [ax, ay, az] = this.cameraAxes;\n    this.cameraView = view(ax, ay, az, position);\n    this.projection = perspective(\n      FOV_Y, aspect,\n      Math.max(1, distance - 2 * BOUNDING_RADIUS),\n      distance + 4 * BOUNDING_RADIUS,\n    );\n    this.tiltedView = this.cameraView.slice();\n  }\n\n  // Leans the camera around the ring centre by the current tilt. It orbits the\n  // centre rather than panning, so the ring centre stays in the same place on\n  // screen: the bloom rectangle, the lockup position and the grab angle all\n  // stay valid while it leans.\n  updateView() {\n    const base = this.cameraView;\n    const tilted = this.tiltedView;\n    const ca = Math.cos(this.tilt.x), sa = Math.sin(this.tilt.x);\n    const cb = Math.cos(this.tilt.y), sb = Math.sin(this.tilt.y);\n    const r = [[cb, 0, sb], [sa * sb, ca, -sa * cb], [-ca * sb, sa, ca * cb]]; // rotateX * rotateY\n    for (let col = 0; col < 3; col++) {\n      for (let row = 0; row < 3; row++) {\n        tilted[col * 4 + row] = r[row][0] * base[col * 4] + r[row][1] * base[col * 4 + 1]\n          + r[row][2] * base[col * 4 + 2];\n      }\n    }\n    multiply(this.projection, tilted, this.viewProjection, 0);\n    for (let i = 0; i < 3; i++) {\n      this.cameraPosition[i] = -(tilted[i * 4] * tilted[12] + tilted[i * 4 + 1] * tilted[13]\n        + tilted[i * 4 + 2] * tilted[14]);\n    }\n  }\n\n  updateLight(time) {\n    const k = easeInOut(pingPong(time, LIGHT_TWEEN_SECONDS));\n    const intensity = LIGHT_FROM.intensity + (LIGHT_TO.intensity - LIGHT_FROM.intensity) * k;\n    for (let i = 0; i < 3; i++) {\n      this.spotPositions[i] = LIGHT_FROM.position[i] + (LIGHT_TO.position[i] - LIGHT_FROM.position[i]) * k;\n      this.spotColors[i] = (LIGHT_FROM.color[i] + (LIGHT_TO.color[i] - LIGHT_FROM.color[i]) * k) * intensity;\n    }\n    this.updateShadowMatrix(0, this.spotPositions);\n  }\n\n  // The ring's orientation turned by `spin` about its own axis (local Y, the\n  // axis the chips are arranged around). Post-multiplying rather than nudging\n  // each chip's angle keeps the assembly rigid: the chips carry their own tilt\n  // and spacing around with them, so it reads as the whole ring turning.\n  spinRing(spin) {\n    const ring = this.ring;\n    const out = this.ringSpun;\n    if (!spin) return ring;\n    const cs = Math.cos(spin), ss = Math.sin(spin);\n    for (let row = 0; row < 3; row++) {\n      const c0 = ring[row];\n      const c2 = ring[8 + row];\n      out[row] = c0 * cs - c2 * ss;\n      out[4 + row] = ring[4 + row];\n      out[8 + row] = c0 * ss + c2 * cs;\n    }\n    return out;\n  }\n\n  // Cloner state at tween progress `w` (0 to 1), with `time` driving the slow\n  // noise drift. Pulled out of updateChips so buildFitSamples can reuse it.\n  writeChipMatrices(models, normals, w, time) {\n    const ring = this.spinRing(this.spin);\n    const radius = 143 + 7 * w;\n    // Writes ring * (x, y, z) into out at the given offset.\n    const transform = (out, offset, x, y, z) => {\n      out[offset] = ring[0] * x + ring[4] * y + ring[8] * z;\n      out[offset + 1] = ring[1] * x + ring[5] * y + ring[9] * z;\n      out[offset + 2] = ring[2] * x + ring[6] * y + ring[10] * z;\n    };\n\n    for (let i = 0; i < CHIP_COUNT; i++) {\n      const noise = CHIP_NOISE[i] + NOISE_DRIFT * Math.sin(NOISE_DRIFT_SPEED * time + i * 1.7);\n      const amount = w * noise;\n      // Chip rotation = rotateY(alignment + tilt) * rotateZ(spin).\n      const alpha = ((10 - i * 22.5) * Math.PI) / 180 + 0.4363 * amount;\n      const beta = 62.832 * amount;\n      const cA = Math.cos(alpha), sA = Math.sin(alpha), cB = Math.cos(beta), sB = Math.sin(beta);\n      const scaleX = 1.1 + 0.96 * amount;\n      const scaleY = 1 + 0.2 * amount;\n      const angle = (i * Math.PI) / 8;\n      const m = i * 16, n = i * 9;\n      transform(models, m, cA * cB * scaleX, sB * scaleX, -sA * cB * scaleX);\n      transform(models, m + 4, -cA * sB * scaleY, cB * scaleY, sA * sB * scaleY);\n      transform(models, m + 8, sA, 0, cA);\n      transform(models, m + 12, radius * Math.cos(angle), 0, radius * Math.sin(angle));\n      models[m + 3] = models[m + 7] = models[m + 11] = 0;\n      models[m + 15] = 1;\n      transform(normals, n, (cA * cB) / scaleX, sB / scaleX, (-sA * cB) / scaleX);\n      transform(normals, n + 3, (-cA * sB) / scaleY, cB / scaleY, (sA * sB) / scaleY);\n      transform(normals, n + 6, sA, 0, cA);\n    }\n  }\n\n  updateChips(time) {\n    // Tween progress, 0 to 1 and back.\n    this.writeChipMatrices(this.models, this.normals, pingPong(time, CHIP_TWEEN_SECONDS), time);\n  }\n\n  // ---------- Rendering ----------\n\n  drawChips(entry, matrix) {\n    const gl = this.gl;\n    gl.useProgram(entry.program);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.chipBuffers.vertex);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.chipBuffers.index);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 24, 0);\n    gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 24, 12);\n    gl.uniformMatrix4fv(entry.uniforms.uViewProjection, false, matrix);\n    gl.enable(gl.DEPTH_TEST);\n    for (let i = 0; i < CHIP_COUNT; i++) {\n      gl.uniformMatrix4fv(entry.uniforms.uModel, false, this.models.subarray(i * 16, i * 16 + 16));\n      if (entry.uniforms.uNormalMatrix) {\n        gl.uniformMatrix3fv(entry.uniforms.uNormalMatrix, false, this.normals.subarray(i * 9, i * 9 + 9));\n      }\n      gl.drawElements(gl.TRIANGLES, SCENE.idx.length, gl.UNSIGNED_SHORT, 0);\n    }\n    gl.disable(gl.DEPTH_TEST);\n    gl.disableVertexAttribArray(1);\n  }\n\n  drawLitChips(entry) {\n    const gl = this.gl;\n    gl.useProgram(entry.program);\n    gl.uniform3fv(entry.uniforms.uSpotPosition, this.spotPositions);\n    gl.uniform3fv(entry.uniforms.uSpotColor, this.spotColors);\n    gl.uniform3fv(entry.uniforms.uCameraPosition, this.cameraPosition);\n    gl.uniformMatrix4fv(entry.uniforms.uShadowMatrix, false, this.shadowMatrices);\n    this.drawChips(entry, this.viewProjection);\n  }\n\n  useQuad(entry) {\n    const gl = this.gl;\n    gl.useProgram(entry.program);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(entry.uniforms.uTexture, 0);\n  }\n\n  render() {\n    const gl = this.gl;\n    const scissor = this.scissor;\n    gl.enableVertexAttribArray(0);\n\n    // Shadow maps. Back faces are drawn, as three.js does, to reduce self-shadowing.\n    gl.viewport(0, 0, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE);\n    gl.clearColor(1, 1, 1, 1);\n    gl.cullFace(gl.FRONT);\n    this.shadowTargets.forEach((target, index) => {\n      gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n      gl.useProgram(this.programs.shadow.program);\n      gl.uniform3fv(this.programs.shadow.uniforms.uLightPosition, this.spotPositions.subarray(index * 3, index * 3 + 3));\n      gl.uniform1f(this.programs.shadow.uniforms.uInverseRange, 1 / SPOT_RANGES[index]);\n      this.drawChips(this.programs.shadow, this.shadowMatrices.subarray(index * 16, index * 16 + 16));\n    });\n    gl.cullFace(gl.BACK);\n    this.shadowTargets.forEach((target, index) => {\n      gl.activeTexture(gl.TEXTURE1 + index);\n      gl.bindTexture(gl.TEXTURE_2D, target.texture);\n    });\n    gl.activeTexture(gl.TEXTURE0);\n\n    gl.viewport(0, 0, this.halfWidth, this.halfHeight);\n    gl.enable(gl.SCISSOR_TEST);\n    gl.scissor(scissor[0] >> 1, scissor[1] >> 1, (scissor[2] >> 1) + 2, (scissor[3] >> 1) + 2);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.bloomTargets[0].framebuffer);\n    gl.clearColor(0, 0, 0, 1);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    this.drawLitChips(this.programs.bright);\n\n    this.useQuad(this.programs.blur);\n    BLOOM_KERNEL.forEach((kernel, pass) => {\n      const offset = (kernel + 0.5) * BLOOM_BLUR_SCALE;\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.bloomTargets[(pass + 1) % 2].framebuffer);\n      gl.bindTexture(gl.TEXTURE_2D, this.bloomTargets[pass % 2].texture);\n      gl.uniform2f(this.programs.blur.uniforms.uOffset, offset / this.halfWidth, offset / this.halfHeight);\n      gl.drawArrays(gl.TRIANGLES, 0, 3);\n    });\n    gl.disable(gl.SCISSOR_TEST);\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.viewport(0, 0, this.width, this.height);\n    gl.clearColor(BACKGROUND[0], BACKGROUND[1], BACKGROUND[2], 1);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    this.drawLitChips(this.programs.chip);\n\n    this.useQuad(this.programs.composite);\n    gl.bindTexture(gl.TEXTURE_2D, this.bloomTargets[BLOOM_KERNEL.length % 2].texture);\n    gl.uniform2f(this.programs.composite.uniforms.uInverseSize, 1 / this.width, 1 / this.height);\n    gl.enable(gl.SCISSOR_TEST);\n    gl.scissor(scissor[0], scissor[1], scissor[2], scissor[3]);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR);\n    gl.drawArrays(gl.TRIANGLES, 0, 3);\n    gl.disable(gl.BLEND);\n    gl.disable(gl.SCISSOR_TEST);\n  }\n\n  draw() {\n    this.updateView();\n    this.updateChips(this.time);\n    this.updateLight(this.time);\n    this.render();\n    this.hasRendered = true;\n  }\n\n  // ---------- Loop ----------\n\n  loop(now) {\n    if (!this.running || this.disposed) return;\n    this.frameId = requestAnimationFrame((next) => this.loop(next));\n\n    const elapsed = now - this.lastFrame;\n    if (elapsed < MIN_FRAME_MS) return;\n    this.lastFrame = now;\n    if (elapsed < 250) this.time += elapsed / 1000; // Longer gaps mean the page was paused.\n\n    const ease = 1 - Math.pow(1 - TILT_EASE, Math.min(elapsed, 250) / (1000 / 60));\n    this.tilt.x += (this.tilt.targetX - this.tilt.x) * ease;\n    this.tilt.y += (this.tilt.targetY - this.tilt.y) * ease;\n\n    // Let go and the throw carries, then springs back to the authored angle.\n    if (!this.drag.active && (this.spin || this.spinVelocity)) {\n      this.stepSpin(elapsed / 1000);\n    }\n\n    this.draw();\n  }\n\n  start() {\n    if (this.running || this.disposed || this.contextLost) return;\n    this.running = true;\n    this.lastFrame = performance.now();\n    this.frameId = requestAnimationFrame((now) => this.loop(now));\n  }\n\n  stop() {\n    this.running = false;\n    if (this.frameId) {\n      cancelAnimationFrame(this.frameId);\n      this.frameId = 0;\n    }\n  }\n\n  // Draw a single frame \u2014 used when motion is disabled (prefers-reduced-motion)\n  // so the ring still shows, just static. Start partway through the chip tween\n  // so the still frame shows the chips fanned out rather than edge-on.\n  renderStill() {\n    if (this.disposed || this.contextLost) return;\n    if (!this.hasRendered) this.time = 0.35 * CHIP_TWEEN_SECONDS;\n    this.draw();\n  }\n\n  // Resizing clears the canvas, so draw at once. Otherwise the empty canvas\n  // shows until the next frame.\n  handleResize() {\n    if (this.disposed || this.contextLost) return;\n    const changed = this.resize();\n    if (changed || !this.running) this.draw();\n  }\n\n  updateTiltTarget(event) {\n    const rect = this.canvas.getBoundingClientRect();\n    if (rect.width === 0 || rect.height === 0) return;\n    const nx = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n    const ny = ((event.clientY - rect.top) / rect.height) * 2 - 1;\n    this.tilt.targetY = Math.max(-1, Math.min(1, nx)) * TILT_MAX;\n    this.tilt.targetX = Math.max(-1, Math.min(1, ny)) * TILT_MAX;\n  }\n\n  // Pointer angle around the ring centre, and how far out it is. Returns null\n  // when the pointer sits on the hub, where the angle swings wildly for very\n  // little travel.\n  grabAngle(event) {\n    const rect = this.canvas.getBoundingClientRect();\n    if (rect.width === 0 || rect.height === 0) return null;\n    const dx = event.clientX - rect.left - this.centre.x;\n    const dy = event.clientY - rect.top - this.centre.y;\n    if (Math.hypot(dx, dy) < GRAB_MIN_RADIUS) return null;\n    return Math.atan2(dy, dx);\n  }\n\n  handlePointerDown(event) {\n    if (event.button !== 0 || this.disposed || this.contextLost) return;\n    const angle = this.grabAngle(event);\n    if (angle === null) return;\n\n    this.drag.active = true;\n    this.drag.pointerId = event.pointerId;\n    this.drag.angle = angle;\n    this.drag.time = event.timeStamp || performance.now();\n    this.spinVelocity = 0; // Grabbing a moving wheel stops it dead.\n    this.canvas.style.cursor = \"grabbing\";\n    // Capture keeps the drag alive past the canvas edge. It throws if the\n    // pointer is already gone, which is harmless here.\n    try {\n      this.canvas.setPointerCapture(event.pointerId);\n    } catch (error) { /* not capturable */ }\n  }\n\n  handlePointerUp(event) {\n    if (!this.drag.active || event.pointerId !== this.drag.pointerId) return;\n    this.drag.active = false;\n    this.drag.pointerId = null;\n    this.canvas.style.cursor = \"grab\";\n    // A running loop carries the throw and springs the ring home. With motion\n    // off there is no loop, and starting one would override the reader's\n    // preference, so the ring returns to the authored angle in one step.\n    if (!this.running && !this.disposed && !this.contextLost) {\n      this.spin = 0;\n      this.spinVelocity = 0;\n      this.draw();\n    }\n  }\n\n  // Two separate things: the scene leans toward the pointer as it moves over\n  // the ring, and \u2014 only while held \u2014 the ring itself follows the pointer's\n  // swing one-to-one in whichever direction it travels.\n  handlePointerMove(event) {\n    if (event.pointerType !== \"touch\") this.updateTiltTarget(event);\n    if (!this.drag.active || event.pointerId !== this.drag.pointerId) return;\n\n    const angle = this.grabAngle(event);\n    if (angle === null) return;\n\n    // Shortest way round, so crossing the -pi/+pi seam does not snap the ring.\n    const delta = Math.atan2(Math.sin(angle - this.drag.angle), Math.cos(angle - this.drag.angle));\n    const now = event.timeStamp || performance.now();\n    const dt = (now - this.drag.time) / 1000;\n\n    this.spin = Math.max(-SPIN_MAX, Math.min(SPIN_MAX, this.spin + delta * SPIN_SIGN));\n    if (dt > 0.004) {\n      const velocity = (delta * SPIN_SIGN) / dt;\n      this.spinVelocity = Math.max(-SPIN_MAX_VELOCITY, Math.min(SPIN_MAX_VELOCITY, velocity));\n      this.drag.time = now;\n    }\n    this.drag.angle = angle;\n\n    // Reduced motion leaves the loop stopped, so paint the drag directly.\n    if (!this.running) this.draw();\n  }\n\n  // Spring-damper back to the authored angle, carrying whatever velocity the\n  // release left behind. Integrated at a fixed step so a long frame (a tab\n  // coming back to the foreground) cannot make it explode.\n  stepSpin(dt) {\n    let remaining = Math.min(dt, 0.25);\n    while (remaining > 0) {\n      const h = Math.min(SPIN_STEP, remaining);\n      remaining -= h;\n      this.spinVelocity += (-SPIN_STIFFNESS * this.spin - SPIN_DAMPING * this.spinVelocity) * h;\n      this.spin += this.spinVelocity * h;\n    }\n    if (Math.abs(this.spin) < 1e-4 && Math.abs(this.spinVelocity) < 1e-3) {\n      this.spin = 0;\n      this.spinVelocity = 0;\n    }\n  }\n\n  dispose() {\n    if (this.disposed) return;\n    this.stop();\n    this.disposed = true;\n\n    window.removeEventListener(\"resize\", this.boundResize);\n    window.removeEventListener(\"pointermove\", this.boundPointerMove);\n    document.removeEventListener(\"mouseout\", this.boundMouseOut);\n    this.canvas.removeEventListener(\"pointerdown\", this.boundPointerDown);\n    this.canvas.removeEventListener(\"pointerup\", this.boundPointerUp);\n    this.canvas.removeEventListener(\"pointercancel\", this.boundPointerUp);\n    this.canvas.style.cursor = \"\";\n    this.canvas.style.touchAction = \"\";\n    this.canvas.removeEventListener(\"webglcontextlost\", this.boundContextLost);\n    this.canvas.removeEventListener(\"webglcontextrestored\", this.boundContextRestored);\n    if (this.resizeObserver) this.resizeObserver.disconnect();\n\n    const gl = this.gl;\n    if (this.programs) {\n      Object.values(this.programs).forEach((entry) => gl.deleteProgram(entry.program));\n    }\n    if (this.chipBuffers) {\n      gl.deleteBuffer(this.chipBuffers.vertex);\n      gl.deleteBuffer(this.chipBuffers.index);\n    }\n    if (this.quadBuffer) gl.deleteBuffer(this.quadBuffer);\n    [].concat(this.bloomTargets || [], this.shadowTargets || []).forEach((target) => {\n      gl.deleteTexture(target.texture);\n      gl.deleteFramebuffer(target.framebuffer);\n      if (target.depth) gl.deleteRenderbuffer(target.depth);\n    });\n\n    // The context itself is deliberately left alive. A canvas only ever hands\n    // out one WebGL context, so losing it here would leave the canvas dead for\n    // the remount that Turbo does on every visit (before-cache then load).\n  }\n}\n", "// Entry point for the animated shard ring\nimport ShardRing from \"./renderer\";\n\nconst MOUNTED = new WeakMap();\n\nfunction supportsWebGL() {\n  try {\n    const canvas = document.createElement(\"canvas\");\n    return !!(window.WebGLRenderingContext && (canvas.getContext(\"webgl2\") || canvas.getContext(\"webgl\")));\n  } catch (error) {\n    return false;\n  }\n}\n\nfunction prefersReducedMotion() {\n  return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction showFallback(root) {\n  const fallback = root.querySelector(\"[data-qul-shards-fallback]\");\n  const canvas = root.querySelector(\"canvas\");\n  if (fallback) fallback.classList.remove(\"hidden\");\n  if (canvas) canvas.classList.add(\"hidden\");\n}\n\nfunction mount(root) {\n  if (MOUNTED.has(root)) return;\n\n  const canvas = root.querySelector(\"canvas\");\n  if (!canvas) return;\n\n  if (!supportsWebGL()) {\n    showFallback(root);\n    return;\n  }\n\n  // Unhide before constructing: the renderer sizes itself from the canvas's\n  // client box, which is 0 while `hidden` applies `display: none`.\n  canvas.classList.remove(\"hidden\");\n\n  let ring;\n  try {\n    ring = new ShardRing(canvas, root);\n  } catch (error) {\n    // A lost/blocked WebGL context shouldn't take the page down with it.\n    console.error(\"[shards] failed to initialise\", error);\n    showFallback(root);\n    return;\n  }\n\n  const still = prefersReducedMotion();\n  const state = { ring, observer: null, onVisibility: null, still };\n  MOUNTED.set(root, state);\n\n  const resume = () => {\n    if (state.still) {\n      ring.renderStill();\n    } else if (!document.hidden) {\n      ring.start();\n    }\n  };\n\n  // Only burn GPU while the ring is actually on screen and the tab is visible.\n  if (\"IntersectionObserver\" in window) {\n    state.observer = new IntersectionObserver(\n      (entries) => {\n        const visible = entries.some((entry) => entry.isIntersecting);\n        state.visible = visible;\n        if (visible) resume();\n        else ring.stop();\n      },\n      { threshold: 0.05 },\n    );\n    state.observer.observe(root);\n  } else {\n    state.visible = true;\n    resume();\n  }\n\n  state.onVisibility = () => {\n    if (document.hidden) ring.stop();\n    else if (state.visible !== false) resume();\n  };\n  document.addEventListener(\"visibilitychange\", state.onVisibility);\n}\n\nfunction unmount(root) {\n  const state = MOUNTED.get(root);\n  if (!state) return;\n\n  if (state.observer) state.observer.disconnect();\n  if (state.onVisibility) document.removeEventListener(\"visibilitychange\", state.onVisibility);\n  state.ring.dispose();\n  MOUNTED.delete(root);\n}\n\nfunction mountAll() {\n  document.querySelectorAll(\"[data-qul-shards]\").forEach(mount);\n}\n\nfunction unmountAll() {\n  document.querySelectorAll(\"[data-qul-shards]\").forEach(unmount);\n}\n\n// Turbo re-executes body scripts on every visit, so only wire the document\n// listeners once; subsequent executions just mount whatever is on the new page.\nif (!window.__qulShardsInstalled) {\n  window.__qulShardsInstalled = true;\n  document.addEventListener(\"turbo:load\", mountAll);\n  // Tear the WebGL context down before Turbo caches the page; turbo:load remounts.\n  document.addEventListener(\"turbo:before-cache\", unmountAll);\n}\n\nif (document.readyState === \"loading\") {\n  document.addEventListener(\"DOMContentLoaded\", mountAll, { once: true });\n} else {\n  mountAll();\n}\n"],
  "mappings": ";;AAGO,MAAM,cAAc,EAAC,OAAM,CAAC,IAAG,GAAE,KAAI,IAAG,GAAE,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,MAAK,KAAI,QAAO,MAAK,KAAI,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,OAAM,KAAI,QAAO,OAAM,KAAI,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,MAAK,OAAM,KAAI,MAAK,OAAM,KAAI,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,OAAM,QAAO,KAAI,OAAM,QAAO,KAAI,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,QAAO,OAAM,KAAI,QAAO,OAAM,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,SAAQ,OAAM,KAAI,SAAQ,OAAM,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,OAAM,KAAI,SAAQ,OAAM,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,IAAG,GAAE,SAAQ,IAAG,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,SAAQ,OAAM,KAAI,SAAQ,OAAM,KAAI,SAAQ,OAAM,GAAE,SAAQ,OAAM,GAAE,SAAQ,GAAE,KAAI,SAAQ,GAAE,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,OAAM,GAAE,SAAQ,OAAM,GAAE,SAAQ,QAAO,KAAI,SAAQ,QAAO,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,KAAI,SAAQ,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,OAAM,SAAQ,KAAI,OAAM,SAAQ,KAAI,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,OAAM,SAAQ,KAAI,OAAM,SAAQ,KAAI,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,OAAM,SAAQ,KAAI,OAAM,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,KAAI,QAAO,SAAQ,KAAI,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,KAAI,QAAO,QAAO,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,IAAG,GAAE,KAAI,IAAG,GAAE,KAAI,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,OAAM,QAAO,GAAE,OAAM,QAAO,GAAE,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,IAAG,GAAE,SAAQ,IAAG,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,SAAQ,OAAM,GAAE,SAAQ,OAAM,GAAE,SAAQ,OAAM,GAAE,SAAQ,OAAM,GAAE,SAAQ,QAAO,GAAE,SAAQ,QAAO,CAAC,GAAE,OAAM,CAAC,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,OAAM,GAAE,QAAO,OAAM,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,MAAK,GAAE,SAAQ,MAAK,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,QAAO,GAAE,SAAQ,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,SAAQ,SAAQ,GAAE,SAAQ,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,MAAK,SAAQ,GAAE,MAAK,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,OAAM,SAAQ,GAAE,OAAM,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,SAAQ,GAAE,QAAO,SAAQ,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,QAAO,QAAO,GAAE,QAAO,QAAO,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,OAAM,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,OAAM,CAAC,SAAQ,GAAE,UAAS,GAAE,WAAU,SAAQ,WAAU,GAAE,UAAS,UAAS,UAAS,GAAE,YAAW,YAAW,YAAW,CAAC,GAAE,UAAS,CAAC,WAAU,UAA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",
  "names": ["t"]
}
