cubing 0.48.3 → 0.49.0

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.
Files changed (37) hide show
  1. package/dist/bin/puzzle-geometry-bin.js +4 -7
  2. package/dist/bin/puzzle-geometry-bin.js.map +2 -2
  3. package/dist/lib/cubing/bluetooth/index.js +3 -3
  4. package/dist/lib/cubing/chunks/{chunk-I4WNYLYZ.js → chunk-2ZDYUAXG.js} +2 -2
  5. package/dist/lib/cubing/chunks/{chunk-OOFPCAGO.js → chunk-3W5GXH7H.js} +2 -2
  6. package/dist/lib/cubing/chunks/{chunk-3V53MPRZ.js → chunk-7WLUEIZX.js} +3 -3
  7. package/dist/lib/cubing/chunks/{chunk-4MAJE4KF.js → chunk-HPIYOMRJ.js} +1 -1
  8. package/dist/lib/cubing/chunks/{chunk-6OQS3O7Y.js → chunk-Q222EQJR.js} +1 -1
  9. package/dist/lib/cubing/chunks/{chunk-5KNIZ2YB.js → chunk-QYBDWFY6.js} +3 -3
  10. package/dist/lib/cubing/chunks/{chunk-PX2L23L2.js → chunk-YGLO3POD.js} +2 -2
  11. package/dist/lib/cubing/chunks/{inside-CH2IHSQT.js → inside-XY43FEWJ.js} +9 -9
  12. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EG3CKCS4.js → search-dynamic-sgs-side-events-2RPLAYOZ.js} +3 -3
  13. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-XHAYSQO3.js → search-dynamic-sgs-unofficial-SOS5BTCL.js} +3 -3
  14. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-IYN4OTDM.js → search-dynamic-solve-4x4x4-R4SVOZSB.js} +5 -5
  15. package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
  16. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-2IJDXFSH.js → twisty-dynamic-3d-VWNC3JXN.js} +4 -4
  17. package/dist/lib/cubing/notation/index.js +2 -2
  18. package/dist/lib/cubing/protocol/index.js +2 -2
  19. package/dist/lib/cubing/puzzle-geometry/index.js +2 -1
  20. package/dist/lib/cubing/puzzle-geometry/index.js.map +2 -2
  21. package/dist/lib/cubing/puzzles/index.js +2 -2
  22. package/dist/lib/cubing/scramble/index.js +4 -4
  23. package/dist/lib/cubing/search/index.js +4 -4
  24. package/dist/lib/cubing/twisty/index.js +4 -4
  25. package/package.json +2 -5
  26. /package/dist/lib/cubing/chunks/{chunk-I4WNYLYZ.js.map → chunk-2ZDYUAXG.js.map} +0 -0
  27. /package/dist/lib/cubing/chunks/{chunk-OOFPCAGO.js.map → chunk-3W5GXH7H.js.map} +0 -0
  28. /package/dist/lib/cubing/chunks/{chunk-3V53MPRZ.js.map → chunk-7WLUEIZX.js.map} +0 -0
  29. /package/dist/lib/cubing/chunks/{chunk-4MAJE4KF.js.map → chunk-HPIYOMRJ.js.map} +0 -0
  30. /package/dist/lib/cubing/chunks/{chunk-6OQS3O7Y.js.map → chunk-Q222EQJR.js.map} +0 -0
  31. /package/dist/lib/cubing/chunks/{chunk-5KNIZ2YB.js.map → chunk-QYBDWFY6.js.map} +0 -0
  32. /package/dist/lib/cubing/chunks/{chunk-PX2L23L2.js.map → chunk-YGLO3POD.js.map} +0 -0
  33. /package/dist/lib/cubing/chunks/{inside-CH2IHSQT.js.map → inside-XY43FEWJ.js.map} +0 -0
  34. /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EG3CKCS4.js.map → search-dynamic-sgs-side-events-2RPLAYOZ.js.map} +0 -0
  35. /package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-XHAYSQO3.js.map → search-dynamic-sgs-unofficial-SOS5BTCL.js.map} +0 -0
  36. /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-IYN4OTDM.js.map → search-dynamic-solve-4x4x4-R4SVOZSB.js.map} +0 -0
  37. /package/dist/lib/cubing/chunks/{twisty-dynamic-3d-2IJDXFSH.js.map → twisty-dynamic-3d-VWNC3JXN.js.map} +0 -0
@@ -2,9 +2,9 @@
2
2
 
3
3
  // src/bin/puzzle-geometry-bin.ts
4
4
  import {
5
+ PuzzleGeometry,
5
6
  getPG3DNamedPuzzles,
6
- parsePuzzleDescription,
7
- PuzzleGeometry
7
+ parsePuzzleDescription
8
8
  } from "cubing/puzzle-geometry";
9
9
  function asstructured(v) {
10
10
  if (typeof v === "string") {
@@ -14,12 +14,9 @@ function asstructured(v) {
14
14
  }
15
15
  function asboolean(v) {
16
16
  if (typeof v === "string") {
17
- if (v === "false") {
18
- return false;
19
- }
20
- return true;
17
+ return v !== "false";
21
18
  } else {
22
- return v ? true : false;
19
+ return !!v;
23
20
  }
24
21
  }
25
22
  function parsePGOptionList(optionlist) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/puzzle-geometry-bin.ts"],
4
- "sourcesContent": ["// To run this file directly:\n// bun run src/bin/puzzle-geometry-bin.ts -- <program args>\n\nimport {\n type ExperimentalPuzzleBaseShape,\n type ExperimentalPuzzleCutType,\n getPG3DNamedPuzzles,\n parsePuzzleDescription,\n PuzzleGeometry,\n type ExperimentalPuzzleGeometryOptions,\n} from \"cubing/puzzle-geometry\";\nimport type { PuzzleDescriptionString } from \"cubing/puzzle-geometry/PGPuzzles\";\nimport type {\n PuzzleCutDescription,\n PuzzleDescription,\n} from \"cubing/puzzle-geometry/PuzzleGeometry\";\n\nexport function asstructured(v: any): any {\n if (typeof v === \"string\") {\n return JSON.parse(v);\n }\n return v;\n}\nexport function asboolean(v: any): boolean {\n if (typeof v === \"string\") {\n if (v === \"false\") {\n return false;\n }\n return true;\n } else {\n return v ? true : false;\n }\n}\nexport function parsePGOptionList(\n optionlist?: any[],\n): ExperimentalPuzzleGeometryOptions {\n const options: ExperimentalPuzzleGeometryOptions = {};\n if (optionlist !== undefined) {\n if (optionlist.length % 2 !== 0) {\n throw new Error(\"Odd length in option list?\");\n }\n for (let i = 0; i < optionlist.length; i += 2) {\n if (optionlist[i] === \"verbose\") {\n options.verbosity = (options.verbosity ?? 0) + 1;\n } else if (optionlist[i] === \"quiet\") {\n options.verbosity = 0;\n } else if (optionlist[i] === \"allmoves\") {\n options.allMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"outerblockmoves\") {\n options.outerBlockMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"vertexmoves\") {\n options.vertexMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"rotations\") {\n options.addRotations = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"cornersets\") {\n options.includeCornerOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"centersets\") {\n options.includeCenterOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"edgesets\") {\n options.includeEdgeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"omit\") {\n options.excludeOrbits = optionlist[i + 1];\n } else if (optionlist[i] === \"graycorners\") {\n options.grayCorners = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"graycenters\") {\n options.grayCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"grayedges\") {\n options.grayEdges = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"movelist\") {\n options.moveList = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"killorientation\") {\n options.fixedOrientation = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"optimize\") {\n options.optimizeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"scramble\") {\n options.scrambleAmount = optionlist[i + 1];\n } else if (optionlist[i] === \"fix\") {\n options.fixedPieceType = optionlist[i + 1];\n } else if (optionlist[i] === \"orientcenters\") {\n options.orientCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientation\") {\n options.puzzleOrientation = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientations\") {\n options.puzzleOrientations = asstructured(optionlist[i + 1]);\n } else {\n throw new Error(\n `Bad option while processing option list ${optionlist[i]}`,\n );\n }\n }\n }\n return options;\n}\n\nlet dosvg = false;\nlet doss = false;\nlet doksolve = false;\nlet dogap = false;\nlet domathematica = false;\nlet docanon = false;\nlet do3d = false;\nif (globalThis.process && process.argv && process.argv.length <= 2) {\n console.log(\n `Usage: puzzle-geometry [options] [puzzle]\n\nOptions:\n--ksolve: write ksolve (tws) file\n--svg: write SVG (default is flat; --3d makes it 3D)\n--gap: write gap\n--mathematica: write mathematica\n--ss: execute Schrier-Sims calculation\n--3d: use 3D format for SVG file\n--canon: write canonical string analysis\n--rotations: include full-puzzle rotations as moves\n--allmoves: includes all moves (i.e., slice moves for 3x3x3)\n--outerblockmoves: use outer block moves rather than slice moves\n--vertexmoves: for tetrahedral puzzles, prefer vertex moves to face moves\n--nocorners: ignore all corners\n--noedges: ignore all edges\n--nocenters: ignore all centers\n--noorientation: ignore orientations\n--orientcenters: give centers an orientation\n--puzzleorientation: for 3D formats, give puzzle orientation\n--moves movenames: restrict moves to this list (e.g, U2,F,r)\n--optimize: optimize tws/ksolve/gap output\n--scramble: scramble solved position\n--fixcorner: choose moves to keep one corner fixed\n--fixedge: choose moves to keep one edge fixed\n--fixcenter: choose moves to keep one center fixed\n--verbose (-v): make verbose\n\nThe puzzle can be given as a geometric description or by name.\nThe geometric description starts with c (cube), t (tetrahedron),\nd (dodecahedron), i (icosahedron), or o (octahedron), then a\nspace, then a series of cuts. Each cut begins with f (for a\ncut parallel to faces), v (for a cut perpendicular to a ray\nfrom the center through a corner), or e (for a cut perpendicular\nto a ray from the center through an edge) followed by a decimal\nnumber giving a distance, where 1 is the distance between the\ncenter of the puzzle and the center of a face.\n\nThe puzzle names recognized are 2x2x2 through 13x13x13, 20x20x20,\nmaster skewb, professor skewb, compy cube, helicopter, dino,\nlittle chop, pyramorphix, mastermorphix, pyraminx, Jing pyraminx,\nmaster paramorphix, megaminx, gigaminx, pentultimate, starminx,\nstarminx 2, pyraminx crystal, chopasaurus, big chop, skewb diamond,\nFTO, Christopher's jewel, octastar, Trajber's octahedron, radio chop,\nicosamate, icosahedron 2, icosahedron 3, icosahedron static faces,\nicosahedron moving faces, and Eitan's star.\n\nExamples:\n puzzlegeometry --ss 2x2x2\n puzzlegeometry --ss --fixcorner 2x2x2\n puzzlegeometry --ss --moves U,F2,r 4x4x4\n puzzlegeometry --ksolve --optimize --moves U,F,R megaminx\n puzzlegeometry --gap --noedges megaminx\n`,\n );\n}\nif (globalThis.process && process.argv && process.argv.length >= 3) {\n let desc: PuzzleDescriptionString | undefined;\n const puzzleList = getPG3DNamedPuzzles();\n let argp = 2;\n const optionlist = [];\n let showargs = true;\n let pascalcomment = false;\n while (argp < process.argv.length && process.argv[argp][0] === \"-\") {\n const option = process.argv[argp++];\n if (option === \"--verbose\" || option === \"-v\") {\n optionlist.push(\"verbose\", true);\n } else if (option === \"--quiet\" || option === \"-q\") {\n optionlist.push(\"quiet\", true);\n showargs = false;\n } else if (option === \"--ksolve\") {\n doksolve = true;\n } else if (option === \"--svg\") {\n showargs = false;\n optionlist.push(\"quiet\", true);\n dosvg = true;\n } else if (option === \"--gap\") {\n dogap = true;\n } else if (option === \"--mathematica\") {\n domathematica = true;\n pascalcomment = true;\n } else if (option === \"--ss\") {\n doss = true;\n } else if (option === \"--3d\") {\n do3d = true;\n } else if (option === \"--canon\") {\n docanon = true;\n } else if (option === \"--rotations\") {\n optionlist.push(\"rotations\", true);\n } else if (option === \"--allmoves\") {\n optionlist.push(\"allmoves\", true);\n } else if (option === \"--outerblockmoves\") {\n optionlist.push(\"outerblockmoves\", true);\n } else if (option === \"--vertexmoves\") {\n optionlist.push(\"vertexmoves\", true);\n } else if (option === \"--nocorners\") {\n optionlist.push(\"cornersets\", false);\n } else if (option === \"--noedges\") {\n optionlist.push(\"edgesets\", false);\n } else if (option === \"--noorientation\") {\n optionlist.push(\"killorientation\", true);\n } else if (option === \"--nocenters\") {\n optionlist.push(\"centersets\", false);\n } else if (option === \"--omit\") {\n optionlist.push(\"omit\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--moves\") {\n optionlist.push(\"movelist\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--optimize\") {\n optionlist.push(\"optimize\", true);\n } else if (option === \"--scramble\") {\n optionlist.push(\"scramble\", 100);\n } else if (option === \"--fixcorner\") {\n optionlist.push(\"fix\", \"v\");\n } else if (option === \"--fixedge\") {\n optionlist.push(\"fix\", \"e\");\n } else if (option === \"--fixcenter\") {\n optionlist.push(\"fix\", \"f\");\n } else if (option === \"--orientcenters\") {\n optionlist.push(\"orientcenters\", true);\n } else if (option === \"--puzzleorientation\") {\n optionlist.push(\"puzzleorientation\", process.argv[argp]);\n argp++;\n } else {\n throw new Error(`Bad option: ${option}`);\n }\n }\n for (const [name, curDesc] of Object.entries(puzzleList)) {\n if (name === process.argv[argp]) {\n desc = curDesc;\n break;\n }\n }\n let puzzleDescription: PuzzleDescription;\n if (showargs) {\n if (pascalcomment) {\n console.log(`(* ${process.argv.join(\" \")} *)`);\n } else {\n console.log(`# ${process.argv.join(\" \")}`);\n }\n }\n if (desc !== undefined) {\n const parsed = parsePuzzleDescription(desc);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n puzzleDescription = parsed;\n argp++;\n } else {\n const cuts: PuzzleCutDescription[] = [];\n const cutarg = argp++;\n while (argp + 1 < process.argv.length && process.argv[argp].length === 1) {\n // TODO: validate cut type\n cuts.push({\n cutType: process.argv[argp] as ExperimentalPuzzleCutType,\n distance: parseFloat(process.argv[argp + 1]),\n });\n argp += 2;\n }\n // TODO: validate shape\n puzzleDescription = {\n shape: process.argv[cutarg] as ExperimentalPuzzleBaseShape,\n cuts,\n };\n }\n const options = parsePGOptionList(optionlist);\n const pg = new PuzzleGeometry(puzzleDescription, options);\n pg.allstickers();\n pg.genperms();\n if (argp < process.argv.length) {\n throw new Error(\"Unprocessed content at end of command line\");\n }\n if (dogap) {\n console.log(pg.writegap());\n } else if (domathematica) {\n console.log(pg.writemathematica());\n } else if (doksolve) {\n console.log(pg.writeksolve()); // TODO: Update arguments\n } else if (dosvg) {\n console.log(pg.generatesvg(undefined, undefined, undefined, do3d));\n } else if (do3d) {\n console.log(JSON.stringify(pg.get3d()));\n } else if (doss) {\n pg.writeSchreierSims(console.log);\n } else if (docanon) {\n pg.showcanon((_) => console.log(_));\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// To run this file directly:\n// bun run src/bin/puzzle-geometry-bin.ts -- <program args>\n\nimport {\n PuzzleGeometry,\n getPG3DNamedPuzzles,\n parsePuzzleDescription,\n type ExperimentalPuzzleBaseShape,\n type ExperimentalPuzzleCutType,\n type ExperimentalPuzzleGeometryOptions,\n} from \"cubing/puzzle-geometry\";\nimport type { PuzzleDescriptionString } from \"cubing/puzzle-geometry/PGPuzzles\";\nimport type {\n PuzzleCutDescription,\n PuzzleDescription,\n} from \"cubing/puzzle-geometry/PuzzleGeometry\";\n\nexport function asstructured(v: any): any {\n if (typeof v === \"string\") {\n return JSON.parse(v);\n }\n return v;\n}\nexport function asboolean(v: any): boolean {\n if (typeof v === \"string\") {\n return v !== \"false\";\n } else {\n return !!v;\n }\n}\nexport function parsePGOptionList(\n optionlist?: any[],\n): ExperimentalPuzzleGeometryOptions {\n const options: ExperimentalPuzzleGeometryOptions = {};\n if (optionlist !== undefined) {\n if (optionlist.length % 2 !== 0) {\n throw new Error(\"Odd length in option list?\");\n }\n for (let i = 0; i < optionlist.length; i += 2) {\n if (optionlist[i] === \"verbose\") {\n options.verbosity = (options.verbosity ?? 0) + 1;\n } else if (optionlist[i] === \"quiet\") {\n options.verbosity = 0;\n } else if (optionlist[i] === \"allmoves\") {\n options.allMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"outerblockmoves\") {\n options.outerBlockMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"vertexmoves\") {\n options.vertexMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"rotations\") {\n options.addRotations = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"cornersets\") {\n options.includeCornerOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"centersets\") {\n options.includeCenterOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"edgesets\") {\n options.includeEdgeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"omit\") {\n options.excludeOrbits = optionlist[i + 1];\n } else if (optionlist[i] === \"graycorners\") {\n options.grayCorners = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"graycenters\") {\n options.grayCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"grayedges\") {\n options.grayEdges = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"movelist\") {\n options.moveList = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"killorientation\") {\n options.fixedOrientation = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"optimize\") {\n options.optimizeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"scramble\") {\n options.scrambleAmount = optionlist[i + 1];\n } else if (optionlist[i] === \"fix\") {\n options.fixedPieceType = optionlist[i + 1];\n } else if (optionlist[i] === \"orientcenters\") {\n options.orientCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientation\") {\n options.puzzleOrientation = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientations\") {\n options.puzzleOrientations = asstructured(optionlist[i + 1]);\n } else {\n throw new Error(\n `Bad option while processing option list ${optionlist[i]}`,\n );\n }\n }\n }\n return options;\n}\n\nlet dosvg = false;\nlet doss = false;\nlet doksolve = false;\nlet dogap = false;\nlet domathematica = false;\nlet docanon = false;\nlet do3d = false;\nif (globalThis.process && process.argv && process.argv.length <= 2) {\n console.log(\n `Usage: puzzle-geometry [options] [puzzle]\n\nOptions:\n--ksolve: write ksolve (tws) file\n--svg: write SVG (default is flat; --3d makes it 3D)\n--gap: write gap\n--mathematica: write mathematica\n--ss: execute Schrier-Sims calculation\n--3d: use 3D format for SVG file\n--canon: write canonical string analysis\n--rotations: include full-puzzle rotations as moves\n--allmoves: includes all moves (i.e., slice moves for 3x3x3)\n--outerblockmoves: use outer block moves rather than slice moves\n--vertexmoves: for tetrahedral puzzles, prefer vertex moves to face moves\n--nocorners: ignore all corners\n--noedges: ignore all edges\n--nocenters: ignore all centers\n--noorientation: ignore orientations\n--orientcenters: give centers an orientation\n--puzzleorientation: for 3D formats, give puzzle orientation\n--moves movenames: restrict moves to this list (e.g, U2,F,r)\n--optimize: optimize tws/ksolve/gap output\n--scramble: scramble solved position\n--fixcorner: choose moves to keep one corner fixed\n--fixedge: choose moves to keep one edge fixed\n--fixcenter: choose moves to keep one center fixed\n--verbose (-v): make verbose\n\nThe puzzle can be given as a geometric description or by name.\nThe geometric description starts with c (cube), t (tetrahedron),\nd (dodecahedron), i (icosahedron), or o (octahedron), then a\nspace, then a series of cuts. Each cut begins with f (for a\ncut parallel to faces), v (for a cut perpendicular to a ray\nfrom the center through a corner), or e (for a cut perpendicular\nto a ray from the center through an edge) followed by a decimal\nnumber giving a distance, where 1 is the distance between the\ncenter of the puzzle and the center of a face.\n\nThe puzzle names recognized are 2x2x2 through 13x13x13, 20x20x20,\nmaster skewb, professor skewb, compy cube, helicopter, dino,\nlittle chop, pyramorphix, mastermorphix, pyraminx, Jing pyraminx,\nmaster paramorphix, megaminx, gigaminx, pentultimate, starminx,\nstarminx 2, pyraminx crystal, chopasaurus, big chop, skewb diamond,\nFTO, Christopher's jewel, octastar, Trajber's octahedron, radio chop,\nicosamate, icosahedron 2, icosahedron 3, icosahedron static faces,\nicosahedron moving faces, and Eitan's star.\n\nExamples:\n puzzlegeometry --ss 2x2x2\n puzzlegeometry --ss --fixcorner 2x2x2\n puzzlegeometry --ss --moves U,F2,r 4x4x4\n puzzlegeometry --ksolve --optimize --moves U,F,R megaminx\n puzzlegeometry --gap --noedges megaminx\n`,\n );\n}\nif (globalThis.process && process.argv && process.argv.length >= 3) {\n let desc: PuzzleDescriptionString | undefined;\n const puzzleList = getPG3DNamedPuzzles();\n let argp = 2;\n const optionlist = [];\n let showargs = true;\n let pascalcomment = false;\n while (argp < process.argv.length && process.argv[argp][0] === \"-\") {\n const option = process.argv[argp++];\n if (option === \"--verbose\" || option === \"-v\") {\n optionlist.push(\"verbose\", true);\n } else if (option === \"--quiet\" || option === \"-q\") {\n optionlist.push(\"quiet\", true);\n showargs = false;\n } else if (option === \"--ksolve\") {\n doksolve = true;\n } else if (option === \"--svg\") {\n showargs = false;\n optionlist.push(\"quiet\", true);\n dosvg = true;\n } else if (option === \"--gap\") {\n dogap = true;\n } else if (option === \"--mathematica\") {\n domathematica = true;\n pascalcomment = true;\n } else if (option === \"--ss\") {\n doss = true;\n } else if (option === \"--3d\") {\n do3d = true;\n } else if (option === \"--canon\") {\n docanon = true;\n } else if (option === \"--rotations\") {\n optionlist.push(\"rotations\", true);\n } else if (option === \"--allmoves\") {\n optionlist.push(\"allmoves\", true);\n } else if (option === \"--outerblockmoves\") {\n optionlist.push(\"outerblockmoves\", true);\n } else if (option === \"--vertexmoves\") {\n optionlist.push(\"vertexmoves\", true);\n } else if (option === \"--nocorners\") {\n optionlist.push(\"cornersets\", false);\n } else if (option === \"--noedges\") {\n optionlist.push(\"edgesets\", false);\n } else if (option === \"--noorientation\") {\n optionlist.push(\"killorientation\", true);\n } else if (option === \"--nocenters\") {\n optionlist.push(\"centersets\", false);\n } else if (option === \"--omit\") {\n optionlist.push(\"omit\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--moves\") {\n optionlist.push(\"movelist\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--optimize\") {\n optionlist.push(\"optimize\", true);\n } else if (option === \"--scramble\") {\n optionlist.push(\"scramble\", 100);\n } else if (option === \"--fixcorner\") {\n optionlist.push(\"fix\", \"v\");\n } else if (option === \"--fixedge\") {\n optionlist.push(\"fix\", \"e\");\n } else if (option === \"--fixcenter\") {\n optionlist.push(\"fix\", \"f\");\n } else if (option === \"--orientcenters\") {\n optionlist.push(\"orientcenters\", true);\n } else if (option === \"--puzzleorientation\") {\n optionlist.push(\"puzzleorientation\", process.argv[argp]);\n argp++;\n } else {\n throw new Error(`Bad option: ${option}`);\n }\n }\n for (const [name, curDesc] of Object.entries(puzzleList)) {\n if (name === process.argv[argp]) {\n desc = curDesc;\n break;\n }\n }\n let puzzleDescription: PuzzleDescription;\n if (showargs) {\n if (pascalcomment) {\n console.log(`(* ${process.argv.join(\" \")} *)`);\n } else {\n console.log(`# ${process.argv.join(\" \")}`);\n }\n }\n if (desc !== undefined) {\n const parsed = parsePuzzleDescription(desc);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n puzzleDescription = parsed;\n argp++;\n } else {\n const cuts: PuzzleCutDescription[] = [];\n const cutarg = argp++;\n while (argp + 1 < process.argv.length && process.argv[argp].length === 1) {\n // TODO: validate cut type\n cuts.push({\n cutType: process.argv[argp] as ExperimentalPuzzleCutType,\n distance: parseFloat(process.argv[argp + 1]),\n });\n argp += 2;\n }\n // TODO: validate shape\n puzzleDescription = {\n shape: process.argv[cutarg] as ExperimentalPuzzleBaseShape,\n cuts,\n };\n }\n const options = parsePGOptionList(optionlist);\n const pg = new PuzzleGeometry(puzzleDescription, options);\n pg.allstickers();\n pg.genperms();\n if (argp < process.argv.length) {\n throw new Error(\"Unprocessed content at end of command line\");\n }\n if (dogap) {\n console.log(pg.writegap());\n } else if (domathematica) {\n console.log(pg.writemathematica());\n } else if (doksolve) {\n console.log(pg.writeksolve()); // TODO: Update arguments\n } else if (dosvg) {\n console.log(pg.generatesvg(undefined, undefined, undefined, do3d));\n } else if (do3d) {\n console.log(JSON.stringify(pg.get3d()));\n } else if (doss) {\n pg.writeSchreierSims(console.log);\n } else if (docanon) {\n pg.showcanon((_) => console.log(_));\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  binaryComponentsToReid3x3x3,
3
3
  twizzleBinaryToBinaryComponents
4
- } from "../chunks/chunk-I4WNYLYZ.js";
4
+ } from "../chunks/chunk-2ZDYUAXG.js";
5
5
  import {
6
6
  cube3x3x3,
7
7
  puzzles
8
- } from "../chunks/chunk-OOFPCAGO.js";
8
+ } from "../chunks/chunk-3W5GXH7H.js";
9
9
  import {
10
10
  experimental3x3x3KPuzzle
11
- } from "../chunks/chunk-6OQS3O7Y.js";
11
+ } from "../chunks/chunk-Q222EQJR.js";
12
12
  import {
13
13
  KPattern
14
14
  } from "../chunks/chunk-GEMIB7TF.js";
@@ -3,7 +3,7 @@ import {
3
3
  normalize3x3x3Orientation,
4
4
  puzzleOrientation3x3x3Cache,
5
5
  puzzleOrientation3x3x3Idx
6
- } from "./chunk-6OQS3O7Y.js";
6
+ } from "./chunk-Q222EQJR.js";
7
7
  import {
8
8
  KPattern
9
9
  } from "./chunk-GEMIB7TF.js";
@@ -262,4 +262,4 @@ export {
262
262
  bufferToSpacedHex,
263
263
  spacedHexToBuffer
264
264
  };
265
- //# sourceMappingURL=chunk-I4WNYLYZ.js.map
265
+ //# sourceMappingURL=chunk-2ZDYUAXG.js.map
@@ -11,7 +11,7 @@ import {
11
11
  experimental3x3x3KPuzzle,
12
12
  from,
13
13
  getCached
14
- } from "./chunk-6OQS3O7Y.js";
14
+ } from "./chunk-Q222EQJR.js";
15
15
  import {
16
16
  KPuzzle
17
17
  } from "./chunk-GEMIB7TF.js";
@@ -701,4 +701,4 @@ export {
701
701
  cube3x3x3,
702
702
  puzzles
703
703
  };
704
- //# sourceMappingURL=chunk-OOFPCAGO.js.map
704
+ //# sourceMappingURL=chunk-3W5GXH7H.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  from
3
- } from "./chunk-6OQS3O7Y.js";
3
+ } from "./chunk-Q222EQJR.js";
4
4
 
5
5
  // src/cubing/twisty/debug.ts
6
6
  var twistyDebugGlobals = {
@@ -527,7 +527,7 @@ var StatsPanel = class {
527
527
  // src/cubing/twisty/heavy-code-imports/3d.ts
528
528
  var cachedConstructorProxy = null;
529
529
  async function proxy3D() {
530
- return cachedConstructorProxy ??= import("./twisty-dynamic-3d-2IJDXFSH.js");
530
+ return cachedConstructorProxy ??= import("./twisty-dynamic-3d-VWNC3JXN.js");
531
531
  }
532
532
  var THREEJS = from(
533
533
  async () => (await proxy3D()).T3I
@@ -1155,4 +1155,4 @@ export {
1155
1155
  proxy3D,
1156
1156
  THREEJS
1157
1157
  };
1158
- //# sourceMappingURL=chunk-3V53MPRZ.js.map
1158
+ //# sourceMappingURL=chunk-7WLUEIZX.js.map
@@ -372,4 +372,4 @@ export {
372
372
  solveTwsearch,
373
373
  setSearchDebug
374
374
  };
375
- //# sourceMappingURL=chunk-4MAJE4KF.js.map
375
+ //# sourceMappingURL=chunk-HPIYOMRJ.js.map
@@ -1217,4 +1217,4 @@ export {
1217
1217
  customPGPuzzleLoader,
1218
1218
  experimental3x3x3KPuzzle
1219
1219
  };
1220
- //# sourceMappingURL=chunk-6OQS3O7Y.js.map
1220
+ //# sourceMappingURL=chunk-Q222EQJR.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  puzzles
3
- } from "./chunk-OOFPCAGO.js";
3
+ } from "./chunk-3W5GXH7H.js";
4
4
  import {
5
5
  from
6
- } from "./chunk-6OQS3O7Y.js";
6
+ } from "./chunk-Q222EQJR.js";
7
7
  import {
8
8
  KPattern
9
9
  } from "./chunk-GEMIB7TF.js";
@@ -602,4 +602,4 @@ export {
602
602
  initialize333,
603
603
  random333OrientedScramble
604
604
  };
605
- //# sourceMappingURL=chunk-5KNIZ2YB.js.map
605
+ //# sourceMappingURL=chunk-QYBDWFY6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cube3x3x3KPuzzleDefinition
3
- } from "./chunk-6OQS3O7Y.js";
3
+ } from "./chunk-Q222EQJR.js";
4
4
  import {
5
5
  TraversalUp,
6
6
  functionFromTraversal
@@ -269,4 +269,4 @@ export {
269
269
  countMetricMoves,
270
270
  countAnimatedLeaves
271
271
  };
272
- //# sourceMappingURL=chunk-PX2L23L2.js.map
272
+ //# sourceMappingURL=chunk-YGLO3POD.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-PP44P6WK.js";
4
4
  import {
5
5
  countMoves
6
- } from "./chunk-PX2L23L2.js";
6
+ } from "./chunk-YGLO3POD.js";
7
7
  import {
8
8
  addOrientationSuffix,
9
9
  initialize333,
@@ -12,15 +12,15 @@ import {
12
12
  random333Scramble,
13
13
  setIsInsideWorker,
14
14
  solve333
15
- } from "./chunk-5KNIZ2YB.js";
15
+ } from "./chunk-QYBDWFY6.js";
16
16
  import "./chunk-RDSQRW3G.js";
17
17
  import {
18
18
  cube2x2x2,
19
19
  puzzles
20
- } from "./chunk-OOFPCAGO.js";
20
+ } from "./chunk-3W5GXH7H.js";
21
21
  import {
22
22
  from
23
- } from "./chunk-6OQS3O7Y.js";
23
+ } from "./chunk-Q222EQJR.js";
24
24
  import {
25
25
  KPattern,
26
26
  KPuzzle
@@ -185,7 +185,7 @@ async function wasmRandomScrambleForEvent(eventID) {
185
185
  }
186
186
 
187
187
  // src/cubing/search/inside/solve/puzzles/dynamic/sgs-side-events/index.ts
188
- var searchDynamicSideEvents = from(() => import("./search-dynamic-sgs-side-events-EG3CKCS4.js"));
188
+ var searchDynamicSideEvents = from(() => import("./search-dynamic-sgs-side-events-2RPLAYOZ.js"));
189
189
 
190
190
  // src/cubing/search/inside/solve/puzzles/2x2x2.ts
191
191
  var cachedTrembleSolver = null;
@@ -210,7 +210,7 @@ async function solve222(pattern) {
210
210
  }
211
211
 
212
212
  // src/cubing/search/inside/solve/puzzles/dynamic/4x4x4/index.ts
213
- var dynamic4x4x4Solver = from(() => import("./search-dynamic-solve-4x4x4-IYN4OTDM.js"));
213
+ var dynamic4x4x4Solver = from(() => import("./search-dynamic-solve-4x4x4-R4SVOZSB.js"));
214
214
 
215
215
  // src/cubing/search/inside/solve/puzzles/4x4x4.ts
216
216
  var randomSuffixes = [
@@ -232,7 +232,7 @@ async function random444OrientedScramble() {
232
232
  var dynamicFTOSolver = from(() => import("./search-dynamic-solve-fto-EY5ZVAGO.js"));
233
233
 
234
234
  // src/cubing/search/inside/solve/puzzles/fto.ts
235
- var dynamic = from(() => import("./search-dynamic-sgs-unofficial-XHAYSQO3.js"));
235
+ var dynamic = from(() => import("./search-dynamic-sgs-unofficial-SOS5BTCL.js"));
236
236
  async function randomFTOScramble() {
237
237
  mustBeInsideWorker();
238
238
  return new Alg(await (await dynamicFTOSolver).randomFTOScrambleString());
@@ -312,7 +312,7 @@ async function solvePyraminx(pattern) {
312
312
  }
313
313
 
314
314
  // src/cubing/search/inside/solve/puzzles/dynamic/sgs-unofficial/index.ts
315
- var searchDynamicUnofficial = from(() => import("./search-dynamic-sgs-unofficial-XHAYSQO3.js"));
315
+ var searchDynamicUnofficial = from(() => import("./search-dynamic-sgs-unofficial-SOS5BTCL.js"));
316
316
 
317
317
  // src/cubing/search/inside/solve/puzzles/redi_cube.ts
318
318
  async function randomRediCubeScramble() {
@@ -568,4 +568,4 @@ var insideAPI = {
568
568
 
569
569
  // src/cubing/search/inside/index.ts
570
570
  expose(insideAPI);
571
- //# sourceMappingURL=inside-CH2IHSQT.js.map
571
+ //# sourceMappingURL=inside-XY43FEWJ.js.map
@@ -4,8 +4,8 @@ import {
4
4
  import {
5
5
  cube2x2x2,
6
6
  puzzles
7
- } from "./chunk-OOFPCAGO.js";
8
- import "./chunk-6OQS3O7Y.js";
7
+ } from "./chunk-3W5GXH7H.js";
8
+ import "./chunk-Q222EQJR.js";
9
9
  import {
10
10
  KPuzzle
11
11
  } from "./chunk-GEMIB7TF.js";
@@ -1888,4 +1888,4 @@ export {
1888
1888
  sgsDataSkewbFixedCorner,
1889
1889
  skewbKPuzzleWithoutMOCached
1890
1890
  };
1891
- //# sourceMappingURL=search-dynamic-sgs-side-events-EG3CKCS4.js.map
1891
+ //# sourceMappingURL=search-dynamic-sgs-side-events-2RPLAYOZ.js.map
@@ -3,8 +3,8 @@ import {
3
3
  } from "./chunk-VQIVSUL2.js";
4
4
  import {
5
5
  puzzles
6
- } from "./chunk-OOFPCAGO.js";
7
- import "./chunk-6OQS3O7Y.js";
6
+ } from "./chunk-3W5GXH7H.js";
7
+ import "./chunk-Q222EQJR.js";
8
8
  import "./chunk-GEMIB7TF.js";
9
9
  import {
10
10
  Alg
@@ -1265,4 +1265,4 @@ export {
1265
1265
  getRandomRediCubeScramble,
1266
1266
  sgsDataFTO
1267
1267
  };
1268
- //# sourceMappingURL=search-dynamic-sgs-unofficial-XHAYSQO3.js.map
1268
+ //# sourceMappingURL=search-dynamic-sgs-unofficial-SOS5BTCL.js.map
@@ -1,12 +1,12 @@
1
1
  import "./chunk-NAPITA3L.js";
2
- import "./chunk-4MAJE4KF.js";
2
+ import "./chunk-HPIYOMRJ.js";
3
3
  import {
4
4
  random333Scramble
5
- } from "./chunk-5KNIZ2YB.js";
5
+ } from "./chunk-QYBDWFY6.js";
6
6
  import "./chunk-7GUL3OBQ.js";
7
7
  import "./chunk-RDSQRW3G.js";
8
- import "./chunk-OOFPCAGO.js";
9
- import "./chunk-6OQS3O7Y.js";
8
+ import "./chunk-3W5GXH7H.js";
9
+ import "./chunk-Q222EQJR.js";
10
10
  import "./chunk-GEMIB7TF.js";
11
11
  import {
12
12
  Alg
@@ -2923,4 +2923,4 @@ export {
2923
2923
  initialize,
2924
2924
  random444Scramble
2925
2925
  };
2926
- //# sourceMappingURL=search-dynamic-solve-4x4x4-IYN4OTDM.js.map
2926
+ //# sourceMappingURL=search-dynamic-solve-4x4x4-R4SVOZSB.js.map
@@ -9,7 +9,7 @@ import "./chunk-RDSQRW3G.js";
9
9
  // src/cubing/search/worker-workarounds/search-worker-entry.js
10
10
  if (exposeAPI.expose) {
11
11
  (async () => {
12
- await import("./inside-CH2IHSQT.js");
12
+ await import("./inside-XY43FEWJ.js");
13
13
  const messagePort = globalThis.postMessage ? globalThis : await nodeEndpointPort();
14
14
  messagePort.postMessage("comlink-exposed");
15
15
  })();
@@ -3,13 +3,13 @@ import {
3
3
  THREEJS,
4
4
  haveStartedSharingRenderers,
5
5
  hintFaceletStyles
6
- } from "./chunk-3V53MPRZ.js";
6
+ } from "./chunk-7WLUEIZX.js";
7
7
  import {
8
8
  cube3x3x3
9
- } from "./chunk-OOFPCAGO.js";
9
+ } from "./chunk-3W5GXH7H.js";
10
10
  import {
11
11
  getFaceletStickeringMask
12
- } from "./chunk-6OQS3O7Y.js";
12
+ } from "./chunk-Q222EQJR.js";
13
13
  import "./chunk-GEMIB7TF.js";
14
14
  import {
15
15
  Move
@@ -1849,4 +1849,4 @@ export {
1849
1849
  cube3DShim,
1850
1850
  pg3dShim
1851
1851
  };
1852
- //# sourceMappingURL=twisty-dynamic-3d-2IJDXFSH.js.map
1852
+ //# sourceMappingURL=twisty-dynamic-3d-VWNC3JXN.js.map
@@ -5,8 +5,8 @@ import {
5
5
  countMetricMoves,
6
6
  countMoves,
7
7
  countMovesETM
8
- } from "../chunks/chunk-PX2L23L2.js";
9
- import "../chunks/chunk-6OQS3O7Y.js";
8
+ } from "../chunks/chunk-YGLO3POD.js";
9
+ import "../chunks/chunk-Q222EQJR.js";
10
10
  import "../chunks/chunk-GEMIB7TF.js";
11
11
  import "../chunks/chunk-H5G52ETP.js";
12
12
  export {
@@ -5,8 +5,8 @@ import {
5
5
  spacedHexToBuffer,
6
6
  twizzleBinaryToBinaryComponents,
7
7
  twizzleBinaryToReid3x3x3
8
- } from "../chunks/chunk-I4WNYLYZ.js";
9
- import "../chunks/chunk-6OQS3O7Y.js";
8
+ } from "../chunks/chunk-2ZDYUAXG.js";
9
+ import "../chunks/chunk-Q222EQJR.js";
10
10
  import "../chunks/chunk-GEMIB7TF.js";
11
11
  import "../chunks/chunk-H5G52ETP.js";
12
12
  export {
@@ -3853,8 +3853,9 @@ var PuzzleGeometry = class {
3853
3853
  }
3854
3854
  }
3855
3855
  if (b.length === 2 && this.options.orientCenters) {
3856
+ const dir = this.facecentermass[i].dot(this.moveplanenormals[k]);
3856
3857
  for (let ii = 1; ii < this.movesetorders[k]; ii++) {
3857
- if (sc === 0) {
3858
+ if (dir > 0) {
3858
3859
  b.push(b[0], ii);
3859
3860
  } else {
3860
3861
  b.push(