cubing 0.65.1 → 0.65.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/chunks/{chunk-PDPPBQ4O.js → chunk-Z5QOJAME.js} +2 -2
- package/dist/bin/order.js +1 -1
- package/dist/bin/puzzle-geometry-bin.js +1 -1
- package/dist/bin/scramble.js +1 -1
- package/dist/bin/svg.js +1 -1
- package/dist/lib/cubing/alg/index.d.ts +2 -2
- package/dist/lib/cubing/alg/index.js +1 -1
- package/dist/lib/cubing/bluetooth/index.d.ts +12 -13
- package/dist/lib/cubing/bluetooth/index.js +5 -5
- package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js → big-puzzle-orientation-7WHPJCCO.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-4ADGSRLK.js → chunk-2BVL5OQE.js} +5 -5
- package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js → chunk-2IA2R7XV.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js → chunk-5FXQPBXH.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js → chunk-6K433TB5.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js → chunk-BQPY6252.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js → chunk-IRY6MBI2.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-DT3GVMDI.js → chunk-MFKLAFPQ.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js → chunk-MIHF623Z.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-YFNXHRNE.js → chunk-UP5VP7GL.js} +60 -7
- package/dist/lib/cubing/chunks/chunk-UP5VP7GL.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js → chunk-YSAQ6DRT.js} +2 -2
- package/dist/lib/cubing/chunks/{inside-IHWUJJ56.js → inside-N5WSMI7I.js} +14 -14
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js → search-dynamic-sgs-side-events-5EIXNDVI.js} +6 -6
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-OLK64DE6.js → search-dynamic-sgs-unofficial-Y7SIOVIX.js} +6 -6
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-Y7SIOVIX.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-2A2XBBWI.js → search-dynamic-solve-4x4x4-FRAX3IPQ.js} +7 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-FRAX3IPQ.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-ZZKLTONP.js → search-dynamic-solve-fto-TI4TFL6X.js} +2 -2
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-TI4TFL6X.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-PUF4PRHS.js → search-dynamic-solve-kilominx-UKFT6I42.js} +2 -2
- package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-UKFT6I42.js.map +7 -0
- package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
- package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js → twips-UCWWA2WI.js} +2 -2
- package/dist/lib/cubing/chunks/{twisty-dynamic-3d-A2G22YLA.js → twisty-dynamic-3d-O5TGOSAO.js} +105 -90
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-O5TGOSAO.js.map +7 -0
- package/dist/lib/cubing/{index-DVoQwgPC.d.ts → index-BQdS3h4z.d.ts} +42 -38
- package/dist/lib/cubing/{index-DO__MgsX.d.ts → index-COSxNAgV.d.ts} +1 -2
- package/dist/lib/cubing/kpuzzle/index.d.ts +2 -2
- package/dist/lib/cubing/kpuzzle/index.js +2 -2
- package/dist/lib/cubing/notation/index.d.ts +1 -2
- package/dist/lib/cubing/notation/index.js +4 -4
- package/dist/lib/cubing/{outside-D6O0WicV.d.ts → outside-BRtF0DA2.d.ts} +2 -1
- package/dist/lib/cubing/protocol/index.d.ts +1 -2
- package/dist/lib/cubing/protocol/index.js +4 -4
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -2
- package/dist/lib/cubing/puzzle-geometry/index.js +1 -1
- package/dist/lib/cubing/puzzles/index.d.ts +2 -2
- package/dist/lib/cubing/puzzles/index.js +4 -4
- package/dist/lib/cubing/scramble/index.d.ts +1 -1
- package/dist/lib/cubing/scramble/index.js +6 -6
- package/dist/lib/cubing/search/index.d.ts +3 -4
- package/dist/lib/cubing/search/index.js +6 -6
- package/dist/lib/cubing/stream/index.d.ts +2 -2
- package/dist/lib/cubing/stream/index.js +1 -1
- package/dist/lib/cubing/twisty/index.d.ts +2 -2
- package/dist/lib/cubing/twisty/index.js +6 -6
- package/package.json +10 -9
- package/dist/lib/cubing/chunks/chunk-YFNXHRNE.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-OLK64DE6.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-2A2XBBWI.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-ZZKLTONP.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-PUF4PRHS.js.map +0 -7
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-A2G22YLA.js.map +0 -7
- /package/dist/bin/chunks/{chunk-PDPPBQ4O.js.map → chunk-Z5QOJAME.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js.map → big-puzzle-orientation-7WHPJCCO.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-4ADGSRLK.js.map → chunk-2BVL5OQE.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js.map → chunk-2IA2R7XV.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js.map → chunk-5FXQPBXH.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js.map → chunk-6K433TB5.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js.map → chunk-BQPY6252.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js.map → chunk-IRY6MBI2.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-DT3GVMDI.js.map → chunk-MFKLAFPQ.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js.map → chunk-MIHF623Z.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js.map → chunk-YSAQ6DRT.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{inside-IHWUJJ56.js.map → inside-N5WSMI7I.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js.map → search-dynamic-sgs-side-events-5EIXNDVI.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js.map → twips-UCWWA2WI.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/vendor/mpl/xyzzy/kilosolver.js"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\n/* kilosolver.js - A kilominx solver\nversion 0.7 (2021-04-03)\nCopyright (c) 2016, 2020, 2021\n\nFrom https://torchlight.github.io/kiloscrambler.html\nOriginally MIT licensed, added to `cubing.js` under the GPL license by permission from the author (@torchlight/xyzzy).\n\nThis is a port of the kilominx solver originally written in Python with a few minor optimisations.\n\nHow to run this:\n(0) Save this file somewhere.\n(1) Install any JavaScript shell and run it with this file.\n(2) Type stuff into the shell.\n\n(or just use the HTML interface! it exists now!)\n\nThere is currently not much of a public interface. Useful stuff:\ncache_all_tables()\n to generate all the lookup tables\nprint_move_sequence(generate_random_state_scramble())\n to get a random-state scramble\nprint_move_sequence(generate_hybrid_scramble())\n to get a hybrid random-move scramble\n\nFor the full solver (used in the random-state scrambler), a few hundred megabytes of RAM may be used\nfor the lookup tables, which will also take roughly a minute to generate. Once generated, each solve\ntakes roughly 0.08 second.\n\nThe hybrid scrambler uses much smaller lookup tables that take less memory and are generated faster,\nbut produces somewhat longer scramble sequences and isn't fully random-state. It should nevertheless\nbe good enough for non-competition purposes.\n\nOn the to-do list:\n- optimise the heck out of the lookup table generation\n- a GUI for the solver\n- optimise the solver with colour neutrality and NISS(tm) techniques\n- throw all the global variables into a namespace\n\nCompatibility notes:\nThis code makes fairly heavy use of ES6 syntactic sugar because writing code in JavaScript's already\nan exercise in masochism and I'm not going to make my life harder by restricting myself to ES5. Some\nof the features used are:\n- let, const\n- destructuring assignment\n- for-of\n- arrow functions\n- 'use strict'\n\nAny web browser from 2016 or later should support all of these; the code has been tested only on the\nlatest versions of Firefox and Chrome, as well as a somewhat outdated SpiderMonkey shell, but should\nalso work with recent versions of Edge, Safari, etc.\n*/\n\n\"use strict\";\n\nimport { Alg } from \"../../../alg\";\nimport { randomUIntBelow } from \"random-uint-below\";\n\nlet PHASE4_THRESHOLD = 7;\n// change this to 8 to make the individual solves faster, at the cost of slower initialisation\n\nfunction counter(A) {\n let counts = [];\n for (let a of A) {\n counts[a] = (counts[a] || 0) + 1;\n }\n return counts;\n}\n\n/* Combinatoric functions */\n\nfunction factorial(n) {\n if (n < 2) {\n return n;\n }\n let f = 1;\n for (let i = 2; i <= n; i++) {\n f *= i;\n }\n return f;\n}\n\nfunction C(n, k) {\n if (k < 0 || k > n) {\n return 0;\n }\n if (k === 0 || k === n) {\n return 1;\n }\n let c = 1;\n for (let i = 0; i < k; i++) {\n c = ((c * (n - i)) / (i + 1)) | 0;\n }\n return c;\n}\n\nfunction permutation_to_index(perm) {\n perm = perm.slice();\n let n = perm.length;\n let f = factorial(n - 1);\n let ind = 0;\n while (n > 1) {\n n--;\n // invariant: f === factorial(n)\n // also, perm stores meaningful values up to perm[n]\n let e = perm[0];\n ind += e * f;\n for (let i = 0; i < n; i++) {\n let x = perm[i + 1];\n perm[i] = x - (x > e);\n }\n f /= n;\n }\n return ind;\n}\n\nfunction index_to_permutation(ind, n) {\n let perm = [];\n let f = factorial(n - 1);\n for (let i = 0; i < n; i++) {\n perm[i] = (ind / f) | 0;\n ind %= f;\n f /= n - 1 - i;\n }\n for (let i = n - 2; i >= 0; i--) {\n for (let j = i + 1; j < n; j++) {\n perm[j] += +(perm[j] >= perm[i]);\n }\n }\n return perm;\n}\n\nfunction permutation_parity(A) {\n let n = A.length;\n let parity = 0;\n for (let i = 0; i < n - 1; i++) {\n for (let j = i; j < n; j++) {\n if (A[i] > A[j]) {\n parity ^= 1;\n }\n }\n }\n return parity;\n}\n\nfunction index_to_evenpermutation(ind, n) {\n let perm = [];\n let f = factorial(n - 1) / 2;\n let parity = 0;\n for (let i = 0; i < n - 1; i++) {\n perm[i] = (ind / f) | 0;\n ind %= f;\n f /= n - 1 - i;\n }\n perm[n - 1] = 0;\n for (let i = n - 2; i >= 0; i--) {\n for (let j = i + 1; j < n; j++) {\n if (perm[j] >= perm[i]) {\n perm[j]++;\n } else {\n parity ^= 1;\n }\n }\n }\n if (parity === 1) {\n [perm[n - 2], perm[n - 1]] = [perm[n - 1], perm[n - 2]];\n }\n return perm;\n}\n\nfunction evenpermutation_to_index(perm) {\n return permutation_to_index(perm) >> 1;\n}\n\nlet [evenpermutation10_to_index, index_to_evenpermutation10] = (() => {\n let index_in_set_bits = new Int8Array(1024 * 10);\n let look_up_set_bits = new Int8Array(1024 * 10);\n for (let i = 0; i < 1024; i++) {\n for (let j = 0, counter = 0; j < 10; j++) {\n if (((i >>> j) & 1) === 0) {\n continue;\n }\n index_in_set_bits[(j << 10) | i] = counter;\n look_up_set_bits[(counter << 10) | i] = j;\n counter++;\n }\n }\n\n function evenpermutation10_to_index(perm) {\n let unused = 0x3ff; // track which values in 0..9 haven't been used so far\n let f = 181440; // = 9!/2\n let ind = 0;\n for (let i = 0; i < 8; i++) {\n let v = perm[i];\n ind += index_in_set_bits[unused | (v << 10)] * f;\n unused &= ~(1 << v);\n f /= 9 - i;\n }\n return ind;\n }\n\n // note: this is *not* a drop-in replacement for index_to_evenpermutation!\n function index_to_evenpermutation10(ind, perm) {\n let unused = 0x3ff;\n let f = 181440; // = 9!/2\n let parity = 0;\n for (let i = 0; i < 8; i++) {\n let a = (ind / f) | 0;\n ind -= a * f;\n parity ^= a & 1;\n let v = look_up_set_bits[unused | (a << 10)];\n perm[i] = v;\n unused &= ~(1 << v);\n f /= 9 - i;\n }\n // the last two elements are uniquely determined by the other ten\n perm[8] = look_up_set_bits[unused | (parity << 10)];\n perm[9] = look_up_set_bits[unused | ((parity ^ 1) << 10)];\n return perm;\n }\n\n return [evenpermutation10_to_index, index_to_evenpermutation10];\n})();\n\nfunction comb_to_index(l) {\n let bits = l.length;\n let ones = 0;\n for (let i = 0; i < bits; i++) {\n ones += +(l[i] === 1);\n }\n let zeros = bits - ones;\n if (zeros === 0 || ones === 0 || bits === 1) {\n return 0;\n }\n let b = C(bits - 1, ones);\n let ind = 0;\n for (let i = 0; zeros > 0 && ones > 0 && bits > 1; i++) {\n bits--;\n if (l[i] === 0) {\n b = (b * --zeros) / bits;\n } else {\n // l[i] === 1\n ind += b;\n b = (b * ones--) / bits;\n }\n }\n return ind;\n}\n\nfunction index_to_comb(ind, ones, bits) {\n let zeros = bits - ones;\n let b = C(bits - 1, ones);\n let l = [];\n let n = bits - 1;\n for (let i = 0; i < n; i++) {\n bits--;\n if (ind < b) {\n l.push(0);\n b = (b * --zeros) / bits;\n } else {\n l.push(1);\n ind -= b;\n b = (b * ones--) / bits;\n }\n }\n l.push(ones);\n return l;\n}\n\nfunction compose(A, B) {\n let C = [];\n for (let i = 0; i < B.length; i++) {\n C[i] = A[B[i]];\n }\n return C;\n}\n\nfunction compose_o(A, B) {\n // note: we hardcode the modulus to 3 here, because ~optimisations~\n // (unnecessary abstraction is bad, actually)\n let p = compose(A[0], B[0]);\n let o = [];\n let n = B[0].length;\n for (let i = 0; i < n; i++) {\n o[i] = (A[1][B[0][i]] + B[1][i]) % 3;\n }\n return [p, o];\n}\n\nfunction permutation_from_cycle(cycle, n) {\n let perm = [];\n for (let i = 0; i < n; i++) {\n perm[i] = i;\n }\n for (let i = 0; i < cycle.length; i++) {\n perm[cycle[i]] = cycle[(i + 1) % cycle.length];\n }\n return perm;\n}\n\nfunction unsparsify_list(d, n) {\n let l = Array(n).fill(0);\n for (let k in d) {\n l[k] = d[k];\n }\n return l;\n}\n\n/* The basic moves */\n\nconst move_U = [\n permutation_from_cycle([0, 1, 2, 3, 4], 20),\n unsparsify_list({}, 20),\n];\nconst move_R = [\n permutation_from_cycle([4, 3, 11, 12, 13], 20),\n unsparsify_list({ 4: 2, 3: 1, 11: 1, 12: 1, 13: 1 }, 20),\n];\nconst move_F = [\n permutation_from_cycle([3, 2, 9, 10, 11], 20),\n unsparsify_list({ 3: 2, 2: 1, 9: 1, 10: 1, 11: 1 }, 20),\n];\nconst move_L = [\n permutation_from_cycle([2, 1, 7, 8, 9], 20),\n unsparsify_list({ 2: 2, 1: 1, 7: 1, 8: 1, 9: 1 }, 20),\n];\nlet move_BL = [\n permutation_from_cycle([1, 0, 5, 6, 7], 20),\n unsparsify_list({ 1: 2, 0: 1, 5: 1, 6: 1, 7: 1 }, 20),\n];\nlet move_BR = [\n permutation_from_cycle([0, 4, 13, 14, 5], 20),\n unsparsify_list({ 0: 2, 4: 1, 13: 1, 14: 1, 5: 1 }, 20),\n];\nlet move_x2 = [\n [15, 16, 17, 18, 19, 10, 9, 8, 7, 6, 5, 14, 13, 12, 11, 0, 1, 2, 3, 4],\n unsparsify_list({}, 20),\n];\nlet move_y = [\n [1, 2, 3, 4, 0, 7, 8, 9, 10, 11, 12, 13, 14, 5, 6, 19, 15, 16, 17, 18],\n unsparsify_list({}, 20),\n];\nlet move_rot = [\n [9, 10, 11, 3, 2, 8, 16, 15, 19, 12, 13, 4, 0, 1, 7, 14, 18, 17, 6, 5],\n [2, 0, 1, 2, 1, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 2, 0],\n];\n\nconst moves = [move_U, move_R, move_F, move_L, move_BL, move_BR, move_x2];\nconst move_names = [\"U\", \"R\", \"F\", \"L\", \"BL\", \"BR\", \"x2\"];\n\nlet id = compose_o(move_x2, move_x2);\n\nlet moves_full = [];\nfor (let i = 0; i < moves.length; i++) {\n moves_full[i] = [id];\n for (let j = 1; j < 5; j++) {\n moves_full[i][j] = compose_o(moves_full[i][j - 1], moves[i]);\n }\n}\n\nfunction random_state() {\n let p = [0];\n for (let i = 1; i < 20; i++) {\n let r = randomUIntBelow(i + 1);\n p[i] = p[r];\n p[r] = i;\n }\n if (permutation_parity(p) === 1) {\n [p[0], p[1]] = [p[1], p[0]];\n }\n let o = Array(20).fill(0);\n for (let i = 0; i < 19; i++) {\n o[i] = randomUIntBelow(3);\n o[19] += 3 - o[i];\n }\n o[19] %= 3;\n return [p, o];\n}\n\n/* Human interface stuff */\n\nfunction stringify_move_sequence(move_sequence) {\n let suffixes = [\"0\", \"\", \"2\", \"2'\", \"'\"];\n let s = move_sequence.map(([m, r]) => move_names[m] + suffixes[r]);\n return s.join(\" \");\n}\n\nfunction print_move_sequence(move_sequence) {\n console.log(stringify_move_sequence(move_sequence));\n}\n\nfunction apply_move_sequence(state, move_sequence) {\n for (let [m, r] of move_sequence) {\n for (let i = 0; i < r; i++) {\n state = compose_o(state, moves[m]);\n }\n }\n return state;\n}\n\nfunction generate_random_state_scramble() {\n return solve(random_state());\n}\n\n/* a brief note on analysing random-move scrambles\n\nLet M = num flips and N = num moves between flips.\n\nTracking just corner orientation is pretty much useless to determine if a scramble is good, at least\nfor the choice of CO reference used in the solver (<U,flip,(R'FRF')3>); even M=1, N=8 is good enough\nto randomise the CO, despite leaving a bunch of obvious blocks.\n\nInstead, we can track the location of, say, the white pieces. There are C(20, 5) combinations, so we\njust try out a million random-move scrambles and do a chi-squared test. (Except I don't have a stats\npackage installed, so this is just a qualitative approximation.)\n\nM=4, N=5 (29 moves): +2.7 stddev\nM=3, N=8 (35 moves): +15.7 stddev\nM=5, N=5 (35 moves): -0.1 stddev\nM=4, N=7 (39 moves): +3.8 stddev\nM=5, N=6 (41 moves): -0.4 stddev\nM=4, N=8 (44 moves): +2.2 stddev\n\n(the 95% confidence interval for these estimated values should be taken to be +-2, as usual)\n\nObviously we get closer to a uniform distribution with more moves, but we also want the scrambles to\nbe of a reasonable length. M=5, N=6 seems to be a good tradeoff.\n\nThis is until you realise that the five grey pieces are effectively scrambled with M reduced by one,\nso we compensate for that by using M=6, N=6, which gives 48-move scrambles.\n\n(tl;dr: use the hybrid scrambler if you can stomach 0.3-second initialisation; don't use this)\n*/\n\n/* Solver logic\n\nFor scrambling purposes, we have these two options:\n(i) generate a random state, solve it, then invert the solution\n(ii) generate a random state, solve it, return the solution as is\n\nThe former has a caveat that \"solve\" really means \"solve into the scramble orientation\". If we solve\ninto an arbitrary orientation, the result is a random-modulo-orientation state, in that the scramble\nhas the same relative positions of pieces as the random state, but possibly with the wrong colours.\n\nThe latter works here because the kilominx states form a group and taking the inverse doesn't affect\nthe randomness, and we do have the freedom to solve into any orientation. Since the WCA regs specify\nthat scrambled puzzles are delivered to the competitor in an arbitrary orientation, we may take this\nto be equivalent to right-composing with a random rotation, and this would \"cancel out\" any rotation\nshowing up at the end of the solution.\n\nSolving to orientations other than white-top-green-front saves a few moves (~2.2 moves by testing 10\norientations out of 60), but it's also proportionally slower for marginal gain.\n\nPhases used:\n\nPhase 1: get the five grey corners out of the U layer (6-gen), then rotate.\n\nPhase 2: form the U layer out of the grey corners (6-gen), then rotate.\n\nPhase 3: solve five more corners at the back/left to reduce to <U,R,F> (6-gen).\n\nPhase 4: finish last three faces (3-gen).\n\nPhase 1 is a skip (all five grey corners are already not on the D layer) ~19% of the time, and takes\njust one flip ~18% of the time, so there's a ~37% chance this step is basically trivial. With colour\nneutrality, this could be something like 99.9% trivial.\n\nPhases 2 and 3 make use of the same permutation/orientation move tables. Ideally, we'd use only one,\nbut it would be kinda terrible for a web app to eat hundreds of megabytes of memory. Luckily for us,\nIDA* settles these phases quickly enough that it doesn't really matter. Unluckily for us, this makes\nthe code a bit more complicated.\n\nPhase 4 is the problematic one, with 35.7 billion states. We use three pruning tables:\n- orientation (3^9 = 19683 states)\n- permutation (10!/2 = 1814400 states)\n- list of states up to 7 moves (3565896 states)\n\nWe don't even need to store the actual distances for the almost-solved states; we just let IDA* work\nits magic with the other pruning tables. Basically, if a state is in the list, the heuristic reports\na lower bound of 0, and if it's not, it reports a lower bound of 8.\n*/\n\nfunction solve_phase1(state) {\n // we don't care about orientation.\n let p = state[0];\n // x < 15 tests if a piece is non-grey.\n if (p.slice(15, 20).every((x) => x < 15)) {\n return [];\n }\n if (p.slice(0, 5).every((x) => x < 15)) {\n return [[6, 1]];\n }\n let flags = p.map((x) => x >= 15);\n let depth = 0;\n let sol;\n while (sol === undefined) {\n depth++;\n sol = search_phase1(flags, depth, -1);\n }\n sol.push([6, 1]);\n return sol;\n}\n\nfunction search_phase1(flags, depth, last) {\n if (depth === 0) {\n if (flags.slice(0, 5).some((x) => x)) {\n return;\n }\n return [];\n }\n for (let move_index = 0; move_index < 6; move_index++) {\n if (move_index === last) {\n continue;\n }\n for (let r = 1; r < 5; r++) {\n let new_flags = compose(flags, moves_full[move_index][r][0]);\n let sol = search_phase1(new_flags, depth - 1, move_index);\n if (sol !== undefined) {\n return [[move_index, r]].concat(sol);\n }\n }\n }\n return;\n}\n\nfunction index_phase2(state) {\n let p = state[0].slice(0, 15);\n let o = state[1];\n let index_c = comb_to_index(p.map((x) => +(x >= 15)));\n let index_o = 243 * index_c;\n for (let i = 0, j = 0; i < 15; i++) {\n if (p[i] < 15) {\n continue;\n }\n index_o += o[i] * Math.pow(3, j);\n // as it so happens, my JS shell is too outdated and doesn't support **\n j++;\n }\n let index_p = 0;\n for (let i = 0; i < 5; i++) {\n index_p += p.indexOf(15 + i) * Math.pow(15, i);\n }\n return [index_o, index_p];\n}\n\nfunction solve_phase2(state) {\n let mtables = [\n generate_phase23_orientation_mtable(),\n generate_phase23_permutation_mtable(),\n ];\n let ptables = [\n generate_phase2_orientation_ptable(),\n generate_phase2_permutation_ptable(),\n ];\n return ida_solve(index_phase2(state), mtables, ptables).concat([[6, 1]]);\n}\n\nfunction index_phase3(state) {\n let pieces = [5, 6, 7, 8, 14];\n let p = state[0].slice(0, 15);\n let o = state[1];\n let index_c = comb_to_index(p.map((x) => +(pieces.indexOf(x) !== -1)));\n let index_o = 243 * index_c;\n for (let i = 0, j = 0; i < 15; i++) {\n if (pieces.indexOf(p[i]) === -1) {\n continue;\n }\n index_o += o[i] * Math.pow(3, j);\n j++;\n }\n let index_p = 0;\n for (let i = 0; i < 5; i++) {\n index_p += p.indexOf(pieces[i]) * Math.pow(15, i);\n }\n return [index_o, index_p];\n}\n\nfunction solve_phase3(state) {\n let mtables = [\n generate_phase23_orientation_mtable(),\n generate_phase23_permutation_mtable(),\n ];\n let ptables = [\n generate_phase3_orientation_ptable(),\n generate_phase3_permutation_ptable(),\n ];\n return ida_solve(index_phase3(state), mtables, ptables);\n}\n\nfunction index_phase4(state) {\n let p = state[0].slice(0, 14);\n let o = state[1];\n let index_o = 0;\n let perm = [];\n let j = 0;\n for (let i of [0, 1, 2, 3, 4, 9, 10, 11, 12, 13]) {\n if (i !== 13) {\n index_o += o[i] * Math.pow(3, j);\n }\n perm[j] = p[i] < 5 ? p[i] : p[i] - 4;\n j++;\n }\n return [index_o, evenpermutation_to_index(perm)];\n}\n\nfunction solve_phase4(state) {\n let mtables = [\n generate_phase4_orientation_mtable(),\n generate_phase4_permutation_mtable(),\n ];\n let ptables = [\n generate_phase4_orientation_ptable(),\n generate_phase4_permutation_ptable(),\n ];\n return ida_solve(index_phase4(state), mtables, ptables);\n}\n\nfunction solve_phase4_fast(state) {\n return phase4_ida_solve(index_phase4(state));\n}\n\nfunction solve(state) {\n let sol = [];\n for (let solver of [\n solve_phase1,\n solve_phase2,\n solve_phase3,\n solve_phase4_fast,\n ]) {\n //console.log(`solving with ${solver.name}`);\n let phase_sol = solver(state);\n state = apply_move_sequence(state, phase_sol);\n //console.log(`solution: ${stringify_move_sequence(phase_sol)}`);\n sol = sol.concat(phase_sol);\n }\n return sol;\n}\n\nfunction cn_solve(state) {\n // Solve with partial colour neutrality. We don't want to check all 120 cases, so we look only\n // at <y, flip>-neutrality, which has 10 cases.\n let sol_lengths = [];\n let shortest_sol;\n let shortest_sol_length = 999999;\n for (let x = 0; x < 2; x++) {\n for (let y = 0; y < 5; y++) {\n let sol = solve(state);\n sol_lengths.push(sol.length);\n if (shortest_sol_length > sol.length) {\n shortest_sol_length = sol.length;\n shortest_sol = sol;\n }\n state = compose_o(move_y, state);\n }\n state = compose_o(move_x2, state);\n }\n console.log(`solution lengths: ${sol_lengths.join(\", \")}`);\n return shortest_sol;\n}\n\nconst tables = {};\n\nfunction generate_phase23_orientation_mtable() {\n if (tables.phase23om) {\n return tables.phase23om;\n }\n const C15_5 = C(15, 5);\n const THREE = [1, 3, 9, 27, 81, 243];\n let phase23om = Array(C(15, 5) * THREE[5]);\n tables.phase23om = phase23om;\n for (let i = 0; i < C15_5; i++) {\n let comb = index_to_comb(i, 5, 15).concat(Array(5).fill(0));\n let new_comb_indices = [];\n for (let move_index = 0; move_index < 6; move_index++) {\n let new_comb = compose(comb, moves[move_index][0]).slice(0, 15);\n new_comb_indices[move_index] = comb_to_index(new_comb);\n }\n for (let j = 0; j < THREE[5]; j++) {\n phase23om[j + 243 * i] = [];\n let orient_full = [];\n for (let k = 0, l = 0; k < 20; k++) {\n if (comb[k] === 1) {\n orient_full[k] = ((j / THREE[l]) | 0) % 3;\n l++;\n } else {\n orient_full[k] = 99; // some irrelevant garbage value\n }\n }\n for (let move_index = 0; move_index < 6; move_index++) {\n let move = moves[move_index];\n let new_orient_full = [];\n for (let k = 0; k < 15; k++) {\n new_orient_full[k] = orient_full[move[0][k]] + move[1][k];\n }\n let new_orient = new_orient_full.filter((x) => x < 10); // get rid of garbage\n let J = 0;\n for (let k = 0; k < 5; k++) {\n J += (new_orient[k] % 3) * THREE[k];\n }\n phase23om[j + 243 * i][move_index] =\n J + 243 * new_comb_indices[move_index];\n }\n }\n }\n return phase23om;\n}\n\nfunction generate_phase2_orientation_ptable() {\n if (tables.phase2op) {\n return tables.phase2op;\n }\n let mtable = generate_phase23_orientation_mtable();\n return (tables.phase2op = bfs(mtable, [243 * 3002]));\n}\n\nfunction generate_phase3_orientation_ptable() {\n if (tables.phase3op) {\n return tables.phase3op;\n }\n let mtable = generate_phase23_orientation_mtable();\n return (tables.phase3op = bfs(mtable, [243 * 246]));\n}\n\nfunction generate_phase23_permutation_mtable() {\n if (tables.phase23pm) {\n return tables.phase23pm;\n }\n const FIFTEEN = [\n 1,\n 15,\n 225,\n Math.pow(15, 3),\n Math.pow(15, 4),\n Math.pow(15, 5),\n ];\n let phase23pm = Array(FIFTEEN[5]);\n let single = Array(15);\n for (let i = 0; i < 15; i++) {\n single[i] = Array(6);\n for (let move_index = 0; move_index < 6; move_index++) {\n single[i][move_index] = moves[move_index][0].indexOf(i);\n }\n }\n let locations = [0, 0, 0, 0, 0];\n for (let ind = 0; ind < FIFTEEN[5]; ind++) {\n phase23pm[ind] = Array(6);\n for (let move_index = 0; move_index < 6; move_index++) {\n let new_ind = 0;\n for (let i = 0; i < 5; i++) {\n new_ind += single[locations[i]][move_index] * FIFTEEN[i];\n }\n phase23pm[ind][move_index] = new_ind;\n }\n locations[0]++;\n for (let i = 0; i < 4; i++) {\n if (locations[i] === 15) {\n locations[i] = 0;\n locations[i + 1]++;\n }\n }\n }\n return (tables.phase23pm = phase23pm);\n}\n\nfunction generate_phase2_permutation_ptable() {\n if (tables.phase2pp) {\n return tables.phase2pp;\n }\n let mtable = generate_phase23_permutation_mtable();\n return (tables.phase2pp = bfs(mtable, [213090]));\n}\n\nfunction generate_phase3_permutation_ptable() {\n if (tables.phase3pp) {\n return tables.phase3pp;\n }\n let mtable = generate_phase23_permutation_mtable();\n return (tables.phase3pp = bfs(mtable, [737420]));\n}\n\nfunction generate_phase4_orientation_mtable() {\n if (tables.phase4om) {\n return tables.phase4om;\n }\n const THREE = [1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049];\n let mtable = Array(THREE[9]);\n for (let i = 0; i < THREE[9]; i++) {\n let o = Array(14).fill(0);\n for (let j = 0; j < 9; j++) {\n let J = j < 5 ? j : j + 4;\n o[J] = ((i / THREE[j]) | 0) % 3;\n o[13] -= o[J];\n }\n o[13] = (o[13] + 999) % 3;\n mtable[i] = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n let move = moves[move_index];\n let new_o = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13].map(\n (i) => o[move[0][i]] + move[1][i],\n );\n let new_i = 0;\n for (let j = 0; j < 9; j++) {\n new_i += (new_o[j] % 3) * THREE[j];\n }\n mtable[i][move_index] = new_i;\n }\n }\n return (tables.phase4om = mtable);\n}\n\nfunction generate_phase4_permutation_mtable() {\n if (tables.phase4pm) {\n return tables.phase4pm;\n }\n const HALFFACT10 = factorial(10) / 2;\n const n = 10;\n let pre = [0, 1, 2, 3, 4, -1, -1, -1, -1, 5, 6, 7, 8, 9];\n let post = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13];\n let move_permutations = [\n compose(pre, compose(move_U[0], post)),\n compose(pre, compose(move_R[0], post)),\n compose(pre, compose(move_F[0], post)),\n ];\n let mtable = Array(HALFFACT10);\n let perm = Array(10);\n for (let i = 0; i < HALFFACT10; i++) {\n index_to_evenpermutation10(i, perm);\n mtable[i] = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n let new_perm = compose(perm, move_permutations[move_index]);\n mtable[i][move_index] = evenpermutation10_to_index(new_perm);\n }\n }\n return (tables.phase4pm = mtable);\n}\n\nfunction generate_phase4_orientation_ptable() {\n if (tables.phase4op) {\n return tables.phase4op;\n }\n let mtable = generate_phase4_orientation_mtable();\n return (tables.phase4op = bfs(mtable, [0]));\n}\n\nfunction generate_phase4_permutation_ptable() {\n if (tables.phase4pp) {\n return tables.phase4pp;\n }\n let mtable = generate_phase4_permutation_mtable();\n return (tables.phase4pp = bfs(mtable, [0]));\n}\n\nfunction generate_phase4_near_ptable_list(threshold) {\n if (tables.phase4np_list && tables.phase4np_list.threshold === threshold) {\n return tables.phase4np_list;\n }\n let mtables = [\n generate_phase4_orientation_mtable(),\n generate_phase4_permutation_mtable(),\n ];\n let base = Math.pow(3, 9);\n let states = [0];\n populate(threshold, [0, 0], -1);\n function populate(depth, state, last) {\n states.push(state[0] + base * state[1]);\n if (depth === 0) {\n return;\n }\n let new_state = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n if (move_index === last) {\n continue;\n }\n new_state[0] = state[0];\n new_state[1] = state[1];\n for (let r = 1; r < 5; r++) {\n new_state[0] = mtables[0][new_state[0]][move_index];\n new_state[1] = mtables[1][new_state[1]][move_index];\n populate(depth - 1, new_state, move_index);\n }\n }\n return;\n }\n states.sort((x, y) => x - y);\n let unique_states = [];\n let last = -1;\n for (let state of states) {\n if (state !== last) {\n unique_states.push((last = state));\n }\n }\n unique_states.threshold = threshold;\n return (tables.phase4np_list = unique_states);\n}\n\nfunction binary_search(A, x) {\n let lo = 0;\n let hi = A.length - 1;\n while (hi - lo > 1) {\n // invariants: hi - lo >= 2; x > A[lo-1]; x < A[hi+1]\n let mid = (lo + hi) >> 1; // lo < mid < hi\n if (x > A[mid]) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return x === A[lo] || x === A[hi];\n}\n\nfunction cache_all_tables() {\n let time = +new Date();\n let splits = [time];\n console.log(\"generating phase 2/3 move tables...\");\n generate_phase23_orientation_mtable();\n generate_phase23_permutation_mtable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 2 pruning tables...\");\n generate_phase2_orientation_ptable();\n generate_phase2_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 3 pruning tables...\");\n generate_phase3_orientation_ptable();\n generate_phase3_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 move tables...\");\n generate_phase4_orientation_mtable();\n generate_phase4_permutation_mtable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 pruning tables...\");\n generate_phase4_orientation_ptable();\n generate_phase4_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 bonus pruning table...\");\n generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\n `total elapsed: ${((splits[splits.length - 1] - splits[0]) / 1000).toFixed(\n 3,\n )}`,\n );\n}\n\nfunction bfs(mtable, goal_states) {\n let N = mtable.length;\n let nmoves = mtable[0].length;\n let ptable = Array(N).fill(-1);\n for (let state of goal_states) {\n ptable[state] = 0;\n }\n let depth = 0;\n let done = false;\n while (!done) {\n done = true;\n for (let state = 0; state < N; state++) {\n if (ptable[state] !== depth) {\n continue;\n }\n for (let move_index = 0; move_index < nmoves; move_index++) {\n let new_state = mtable[state][move_index];\n while (new_state !== state) {\n if (ptable[new_state] === -1) {\n done = false;\n ptable[new_state] = depth + 1;\n }\n new_state = mtable[new_state][move_index];\n }\n }\n }\n depth++;\n }\n return ptable;\n}\n\nfunction ida_solve(indices, mtables, ptables) {\n let ncoords = indices.length;\n let bound = 0;\n for (let i = 0; i < ncoords; i++) {\n bound = Math.max(bound, ptables[i][indices[i]]);\n }\n while (true) {\n let path = ida_search(indices, mtables, ptables, bound, -1);\n if (path !== undefined) {\n return path;\n }\n bound++;\n }\n}\n\nfunction ida_search(indices, mtables, ptables, bound, last) {\n let ncoords = indices.length;\n let nmoves = mtables[0][0].length;\n let heuristic = 0;\n for (let i = 0; i < ncoords; i++) {\n heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n return [];\n }\n for (let m = 0; m < nmoves; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let c = 0; c < ncoords; c++) {\n new_indices[c] = mtables[c][indices[c]][m];\n }\n let r = 1;\n while (indices.some((_, i) => indices[i] !== new_indices[i])) {\n let subpath = ida_search(new_indices, mtables, ptables, bound - 1, m);\n if (subpath !== undefined) {\n return [[m, r]].concat(subpath);\n }\n for (let c = 0; c < ncoords; c++) {\n new_indices[c] = mtables[c][new_indices[c]][m];\n }\n r++;\n }\n }\n return;\n}\n\nfunction phase4_ida_solve(indices) {\n let mtable_o = generate_phase4_orientation_mtable();\n let mtable_p = generate_phase4_permutation_mtable();\n let ptable_o = generate_phase4_orientation_ptable();\n let ptable_p = generate_phase4_permutation_ptable();\n let ptable_n = generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n let bound = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n while (true) {\n let path = phase4_ida_search(\n indices,\n bound,\n -1,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n if (path !== undefined) {\n return path;\n }\n bound++;\n }\n}\n\nfunction phase4_ida_search(\n indices,\n bound,\n last,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n) {\n let heuristic = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n if (heuristic > bound) {\n return;\n }\n if (\n heuristic <= PHASE4_THRESHOLD &&\n !binary_search(ptable_n, indices[0] + 19683 * indices[1])\n ) {\n heuristic = PHASE4_THRESHOLD + 1;\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n return [];\n }\n for (let m = 0; m < 3; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let r = 1; r < 5; r++) {\n new_indices[0] = mtable_o[new_indices[0]][m];\n new_indices[1] = mtable_p[new_indices[1]][m];\n let subpath = phase4_ida_search(\n new_indices,\n bound - 1,\n m,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n if (subpath !== undefined) {\n return [[m, r]].concat(subpath);\n }\n }\n }\n return;\n}\n\nfunction* phase4_ida_solve_gen(indices) {\n let mtable_o = generate_phase4_orientation_mtable();\n let mtable_p = generate_phase4_permutation_mtable();\n let ptable_o = generate_phase4_orientation_ptable();\n let ptable_p = generate_phase4_permutation_ptable();\n let ptable_n = generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n let bound = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n while (true) {\n yield* phase4_ida_search_gen(\n indices,\n bound,\n -1,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n bound++;\n }\n}\n\nfunction* phase4_ida_search_gen(\n indices,\n bound,\n last,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n) {\n let heuristic = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n if (heuristic > bound) {\n return;\n }\n if (\n heuristic <= PHASE4_THRESHOLD &&\n !binary_search(ptable_n, indices[0] + 19683 * indices[1])\n ) {\n heuristic = PHASE4_THRESHOLD + 1;\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n yield [];\n }\n for (let m = 0; m < 3; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let r = 1; r < 5; r++) {\n new_indices[0] = mtable_o[new_indices[0]][m];\n new_indices[1] = mtable_p[new_indices[1]][m];\n let subpath_gen = phase4_ida_search_gen(\n new_indices,\n bound - 1,\n m,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) {\n break;\n }\n yield [[m, r]].concat(subpath);\n }\n }\n }\n}\n\n/* Additional solving logic for the hybrid scrambler\n\nRather than being a purely random-move or random-state scramble (the former isn't random enough, but\nthe latter is too slow), we fully randomise the locations of the white pieces and of the grey pieces\nthen apply a bunch of random moves afterwards.\n\nThis is in the sense that the C(20,10,5,5) = 46558512 possible combinations of where the white, grey\nand E-slice pieces are (without distinguishing between the white pieces, etc.) are equally likely.\n\nCorner orientation is effectively randomised by doing at least 8 random moves on each hemisphere, so\nfor all intents and purposes, this should be as good as a random-state scramble.\n*/\n\nfunction generate_hs_mtable() {\n if (tables.hsm) {\n return tables.hsm;\n }\n const C20_5 = C(20, 5); // = 15504\n let mtable = Array(C20_5);\n for (let i = 0; i < C20_5; i++) {\n mtable[i] = Array(7);\n let comb = index_to_comb(i, 5, 20);\n for (let m = 0; m < 7; m++) {\n let new_comb = compose(comb, moves[m][0]);\n mtable[i][m] = comb_to_index(new_comb);\n }\n }\n return (tables.hsm = mtable);\n}\n\nfunction generate_hs_u_ptable() {\n if (tables.hsup) {\n return tables.hsup;\n }\n let mtable = generate_hs_mtable();\n return (tables.hsup = bfs(mtable, [15503]));\n}\n\nfunction generate_hs_d_ptable() {\n if (tables.hsdp) {\n return tables.hsdp;\n }\n let mtable = generate_hs_mtable();\n return (tables.hsdp = bfs(mtable, [0]));\n}\n\nfunction index_hs(state) {\n let p = state[0];\n return [\n comb_to_index(p.map((x) => +(x < 5))),\n comb_to_index(p.map((x) => +(x >= 15))),\n ];\n}\n\n// this is too unpredictably slow\n// (obv we could generate a full pruning table, but that defeats the purpose of fast initialisation)\nfunction solve_hs(state) {\n let mtables = Array(2).fill(generate_hs_mtable());\n let ptables = [generate_hs_u_ptable(), generate_hs_d_ptable()];\n return ida_solve(index_hs(state), mtables, ptables);\n}\n\n// this gives sequences ~2 moves longer on average, but is way faster\nfunction solve_hs_twophase(state) {\n let mtable = generate_hs_mtable();\n let u_ptable = generate_hs_u_ptable();\n let d_ptable = generate_hs_d_ptable();\n let indices = index_hs(state);\n let sol1;\n /*\n\tif (u_ptable[indices[0]] < d_ptable[indices[1]]) sol1 = ida_solve([indices[0]], [mtable], [u_ptable]);\n\telse sol1 = ida_solve([indices[1]], [mtable], [d_ptable]);\n\t// don't do this because it'd give solutions starting with flip pretty often.\n\t*/\n sol1 = ida_solve([indices[1]], [mtable], [d_ptable]);\n let s1 = apply_move_sequence(state, sol1);\n let sol2 = ida_solve(index_hs(s1), [mtable, mtable], [u_ptable, d_ptable]);\n return sol1.concat(sol2);\n}\n\nfunction generate_hybrid_scramble() {\n let move_sequence = [];\n let sort_seq = solve_hs_twophase(random_state());\n for (let [m, r] of sort_seq) {\n let period = m === 6 ? 2 : 5;\n move_sequence.unshift([m, (period - r) % period]);\n }\n\n // TODO: remove possible move cancellations between the random-state and random-move phases\n return move_sequence.concat(generate_random_move_scramble(2, 9));\n}\n\nfunction generate_fullseparate_mtable() {\n if (tables.fsm) {\n return tables.fsm;\n }\n const C20_10 = C(20, 10); // = 184756\n const C19_9 = C(19, 9); // = 92378\n let moves12 = moves.slice(0, 6);\n moves12 = moves12.concat(\n moves12.map((move) => compose_o(compose_o(move_x2, move), move_x2)),\n );\n // get all 12 face moves by conjugating the six \"top half\" moves with a flip\n let moves15 = moves12.concat([move_x2, move_y, move_rot]);\n let mtable = Array(C20_10 * 2);\n let mtable15 = Array(C20_10 * 2);\n for (let i = 0; i < C20_10; i++) {\n mtable[i * 2] = Array(12);\n mtable[i * 2 + 1] = Array(12);\n mtable15[i * 2] = Array(15);\n mtable15[i * 2 + 1] = Array(15);\n let comb = index_to_comb(i, 10, 20);\n let perm = [];\n for (let j = 0, k = 0; j < 20; j++) {\n if (comb[j] === 0) {\n perm[j] = -1;\n } else {\n perm[j] = k++;\n }\n }\n for (let m = 0; m < 15; m++) {\n let new_perm = compose(perm, moves15[m][0]);\n let new_comb = compose(comb, moves15[m][0]);\n let parity = permutation_parity(new_perm.filter((x) => x >= 0));\n let I = comb_to_index(new_comb);\n mtable15[i * 2][m] = I * 2 + parity;\n mtable15[i * 2 + 1][m] = I * 2 + (parity ^ 1);\n if (m < 12) {\n mtable[i * 2][m] = I * 2 + parity;\n mtable[i * 2 + 1][m] = I * 2 + (parity ^ 1);\n }\n }\n }\n tables.fsm = mtable;\n tables.fsm15 = mtable15;\n return mtable;\n}\n\nfunction generate_fullseparate_ptable() {\n if (tables.fsp) {\n return tables.fsp;\n }\n let mtable = generate_fullseparate_mtable();\n /*\n\tlet separations = [\n\t\t[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1],\n\t\t[0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1],\n\t\t[1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1].map(x => 1-x),\n\t\t[1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0].map(x => 1-x),\n\t\t[1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0].map(x => 1-x),\n\t\t[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0],\n\t];\n\t*/\n let goal_states = [0];\n let l = 1;\n while (true) {\n for (let ind of goal_states) {\n for (let m = 12; m < 15; m++) {\n let new_ind = tables.fsm15[ind][m];\n if (goal_states.indexOf(new_ind) === -1) {\n goal_states.push(new_ind);\n goal_states.sort((x, y) => x - y); // slow but w/e\n }\n }\n }\n if (goal_states.length === l) {\n break;\n }\n l = goal_states.length;\n }\n print(goal_states.toSource());\n return (tables.fsp = bfs5(mtable, goal_states));\n}\n\nfunction bfs5(mtable, goal_states) {\n let N = mtable.length;\n let nmoves = mtable[0].length;\n let ptable = Array(N).fill(-1);\n let queue = goal_states.slice();\n let new_queue = [];\n let depth = 0;\n while (queue.length > 0) {\n new_queue.length = 0;\n for (let state of queue) {\n if (ptable[state] !== -1) {\n continue;\n }\n ptable[state] = depth;\n for (let move_index = 0; move_index < nmoves; move_index++) {\n let new_state = mtable[state][move_index];\n for (let r = 1; r <= 4; r++) {\n if (r === 1 || r === 4) {\n new_queue.push(new_state);\n }\n new_state = mtable[new_state][move_index];\n }\n }\n }\n [queue, new_queue] = [new_queue, queue];\n depth += 1;\n }\n return ptable;\n}\n\nexport function getRandomKilominxScramble() {\n return new Alg(stringify_move_sequence(generate_random_state_scramble()));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["evenpermutation10_to_index", "index_to_evenpermutation10", "C", "i", "last"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/twisty/views/3D/puzzles/Cube3D.ts", "../../../../src/cubing/twisty/controllers/easing.ts", "../../../../src/cubing/twisty/views/3D/puzzles/PG3D.ts", "../../../../src/cubing/twisty/heavy-code-imports/dynamic-entries/twisty-dynamic-3d.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DScene.ts"],
|
|
4
|
-
"sourcesContent": ["import { BackSide, DoubleSide, FrontSide } from \"three/src/constants.js\";\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport { BoxGeometry } from \"three/src/geometries/BoxGeometry.js\";\nimport { TextureLoader } from \"three/src/loaders/TextureLoader.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Group } from \"three/src/objects/Group.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport type { Texture } from \"three/src/textures/Texture.js\";\nimport type { KPuzzle } from \"../../../../kpuzzle/index.ts\";\nimport type { ExperimentalStickeringMask } from \"../../../../puzzles/cubing-private/index.ts\";\nimport type {\n FaceletMeshStickeringMask,\n StickeringMask,\n} from \"../../../../puzzles/stickerings/mask.ts\";\nimport type {\n MillisecondTimestamp,\n PuzzlePosition,\n} from \"../../../controllers/AnimationTypes.ts\";\nimport { smootherStep } from \"../../../controllers/easing.ts\";\nimport type { FaceletScale } from \"../../../model/props/puzzle/display/FaceletScaleProp.ts\";\nimport {\n type HintFaceletStyle,\n hintFaceletStyles,\n} from \"../../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport type { InitialHintFaceletsAnimation } from \"../../../model/props/puzzle/display/InitialHintFaceletsAnimationProp.ts\";\nimport { TAU } from \"../TAU.ts\";\nimport { haveStartedSharingRenderers } from \"../Twisty3DVantage.ts\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle.ts\";\n\nconst svgLoader = new TextureLoader();\n\nconst ignoredMaterial = new MeshBasicMaterial({\n color: new Color(0x666666).convertLinearToSRGB(),\n});\n\nconst ignoredMaterialHint = new MeshBasicMaterial({\n color: new Color(0xcccccc).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.75,\n});\n\nconst invisibleMaterial = new MeshBasicMaterial({\n visible: false,\n});\n\nconst orientedMaterial = new MeshBasicMaterial({\n color: 0x44ddcc,\n});\n\nconst orientedMaterialHint = new MeshBasicMaterial({\n color: 0x44ddcc,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\nconst experimentalOriented2Material = new MeshBasicMaterial({\n color: 0xfffdaa,\n});\n\nconst experimentalOriented2MaterialHint = new MeshBasicMaterial({\n color: 0xfff979,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\nconst mysteryMaterial = new MeshBasicMaterial({\n color: 0xf2cbcb,\n});\n\nconst mysterMaterialHint = new MeshBasicMaterial({\n color: 0xf2cbcb,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\ninterface MaterialMap\n extends Record<FaceletMeshStickeringMask, MeshBasicMaterial> {\n regular: MeshBasicMaterial;\n dim: MeshBasicMaterial;\n ignored: MeshBasicMaterial;\n invisible: MeshBasicMaterial;\n}\n\nclass AxisInfo {\n public stickerMaterial: MaterialMap;\n public hintStickerMaterial: MaterialMap;\n constructor(\n public vector: Vector3,\n public fromZ: Euler,\n public color: number,\n public dimColor: number,\n public hintOpacityScale: number, // TODO: make this work better across bright *and* dark backgrounds. Maybe tweak sticker compositing settings?\n options?: { hintColor?: number; hintDimColor?: number },\n ) {\n const colorLinearSRGB = new Color(color).convertLinearToSRGB();\n const dimColorLinearSRGB = new Color(dimColor).convertLinearToSRGB();\n // TODO: Make sticker material single-sided when cubie foundation is opaque?\n this.stickerMaterial = {\n regular: new MeshBasicMaterial({\n color: colorLinearSRGB,\n side: FrontSide, // TODO: set to `DoubleSide` when hint facelets are disabled.\n }),\n dim: new MeshBasicMaterial({\n color: dimColorLinearSRGB,\n side: FrontSide, // TODO: set to `DoubleSide` when hint facelets are disabled.\n }),\n oriented: orientedMaterial,\n experimentalOriented2: experimentalOriented2Material,\n ignored: ignoredMaterial,\n invisible: invisibleMaterial,\n mystery: mysteryMaterial,\n };\n this.hintStickerMaterial = {\n regular: new MeshBasicMaterial({\n color: new Color(options?.hintColor ?? color).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n dim: new MeshBasicMaterial({\n color: new Color(\n options?.hintDimColor ?? dimColor,\n ).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n oriented: orientedMaterialHint,\n experimentalOriented2: experimentalOriented2MaterialHint,\n ignored: ignoredMaterialHint,\n invisible: invisibleMaterial,\n mystery: mysterMaterialHint,\n };\n }\n}\n\nconst axesInfo: AxisInfo[] = [\n new AxisInfo(\n new Vector3(0, 1, 0),\n new Euler(-TAU / 4, 0, 0),\n 0xffffff,\n 0xdddddd,\n 1.25,\n ),\n new AxisInfo(\n new Vector3(-1, 0, 0),\n new Euler(0, -TAU / 4, 0),\n 0xff9900,\n 0x885500,\n 1,\n { hintDimColor: 0x884400 },\n ),\n new AxisInfo(\n new Vector3(0, 0, 1),\n new Euler(0, 0, 0),\n 0x00ff00,\n 0x008800,\n 1,\n { hintDimColor: 0x009900 },\n ),\n new AxisInfo(\n new Vector3(1, 0, 0),\n new Euler(0, TAU / 4, 0),\n 0xff0000,\n 0x660000,\n 1,\n { hintDimColor: 0x660000 },\n ),\n new AxisInfo(\n new Vector3(0, 0, -1),\n new Euler(0, TAU / 2, 0),\n 0x2266ff,\n 0x113388,\n 0.75,\n { hintDimColor: 0x001866 },\n ),\n new AxisInfo(\n new Vector3(0, -1, 0),\n new Euler(TAU / 4, 0, 0),\n 0xffff00,\n 0x888800,\n 1.25,\n { hintDimColor: 0xdddd00 },\n ),\n];\n\nconst face: { [s: string]: number } = {\n U: 0,\n L: 1,\n F: 2,\n R: 3,\n B: 4,\n D: 5,\n};\n\nconst familyToAxis: { [s: string]: number } = {\n U: face[\"U\"],\n u: face[\"U\"],\n Uw: face[\"U\"],\n Uv: face[\"U\"],\n y: face[\"U\"],\n L: face[\"L\"],\n l: face[\"L\"],\n Lw: face[\"L\"],\n Lv: face[\"L\"],\n M: face[\"L\"],\n F: face[\"F\"],\n f: face[\"F\"],\n Fw: face[\"F\"],\n Fv: face[\"F\"],\n S: face[\"F\"],\n z: face[\"F\"],\n R: face[\"R\"],\n r: face[\"R\"],\n Rw: face[\"R\"],\n Rv: face[\"R\"],\n x: face[\"R\"],\n B: face[\"B\"],\n b: face[\"B\"],\n Bw: face[\"B\"],\n Bv: face[\"B\"],\n D: face[\"D\"],\n d: face[\"D\"],\n Dw: face[\"D\"],\n Dv: face[\"D\"],\n E: face[\"D\"],\n};\n\nconst cubieDimensions = {\n // stickerWidth: 0.85, // Now `faceletScale` in options.\n stickerElevation: 0.503,\n foundationWidth: 1,\n defaultHintStickerElevation: 1.45,\n};\nconst EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION = 2;\n\nexport interface Cube3DOptions {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n experimentalStickeringMask?: ExperimentalStickeringMask;\n foundationSprite?: Texture | null;\n hintSprite?: Texture | null;\n initialHintFaceletsAnimation?: InitialHintFaceletsAnimation;\n faceletScale?: \"auto\" | number;\n hintFaceletsElevation?: \"auto\" | number;\n}\n\nconst cube3DOptionsDefaults: Cube3DOptions = {\n showMainStickers: true,\n hintFacelets: \"floating\",\n showFoundation: true,\n experimentalStickeringMask: undefined,\n foundationSprite: null,\n hintSprite: null,\n initialHintFaceletsAnimation: \"auto\",\n faceletScale: \"auto\",\n hintFaceletsElevation: \"auto\",\n};\n\nconst DEFAULT_STICKER_SCALE = 0.85;\nfunction getFaceletScale(options: Cube3DOptions): number {\n if (\n typeof options.faceletScale === \"undefined\" ||\n options.faceletScale === \"auto\"\n ) {\n return DEFAULT_STICKER_SCALE;\n }\n return options.faceletScale;\n}\n\n// TODO: Make internal foundation faces one-sided, facing to the outside of the cube.\nconst blackMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 1,\n transparent: true,\n});\n\nconst blackTranslucentMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 0.3,\n transparent: true,\n});\n\nclass CubieDef {\n public matrix: Matrix4;\n public stickerFaces: number[];\n // stickerFaceNames can be e.g. [\"U\", \"F\", \"R\"], \"UFR\" if every face is a single letter.\n constructor(\n public orbit: string,\n stickerFaceNames: string[] | string,\n q: Quaternion,\n ) {\n const individualStickerFaceNames =\n typeof stickerFaceNames === \"string\"\n ? stickerFaceNames.split(\"\")\n : stickerFaceNames;\n this.stickerFaces = individualStickerFaceNames.map((s) => face[s]);\n this.matrix = new Matrix4();\n this.matrix.setPosition(firstPiecePosition[orbit]);\n this.matrix.premultiply(new Matrix4().makeRotationFromQuaternion(q));\n }\n}\n\nfunction t(v: Vector3, t4: number): Quaternion {\n return new Quaternion().setFromAxisAngle(v, (TAU * t4) / 4);\n}\n\nconst r = {\n O: new Vector3(0, 0, 0),\n U: new Vector3(0, -1, 0),\n L: new Vector3(1, 0, 0),\n F: new Vector3(0, 0, -1),\n R: new Vector3(-1, 0, 0),\n B: new Vector3(0, 0, 1),\n D: new Vector3(0, 1, 0),\n};\n\ninterface OrbitIndexed<T> {\n [s: string]: T;\n}\ntype PieceIndexed<T> = OrbitIndexed<T[]>;\n\nconst firstPiecePosition: OrbitIndexed<Vector3> = {\n EDGES: new Vector3(0, 1, 1),\n CORNERS: new Vector3(1, 1, 1),\n CENTERS: new Vector3(0, 1, 0),\n};\nconst orientationRotation: OrbitIndexed<Matrix4[]> = {\n EDGES: [0, 1].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"EDGES\"].clone().normalize(),\n (-i * TAU) / 2,\n ),\n ),\n CORNERS: [0, 1, 2].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"CORNERS\"].clone().normalize(),\n (-i * TAU) / 3,\n ),\n ),\n CENTERS: [0, 1, 2, 3].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"CENTERS\"].clone().normalize(),\n (-i * TAU) / 4,\n ),\n ),\n};\nconst cubieStickerOrder = [face[\"U\"], face[\"F\"], face[\"R\"]];\n\nconst pieceDefs: PieceIndexed<CubieDef> = {\n EDGES: [\n new CubieDef(\"EDGES\", \"UF\", t(r.O, 0)),\n new CubieDef(\"EDGES\", \"UR\", t(r.U, 3)),\n new CubieDef(\"EDGES\", \"UB\", t(r.U, 2)),\n new CubieDef(\"EDGES\", \"UL\", t(r.U, 1)),\n new CubieDef(\"EDGES\", \"DF\", t(r.F, 2)),\n new CubieDef(\"EDGES\", \"DR\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"EDGES\", \"DB\", t(r.F, 2).premultiply(t(r.D, 2))),\n new CubieDef(\"EDGES\", \"DL\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"EDGES\", \"FR\", t(r.U, 3).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"FL\", t(r.U, 1).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"BR\", t(r.U, 3).premultiply(t(r.R, 1))),\n new CubieDef(\"EDGES\", \"BL\", t(r.U, 1).premultiply(t(r.R, 1))),\n ],\n CORNERS: [\n new CubieDef(\"CORNERS\", \"UFR\", t(r.O, 0)),\n new CubieDef(\"CORNERS\", \"URB\", t(r.U, 3)),\n new CubieDef(\"CORNERS\", \"UBL\", t(r.U, 2)),\n new CubieDef(\"CORNERS\", \"ULF\", t(r.U, 1)),\n new CubieDef(\"CORNERS\", \"DRF\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"CORNERS\", \"DFL\", t(r.F, 2).premultiply(t(r.D, 0))),\n new CubieDef(\"CORNERS\", \"DLB\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"CORNERS\", \"DBR\", t(r.F, 2).premultiply(t(r.D, 2))),\n ],\n CENTERS: [\n new CubieDef(\"CENTERS\", \"U\", t(r.O, 0)),\n new CubieDef(\"CENTERS\", \"L\", t(r.R, 3).premultiply(t(r.U, 1))),\n new CubieDef(\"CENTERS\", \"F\", t(r.R, 3)),\n new CubieDef(\"CENTERS\", \"R\", t(r.R, 3).premultiply(t(r.D, 1))),\n new CubieDef(\"CENTERS\", \"B\", t(r.R, 3).premultiply(t(r.D, 2))),\n new CubieDef(\"CENTERS\", \"D\", t(r.R, 2)),\n ],\n};\n\nconst CUBE_SCALE = 1 / 3;\n\ninterface FaceletInfo {\n faceIdx: number;\n facelet: Mesh;\n hintFacelet?: Mesh;\n}\n\n// TODO: Compatibility with Randelshofer or standard net layout? Offer a\n// conversion function?\nconst pictureStickerCoords: Record<string, number[][][]> = {\n EDGES: [\n [\n [0, 4, 6],\n [0, 4, 5],\n ],\n [\n [3, 5, 7],\n [0, 7, 5],\n ],\n [\n [2, 4, 8],\n [0, 10, 5],\n ],\n [\n [1, 3, 7],\n [0, 1, 5],\n ],\n [\n [2, 4, 2],\n [2, 4, 3],\n ],\n [\n [3, 5, 1],\n [2, 7, 3],\n ],\n [\n [0, 4, 0],\n [2, 10, 3],\n ],\n [\n [1, 3, 1],\n [2, 1, 3],\n ],\n [\n [3, 5, 4],\n [3, 6, 4],\n ],\n [\n [1, 3, 4],\n [1, 2, 4],\n ],\n [\n [1, 9, 4],\n [1, 8, 4],\n ],\n [\n [3, 11, 4],\n [3, 0, 4],\n ],\n ],\n CORNERS: [\n [\n [0, 5, 6],\n [0, 5, 5],\n [0, 6, 5],\n ],\n [\n [3, 5, 8],\n [0, 8, 5],\n [0, 9, 5],\n ],\n [\n [2, 3, 8],\n [0, 11, 5],\n [0, 0, 5],\n ],\n [\n [1, 3, 6],\n [0, 2, 5],\n [0, 3, 5],\n ],\n [\n [3, 5, 2],\n [2, 6, 3],\n [2, 5, 3],\n ],\n [\n [2, 3, 2],\n [2, 3, 3],\n [2, 2, 3],\n ],\n [\n [1, 3, 0],\n [2, 0, 3],\n [2, 11, 3],\n ],\n [\n [0, 5, 0],\n [2, 9, 3],\n [2, 8, 3],\n ],\n ],\n CENTERS: [\n [[0, 4, 7]],\n [[0, 1, 4]],\n [[0, 4, 4]],\n [[0, 7, 4]],\n [[0, 10, 4]],\n [[0, 4, 1]],\n ],\n};\n\nlet sharedCubieFoundationGeometryCache: BoxGeometry | null = null;\nfunction sharedCubieFoundationGeometry(): BoxGeometry {\n return (\n sharedCubieFoundationGeometryCache ??\n (sharedCubieFoundationGeometryCache = new BoxGeometry(\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n ))\n );\n}\n\nfunction newStickerGeometry(): BufferGeometry {\n const r = new BufferGeometry();\n const half = 0.5;\n r.setAttribute(\n \"position\",\n new BufferAttribute(\n new Float32Array([\n half,\n half,\n 0,\n -half,\n half,\n 0,\n half,\n -half,\n 0,\n -half,\n half,\n 0,\n -half,\n -half,\n 0,\n half,\n -half,\n 0,\n ]),\n 3,\n ),\n );\n r.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1,\n ]),\n 2,\n ),\n );\n // r.setAttribute('normals', new BufferAttribute(new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), 3));\n return r;\n}\n\nlet sharedStickerGeometryCache: BufferGeometry | undefined;\nfunction sharedStickerGeometry(): BufferGeometry {\n return (sharedStickerGeometryCache ??= newStickerGeometry());\n}\n\n// TODO: Split into \"scene model\" and \"view\".\nexport class Cube3D extends Object3D implements Twisty3DPuzzle {\n kpuzzleFaceletInfo: Record<string, FaceletInfo[][]>;\n private pieces: PieceIndexed<Object3D> = {};\n private options: Cube3DOptions;\n // TODO: Keep track of option-based meshes better.\n private experimentalHintStickerMeshes: Mesh[] = [];\n private experimentalFoundationMeshes: Mesh[] = [];\n\n #setSpriteURL: ((url: string) => void) | undefined;\n private sprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.#setSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setSprite(texture: Texture): void {\n this.sprite = texture;\n }\n\n #setHintSpriteURL: ((url: string) => void) | undefined;\n private hintSprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.#setHintSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setHintSprite(texture: Texture): void {\n this.hintSprite = texture;\n }\n\n constructor(\n private kpuzzle: KPuzzle,\n private scheduleRenderCallback?: () => void,\n options: Cube3DOptions = {},\n ) {\n super();\n\n this.options = { ...cube3DOptionsDefaults };\n Object.assign(this.options, options); // TODO: check if this works\n\n if (this.kpuzzle.name() !== \"3x3x3\") {\n throw new Error(\n `Invalid puzzle for this Cube3D implementation: ${this.kpuzzle.name()}`,\n );\n }\n\n if (options.foundationSprite) {\n this.setSprite(options.foundationSprite);\n }\n if (options.hintSprite) {\n this.setHintSprite(options.hintSprite);\n }\n\n this.kpuzzleFaceletInfo = {};\n for (const orbit in pieceDefs) {\n const orbitFaceletInfo: FaceletInfo[][] = [];\n this.kpuzzleFaceletInfo[orbit] = orbitFaceletInfo;\n this.pieces[orbit] = pieceDefs[orbit].map(\n this.createCubie.bind(this, orbit, orbitFaceletInfo),\n );\n }\n this.scale.set(CUBE_SCALE, CUBE_SCALE, CUBE_SCALE);\n\n // TODO: Can we construct this directly instead of applying it later? Would that be more code-efficient?\n if (this.options.experimentalStickeringMask) {\n this.setStickeringMask(this.options.experimentalStickeringMask);\n }\n void this.#animateRaiseHintFacelets();\n\n if (this.options.faceletScale) {\n this.experimentalSetFaceletScale(this.options.faceletScale);\n }\n\n if (typeof this.options[\"hintFaceletsElevation\"] !== \"undefined\") {\n this.#elevationRequest = this.options.hintFaceletsElevation;\n }\n }\n\n #sharedHintStickerGeometryCache: BufferGeometry | undefined;\n #sharedHintStickerGeometry(): BufferGeometry {\n return (this.#sharedHintStickerGeometryCache ??= newStickerGeometry());\n }\n\n #elevationRequest: \"auto\" | number | undefined;\n setHintFaceletsElevation(elevation: \"auto\" | number) {\n if (elevation === this.#elevationRequest) {\n return;\n }\n this.#cancelAnimateRaiseHintSticker = true;\n this.#setHintFaceletsElevation(\n typeof elevation === \"number\"\n ? elevation\n : cubieDimensions.defaultHintStickerElevation,\n );\n this.#elevationRequest = elevation;\n }\n\n #lastHintStickerElevation = 0;\n #setHintFaceletsElevation(elevation: number) {\n this.#sharedHintStickerGeometry().translate(\n 0,\n 0,\n elevation - this.#lastHintStickerElevation,\n );\n this.#lastHintStickerElevation = elevation;\n }\n\n // TODO: support smooth physics\n #cancelAnimateRaiseHintSticker = false;\n // TODO: Generalize this into an animation mechanism.\n async #animateRaiseHintFacelets(): Promise<void> {\n if (\n this.options.initialHintFaceletsAnimation === \"none\" ||\n (this.options.initialHintFaceletsAnimation !== \"always\" &&\n haveStartedSharingRenderers())\n ) {\n return;\n }\n const targetElevation =\n typeof this.options.hintFaceletsElevation !== \"undefined\" &&\n this.options.hintFaceletsElevation !== \"auto\"\n ? this.options.hintFaceletsElevation\n : cubieDimensions.defaultHintStickerElevation;\n const translationRange = targetElevation - cubieDimensions.stickerElevation;\n this.#setHintFaceletsElevation(cubieDimensions.stickerElevation);\n\n // TODO: constant/config\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const hintStartTime = performance.now();\n // TODO: constant/config\n const translationDuration = 1000 as MillisecondTimestamp;\n function ease(x: number) {\n return x * (2 - x);\n }\n const animateRaiseHintSticker = () => {\n if (this.#cancelAnimateRaiseHintSticker) {\n return;\n }\n const elapsed = performance.now() - hintStartTime;\n const fraction = Math.min(elapsed / translationDuration, 1);\n const newTranslation =\n ease(fraction) * translationRange + cubieDimensions.stickerElevation;\n this.#setHintFaceletsElevation(newTranslation);\n\n this.scheduleRenderCallback?.();\n if (elapsed < translationDuration) {\n requestAnimationFrame(animateRaiseHintSticker);\n }\n };\n animateRaiseHintSticker();\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetStickerSpriteURL(stickerSpriteURL: string): void {\n this.#setSpriteURL?.(stickerSpriteURL);\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetHintStickerSpriteURL(hintStickerSpriteURL: string): void {\n this.#setHintSpriteURL?.(hintStickerSpriteURL);\n }\n\n setStickeringMask(stickeringMask: StickeringMask): void {\n if (stickeringMask.specialBehaviour === \"picture\") {\n // TODO: if the latest stickering mask was already \"picture\", don't redo work.\n for (const pieceInfos of Object.values(this.kpuzzleFaceletInfo)) {\n for (const faceletInfos of pieceInfos) {\n for (const faceletInfo of faceletInfos) {\n faceletInfo.facelet.material = invisibleMaterial;\n const { hintFacelet } = faceletInfo;\n if (hintFacelet) {\n hintFacelet.material = invisibleMaterial;\n }\n }\n }\n }\n return;\n }\n this.options.experimentalStickeringMask = stickeringMask;\n for (const [orbitName, orbitStickeringMask] of Object.entries(\n stickeringMask.orbits,\n )) {\n for (\n let pieceIdx = 0;\n pieceIdx < orbitStickeringMask.pieces.length;\n pieceIdx++\n ) {\n const pieceStickeringMask = orbitStickeringMask.pieces[pieceIdx];\n if (pieceStickeringMask) {\n const pieceInfo = this.kpuzzleFaceletInfo[orbitName][pieceIdx];\n for (\n let faceletIdx = 0;\n faceletIdx < pieceInfo.length;\n faceletIdx++\n ) {\n const faceletStickeringMask =\n pieceStickeringMask.facelets[faceletIdx];\n if (faceletStickeringMask) {\n const faceletInfo = pieceInfo[faceletIdx];\n\n const stickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? faceletStickeringMask\n : faceletStickeringMask?.mask;\n\n faceletInfo.facelet.material =\n axesInfo[faceletInfo.faceIdx].stickerMaterial[stickeringMask];\n // TODO\n const hintStickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? stickeringMask\n : (faceletStickeringMask.hintMask ?? stickeringMask);\n if (faceletInfo.hintFacelet) {\n faceletInfo.hintFacelet.material =\n axesInfo[faceletInfo.faceIdx].hintStickerMaterial[\n hintStickeringMask\n ];\n }\n }\n }\n }\n }\n }\n if (this.scheduleRenderCallback) {\n this.scheduleRenderCallback();\n }\n }\n\n /** @deprecated */\n public experimentalUpdateOptions(options: Cube3DOptions): void {\n if (\"showMainStickers\" in options) {\n throw new Error(\"Unimplemented\");\n }\n\n const showFoundation = options.showFoundation;\n if (\n typeof showFoundation !== \"undefined\" &&\n this.options.showFoundation !== showFoundation\n ) {\n this.options.showFoundation = showFoundation;\n for (const foundation of this.experimentalFoundationMeshes) {\n foundation.visible = showFoundation;\n }\n }\n\n const hintFacelets = options.hintFacelets;\n if (\n typeof hintFacelets !== \"undefined\" &&\n this.options.hintFacelets !== hintFacelets &&\n hintFaceletStyles[hintFacelets] // TODO: test this\n ) {\n this.options.hintFacelets = hintFacelets;\n for (const hintSticker of this.experimentalHintStickerMeshes) {\n hintSticker.visible = hintFacelets === \"floating\";\n }\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { experimentalStickeringMask } = options;\n if (typeof experimentalStickeringMask !== \"undefined\") {\n this.options.experimentalStickeringMask = experimentalStickeringMask;\n this.setStickeringMask(experimentalStickeringMask);\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { faceletScale } = options;\n if (typeof faceletScale !== \"undefined\") {\n this.experimentalSetFaceletScale(faceletScale);\n }\n\n const { hintFaceletsElevation } = options;\n if (typeof hintFaceletsElevation !== \"undefined\") {\n this.setHintFaceletsElevation(hintFaceletsElevation);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const reid333 = p.pattern;\n for (const orbit in pieceDefs) {\n const pieces = pieceDefs[orbit];\n for (let i = 0; i < pieces.length; i++) {\n const j = reid333.patternData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.copy(pieceDefs[orbit][i].matrix);\n this.pieces[orbit][j].matrix.multiply(\n orientationRotation[orbit][reid333.patternData[orbit].orientation[i]],\n );\n }\n for (const moveProgress of p.movesInProgress) {\n const move = moveProgress.move;\n const turnNormal = axesInfo[familyToAxis[move.family]].vector;\n const moveMatrix = new Matrix4().makeRotationAxis(\n turnNormal,\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n move.amount *\n TAU) /\n 4,\n );\n for (let i = 0; i < pieces.length; i++) {\n const quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n const k =\n quantumTransformation.transformationData[orbit].permutation[i];\n if (\n i !== k ||\n quantumTransformation.transformationData[orbit].orientationDelta[\n i\n ] !== 0\n ) {\n const j = reid333.patternData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.premultiply(moveMatrix);\n }\n }\n }\n }\n this.scheduleRenderCallback!();\n }\n\n // TODO: Always create (but sometimes hide parts) so we can show them later,\n // or (better) support creating puzzle parts on demand.\n private createCubie(\n orbit: string,\n orbitFacelets: FaceletInfo[][],\n piece: CubieDef,\n orbitPieceIdx: number,\n ): Object3D {\n const cubieFaceletInfo: FaceletInfo[] = [];\n orbitFacelets.push(cubieFaceletInfo);\n const cubie = new Group();\n if (this.options.showFoundation) {\n const foundation = this.createCubieFoundation();\n cubie.add(foundation);\n this.experimentalFoundationMeshes.push(foundation);\n }\n for (let i = 0; i < piece.stickerFaces.length; i++) {\n const sticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n false,\n );\n const faceletInfo: FaceletInfo = {\n faceIdx: piece.stickerFaces[i],\n facelet: sticker,\n };\n cubie.add(sticker);\n if (this.options.hintFacelets === \"floating\") {\n const hintSticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n true,\n );\n cubie.add(hintSticker);\n faceletInfo.hintFacelet = hintSticker;\n this.experimentalHintStickerMeshes.push(hintSticker);\n }\n\n if (\n this.options.experimentalStickeringMask?.specialBehaviour ===\n \"picture\" &&\n pictureStickerCoords[orbit] &&\n pictureStickerCoords[orbit][orbitPieceIdx] &&\n pictureStickerCoords[orbit][orbitPieceIdx][i]\n ) {\n const [rotate, offsetX, offsetY] =\n pictureStickerCoords[orbit][orbitPieceIdx][i];\n void (async () => {\n const addImageSticker = async (hint: boolean) => {\n const texture: Texture = await (hint\n ? this.hintSprite\n : this.sprite);\n\n const mesh = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n hint,\n );\n mesh.material = new MeshBasicMaterial({\n map: texture,\n side: hint ? BackSide : DoubleSide,\n transparent: true,\n });\n\n const x1 = offsetX / 12;\n const x2 = (offsetX + 1) / 12;\n const y1 = offsetY / 9;\n const y2 = (offsetY + 1) / 9;\n\n let v1 = new Vector2(x1, y1);\n let v2 = new Vector2(x1, y2);\n let v3 = new Vector2(x2, y2);\n let v4 = new Vector2(x2, y1);\n\n switch (rotate) {\n case 1: {\n [v1, v2, v3, v4] = [v2, v3, v4, v1];\n break;\n }\n case 2: {\n [v1, v2, v3, v4] = [v3, v4, v1, v2];\n break;\n }\n case 3: {\n [v1, v2, v3, v4] = [v4, v1, v2, v3];\n break;\n }\n }\n mesh.geometry.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n v3.x,\n v3.y,\n v2.x,\n v2.y,\n v4.x,\n v4.y,\n v2.x,\n v2.y,\n v1.x,\n v1.y,\n v4.x,\n v4.y,\n ]),\n 2,\n ),\n );\n cubie.add(mesh);\n };\n // const delay: number = ({\n // CENTERS: 1000,\n // EDGES: 2000,\n // CORNERS: 3500,\n // } as Record<string, number>)[orbit];\n // if (orbit === \"CENTERS\" && orbitPieceIdx === 5) {\n void addImageSticker(true);\n void addImageSticker(false);\n // } else {\n // await this.sprite;\n // await this.hintSprite;\n // setTimeout(\n // () => addImageSticker(true),\n // delay + orbitPieceIdx * 100,\n // );\n // setTimeout(\n // () => addImageSticker(false),\n // delay + orbitPieceIdx * 100,\n // );\n // }\n })();\n }\n\n cubieFaceletInfo.push(faceletInfo);\n }\n cubie.matrix.copy(piece.matrix);\n cubie.matrixAutoUpdate = false;\n this.add(cubie);\n return cubie;\n }\n\n // TODO: Support creating only the outward-facing parts?\n private createCubieFoundation(): Mesh {\n const box = sharedCubieFoundationGeometry();\n return new Mesh(\n box,\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? blackMesh\n : blackTranslucentMesh,\n );\n }\n\n private createSticker(\n posAxisInfo: AxisInfo,\n materialAxisInfo: AxisInfo,\n isHint: boolean,\n ): Mesh {\n const geo =\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? newStickerGeometry()\n : isHint\n ? this.#sharedHintStickerGeometry()\n : sharedStickerGeometry();\n const stickerMesh = new Mesh(\n geo,\n isHint\n ? materialAxisInfo.hintStickerMaterial.regular\n : materialAxisInfo.stickerMaterial.regular,\n );\n stickerMesh.setRotationFromEuler(posAxisInfo.fromZ);\n stickerMesh.position.copy(posAxisInfo.vector);\n\n const elevation = (() => {\n if (!isHint) {\n return cubieDimensions.stickerElevation;\n }\n if (typeof this.options.hintFaceletsElevation === \"number\") {\n return this.options.hintFaceletsElevation;\n }\n if (\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ) {\n return EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION;\n }\n return cubieDimensions.defaultHintStickerElevation;\n })();\n if (isHint) {\n this.#lastHintStickerElevation = elevation;\n }\n const scale = getFaceletScale(this.options);\n stickerMesh.scale.setX(scale);\n stickerMesh.scale.setY(scale);\n stickerMesh.translateZ(elevation - 1);\n return stickerMesh;\n }\n\n /** @deprecated */\n experimentalSetFoundationOpacity(opacity: number): void {\n (\n this.experimentalFoundationMeshes[0].material as MeshBasicMaterial\n ).opacity = opacity;\n }\n\n /** @deprecated */\n experimentalSetFaceletScale(faceletScale: FaceletScale): void {\n this.options.faceletScale = faceletScale;\n for (const orbitInfo of Object.values(this.kpuzzleFaceletInfo)) {\n for (const pieceInfo of orbitInfo) {\n for (const faceletInfo of pieceInfo) {\n const scale = getFaceletScale(this.options);\n faceletInfo.facelet.scale.setX(scale);\n faceletInfo.facelet.scale.setY(scale);\n faceletInfo.hintFacelet?.scale.setX(scale);\n faceletInfo.hintFacelet?.scale.setY(scale);\n // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n }\n }\n }\n }\n\n // /** @deprecated */\n // experimentalSetCenterStickerWidth(width: number): void {\n // for (const orbitInfo of [this.kpuzzleFaceletInfo[\"CENTERS\"]]) {\n // for (const pieceInfo of orbitInfo) {\n // for (const faceletInfo of pieceInfo) {\n // faceletInfo.facelet.scale.setScalar(\n // width / getStickerScale(this.options),\n // );\n // // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n // }\n // }\n // }\n // }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n}\n", "export function smootherStep(x: number): number {\n return x * x * x * (10 - x * (15 - 6 * x));\n}\n", "import { DoubleSide, FrontSide } from \"three/src/constants.js\";\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport type { Material } from \"three/src/materials/Material.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Group } from \"three/src/objects/Group.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport type { Texture } from \"three/src/textures/Texture.js\";\nimport { Move } from \"../../../../alg/index.ts\";\nimport type { KPuzzle, KTransformation } from \"../../../../kpuzzle/index.ts\";\nimport type {\n StickerDat,\n StickerDatAxis,\n StickerDatSticker,\n} from \"../../../../puzzle-geometry/index.ts\";\nimport type { TextureMapper } from \"../../../../puzzle-geometry/PuzzleGeometry.ts\";\nimport {\n type ExperimentalFaceletMeshStickeringMask,\n type ExperimentalStickeringMask,\n experimentalGetFaceletStickeringMask,\n} from \"../../../../puzzles/cubing-private/index.ts\";\nimport type { PuzzlePosition } from \"../../../controllers/AnimationTypes.ts\";\nimport { smootherStep } from \"../../../controllers/easing.ts\";\nimport type { HintFaceletStyle } from \"../../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport { TAU } from \"../TAU.ts\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle.ts\";\n\nconst foundationMaterial = new MeshBasicMaterial({\n side: DoubleSide,\n color: 0x000000,\n});\nconst invisMaterial = new MeshBasicMaterial({\n visible: false,\n});\nconst basicStickerMaterial = new MeshBasicMaterial({\n vertexColors: true,\n});\n\nfunction dist(coords: number[], a: number, b: number): number {\n return Math.hypot(\n coords[3 * a] - coords[3 * b],\n coords[3 * a + 1] - coords[3 * b + 1],\n coords[3 * a + 2] - coords[3 * b + 2],\n );\n}\n\nfunction triarea(coords: number[], a: number, b: number, c: number): number {\n const ab = dist(coords, a, b);\n const bc = dist(coords, b, c);\n const ac = dist(coords, a, c);\n const p = (ab + bc + ac) / 2;\n return Math.sqrt(p * (p - ab) * (p - bc) * (p - ac));\n}\n\nfunction polyarea(coords: number[]): number {\n let sum = 0;\n for (let i = 2; 3 * i < coords.length; i++) {\n sum += triarea(coords, 0, 1, i);\n }\n return sum;\n}\n\nfunction normalize(r: number[]): number[] {\n const m = Math.hypot(r[0], r[1], r[2]);\n r[0] /= m;\n r[1] /= m;\n r[2] /= m;\n return r;\n}\n\nfunction cross(a: number[], b: number[]): number[] {\n const r = new Array<number>(3);\n r[0] = a[1] * b[2] - a[2] * b[1];\n r[1] = a[2] * b[0] - a[0] * b[2];\n r[2] = a[0] * b[1] - a[1] * b[0];\n return r;\n}\n\nfunction normal(c: number[]): number[] {\n const a: number[] = [c[3] - c[0], c[4] - c[1], c[5] - c[2]];\n const b: number[] = [c[6] - c[3], c[7] - c[4], c[8] - c[5]];\n const r = cross(a, b);\n return normalize(r);\n}\n\nfunction trimEdges(face: number[], tr: number): number[] {\n const r: number[] = [];\n const A: number[] = new Array(3);\n const B: number[] = new Array(3);\n for (let iter = 1; iter < 10; iter++) {\n for (let i = 0; i < face.length; i += 3) {\n const pi = (i + face.length - 3) % face.length;\n const ni = (i + 3) % face.length;\n for (let k = 0; k < 3; k++) {\n A[k] = face[pi + k] - face[i + k];\n B[k] = face[ni + k] - face[i + k];\n }\n const alen = Math.hypot(A[0], A[1], A[2]);\n const blen = Math.hypot(B[0], B[1], B[2]);\n for (let k = 0; k < 3; k++) {\n A[k] /= alen;\n B[k] /= blen;\n }\n const d = A[0] * B[0] + A[1] * B[1] + A[2] * B[2];\n const m = tr / Math.sqrt(1 - d * d);\n for (let k = 0; k < 3; k++) {\n r[i + k] = face[i + k] + (A[k] + B[k]) * m;\n }\n }\n let good = true;\n for (let i = 0; good && i < r.length; i += 3) {\n const ni = (i + 3) % face.length;\n let t = 0;\n for (let k = 0; k < 3; k++) {\n const a = face[ni + k] - face[i + k];\n const b = r[ni + k] - r[i + k];\n t += a * b;\n }\n if (t <= 0) {\n good = false;\n }\n }\n if (good) {\n return r;\n }\n tr /= 2;\n }\n return face;\n}\n\nclass Filler {\n pos: number;\n ipos: number;\n vertices: Float32Array;\n colors: Uint8Array;\n uvs?: Float32Array;\n ind: Uint8Array;\n constructor(\n public sz: number,\n public tm: TextureMapper,\n ) {\n this.vertices = new Float32Array(9 * sz);\n this.uvs = undefined;\n this.colors = new Uint8Array(18 * sz);\n this.ind = new Uint8Array(sz);\n this.pos = 0;\n this.ipos = 0;\n }\n\n add(pt: number[], i: number, c: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.colors[this.pos] = c >> 16;\n this.colors[this.pos + 1] = (c >> 8) & 255;\n this.colors[this.pos + 2] = c & 255;\n this.pos += 3;\n }\n\n addUncolored(pt: number[], i: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.pos += 3;\n }\n\n setind(i: number) {\n this.ind[this.ipos++] = i;\n }\n\n makePoly(coords: number[], color: number, ind: number): void {\n const ncoords: number[] = coords;\n for (let g = 1; 3 * (g + 1) < ncoords.length; g++) {\n this.add(ncoords, 0, color);\n this.add(ncoords, g, color);\n this.add(ncoords, g + 1, color);\n this.setind(ind);\n }\n }\n\n setAttributes(geo: BufferGeometry) {\n geo.setAttribute(\"position\", new BufferAttribute(this.vertices, 3));\n // the geometry only needs the first half of the array\n const sa2 = this.colors.subarray(0, 9 * this.sz);\n geo.setAttribute(\"color\", new BufferAttribute(sa2, 3, true));\n }\n\n makeGroups(geo: BufferGeometry) {\n geo.clearGroups();\n for (let i = 0; i < this.ipos; ) {\n const si = i++;\n const iv = this.ind[si];\n while (this.ind[i] === iv) {\n i++;\n }\n geo.addGroup(3 * si, 3 * (i - si), iv);\n }\n }\n\n saveOriginalColors() {\n this.colors.copyWithin(this.pos, 0, this.pos);\n }\n}\n\nclass StickerDef {\n private origColor: number;\n private origColorStickeringMask: number;\n private faceColor: number;\n private texturePtr?: StickerDef = undefined;\n public twistVal: number = -1;\n public stickerStart: number;\n public stickerEnd: number;\n public hintStart?: number;\n public hintEnd?: number;\n public foundationStart?: number;\n public foundationEnd?: number;\n private isDup: boolean;\n private faceNum: number;\n constructor(\n filler: Filler,\n stickerDat: StickerDatSticker,\n trim: number,\n options?: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n },\n ) {\n this.isDup = !!stickerDat.isDup;\n this.faceNum = stickerDat.face;\n this.stickerStart = filler.ipos;\n const sdColor = new Color(stickerDat.color).getHex();\n this.origColor = sdColor;\n this.origColorStickeringMask = sdColor;\n if (options?.stickeringMask) {\n this.setStickeringMask(filler, options.stickeringMask);\n }\n this.faceColor = sdColor;\n const coords = this.stickerCoords(stickerDat.coords, trim);\n filler.makePoly(coords, this.faceColor, this.isDup ? 4 : 0);\n this.stickerEnd = filler.ipos;\n }\n\n private stickerCoords(coords: number[], trim: number): number[] {\n return trimEdges(coords.slice(), trim);\n }\n\n private hintCoords(\n coords: number[],\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): number[] {\n coords = this.stickerCoords(coords, trim); // pick up trim from stickers\n normal = normal.slice();\n for (let i = 0; i < 3; i++) {\n normal[i] *= 0.5 * hintStickerHeightScale;\n }\n const hCoords = new Array<number>(coords.length);\n for (let i = 0; 3 * i < coords.length; i++) {\n const j = coords.length / 3 - 1 - i;\n hCoords[3 * i] = coords[3 * j] + normal[0];\n hCoords[3 * i + 1] = coords[3 * j + 1] + normal[1];\n hCoords[3 * i + 2] = coords[3 * j + 2] + normal[2];\n }\n return hCoords;\n }\n\n private foundationCoords(coords: number[]): number[] {\n const ncoords = coords.slice();\n for (let i = 0; i < coords.length; i++) {\n ncoords[i] = coords[i] * 0.999;\n }\n return ncoords;\n }\n\n addHint(\n filler: Filler,\n stickerDat: StickerDatSticker,\n hintStickers: boolean,\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): void {\n this.hintStart = filler.ipos;\n const coords = this.hintCoords(\n stickerDat.coords,\n hintStickerHeightScale,\n trim,\n normal,\n );\n filler.makePoly(\n coords,\n this.faceColor,\n hintStickers && !this.isDup ? 2 : 4,\n );\n this.hintEnd = filler.ipos;\n }\n\n public addFoundation(\n filler: Filler,\n stickerDat: StickerDatSticker,\n black: number,\n ) {\n this.foundationStart = filler.ipos;\n const coords = this.foundationCoords(stickerDat.coords);\n filler.makePoly(coords, black, this.isDup ? 4 : 6);\n this.foundationEnd = filler.ipos;\n }\n\n private setHintStickers(filler: Filler, hintStickers: boolean): void {\n const indv = this.isDup || !hintStickers ? 4 : 2;\n // TODO: refactor to avoid non-null-assertions\n for (let i = this.hintStart!; i < this.hintEnd!; i++) {\n filler.ind[i] = indv | (filler.ind[i] & 1);\n }\n }\n\n setStickeringMask(\n filler: Filler,\n faceletMeshStickeringMask: ExperimentalFaceletMeshStickeringMask,\n ): void {\n let c = 0;\n switch (faceletMeshStickeringMask) {\n case \"regular\": {\n c = this.origColor;\n break;\n }\n case \"dim\": {\n if (this.origColor === 0xffffff) {\n c = 0xdddddd;\n } else {\n c = new Color(this.origColor).multiplyScalar(0.5).getHex();\n }\n break;\n }\n case \"oriented\": {\n c = 0x44ddcc;\n break;\n }\n case \"experimentalOriented2\": {\n c = 0xfffdaa;\n break;\n }\n case \"ignored\": {\n c = 0x444444;\n break;\n }\n case \"mystery\": {\n c = 0xf2cbcb;\n break;\n }\n case \"invisible\":\n c = this.origColor;\n }\n this.origColorStickeringMask = c;\n for (let i = 9 * this.stickerStart; i < 9 * this.stickerEnd; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n // TODO: refactor to avoid non-null-assertions\n for (let i = 9 * this.hintStart!; i < 9 * this.hintEnd!; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n this.setHintStickers(\n filler,\n faceletMeshStickeringMask !== \"invisible\" && !this.isDup,\n );\n }\n\n public addUVs(filler: Filler): void {\n const uvs = filler.uvs!;\n const vert = filler.vertices;\n const coords = new Array(3);\n for (let i = 3 * this.stickerStart; i < 3 * this.stickerEnd; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n // TODO: refactor to avoid non-null-assertions\n for (let i = 3 * this.hintStart!; i < 3 * this.hintEnd!; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n }\n\n public setTexture(filler: Filler, sd: StickerDef): number {\n if (this.texturePtr === sd) {\n return 0;\n }\n this.texturePtr = sd;\n const sz = 6 * filler.sz;\n filler.uvs!.copyWithin(\n 6 * this.stickerStart,\n 6 * sd.stickerStart + sz,\n 6 * sd.stickerEnd + sz,\n );\n filler.uvs!.copyWithin(\n 6 * this.hintStart!, // TODO: refactor to avoid non-null-assertion\n 6 * sd.hintStart! + sz, // TODO: refactor to avoid non-null-assertion\n 6 * sd.hintEnd! + sz, // TODO: refactor to avoid non-null-assertion\n );\n return 1;\n }\n\n public setColor(filler: Filler, sd: StickerDef): number {\n const c = sd.origColorStickeringMask;\n if (this.faceColor !== c) {\n this.faceColor = c;\n const sz = filler.pos;\n filler.colors.copyWithin(\n 9 * this.stickerStart,\n 9 * sd.stickerStart + sz,\n 9 * sd.stickerEnd + sz,\n );\n filler.colors.copyWithin(\n 9 * this.hintStart!, // TODO: refactor to avoid non-null-assertion\n 9 * sd.hintStart! + sz, // TODO: refactor to avoid non-null-assertion\n 9 * sd.hintEnd! + sz, // TODO: refactor to avoid non-null-assertion\n );\n return 1;\n } else {\n return 0;\n }\n }\n}\n\nclass HitPlaneDef {\n public cubie: Group;\n private geo: BufferGeometry;\n constructor(hitface: any, tm: TextureMapper, stickerDat: StickerDat) {\n this.cubie = new Group();\n const coords = hitface.coords as number[];\n const filler = new Filler(coords.length / 3 - 2, tm);\n for (let g = 1; 3 * g + 3 < coords.length; g++) {\n filler.addUncolored(coords, 0);\n filler.addUncolored(coords, g);\n filler.addUncolored(coords, g + 1);\n }\n this.geo = new BufferGeometry();\n filler.setAttributes(this.geo);\n const obj = new Mesh(this.geo, invisMaterial);\n obj.userData[\"quantumMove\"] = stickerDat.notationMapper.notationToExternal(\n new Move(hitface.name),\n );\n this.cubie.scale.setScalar(0.99);\n this.cubie.add(obj);\n }\n}\n\nclass AxisInfo {\n public axis: Vector3;\n public order: number;\n constructor(axisDat: StickerDatAxis) {\n const vec = axisDat.coordinates;\n this.axis = new Vector3(vec[0], vec[1], vec[2]);\n this.order = axisDat.order;\n }\n}\n\nexport interface PG3DOptions {\n stickeringMask?: ExperimentalStickeringMask;\n}\n\nconst DEFAULT_COLOR_FRACTION = 0.71;\nconst PG_SCALE = 0.5;\n\n// TODO: Split into \"scene model\" and \"view\".\n/*\n * PG3D uses a single geometry for the puzzle, with all the faces for\n * each sticker (including the foundation stickers) in a single\n * geometry. We use the materialIndex in the face to point to a\n * specific entry, which is either a colored sticker, invisible, or\n * black (foundation).\n *\n * To support general twisting of a subset of the puzzle, we then\n * instantiate this same geometry in two different meshes with two\n * distinct material arrays. One, the fixed mesh, has the material\n * array set up like: [colored, invisible, black, invisible].\n * The twisting mesh has the material array set up as\n * [invisible, colored, invislble, black]. When not twisted, the\n * two meshes are directly coincident, and the (shared) materialIndex\n * in each face points to a non-invisible material in exactly one of\n * the two meshes. When we decide to twist some cubies, we make\n * the cubies that move point to visible materials in the moving\n * mesh (which makes them point to invisible materials in the static\n * mesh). This way, we only need to rotate the moving mesh as a\n * single object---this should be very fast, and occur entirely in\n * the GPU. Unfortunately this doesn't quite work as fast as we'd\n * like because three.js makes a draw call every time we have a change\n * in the material index. By moving the foundation triangles separate\n * from the sticker triangles, we enhance the probability that many\n * triangles can be rendered in one call speeding up the render.\n * We also get some assistance from puzzleGeometry to try to keep\n * nearby stickers close to each other.\n */\nexport class PG3D extends Object3D implements Twisty3DPuzzle {\n private stickers: { [key: string]: StickerDef[][] };\n private axesInfo: { [key: string]: AxisInfo };\n\n private stickerTargets: Object3D[] = [];\n private controlTargets: Object3D[] = [];\n\n private movingObj: Object3D;\n private filler: Filler;\n private foundationBound: number; // before this: colored; after: black\n private fixedGeo: BufferGeometry;\n private lastPos?: PuzzlePosition;\n private lastMoveTransformation?: KTransformation;\n private hintMaterial: Material;\n private stickerMaterial: Material;\n private materialArray1: Material[];\n private materialArray2: Material[];\n private textured: boolean = false;\n private showHintStickers: boolean = false;\n private showFoundations: boolean = false;\n private hintMaterialDisposable: boolean;\n private stickerMaterialDisposable: boolean;\n\n #pendingStickeringUpdate: boolean = false;\n\n constructor(\n private scheduleRenderCallback: () => void,\n private kpuzzle: KPuzzle,\n private stickerDat: StickerDat,\n enableFoundationOpt: boolean = false,\n enableHintStickersOpt: boolean = false,\n hintStickerHeightScale: number = 1,\n private faceletScale: \"auto\" | number = 1,\n private params: PG3DOptions = {},\n ) {\n super();\n if (stickerDat.stickers.length === 0) {\n throw Error(\"Reuse of stickerdat from pg; please don't do that.\");\n }\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: 0.5,\n });\n this.hintMaterialDisposable = true;\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n this.axesInfo = {};\n const axesDef = this.stickerDat.axis;\n for (const axis of axesDef) {\n this.axesInfo[axis.quantumMove.family] = new AxisInfo(axis);\n }\n const stickers = this.stickerDat.stickers as any[];\n this.stickers = {};\n this.materialArray1 = new Array(8);\n this.materialArray2 = new Array(8);\n // TODO: the argument enableFoundationOpt really means, do we ever want to display\n // foundations. But it is presently *used* to mean, show foundations initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the foundations. What this means is the geometry always \"pays\"\n // for foundations, even if they aren't displayed.\n this.showFoundation(enableFoundationOpt);\n enableFoundationOpt = true;\n let triangleCount = 0;\n const multiplier = 3;\n for (const sticker of stickers) {\n const sides = sticker.coords.length / 3;\n triangleCount += multiplier * (sides - 2);\n }\n const filler = new Filler(triangleCount, stickerDat.textureMapper);\n const black = 0;\n const normals: number[][] = [];\n let totArea = 0;\n for (const f of stickerDat.faces) {\n normals.push(normal(f.coords));\n totArea += polyarea(f.coords);\n }\n const colorfrac =\n faceletScale !== \"auto\"\n ? faceletScale * faceletScale\n : DEFAULT_COLOR_FRACTION;\n let nonDupStickers = 0;\n for (const sticker of stickers) {\n if (!sticker.isDup) {\n nonDupStickers++;\n }\n }\n const trim =\n (Math.sqrt(totArea / nonDupStickers) * (1 - Math.sqrt(colorfrac))) / 2;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (!this.stickers[orbit]) {\n this.stickers[orbit] = [];\n }\n if (!this.stickers[orbit][ori]) {\n this.stickers[orbit][ori] = [];\n }\n const options: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n } = {};\n if (params.stickeringMask) {\n options.stickeringMask = experimentalGetFaceletStickeringMask(\n params.stickeringMask,\n orbit,\n ord,\n ori,\n false,\n );\n }\n const stickerdef = new StickerDef(filler, sticker, trim, options);\n this.stickers[orbit][ori][ord] = stickerdef;\n }\n // TODO: the argument enableHintStickersOpt really means, do we ever want to display\n // hint stickers. But it is presently *used* to mean, show hint stickers initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the hint stickers. What this means is the geometry always \"pays\"\n // for hint stickers, even if they aren't displayed.\n this.showHintStickers = enableHintStickersOpt;\n enableHintStickersOpt = true;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n this.stickers[orbit][ori][ord].addHint(\n filler,\n sticker,\n enableHintStickersOpt,\n hintStickerHeightScale,\n trim,\n normals[sticker.face],\n );\n }\n this.foundationBound = filler.ipos;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (enableFoundationOpt) {\n this.stickers[orbit][ori][ord].addFoundation(filler, sticker, black);\n }\n }\n const fixedGeo = new BufferGeometry();\n filler.setAttributes(fixedGeo);\n filler.makeGroups(fixedGeo);\n const obj = new Mesh(fixedGeo, this.materialArray1);\n obj.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj);\n const obj2 = new Mesh(fixedGeo, this.materialArray2);\n obj2.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj2);\n const hitfaces = this.stickerDat.faces as any[];\n this.movingObj = obj2;\n this.fixedGeo = fixedGeo;\n this.filler = filler;\n for (const hitface of hitfaces) {\n const facedef = new HitPlaneDef(\n hitface,\n stickerDat.textureMapper,\n this.stickerDat,\n );\n facedef.cubie.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(facedef.cubie);\n this.controlTargets.push(facedef.cubie.children[0]);\n }\n filler.saveOriginalColors();\n stickerDat.stickers = []; // don't need these anymore\n this.updateMaterialArrays();\n /*\n this.experimentalUpdateTexture(\n true,\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red.png\",\n ),\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red-hint.png\",\n ),\n );\n */\n }\n\n public dispose(): void {\n if (this.fixedGeo) {\n this.fixedGeo.dispose();\n }\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterial = basicStickerMaterial;\n this.hintMaterialDisposable = false;\n }\n }\n\n public experimentalGetStickerTargets(): Object3D[] {\n return this.stickerTargets;\n }\n\n public experimentalGetControlTargets(): Object3D[] {\n return this.controlTargets;\n }\n\n #isValidMove(move: Move): boolean {\n try {\n this.kpuzzle.moveToTransformation(move);\n return true;\n } catch (_) {\n return false;\n }\n }\n\n getClosestMoveToAxis(\n point: Vector3,\n transformations: {\n invert: boolean;\n depth?: \"secondSlice\" | \"rotation\" | \"none\";\n },\n ): { move: Move; order: number } | null {\n let closestMove: Move | null = null;\n let closestMoveDotProduct: number = 0;\n\n let modify: (move: Move) => Move = (m) => m;\n switch (transformations.depth) {\n case \"secondSlice\": {\n modify = (m: Move) => m.modified({ innerLayer: 2 });\n break;\n }\n case \"rotation\": {\n modify = (m: Move) => m.modified({ family: `${m.family}v` });\n break;\n }\n }\n\n for (const axis of this.stickerDat.axis) {\n const product = point.dot(new Vector3(...axis.coordinates));\n if (product > closestMoveDotProduct) {\n const modified = this.stickerDat.notationMapper.notationToExternal(\n modify(axis.quantumMove),\n );\n if (!modified) {\n continue;\n }\n // Special case: for the FTO, there is a rotation that is defined\n // as T. This is a rotation (without the v), and it does not have\n // a v on the end nor does it correspond to a geometry. So, if\n // depth is \"none\", we'll pick up \"T\" as a normal move; we\n // shouldn't.\n console.log(modified.family);\n if (modified.family === \"T\" && transformations.depth === \"none\") {\n continue;\n }\n if (this.#isValidMove(modified)) {\n closestMoveDotProduct = product;\n closestMove = modified;\n }\n }\n }\n\n if (!closestMove) {\n return null;\n }\n\n if (transformations.invert) {\n closestMove = closestMove.invert();\n }\n const order = this.kpuzzle\n .moveToTransformation(closestMove)\n .repetitionOrder();\n return { move: closestMove, order }; // TODO: push this down\n }\n\n setStickeringMask(stickeringMask: ExperimentalStickeringMask): void {\n this.params.stickeringMask = stickeringMask;\n if (stickeringMask.specialBehaviour !== \"picture\") {\n for (const orbitDefinition of this.kpuzzle.definition.orbits) {\n // This isn't strictly necessary, but it keeps the following lines more\n // readable by fitting each `for` loop onto a single line when running\n // `make format`.\n const { numPieces, numOrientations } = orbitDefinition;\n for (let pieceIdx = 0; pieceIdx < numPieces; pieceIdx++) {\n for (let faceletIdx = 0; faceletIdx < numOrientations; faceletIdx++) {\n const faceletStickeringMask = experimentalGetFaceletStickeringMask(\n stickeringMask,\n orbitDefinition.orbitName,\n pieceIdx,\n faceletIdx,\n false,\n );\n const stickerDef =\n this.stickers[orbitDefinition.orbitName][faceletIdx][pieceIdx];\n if (\n this.textured &&\n this.hintMaterialDisposable &&\n faceletStickeringMask === \"invisible\"\n ) {\n // ignore \"invisible\" if textured hints\n } else {\n stickerDef.setStickeringMask(this.filler, faceletStickeringMask);\n }\n }\n }\n }\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const { pattern } = p;\n const noRotation = new Euler();\n this.movingObj.rotation.copy(noRotation);\n let colormods = 0;\n const filler = this.filler;\n const ind = filler.ind;\n if (\n !this.lastPos ||\n this.#pendingStickeringUpdate ||\n !this.lastPos.pattern.isIdentical(pattern)\n ) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const pos2 = pattern.patternData[orbit];\n const orin = pieces.length;\n if (orin === 1) {\n const pieces2 = pieces[0];\n for (let i = 0; i < pieces2.length; i++) {\n const ni = pos2.pieces[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces2[ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces2[ni]);\n }\n }\n } else {\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const nori = (ori + orin - pos2.orientation[i]) % orin;\n const ni = pos2.pieces[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces[nori][ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces[nori][ni]);\n }\n }\n }\n }\n }\n this.lastPos = p;\n }\n let vismods = 0;\n for (const moveProgress of p.movesInProgress) {\n const externalMove = moveProgress.move;\n // TODO: unswizzle goes external to internal, and so does the call after that\n // and so does the stateForBlockMove call\n const unswizzled = this.stickerDat.unswizzle(externalMove);\n if (!unswizzled) {\n // bad times, but let's not throw.\n return;\n }\n\n const move = externalMove;\n let quantumTransformation: KTransformation | undefined;\n try {\n quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n } catch (e) {\n // couldn't get it from a quantum of the external move. Let's try\n // getting it from a quantum of the internal move, translated back\n // to external so we can get the transformation. This happens for\n // instance when working with \"x2\" on megaminx.\n const move1 = this.stickerDat.notationMapper.notationToInternal(move);\n if (move1) {\n const move2 = this.stickerDat.notationMapper.notationToExternal(\n move1.modified({ amount: 1 }),\n );\n if (move2) {\n quantumTransformation = this.kpuzzle.moveToTransformation(move2);\n }\n }\n if (!quantumTransformation) {\n console.log(e);\n throw e;\n }\n }\n const ax = this.axesInfo[unswizzled.family];\n const turnNormal = ax.axis;\n const angle =\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n unswizzled.amount *\n TAU) /\n ax.order;\n this.movingObj.rotateOnAxis(turnNormal, angle);\n if (this.lastMoveTransformation !== quantumTransformation) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n const bmv = quantumTransformation.transformationData[orbit];\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const p2 = pieces2[i];\n const ni = bmv.permutation[i];\n let tv = 0;\n if (ni !== i || bmv.orientationDelta[i] !== 0) {\n tv = 1;\n }\n if (tv !== p2.twistVal) {\n if (tv) {\n for (let j = p2.stickerStart; j < p2.stickerEnd; j++) {\n ind[j] |= 1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (let j = p2.hintStart!; j < p2.hintEnd!; j++) {\n ind[j] |= 1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (\n let j = p2.foundationStart!;\n j < p2.foundationEnd!;\n j++\n ) {\n ind[j] |= 1;\n }\n } else {\n for (let j = p2.stickerStart!; j < p2.stickerEnd; j++) {\n ind[j] &= ~1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (let j = p2.hintStart!; j < p2.hintEnd!; j++) {\n ind[j] &= ~1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (\n let j = p2.foundationStart!;\n j < p2.foundationEnd!;\n j++\n ) {\n ind[j] &= ~1;\n }\n }\n p2.twistVal = tv;\n vismods++;\n }\n }\n }\n }\n this.lastMoveTransformation = quantumTransformation;\n }\n }\n if (this.#pendingStickeringUpdate || vismods) {\n this.filler.makeGroups(this.fixedGeo);\n }\n if (this.#pendingStickeringUpdate || colormods) {\n if (this.textured) {\n (this.fixedGeo.getAttribute(\"uv\") as BufferAttribute).addUpdateRange(\n 0,\n 6 * this.foundationBound,\n );\n (this.fixedGeo.getAttribute(\"uv\") as BufferAttribute).needsUpdate =\n true;\n }\n if (this.#pendingStickeringUpdate || !this.textured) {\n (this.fixedGeo.getAttribute(\"color\") as BufferAttribute).addUpdateRange(\n 0,\n 9 * this.foundationBound,\n );\n (this.fixedGeo.getAttribute(\"color\") as BufferAttribute).needsUpdate =\n true;\n }\n }\n this.scheduleRenderCallback();\n this.#pendingStickeringUpdate = false;\n }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n\n private showHintFacelets(v: boolean) {\n this.showHintStickers = v;\n }\n\n private updateMaterialArrays() {\n for (let i = 0; i < 8; i++) {\n this.materialArray1[i] = invisMaterial;\n this.materialArray2[i] = invisMaterial;\n }\n this.materialArray1[0] = this.stickerMaterial;\n this.materialArray2[1] = this.stickerMaterial;\n if (this.showHintStickers) {\n this.materialArray1[2] = this.hintMaterial;\n this.materialArray2[3] = this.hintMaterial;\n } else {\n this.materialArray1[2] = invisMaterial;\n this.materialArray2[3] = invisMaterial;\n }\n if (this.showFoundations) {\n this.materialArray1[6] = foundationMaterial;\n this.materialArray2[7] = foundationMaterial;\n } else {\n this.materialArray1[6] = invisMaterial;\n this.materialArray2[7] = invisMaterial;\n }\n }\n\n private showFoundation(v: boolean) {\n this.showFoundations = v;\n }\n\n private setHintStickerOpacity(v: number): void {\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (v === 0) {\n this.hintMaterial = invisMaterial;\n } else if (v === 1) {\n this.hintMaterial = this.stickerMaterial;\n } else {\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: v,\n });\n this.hintMaterialDisposable = true;\n }\n }\n\n public experimentalUpdateOptions(options: {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n hintStickerOpacity?: number;\n faceletScale?: \"auto\" | number;\n }): void {\n if (options.hintFacelets !== undefined) {\n this.showHintFacelets(options.hintFacelets !== \"none\");\n }\n if (options.showFoundation !== undefined) {\n this.showFoundation(options.showFoundation);\n }\n if (options.hintStickerOpacity !== undefined) {\n this.setHintStickerOpacity(options.hintStickerOpacity);\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n if (\n typeof options.faceletScale !== \"undefined\" &&\n options.faceletScale !== this.faceletScale\n ) {\n console.warn(\n \"Dynamic facelet scale is not yet supported for PG3D. For now, re-create the TwistyPlayer to change the facelet scale.\",\n );\n }\n this.updateMaterialArrays();\n this.scheduleRenderCallback();\n }\n\n private adduvs() {\n const filler = this.filler;\n if (filler.uvs) {\n return;\n }\n this.filler.uvs = new Float32Array(12 * filler.sz);\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (const piece2 of pieces2) {\n piece2.addUVs(this.filler);\n }\n }\n }\n filler.uvs!.copyWithin(6 * filler.sz, 0, 6 * filler.sz);\n const sa1 = filler.uvs!.subarray(0, 6 * filler.sz);\n this.fixedGeo.setAttribute(\"uv\", new BufferAttribute(sa1, 2, true));\n }\n\n public experimentalUpdateTexture(\n enabled: boolean,\n stickerTexture?: Texture | null,\n hintTexture?: Texture | null,\n ) {\n if (!stickerTexture) {\n enabled = false;\n }\n if (enabled && !this.filler.uvs) {\n this.adduvs();\n }\n this.textured = enabled;\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterialDisposable = false;\n }\n if (enabled) {\n this.stickerMaterial = new MeshBasicMaterial({\n map: stickerTexture,\n side: FrontSide,\n transparent: false,\n });\n this.stickerMaterialDisposable = true;\n } else {\n this.stickerMaterial = basicStickerMaterial;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (enabled) {\n this.hintMaterial = new MeshBasicMaterial({\n map: hintTexture,\n side: FrontSide,\n transparent: true,\n });\n this.hintMaterialDisposable = true;\n } else {\n this.hintMaterial = basicStickerMaterial;\n }\n if (enabled) {\n this.showHintFacelets(hintTexture !== null);\n }\n this.updateMaterialArrays();\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n this.scheduleRenderCallback();\n }\n}\n", "import { cube3x3x3, type PuzzleLoader } from \"../../../puzzles/index.ts\";\nimport type { FaceletScale } from \"../../model/props/puzzle/display/FaceletScaleProp.ts\";\nimport type { HintFaceletStyle } from \"../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport { Cube3D, type Cube3DOptions } from \"../../views/3D/puzzles/Cube3D.ts\";\nimport { PG3D } from \"../../views/3D/puzzles/PG3D.ts\";\n\n// TODO: figure out how to load these dynamically without a bottleneck.\nexport { PerspectiveCamera as ThreePerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nexport { Raycaster as ThreeRaycaster } from \"three/src/core/Raycaster.js\";\nexport { TextureLoader as ThreeTextureLoader } from \"three/src/loaders/TextureLoader.js\";\nexport { Spherical as ThreeSpherical } from \"three/src/math/Spherical.js\";\nexport { Vector2 as ThreeVector2 } from \"three/src/math/Vector2.js\";\nexport { Vector3 as ThreeVector3 } from \"three/src/math/Vector3.js\";\nexport { WebGLRenderer as ThreeWebGLRenderer } from \"three/src/renderers/WebGLRenderer.js\";\nexport { Scene as ThreeScene } from \"three/src/scenes/Scene.js\";\n\nexport { Cube3D } from \"../../views/3D/puzzles/Cube3D.ts\";\nexport { PG3D } from \"../../views/3D/puzzles/PG3D.ts\";\nexport { Twisty3DScene } from \"../../views/3D/Twisty3DScene.ts\";\n\nexport async function cube3DShim(\n renderCallback: () => void,\n options?: Cube3DOptions,\n): Promise<Cube3D> {\n return new Cube3D(await cube3x3x3.kpuzzle(), renderCallback, options);\n}\n\n// TODO: take loader?\nexport async function pg3dShim(\n renderCallback: () => void,\n puzzleLoader: PuzzleLoader,\n hintFacelets: HintFaceletStyle,\n faceletScale: FaceletScale,\n darkIgnoredOrbits: boolean,\n): Promise<PG3D> {\n return new PG3D(\n renderCallback,\n await puzzleLoader.kpuzzle(),\n (await puzzleLoader.pg!()).get3d({ darkIgnoredOrbits }),\n true,\n hintFacelets === \"floating\",\n undefined,\n faceletScale,\n );\n}\n", "import type { Scene as ThreeScene } from \"three/src/Three.js\";\nimport { bulk3DCode } from \"../../heavy-code-imports/3d.ts\";\nimport type { Twisty3DPuzzle } from \"./puzzles/Twisty3DPuzzle.ts\";\nimport type { Twisty3DRenderTarget } from \"./Twisty3DRenderTarget.ts\";\n\nexport class Twisty3DScene implements Twisty3DRenderTarget {\n private renderTargets: Set<Twisty3DRenderTarget> = new Set();\n public twisty3Ds: Set<Twisty3DPuzzle> = new Set();\n\n threeJSScene: Promise<ThreeScene> = (async () =>\n new (await bulk3DCode).ThreeScene())();\n\n addRenderTarget(renderTarget: Twisty3DRenderTarget): void {\n this.renderTargets.add(renderTarget);\n }\n\n scheduleRender(): void {\n for (const renderTarget of this.renderTargets) {\n renderTarget.scheduleRender();\n }\n }\n\n async addTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.add(twisty3DPuzzle);\n (await this.threeJSScene).add(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async removeTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.delete(twisty3DPuzzle);\n (await this.threeJSScene).remove(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async clearPuzzles(): Promise<void> {\n for (const puz of this.twisty3Ds) {\n (await this.threeJSScene).remove(puz);\n }\n this.twisty3Ds.clear();\n // TODO: scheduleRender?\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU,YAAY,iBAAiB;AAChD,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,YAAY;;;ACdd,SAAS,aAAa,GAAmB;AAC9C,SAAO,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI;AACzC;;;ADmCA,IAAM,YAAY,IAAI,cAAc;AAEpC,IAAM,kBAAkB,IAAI,kBAAkB;AAAA,EAC5C,OAAO,IAAI,MAAM,OAAQ,EAAE,oBAAoB;AACjD,CAAC;AAED,IAAM,sBAAsB,IAAI,kBAAkB;AAAA,EAChD,OAAO,IAAI,MAAM,QAAQ,EAAE,oBAAoB;AAAA,EAC/C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,oBAAoB,IAAI,kBAAkB;AAAA,EAC9C,SAAS;AACX,CAAC;AAED,IAAM,mBAAmB,IAAI,kBAAkB;AAAA,EAC7C,OAAO;AACT,CAAC;AAED,IAAM,uBAAuB,IAAI,kBAAkB;AAAA,EACjD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,gCAAgC,IAAI,kBAAkB;AAAA,EAC1D,OAAO;AACT,CAAC;AAED,IAAM,oCAAoC,IAAI,kBAAkB;AAAA,EAC9D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,kBAAkB,IAAI,kBAAkB;AAAA,EAC5C,OAAO;AACT,CAAC;AAED,IAAM,qBAAqB,IAAI,kBAAkB;AAAA,EAC/C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAUD,IAAM,WAAN,MAAe;AAAA,EAGb,YACS,QACA,OACA,OACA,UACA,kBACP,SACA;AANO;AACA;AACA;AACA;AACA;AAGP,UAAM,kBAAkB,IAAI,MAAM,KAAK,EAAE,oBAAoB;AAC7D,UAAM,qBAAqB,IAAI,MAAM,QAAQ,EAAE,oBAAoB;AAEnE,SAAK,kBAAkB;AAAA,MACrB,SAAS,IAAI,kBAAkB;AAAA,QAC7B,OAAO;AAAA,QACP,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,MACD,KAAK,IAAI,kBAAkB;AAAA,QACzB,OAAO;AAAA,QACP,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,MACD,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AACA,SAAK,sBAAsB;AAAA,MACzB,SAAS,IAAI,kBAAkB;AAAA,QAC7B,OAAO,IAAI,MAAM,SAAS,aAAa,KAAK,EAAE,oBAAoB;AAAA,QAClE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,KAAK,IAAI,kBAAkB;AAAA,QACzB,OAAO,IAAI;AAAA,UACT,SAAS,gBAAgB;AAAA,QAC3B,EAAE,oBAAoB;AAAA,QACtB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EA9CS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAPF;AAAA,EACA;AAiDT;AAEA,IAAM,WAAuB;AAAA,EAC3B,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,IACpB,IAAI,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,QAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,GAAG,GAAG,CAAC;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,MAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,QAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,EAAE;AAAA,IACpB,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,KAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,IACpB,IAAI,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,SAAS;AAAA,EAC3B;AACF;AAEA,IAAM,OAAgC;AAAA,EACpC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,eAAwC;AAAA,EAC5C,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AACb;AAEA,IAAM,kBAAkB;AAAA;AAAA,EAEtB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,6BAA6B;AAC/B;AACA,IAAM,2CAA2C;AAcjD,IAAM,wBAAuC;AAAA,EAC3C,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,8BAA8B;AAAA,EAC9B,cAAc;AAAA,EACd,uBAAuB;AACzB;AAEA,IAAM,wBAAwB;AAC9B,SAAS,gBAAgB,SAAgC;AACvD,MACE,OAAO,QAAQ,iBAAiB,eAChC,QAAQ,iBAAiB,QACzB;AACA,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAGA,IAAM,YAAY,IAAI,kBAAkB;AAAA,EACtC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAED,IAAM,uBAAuB,IAAI,kBAAkB;AAAA,EACjD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAED,IAAM,WAAN,MAAe;AAAA;AAAA,EAIb,YACS,OACP,kBACA,GACA;AAHO;AAIP,UAAM,6BACJ,OAAO,qBAAqB,WACxB,iBAAiB,MAAM,EAAE,IACzB;AACN,SAAK,eAAe,2BAA2B,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AACjE,SAAK,SAAS,IAAI,QAAQ;AAC1B,SAAK,OAAO,YAAY,mBAAmB,KAAK,CAAC;AACjD,SAAK,OAAO,YAAY,IAAI,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AAAA,EACrE;AAAA,EAZS;AAAA,EAJF;AAAA,EACA;AAgBT;AAEA,SAAS,EAAE,GAAY,IAAwB;AAC7C,SAAO,IAAI,WAAW,EAAE,iBAAiB,GAAI,MAAM,KAAM,CAAC;AAC5D;AAEA,IAAM,IAAI;AAAA,EACR,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,EACvB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,GAAG,EAAE;AAAA,EACvB,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,EACvB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AACxB;AAOA,IAAM,qBAA4C;AAAA,EAChD,OAAO,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EAC1B,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EAC5B,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC;AAC9B;AACA,IAAM,sBAA+C;AAAA,EACnD,OAAO,CAAC,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACjB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,OAAO,EAAE,MAAM,EAAE,UAAU;AAAA,MAC7C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACtB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,SAAS,EAAE,MAAM,EAAE,UAAU;AAAA,MAC/C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACzB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,SAAS,EAAE,MAAM,EAAE,UAAU;AAAA,MAC/C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AACF;AACA,IAAM,oBAAoB,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AAE1D,IAAM,YAAoC;AAAA,EACxC,OAAO;AAAA,IACL,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,SAAS;AAAA,IACP,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EACjE;AAAA,EACA,SAAS;AAAA,IACP,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACtC,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACtC,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,EACxC;AACF;AAEA,IAAM,aAAa,IAAI;AAUvB,IAAM,uBAAqD;AAAA,EACzD,OAAO;AAAA,IACL;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,IAAI,CAAC;AAAA,MACT,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,MACT,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,IACX,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,EACZ;AACF;AAEA,IAAI,qCAAyD;AAC7D,SAAS,gCAA6C;AACpD,SACE,uCACC,qCAAqC,IAAI;AAAA,IACxC,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAEJ;AAEA,SAAS,qBAAqC;AAC5C,QAAMA,KAAI,IAAI,eAAe;AAC7B,QAAM,OAAO;AACb,EAAAA,GAAE;AAAA,IACA;AAAA,IACA,IAAI;AAAA,MACF,IAAI,aAAa;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACA,EAAAA,GAAE;AAAA,IACA;AAAA,IACA,IAAI;AAAA,MACF,IAAI,aAAa;AAAA,QACf;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,MACvE,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAEA,SAAOA;AACT;AAEA,IAAI;AACJ,SAAS,wBAAwC;AAC/C,SAAQ,+BAA+B,mBAAmB;AAC5D;AAGO,IAAM,SAAN,cAAqB,SAAmC;AAAA,EAkC7D,YACU,SACA,wBACR,UAAyB,CAAC,GAC1B;AACA,UAAM;AAJE;AACA;AAKR,SAAK,UAAU,EAAE,GAAG,sBAAsB;AAC1C,WAAO,OAAO,KAAK,SAAS,OAAO;AAEnC,QAAI,KAAK,QAAQ,KAAK,MAAM,SAAS;AACnC,YAAM,IAAI;AAAA,QACR,kDAAkD,KAAK,QAAQ,KAAK,CAAC;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,WAAK,UAAU,QAAQ,gBAAgB;AAAA,IACzC;AACA,QAAI,QAAQ,YAAY;AACtB,WAAK,cAAc,QAAQ,UAAU;AAAA,IACvC;AAEA,SAAK,qBAAqB,CAAC;AAC3B,eAAW,SAAS,WAAW;AAC7B,YAAM,mBAAoC,CAAC;AAC3C,WAAK,mBAAmB,KAAK,IAAI;AACjC,WAAK,OAAO,KAAK,IAAI,UAAU,KAAK,EAAE;AAAA,QACpC,KAAK,YAAY,KAAK,MAAM,OAAO,gBAAgB;AAAA,MACrD;AAAA,IACF;AACA,SAAK,MAAM,IAAI,YAAY,YAAY,UAAU;AAGjD,QAAI,KAAK,QAAQ,4BAA4B;AAC3C,WAAK,kBAAkB,KAAK,QAAQ,0BAA0B;AAAA,IAChE;AACA,SAAK,KAAK,0BAA0B;AAEpC,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,4BAA4B,KAAK,QAAQ,YAAY;AAAA,IAC5D;AAEA,QAAI,OAAO,KAAK,QAAQ,uBAAuB,MAAM,aAAa;AAChE,WAAK,oBAAoB,KAAK,QAAQ;AAAA,IACxC;AAAA,EACF;AAAA,EA7CU;AAAA,EACA;AAAA,EAnCV;AAAA,EACQ,SAAiC,CAAC;AAAA,EAClC;AAAA;AAAA,EAEA,gCAAwC,CAAC;AAAA,EACzC,+BAAuC,CAAC;AAAA,EAEhD;AAAA,EACQ,SAAqC,IAAI,QAAQ,CAAC,YAAY;AACpE,SAAK,gBAAgB,CAAC,QAAsB;AAC1C,gBAAU,KAAK,KAAK,OAAO;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA;AAAA;AAAA,EAID,UAAU,SAAwB;AAChC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA;AAAA,EACQ,aAAyC,IAAI,QAAQ,CAAC,YAAY;AACxE,SAAK,oBAAoB,CAAC,QAAsB;AAC9C,gBAAU,KAAK,KAAK,OAAO;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA;AAAA;AAAA,EAID,cAAc,SAAwB;AACpC,SAAK,aAAa;AAAA,EACpB;AAAA,EAkDA;AAAA,EACA,6BAA6C;AAC3C,WAAQ,KAAK,oCAAoC,mBAAmB;AAAA,EACtE;AAAA,EAEA;AAAA,EACA,yBAAyB,WAA4B;AACnD,QAAI,cAAc,KAAK,mBAAmB;AACxC;AAAA,IACF;AACA,SAAK,iCAAiC;AACtC,SAAK;AAAA,MACH,OAAO,cAAc,WACjB,YACA,gBAAgB;AAAA,IACtB;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,4BAA4B;AAAA,EAC5B,0BAA0B,WAAmB;AAC3C,SAAK,2BAA2B,EAAE;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAY,KAAK;AAAA,IACnB;AACA,SAAK,4BAA4B;AAAA,EACnC;AAAA;AAAA,EAGA,iCAAiC;AAAA;AAAA,EAEjC,MAAM,4BAA2C;AAC/C,QACE,KAAK,QAAQ,iCAAiC,UAC7C,KAAK,QAAQ,iCAAiC,YAC7C,4BAA4B,GAC9B;AACA;AAAA,IACF;AACA,UAAM,kBACJ,OAAO,KAAK,QAAQ,0BAA0B,eAC9C,KAAK,QAAQ,0BAA0B,SACnC,KAAK,QAAQ,wBACb,gBAAgB;AACtB,UAAM,mBAAmB,kBAAkB,gBAAgB;AAC3D,SAAK,0BAA0B,gBAAgB,gBAAgB;AAG/D,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAEvD,UAAM,gBAAgB,YAAY,IAAI;AAEtC,UAAM,sBAAsB;AAC5B,aAAS,KAAK,GAAW;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,UAAM,0BAA0B,MAAM;AACpC,UAAI,KAAK,gCAAgC;AACvC;AAAA,MACF;AACA,YAAM,UAAU,YAAY,IAAI,IAAI;AACpC,YAAM,WAAW,KAAK,IAAI,UAAU,qBAAqB,CAAC;AAC1D,YAAM,iBACJ,KAAK,QAAQ,IAAI,mBAAmB,gBAAgB;AACtD,WAAK,0BAA0B,cAAc;AAE7C,WAAK,yBAAyB;AAC9B,UAAI,UAAU,qBAAqB;AACjC,8BAAsB,uBAAuB;AAAA,MAC/C;AAAA,IACF;AACA,4BAAwB;AAAA,EAC1B;AAAA;AAAA;AAAA,EAIA,gCAAgC,kBAAgC;AAC9D,SAAK,gBAAgB,gBAAgB;AAAA,EACvC;AAAA;AAAA;AAAA,EAIA,oCAAoC,sBAAoC;AACtE,SAAK,oBAAoB,oBAAoB;AAAA,EAC/C;AAAA,EAEA,kBAAkB,gBAAsC;AACtD,QAAI,eAAe,qBAAqB,WAAW;AAEjD,iBAAW,cAAc,OAAO,OAAO,KAAK,kBAAkB,GAAG;AAC/D,mBAAW,gBAAgB,YAAY;AACrC,qBAAW,eAAe,cAAc;AACtC,wBAAY,QAAQ,WAAW;AAC/B,kBAAM,EAAE,YAAY,IAAI;AACxB,gBAAI,aAAa;AACf,0BAAY,WAAW;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,SAAK,QAAQ,6BAA6B;AAC1C,eAAW,CAAC,WAAW,mBAAmB,KAAK,OAAO;AAAA,MACpD,eAAe;AAAA,IACjB,GAAG;AACD,eACM,WAAW,GACf,WAAW,oBAAoB,OAAO,QACtC,YACA;AACA,cAAM,sBAAsB,oBAAoB,OAAO,QAAQ;AAC/D,YAAI,qBAAqB;AACvB,gBAAM,YAAY,KAAK,mBAAmB,SAAS,EAAE,QAAQ;AAC7D,mBACM,aAAa,GACjB,aAAa,UAAU,QACvB,cACA;AACA,kBAAM,wBACJ,oBAAoB,SAAS,UAAU;AACzC,gBAAI,uBAAuB;AACzB,oBAAM,cAAc,UAAU,UAAU;AAExC,oBAAMC,kBACJ,OAAO,0BAA0B,WAC7B,wBACA,uBAAuB;AAE7B,0BAAY,QAAQ,WAClB,SAAS,YAAY,OAAO,EAAE,gBAAgBA,eAAc;AAE9D,oBAAM,qBACJ,OAAO,0BAA0B,WAC7BA,kBACC,sBAAsB,YAAYA;AACzC,kBAAI,YAAY,aAAa;AAC3B,4BAAY,YAAY,WACtB,SAAS,YAAY,OAAO,EAAE,oBAC5B,kBACF;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGO,0BAA0B,SAA8B;AAC7D,QAAI,sBAAsB,SAAS;AACjC,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AAEA,UAAM,iBAAiB,QAAQ;AAC/B,QACE,OAAO,mBAAmB,eAC1B,KAAK,QAAQ,mBAAmB,gBAChC;AACA,WAAK,QAAQ,iBAAiB;AAC9B,iBAAW,cAAc,KAAK,8BAA8B;AAC1D,mBAAW,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ;AAC7B,QACE,OAAO,iBAAiB,eACxB,KAAK,QAAQ,iBAAiB,gBAC9B,kBAAkB,YAAY,GAC9B;AACA,WAAK,QAAQ,eAAe;AAC5B,iBAAW,eAAe,KAAK,+BAA+B;AAC5D,oBAAY,UAAU,iBAAiB;AAAA,MACzC;AACA,WAAK,uBAAwB;AAAA,IAC/B;AAEA,UAAM,EAAE,2BAA2B,IAAI;AACvC,QAAI,OAAO,+BAA+B,aAAa;AACrD,WAAK,QAAQ,6BAA6B;AAC1C,WAAK,kBAAkB,0BAA0B;AACjD,WAAK,uBAAwB;AAAA,IAC/B;AAEA,UAAM,EAAE,aAAa,IAAI;AACzB,QAAI,OAAO,iBAAiB,aAAa;AACvC,WAAK,4BAA4B,YAAY;AAAA,IAC/C;AAEA,UAAM,EAAE,sBAAsB,IAAI;AAClC,QAAI,OAAO,0BAA0B,aAAa;AAChD,WAAK,yBAAyB,qBAAqB;AAAA,IACrD;AAAA,EACF;AAAA,EAEO,iBAAiB,GAAyB;AAC/C,UAAM,UAAU,EAAE;AAClB,eAAW,SAAS,WAAW;AAC7B,YAAM,SAAS,UAAU,KAAK;AAC9B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,IAAI,QAAQ,YAAY,KAAK,EAAE,OAAO,CAAC;AAC7C,aAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,KAAK,UAAU,KAAK,EAAE,CAAC,EAAE,MAAM;AAC5D,aAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO;AAAA,UAC3B,oBAAoB,KAAK,EAAE,QAAQ,YAAY,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,QACtE;AAAA,MACF;AACA,iBAAW,gBAAgB,EAAE,iBAAiB;AAC5C,cAAM,OAAO,aAAa;AAC1B,cAAM,aAAa,SAAS,aAAa,KAAK,MAAM,CAAC,EAAE;AACvD,cAAM,aAAa,IAAI,QAAQ,EAAE;AAAA,UAC/B;AAAA,UACC,CAAC,KAAK,KAAK,aAAa,QAAQ,IAC/B,aAAa,YACb,KAAK,SACL,MACA;AAAA,QACJ;AACA,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,wBAAwB,KAAK,QAAQ;AAAA,YACzC,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,UAC7B;AACA,gBAAM,IACJ,sBAAsB,mBAAmB,KAAK,EAAE,YAAY,CAAC;AAC/D,cACE,MAAM,KACN,sBAAsB,mBAAmB,KAAK,EAAE,iBAC9C,CACF,MAAM,GACN;AACA,kBAAM,IAAI,QAAQ,YAAY,KAAK,EAAE,OAAO,CAAC;AAC7C,iBAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,YAAY,UAAU;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,uBAAwB;AAAA,EAC/B;AAAA;AAAA;AAAA,EAIQ,YACN,OACA,eACA,OACA,eACU;AACV,UAAM,mBAAkC,CAAC;AACzC,kBAAc,KAAK,gBAAgB;AACnC,UAAM,QAAQ,IAAI,MAAM;AACxB,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,YAAM,aAAa,KAAK,sBAAsB;AAC9C,YAAM,IAAI,UAAU;AACpB,WAAK,6BAA6B,KAAK,UAAU;AAAA,IACnD;AACA,aAAS,IAAI,GAAG,IAAI,MAAM,aAAa,QAAQ,KAAK;AAClD,YAAM,UAAU,KAAK;AAAA,QACnB,SAAS,kBAAkB,CAAC,CAAC;AAAA,QAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,QAC9B;AAAA,MACF;AACA,YAAM,cAA2B;AAAA,QAC/B,SAAS,MAAM,aAAa,CAAC;AAAA,QAC7B,SAAS;AAAA,MACX;AACA,YAAM,IAAI,OAAO;AACjB,UAAI,KAAK,QAAQ,iBAAiB,YAAY;AAC5C,cAAM,cAAc,KAAK;AAAA,UACvB,SAAS,kBAAkB,CAAC,CAAC;AAAA,UAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,UAC9B;AAAA,QACF;AACA,cAAM,IAAI,WAAW;AACrB,oBAAY,cAAc;AAC1B,aAAK,8BAA8B,KAAK,WAAW;AAAA,MACrD;AAEA,UACE,KAAK,QAAQ,4BAA4B,qBACvC,aACF,qBAAqB,KAAK,KAC1B,qBAAqB,KAAK,EAAE,aAAa,KACzC,qBAAqB,KAAK,EAAE,aAAa,EAAE,CAAC,GAC5C;AACA,cAAM,CAAC,QAAQ,SAAS,OAAO,IAC7B,qBAAqB,KAAK,EAAE,aAAa,EAAE,CAAC;AAC9C,cAAM,YAAY;AAChB,gBAAM,kBAAkB,OAAO,SAAkB;AAC/C,kBAAM,UAAmB,OAAO,OAC5B,KAAK,aACL,KAAK;AAET,kBAAM,OAAO,KAAK;AAAA,cAChB,SAAS,kBAAkB,CAAC,CAAC;AAAA,cAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,cAC9B;AAAA,YACF;AACA,iBAAK,WAAW,IAAI,kBAAkB;AAAA,cACpC,KAAK;AAAA,cACL,MAAM,OAAO,WAAW;AAAA,cACxB,aAAa;AAAA,YACf,CAAC;AAED,kBAAM,KAAK,UAAU;AACrB,kBAAM,MAAM,UAAU,KAAK;AAC3B,kBAAM,KAAK,UAAU;AACrB,kBAAM,MAAM,UAAU,KAAK;AAE3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAE3B,oBAAQ,QAAQ;AAAA,cACd,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,cACA,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,cACA,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,YACF;AACA,iBAAK,SAAS;AAAA,cACZ;AAAA,cACA,IAAI;AAAA,gBACF,IAAI,aAAa;AAAA,kBACf,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,gBACL,CAAC;AAAA,gBACD;AAAA,cACF;AAAA,YACF;AACA,kBAAM,IAAI,IAAI;AAAA,UAChB;AAOA,eAAK,gBAAgB,IAAI;AACzB,eAAK,gBAAgB,KAAK;AAAA,QAa5B,GAAG;AAAA,MACL;AAEA,uBAAiB,KAAK,WAAW;AAAA,IACnC;AACA,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,UAAM,mBAAmB;AACzB,SAAK,IAAI,KAAK;AACd,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,wBAA8B;AACpC,UAAM,MAAM,8BAA8B;AAC1C,WAAO,IAAI;AAAA,MACT;AAAA,MACA,KAAK,QAAQ,4BAA4B,qBAAqB,YAC1D,YACA;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,cACN,aACA,kBACA,QACM;AACN,UAAM,MACJ,KAAK,QAAQ,4BAA4B,qBAAqB,YAC1D,mBAAmB,IACnB,SACE,KAAK,2BAA2B,IAChC,sBAAsB;AAC9B,UAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,SACI,iBAAiB,oBAAoB,UACrC,iBAAiB,gBAAgB;AAAA,IACvC;AACA,gBAAY,qBAAqB,YAAY,KAAK;AAClD,gBAAY,SAAS,KAAK,YAAY,MAAM;AAE5C,UAAM,aAAa,MAAM;AACvB,UAAI,CAAC,QAAQ;AACX,eAAO,gBAAgB;AAAA,MACzB;AACA,UAAI,OAAO,KAAK,QAAQ,0BAA0B,UAAU;AAC1D,eAAO,KAAK,QAAQ;AAAA,MACtB;AACA,UACE,KAAK,QAAQ,4BAA4B,qBAAqB,WAC9D;AACA,eAAO;AAAA,MACT;AACA,aAAO,gBAAgB;AAAA,IACzB,GAAG;AACH,QAAI,QAAQ;AACV,WAAK,4BAA4B;AAAA,IACnC;AACA,UAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,gBAAY,MAAM,KAAK,KAAK;AAC5B,gBAAY,MAAM,KAAK,KAAK;AAC5B,gBAAY,WAAW,YAAY,CAAC;AACpC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iCAAiC,SAAuB;AACtD,IACE,KAAK,6BAA6B,CAAC,EAAE,SACrC,UAAU;AAAA,EACd;AAAA;AAAA,EAGA,4BAA4B,cAAkC;AAC5D,SAAK,QAAQ,eAAe;AAC5B,eAAW,aAAa,OAAO,OAAO,KAAK,kBAAkB,GAAG;AAC9D,iBAAW,aAAa,WAAW;AACjC,mBAAW,eAAe,WAAW;AACnC,gBAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,sBAAY,QAAQ,MAAM,KAAK,KAAK;AACpC,sBAAY,QAAQ,MAAM,KAAK,KAAK;AACpC,sBAAY,aAAa,MAAM,KAAK,KAAK;AACzC,sBAAY,aAAa,MAAM,KAAK,KAAK;AAAA,QAG3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,KAAK,UAA0B;AACrC,WAAO,aAAa,QAAQ;AAAA,EAC9B;AACF;;;AE/mCA,SAAS,cAAAC,aAAY,aAAAC,kBAAiB;AACtC,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,YAAAC,iBAAgB;AAEzB,SAAS,qBAAAC,0BAAyB;AAClC,SAAS,SAAAC,cAAa;AACtB,SAAS,SAAAC,cAAa;AACtB,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAAC,cAAa;AACtB,SAAS,QAAAC,aAAY;AAqBrB,IAAM,qBAAqB,IAAIC,mBAAkB;AAAA,EAC/C,MAAMC;AAAA,EACN,OAAO;AACT,CAAC;AACD,IAAM,gBAAgB,IAAID,mBAAkB;AAAA,EAC1C,SAAS;AACX,CAAC;AACD,IAAM,uBAAuB,IAAIA,mBAAkB;AAAA,EACjD,cAAc;AAChB,CAAC;AAED,SAAS,KAAK,QAAkB,GAAW,GAAmB;AAC5D,SAAO,KAAK;AAAA,IACV,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC;AAAA,IAC5B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,IACpC,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,EACtC;AACF;AAEA,SAAS,QAAQ,QAAkB,GAAW,GAAW,GAAmB;AAC1E,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,SAAO,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,GAAG;AACrD;AAEA,SAAS,SAAS,QAA0B;AAC1C,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,WAAO,QAAQ,QAAQ,GAAG,GAAG,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,UAAUE,IAAuB;AACxC,QAAM,IAAI,KAAK,MAAMA,GAAE,CAAC,GAAGA,GAAE,CAAC,GAAGA,GAAE,CAAC,CAAC;AACrC,EAAAA,GAAE,CAAC,KAAK;AACR,EAAAA,GAAE,CAAC,KAAK;AACR,EAAAA,GAAE,CAAC,KAAK;AACR,SAAOA;AACT;AAEA,SAAS,MAAM,GAAa,GAAuB;AACjD,QAAMA,KAAI,IAAI,MAAc,CAAC;AAC7B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,SAAOA;AACT;AAEA,SAAS,OAAO,GAAuB;AACrC,QAAM,IAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,QAAM,IAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,QAAMA,KAAI,MAAM,GAAG,CAAC;AACpB,SAAO,UAAUA,EAAC;AACpB;AAEA,SAAS,UAAUC,OAAgB,IAAsB;AACvD,QAAMD,KAAc,CAAC;AACrB,QAAM,IAAc,IAAI,MAAM,CAAC;AAC/B,QAAM,IAAc,IAAI,MAAM,CAAC;AAC/B,WAAS,OAAO,GAAG,OAAO,IAAI,QAAQ;AACpC,aAAS,IAAI,GAAG,IAAIC,MAAK,QAAQ,KAAK,GAAG;AACvC,YAAM,MAAM,IAAIA,MAAK,SAAS,KAAKA,MAAK;AACxC,YAAM,MAAM,IAAI,KAAKA,MAAK;AAC1B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAE,CAAC,IAAIA,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AAChC,UAAE,CAAC,IAAIA,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AAAA,MAClC;AACA,YAAM,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,YAAM,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAE,CAAC,KAAK;AACR,UAAE,CAAC,KAAK;AAAA,MACV;AACA,YAAM,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAChD,YAAM,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC;AAClC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAAD,GAAE,IAAI,CAAC,IAAIC,MAAK,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,QAAQ,IAAID,GAAE,QAAQ,KAAK,GAAG;AAC5C,YAAM,MAAM,IAAI,KAAKC,MAAK;AAC1B,UAAIC,KAAI;AACR,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,IAAID,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AACnC,cAAM,IAAID,GAAE,KAAK,CAAC,IAAIA,GAAE,IAAI,CAAC;AAC7B,QAAAE,MAAK,IAAI;AAAA,MACX;AACA,UAAIA,MAAK,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM;AACR,aAAOF;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,SAAOC;AACT;AAEA,IAAM,SAAN,MAAa;AAAA,EAOX,YACS,IACA,IACP;AAFO;AACA;AAEP,SAAK,WAAW,IAAI,aAAa,IAAI,EAAE;AACvC,SAAK,MAAM;AACX,SAAK,SAAS,IAAI,WAAW,KAAK,EAAE;AACpC,SAAK,MAAM,IAAI,WAAW,EAAE;AAC5B,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AAAA,EATS;AAAA,EACA;AAAA,EART;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAaA,IAAI,IAAc,GAAW,GAAW;AACtC,SAAK,SAAS,KAAK,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AACtC,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,OAAO,KAAK,GAAG,IAAI,KAAK;AAC7B,SAAK,OAAO,KAAK,MAAM,CAAC,IAAK,KAAK,IAAK;AACvC,SAAK,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI;AAChC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,aAAa,IAAc,GAAW;AACpC,SAAK,SAAS,KAAK,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AACtC,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO,GAAW;AAChB,SAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,SAAS,QAAkB,OAAe,KAAmB;AAC3D,UAAM,UAAoB;AAC1B,aAAS,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,QAAQ,KAAK;AACjD,WAAK,IAAI,SAAS,GAAG,KAAK;AAC1B,WAAK,IAAI,SAAS,GAAG,KAAK;AAC1B,WAAK,IAAI,SAAS,IAAI,GAAG,KAAK;AAC9B,WAAK,OAAO,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,cAAc,KAAqB;AACjC,QAAI,aAAa,YAAY,IAAIE,iBAAgB,KAAK,UAAU,CAAC,CAAC;AAElE,UAAM,MAAM,KAAK,OAAO,SAAS,GAAG,IAAI,KAAK,EAAE;AAC/C,QAAI,aAAa,SAAS,IAAIA,iBAAgB,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,WAAW,KAAqB;AAC9B,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ;AAC/B,YAAM,KAAK;AACX,YAAM,KAAK,KAAK,IAAI,EAAE;AACtB,aAAO,KAAK,IAAI,CAAC,MAAM,IAAI;AACzB;AAAA,MACF;AACA,UAAI,SAAS,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,OAAO,WAAW,KAAK,KAAK,GAAG,KAAK,GAAG;AAAA,EAC9C;AACF;AAEA,IAAM,aAAN,MAAiB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAA0B;AAAA,EAC3B,WAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EACA;AAAA,EACR,YACE,QACA,YACA,MACA,SAGA;AACA,SAAK,QAAQ,CAAC,CAAC,WAAW;AAC1B,SAAK,UAAU,WAAW;AAC1B,SAAK,eAAe,OAAO;AAC3B,UAAM,UAAU,IAAIC,OAAM,WAAW,KAAK,EAAE,OAAO;AACnD,SAAK,YAAY;AACjB,SAAK,0BAA0B;AAC/B,QAAI,SAAS,gBAAgB;AAC3B,WAAK,kBAAkB,QAAQ,QAAQ,cAAc;AAAA,IACvD;AACA,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK,cAAc,WAAW,QAAQ,IAAI;AACzD,WAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,QAAQ,IAAI,CAAC;AAC1D,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA,EAEQ,cAAc,QAAkB,MAAwB;AAC9D,WAAO,UAAU,OAAO,MAAM,GAAG,IAAI;AAAA,EACvC;AAAA,EAEQ,WACN,QACA,wBACA,MACAC,SACU;AACV,aAAS,KAAK,cAAc,QAAQ,IAAI;AACxC,IAAAA,UAASA,QAAO,MAAM;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,QAAO,CAAC,KAAK,MAAM;AAAA,IACrB;AACA,UAAM,UAAU,IAAI,MAAc,OAAO,MAAM;AAC/C,aAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,YAAM,IAAI,OAAO,SAAS,IAAI,IAAI;AAClC,cAAQ,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAIA,QAAO,CAAC;AACzC,cAAQ,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,IAAIA,QAAO,CAAC;AACjD,cAAQ,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,IAAIA,QAAO,CAAC;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAA4B;AACnD,UAAM,UAAU,OAAO,MAAM;AAC7B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,CAAC,IAAI,OAAO,CAAC,IAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QACE,QACA,YACA,cACA,wBACA,MACAA,SACM;AACN,SAAK,YAAY,OAAO;AACxB,UAAM,SAAS,KAAK;AAAA,MAClB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACAA;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,CAAC,KAAK,QAAQ,IAAI;AAAA,IACpC;AACA,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAEO,cACL,QACA,YACA,OACA;AACA,SAAK,kBAAkB,OAAO;AAC9B,UAAM,SAAS,KAAK,iBAAiB,WAAW,MAAM;AACtD,WAAO,SAAS,QAAQ,OAAO,KAAK,QAAQ,IAAI,CAAC;AACjD,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AAAA,EAEQ,gBAAgB,QAAgB,cAA6B;AACnE,UAAM,OAAO,KAAK,SAAS,CAAC,eAAe,IAAI;AAE/C,aAAS,IAAI,KAAK,WAAY,IAAI,KAAK,SAAU,KAAK;AACpD,aAAO,IAAI,CAAC,IAAI,OAAQ,OAAO,IAAI,CAAC,IAAI;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,kBACE,QACA,2BACM;AACN,QAAI,IAAI;AACR,YAAQ,2BAA2B;AAAA,MACjC,KAAK,WAAW;AACd,YAAI,KAAK;AACT;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,YAAI,KAAK,cAAc,UAAU;AAC/B,cAAI;AAAA,QACN,OAAO;AACL,cAAI,IAAID,OAAM,KAAK,SAAS,EAAE,eAAe,GAAG,EAAE,OAAO;AAAA,QAC3D;AACA;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,yBAAyB;AAC5B,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK;AAAA,IACb;AACA,SAAK,0BAA0B;AAC/B,aAAS,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,KAAK,GAAG;AACnE,aAAO,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK;AACrC,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAK,KAAK,IAAK;AAC/C,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI;AAAA,IAC1C;AAEA,aAAS,IAAI,IAAI,KAAK,WAAY,IAAI,IAAI,KAAK,SAAU,KAAK,GAAG;AAC/D,aAAO,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK;AACrC,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAK,KAAK,IAAK;AAC/C,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI;AAAA,IAC1C;AACA,SAAK;AAAA,MACH;AAAA,MACA,8BAA8B,eAAe,CAAC,KAAK;AAAA,IACrD;AAAA,EACF;AAAA,EAEO,OAAO,QAAsB;AAClC,UAAM,MAAM,OAAO;AACnB,UAAM,OAAO,OAAO;AACpB,UAAM,SAAS,IAAI,MAAM,CAAC;AAC1B,aAAS,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,KAAK;AAChE,aAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AACtB,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,YAAM,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,MAAM;AAC/C,UAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AACjB,UAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AAAA,IACvB;AAEA,aAAS,IAAI,IAAI,KAAK,WAAY,IAAI,IAAI,KAAK,SAAU,KAAK;AAC5D,aAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AACtB,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,YAAM,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,MAAM;AAC/C,UAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AACjB,UAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,WAAW,QAAgB,IAAwB;AACxD,QAAI,KAAK,eAAe,IAAI;AAC1B,aAAO;AAAA,IACT;AACA,SAAK,aAAa;AAClB,UAAM,KAAK,IAAI,OAAO;AACtB,WAAO,IAAK;AAAA,MACV,IAAI,KAAK;AAAA,MACT,IAAI,GAAG,eAAe;AAAA,MACtB,IAAI,GAAG,aAAa;AAAA,IACtB;AACA,WAAO,IAAK;AAAA,MACV,IAAI,KAAK;AAAA;AAAA,MACT,IAAI,GAAG,YAAa;AAAA;AAAA,MACpB,IAAI,GAAG,UAAW;AAAA;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,QAAgB,IAAwB;AACtD,UAAM,IAAI,GAAG;AACb,QAAI,KAAK,cAAc,GAAG;AACxB,WAAK,YAAY;AACjB,YAAM,KAAK,OAAO;AAClB,aAAO,OAAO;AAAA,QACZ,IAAI,KAAK;AAAA,QACT,IAAI,GAAG,eAAe;AAAA,QACtB,IAAI,GAAG,aAAa;AAAA,MACtB;AACA,aAAO,OAAO;AAAA,QACZ,IAAI,KAAK;AAAA;AAAA,QACT,IAAI,GAAG,YAAa;AAAA;AAAA,QACpB,IAAI,GAAG,UAAW;AAAA;AAAA,MACpB;AACA,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,cAAN,MAAkB;AAAA,EACT;AAAA,EACC;AAAA,EACR,YAAY,SAAc,IAAmB,YAAwB;AACnE,SAAK,QAAQ,IAAIE,OAAM;AACvB,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG,EAAE;AACnD,aAAS,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC9C,aAAO,aAAa,QAAQ,CAAC;AAC7B,aAAO,aAAa,QAAQ,CAAC;AAC7B,aAAO,aAAa,QAAQ,IAAI,CAAC;AAAA,IACnC;AACA,SAAK,MAAM,IAAIC,gBAAe;AAC9B,WAAO,cAAc,KAAK,GAAG;AAC7B,UAAM,MAAM,IAAIC,MAAK,KAAK,KAAK,aAAa;AAC5C,QAAI,SAAS,aAAa,IAAI,WAAW,eAAe;AAAA,MACtD,IAAI,KAAK,QAAQ,IAAI;AAAA,IACvB;AACA,SAAK,MAAM,MAAM,UAAU,IAAI;AAC/B,SAAK,MAAM,IAAI,GAAG;AAAA,EACpB;AACF;AAEA,IAAMC,YAAN,MAAe;AAAA,EACN;AAAA,EACA;AAAA,EACP,YAAY,SAAyB;AACnC,UAAM,MAAM,QAAQ;AACpB,SAAK,OAAO,IAAIC,SAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,QAAQ,QAAQ;AAAA,EACvB;AACF;AAMA,IAAM,yBAAyB;AAC/B,IAAM,WAAW;AA+BV,IAAM,OAAN,cAAmBC,UAAmC;AAAA,EAyB3D,YACU,wBACA,SACA,YACR,sBAA+B,OAC/B,wBAAiC,OACjC,yBAAiC,GACzB,eAAgC,GAChC,SAAsB,CAAC,GAC/B;AACA,UAAM;AATE;AACA;AACA;AAIA;AACA;AAGR,QAAI,WAAW,SAAS,WAAW,GAAG;AACpC,YAAM,MAAM,oDAAoD;AAAA,IAClE;AACA,SAAK,eAAe,IAAIb,mBAAkB;AAAA,MACxC,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,SAAK,yBAAyB;AAC9B,SAAK,kBAAkB;AACvB,SAAK,4BAA4B;AACjC,SAAK,WAAW,CAAC;AACjB,UAAM,UAAU,KAAK,WAAW;AAChC,eAAW,QAAQ,SAAS;AAC1B,WAAK,SAAS,KAAK,YAAY,MAAM,IAAI,IAAIW,UAAS,IAAI;AAAA,IAC5D;AACA,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,WAAW,CAAC;AACjB,SAAK,iBAAiB,IAAI,MAAM,CAAC;AACjC,SAAK,iBAAiB,IAAI,MAAM,CAAC;AAOjC,SAAK,eAAe,mBAAmB;AACvC,0BAAsB;AACtB,QAAI,gBAAgB;AACpB,UAAM,aAAa;AACnB,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ,OAAO,SAAS;AACtC,uBAAiB,cAAc,QAAQ;AAAA,IACzC;AACA,UAAM,SAAS,IAAI,OAAO,eAAe,WAAW,aAAa;AACjE,UAAM,QAAQ;AACd,UAAM,UAAsB,CAAC;AAC7B,QAAI,UAAU;AACd,eAAW,KAAK,WAAW,OAAO;AAChC,cAAQ,KAAK,OAAO,EAAE,MAAM,CAAC;AAC7B,iBAAW,SAAS,EAAE,MAAM;AAAA,IAC9B;AACA,UAAM,YACJ,iBAAiB,SACb,eAAe,eACf;AACN,QAAI,iBAAiB;AACrB,eAAW,WAAW,UAAU;AAC9B,UAAI,CAAC,QAAQ,OAAO;AAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,OACH,KAAK,KAAK,UAAU,cAAc,KAAK,IAAI,KAAK,KAAK,SAAS,KAAM;AACvE,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,UAAI,CAAC,KAAK,SAAS,KAAK,GAAG;AACzB,aAAK,SAAS,KAAK,IAAI,CAAC;AAAA,MAC1B;AACA,UAAI,CAAC,KAAK,SAAS,KAAK,EAAE,GAAG,GAAG;AAC9B,aAAK,SAAS,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,MAC/B;AACA,YAAM,UAEF,CAAC;AACL,UAAI,OAAO,gBAAgB;AACzB,gBAAQ,iBAAiB;AAAA,UACvB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,aAAa,IAAI,WAAW,QAAQ,SAAS,MAAM,OAAO;AAChE,WAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI;AAAA,IACnC;AAOA,SAAK,mBAAmB;AACxB,4BAAwB;AACxB,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,WAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AACA,SAAK,kBAAkB,OAAO;AAC9B,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,UAAI,qBAAqB;AACvB,aAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,QAAQ,SAAS,KAAK;AAAA,MACrE;AAAA,IACF;AACA,UAAM,WAAW,IAAIF,gBAAe;AACpC,WAAO,cAAc,QAAQ;AAC7B,WAAO,WAAW,QAAQ;AAC1B,UAAM,MAAM,IAAIC,MAAK,UAAU,KAAK,cAAc;AAClD,QAAI,MAAM,IAAI,UAAU,UAAU,QAAQ;AAC1C,SAAK,IAAI,GAAG;AACZ,UAAM,OAAO,IAAIA,MAAK,UAAU,KAAK,cAAc;AACnD,SAAK,MAAM,IAAI,UAAU,UAAU,QAAQ;AAC3C,SAAK,IAAI,IAAI;AACb,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,IAAI;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,QACX,KAAK;AAAA,MACP;AACA,cAAQ,MAAM,MAAM,IAAI,UAAU,UAAU,QAAQ;AACpD,WAAK,IAAI,QAAQ,KAAK;AACtB,WAAK,eAAe,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,IACpD;AACA,WAAO,mBAAmB;AAC1B,eAAW,WAAW,CAAC;AACvB,SAAK,qBAAqB;AAAA,EAY5B;AAAA,EA5JU;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EAhCF;AAAA,EACA;AAAA,EAEA,iBAA6B,CAAC;AAAA,EAC9B,iBAA6B,CAAC;AAAA,EAE9B;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA,EACpB,mBAA4B;AAAA,EAC5B,kBAA2B;AAAA,EAC3B;AAAA,EACA;AAAA,EAER,2BAAoC;AAAA,EAiK7B,UAAgB;AACrB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,QAAQ;AAAA,IACxB;AACA,QAAI,KAAK,2BAA2B;AAClC,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,kBAAkB;AACvB,WAAK,4BAA4B;AAAA,IACnC;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,eAAe;AACpB,WAAK,yBAAyB;AAAA,IAChC;AAAA,EACF;AAAA,EAEO,gCAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,gCAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,MAAqB;AAChC,QAAI;AACF,WAAK,QAAQ,qBAAqB,IAAI;AACtC,aAAO;AAAA,IACT,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,qBACE,OACA,iBAIsC;AACtC,QAAI,cAA2B;AAC/B,QAAI,wBAAgC;AAEpC,QAAI,SAA+B,CAAC,MAAM;AAC1C,YAAQ,gBAAgB,OAAO;AAAA,MAC7B,KAAK,eAAe;AAClB,iBAAS,CAAC,MAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAClD;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,iBAAS,CAAC,MAAY,EAAE,SAAS,EAAE,QAAQ,GAAG,EAAE,MAAM,IAAI,CAAC;AAC3D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,QAAQ,KAAK,WAAW,MAAM;AACvC,YAAM,UAAU,MAAM,IAAI,IAAIE,SAAQ,GAAG,KAAK,WAAW,CAAC;AAC1D,UAAI,UAAU,uBAAuB;AACnC,cAAM,WAAW,KAAK,WAAW,eAAe;AAAA,UAC9C,OAAO,KAAK,WAAW;AAAA,QACzB;AACA,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AAMA,gBAAQ,IAAI,SAAS,MAAM;AAC3B,YAAI,SAAS,WAAW,OAAO,gBAAgB,UAAU,QAAQ;AAC/D;AAAA,QACF;AACA,YAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,kCAAwB;AACxB,wBAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,QAAQ;AAC1B,oBAAc,YAAY,OAAO;AAAA,IACnC;AACA,UAAM,QAAQ,KAAK,QAChB,qBAAqB,WAAW,EAChC,gBAAgB;AACnB,WAAO,EAAE,MAAM,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,kBAAkB,gBAAkD;AAClE,SAAK,OAAO,iBAAiB;AAC7B,QAAI,eAAe,qBAAqB,WAAW;AACjD,iBAAW,mBAAmB,KAAK,QAAQ,WAAW,QAAQ;AAI5D,cAAM,EAAE,WAAW,gBAAgB,IAAI;AACvC,iBAAS,WAAW,GAAG,WAAW,WAAW,YAAY;AACvD,mBAAS,aAAa,GAAG,aAAa,iBAAiB,cAAc;AACnE,kBAAM,wBAAwB;AAAA,cAC5B;AAAA,cACA,gBAAgB;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,aACJ,KAAK,SAAS,gBAAgB,SAAS,EAAE,UAAU,EAAE,QAAQ;AAC/D,gBACE,KAAK,YACL,KAAK,0BACL,0BAA0B,aAC1B;AAAA,YAEF,OAAO;AACL,yBAAW,kBAAkB,KAAK,QAAQ,qBAAqB;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEO,iBAAiB,GAAyB;AAC/C,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,aAAa,IAAIE,OAAM;AAC7B,SAAK,UAAU,SAAS,KAAK,UAAU;AACvC,QAAI,YAAY;AAChB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AACnB,QACE,CAAC,KAAK,WACN,KAAK,4BACL,CAAC,KAAK,QAAQ,QAAQ,YAAY,OAAO,GACzC;AACA,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,SAAS,KAAK,SAAS,KAAK;AAClC,cAAM,OAAO,QAAQ,YAAY,KAAK;AACtC,cAAM,OAAO,OAAO;AACpB,YAAI,SAAS,GAAG;AACd,gBAAM,UAAU,OAAO,CAAC;AACxB,mBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,kBAAM,KAAK,KAAK,OAAO,CAAC;AACxB,gBAAI,KAAK,UAAU;AACjB,2BAAa,QAAQ,CAAC,EAAE,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAAA,YACxD,OAAO;AACL,2BAAa,QAAQ,CAAC,EAAE,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF,OAAO;AACL,mBAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,kBAAM,UAAU,OAAO,GAAG;AAC1B,qBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,oBAAM,QAAQ,MAAM,OAAO,KAAK,YAAY,CAAC,KAAK;AAClD,oBAAM,KAAK,KAAK,OAAO,CAAC;AACxB,kBAAI,KAAK,UAAU;AACjB,6BAAa,QAAQ,CAAC,EAAE,WAAW,QAAQ,OAAO,IAAI,EAAE,EAAE,CAAC;AAAA,cAC7D,OAAO;AACL,6BAAa,QAAQ,CAAC,EAAE,SAAS,QAAQ,OAAO,IAAI,EAAE,EAAE,CAAC;AAAA,cAC3D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,WAAK,UAAU;AAAA,IACjB;AACA,QAAI,UAAU;AACd,eAAW,gBAAgB,EAAE,iBAAiB;AAC5C,YAAM,eAAe,aAAa;AAGlC,YAAM,aAAa,KAAK,WAAW,UAAU,YAAY;AACzD,UAAI,CAAC,YAAY;AAEf;AAAA,MACF;AAEA,YAAM,OAAO;AACb,UAAI;AACJ,UAAI;AACF,gCAAwB,KAAK,QAAQ;AAAA,UACnC,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,QAC7B;AAAA,MACF,SAAS,GAAG;AAKV,cAAM,QAAQ,KAAK,WAAW,eAAe,mBAAmB,IAAI;AACpE,YAAI,OAAO;AACT,gBAAM,QAAQ,KAAK,WAAW,eAAe;AAAA,YAC3C,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,UAC9B;AACA,cAAI,OAAO;AACT,oCAAwB,KAAK,QAAQ,qBAAqB,KAAK;AAAA,UACjE;AAAA,QACF;AACA,YAAI,CAAC,uBAAuB;AAC1B,kBAAQ,IAAI,CAAC;AACb,gBAAM;AAAA,QACR;AAAA,MACF;AACA,YAAM,KAAK,KAAK,SAAS,WAAW,MAAM;AAC1C,YAAM,aAAa,GAAG;AACtB,YAAM,QACH,CAAC,KAAK,KAAK,aAAa,QAAQ,IAC/B,aAAa,YACb,WAAW,SACX,MACF,GAAG;AACL,WAAK,UAAU,aAAa,YAAY,KAAK;AAC7C,UAAI,KAAK,2BAA2B,uBAAuB;AACzD,mBAAW,SAAS,KAAK,UAAU;AACjC,gBAAM,SAAS,KAAK,SAAS,KAAK;AAClC,gBAAM,OAAO,OAAO;AACpB,gBAAM,MAAM,sBAAsB,mBAAmB,KAAK;AAC1D,mBAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,kBAAM,UAAU,OAAO,GAAG;AAC1B,qBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,oBAAM,KAAK,QAAQ,CAAC;AACpB,oBAAM,KAAK,IAAI,YAAY,CAAC;AAC5B,kBAAI,KAAK;AACT,kBAAI,OAAO,KAAK,IAAI,iBAAiB,CAAC,MAAM,GAAG;AAC7C,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,GAAG,UAAU;AACtB,oBAAI,IAAI;AACN,2BAAS,IAAI,GAAG,cAAc,IAAI,GAAG,YAAY,KAAK;AACpD,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAEA,2BAAS,IAAI,GAAG,WAAY,IAAI,GAAG,SAAU,KAAK;AAChD,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAEA,2BACM,IAAI,GAAG,iBACX,IAAI,GAAG,eACP,KACA;AACA,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAAA,gBACF,OAAO;AACL,2BAAS,IAAI,GAAG,cAAe,IAAI,GAAG,YAAY,KAAK;AACrD,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAEA,2BAAS,IAAI,GAAG,WAAY,IAAI,GAAG,SAAU,KAAK;AAChD,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAEA,2BACM,IAAI,GAAG,iBACX,IAAI,GAAG,eACP,KACA;AACA,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAAA,gBACF;AACA,mBAAG,WAAW;AACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACF;AACA,QAAI,KAAK,4BAA4B,SAAS;AAC5C,WAAK,OAAO,WAAW,KAAK,QAAQ;AAAA,IACtC;AACA,QAAI,KAAK,4BAA4B,WAAW;AAC9C,UAAI,KAAK,UAAU;AACjB,QAAC,KAAK,SAAS,aAAa,IAAI,EAAsB;AAAA,UACpD;AAAA,UACA,IAAI,KAAK;AAAA,QACX;AACA,QAAC,KAAK,SAAS,aAAa,IAAI,EAAsB,cACpD;AAAA,MACJ;AACA,UAAI,KAAK,4BAA4B,CAAC,KAAK,UAAU;AACnD,QAAC,KAAK,SAAS,aAAa,OAAO,EAAsB;AAAA,UACvD;AAAA,UACA,IAAI,KAAK;AAAA,QACX;AACA,QAAC,KAAK,SAAS,aAAa,OAAO,EAAsB,cACvD;AAAA,MACJ;AAAA,IACF;AACA,SAAK,uBAAuB;AAC5B,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEQ,KAAK,UAA0B;AACrC,WAAO,aAAa,QAAQ;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,GAAY;AACnC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,uBAAuB;AAC7B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AACA,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,QAAI,KAAK,kBAAkB;AACzB,WAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,WAAK,eAAe,CAAC,IAAI,KAAK;AAAA,IAChC,OAAO;AACL,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AACA,QAAI,KAAK,iBAAiB;AACxB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B,OAAO;AACL,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,eAAe,GAAY;AACjC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,sBAAsB,GAAiB;AAC7C,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,yBAAyB;AAAA,IAChC;AACA,QAAI,MAAM,GAAG;AACX,WAAK,eAAe;AAAA,IACtB,WAAW,MAAM,GAAG;AAClB,WAAK,eAAe,KAAK;AAAA,IAC3B,OAAO;AACL,WAAK,eAAe,IAAId,mBAAkB;AAAA,QACxC,cAAc;AAAA,QACd,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AACD,WAAK,yBAAyB;AAAA,IAChC;AAAA,EACF;AAAA,EAEO,0BAA0B,SAMxB;AACP,QAAI,QAAQ,iBAAiB,QAAW;AACtC,WAAK,iBAAiB,QAAQ,iBAAiB,MAAM;AAAA,IACvD;AACA,QAAI,QAAQ,mBAAmB,QAAW;AACxC,WAAK,eAAe,QAAQ,cAAc;AAAA,IAC5C;AACA,QAAI,QAAQ,uBAAuB,QAAW;AAC5C,WAAK,sBAAsB,QAAQ,kBAAkB;AAAA,IACvD;AACA,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AACA,QACE,OAAO,QAAQ,iBAAiB,eAChC,QAAQ,iBAAiB,KAAK,cAC9B;AACA,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,SAAK,qBAAqB;AAC1B,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,SAAS;AACf,UAAM,SAAS,KAAK;AACpB,QAAI,OAAO,KAAK;AACd;AAAA,IACF;AACA,SAAK,OAAO,MAAM,IAAI,aAAa,KAAK,OAAO,EAAE;AACjD,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,SAAS,KAAK,SAAS,KAAK;AAClC,YAAM,OAAO,OAAO;AACpB,eAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,cAAM,UAAU,OAAO,GAAG;AAC1B,mBAAW,UAAU,SAAS;AAC5B,iBAAO,OAAO,KAAK,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAK,WAAW,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE;AACtD,UAAM,MAAM,OAAO,IAAK,SAAS,GAAG,IAAI,OAAO,EAAE;AACjD,SAAK,SAAS,aAAa,MAAM,IAAIK,iBAAgB,KAAK,GAAG,IAAI,CAAC;AAAA,EACpE;AAAA,EAEO,0BACL,SACA,gBACA,aACA;AACA,QAAI,CAAC,gBAAgB;AACnB,gBAAU;AAAA,IACZ;AACA,QAAI,WAAW,CAAC,KAAK,OAAO,KAAK;AAC/B,WAAK,OAAO;AAAA,IACd;AACA,SAAK,WAAW;AAChB,QAAI,KAAK,2BAA2B;AAClC,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,4BAA4B;AAAA,IACnC;AACA,QAAI,SAAS;AACX,WAAK,kBAAkB,IAAIL,mBAAkB;AAAA,QAC3C,KAAK;AAAA,QACL,MAAMe;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AACD,WAAK,4BAA4B;AAAA,IACnC,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,yBAAyB;AAAA,IAChC;AACA,QAAI,SAAS;AACX,WAAK,eAAe,IAAIf,mBAAkB;AAAA,QACxC,KAAK;AAAA,QACL,MAAMe;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AACD,WAAK,yBAAyB;AAAA,IAChC,OAAO;AACL,WAAK,eAAe;AAAA,IACtB;AACA,QAAI,SAAS;AACX,WAAK,iBAAiB,gBAAgB,IAAI;AAAA,IAC5C;AACA,SAAK,qBAAqB;AAC1B,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AACA,SAAK,uBAAuB;AAAA,EAC9B;AACF;;;ACvnCA,SAA8B,yBAA8B;AAC5D,SAAsB,iBAAsB;AAC5C,SAA0B,iBAAjBC,sBAA2C;AACpD,SAAsB,iBAAsB;AAC5C,SAAoB,WAAXC,gBAA+B;AACxC,SAAoB,WAAXC,gBAA+B;AACxC,SAA0B,qBAA0B;AACpD,SAAkB,aAAkB;;;ACT7B,IAAM,gBAAN,MAAoD;AAAA,EACjD,gBAA2C,oBAAI,IAAI;AAAA,EACpD,YAAiC,oBAAI,IAAI;AAAA,EAEhD,gBAAqC,YACnC,KAAK,MAAM,YAAY,WAAW,GAAG;AAAA,EAEvC,gBAAgB,cAA0C;AACxD,SAAK,cAAc,IAAI,YAAY;AAAA,EACrC;AAAA,EAEA,iBAAuB;AACrB,eAAW,gBAAgB,KAAK,eAAe;AAC7C,mBAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,gBAA+C;AACrE,SAAK,UAAU,IAAI,cAAc;AACjC,KAAC,MAAM,KAAK,cAAc,IAAI,cAAc;AAAA,EAE9C;AAAA,EAEA,MAAM,qBAAqB,gBAA+C;AACxE,SAAK,UAAU,OAAO,cAAc;AACpC,KAAC,MAAM,KAAK,cAAc,OAAO,cAAc;AAAA,EAEjD;AAAA,EAEA,MAAM,eAA8B;AAClC,eAAW,OAAO,KAAK,WAAW;AAChC,OAAC,MAAM,KAAK,cAAc,OAAO,GAAG;AAAA,IACtC;AACA,SAAK,UAAU,MAAM;AAAA,EAEvB;AACF;;;ADrBA,eAAsB,WACpB,gBACA,SACiB;AACjB,SAAO,IAAI,OAAO,MAAM,UAAU,QAAQ,GAAG,gBAAgB,OAAO;AACtE;AAGA,eAAsB,SACpB,gBACA,cACA,cACA,cACA,mBACe;AACf,SAAO,IAAI;AAAA,IACT;AAAA,IACA,MAAM,aAAa,QAAQ;AAAA,KAC1B,MAAM,aAAa,GAAI,GAAG,MAAM,EAAE,kBAAkB,CAAC;AAAA,IACtD;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
-
"names": ["r", "stickeringMask", "DoubleSide", "FrontSide", "BufferAttribute", "BufferGeometry", "Object3D", "MeshBasicMaterial", "Color", "Euler", "Vector3", "Group", "Mesh", "MeshBasicMaterial", "DoubleSide", "r", "face", "t", "BufferAttribute", "Color", "normal", "Group", "BufferGeometry", "Mesh", "AxisInfo", "Vector3", "Object3D", "Euler", "FrontSide", "TextureLoader", "Vector2", "Vector3"]
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|