cubing 0.26.2 → 0.26.5
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/esm/alg/index.js +1 -1
- package/dist/esm/bluetooth/index.js +11 -7
- package/dist/esm/bluetooth/index.js.map +2 -2
- package/dist/esm/{chunk-4OCHKVLJ.js → chunk-7K6HJKEG.js} +5 -5
- package/dist/esm/chunk-7K6HJKEG.js.map +7 -0
- package/dist/esm/{chunk-DO7GZAW4.js → chunk-FCB447RN.js} +4 -4
- package/dist/esm/chunk-FCB447RN.js.map +7 -0
- package/dist/esm/{chunk-HD2CMNE4.js → chunk-GNKVWDWW.js} +7 -627
- package/dist/esm/chunk-GNKVWDWW.js.map +7 -0
- package/dist/esm/{chunk-ESSOEWR6.js → chunk-GOBAXDTU.js} +61 -341
- package/dist/esm/chunk-GOBAXDTU.js.map +7 -0
- package/dist/esm/{chunk-FB7SFELN.js → chunk-ITRA3DUQ.js} +2 -2
- package/dist/esm/{chunk-FB7SFELN.js.map → chunk-ITRA3DUQ.js.map} +0 -0
- package/dist/esm/{chunk-RGEST6KF.js → chunk-K62P6E3H.js} +7 -7
- package/dist/esm/{chunk-RGEST6KF.js.map → chunk-K62P6E3H.js.map} +0 -0
- package/dist/esm/{chunk-3NFDCQI2.js → chunk-LJBHUHEP.js} +2 -56
- package/dist/esm/{chunk-3NFDCQI2.js.map → chunk-LJBHUHEP.js.map} +3 -3
- package/dist/esm/{chunk-NSLR2SC4.js → chunk-NHCGS73I.js} +2 -2
- package/dist/esm/{chunk-NSLR2SC4.js.map → chunk-NHCGS73I.js.map} +0 -0
- package/dist/esm/{chunk-3ADPLDWG.js → chunk-TB6NTLZY.js} +370 -81
- package/dist/esm/chunk-TB6NTLZY.js.map +7 -0
- package/dist/esm/chunk-VCOUFQGJ.js +240 -0
- package/dist/esm/chunk-VCOUFQGJ.js.map +7 -0
- package/dist/esm/chunk-VFDAQ42O.js +684 -0
- package/dist/esm/chunk-VFDAQ42O.js.map +7 -0
- package/dist/esm/{chunk-ZPAGJE7S.js → chunk-WQK6XWML.js} +2 -2
- package/dist/esm/{chunk-ZPAGJE7S.js.map → chunk-WQK6XWML.js.map} +1 -1
- package/dist/esm/kpuzzle/index.js +4 -6
- package/dist/esm/notation/index.js +2 -2
- package/dist/esm/protocol/index.js +4 -4
- package/dist/esm/puzzle-geometry/index.js +2 -2
- package/dist/esm/puzzles/index.js +4 -12
- package/dist/esm/{puzzles-dynamic-side-events-CXNWDLKD.js → puzzles-dynamic-side-events-HOXBZYWI.js} +21 -21
- package/dist/esm/{puzzles-dynamic-side-events-CXNWDLKD.js.map → puzzles-dynamic-side-events-HOXBZYWI.js.map} +1 -1
- package/dist/esm/{puzzles-dynamic-unofficial-CKTRIKMY.js → puzzles-dynamic-unofficial-MGVOFUDR.js} +79 -79
- package/dist/esm/{puzzles-dynamic-unofficial-CKTRIKMY.js.map → puzzles-dynamic-unofficial-MGVOFUDR.js.map} +1 -1
- package/dist/esm/scramble/index.js +2 -6
- package/dist/esm/search/index.js +9 -10
- package/dist/esm/{search-dynamic-sgs-side-events-ZDPMZ4Y7.js → search-dynamic-sgs-side-events-KK62JAWA.js} +7 -6
- package/dist/esm/{search-dynamic-sgs-side-events-ZDPMZ4Y7.js.map → search-dynamic-sgs-side-events-KK62JAWA.js.map} +1 -1
- package/dist/esm/{search-dynamic-sgs-unofficial-RAGEBTDP.js → search-dynamic-sgs-unofficial-VLNIEUW3.js} +8 -7
- package/dist/esm/{search-dynamic-sgs-unofficial-RAGEBTDP.js.map → search-dynamic-sgs-unofficial-VLNIEUW3.js.map} +1 -1
- package/dist/esm/{search-dynamic-solve-4x4x4-W455FUFG.js → search-dynamic-solve-4x4x4-S5JPXMNU.js} +7 -6
- package/dist/esm/{search-dynamic-solve-4x4x4-W455FUFG.js.map → search-dynamic-solve-4x4x4-S5JPXMNU.js.map} +1 -1
- package/dist/esm/{search-dynamic-solve-fto-ZM45FTCO.js → search-dynamic-solve-fto-WROONLZS.js} +6 -6
- package/dist/esm/search-dynamic-solve-fto-WROONLZS.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-kilominx-PAW6HKT5.js → search-dynamic-solve-kilominx-UEFJENHO.js} +2 -2
- package/dist/esm/{search-dynamic-solve-kilominx-PAW6HKT5.js.map → search-dynamic-solve-kilominx-UEFJENHO.js.map} +0 -0
- package/dist/esm/search-worker-inside-generated-string-AVMDARJP.js +3768 -0
- package/dist/esm/search-worker-inside-generated-string-AVMDARJP.js.map +7 -0
- package/dist/esm/{search-worker-js-entry-5IIKIMTU.js → search-worker-js-entry-KJRZ3CJQ.js} +22 -21
- package/dist/esm/{search-worker-js-entry-5IIKIMTU.js.map → search-worker-js-entry-KJRZ3CJQ.js.map} +1 -1
- package/dist/esm/{search-worker-ts-entry-BV3J54MW.js → search-worker-ts-entry-AFMPRPSV.js} +3 -3
- package/dist/esm/{search-worker-ts-entry-BV3J54MW.js.map → search-worker-ts-entry-AFMPRPSV.js.map} +0 -0
- package/dist/esm/stream/index.js +1 -1
- package/dist/esm/twisty/index.js +65 -38
- package/dist/esm/twisty/index.js.map +3 -3
- package/dist/esm/{twisty-dynamic-3d-KFFJZNMZ.js → twisty-dynamic-3d-AVZOMIIW.js} +25 -8
- package/dist/esm/twisty-dynamic-3d-AVZOMIIW.js.map +7 -0
- package/dist/types/{Alg-6f3dc52c.d.ts → Alg-5cf4b166.d.ts} +2 -2
- package/dist/types/{KPuzzleDefinition-121e85a8.d.ts → KState-84892e94.d.ts} +77 -5
- package/dist/types/{PuzzleLoader-9243f44d.d.ts → TwizzleLink-24ea1412.d.ts} +42 -145
- package/dist/types/alg/index.d.ts +3 -3
- package/dist/types/bluetooth/index.d.ts +4 -5
- package/dist/types/{bluetooth-puzzle-679d8ca3.d.ts → bluetooth-puzzle-0f2e5f07.d.ts} +2 -2
- package/dist/types/kpuzzle/index.d.ts +2 -8
- package/dist/types/notation/index.d.ts +1 -1
- package/dist/types/{outside-f7ba9c00.d.ts → outside-d0ced6cc.d.ts} +2 -2
- package/dist/types/{parse-6d363160.d.ts → parse-9db7ee51.d.ts} +1 -1
- package/dist/types/protocol/index.d.ts +3 -6
- package/dist/types/puzzle-geometry/index.d.ts +3 -3
- package/dist/types/puzzles/index.d.ts +6 -16
- package/dist/types/scramble/index.d.ts +3 -4
- package/dist/types/search/index.d.ts +3 -4
- package/dist/types/stream/index.d.ts +3 -4
- package/dist/types/twisty/index.d.ts +5 -6
- package/package.json +6 -2
- package/dist/esm/.DS_Store +0 -0
- package/dist/esm/chunk-3ADPLDWG.js.map +0 -7
- package/dist/esm/chunk-4OCHKVLJ.js.map +0 -7
- package/dist/esm/chunk-DO7GZAW4.js.map +0 -7
- package/dist/esm/chunk-ESSOEWR6.js.map +0 -7
- package/dist/esm/chunk-HD2CMNE4.js.map +0 -7
- package/dist/esm/search-dynamic-solve-fto-ZM45FTCO.js.map +0 -7
- package/dist/esm/search-worker-inside-generated-string-VBEHCGJ6.js +0 -3768
- package/dist/esm/search-worker-inside-generated-string-VBEHCGJ6.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-KFFJZNMZ.js.map +0 -7
- package/dist/types/KState-73482114.d.ts +0 -70
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/cubing/kpuzzle/combine.ts", "../../src/cubing/kpuzzle/construct.ts", "../../src/cubing/kpuzzle/3x3x3/puzzle-orientation.ts", "../../src/cubing/kpuzzle/KState.ts", "../../src/cubing/kpuzzle/KTransformation.ts", "../../src/cubing/kpuzzle/calculate.ts", "../../src/cubing/kpuzzle/KPuzzle.ts", "../../src/cubing/kpuzzle/3x3x3/3x3x3.kpuzzle.json.ts", "../../src/cubing/kpuzzle/index.ts", "../../src/cubing/protocol/binary/orbit-indexing.ts", "../../src/cubing/protocol/binary/puzzle-orientation.ts", "../../src/cubing/protocol/binary/binary3x3x3.ts", "../../src/cubing/protocol/binary/hex.ts"],
|
|
4
|
-
"sourcesContent": ["import { isOrbitTransformationDataIdentityUncached } from \"./calculate\";\nimport type {\n KPuzzleDefinition,\n KStateData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\n\nexport function combineTransformationData(\n definition: KPuzzleDefinition,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): KTransformationData {\n const newTransformationData = {} as KTransformationData;\n for (const orbitName in definition.orbits) {\n const orbitDefinition = definition.orbits[orbitName];\n const orbit1 = transformationData1[orbitName];\n const orbit2 = transformationData2[orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit2,\n )\n ) {\n // common case for big cubes\n newTransformationData[orbitName] = orbit1;\n } else if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit1,\n )\n ) {\n newTransformationData[orbitName] = orbit2;\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitName] = {\n permutation: newPerm,\n orientation: orbit1.orientation,\n };\n } else {\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newOri[idx] =\n (orbit1.orientation[orbit2.permutation[idx]] +\n orbit2.orientation[idx]) %\n orbitDefinition.numOrientations;\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitName] = {\n permutation: newPerm,\n orientation: newOri,\n };\n }\n }\n }\n return newTransformationData;\n}\n\nexport function applyTransformationDataToStateData(\n definition: KPuzzleDefinition,\n stateData: KStateData,\n transformationData: KTransformationData,\n): KStateData {\n const newStateData = {} as KStateData;\n for (const orbitName in definition.orbits) {\n const orbitDefinition = definition.orbits[orbitName];\n const orbit1 = stateData[orbitName];\n const orbit2 = transformationData[orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit2,\n )\n ) {\n // common case for big cubes\n newStateData[orbitName] = orbit1;\n } else {\n const newPieces = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPieces[idx] = orbit1.pieces[orbit2.permutation[idx]];\n }\n newStateData[orbitName] = {\n pieces: newPieces,\n orientation: orbit1.orientation,\n };\n } else {\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newOri[idx] =\n (orbit1.orientation[orbit2.permutation[idx]] +\n orbit2.orientation[idx]) %\n orbitDefinition.numOrientations;\n newPieces[idx] = orbit1.pieces[orbit2.permutation[idx]];\n }\n newStateData[orbitName] = {\n pieces: newPieces,\n orientation: newOri,\n };\n }\n }\n }\n return newStateData;\n}\n", "import type { Move } from \"../alg\";\nimport { repeatTransformationUncached } from \"./calculate\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleDefinition,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\n\nconst FREEZE: boolean = false;\n\nconst identityOrbitCache = new Map<number, KTransformationOrbitData>();\nfunction constructIdentityOrbitTransformation(\n numPieces: number,\n): KTransformationOrbitData {\n const cached = identityOrbitCache.get(numPieces);\n if (cached) {\n return cached;\n }\n\n const newPermutation = new Array(numPieces);\n const newOrientation = new Array(numPieces);\n for (let i = 0; i < numPieces; i++) {\n newPermutation[i] = i;\n newOrientation[i] = 0;\n }\n const orbitTransformation = {\n permutation: newPermutation,\n orientation: newOrientation,\n };\n if (FREEZE) {\n Object.freeze(newPermutation); // TODO\n Object.freeze(newOrientation); // TODO\n Object.freeze(orbitTransformation); // TODO\n }\n identityOrbitCache.set(numPieces, orbitTransformation);\n return orbitTransformation;\n}\n\nexport function constructIdentityTransformationDataUncached(\n definition: KPuzzleDefinition,\n): KTransformationData {\n const transformation = {} as KTransformationData;\n for (const [orbitName, orbitDefinition] of Object.entries(\n definition.orbits,\n )) {\n transformation[orbitName] = constructIdentityOrbitTransformation(\n orbitDefinition.numPieces,\n );\n }\n if (FREEZE) {\n Object.freeze(transformation); // TODO\n }\n return transformation;\n}\n\nexport function moveToTransformationUncached(\n kpuzzle: KPuzzle,\n move: Move,\n): KTransformationData {\n const quantumKey = move.quantum.toString();\n let quantumMoveDefinition = kpuzzle.definition.moves[quantumKey] as\n | KTransformationData\n | undefined;\n\n if (!quantumMoveDefinition) {\n const derivedFrom =\n kpuzzle.definition.experimentalDerivedMoves?.[quantumKey];\n\n if (derivedFrom) {\n // TODO: avoid the round trip?\n quantumMoveDefinition =\n kpuzzle.algToTransformation(derivedFrom).transformationData;\n }\n }\n\n if (quantumMoveDefinition) {\n return repeatTransformationUncached(\n kpuzzle,\n quantumMoveDefinition,\n move.amount,\n );\n }\n\n // Handle e.g. `y2` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const moveDefinition = kpuzzle.definition.moves[move.toString()];\n if (moveDefinition) {\n return moveDefinition;\n }\n\n // Handle e.g. `y2'` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const inverseMoveDefinition =\n kpuzzle.definition.moves[move.invert().toString()];\n if (inverseMoveDefinition) {\n return repeatTransformationUncached(kpuzzle, inverseMoveDefinition, -1);\n }\n\n throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);\n}\n", "import { experimentalNormalizePuzzleOrientation as normalize3x3x3Orientation } from \"../../protocol\";\nimport { KState } from \"../KState\";\n\n// The `options` argument is required for now, because we haven't yet come up\n// with a general way to specify different kinds of solved for the same puzle.\nexport function experimentalIs3x3x3Solved(\n state: KState,\n options: {\n ignorePuzzleOrientation: boolean;\n ignoreCenterOrientation: boolean;\n },\n): boolean {\n if (options.ignorePuzzleOrientation) {\n state = normalize3x3x3Orientation(state);\n }\n if (options.ignoreCenterOrientation) {\n state = new KState(state.kpuzzle, {\n EDGES: state.stateData.EDGES,\n CORNERS: state.stateData.CORNERS,\n CENTERS: {\n pieces: state.stateData.CENTERS.pieces,\n orientation: new Array(6).fill(0),\n },\n });\n }\n return !!state.experimentalToTransformation()?.isIdentityTransformation(); // TODO: Compare to start state instead?\n}\n", "import type { KPuzzle, KTransformationData } from \".\";\nimport type { Alg, Move } from \"../alg\";\nimport { experimentalIs3x3x3Solved } from \"./3x3x3/puzzle-orientation\";\nimport { applyTransformationDataToStateData } from \"./combine\";\nimport type { KTransformationSource } from \"./KPuzzle\";\nimport type { KStateData, KTransformationOrbitData } from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport class KState {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly stateData: KStateData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n stateData: this.stateData,\n };\n }\n\n static fromTransformation(transformation: KTransformation): KState {\n const newStateData = applyTransformationDataToStateData(\n transformation.kpuzzle.definition,\n transformation.kpuzzle.definition.startStateData,\n transformation.transformationData,\n );\n return new KState(transformation.kpuzzle, newStateData);\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KState {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(transformation: KTransformation): KState {\n if (transformation.isIdentityTransformation()) {\n return new KState(this.kpuzzle, this.stateData);\n }\n const newStateData = applyTransformationDataToStateData(\n this.kpuzzle.definition,\n this.stateData,\n transformation.transformationData,\n );\n return new KState(this.kpuzzle, newStateData);\n }\n\n applyMove(move: Move | string): KState {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KState {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n /** @deprecated */\n experimentalToTransformation(): KTransformation | null {\n if (!this.kpuzzle.canConvertStateToUniqueTransformation()) {\n return null;\n }\n const transformationData: KTransformationData = {};\n for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {\n const transformationOrbit: KTransformationOrbitData = {\n permutation: stateOrbitData.pieces,\n orientation: stateOrbitData.orientation,\n };\n transformationData[orbitName] = transformationOrbit;\n }\n return new KTransformation(this.kpuzzle, transformationData);\n }\n\n experimentalIs3x3x3Solved(options: {\n ignorePuzzleOrientation: boolean;\n ignoreCenterOrientation: boolean;\n }): boolean {\n if (this.kpuzzle.name() !== \"3x3x3\") {\n throw new Error(\n \"`KState.experimentalIs3x3x3Solved()` only supports 3x3x3 states.\",\n );\n }\n return experimentalIs3x3x3Solved(this, options);\n }\n}\n", "import type { Alg, Move } from \"../alg\";\nimport {\n invertTransformation,\n isTransformationDataIdentical,\n repeatTransformationUncached,\n transformationRepetitionOrder,\n} from \"./calculate\";\nimport { combineTransformationData } from \"./combine\";\nimport { constructIdentityTransformationDataUncached } from \"./construct\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type { KTransformationData } from \"./KPuzzleDefinition\";\nimport { KState } from \"./KState\";\n\nexport class KTransformation {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly transformationData: KTransformationData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n transformationData: this.transformationData,\n };\n }\n\n invert(): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n invertTransformation(this.kpuzzle, this.transformationData),\n );\n }\n\n // For optimizations, we want to make it cheap to rely on optimizations when a\n // transformation is an identity. Here, we try to make it cheaper by:\n // - only calculating when needed, and\n // - caching the result.\n #cachedIsIdentity: boolean | undefined; // TODO: is `null` worse here?\n isIdentityTransformation(): boolean {\n return (this.#cachedIsIdentity ??= this.isIdentical(\n this.kpuzzle.identityTransformation(),\n ));\n }\n\n /** @deprecated */\n static experimentalConstructIdentity(kpuzzle: KPuzzle) {\n const transformation = new KTransformation(\n kpuzzle,\n constructIdentityTransformationDataUncached(kpuzzle.definition),\n );\n transformation.#cachedIsIdentity = true;\n return transformation;\n }\n\n isIdentical(t2: KTransformation): boolean {\n return isTransformationDataIdentical(\n this.kpuzzle,\n this.transformationData,\n t2.transformationData,\n );\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KTransformation {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(t2: KTransformation): KTransformation {\n if (this.kpuzzle !== t2.kpuzzle) {\n throw new Error(\n `Tried to apply a transformation for a KPuzzle (${t2.kpuzzle.name()}) to a different KPuzzle (${this.kpuzzle.name()}).`,\n );\n }\n\n if (this.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, t2.transformationData);\n }\n if (t2.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, this.transformationData);\n }\n\n return new KTransformation(\n this.kpuzzle,\n combineTransformationData(\n this.kpuzzle.definition,\n this.transformationData,\n t2.transformationData,\n ),\n );\n }\n\n applyMove(move: Move | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n // Convenience. Useful for chaining.\n toKState(): KState {\n return KState.fromTransformation(this);\n }\n\n repetitionOrder(): number {\n return transformationRepetitionOrder(this.kpuzzle.definition, this);\n }\n\n selfMultiply(amount: number): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n repeatTransformationUncached(\n this.kpuzzle,\n this.transformationData,\n amount,\n ),\n );\n }\n}\n", "import type { KPuzzleDefinition } from \".\";\nimport {\n Alg,\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n TraversalDownUp,\n} from \"../alg\";\nimport { combineTransformationData } from \"./combine\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KOrbitDefinition,\n KTransformationOrbitData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport function isOrbitTransformationDataIdentityUncached(\n numOrientations: number,\n orbitTransformationData: KTransformationOrbitData,\n): boolean {\n // TODO\n // if (o === lasto) {\n // return true;\n // }\n const { permutation } = orbitTransformationData;\n const numPieces = permutation.length;\n for (let idx = 0; idx < numPieces; idx++) {\n if (permutation[idx] !== idx) {\n return false;\n }\n }\n if (numOrientations > 1) {\n const { orientation } = orbitTransformationData;\n for (let idx = 0; idx < numPieces; idx++) {\n if (orientation[idx] !== 0) {\n return false;\n }\n }\n }\n // lasto = o; // TODO\n return true;\n}\n\nexport function isOrbitTransformationDataIdentical(\n orbitDefinition: KOrbitDefinition,\n orbitTransformationData1: KTransformationOrbitData,\n orbitTransformationData2: KTransformationOrbitData,\n options: {\n ignoreOrientation?: boolean;\n ignorePermutation?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignoreOrientation &&\n orbitTransformationData1.orientation[idx] !==\n orbitTransformationData2.orientation[idx]\n ) {\n return false;\n }\n if (\n !options?.ignorePermutation &&\n orbitTransformationData1.permutation[idx] !==\n orbitTransformationData2.permutation[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isTransformationDataIdentical(\n kpuzzle: KPuzzle,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): boolean {\n for (const [orbitName, orbitDefinition] of Object.entries(\n kpuzzle.definition.orbits,\n )) {\n if (\n !isOrbitTransformationDataIdentical(\n orbitDefinition,\n transformationData1[orbitName],\n transformationData2[orbitName],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function invertTransformation(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n): KTransformationData {\n const newTransformationData: KTransformationData = {};\n for (const orbitName in kpuzzle.definition.orbits) {\n const orbitDefinition: KOrbitDefinition =\n kpuzzle.definition.orbits[orbitName];\n const orbitTransformationData = transformationData[orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbitTransformationData,\n )\n ) {\n newTransformationData[orbitName] = orbitTransformationData;\n } else if (orbitDefinition.numOrientations === 1) {\n const newPerm = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[orbitTransformationData.permutation[idx]] = idx;\n }\n newTransformationData[orbitName] = {\n permutation: newPerm,\n orientation: orbitTransformationData.orientation,\n };\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const fromIdx = orbitTransformationData.permutation[idx];\n newPerm[fromIdx] = idx;\n newOri[fromIdx] =\n (orbitDefinition.numOrientations -\n orbitTransformationData.orientation[idx] +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n newTransformationData[orbitName] = {\n permutation: newPerm,\n orientation: newOri,\n };\n }\n }\n return newTransformationData;\n}\n\nexport function repeatTransformationUncached(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n amount: number,\n): KTransformationData {\n // This is used for move construction, so we optimize for the quantum move case.\n if (amount === 1) {\n return transformationData;\n }\n if (amount < 0) {\n return repeatTransformationUncached(\n kpuzzle,\n invertTransformation(kpuzzle, transformationData),\n -amount,\n );\n }\n if (amount === 0) {\n // TODO\n const { transformationData } = kpuzzle.identityTransformation();\n return transformationData;\n }\n let halfish = transformationData;\n if (amount !== 2) {\n halfish = repeatTransformationUncached(\n kpuzzle,\n transformationData,\n Math.floor(amount / 2),\n );\n }\n const twiceHalfish = combineTransformationData(\n kpuzzle.definition,\n halfish,\n halfish,\n );\n if (amount % 2 === 0) {\n return twiceHalfish;\n } else {\n return combineTransformationData(\n kpuzzle.definition,\n transformationData,\n twiceHalfish,\n );\n }\n}\n\nclass AlgToTransformationTraversal extends TraversalDownUp<\n KPuzzle,\n KTransformation\n> {\n traverseAlg(alg: Alg, kpuzzle: KPuzzle): KTransformation {\n let transformation: KTransformation | null = null;\n for (const unit of alg.units()) {\n if (transformation) {\n transformation = transformation.applyTransformation(\n this.traverseUnit(unit, kpuzzle),\n );\n } else {\n transformation = this.traverseUnit(unit, kpuzzle);\n }\n }\n return transformation ?? kpuzzle.identityTransformation();\n }\n traverseGrouping(grouping: Grouping, kpuzzle: KPuzzle): KTransformation {\n const algTransformation = this.traverseAlg(grouping.alg, kpuzzle);\n return new KTransformation(\n kpuzzle,\n repeatTransformationUncached(\n kpuzzle,\n algTransformation.transformationData,\n grouping.amount,\n ),\n );\n }\n traverseMove(move: Move, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.moveToTransformation(move);\n }\n traverseCommutator(\n commutator: Commutator,\n kpuzzle: KPuzzle,\n ): KTransformation {\n const aTransformation = this.traverseAlg(commutator.A, kpuzzle);\n const bTransformation = this.traverseAlg(commutator.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert())\n .applyTransformation(bTransformation.invert());\n }\n traverseConjugate(conjugate: Conjugate, kpuzzle: KPuzzle): KTransformation {\n const aTransformation = this.traverseAlg(conjugate.A, kpuzzle);\n const bTransformation = this.traverseAlg(conjugate.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert());\n }\n traversePause(_: Pause, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseNewline(_: Newline, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseLineComment(_: LineComment, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n}\n\nconst algToTransformationInstance = new AlgToTransformationTraversal();\nexport const algToTransformation = algToTransformationInstance.traverseAlg.bind(\n algToTransformationInstance,\n) as (alg: Alg, kpuzzle: KPuzzle) => KTransformation;\n\nexport function canConvertStateToUniqueTransformationUncached(\n definition: KPuzzleDefinition,\n): boolean {\n for (const [orbitName, orbitDefinition] of Object.entries(definition)) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.startStateData[orbitName].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction gcd(a: number, b: number): number {\n if (b) {\n return gcd(b, a % b);\n }\n return a;\n}\n\n/* calculate the order of a particular transformation. */\nexport function transformationRepetitionOrder(\n definition: KPuzzleDefinition,\n transformation: KTransformation,\n): number {\n let order: number = 1;\n for (const orbitName in definition.orbits) {\n const orbitDefinition = definition.orbits[orbitName];\n const transformationOrbit = transformation.transformationData[orbitName];\n const orbitPieces = new Array(orbitDefinition.numPieces);\n for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {\n if (!orbitPieces[startIdx]) {\n let currentIdx = startIdx;\n let orientationSum = 0;\n let cycleLength = 0;\n for (;;) {\n orbitPieces[currentIdx] = true;\n orientationSum =\n orientationSum + transformationOrbit.orientation[currentIdx];\n cycleLength = cycleLength + 1;\n currentIdx = transformationOrbit.permutation[currentIdx];\n if (currentIdx === startIdx) {\n break;\n }\n }\n if (orientationSum !== 0) {\n cycleLength =\n (cycleLength * orbitDefinition.numOrientations) /\n gcd(orbitDefinition.numOrientations, orientationSum);\n }\n order = (order * cycleLength) / gcd(order, cycleLength);\n }\n }\n }\n return order;\n}\n", "import { Alg, Move } from \"../alg\";\nimport type { PGNotation } from \"../puzzle-geometry/PuzzleGeometry\";\nimport { algToTransformation } from \"./calculate\";\nimport { moveToTransformationUncached } from \"./construct\";\nimport type {\n KPuzzleDefinition,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nimport { KState } from \"./KState\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport type KTransformationSource = Alg | Move | string | KTransformation;\n\nexport class KPuzzle {\n private experimentalPGNotation: PGNotation | undefined;\n constructor(\n public readonly definition: KPuzzleDefinition,\n options?: {\n experimentalPGNotation?: PGNotation;\n },\n ) {\n this.experimentalPGNotation = options?.experimentalPGNotation;\n }\n\n name(): string {\n return this.definition.name; // TODO\n }\n\n identityTransformation(): KTransformation {\n return KTransformation.experimentalConstructIdentity(this);\n }\n\n #moveToTransformationDataCache = new Map<string, KTransformationData>();\n moveToTransformation(move: Move | string): KTransformation {\n if (typeof move === \"string\") {\n move = new Move(move);\n }\n const cacheKey = move.toString();\n const cachedTransformationData: KTransformationData | undefined =\n this.#moveToTransformationDataCache.get(cacheKey);\n if (cachedTransformationData) {\n return new KTransformation(this, cachedTransformationData);\n }\n\n if (this.experimentalPGNotation) {\n const transformationData = this.experimentalPGNotation.lookupMove(move);\n if (!transformationData) {\n throw new Error(`could not map to internal move: ${move}`);\n }\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n const transformationData = moveToTransformationUncached(this, move);\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n algToTransformation(alg: Alg | string): KTransformation {\n if (typeof alg === \"string\") {\n alg = new Alg(alg);\n }\n return algToTransformation(alg, this);\n }\n\n /** @deprecated */\n toTransformation(source: KTransformationSource): KTransformation {\n if (typeof source === \"string\") {\n return this.algToTransformation(source);\n } else if ((source as Alg | null)?.is?.(Alg)) {\n return this.algToTransformation(source as Alg);\n } else if ((source as Move | null)?.is?.(Move)) {\n return this.moveToTransformation(source as Move);\n } else {\n return source as KTransformation;\n }\n }\n\n startState(): KState {\n return new KState(this, this.definition.startStateData);\n }\n\n #cachedCanConvertStateToUniqueTransformation: boolean | undefined;\n // TODO: Handle incomplete start state data\n canConvertStateToUniqueTransformation(): boolean {\n return (this.#cachedCanConvertStateToUniqueTransformation ??=\n ((): boolean => {\n for (const [orbitName, orbitDefinition] of Object.entries(\n this.definition.orbits,\n )) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.startStateData[orbitName]\n .pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n })());\n }\n\n // TODO: Remove completely with v0.25\n /** @deprecated */\n get state(): never {\n throw new Error(\"KPuzzle is now a different (stateless) class.\");\n }\n\n // TODO: Remove completely with v0.25\n /** @deprecated */\n reset(): never {\n throw new Error(\"KPuzzle is now a different (stateless) class.\");\n }\n\n // TODO: Remove completely with v0.25\n /** @deprecated */\n applyMove(_move: Move): never {\n throw new Error(\n \"KPuzzle is now a different class. Try `.moveToTransformation()` to get the transformation for a move.\",\n );\n }\n\n // TODO: Remove completely with v0.25\n /** @deprecated */\n applyAlg(_alg: Alg): never {\n throw new Error(\n \"KPuzzle is now a different class. Try `.algToTransformation()` to get the transformation for an alg.\",\n );\n }\n}\n", "// TODO: This file is here to avoid dependency loops, but it should eventually\n// move back into `cubing/puzzles`. We currently have a few functions that are\n// hardcoded to require synchronous access to this definition, and we need to\n// find a better way to do that.\n\nimport type { KPuzzleDefinition } from \"../KPuzzleDefinition\";\n\nexport const cube3x3x3KPuzzleDefinition: KPuzzleDefinition = {\n name: \"3x3x3\",\n orbits: {\n EDGES: { numPieces: 12, numOrientations: 2 },\n CORNERS: { numPieces: 8, numOrientations: 3 },\n CENTERS: { numPieces: 6, numOrientations: 4 },\n },\n startStateData: {\n EDGES: {\n pieces: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n pieces: [0, 1, 2, 3, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n pieces: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n },\n },\n moves: {\n U: {\n EDGES: {\n permutation: [1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [1, 2, 3, 0, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [1, 0, 0, 0, 0, 0],\n },\n },\n y: {\n EDGES: {\n permutation: [1, 2, 3, 0, 5, 6, 7, 4, 10, 8, 11, 9],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [1, 2, 3, 0, 7, 4, 5, 6],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 2, 3, 4, 1, 5],\n orientation: [1, 0, 0, 0, 0, 3],\n },\n },\n x: {\n EDGES: {\n permutation: [4, 8, 0, 9, 6, 10, 2, 11, 5, 7, 1, 3],\n orientation: [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [4, 0, 3, 5, 7, 6, 2, 1],\n orientation: [2, 1, 2, 1, 1, 2, 1, 2],\n },\n CENTERS: {\n permutation: [2, 1, 5, 3, 0, 4],\n orientation: [0, 3, 0, 1, 2, 2],\n },\n },\n L: {\n EDGES: {\n permutation: [0, 1, 2, 11, 4, 5, 6, 9, 8, 3, 10, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [0, 1, 6, 2, 4, 3, 5, 7],\n orientation: [0, 0, 2, 1, 0, 2, 1, 0],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 1, 0, 0, 0, 0],\n },\n },\n F: {\n EDGES: {\n permutation: [9, 1, 2, 3, 8, 5, 6, 7, 0, 4, 10, 11],\n orientation: [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0],\n },\n CORNERS: {\n permutation: [3, 1, 2, 5, 0, 4, 6, 7],\n orientation: [1, 0, 0, 2, 2, 1, 0, 0],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 1, 0, 0, 0],\n },\n },\n R: {\n EDGES: {\n permutation: [0, 8, 2, 3, 4, 10, 6, 7, 5, 9, 1, 11],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [4, 0, 2, 3, 7, 5, 6, 1],\n orientation: [2, 1, 0, 0, 1, 0, 0, 2],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 1, 0, 0],\n },\n },\n B: {\n EDGES: {\n permutation: [0, 1, 10, 3, 4, 5, 11, 7, 8, 9, 6, 2],\n orientation: [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1],\n },\n CORNERS: {\n permutation: [0, 7, 1, 3, 4, 5, 2, 6],\n orientation: [0, 2, 1, 0, 0, 0, 2, 1],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 1, 0],\n },\n },\n D: {\n EDGES: {\n permutation: [0, 1, 2, 3, 7, 4, 5, 6, 8, 9, 10, 11],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [0, 1, 2, 3, 5, 6, 7, 4],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 1],\n },\n },\n z: {\n EDGES: {\n permutation: [9, 3, 11, 7, 8, 1, 10, 5, 0, 4, 2, 6],\n orientation: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [3, 2, 6, 5, 0, 4, 7, 1],\n orientation: [1, 2, 1, 2, 2, 1, 2, 1],\n },\n CENTERS: {\n permutation: [1, 5, 2, 0, 4, 3],\n orientation: [1, 1, 1, 1, 3, 1],\n },\n },\n M: {\n EDGES: {\n permutation: [2, 1, 6, 3, 0, 5, 4, 7, 8, 9, 10, 11],\n orientation: [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [0, 1, 2, 3, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [4, 1, 0, 3, 5, 2],\n orientation: [2, 0, 0, 0, 2, 0],\n },\n },\n E: {\n EDGES: {\n permutation: [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 8, 10],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [0, 1, 2, 3, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 4, 1, 2, 3, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n },\n },\n S: {\n EDGES: {\n permutation: [0, 3, 2, 7, 4, 1, 6, 5, 8, 9, 10, 11],\n orientation: [0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [0, 1, 2, 3, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [1, 5, 2, 0, 4, 3],\n orientation: [1, 1, 0, 1, 0, 1],\n },\n },\n u: {\n EDGES: {\n permutation: [1, 2, 3, 0, 4, 5, 6, 7, 10, 8, 11, 9],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [1, 2, 3, 0, 4, 5, 6, 7],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 2, 3, 4, 1, 5],\n orientation: [1, 0, 0, 0, 0, 0],\n },\n },\n l: {\n EDGES: {\n permutation: [2, 1, 6, 11, 0, 5, 4, 9, 8, 3, 10, 7],\n orientation: [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [0, 1, 6, 2, 4, 3, 5, 7],\n orientation: [0, 0, 2, 1, 0, 2, 1, 0],\n },\n CENTERS: {\n permutation: [4, 1, 0, 3, 5, 2],\n orientation: [2, 1, 0, 0, 2, 0],\n },\n },\n f: {\n EDGES: {\n permutation: [9, 3, 2, 7, 8, 1, 6, 5, 0, 4, 10, 11],\n orientation: [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0],\n },\n CORNERS: {\n permutation: [3, 1, 2, 5, 0, 4, 6, 7],\n orientation: [1, 0, 0, 2, 2, 1, 0, 0],\n },\n CENTERS: {\n permutation: [1, 5, 2, 0, 4, 3],\n orientation: [1, 1, 1, 1, 0, 1],\n },\n },\n r: {\n EDGES: {\n permutation: [4, 8, 0, 3, 6, 10, 2, 7, 5, 9, 1, 11],\n orientation: [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [4, 0, 2, 3, 7, 5, 6, 1],\n orientation: [2, 1, 0, 0, 1, 0, 0, 2],\n },\n CENTERS: {\n permutation: [2, 1, 5, 3, 0, 4],\n orientation: [0, 0, 0, 1, 2, 2],\n },\n },\n b: {\n EDGES: {\n permutation: [0, 5, 10, 1, 4, 7, 11, 3, 8, 9, 6, 2],\n orientation: [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1],\n },\n CORNERS: {\n permutation: [0, 7, 1, 3, 4, 5, 2, 6],\n orientation: [0, 2, 1, 0, 0, 0, 2, 1],\n },\n CENTERS: {\n permutation: [3, 0, 2, 5, 4, 1],\n orientation: [3, 3, 0, 3, 1, 3],\n },\n },\n d: {\n EDGES: {\n permutation: [0, 1, 2, 3, 7, 4, 5, 6, 9, 11, 8, 10],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [0, 1, 2, 3, 5, 6, 7, 4],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 4, 1, 2, 3, 5],\n orientation: [0, 0, 0, 0, 0, 1],\n },\n },\n },\n};\n\ncube3x3x3KPuzzleDefinition.moves[\"Uw\"] = cube3x3x3KPuzzleDefinition.moves[\"u\"];\ncube3x3x3KPuzzleDefinition.moves[\"Lw\"] = cube3x3x3KPuzzleDefinition.moves[\"l\"];\ncube3x3x3KPuzzleDefinition.moves[\"Fw\"] = cube3x3x3KPuzzleDefinition.moves[\"f\"];\ncube3x3x3KPuzzleDefinition.moves[\"Rw\"] = cube3x3x3KPuzzleDefinition.moves[\"r\"];\ncube3x3x3KPuzzleDefinition.moves[\"Bw\"] = cube3x3x3KPuzzleDefinition.moves[\"b\"];\ncube3x3x3KPuzzleDefinition.moves[\"Dw\"] = cube3x3x3KPuzzleDefinition.moves[\"d\"];\n\ncube3x3x3KPuzzleDefinition.moves[\"Rv\"] = cube3x3x3KPuzzleDefinition.moves[\"x\"];\ncube3x3x3KPuzzleDefinition.moves[\"Uv\"] = cube3x3x3KPuzzleDefinition.moves[\"y\"];\ncube3x3x3KPuzzleDefinition.moves[\"Fv\"] = cube3x3x3KPuzzleDefinition.moves[\"z\"];\ncube3x3x3KPuzzleDefinition.moves[\"Lv\"] = {\n EDGES: {\n permutation: [2, 10, 6, 11, 0, 8, 4, 9, 1, 3, 5, 7],\n orientation: [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],\n },\n CORNERS: {\n permutation: [1, 7, 6, 2, 0, 3, 5, 4],\n orientation: [2, 1, 2, 1, 1, 2, 1, 2],\n },\n CENTERS: {\n permutation: [4, 1, 0, 3, 5, 2],\n orientation: [2, 1, 0, 3, 2, 0],\n },\n};\ncube3x3x3KPuzzleDefinition.moves[\"Dv\"] = {\n EDGES: {\n permutation: [3, 0, 1, 2, 7, 4, 5, 6, 9, 11, 8, 10],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [3, 0, 1, 2, 5, 6, 7, 4],\n orientation: [0, 0, 0, 0, 0, 0, 0, 0],\n },\n CENTERS: {\n permutation: [0, 4, 1, 2, 3, 5],\n orientation: [3, 0, 0, 0, 0, 1],\n },\n};\ncube3x3x3KPuzzleDefinition.moves[\"Bv\"] = {\n EDGES: {\n permutation: [8, 5, 10, 1, 9, 7, 11, 3, 4, 0, 6, 2],\n orientation: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n },\n CORNERS: {\n permutation: [4, 7, 1, 0, 5, 3, 2, 6],\n orientation: [1, 2, 1, 2, 2, 1, 2, 1],\n },\n CENTERS: {\n permutation: [3, 0, 2, 5, 4, 1],\n orientation: [3, 3, 3, 3, 1, 3],\n },\n};\n", "export { KPuzzle } from \"./KPuzzle\";\nexport type {\n KPuzzleDefinition,\n KStateData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nexport { KState } from \"./KState\";\nexport { KTransformation } from \"./KTransformation\";\n\nimport { cube3x3x3KPuzzleDefinition } from \"./3x3x3/3x3x3.kpuzzle.json\";\nimport { KPuzzle } from \"./KPuzzle\";\nexport const experimental3x3x3KPuzzle = new KPuzzle(cube3x3x3KPuzzleDefinition);\n", "export function identityPermutation(numElems: number): number[] {\n const arr = new Array<number>(numElems);\n for (let i = 0; i < numElems; i++) {\n arr[i] = i;\n }\n return arr;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function orientationsToMask(\n radix: number,\n orientations: number[],\n): number {\n let val = 0;\n for (const orientation of orientations) {\n val *= radix;\n val += orientation;\n }\n return val;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function maskToOrientations(\n radix: number,\n numElems: number,\n mask: number,\n): number[] {\n const arr = [];\n while (mask > 0) {\n arr.push(mask % radix);\n mask = Math.floor(mask / radix);\n }\n return new Array<number>(numElems - arr.length).fill(0).concat(arr.reverse());\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function permutationToLex(permutation: number[]): number {\n const n = permutation.length;\n let lexicographicIdx = 0;\n for (let i = 0; i < n - 1; i++) {\n lexicographicIdx = lexicographicIdx * (n - i);\n for (let j = i + 1; j < n; j++) {\n if (permutation[i] > permutation[j]) {\n lexicographicIdx += 1;\n }\n }\n }\n return lexicographicIdx;\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function lexToPermutation(\n numPieces: number,\n lexicographicIdx: number,\n): number[] {\n const permutation: number[] = new Array(numPieces);\n permutation[numPieces - 1] = 0;\n for (let i = numPieces - 2; i >= 0; i--) {\n permutation[i] = lexicographicIdx % (numPieces - i);\n lexicographicIdx = Math.floor(lexicographicIdx / (numPieces - i));\n for (let j = i + 1; j < numPieces; j++) {\n if (permutation[j] >= permutation[i]) {\n permutation[j] = permutation[j] + 1;\n }\n }\n }\n return permutation;\n}\n", "import { Alg } from \"../../alg\";\nimport { experimental3x3x3KPuzzle, KTransformation } from \"../../kpuzzle\";\nimport type { KState } from \"../../kpuzzle/KState\";\n\nexport function puzzleOrientationIdx(state: KState): [number, number] {\n const idxU = state.stateData[\"CENTERS\"].pieces[0];\n const idxD = state.stateData[\"CENTERS\"].pieces[5];\n const unadjustedIdxL = state.stateData[\"CENTERS\"].pieces[1];\n let idxL = unadjustedIdxL;\n if (idxU < unadjustedIdxL) {\n idxL--;\n }\n if (idxD < unadjustedIdxL) {\n idxL--;\n }\n return [idxU, idxL];\n}\n\nconst puzzleOrientationCacheRaw: KTransformation[][] = new Array(6)\n .fill(0)\n .map(() => {\n return new Array<KTransformation>(6);\n });\n\nconst puzzleOrientationCacheInitialized = false;\nfunction puzzleOrientationCache(): KTransformation[][] {\n if (!puzzleOrientationCacheInitialized) {\n // We use a new block to avoid keeping a reference to temporary vars.\n // kpuzzle todo\n {\n const uAlgs: Alg[] = [\"\", \"z\", \"x\", \"z'\", \"x'\", \"x2\"].map((s) =>\n Alg.fromString(s),\n );\n const yAlg = new Alg(\"y\");\n for (const uAlg of uAlgs) {\n let transformation = experimental3x3x3KPuzzle.algToTransformation(uAlg);\n for (let i = 0; i < 4; i++) {\n transformation = transformation.applyAlg(yAlg);\n const [idxU, idxL] = puzzleOrientationIdx(transformation.toKState());\n puzzleOrientationCacheRaw[idxU][idxL] = transformation.invert();\n }\n }\n }\n }\n return puzzleOrientationCacheRaw;\n}\n\nexport function normalizePuzzleOrientation(state: KState): KState {\n const [idxU, idxL] = puzzleOrientationIdx(state);\n const orientationTransformation = puzzleOrientationCache()[idxU][idxL];\n return state.applyTransformation(orientationTransformation);\n}\n\n// TODO: combine with `orientPuzzle`?\nexport function reorientPuzzle(\n state: KState,\n idxU: number,\n idxL: number,\n): KState {\n return state.applyTransformation(\n puzzleOrientationCache()[idxU][idxL].invert(),\n );\n}\n", "import { experimental3x3x3KPuzzle, KState } from \"../../kpuzzle\";\nimport {\n identityPermutation,\n lexToPermutation,\n maskToOrientations,\n orientationsToMask,\n permutationToLex,\n} from \"./orbit-indexing\";\nimport {\n normalizePuzzleOrientation,\n puzzleOrientationIdx,\n reorientPuzzle,\n} from \"./puzzle-orientation\";\n\ntype Binary3x3x3State = ArrayBuffer;\n\n// Bit lengths of the encoded components, in order.\nconst BIT_LENGTHS = [29, 12, 16, 13, 3, 2, 1, 12];\n\n// These fields are sorted by the order in which they appear in the binary format.\nexport interface Binary3x3x3Components {\n epLex: number; // 29 bits, edge permutation\n eoMask: number; // 12 bits, edge orientation\n cpLex: number; // 16 bits, corner permutation\n coMask: number; // 13 bits, corner orientation\n poIdxU: number; // 3 bits, puzzle orientation (U face)\n poIdxL: number; // 2 bits, puzzle orientation (L face)\n moSupport: number; // 1 bit, center orientation support\n moMask: number; // 12 bits, center orientation\n}\n\n// There are various clever ways to do this, but this is simple and efficient.\nfunction arraySum(arr: number[]): number {\n let total = 0;\n for (const entry of arr) {\n total += entry;\n }\n return total;\n}\n\n// Due to limitations in JS bit operations, this is unsafe if any of the bit lengths span across the contents of more than 4 bytes.\n// - Safe: [8, 32]\n// - Unsafe: [4, 32, 4]\n// - Unsafe: [40, 4]\nfunction splitBinary(bitLengths: number[], buffy: ArrayBuffer): number[] {\n const u8buffy = new Uint8Array(buffy);\n let at = 0;\n let bits = 0;\n let accum = 0;\n const values: number[] = [];\n for (const bitLength of bitLengths) {\n while (bits < bitLength) {\n accum = (accum << 8) | u8buffy[at++];\n bits += 8;\n }\n values.push((accum >> (bits - bitLength)) & ((1 << bitLength) - 1));\n bits -= bitLength;\n }\n return values;\n}\n\n// See above for safety notes.\nfunction concatBinary(bitLengths: number[], values: number[]): ArrayBuffer {\n const buffy = new Uint8Array(Math.ceil(arraySum(bitLengths) / 8));\n let at = 0;\n let bits = 0;\n let accum = 0;\n for (let i = 0; i < bitLengths.length; i++) {\n accum = (accum << bitLengths[i]) | values[i];\n bits += bitLengths[i];\n while (bits >= 8) {\n buffy[at++] = accum >> (bits - 8);\n bits -= 8;\n }\n }\n if (bits > 0) {\n buffy[at++] = accum << (8 - bits);\n }\n return buffy;\n}\n\n// 0x111 (for idxU) means \"not supported\"\nfunction supportsPuzzleOrientation(components: Binary3x3x3Components): boolean {\n return components.poIdxU !== 7;\n}\n\nexport function reid3x3x3ToBinaryComponents(\n state: KState,\n): Binary3x3x3Components {\n const normedState = normalizePuzzleOrientation(state);\n\n const epLex = permutationToLex(normedState.stateData[\"EDGES\"].pieces);\n const eoMask = orientationsToMask(\n 2,\n normedState.stateData[\"EDGES\"].orientation,\n );\n const cpLex = permutationToLex(normedState.stateData[\"CORNERS\"].pieces);\n const coMask = orientationsToMask(\n 3,\n normedState.stateData[\"CORNERS\"].orientation,\n );\n const [poIdxU, poIdxL] = puzzleOrientationIdx(state);\n const moSupport = 1; // Required for now.\n const moMask = orientationsToMask(\n 4,\n normedState.stateData[\"CENTERS\"].orientation,\n );\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\nexport function binaryComponentsToTwizzleBinary(\n components: Binary3x3x3Components,\n): Binary3x3x3State {\n const { epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask } =\n components;\n\n return concatBinary(BIT_LENGTHS, [\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n ]);\n}\n\nexport function reid3x3x3ToTwizzleBinary(state: KState): Binary3x3x3State {\n const components: Binary3x3x3Components = reid3x3x3ToBinaryComponents(state);\n return binaryComponentsToTwizzleBinary(components);\n}\n\nexport function twizzleBinaryToBinaryComponents(\n buffer: ArrayBuffer,\n): Binary3x3x3Components {\n const [epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask] =\n splitBinary(BIT_LENGTHS, buffer);\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\nexport function binaryComponentsToReid3x3x3(\n components: Binary3x3x3Components,\n): KState {\n if (components.moSupport !== 1) {\n throw new Error(\"Must support center orientation.\");\n }\n\n const normedState = new KState(experimental3x3x3KPuzzle, {\n EDGES: {\n pieces: lexToPermutation(12, components.epLex),\n orientation: maskToOrientations(2, 12, components.eoMask),\n },\n CORNERS: {\n pieces: lexToPermutation(8, components.cpLex),\n orientation: maskToOrientations(3, 8, components.coMask),\n },\n CENTERS: {\n pieces: identityPermutation(6),\n orientation: maskToOrientations(4, 6, components.moMask),\n },\n });\n\n if (!supportsPuzzleOrientation(components)) {\n return normedState;\n }\n\n return reorientPuzzle(normedState, components.poIdxU, components.poIdxL);\n}\n\n// Returns a list of error string.\n// An empty list means validation success.\nfunction validateComponents(components: Binary3x3x3Components): string[] {\n const errors = [];\n if (components.epLex < 0 || components.epLex >= 479001600) {\n errors.push(`epLex (${components.epLex}) out of range`);\n }\n if (components.cpLex < 0 || components.cpLex >= 40320) {\n errors.push(`cpLex (${components.cpLex}) out of range`);\n }\n if (components.coMask < 0 || components.coMask >= 6561) {\n errors.push(`coMask (${components.coMask}) out of range`);\n }\n if (components.poIdxU < 0 || components.poIdxU >= 6) {\n // 0x111 (for idxU) means \"not supported\"\n if (supportsPuzzleOrientation(components)) {\n errors.push(`poIdxU (${components.poIdxU}) out of range`);\n }\n }\n // The following cannot be (f decoded from binary properl) out of rangey.\n if (components.eoMask < 0 || components.eoMask >= 4096) {\n errors.push(`eoMask (${components.eoMask}) out of range`);\n }\n if (components.moMask < 0 || components.moMask >= 4096) {\n errors.push(`moMask (${components.moMask}) out of range`);\n }\n if (components.poIdxL < 0 || components.poIdxL >= 4) {\n errors.push(`poIdxL (${components.poIdxL}) out of range`);\n }\n if (components.moSupport < 0 || components.moSupport >= 2) {\n errors.push(`moSupport (${components.moSupport}) out of range`);\n }\n return errors;\n}\n\nexport function twizzleBinaryToReid3x3x3(buffy: ArrayBuffer): KState {\n const components = twizzleBinaryToBinaryComponents(buffy);\n const errors = validateComponents(components);\n if (errors.length !== 0) {\n throw new Error(`Invalid binary state components: ${errors.join(\", \")}`);\n }\n return binaryComponentsToReid3x3x3(components);\n}\n", "export function bufferToSpacedHex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nexport function spacedHexToBuffer(hex: string): Uint8Array {\n return new Uint8Array(hex.split(\" \").map((c) => parseInt(c, 16)));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/cubing/vendor/xyzzy/fto-solver.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n/* ftosolver.js - An FTO solver\nversion 0.5.1 (2021-04-20)\n\nCopyright (c) 2016, 2020, 2021\n\nFrom https://gist.github.com/torchlight/9a5c53da09d8e090756a228f4b5f3471\nOriginally MIT licensed, added to `cubing.js` under the GPL license by permission from the author (@torchlight/xyzzy).\n\nCompatibility note:\nThis is targeted at Firefox / Spidermonkey releases from 2019 and onwards. It might not run on older\nJavaScript engines. Recent Chrome / Node releases should also work, but are not tested as much.\n*/\n\nimport { randomUIntBelowFactory } from \"../random-uint-below\";\n\n/* Helper functions */\n\nfunction counter(A) {\n let counts = [];\n for (let a of A) counts[a] = (counts[a] || 0) + 1;\n return counts;\n}\n\n/* Combinatoric functions */\n\nfunction factorial(n) {\n if (n < 2) return n;\n let f = 1;\n for (let i = 2; i <= n; i++) f *= i;\n return f;\n}\n\nfunction C(n, k) {\n if (k < 0 || k > n) return 0;\n if (k === 0 || k === n) return 1;\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 C4(n, k0, k1, k2, k3 = n - k0 - k1 - k2) {\n return C(n, k0 + k1) * C(k0 + k1, k0) * C(k2 + k3, k2);\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]) parity ^= 1;\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]) perm[j]++;\n else parity ^= 1;\n }\n }\n if (parity === 1) [perm[n - 2], perm[n - 1]] = [perm[n - 1], perm[n - 2]];\n return perm;\n}\n\nfunction evenpermutation_to_index(perm) {\n return permutation_to_index(perm) >> 1;\n}\n\nlet [evenpermutation8_to_index, index_to_evenpermutation8] = (() => {\n let index_in_set_bits = new Int8Array(256 * 8);\n let look_up_set_bits = new Int8Array(256 * 8);\n for (let i = 0; i < 256; i++) {\n for (let j = 0, counter = 0; j < 8; j++) {\n if (((i >>> j) & 1) === 0) {\n continue;\n }\n index_in_set_bits[(j << 8) | i] = counter;\n look_up_set_bits[(counter << 8) | i] = j;\n counter++;\n }\n }\n\n function evenpermutation8_to_index(perm) {\n let unused = 0xff; // track which values in 0..7 haven't been used so far\n let f = 2520; // = 7!/2\n let ind = 0;\n for (let i = 0; i < 6; i++) {\n let v = perm[i];\n ind += index_in_set_bits[unused | (v << 8)] * f;\n unused &= ~(1 << v);\n f /= 7 - i;\n }\n return ind;\n }\n\n // note: this is *not* a drop-in replacement for index_to_evenpermutation!\n function index_to_evenpermutation8(ind, perm) {\n let unused = 0xff;\n let f = 2520; // = 7!/2\n let parity = 0;\n for (let i = 0; i < 6; i++) {\n let a = (ind / f) | 0;\n ind -= a * f;\n parity ^= a & 1;\n let v = look_up_set_bits[unused | (a << 8)];\n perm[i] = v;\n unused &= ~(1 << v);\n f /= 7 - i;\n }\n // the last two elements are uniquely determined by the others\n perm[6] = look_up_set_bits[unused | (parity << 8)];\n perm[7] = look_up_set_bits[unused | ((parity ^ 1) << 8)];\n return perm;\n }\n\n return [evenpermutation8_to_index, index_to_evenpermutation8];\n})();\n\nfunction random_permutation(n, randomUintBelow) {\n let p = [0];\n for (let i = 1; i < n; i++) {\n let r = randomUintBelow(i + 1);\n p[i] = p[r];\n p[r] = i;\n }\n return p;\n}\n\nfunction random_even_permutation(n, randomUintBelow) {\n let p = random_permutation(n, randomUintBelow);\n if (permutation_parity(p) === 1) {\n [p[0], p[1]] = [p[1], p[0]];\n }\n return p;\n}\n\nfunction comb_to_index(l) {\n let bits = l.length;\n let ones = 0;\n for (let i = 0; i < bits; i++) ones += +(l[i] === 1);\n let zeros = bits - ones;\n if (zeros === 0 || ones === 0 || bits === 1) return 0;\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 } // l[i] === 1\n else {\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\n// this is \"incorrect\" for n=0 but that's out of scope\nfunction ctz(n) {\n n |= 0;\n return 31 - Math.clz32(n ^ (n - 1));\n}\n\nlet comb_lookup_tables = {};\nfunction generate_comb_lookup_tables(n, k) {\n // 2 <= n <= 28, 0 <= k <= n\n n |= 0;\n k |= 0;\n let key = n + \" \" + k;\n if (comb_lookup_tables[key]) {\n return comb_lookup_tables[key];\n }\n let total = C(n, k);\n let index_to_comb_table = new Uint32Array(total);\n let comb_to_index_table = new Uint32Array(1 << n).fill(-1);\n for (let i = 0, c = (1 << k) - 1; i < total; i++) {\n index_to_comb_table[i] = c;\n comb_to_index_table[c] = i;\n let t = c | (c - 1);\n c = (t + 1) | (((~t & -~t) - 1) >> (ctz(c) + 1));\n }\n return (comb_lookup_tables[key] = [index_to_comb_table, comb_to_index_table]);\n}\n\nfunction popcount(n) {\n n |= 0;\n let c = 0;\n while (n !== 0) {\n n &= n - 1;\n c++;\n }\n return c;\n}\n\nfunction spread_bits(n) {\n n &= 0xffff;\n n = (n | (n << 8)) & 0x00ff00ff;\n n = (n | (n << 4)) & 0x0f0f0f0f;\n n = (n | (n << 2)) & 0x33333333;\n n = (n | (n << 1)) & 0x55555555;\n return n;\n}\n\nfunction interleave_bits(x, y) {\n return spread_bits(x) | (spread_bits(y) << 1);\n}\n\nlet comb4_lookup_tables = {};\nfunction generate_comb4_lookup_tables(n, k0, k1, k2, k3) {\n // 3 <= n <= 14\n // 0 <= k0,k1,k2,k3 <= n\n // n = k0 + k1 + k2 + k3\n // WARNING: This does not return the combinations in sorted order.\n // (but if only two of k0,k1,k2,k3 are nonzero, then they will be sorted)\n n |= 0;\n k0 |= 0;\n k1 |= 0;\n k2 |= 0;\n k3 |= 0;\n if (n !== k0 + k1 + k2 + k3) {\n throw \"generate_comb4_lookup_tables: invalid parameters\";\n }\n let key = [n, k0, k1, k2, k3].join(\" \");\n if (comb4_lookup_tables[key]) {\n return comb4_lookup_tables[key];\n }\n let [itcl, ctil] = generate_comb_lookup_tables(n, k1 + k3);\n let [itch, ctih] = generate_comb_lookup_tables(n, k2 + k3);\n let total = C4(n, k0, k1, k2, k3);\n let index_to_comb4_table = new Uint32Array(total);\n let comb4_to_index_table = new Uint32Array(4 ** n).fill(-1);\n for (let i = 0, index = 0; i < itch.length; i++) {\n let ch = itch[i];\n for (let j = 0; j < itcl.length; j++) {\n let cl = itcl[j];\n if (popcount(cl & ch) === k3) {\n let c = interleave_bits(cl, ch);\n index_to_comb4_table[index] = c;\n comb4_to_index_table[c] = index;\n index++;\n }\n }\n }\n return (comb4_lookup_tables[key] = [\n index_to_comb4_table,\n comb4_to_index_table,\n ]);\n}\n\nfunction compose(A, B) {\n let C = [];\n for (let i = 0; i < B.length; i++) C[i] = A[B[i]];\n return C;\n}\n\nfunction compose3(A, B, C) {\n let D = [];\n for (let i = 0; i < C.length; i++) D[i] = A[B[C[i]]];\n return D;\n}\n\nfunction compose_o(A, B) {\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];\n }\n return [p, o];\n}\n\n/*\nfunction permutation_from_cycle(cycle, n)\n{\n\tlet perm = [];\n\tfor (let i = 0; i < n; i++) {perm[i] = i};\n\tfor (let i = 0; i < cycle.length; i++)\n\t{\n\t\tperm[cycle[i]] = cycle[(i + 1) % cycle.length];\n\t}\n\treturn perm;\n}\n*/\n\nfunction permutation_from_cycles(cycles, n) {\n let perm = [];\n for (let i = 0; i < n; i++) {\n perm[i] = i;\n }\n for (let cycle of cycles) {\n for (let i = 0; i < cycle.length; i++) {\n perm[cycle[i]] = cycle[(i + 1) % cycle.length];\n }\n }\n return perm;\n}\n\nfunction reduce_permutation(perm, keep) {\n // perm: a permutation\n // keep: array of booleans, of the same length as perm\n let n = perm.length;\n let count = Array(n).fill(0);\n for (let i = 1; i < n; i++) {\n count[i] = count[i - 1] + keep[i - 1];\n }\n let nn = count[n - 1] + keep[n - 1];\n let reduced = Array(nn);\n for (let i = 0; i < n; i++) {\n if (keep[i]) {\n reduced[count[i]] = count[perm[i]];\n }\n }\n return reduced;\n}\n\nfunction invert_permutation(perm) {\n let n = perm.length;\n let inverse = Array(n);\n for (let i = 0; i < n; i++) {\n inverse[perm[i]] = i;\n }\n return inverse;\n}\n\nfunction gcd(a, b) {\n while (a && b) {\n [a, b] = [b % a, a];\n }\n return Math.abs(a + b);\n}\n\nfunction lcm(a, b) {\n return (a * b) / gcd(a, b);\n}\n\nfunction permutation_order(perm) {\n let order = 1;\n let n = perm.length;\n let visited = Array(n).fill(false);\n let i = -1;\n while (true) {\n i = visited.indexOf(false, i + 1);\n if (i === -1) {\n break;\n }\n let cycle_length = 0;\n let j = i;\n while (!visited[j]) {\n visited[j] = true;\n j = perm[j];\n cycle_length++;\n }\n //console.log(cycle_length);\n order = lcm(order, cycle_length);\n }\n return order;\n}\n\n/*\nFacelet layout:\n\t\t\t\tU\t\t\t\t\t\t\t\t\tB\n\t\t8\t7\t6\t5\t4\t\t\t\t\t67\t68\t69\t70\t71\n\t44\t\t3\t2\t1\t\t49\t\t\t22\t\t64\t65\t66\t\t35\n\t43\t39\t\t0\t\t46\t50\t\t\t23\t19\t\t63\t\t30\t34\nL\t42\t38\t36\t\t45\t47\t51\tR\tBR\t24\t20\t18\t\t27\t29\t33\tBL\n\t41\t37\t\t9\t\t48\t52\t\t\t25\t21\t\t54\t\t28\t32\n\t40\t\t10\t11\t12\t\t53\t\t\t26\t\t57\t56\t55\t\t31\n\t\t13\t14\t15\t16\t17\t\t\t\t\t62\t61\t60\t59\t58\n\t\t\t\tF\t\t\t\t\t\t\t\t\tD\n\nWe'll be using the facelet permutations as the underlying representation. This specific labelling\ngives us three symmetries that can be written very compactly, and this turns out to be enough to\ngenerate any face move from any other face move.\n\nWhich is nice, because I don't have an FTO and it would be very error prone if I were to write out\nevery move individually.\n\nX = T2\nY = Ro Lo' (I think)\nZ = mirroring so that U swaps with L and F swaps with R\n\nFaces / colours (Lanlan colour scheme):\n0: U (white)\n1: F (red)\n2: BR (grey)\n3: BL (orange)\n4: L (purple)\n5: R (green)\n6: D (yellow)\n7: B (blue)\n*/\n\nlet solved_state = Array(72)\n .fill()\n .map((_, i) => (i / 9) | 0);\n\nlet move_U = permutation_from_cycles(\n [\n [0, 4, 8],\n [1, 6, 3],\n [2, 5, 7],\n [9, 22, 35],\n [45, 67, 44],\n [47, 68, 43],\n [46, 69, 39],\n [50, 70, 38],\n [49, 71, 36],\n ],\n 72,\n);\nlet move_Ui = compose(move_U, move_U);\n\nlet move_X = Array(72)\n .fill()\n .map((_, i) => ((i / 18) | 0) * 18 + ((i + 9) % 18));\nlet move_Y = Array(72)\n .fill()\n .map((_, i) => ((i / 36) | 0) * 36 + ((i + 18) % 36));\nlet move_Z = Array(72)\n .fill()\n .map((_, i) => (i + 36) % 72);\n\n// Z changes sign, so this is really setting up to U' rather than U\nlet move_L = compose3(move_Z, move_Ui, move_Z);\nlet move_F = compose3(move_X, move_U, move_X);\nlet move_R = compose3(move_X, move_L, move_X);\n\n//let move_BR = compose3(move_Y, move_U, move_Y);\n//let move_BL = compose3(move_Y, move_F, move_Y);\n//let move_B = compose3(move_Y, move_R, move_Y);\n//let move_D = compose3(move_Y, move_L, move_Y);\n\nlet move_Us = permutation_from_cycles(\n [\n [10, 24, 30],\n [11, 23, 34],\n [12, 19, 33],\n [42, 48, 64],\n [41, 52, 65],\n [37, 51, 66],\n ],\n 72,\n);\nlet move_Uw = compose(move_U, move_Us);\nlet move_Uwi = compose(move_Uw, move_Uw);\n\nlet move_Lw = compose3(move_Z, move_Uwi, move_Z);\nlet move_Fw = compose3(move_X, move_Uw, move_X);\nlet move_Rw = compose3(move_X, move_Lw, move_X);\n\nlet colour_map = Array(72)\n .fill()\n .map((_, i) => (i / 9) | 0);\n\nlet corner_piece_facelets = [\n [0, 45, 9, 36], // U-F\n [4, 67, 22, 49], // U-BR\n [8, 44, 35, 71], // U-BL\n [13, 58, 31, 40], // F-BL\n [17, 53, 26, 62], // F-BR\n [18, 63, 27, 54], // BR-BL\n];\n\nlet edge_piece_facelets = [\n [1, 46], // U-R\n [3, 39], // U-L\n [6, 69], // U-B\n [10, 37], // F-L\n [33, 42], // BL-L\n [12, 48], // F-R *\n [15, 60], // F-D *\n [24, 51], // BR-R *\n [19, 64], // BR-B **\n [28, 55], // BL-D **\n [30, 66], // BL-B **\n [21, 57], // BR-D **\n];\n\nlet centreA_piece_facelets = Array(12)\n .fill()\n .map((_, i) => ((i / 3) | 0) * 9 + [2, 5, 7][i % 3]);\nlet centreB_piece_facelets = centreA_piece_facelets.map((x) => x + 36);\n\n/*\nfacelet definition sanity test:\nall corner facelets are 0,4,8 mod 9; facelet order is always in U,R,U,R orbits\nall edge facelets are 1,3,6 mod 9; facelet order is always in U,R orbits\nall centre facelets are 2,5,7 mod 9\n\nfunction facelet_sanity_test()\n{\nif (corner_piece_facelets.length !== 6) {console.log('wrong number of corner pieces'); return;}\nif (edge_piece_facelets.length !== 12) {console.log('wrong number of edge pieces'); return;}\nif (!corner_piece_facelets.every(x => {return x.every(y => y % 9 % 4 === 0) && x[0] < 36 && x[2] < 36 && x[1] >= 36 && x[3] >= 36;}))\n{\n\tconsole.log('corner pieces weird');\n\treturn;\n}\nif (!edge_piece_facelets.every(x => {return x.every(y => [1,3,6].indexOf(y % 9) !== -1) && x[0] < 36 && x[1] >= 36;}))\n{\n\tconsole.log('edge pieces weird');\n\treturn;\n}\n}\n\n*/\n\nfunction identify_corner_piece(colourA, colourB) {\n // return a 2-tuple [p, o] where\n // p in {0,1,2,3,4,5} is the corner piece's ID and\n // o in {0,1} is its orientation\n for (let i = 0; i < 6; i++) {\n if (\n colourA === colour_map[corner_piece_facelets[i][0]] &&\n colourB === colour_map[corner_piece_facelets[i][2]]\n ) {\n return [i, 0];\n } else if (\n colourA === colour_map[corner_piece_facelets[i][2]] &&\n colourB === colour_map[corner_piece_facelets[i][0]]\n ) {\n return [i, 1];\n }\n }\n throw \"unknown corner piece\";\n}\n\nfunction identify_edge_piece(colourA, colourB) {\n // return p in {0..11} the edge piece's ID\n // (edges are not flippable on the FTO)\n for (let i = 0; i < 12; i++) {\n if (\n colourA === colour_map[edge_piece_facelets[i][0]] &&\n colourB === colour_map[edge_piece_facelets[i][1]]\n ) {\n return i;\n }\n if (\n colourB === colour_map[edge_piece_facelets[i][0]] &&\n colourA === colour_map[edge_piece_facelets[i][1]]\n ) {\n return i;\n }\n }\n throw \"unknown edge piece\";\n}\n\nfunction get_corner_piece(facelets, location) {\n return identify_corner_piece(\n facelets[corner_piece_facelets[location][0]],\n facelets[corner_piece_facelets[location][2]],\n );\n}\n\nfunction get_edge_piece(facelets, location) {\n return identify_edge_piece(\n facelets[edge_piece_facelets[location][0]],\n facelets[edge_piece_facelets[location][1]],\n );\n}\n\nfunction set_corner_piece(facelets, location, value, orientation) {\n let indices = corner_piece_facelets[location];\n let colours = corner_piece_facelets[value].map((x) => colour_map[x]);\n if (orientation % 2 !== 0) {\n colours = [colours[2], colours[3], colours[0], colours[1]];\n }\n for (let i = 0; i < 4; i++) {\n facelets[indices[i]] = colours[i];\n }\n}\n\nfunction set_edge_piece(facelets, location, value) {\n let indices = edge_piece_facelets[location];\n let colours = edge_piece_facelets[value].map((x) => colour_map[x]);\n for (let i = 0; i < 2; i++) {\n facelets[indices[i]] = colours[i];\n }\n}\n\nfunction convert_move_to_permutations(move) {\n let state = move.map((x) => colour_map[x]);\n //console.log(state);\n let cp_raw = Array(6)\n .fill()\n .map((_, i) => get_corner_piece(state, i));\n let cp_half = cp_raw.map(([p, o]) => p + 6 * o);\n let cp = cp_half.concat(cp_half.map((x) => (x + 6) % 12));\n let ep = Array(12)\n .fill()\n .map((_, i) => get_edge_piece(state, i));\n let ap = Array(12)\n .fill()\n .map((_, i) =>\n centreA_piece_facelets.indexOf(move[centreA_piece_facelets[i]]),\n );\n let bp = Array(12)\n .fill()\n .map((_, i) =>\n centreB_piece_facelets.indexOf(move[centreB_piece_facelets[i]]),\n );\n return { cp: cp, ep: ep, ap: ap, bp: bp };\n}\n\nlet moves = [\n move_U,\n move_L,\n move_F,\n move_R,\n move_Uw,\n move_Lw,\n move_Fw,\n move_Rw,\n];\nlet move_names = [\"U\", \"L\", \"F\", \"R\", \"u\", \"l\", \"f\", \"r\"];\n\nlet move_permutations = moves.map(convert_move_to_permutations);\n\n/*\nlet commute_table = (function () {\n\tlet n = moves.length;\n\tlet t = Array(n);\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tt[i] = Array(n);\n\t\tfor (let j = 0; j < n; j++)\n\t\t{\n\t\t\tlet a = compose(moves[i], moves[j]);\n\t\t\tlet b = compose(moves[j], moves[i]);\n\t\t\tt[i][j] = (a.join(' ') === b.join(' '));\n\t\t}\n\t}\n\treturn t;\n})();\n*/\n\n// generate a random state with the BR-BL corner solved\nfunction random_state(randomUintBelow) {\n let facelets = Array(72);\n let cp = random_even_permutation(5, randomUintBelow);\n cp.push(5);\n let co = Array(4)\n .fill()\n .map((_) => randomUintBelow(2));\n co.push(co.reduce((x, y) => x ^ y));\n co.push(0);\n for (let i = 0; i < 6; i++) {\n set_corner_piece(facelets, i, cp[i], co[i]);\n }\n\n let ep = random_even_permutation(12, randomUintBelow);\n for (let i = 0; i < 12; i++) {\n set_edge_piece(facelets, i, ep[i]);\n }\n\n let a = random_permutation(12, randomUintBelow).map((x) => (x / 3) | 0);\n let b = random_permutation(12, randomUintBelow).map((x) => 4 + ((x / 3) | 0));\n for (let i = 0; i < 12; i++) {\n facelets[centreA_piece_facelets[i]] = a[i];\n facelets[centreB_piece_facelets[i]] = b[i];\n }\n return facelets;\n}\n\nfunction stringify_move_sequence(move_sequence, no_wide = false) {\n if (no_wide) {\n const U = 0,\n L = 1,\n F = 2,\n R = 3,\n D = 4,\n BR = 5,\n B = 6,\n BL = 7;\n move_sequence = move_sequence.map((x) => x.slice());\n let ordering = [U, L, F, R, D, BR, B, BL];\n let rotations = [\n [U, R, BR, B, D, BL, L, F],\n [BL, L, U, B, R, BR, D, F],\n [BL, D, F, L, R, U, B, BR],\n [F, D, BR, R, B, U, L, BL],\n ];\n rotations = rotations.concat(rotations.map((p) => invert_permutation(p)));\n for (let i = 0; i < move_sequence.length; i++) {\n if (move_sequence[i][0] < 4) {\n // it's already a single-layer turn\n move_sequence[i][0] = ordering[move_sequence[i][0]];\n } else {\n // it's a double-layer turn and we need to Do Stuff\n let m = ordering[move_sequence[i][0]];\n let r = move_sequence[i][1];\n move_sequence[i][0] = m;\n ordering = compose(r === 1 ? rotations[m ^ 4] : rotations[m], ordering);\n //console.log(ordering);\n }\n }\n }\n let names = no_wide ? \"U L F R D BR B BL\".split(\" \") : move_names; // WARNING: this ordering is _not_ the same as the facelet colours\n let suffixes = [\"0\", \"\", \"'\"];\n let s = move_sequence.map(([m, r]) => 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(state, moves[m]);\n }\n }\n return state;\n}\n\nfunction invert_move_sequence(move_sequence) {\n return move_sequence.map(([m, r]) => [m, (3 - r) % 3]).reverse();\n}\n\nfunction simplify_move_sequence(move_sequence, make_noise = false) {\n if (move_sequence.length === 0) {\n return [];\n }\n let simplified = [];\n let last_move = undefined;\n for (let [m, r] of move_sequence) {\n if (last_move && last_move[0] === m) {\n // turn of the same face\n last_move[1] += r;\n last_move[1] %= 3;\n if (last_move[1] === 0) {\n simplified.pop();\n last_move =\n simplified.length === 0\n ? undefined\n : simplified[simplified.length - 1];\n }\n } else if (\n simplified.length >= 2 &&\n (last_move[0] ^ m) === 4 &&\n simplified[simplified.length - 2][0] === m\n ) {\n // turn of the opposite face\n simplified[simplified.length - 2][1] += r;\n simplified[simplified.length - 2][1] %= 3;\n if (simplified[simplified.length - 2][1] === 0) {\n simplified.splice(simplified.length - 2, 1);\n }\n } else {\n last_move = [m, r];\n simplified.push(last_move);\n }\n }\n if (make_noise && \"\" + move_sequence !== \"\" + simplified) {\n console.log(`simplified ${move_sequence} to ${simplified}`);\n }\n return simplified;\n}\n\nfunction generate_random_state_scramble(randomUintBelow) {\n return stringify_move_sequence(\n invert_move_sequence(solve(random_state(randomUintBelow), true)),\n true,\n );\n}\n\nfunction generate_multiple_random_state_scrambles(n) {\n let scrambles = [];\n for (let i = 0; i < n; i++) {\n scrambles[i] = generate_random_state_scramble();\n }\n return scrambles;\n}\n\n/*\nActual solver logic goes here.\n\nUnlike most of the earlier random-state scramblers I've written before, this one comes with a slight\ncomplication: the FTO's states are _not_ a group. In other words, we can't skip inverting the\nsolution to get the scramble. Not a big deal.\n\nWe assume the D-BR-B-BL corner is solved. (If not, rotate puzzle accordingly.)\n\nPhase 1: Solve a small pyramid around the D-BR-B-BL corner.\n- centres #6, #9 in orbit A and #6, #9 in orbit B\n- edges #8, #9, #10, #11\nReduction: (132/9)**2 * (12*11*10*9) = 2555520\n\nPhase 2: Reduce to LU 2-gen.\n- remaining BR, D centres, one each of F, R centres (#5, #7, #8 in each orbit)\n- edges F-R, F-D, R-BR (#5, #6, #7)\n- corner F-BR (#4)\n- corner orientation constraint on the other four corners\nReduction: 120**2 * (8*7*6) * 10 * 4 = 193536000\n\nPhase 3: Finish solve.\n- remaining centres (#0..#4, #10, #11 in each orbit)\n- edges #0..#4\n- corners #0..#3\nReduction: 210**2 * (5!/2) * (4!/2*2) = 63504000\n\n\n*/\n\nfunction generate_mtable_comb_generic(n, k, permutations) {\n let N = C(n, k);\n let nmoves = permutations.length;\n let [itc, cti] = generate_comb_lookup_tables(n, k);\n let mtable = Array(nmoves)\n .fill()\n .map(() => new Uint32Array(N));\n for (let i = 0; i < N; i++) {\n let c = itc[i];\n let arr = Array(n);\n for (let j = 0; j < n; j++) {\n arr[j] = (c >> j) & 1;\n }\n for (let m = 0; m < nmoves; m++) {\n let arr2 = compose(arr, permutations[m]);\n let c2 = arr2.reduce((acc, x, j) => acc | (x << j), 0);\n mtable[m][i] = cti[c2];\n }\n }\n return mtable;\n}\n\nfunction generate_mtable_comb4_generic(n, k0, k1, k2, k3, permutations) {\n let N = C4(n, k0, k1, k2, k3);\n let nmoves = permutations.length;\n let [itc, cti] = generate_comb4_lookup_tables(n, k0, k1, k2, k3);\n let mtable = Array(nmoves)\n .fill()\n .map(() => new Uint32Array(N));\n for (let i = 0; i < N; i++) {\n let c = itc[i];\n let arr = Array(n);\n for (let j = 0; j < n; j++) {\n arr[j] = (c >> (2 * j)) & 3;\n }\n for (let m = 0; m < nmoves; m++) {\n let arr2 = compose(arr, permutations[m]);\n let c2 = arr2.reduce((acc, x, j) => acc | (x << (2 * j)), 0);\n mtable[m][i] = cti[c2];\n }\n }\n return mtable;\n}\n\nfunction generate_mtable_single_generic(permutations) {\n let n = permutations[0].length;\n let nmoves = permutations.length;\n let mtable = Array(nmoves)\n .fill()\n .map(() => new Uint32Array(n));\n for (let i = 0; i < n; i++) {\n for (let m = 0; m < nmoves; m++) {\n mtable[m][permutations[m][i]] = i;\n // we're using right-action convention here,\n // so we use the *inverse* of the permutation\n // to track how pieces move.\n }\n }\n return mtable;\n}\n\nfunction combine_mtables(mtable0, mtable1) {\n let n0 = mtable0[0].length;\n let n1 = mtable1[0].length;\n let nmoves = mtable0.length;\n let combined = Array(nmoves)\n .fill()\n .map(() => new Uint32Array(n0 * n1));\n for (let j = 0; j < n1; j++) {\n for (let i = 0; i < n0; i++) {\n let index = i + n0 * j;\n for (let m = 0; m < nmoves; m++) {\n combined[m][index] = mtable0[m][i] + n0 * mtable1[m][j];\n }\n }\n }\n return combined;\n}\n\nfunction trim_unreachable(mtable, origin) {\n // input: mtable\n // output: [trimmed mtable, map]\n let nmoves = mtable.length;\n let n = mtable[0].length;\n let reachable = new Uint8Array(n);\n reachable[origin] = 1;\n let done = false;\n while (!done) {\n done = true;\n for (let i = 0; i < n; i++) {\n if (!reachable[i]) {\n continue;\n }\n for (let m = 0; m < nmoves; m++) {\n if (!reachable[mtable[m][i]]) {\n reachable[mtable[m][i]] = 1;\n done = false;\n }\n }\n }\n }\n let map = new Int32Array(n).fill(-1);\n for (let i = 0, counter = 0; i < n; i++) {\n if (!reachable[i]) {\n continue;\n }\n map[i] = counter;\n counter++;\n }\n return [mtable.map((entry) => reduce_permutation(entry, reachable)), map];\n}\n\nfunction reduce_to_quotient(mtable, origins) {\n let nmoves = mtable.length;\n let n = mtable[0].length;\n let quotient_map = new Int32Array(n).fill(-1);\n origins.forEach((x) => {\n quotient_map[x] = 0;\n });\n let preimages = [origins];\n for (let image = 0; image < preimages.length; image++) {\n let equiv_class = preimages[image];\n for (let m = 0; m < nmoves; m++) {\n let j = mtable[m][equiv_class[0]];\n if (quotient_map[j] !== -1) {\n continue;\n } // already looked at those nodes\n let new_equiv_class = equiv_class.map((x) => mtable[m][x]);\n let new_image = preimages.length;\n preimages.push(new_equiv_class);\n for (let x of new_equiv_class) {\n if (quotient_map[x] !== -1) {\n throw \"quotienting failed\";\n }\n quotient_map[x] = new_image;\n }\n }\n }\n let n_quot = preimages.length;\n let mtable_quot = Array(nmoves)\n .fill()\n .map(() => new Int32Array(n_quot));\n for (let m = 0; m < nmoves; m++) {\n for (let i = 0; i < n_quot; i++) {\n mtable_quot[m][i] = quotient_map[mtable[m][preimages[i][0]]];\n }\n }\n return [mtable_quot, quotient_map];\n}\n\nfunction generate_mirrored_coordinate_table(mtable, a, b) {\n let n = mtable[0].length;\n let nmoves = mtable.length;\n let mirror_map = new Int32Array(n).fill(-1);\n mirror_map[a] = b;\n mirror_map[b] = a;\n let done = false;\n while (!done) {\n done = true;\n for (let i = 0; i < n; i++) {\n if (mirror_map[i] === -1) {\n continue;\n }\n let I = mirror_map[i];\n for (let m = 0; m < nmoves; m++) {\n let M = m ^ 1;\n let new_i = mtable[m][i];\n let new_I = mtable[M][mtable[M][I]];\n // convert moves according to this table:\n // U -> L2\n // L -> U2\n // F -> R2\n // R -> F2\n if (mirror_map[new_i] === -1) {\n done = false;\n mirror_map[new_i] = new_I;\n mirror_map[new_I] = new_i;\n } else if (mirror_map[new_i] !== new_I) {\n throw \"mirroring failed - is the initial map correct?\";\n }\n }\n }\n }\n return mirror_map;\n}\n\nfunction bfs(mtable, goal_states) {\n let N = mtable[0].length;\n let nmoves = mtable.length;\n let ptable = new Int8Array(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[move_index][state];\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[move_index][new_state];\n }\n }\n }\n depth++;\n }\n return ptable;\n}\n\nfunction* ida_solve_gen(indices, mtables, ptables, moves_left, commute) {\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 while (bound <= moves_left) {\n //console.log(`searching depth ${bound}`);\n yield* ida_search_gen(indices, mtables, ptables, bound, -1, commute);\n bound++;\n }\n}\n\nfunction* ida_search_gen(indices, mtables, ptables, bound, last, commute) {\n let ncoords = indices.length;\n let nmoves = mtables[0].length;\n let heuristic = 0;\n for (let i = 0; i < ncoords; i++)\n heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n if (heuristic > bound) return;\n if (bound === 0) {\n yield [];\n return;\n }\n if (heuristic === 0 && bound === 1) return;\n for (let m = 0; m < nmoves; m++) {\n if (m === last) continue;\n if (m < last && commute[m][last]) continue;\n let new_indices = indices.slice();\n for (let c = 0; c < ncoords; c++)\n new_indices[c] = mtables[c][m][indices[c]];\n let r = 1;\n while (indices.some((_, i) => indices[i] != new_indices[i])) {\n let subpath_gen = ida_search_gen(\n new_indices,\n mtables,\n ptables,\n bound - 1,\n m,\n commute,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) break;\n yield [[m, r]].concat(subpath);\n }\n for (let c = 0; c < ncoords; c++) {\n new_indices[c] = mtables[c][m][new_indices[c]];\n }\n r++;\n }\n }\n}\n\nfunction solve(facelets, readable = false) {\n let phase1sol = solve_phase1_gen(facelets).next().value;\n let facelets2 = apply_move_sequence(facelets, phase1sol);\n let phase2sol = (\n readable ? solve_phase2_and_phase3_readable : solve_phase2_and_phase3_fast\n )(facelets2);\n let solution = simplify_move_sequence(phase1sol.concat(phase2sol), false);\n if (\n apply_move_sequence(facelets, solution).join(\"\") !== solved_state.join(\"\")\n ) {\n console.log(\"solving failed!\");\n console.log(facelets);\n console.log(phase1sol);\n console.log(facelets2);\n console.log(phase2sol);\n console.log(apply_move_sequence(facelets, solution));\n }\n return solution;\n}\n\nlet cached_mtables = {};\nlet cached_ptables = {};\n\n/* Phase 1 stuff */\n\nlet phase1_centre_colour_map = [0, 0, 2, 3, 0, 0, 2, 3];\nfunction index_phase1(facelets) {\n let [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);\n let ep = Array(12)\n .fill()\n .map((_, i) => get_edge_piece(facelets, i));\n let edge_coord =\n ep.indexOf(8) +\n 12 * ep.indexOf(9) +\n 12 ** 2 * ep.indexOf(10) +\n 12 ** 3 * ep.indexOf(11);\n let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map(\n (facelet_indices) => {\n let arr = facelet_indices.map(\n (x) => phase1_centre_colour_map[facelets[x]],\n );\n return cti[arr.reduce((acc, x, j) => acc | (x << (2 * j)), 0)];\n },\n );\n return [edge_coord, a_coord, b_coord];\n}\n\nfunction generate_phase1_edge_mtable() {\n if (cached_mtables.phase1_edge) {\n return cached_mtables.phase1_edge;\n }\n let m1 = generate_mtable_single_generic(move_permutations.map((x) => x.ep));\n let m2 = combine_mtables(m1, m1);\n let m4 = combine_mtables(m2, m2);\n return (cached_mtables.phase1_edge = m4);\n}\n\nfunction generate_phase1_edge_ptable() {\n if (cached_ptables.phase1_edge) {\n return cached_ptables.phase1_edge;\n }\n return (cached_ptables.phase1_edge = bfs(generate_phase1_edge_mtable(), [\n 8 + 12 * 9 + 12 ** 2 * 10 + 12 ** 3 * 11,\n ]));\n}\n\nfunction generate_phase1_centreA_mtable() {\n if (cached_mtables.phase1_centreA) {\n return cached_mtables.phase1_centreA;\n }\n return (cached_mtables.phase1_centreA = generate_mtable_comb4_generic(\n 12,\n 6,\n 0,\n 3,\n 3,\n move_permutations.map((x) => x.ap),\n ));\n}\n\nfunction generate_phase1_centreB_mtable() {\n if (cached_mtables.phase1_centreB) {\n return cached_mtables.phase1_centreB;\n }\n return (cached_mtables.phase1_centreB = generate_mtable_comb4_generic(\n 12,\n 6,\n 0,\n 3,\n 3,\n move_permutations.map((x) => x.bp),\n ));\n}\n\nfunction generate_phase1_centre_ptable() {\n // the pruning tables for the two centre orbits are identical due to the specific facelet\n // labelling we're using.\n if (cached_ptables.phase1_centre) {\n return cached_ptables.phase1_centre;\n }\n let [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);\n let goal_states = itc\n .filter((x) => {\n let x6 = (x >> 12) & 3;\n let x9 = (x >> 18) & 3;\n return x6 === 2 && x9 === 3;\n })\n .map((x) => cti[x]);\n return (cached_ptables.phase1_centre = bfs(\n generate_phase1_centreB_mtable(),\n goal_states,\n ));\n}\n\nfunction* solve_phase1_gen(facelets) {\n let mtables = [\n generate_phase1_edge_mtable(),\n generate_phase1_centreA_mtable(),\n generate_phase1_centreB_mtable(),\n ];\n let ptables = [\n generate_phase1_edge_ptable(),\n generate_phase1_centre_ptable(),\n generate_phase1_centre_ptable(),\n ];\n yield* phase1_ida_solve_gen(index_phase1(facelets), mtables, ptables, 15);\n}\n\nfunction* phase1_ida_solve_gen(indices, mtables, ptables, moves_left) {\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 while (bound <= moves_left) {\n //console.log(`searching depth ${bound}`);\n yield* phase1_ida_search_gen(indices, mtables, ptables, bound, -1);\n bound++;\n }\n}\n\nfunction* phase1_ida_search_gen(indices, mtables, ptables, bound, last) {\n let ncoords = 3; //indices.length;\n let nmoves = 8; //mtables[0].length;\n let heuristic = Math.max(\n ptables[0][indices[0]],\n ptables[1][indices[1]],\n ptables[2][indices[2]],\n ); //0;\n //for (let i = 0; i < ncoords; i++) heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n if (heuristic > bound) return;\n if (bound === 0) {\n yield [];\n return;\n }\n if (heuristic === 0 && bound === 1) return;\n for (let m = 0; m < nmoves; m++) {\n if (m === last) continue;\n if (m === last - 4) continue;\n let new_indices = [];\n new_indices[0] = mtables[0][m][indices[0]];\n new_indices[1] = mtables[1][m][indices[1]];\n new_indices[2] = mtables[2][m][indices[2]];\n let r = 1;\n while (indices.some((_, i) => indices[i] != new_indices[i])) {\n let subpath_gen = phase1_ida_search_gen(\n new_indices,\n mtables,\n ptables,\n bound - 1,\n m,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) break;\n yield [[m, r]].concat(subpath);\n }\n new_indices[0] = mtables[0][m][new_indices[0]];\n new_indices[1] = mtables[1][m][new_indices[1]];\n new_indices[2] = mtables[2][m][new_indices[2]];\n r++;\n }\n }\n}\n\n/* Phase 2 stuff */\n\nlet phase2_centre_colour_map = [0, 1, 2, 0, 0, 1, 2, 0];\n// we don't care about swapping U and BL centres in phase 2\n\nlet phase2_centre_indices = [0, 1, 2, 3, 4, 5, 7, 8, 10, 11]; // 6 and 9 are already solved in phase 1\nlet phase2_keep = [\n true,\n true,\n true,\n true,\n true,\n true,\n false,\n true,\n true,\n false,\n true,\n true,\n];\nlet phase2_corner_keep = [\n true,\n true,\n true,\n true,\n true,\n false,\n true,\n true,\n true,\n true,\n true,\n false,\n];\n\nfunction index_phase2(facelets) {\n let [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);\n let ep = Array(8)\n .fill()\n .map((_, i) => get_edge_piece(facelets, i));\n let edge_coord = ep.indexOf(5) + 8 * ep.indexOf(6) + 8 ** 2 * ep.indexOf(7);\n let corners = Array(5)\n .fill()\n .map((_, i) => get_corner_piece(facelets, i));\n let cp_inverse_full = invert_permutation(\n corners\n .map(([p, o]) => p + 5 * o)\n .concat(corners.map(([p, o]) => p + 5 * (o ^ 1))),\n );\n let cp_inverse = cp_inverse_full.slice(0, 5).map((x) => x % 5);\n let co_inverse = cp_inverse_full.slice(0, 5).map((x) => (x / 5) | 0);\n let corner_coord =\n evenpermutation_to_index(cp_inverse) * 8 +\n (co_inverse[0] ^ co_inverse[2]) +\n 2 * (co_inverse[0] ^ co_inverse[3]) +\n 4 * co_inverse[4];\n let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map(\n (facelet_indices) => {\n let arr = compose(facelet_indices, phase2_centre_indices).map(\n (x) => phase2_centre_colour_map[facelets[x]],\n );\n return cti[arr.reduce((acc, x, j) => acc | (x << (2 * j)), 0)];\n },\n );\n // we don't need these move tables, but we do need the reduction maps\n // that are computed with these (and stored in global vars, yikes)\n generate_phase2_edge_mtable();\n generate_phase2_corner_mtable_compact();\n return [\n a_coord,\n b_coord,\n phase2_corner_reduction_map[corner_coord] +\n 40 * phase2_edge_reduction_map[edge_coord],\n ];\n}\n\nfunction* solve_phase2_gen(facelets) {\n yield* phase2_ida_solve_gen(index_phase2(facelets), 30);\n}\n\nfunction solve_phase2(facelets) {\n return solve_phase2_gen(facelets).next().value;\n}\n\nfunction generate_phase2_centre_mtables() {\n if (cached_mtables.phase2_centre) {\n return cached_mtables.phase2_centre;\n }\n let a = generate_mtable_comb4_generic(\n 10,\n 5,\n 3,\n 2,\n 0,\n move_permutations\n .slice(0, 4)\n .map((x) => reduce_permutation(x.ap, phase2_keep)),\n );\n let b = generate_mtable_comb4_generic(\n 10,\n 5,\n 3,\n 2,\n 0,\n move_permutations\n .slice(0, 4)\n .map((x) => reduce_permutation(x.bp, phase2_keep)),\n );\n return (cached_mtables.phase2_centre = [a, b]);\n}\n\nlet phase2_edge_reduction_map;\nfunction generate_phase2_edge_mtable() {\n if (cached_mtables.phase2_edge) {\n return cached_mtables.phase2_edge;\n }\n let e = generate_mtable_single_generic(\n move_permutations.slice(0, 4).map((x) => x.ep.slice(0, 8)),\n );\n let eee = combine_mtables(e, combine_mtables(e, e));\n let eee_trimmed;\n [eee_trimmed, phase2_edge_reduction_map] = trim_unreachable(eee, 0o765);\n return (cached_mtables.phase2_edge = eee_trimmed);\n}\n\nfunction generate_phase2_corner_mtable() {\n if (cached_mtables.phase2_corner) {\n return cached_mtables.phase2_corner;\n }\n const HALFFACT5 = factorial(5) / 2; // = 60\n const N = HALFFACT5 * 8; // = 480\n const keep = [\n true,\n true,\n true,\n true,\n true,\n false,\n true,\n true,\n true,\n true,\n true,\n false,\n ];\n // ignore the sixth and twelfth entries, which encode corner #5's state\n let mtable = Array(4)\n .fill()\n .map(() => new Uint32Array(N));\n let permutations = move_permutations\n .slice(0, 4)\n .map((x) => invert_permutation(reduce_permutation(x.cp, keep)));\n // using the left-action convention here, so take inverses\n for (let i = 0; i < N; i++) {\n let p = index_to_evenpermutation(i >> 3, 5);\n let o = [0, 0, i & 1, (i >> 1) & 1, (i >> 2) & 1];\n o[1] = o[2] ^ o[3] ^ o[4];\n let cp = Array(10);\n for (let j = 0; j < 5; j++) {\n cp[j] = p[j] + 5 * o[j];\n cp[j + 5] = p[j] + 5 * (o[j] ^ 1);\n }\n for (let m = 0; m < 4; m++) {\n let cp2 = compose(permutations[m], cp);\n let p2 = cp2.slice(0, 5).map((x) => x % 5);\n let o2 = cp2.slice(0, 5).map((x) => (x / 5) | 0);\n let orientation_index = (o2[0] ^ o2[2]) + 2 * (o2[0] ^ o2[3]) + 4 * o2[4];\n mtable[m][i] = evenpermutation_to_index(p2) * 8 + orientation_index;\n }\n }\n return (cached_mtables.phase2_corner = mtable);\n /*\n\tfar as I can tell, there's no clean way to index the cosets of the corner subgroup in this\n\tphase. so we just do it the dirty way (see `reduce_to_quotient`).\n\t*/\n}\n\nlet phase2_corner_reduction_map;\nfunction generate_phase2_corner_mtable_compact() {\n if (cached_mtables.phase2_corner_compact) {\n return cached_mtables.phase2_corner_compact;\n }\n [cached_mtables.phase2_corner_compact, phase2_corner_reduction_map] =\n reduce_to_quotient(\n generate_phase2_corner_mtable(),\n phase2_corner_goal_states(),\n );\n return cached_mtables.phase2_corner_compact;\n}\n\nfunction generate_phase2_ce_mtable() {\n if (cached_mtables.phase2_ce) {\n return cached_mtables.phase2_ce;\n }\n let c = generate_phase2_corner_mtable_compact();\n let e = generate_phase2_edge_mtable();\n return (cached_mtables.phase2_ce = combine_mtables(c, e));\n}\n\nlet phase2_ce_mirror_map;\nfunction generate_phase2_ce_mirror_map() {\n if (phase2_ce_mirror_map) {\n return phase2_ce_mirror_map;\n }\n const ce_solved = index_phase2(solved_state)[2];\n return (phase2_ce_mirror_map = generate_mirrored_coordinate_table(\n generate_phase2_ce_mtable(),\n ce_solved,\n ce_solved,\n ));\n}\n\nfunction phase2_centre_goal_states() {\n let [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);\n return itc.filter((x) => ((x >> 10) & 63) === 41).map((x) => cti[x]);\n /*\n\tthe combination tracks the centre pieces at indices\n\t0, 1, 2, 3, 4, 5, 7, 8, 10, 11\n\tin little endian order.\n\tright-shifting 10 bits changes this to\n\t5, 7, 8, 10, 11\n\tand masking by 63 keeps only the three least significant digits\n\t5, 7, 8\n\twhich are exactly the pieces we're solving in this phase.\n\t1 + 4 * 2 + 4**2 * 2 = 41\n\tWARNING: this needs to be adjusted if the centre indexing is changed\n\t(also, this returns a Uint32Array, but nothing we do here can possibly cause overflow so\n\tthat's not a problem)\n\t*/\n}\n\nfunction phase2_corner_goal_states() {\n let mtable = generate_phase2_corner_mtable();\n let N = mtable[0].length;\n let flags = Array(N).fill(false);\n flags[0] = true; /* index 0 is the solved state */\n let done = false;\n while (!done) {\n done = true;\n for (let i = 0; i < N; i++) {\n if (flags[i]) {\n if (!flags[mtable[0][i]]) {\n done = false;\n flags[mtable[0][i]] = true;\n }\n if (!flags[mtable[1][i]]) {\n done = false;\n flags[mtable[1][i]] = true;\n }\n }\n }\n }\n return flags.map((_, i) => i).filter((i) => flags[i]);\n}\n\nfunction generate_phase2_ace_ptable() {\n if (cached_ptables.phase2_ace) {\n return cached_ptables.phase2_ace;\n }\n const [mtable_a, mtable_b] = generate_phase2_centre_mtables();\n const mtable_ce = generate_phase2_ce_mtable();\n const Na = 2520;\n const Nce = 40 * 336;\n const N = Na * Nce; // = 33868800\n const ce_solved = index_phase2(solved_state)[2];\n const max_depth = 9;\n let ptable = new Int8Array(N).fill(max_depth);\n for (let a_solved of phase2_centre_goal_states()) {\n ptable[a_solved + Na * ce_solved] = 0;\n }\n for (let depth = 0; depth < max_depth - 1; depth++) {\n for (\n let state = ptable.indexOf(depth);\n state !== -1;\n state = ptable.indexOf(depth, state + 1)\n ) {\n let a = state % Na,\n ce = (state / Na) | 0;\n for (let move_index = 0; move_index < 4; move_index++) {\n let new_a = mtable_a[move_index][a];\n let new_ce = mtable_ce[move_index][ce];\n let new_state = new_a + Na * new_ce;\n if (ptable[new_state] === max_depth) {\n ptable[new_state] = depth + 1;\n }\n new_a = mtable_a[move_index][new_a];\n new_ce = mtable_ce[move_index][new_ce];\n new_state = new_a + Na * new_ce;\n if (ptable[new_state] === max_depth) {\n ptable[new_state] = depth + 1;\n }\n }\n }\n }\n // don't bother filling in the table for depth >=10; this saves a substantial amount of time\n // on startup at a slight cost of pruning effectiveness\n return (cached_ptables.phase2_ace = ptable);\n}\n\nfunction* phase2_ida_solve_gen(indices, moves_left) {\n let [mtable_a, mtable_b] = generate_phase2_centre_mtables();\n let mtable_ce = generate_phase2_ce_mtable();\n let ptable_ace = generate_phase2_ace_ptable();\n let mirror_map = generate_phase2_ce_mirror_map();\n let [a, b, ce] = indices;\n let ce_mirror = mirror_map[ce];\n let bound = Math.max(\n ptable_ace[a + 2520 * ce],\n ptable_ace[b + 2520 * ce_mirror],\n );\n while (bound <= moves_left) {\n //console.log(`searching depth ${bound}`);\n yield* phase2_ida_search_gen(\n a,\n b,\n ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ptable_ace,\n mirror_map,\n bound,\n -1,\n );\n bound++;\n }\n}\n\nfunction* phase2_ida_search_gen(\n a,\n b,\n ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ptable_ace,\n mirror_map,\n bound,\n last,\n) {\n let h = Math.max(\n ptable_ace[a + 2520 * ce],\n ptable_ace[b + 2520 * mirror_map[ce]],\n );\n if (h > bound) {\n return;\n }\n if (bound === 0) {\n yield [];\n return;\n } else if (h === 0) {\n return;\n }\n for (let m = 0; m < 4; m++) {\n if (m === last) continue;\n let new_a = a,\n new_b = b,\n new_ce = ce;\n for (let r = 1; r <= 2; r++) {\n new_a = mtable_a[m][new_a];\n new_b = mtable_b[m][new_b];\n new_ce = mtable_ce[m][new_ce];\n let subpath_gen = phase2_ida_search_gen(\n new_a,\n new_b,\n new_ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ptable_ace,\n mirror_map,\n bound - 1,\n m,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) break;\n yield [[m, r]].concat(subpath);\n }\n }\n }\n}\n\n/* Phase 3 mostly-2-gen stuff */\n\nlet phase3_2gen_centre_indices = [0, 1, 2, 3, 4, 10, 11];\n\nlet phase3_2gen_keep = [\n true,\n true,\n true,\n true,\n true,\n false,\n false,\n false,\n false,\n false,\n true,\n true,\n];\n\nlet phase3_2gen_move_seqs = [\n [[0, 1]], // U\n [[1, 1]], // L\n\n // F U R U' R' F'\n [\n [2, 1],\n [0, 1],\n [3, 1],\n [0, 2],\n [3, 2],\n [2, 2],\n ],\n [\n [3, 2],\n [1, 2],\n [2, 2],\n [1, 1],\n [2, 1],\n [3, 1],\n ],\n [\n [6, 1],\n [0, 1],\n [3, 1],\n [0, 2],\n [3, 2],\n [6, 2],\n ],\n [\n [7, 2],\n [1, 2],\n [2, 2],\n [1, 1],\n [2, 1],\n [7, 1],\n ],\n\n // F U F' U F U F'\n [\n [2, 1],\n [0, 1],\n [2, 2],\n [0, 1],\n [2, 1],\n [0, 1],\n [2, 2],\n ],\n [\n [3, 2],\n [1, 1],\n [3, 1],\n [1, 1],\n [3, 2],\n [1, 1],\n [3, 1],\n ],\n\n // F R F' L' U' F R F'\n [\n [2, 1],\n [3, 1],\n [2, 2],\n [1, 2],\n [0, 2],\n [2, 1],\n [3, 1],\n [2, 2],\n ],\n [\n [3, 2],\n [2, 2],\n [3, 1],\n [0, 1],\n [1, 1],\n [3, 2],\n [2, 2],\n [3, 1],\n ],\n [\n [6, 1],\n [0, 1],\n [6, 2],\n [0, 2],\n [1, 2],\n [6, 1],\n [0, 1],\n [6, 2],\n ],\n [\n [7, 2],\n [1, 2],\n [7, 1],\n [1, 1],\n [0, 1],\n [7, 2],\n [1, 2],\n [7, 1],\n ],\n\n // F R' F' R U F' L F\n [\n [2, 1],\n [3, 2],\n [2, 2],\n [3, 1],\n [0, 1],\n [2, 2],\n [1, 1],\n [2, 1],\n ],\n [\n [3, 2],\n [2, 1],\n [3, 1],\n [2, 2],\n [1, 2],\n [3, 1],\n [0, 2],\n [3, 2],\n ],\n [\n [6, 1],\n [0, 2],\n [6, 2],\n [7, 1],\n [6, 1],\n [1, 2],\n [7, 1],\n [6, 1],\n ],\n [\n [7, 2],\n [1, 1],\n [7, 1],\n [6, 2],\n [7, 2],\n [0, 1],\n [6, 2],\n [7, 2],\n ],\n\n // F' L' F' R' F' R' U' R'\n [\n [2, 2],\n [1, 2],\n [2, 2],\n [3, 2],\n [2, 2],\n [3, 2],\n [0, 2],\n [3, 2],\n ],\n [\n [6, 2],\n [7, 2],\n [1, 2],\n [0, 2],\n [1, 2],\n [0, 2],\n [6, 2],\n [7, 2],\n ],\n /*\n[[2,1], [0,2], [2,2], [0,2], [2,1], [3,1], [0,2], [3,2], [2,2]], // F U' F' U' F R U' R' F'\n[[3,2], [1,1], [3,1], [1,1], [3,2], [2,2], [1,1], [2,1], [3,1]], // R' L R L R' F' L F R\n[[6,1], [3,2], [6,2], [1,2], [6,1], [0,1], [3,2], [0,2], [6,2]], // f R' f' L' f U R' U' f'\n[[7,2], [2,1], [7,1], [0,1], [7,2], [1,2], [2,1], [1,1], [7,1]], // r' F r U r' L' F L r\n[[2,1], [0,1], [3,1], [0,2], [3,2], [0,1], [3,1], [0,2], [3,2], [2,2]], // F (U R U' R')2 F'\n[[3,2], [1,2], [2,2], [1,1], [2,1], [1,2], [2,2], [1,1], [2,1], [3,1]], // R' (L' F' L F)2 R\n[[6,1], [0,1], [3,1], [0,2], [3,2], [0,1], [3,1], [0,2], [3,2], [6,2]], // f (U R U' R')2 f'\n[[7,2], [1,2], [2,2], [1,1], [2,1], [1,2], [2,2], [1,1], [2,1], [7,1]], // r' (L' F' L F)2 r\n*/\n];\nphase3_2gen_move_seqs = phase3_2gen_move_seqs.concat(\n phase3_2gen_move_seqs.map((seq) => invert_move_sequence(seq)),\n);\nlet phase3_2gen_nmoves = phase3_2gen_move_seqs.length; // = 36\n/*\nThe moves we're using for this phase:\nU\nL\nF U R U' R' F'\nR' L' F' L F R\nf U R U' R' f'\nr' L' F' L F r\nF U F' U F U F' (= F' U F U F' U F = r' F r U r' F r = r l U' l F l r')\nR' L R L R' L R (= R L R' L R L R' = f R f' L f R f' = f' u R u L' u f)\n\nF R F' L' U' F R F'\nR' F' R U L R' F' R\nf U f' U' L' f U f'\nr' L' r L U r' L' r\n\nF R' F' R U F' L F\nR' F R F' L' R U' R'\nf U' f' r f L' r f\nr' L r f' r' U f' r'\n\nF' L' F' R' F' R' U' R'\nf' r' L' U' L' U' f' r'\n\nand the inverses of the above\n\nThese are the atomic 4-gen move sequences of length <= 8 where the induced permutations lie in the\n<U,L> group (verified with GAP, barring transcription errors).\n\nTemporarily going out of LU 2-gen can sometimes save _many_ moves, e.g. the F R U R' U' F' scramble\nobviously has a 6-move 4-gen solution (F U R U' R' F'), but the optimal 2-gen solution is 24 moves:\nU L' U L' U' L' U' L U' L U L' U L' U L U L' U' L U' L U L'.\n*/\n\nlet phase3_2gen_facelet_permutations = phase3_2gen_move_seqs.map((seq) =>\n apply_move_sequence(permutation_from_cycles([], 72), seq),\n);\nlet phase3_2gen_piece_permutations = phase3_2gen_facelet_permutations.map(\n convert_move_to_permutations,\n);\nlet phase3_2gen_move_orders =\n phase3_2gen_facelet_permutations.map(permutation_order);\n\nfunction index_phase3_2gen(facelets) {\n let [itc, cti] = generate_comb4_lookup_tables(7, 3, 2, 0, 2);\n let ep = Array(5)\n .fill()\n .map((_, i) => get_edge_piece(facelets, i));\n let edge_coord = evenpermutation_to_index(ep);\n let corners = Array(4)\n .fill()\n .map((_, i) => get_corner_piece(facelets, i));\n let corner_coord =\n evenpermutation_to_index(corners.map((x) => x[0])) * 2 +\n corners.find((x) => x[0] === 0)[1];\n let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map(\n (facelet_indices) => {\n let arr = compose(facelet_indices, phase3_2gen_centre_indices).map(\n (x) => facelets[x] % 4,\n );\n return cti[arr.reduce((acc, x, j) => acc | (x << (2 * j)), 0)];\n },\n );\n return [a_coord + 210 * b_coord, corner_coord + 24 * edge_coord];\n}\n\nfunction generate_phase3_2gen_edge_mtable() {\n if (cached_mtables.phase3_2gen_edge) {\n return cached_mtables.phase3_2gen_edge;\n }\n const HALFFACT5 = factorial(5) / 2; // = 60\n let mtable = Array(phase3_2gen_nmoves)\n .fill()\n .map(() => new Uint32Array(HALFFACT5));\n let permutations = phase3_2gen_piece_permutations.map((x) =>\n x.ep.slice(0, 5),\n );\n for (let i = 0; i < HALFFACT5; i++) {\n let p = index_to_evenpermutation(i, 5);\n for (let m = 0; m < phase3_2gen_nmoves; m++) {\n mtable[m][i] = evenpermutation_to_index(compose(p, permutations[m]));\n }\n }\n return (cached_mtables.phase3_2gen_edge = mtable);\n}\n\n// the group of corner states is the binary tetrahedral group 2T, where |2T| = 24\nfunction generate_phase3_2gen_corner_mtable() {\n if (cached_mtables.phase3_2gen_corner) {\n return cached_mtables.phase3_2gen_corner;\n }\n const HALFFACT4 = factorial(4) / 2; // = 12\n const N = HALFFACT4 * 2; // = 24\n const keep = [\n true,\n true,\n true,\n true,\n false,\n false,\n true,\n true,\n true,\n true,\n false,\n false,\n ];\n let mtable = Array(phase3_2gen_nmoves)\n .fill()\n .map(() => new Uint32Array(N));\n let permutations = phase3_2gen_piece_permutations.map((x) =>\n reduce_permutation(x.cp, keep).slice(0, 4),\n );\n for (let i = 0; i < N; i += 2) {\n let p = index_to_evenpermutation(i >> 1, 4);\n let cp = p.concat(p.map((x) => x + 4));\n for (let m = 0; m < phase3_2gen_nmoves; m++) {\n let cp2 = compose(cp, permutations[m]);\n let p2 = cp2.map((x) => x % 4);\n let o2 = cp2.find((x) => x % 4 === 0) >> 2;\n mtable[m][i] = evenpermutation_to_index(p2) * 2 + o2;\n mtable[m][i + 1] = evenpermutation_to_index(p2) * 2 + (o2 ^ 1);\n }\n }\n return (cached_mtables.phase3_2gen_corner = mtable);\n}\n\nfunction generate_phase3_2gen_corneredge_mtable() {\n if (cached_mtables.phase3_2gen_corneredge) {\n return cached_mtables.phase3_2gen_corneredge;\n }\n return (cached_mtables.phase3_2gen_corneredge = combine_mtables(\n generate_phase3_2gen_corner_mtable(),\n generate_phase3_2gen_edge_mtable(),\n ));\n}\n\nfunction generate_phase3_2gen_centre_mtable() {\n if (cached_mtables.phase3_2gen_centre) {\n return cached_mtables.phase3_2gen_centre;\n }\n let mtable_a = generate_mtable_comb4_generic(\n 7,\n 3,\n 2,\n 0,\n 2,\n phase3_2gen_piece_permutations.map((x) =>\n reduce_permutation(x.ap, phase3_2gen_keep),\n ),\n );\n let mtable_b = generate_mtable_comb4_generic(\n 7,\n 3,\n 2,\n 0,\n 2,\n phase3_2gen_piece_permutations.map((x) =>\n reduce_permutation(x.bp, phase3_2gen_keep),\n ),\n );\n cached_mtables.phase3_2gen_centreA = mtable_a;\n cached_mtables.phase3_2gen_centreB = mtable_b;\n return (cached_mtables.phase3_2gen_centre = combine_mtables(\n mtable_a,\n mtable_b,\n ));\n}\n\nlet phase3_2gen_depth_table;\nfunction generate_phase3_2gen_depth_table() {\n if (phase3_2gen_depth_table) {\n return phase3_2gen_depth_table;\n }\n const mtable_ab = generate_phase3_2gen_centre_mtable();\n const mtable_ce = generate_phase3_2gen_corneredge_mtable();\n const Nab = mtable_ab[0].length; // = 44100\n const Nce = mtable_ce[0].length; // = 1440\n const N = Nab * Nce; // = 63504000\n const max_depth = 25; // pre-determined; hard-coding this makes the algorithm a bit faster\n const all_weights = phase3_2gen_move_seqs.map((seq) => seq.length);\n const table = new Int8Array(N).fill(max_depth);\n const solved_indices = index_phase3_2gen(solved_state);\n table[solved_indices[0] + Nab * solved_indices[1]] = 0;\n let depth = 0;\n let done = false;\n while (!done && depth < max_depth - 1) {\n done = true;\n //console.log(`scanning depth ${depth}`);\n let move_indices = Array(phase3_2gen_nmoves)\n .fill()\n .map((x, i) => i)\n .filter((m) => all_weights[m] + depth < max_depth);\n move_indices.sort((m, mm) => all_weights[m] - all_weights[mm]);\n let weights = compose(all_weights, move_indices);\n let mtable_ab_pruned = compose(mtable_ab, move_indices);\n let mtable_ce_pruned = compose(mtable_ce, move_indices);\n let nmoves = move_indices.length;\n //console.log(move_indices);\n for (\n let state = table.indexOf(depth);\n state !== -1;\n state = table.indexOf(depth, state + 1)\n ) {\n let ab = state % Nab,\n ce = (state / Nab) | 0;\n for (let mi = 0; mi < nmoves; mi++) {\n let weight = weights[mi];\n let new_ab = mtable_ab_pruned[mi][ab];\n let new_ce = mtable_ce_pruned[mi][ce];\n let new_state = new_ab + Nab * new_ce;\n if (table[new_state] > depth + weight) {\n done = false;\n table[new_state] = depth + weight;\n }\n }\n }\n depth++;\n }\n return (phase3_2gen_depth_table = table);\n}\n\nlet phase3_2gen_ace_table;\nfunction generate_phase3_2gen_ace_table() {\n if (phase3_2gen_ace_table) {\n return phase3_2gen_ace_table;\n }\n const mtable_ab = generate_phase3_2gen_centre_mtable();\n const mtable_a = cached_mtables.phase3_2gen_centreA;\n const mtable_ce = generate_phase3_2gen_corneredge_mtable();\n const Na = mtable_a[0].length; // = 210\n const Nce = mtable_ce[0].length; // = 1440\n const N = Na * Nce; // = 302400\n const max_depth = 25; // pre-determined; hard-coding this makes the algorithm a bit faster\n const all_weights = phase3_2gen_move_seqs.map((seq) => seq.length);\n const table = new Int8Array(N).fill(max_depth);\n const solved_indices = index_phase3_2gen(solved_state);\n table[(solved_indices[0] % Na) + Na * solved_indices[1]] = 0;\n let depth = 0;\n let done = false;\n while (!done && depth < max_depth - 1) {\n done = true;\n //console.log(`scanning depth ${depth}`);\n let move_indices = Array(phase3_2gen_nmoves)\n .fill()\n .map((x, i) => i)\n .filter((m) => all_weights[m] + depth < max_depth);\n move_indices.sort((m, mm) => all_weights[m] - all_weights[mm]);\n let weights = compose(all_weights, move_indices);\n let mtable_a_pruned = compose(mtable_a, move_indices);\n let mtable_ce_pruned = compose(mtable_ce, move_indices);\n let nmoves = move_indices.length;\n //console.log(move_indices);\n for (\n let state = table.indexOf(depth);\n state !== -1;\n state = table.indexOf(depth, state + 1)\n ) {\n let a = state % Na,\n ce = (state / Na) | 0;\n for (let mi = 0; mi < nmoves; mi++) {\n let weight = weights[mi];\n let new_a = mtable_a_pruned[mi][a];\n let new_ce = mtable_ce_pruned[mi][ce];\n let new_state = new_a + Na * new_ce;\n if (table[new_state] > depth + weight) {\n done = false;\n table[new_state] = depth + weight;\n }\n }\n }\n depth++;\n }\n return (phase3_2gen_ace_table = table);\n}\n\nlet phase3_2gen_ce_mirror_map;\nfunction generate_phase3_2gen_ce_mirror_map() {\n if (phase3_2gen_ce_mirror_map) {\n return phase3_2gen_ce_mirror_map;\n }\n const mtable_ce = generate_phase3_2gen_corneredge_mtable().slice(0, 2);\n const solved_indices = index_phase3_2gen(solved_state);\n return (phase3_2gen_ce_mirror_map = generate_mirrored_coordinate_table(\n mtable_ce,\n solved_indices[1],\n solved_indices[1],\n ));\n}\n\n/*\nfunction solve_phase3_2gen(facelets, indices=index_phase3_2gen(facelets), simplify=true)\n{\n\tlet [ab, ce] = indices;\n\tlet Nab = 44100;\n\tlet mtable_ab = generate_phase3_2gen_centre_mtable();\n\tlet mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\tlet depth_table = generate_phase3_2gen_depth_table();\n\tlet seq = [];\n\twhile (depth_table[ab + Nab*ce] > 0)\n\t{\n\t\tlet distance = depth_table[ab + Nab*ce];\n\t\tfor (let m = 0; m < phase3_2gen_nmoves; m++)\n\t\t{\n\t\t\tlet new_ab = mtable_ab[m][ab];\n\t\t\tlet new_ce = mtable_ce[m][ce];\n\t\t\tlet new_distance = depth_table[new_ab + Nab*new_ce];\n\t\t\tif (new_distance === distance-phase3_2gen_move_seqs[m].length)\n\t\t\t{\n\t\t\t\tseq = seq.concat(phase3_2gen_move_seqs[m]);\n\t\t\t\tab = new_ab;\n\t\t\t\tce = new_ce;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn simplify ? simplify_move_sequence(seq) : seq;\n}\n*/\n\nfunction solve_phase3_2gen(facelets, indices = index_phase3_2gen(facelets)) {\n //const THRESHOLD = 31;\n let [ab, ce] = indices;\n let a = ab % 210,\n b = Math.floor(ab / 210);\n let mtable_ab = generate_phase3_2gen_centre_mtable();\n let mtable_a = cached_mtables.phase3_2gen_centreA;\n let mtable_b = cached_mtables.phase3_2gen_centreB;\n let mtable_ce = generate_phase3_2gen_corneredge_mtable();\n let ace_table = generate_phase3_2gen_ace_table();\n let mirror_map_ce = generate_phase3_2gen_ce_mirror_map();\n let bound = 0;\n while (true) {\n let gen = solve_phase3_2gen_ida(\n a,\n b,\n ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ace_table,\n mirror_map_ce,\n bound,\n );\n for (let solution of gen) {\n return solution.map((m) => phase3_2gen_move_seqs[m]).flat();\n }\n bound++;\n }\n}\n\nfunction solve_phase3_2gen_readable(\n facelets,\n indices = index_phase3_2gen(facelets),\n) {\n //const THRESHOLD = 31;\n let [ab, ce] = indices;\n let a = ab % 210,\n b = Math.floor(ab / 210);\n let mtable_ab = generate_phase3_2gen_centre_mtable();\n let mtable_a = cached_mtables.phase3_2gen_centreA;\n let mtable_b = cached_mtables.phase3_2gen_centreB;\n let mtable_ce = generate_phase3_2gen_corneredge_mtable();\n //let depth_table = generate_phase3_2gen_depth_table();\n let ace_table = generate_phase3_2gen_ace_table();\n let mirror_map_ce = generate_phase3_2gen_ce_mirror_map();\n let initial = solve_phase3_2gen(facelets).length;\n let best_score = Infinity;\n let best_solution;\n //console.log(`initial: ${initial}`);\n for (let bound = initial; bound <= initial + 0; bound++) {\n let gen = solve_phase3_2gen_ida(\n a,\n b,\n ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ace_table,\n mirror_map_ce,\n bound,\n );\n for (let solution of gen) {\n let expanded = solution.map((m) => phase3_2gen_move_seqs[m]).flat();\n let simplified = simplify_move_sequence(expanded);\n let score = grade_readability(simplified);\n if (score < best_score) {\n best_score = score;\n best_solution = simplified;\n //console.log(`${score} ${stringify_move_sequence(simplified, true)}`);\n //if (score <= THRESHOLD) {break search;}\n }\n }\n }\n return best_solution;\n}\n\nfunction alternation_penalty(x) {\n return ((x - 1) * (x - 2)) / 2;\n // A B A B A costs 1\n // A B A B A B costs 3\n // A B A B A B A costs 6\n // A B A B A B A B costs 10\n // etc.\n // this should be chosen to be a convex function\n}\n\nfunction grade_readability(seq) {\n let nowide = stringify_move_sequence(seq, true).replace(/'/g, \"\").split(\" \");\n return (\n seq.length +\n alternations(nowide)\n .map(alternation_penalty)\n .reduce((x, y) => x + y, 0)\n );\n}\n\nfunction alternations(seq) {\n // return a list of \"alternating\" run lengths\n // convention:\n // A B does not count\n // A B A counts as length 1\n // A B A B counts as length 2\n // A B A B A counts as length 3\n // etc.\n if (seq.length < 3) {\n return [];\n }\n let n = seq.length;\n let a = [];\n for (let i = 0; i < n - 2; i++) {\n a[i] = seq[i] === seq[i + 2];\n }\n a.push(false);\n let i = -1;\n let runs = [];\n while (i < n - 2) {\n i = a.indexOf(true, i + 1);\n if (i === -1) {\n break;\n }\n let j = a.indexOf(false, i + 1);\n runs.push(j - i);\n i = j;\n }\n return runs;\n}\n\nfunction* solve_phase3_2gen_ida(\n a,\n b,\n ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ace_table,\n mirror_map_ce,\n bound,\n last = -1,\n) {\n let h_ace = ace_table[a + 210 * ce];\n let h_bce = ace_table[b + 210 * mirror_map_ce[ce]];\n let h = Math.max(h_ace, h_bce);\n //console.log(h_ace, h_bce, bound);\n if (h > bound) {\n return;\n }\n if (bound === 0) {\n yield [];\n return;\n }\n if (h === 0) {\n return;\n } // this solution includes redundant moves\n for (let m = 0; m < phase3_2gen_nmoves; m++) {\n if (m === last && phase3_2gen_move_orders[m] <= 3) {\n continue;\n }\n let new_a = mtable_a[m][a];\n let new_b = mtable_b[m][b];\n let new_ce = mtable_ce[m][ce];\n let new_bound = bound - phase3_2gen_move_seqs[m].length;\n if (new_bound < 0) {\n continue;\n }\n let subpath_gen = solve_phase3_2gen_ida(\n new_a,\n new_b,\n new_ce,\n mtable_a,\n mtable_b,\n mtable_ce,\n ace_table,\n mirror_map_ce,\n new_bound,\n m,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) {\n break;\n }\n yield [m].concat(subpath);\n }\n }\n}\n\n/* Some glue code */\n\nfunction solve_phase2_and_phase3_fast(\n facelets,\n phase2_attempts = 200,\n cap = 24,\n) {\n let pool = [];\n let gen = solve_phase2_gen(facelets);\n let facelets_t2 = compose(facelets, move_X).map((x) => x ^ 1);\n let gen_t2 = solve_phase2_gen(facelets_t2);\n let best = Array(1000);\n // phase 2 always takes <= 15 moves and phase 3 <= 25 moves, so this is a safe upper bound\n for (let i = 0; i < phase2_attempts; i++) {\n {\n let { value, done } = gen.next();\n if (!done) {\n let intermediate_facelets = apply_move_sequence(facelets, value);\n let solution = value.concat(solve_phase3_2gen(intermediate_facelets));\n if (solution.length <= cap) {\n return solution;\n } else if (solution.length < best.length) {\n best = solution;\n }\n }\n }\n {\n let { value, done } = gen_t2.next();\n if (!done) {\n let intermediate_facelets = apply_move_sequence(facelets_t2, value);\n let solution = value\n .concat(solve_phase3_2gen(intermediate_facelets))\n .map(([m, r]) => [m ^ 2, r]);\n if (solution.length <= cap) {\n return solution;\n } else if (solution.length < best.length) {\n best = solution;\n }\n }\n }\n }\n return best;\n}\n\nfunction solve_phase2_and_phase3_readable(\n facelets,\n phase2_attempts = 20,\n cap = 30,\n) {\n let pool = [];\n let gen = solve_phase2_gen(facelets);\n let facelets_t2 = compose(facelets, move_X).map((x) => x ^ 1);\n let gen_t2 = solve_phase2_gen(facelets_t2);\n let best;\n let best_score = Infinity;\n for (let i = 0; i < phase2_attempts; i++) {\n {\n let { value, done } = gen.next();\n if (!done) {\n let intermediate_facelets = apply_move_sequence(facelets, value);\n let solution = simplify_move_sequence(\n value.concat(solve_phase3_2gen_readable(intermediate_facelets)),\n );\n let score = grade_readability(solution);\n if (score <= cap) {\n return solution;\n } else if (score < best_score) {\n best = solution;\n best_score = score;\n }\n }\n }\n {\n let { value, done } = gen_t2.next();\n if (!done) {\n let intermediate_facelets = apply_move_sequence(facelets_t2, value);\n let solution = simplify_move_sequence(\n value.concat(solve_phase3_2gen_readable(intermediate_facelets)),\n );\n solution = solution.map(([m, r]) => [m ^ 2, r]);\n let score = grade_readability(solution);\n if (score <= cap) {\n return solution;\n } else if (score < best_score) {\n best = solution;\n best_score = score;\n }\n }\n }\n }\n return best;\n}\n\nconst randomUintBelow = randomUIntBelowFactory();\nexport async function randomFTOScrambleString() {\n return generate_random_state_scramble(await randomUintBelow);\n}\n"],
|
|
5
|
-
"mappings": "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CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAEN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAIN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAEN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAIN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAEN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAEN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;AAAA,EAEN;AAAA,IACE,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA,IACJ,CAAC,GAAG;AAAA;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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|