text paste
{
  "version": "4.0.0",
  "note": "Read-only runtime extraction. No game methods are invoked except the same readLive() inspection used by the previous probe.",
  "discovery": {
    "component": "eC",
    "propsKeys": [
      "engine",
      "placement",
      "enabled",
      "spinEnabled"
    ],
    "reactFibersVisited": 166,
    "engineCandidates": 6,
    "objectCount": 110
  },
  "objectGraph": [
    {
      "path": "engine",
      "constructor": "tD",
      "ownKeys": [
        "view",
        "renderer",
        "net",
        "player",
        "phase",
        "state",
        "guideLevel",
        "soundOn",
        "aimAngle",
        "power",
        "spinX",
        "spinY",
        "pullback",
        "cueAlpha",
        "prediction",
        "predictionDirty",
        "practice",
        "bih",
        "foulFlash",
        "message",
        "messageKind",
        "messageId",
        "lastPotted",
        "opponentAway",
        "opponentGone",
        "shootStart",
        "strokeAt",
        "strokeFrom",
        "strokeMs",
        "setFor",
        "shotSentAt",
        "shotExtra",
        "shotUnsureAt",
        "pendingShot",
        "pendingReplay",
        "pendingOutcome",
        "pendingState",
        "resolveAt",
        "remoteShot",
        "remote",
        "remoteSettled",
        "viewAngle",
        "viewPower",
        "viewSpinX",
        "viewSpinY",
        "viewPullback",
        "aimSentAt",
        "sentAngle",
        "sentPower",
        "sentSpinX",
        "sentSpinY",
        "sentCueX",
        "sentCueY",
        "sentCharging",
        "raf",
        "lastTime",
        "now",
        "running",
        "version",
        "snapshot",
        "listeners",
        "unsubscribe",
        "pointerId",
        "dragMode",
        "controlMode",
        "sensitivity",
        "turnLast",
        "fingerLast",
        "powerHeld",
        "watchPrediction",
        "watchKey",
        "dragStart",
        "fineAim",
        "turnHold",
        "turnHoldAt",
        "turnHoldBy",
        "track",
        "spaceDown",
        "spaceStart",
        "powerBeforeStroke",
        "myPower",
        "strokeBase",
        "strokeMouse",
        "strokeTravelPx",
        "wheelCarry",
        "wheelShowUntil",
        "wheelUsed",
        "canvasEl",
        "subscribe",
        "getSnapshot",
        "onFocusLost",
        "onContextMenu",
        "onWheel",
        "onPointerDown",
        "onPointerMove",
        "onPointerUp",
        "onPointerLeave",
        "onKeyDown",
        "onKeyUp"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tD",
          "methods": [
            {
              "name": "publish",
              "length": 93,
              "selected": false
            },
            {
              "name": "rel",
              "length": 45,
              "selected": false
            },
            {
              "name": "buildSnapshot",
              "length": 1212,
              "selected": true
            },
            {
              "name": "readLive",
              "length": 170,
              "selected": true
            },
            {
              "name": "attachNetwork",
              "length": 1530,
              "selected": true
            },
            {
              "name": "applyState",
              "length": 363,
              "selected": true
            },
            {
              "name": "enterTurn",
              "length": 872,
              "selected": true
            },
            {
              "name": "canReposition",
              "length": 182,
              "selected": true
            },
            {
              "name": "faceNearestTarget",
              "length": 330,
              "selected": true
            },
            {
              "name": "start",
              "length": 172,
              "selected": false
            },
            {
              "name": "stop",
              "length": 54,
              "selected": false
            },
            {
              "name": "dispose",
              "length": 96,
              "selected": false
            },
            {
              "name": "resize",
              "length": 66,
              "selected": true
            },
            {
              "name": "setGuideLevel",
              "length": 111,
              "selected": true
            },
            {
              "name": "setPractice",
              "length": 183,
              "selected": true
            },
            {
              "name": "setSound",
              "length": 59,
              "selected": false
            },
            {
              "name": "frame",
              "length": 834,
              "selected": true
            },
            {
              "name": "showAim",
              "length": 63,
              "selected": true
            },
            {
              "name": "showCue",
              "length": 200,
              "selected": true
            },
            {
              "name": "blockedTarget",
              "length": 235,
              "selected": true
            },
            {
              "name": "highlightTargets",
              "length": 186,
              "selected": false
            },
            {
              "name": "update",
              "length": 1654,
              "selected": true
            },
            {
              "name": "followOpponent",
              "length": 673,
              "selected": true
            },
            {
              "name": "refreshWatchGuide",
              "length": 307,
              "selected": true
            },
            {
              "name": "watchLevel",
              "length": 75,
              "selected": false
            },
            {
              "name": "broadcastAim",
              "length": 829,
              "selected": true
            },
            {
              "name": "resetAimCache",
              "length": 149,
              "selected": true
            },
            {
              "name": "refreshPrediction",
              "length": 246,
              "selected": true
            },
            {
              "name": "beginSet",
              "length": 74,
              "selected": true
            },
            {
              "name": "setLead",
              "length": 83,
              "selected": false
            },
            {
              "name": "noteShotAnswer",
              "length": 117,
              "selected": true
            },
            {
              "name": "awaitingOwnShot",
              "length": 100,
              "selected": true
            },
            {
              "name": "centreSpin",
              "length": 39,
              "selected": true
            },
            {
              "name": "forgetShot",
              "length": 79,
              "selected": true
            },
            {
              "name": "abandonShot",
              "length": 334,
              "selected": true
            },
            {
              "name": "beginPlayback",
              "length": 237,
              "selected": true
            },
            {
              "name": "consumeEvent",
              "length": 500,
              "selected": true
            },
            {
              "name": "finishPlayback",
              "length": 387,
              "selected": true
            },
            {
              "name": "finishResolve",
              "length": 140,
              "selected": true
            },
            {
              "name": "setMessage",
              "length": 82,
              "selected": false
            },
            {
              "name": "setPower",
              "length": 131,
              "selected": true
            },
            {
              "name": "holdPower",
              "length": 30,
              "selected": true
            },
            {
              "name": "setControlMode",
              "length": 58,
              "selected": false
            },
            {
              "name": "setSensitivity",
              "length": 78,
              "selected": false
            },
            {
              "name": "commitPower",
              "length": 63,
              "selected": true
            },
            {
              "name": "setSpin",
              "length": 117,
              "selected": true
            },
            {
              "name": "nudgeAim",
              "length": 78,
              "selected": true
            },
            {
              "name": "wheelAim",
              "length": 55,
              "selected": true
            },
            {
              "name": "holdFineAim",
              "length": 224,
              "selected": true
            },
            {
              "name": "releaseFineAim",
              "length": 54,
              "selected": true
            },
            {
              "name": "shoot",
              "length": 843,
              "selected": true
            },
            {
              "name": "placeCueBall",
              "length": 276,
              "selected": true
            },
            {
              "name": "placementLegal",
              "length": 116,
              "selected": true
            },
            {
              "name": "rematch",
              "length": 81,
              "selected": false
            },
            {
              "name": "declineRematch",
              "length": 43,
              "selected": false
            },
            {
              "name": "attachInput",
              "length": 609,
              "selected": false
            },
            {
              "name": "detachInput",
              "length": 637,
              "selected": false
            },
            {
              "name": "localPoint",
              "length": 121,
              "selected": false
            },
            {
              "name": "overTable",
              "length": 61,
              "selected": true
            },
            {
              "name": "overCue",
              "length": 264,
              "selected": true
            },
            {
              "name": "overCueBall",
              "length": 97,
              "selected": true
            },
            {
              "name": "beginPlacing",
              "length": 156,
              "selected": true
            },
            {
              "name": "beginStroke",
              "length": 296,
              "selected": true
            },
            {
              "name": "turnAim",
              "length": 257,
              "selected": true
            },
            {
              "name": "followFinger",
              "length": 298,
              "selected": true
            },
            {
              "name": "aimAt",
              "length": 230,
              "selected": true
            },
            {
              "name": "updateBallInHand",
              "length": 1072,
              "selected": true
            }
          ]
        }
      ]
    },
    {
      "path": "view",
      "constructor": "tL",
      "ownKeys": [
        "balls",
        "orthoCounter"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tL",
          "methods": [
            {
              "name": "apply",
              "length": 150,
              "selected": true
            },
            {
              "name": "spin",
              "length": 898,
              "selected": true
            }
          ]
        }
      ]
    },
    {
      "path": "renderer",
      "constructor": "tM",
      "ownKeys": [
        "canvas",
        "effects",
        "ctx",
        "sprite",
        "scale",
        "originX",
        "originY",
        "dpr",
        "cssW",
        "cssH",
        "rotated",
        "drops",
        "lastFrame",
        "spriteTable",
        "theme"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tM",
          "methods": [
            {
              "name": "resize",
              "length": 410,
              "selected": false
            },
            {
              "name": "syncTheme",
              "length": 253,
              "selected": false
            },
            {
              "name": "ballSkin",
              "length": 107,
              "selected": true
            },
            {
              "name": "toWorld",
              "length": 118,
              "selected": false
            },
            {
              "name": "toScreen",
              "length": 121,
              "selected": false
            },
            {
              "name": "notePot",
              "length": 78,
              "selected": false
            },
            {
              "name": "clearDrops",
              "length": 33,
              "selected": false
            },
            {
              "name": "render",
              "length": 1263,
              "selected": true
            },
            {
              "name": "drawKitchen",
              "length": 270,
              "selected": true
            },
            {
              "name": "drawMotionTrails",
              "length": 527,
              "selected": true
            },
            {
              "name": "drawDrops",
              "length": 510,
              "selected": true
            },
            {
              "name": "drawGuides",
              "length": 1985,
              "selected": true
            },
            {
              "name": "drawBlockedMarker",
              "length": 469,
              "selected": true
            },
            {
              "name": "drawCue",
              "length": 2322,
              "selected": true
            },
            {
              "name": "drawBallInHand",
              "length": 680,
              "selected": true
            }
          ]
        }
      ]
    },
    {
      "path": "net",
      "constructor": "tR",
      "ownKeys": [
        "handlers",
        "slot",
        "code",
        "connection",
        "state",
        "latest",
        "view",
        "send",
        "closer",
        "lastShotKey",
        "lastStateKey",
        "opponentWasConnected",
        "opponentEverHere",
        "request",
        "rtt",
        "rttVar"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tR",
          "methods": [
            {
              "name": "cueOfShooter",
              "length": 84,
              "selected": true
            },
            {
              "name": "tableOfViewer",
              "length": 55,
              "selected": true
            },
            {
              "name": "setSend",
              "length": 23,
              "selected": false
            },
            {
              "name": "setCloser",
              "length": 27,
              "selected": false
            },
            {
              "name": "on",
              "length": 72,
              "selected": false
            },
            {
              "name": "emit",
              "length": 83,
              "selected": false
            },
            {
              "name": "setConnection",
              "length": 84,
              "selected": false
            },
            {
              "name": "ingest",
              "length": 1132,
              "selected": true
            },
            {
              "name": "emitShot",
              "length": 470,
              "selected": true
            },
            {
              "name": "syncArrival",
              "length": 158,
              "selected": false
            },
            {
              "name": "syncPresence",
              "length": 426,
              "selected": false
            },
            {
              "name": "receiveAim",
              "length": 248,
              "selected": true
            },
            {
              "name": "command",
              "length": 412,
              "selected": false
            },
            {
              "name": "shoot",
              "length": 115,
              "selected": false
            },
            {
              "name": "sendAim",
              "length": 280,
              "selected": true
            },
            {
              "name": "noteRoundTrip",
              "length": 162,
              "selected": false
            },
            {
              "name": "placeCue",
              "length": 58,
              "selected": true
            },
            {
              "name": "rematch",
              "length": 41,
              "selected": false
            },
            {
              "name": "declineRematch",
              "length": 55,
              "selected": false
            },
            {
              "name": "ready",
              "length": 37,
              "selected": false
            },
            {
              "name": "claimTurnTimeout",
              "length": 59,
              "selected": true
            },
            {
              "name": "rejoin",
              "length": 27,
              "selected": false
            },
            {
              "name": "leave",
              "length": 52,
              "selected": false
            }
          ]
        }
      ]
    },
    {
      "path": "player",
      "constructor": "tI",
      "ownKeys": [
        "tracks",
        "events",
        "eventCursor",
        "time",
        "duration"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tI",
          "methods": [
            {
              "name": "load",
              "length": 1057,
              "selected": true
            },
            {
              "name": "set",
              "length": 850,
              "selected": true
            },
            {
              "name": "clear",
              "length": 86,
              "selected": false
            },
            {
              "name": "advance",
              "length": 369,
              "selected": false
            },
            {
              "name": "sample",
              "length": 618,
              "selected": true
            }
          ]
        }
      ]
    },
    {
      "path": "serverState",
      "constructor": "Object",
      "ownKeys": [
        "matchId",
        "sequence",
        "serverTime",
        "status",
        "phase",
        "turn",
        "players",
        "balls",
        "ballInHand",
        "behindHeadString",
        "cuePlaced",
        "winner",
        "winKind",
        "rackNumber",
        "busyForMs",
        "potted"
      ],
      "prototypeLayers": []
    },
    {
      "path": "prediction",
      "constructor": "Object",
      "ownKeys": [
        "cuePath",
        "ghost",
        "targetId",
        "objectPath",
        "cuePathAfter",
        "objectDir",
        "cueDir",
        "objectPocket",
        "scratchPocket",
        "railsBeforeContact",
        "cutAngle",
        "objectReach",
        "cueReach"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.bih",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "legal",
        "restricted"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.snapshot",
      "constructor": "Object",
      "ownKeys": [
        "version",
        "phase",
        "connection",
        "status",
        "slot",
        "code",
        "turn",
        "players",
        "groups",
        "remaining",
        "onEight",
        "stats",
        "openTable",
        "ballInHand",
        "behindHeadString",
        "canReposition",
        "rackNumber",
        "guideLevel",
        "sound",
        "message",
        "messageKind",
        "messageId",
        "interactive",
        "lastPotted",
        "track",
        "winner",
        "winKind",
        "opponentAway",
        "opponentGone"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.listeners",
      "constructor": "Set",
      "ownKeys": [],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "Set",
          "methods": [
            {
              "name": "has",
              "length": 32,
              "selected": false
            },
            {
              "name": "add",
              "length": 32,
              "selected": false
            },
            {
              "name": "delete",
              "length": 35,
              "selected": false
            },
            {
              "name": "difference",
              "length": 39,
              "selected": false
            },
            {
              "name": "clear",
              "length": 34,
              "selected": false
            },
            {
              "name": "entries",
              "length": 36,
              "selected": false
            },
            {
              "name": "forEach",
              "length": 36,
              "selected": false
            },
            {
              "name": "intersection",
              "length": 41,
              "selected": false
            },
            {
              "name": "isSubsetOf",
              "length": 39,
              "selected": false
            },
            {
              "name": "isSupersetOf",
              "length": 41,
              "selected": false
            },
            {
              "name": "isDisjointFrom",
              "length": 43,
              "selected": false
            },
            {
              "name": "symmetricDifference",
              "length": 48,
              "selected": false
            },
            {
              "name": "union",
              "length": 34,
              "selected": false
            },
            {
              "name": "values",
              "length": 35,
              "selected": false
            },
            {
              "name": "keys",
              "length": 35,
              "selected": false
            }
          ]
        }
      ]
    },
    {
      "path": "engine.dragStart",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[0]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[1]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[2]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[3]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[4]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[5]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[6]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[7]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[8]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[9]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[10]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[11]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[12]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[13]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[14]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[15]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "group",
        "p",
        "v",
        "w",
        "orient",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "renderer.effects",
      "constructor": "tl",
      "ownKeys": [
        "particles",
        "rings",
        "pCursor",
        "rCursor",
        "pocketGlow"
      ],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "tl",
          "methods": [
            {
              "name": "clear",
              "length": 108,
              "selected": true
            },
            {
              "name": "particle",
              "length": 89,
              "selected": false
            },
            {
              "name": "ring",
              "length": 80,
              "selected": false
            },
            {
              "name": "emit",
              "length": 1614,
              "selected": true
            },
            {
              "name": "update",
              "length": 342,
              "selected": true
            },
            {
              "name": "glowFor",
              "length": 44,
              "selected": true
            },
            {
              "name": "drawUnderBalls",
              "length": 347,
              "selected": true
            },
            {
              "name": "draw",
              "length": 495,
              "selected": true
            }
          ]
        }
      ]
    },
    {
      "path": "renderer.ctx",
      "constructor": "CanvasRenderingContext2D",
      "ownKeys": [],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "CanvasRenderingContext2D",
          "methods": [
            {
              "name": "clip",
              "length": 33,
              "selected": false
            },
            {
              "name": "createConicGradient",
              "length": 48,
              "selected": false
            },
            {
              "name": "createImageData",
              "length": 44,
              "selected": false
            },
            {
              "name": "createLinearGradient",
              "length": 49,
              "selected": false
            },
            {
              "name": "createPattern",
              "length": 42,
              "selected": false
            },
            {
              "name": "createRadialGradient",
              "length": 49,
              "selected": false
            },
            {
              "name": "drawFocusIfNeeded",
              "length": 46,
              "selected": true
            },
            {
              "name": "drawImage",
              "length": 38,
              "selected": true
            },
            {
              "name": "fill",
              "length": 33,
              "selected": false
            },
            {
              "name": "fillText",
              "length": 37,
              "selected": false
            },
            {
              "name": "getContextAttributes",
              "length": 49,
              "selected": false
            },
            {
              "name": "getImageData",
              "length": 41,
              "selected": false
            },
            {
              "name": "getLineDash",
              "length": 40,
              "selected": false
            },
            {
              "name": "getTransform",
              "length": 41,
              "selected": false
            },
            {
              "name": "isContextLost",
              "length": 42,
              "selected": false
            },
            {
              "name": "isPointInPath",
              "length": 42,
              "selected": true
            },
            {
              "name": "isPointInStroke",
              "length": 44,
              "selected": true
            },
            {
              "name": "measureText",
              "length": 40,
              "selected": false
            },
            {
              "name": "reset",
              "length": 34,
              "selected": false
            },
            {
              "name": "roundRect",
              "length": 38,
              "selected": false
            },
            {
              "name": "setLineDash",
              "length": 40,
              "selected": false
            },
            {
              "name": "strokeText",
              "length": 39,
              "selected": true
            },
            {
              "name": "arc",
              "length": 32,
              "selected": false
            },
            {
              "name": "arcTo",
              "length": 34,
              "selected": false
            },
            {
              "name": "beginPath",
              "length": 38,
              "selected": true
            },
            {
              "name": "bezierCurveTo",
              "length": 42,
              "selected": false
            },
            {
              "name": "clearRect",
              "length": 38,
              "selected": false
            },
            {
              "name": "closePath",
              "length": 38,
              "selected": true
            },
            {
              "name": "ellipse",
              "length": 36,
              "selected": false
            },
            {
              "name": "fillRect",
              "length": 37,
              "selected": false
            },
            {
              "name": "lineTo",
              "length": 35,
              "selected": false
            },
            {
              "name": "moveTo",
              "length": 35,
              "selected": true
            },
            {
              "name": "putImageData",
              "length": 41,
              "selected": false
            },
            {
              "name": "quadraticCurveTo",
              "length": 45,
              "selected": false
            },
            {
              "name": "rect",
              "length": 33,
              "selected": false
            },
            {
              "name": "resetTransform",
              "length": 43,
              "selected": false
            },
            {
              "name": "restore",
              "length": 36,
              "selected": false
            },
            {
              "name": "rotate",
              "length": 35,
              "selected": true
            },
            {
              "name": "save",
              "length": 33,
              "selected": false
            },
            {
              "name": "scale",
              "length": 34,
              "selected": false
            },
            {
              "name": "setTransform",
              "length": 41,
              "selected": false
            },
            {
              "name": "stroke",
              "length": 35,
              "selected": true
            },
            {
              "name": "strokeRect",
              "length": 39,
              "selected": true
            },
            {
              "name": "transform",
              "length": 38,
              "selected": false
            },
            {
              "name": "translate",
              "length": 38,
              "selected": false
            }
          ]
        }
      ]
    },
    {
      "path": "renderer.sprite",
      "constructor": "Object",
      "ownKeys": [
        "canvas",
        "x",
        "y",
        "w",
        "h"
      ],
      "prototypeLayers": []
    },
    {
      "path": "net.handlers",
      "constructor": "Object",
      "ownKeys": [
        "session",
        "connection",
        "state",
        "started",
        "physics",
        "finished",
        "opponentJoined",
        "opponentLeft",
        "opponentBack",
        "opponentAim",
        "gameStarted",
        "error"
      ],
      "prototypeLayers": []
    },
    {
      "path": "net.view",
      "constructor": "Object",
      "ownKeys": [
        "status",
        "matchId",
        "hosted",
        "sequence",
        "phase",
        "turn",
        "players",
        "balls",
        "potted",
        "ballInHand",
        "behindHeadString",
        "cuePlaced",
        "winner",
        "winKind",
        "tournament",
        "rackNumber",
        "busyForMs",
        "turnRemainingMs",
        "turnTotalMs",
        "warmupRemainingMs",
        "arrived",
        "lastShot",
        "rematch",
        "you",
        "table",
        "wallet",
        "developer"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.players[0]",
      "constructor": "Object",
      "ownKeys": [
        "slot",
        "name",
        "avatar",
        "connected",
        "ready",
        "group",
        "onEight",
        "remaining",
        "stats"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.players[1]",
      "constructor": "Object",
      "ownKeys": [
        "slot",
        "name",
        "avatar",
        "connected",
        "ready",
        "group",
        "onEight",
        "remaining",
        "stats"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[0]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[1]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[2]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[3]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[4]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[5]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[6]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[7]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[8]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[9]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[10]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[11]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[12]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[13]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[14]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "serverState.balls[15]",
      "constructor": "Object",
      "ownKeys": [
        "id",
        "x",
        "y",
        "inPlay",
        "pocket"
      ],
      "prototypeLayers": []
    },
    {
      "path": "prediction.cuePath[0]",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "prediction.cuePath[1]",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "prediction.objectDir",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "prediction.cueDir",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.snapshot.players[0]",
      "constructor": "Object",
      "ownKeys": [
        "name",
        "avatar",
        "kind",
        "connected",
        "ready"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.snapshot.players[1]",
      "constructor": "Object",
      "ownKeys": [
        "name",
        "avatar",
        "kind",
        "connected",
        "ready"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.snapshot.remaining[0]",
      "constructor": "Array",
      "ownKeys": [],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "Array",
          "methods": [
            {
              "name": "at",
              "length": 31,
              "selected": false
            },
            {
              "name": "concat",
              "length": 35,
              "selected": false
            },
            {
              "name": "copyWithin",
              "length": 39,
              "selected": false
            },
            {
              "name": "fill",
              "length": 33,
              "selected": false
            },
            {
              "name": "find",
              "length": 33,
              "selected": false
            },
            {
              "name": "findIndex",
              "length": 38,
              "selected": false
            },
            {
              "name": "findLast",
              "length": 37,
              "selected": false
            },
            {
              "name": "findLastIndex",
              "length": 42,
              "selected": false
            },
            {
              "name": "lastIndexOf",
              "length": 40,
              "selected": false
            },
            {
              "name": "pop",
              "length": 32,
              "selected": false
            },
            {
              "name": "push",
              "length": 33,
              "selected": false
            },
            {
              "name": "reverse",
              "length": 36,
              "selected": false
            },
            {
              "name": "shift",
              "length": 34,
              "selected": false
            },
            {
              "name": "unshift",
              "length": 36,
              "selected": false
            },
            {
              "name": "slice",
              "length": 34,
              "selected": false
            },
            {
              "name": "sort",
              "length": 33,
              "selected": false
            },
            {
              "name": "splice",
              "length": 35,
              "selected": false
            },
            {
              "name": "includes",
              "length": 37,
              "selected": false
            },
            {
              "name": "indexOf",
              "length": 36,
              "selected": false
            },
            {
              "name": "join",
              "length": 33,
              "selected": false
            },
            {
              "name": "keys",
              "length": 33,
              "selected": false
            },
            {
              "name": "entries",
              "length": 36,
              "selected": false
            },
            {
              "name": "values",
              "length": 35,
              "selected": false
            },
            {
              "name": "forEach",
              "length": 36,
              "selected": false
            },
            {
              "name": "filter",
              "length": 35,
              "selected": false
            },
            {
              "name": "flat",
              "length": 33,
              "selected": false
            },
            {
              "name": "flatMap",
              "length": 36,
              "selected": false
            },
            {
              "name": "map",
              "length": 32,
              "selected": false
            },
            {
              "name": "every",
              "length": 34,
              "selected": false
            },
            {
              "name": "some",
              "length": 33,
              "selected": false
            },
            {
              "name": "reduce",
              "length": 35,
              "selected": false
            },
            {
              "name": "reduceRight",
              "length": 40,
              "selected": false
            },
            {
              "name": "toReversed",
              "length": 39,
              "selected": false
            },
            {
              "name": "toSorted",
              "length": 37,
              "selected": false
            },
            {
              "name": "toSpliced",
              "length": 38,
              "selected": false
            },
            {
              "name": "with",
              "length": 33,
              "selected": false
            },
            {
              "name": "toLocaleString",
              "length": 43,
              "selected": false
            },
            {
              "name": "toString",
              "length": 37,
              "selected": false
            }
          ]
        }
      ]
    },
    {
      "path": "engine.snapshot.remaining[1]",
      "constructor": "Array",
      "ownKeys": [],
      "prototypeLayers": [
        {
          "layer": 0,
          "constructor": "Array",
          "methods": [
            {
              "name": "at",
              "length": 31,
              "selected": false
            },
            {
              "name": "concat",
              "length": 35,
              "selected": false
            },
            {
              "name": "copyWithin",
              "length": 39,
              "selected": false
            },
            {
              "name": "fill",
              "length": 33,
              "selected": false
            },
            {
              "name": "find",
              "length": 33,
              "selected": false
            },
            {
              "name": "findIndex",
              "length": 38,
              "selected": false
            },
            {
              "name": "findLast",
              "length": 37,
              "selected": false
            },
            {
              "name": "findLastIndex",
              "length": 42,
              "selected": false
            },
            {
              "name": "lastIndexOf",
              "length": 40,
              "selected": false
            },
            {
              "name": "pop",
              "length": 32,
              "selected": false
            },
            {
              "name": "push",
              "length": 33,
              "selected": false
            },
            {
              "name": "reverse",
              "length": 36,
              "selected": false
            },
            {
              "name": "shift",
              "length": 34,
              "selected": false
            },
            {
              "name": "unshift",
              "length": 36,
              "selected": false
            },
            {
              "name": "slice",
              "length": 34,
              "selected": false
            },
            {
              "name": "sort",
              "length": 33,
              "selected": false
            },
            {
              "name": "splice",
              "length": 35,
              "selected": false
            },
            {
              "name": "includes",
              "length": 37,
              "selected": false
            },
            {
              "name": "indexOf",
              "length": 36,
              "selected": false
            },
            {
              "name": "join",
              "length": 33,
              "selected": false
            },
            {
              "name": "keys",
              "length": 33,
              "selected": false
            },
            {
              "name": "entries",
              "length": 36,
              "selected": false
            },
            {
              "name": "values",
              "length": 35,
              "selected": false
            },
            {
              "name": "forEach",
              "length": 36,
              "selected": false
            },
            {
              "name": "filter",
              "length": 35,
              "selected": false
            },
            {
              "name": "flat",
              "length": 33,
              "selected": false
            },
            {
              "name": "flatMap",
              "length": 36,
              "selected": false
            },
            {
              "name": "map",
              "length": 32,
              "selected": false
            },
            {
              "name": "every",
              "length": 34,
              "selected": false
            },
            {
              "name": "some",
              "length": 33,
              "selected": false
            },
            {
              "name": "reduce",
              "length": 35,
              "selected": false
            },
            {
              "name": "reduceRight",
              "length": 40,
              "selected": false
            },
            {
              "name": "toReversed",
              "length": 39,
              "selected": false
            },
            {
              "name": "toSorted",
              "length": 37,
              "selected": false
            },
            {
              "name": "toSpliced",
              "length": 38,
              "selected": false
            },
            {
              "name": "with",
              "length": 33,
              "selected": false
            },
            {
              "name": "toLocaleString",
              "length": 43,
              "selected": false
            },
            {
              "name": "toString",
              "length": 37,
              "selected": false
            }
          ]
        }
      ]
    },
    {
      "path": "engine.snapshot.stats[0]",
      "constructor": "Object",
      "ownKeys": [
        "shots",
        "potted",
        "fouls",
        "bestRun"
      ],
      "prototypeLayers": []
    },
    {
      "path": "engine.snapshot.stats[1]",
      "constructor": "Object",
      "ownKeys": [
        "shots",
        "potted",
        "fouls",
        "bestRun"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[0].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[0].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[0].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[1].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[1].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[1].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[2].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[2].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[2].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[3].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[3].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[3].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[4].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[4].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[4].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[5].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[5].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[5].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[6].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[6].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[6].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[7].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[7].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[7].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[8].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[8].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[8].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[9].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[9].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[9].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[10].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[10].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[10].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[11].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[11].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[11].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[12].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[12].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[12].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[13].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[13].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[13].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[14].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[14].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[14].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[15].p",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[15].v",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y"
      ],
      "prototypeLayers": []
    },
    {
      "path": "view.balls[15].w",
      "constructor": "Object",
      "ownKeys": [
        "x",
        "y",
        "z"
      ],
      "prototypeLayers": []
    },
    {
      "path": "renderer.effects.particles[0]",
      "constructor": "Object",
      "ownKeys": [
        "active",
        "x",
        "y",
        "vx",
        "vy",
        "life",
        "maxLife",
        "size",
        "drag",
        "r",
        "g",
        "b"
      ],
      "prototypeLayers": []
    },
    {
      "path": "renderer.effects.particles[1]",
      "constructor": "Object",
      "ownKeys": [
        "active",
        "x",
        "y",
        "vx",
        "vy",
        "life",
        "maxLife",
        "size",
        "drag",
        "r",
        "g",
        "b"
      ],
      "prototypeLayers": []
    }
  ],
  "methodSources": [
    {
      "path": "engine",
      "prototype": "tD",
      "name": "buildSnapshot",
      "source": "buildSnapshot(){let e=this.state,t=this.mine,a=+(0===t),i=(t,a)=>{let i=e?.players[t];return{name:i?.name||(\"you\"===a?\"You\":\"Opponent\"),avatar:i?.avatar??null,kind:a,connected:i?.connected??!1,ready:i?.ready??!1}},n=t=>e?.players[t]?.stats??tG;return{version:this.version,phase:this.phase,connection:this.net.connection,status:e?.status??\"waiting\",slot:this.net.slot,code:this.net.code,turn:e?this.rel(e.turn)??0:0,players:[i(t,\"you\"),i(a,\"them\")],groups:[e?.players[t].group??null,e?.players[a].group??null],remaining:[e?.players[t].remaining??[],e?.players[a].remaining??[]],onEight:[e?.players[t].onEight??!1,e?.players[a].onEight??!1],stats:[n(t),n(a)],openTable:!e||\"open\"===e.phase||\"break\"===e.phase,ballInHand:e?.ballInHand??!1,behindHeadString:e?.behindHeadString??!1,canReposition:this.canReposition(),rackNumber:e?.rackNumber??1,guideLevel:this.guideLevel,sound:this.soundOn,message:this.message,messageKind:this.messageKind,messageId:this.messageId,interactive:\"aiming\"===this.phase||\"ballInHand\"===this.phase||\"charging\"===this.phase,lastPotted:this.lastPotted,track:this.track,winner:this.rel(e?.winner??null),winKind:e?.winKind??null,opponentAway:this.opponentAway,opponentGone:this.opponentGone}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "readLive",
      "source": "readLive(){return{power:this.power,spinX:this.spinX,spinY:this.spinY,pullback:this.pullback,angle:this.aimAngle,blockedTarget:this.blockedTarget(),turning:this.turnHold}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "attachNetwork",
      "source": "attachNetwork(){let e=this.net;this.unsubscribe.push(e.on(\"connection\",()=>this.publish()),e.on(\"state\",e=>this.applyState(e)),e.on(\"gameStarted\",()=>{eK.rack(),this.setMessage(\"Break!\",\"info\")}),e.on(\"started\",e=>{e.by===this.net.slot&&this.awaitingOwnShot()||(this.pendingShot=null,this.shotUnsureAt=null,this.remote=null,this.remoteSettled=!1,this.remoteShot=e.shot,this.aimAngle=e.shot.angle,this.spinX=e.shot.spinX,this.spinY=e.shot.spinY,this.power=e.shot.power,this.view.cueBall.p.x=e.cue.x,this.view.cueBall.p.y=e.cue.y,this.view.cueBall.inPlay=!0,this.prediction=null,this.cueAlpha=1,this.phase=\"shooting\",this.shootStart=this.now,this.beginSet(0),this.bih=null,this.publish())}),e.on(\"physics\",(e,t)=>{null!==this.shotSentAt&&0===t&&null===this.shotUnsureAt&&this.noteShotAnswer(performance.now()-this.shotSentAt),this.shotSentAt=null,this.pendingReplay={replay:e.replay,elapsedMs:t},t>0&&this.beginPlayback()}),e.on(\"finished\",e=>{this.pendingOutcome=e.outcome,this.pendingState=e.state,this.lastPotted=e.outcome.pocketed}),e.on(\"opponentJoined\",e=>{this.opponentAway=!1,this.setMessage(`${e.name} joined`,\"info\")}),e.on(\"opponentLeft\",e=>{this.opponentAway=!0,this.opponentGone=e.permanent,this.setMessage(e.permanent?\"Your opponent left the match\":\"Opponent disconnected — waiting\",\"foul\")}),e.on(\"opponentBack\",()=>{this.opponentAway=!1,this.opponentGone=!1,this.setMessage(\"Opponent reconnected\",\"good\")}),e.on(\"opponentAim\",e=>{\"waiting\"===this.phase&&(this.remote=e)}),e.on(\"error\",e=>this.setMessage(e,\"foul\")))}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "applyState",
      "source": "applyState(e){let t=\"playing\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase,a=this.awaitingOwnShot()&&!this.pendingReplay&&null!==this.state&&e.sequence>this.state.sequence;if(t&&!a){this.pendingState=e;return}a&&(this.forgetShot(),this.centreSpin()),this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0,this.enterTurn()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "enterTurn",
      "source": "enterTurn(){this.practice=null;let e=this.state;if(!e){this.phase=\"idle\",this.publish();return}if(\"finished\"===e.status||\"gameOver\"===e.phase){this.phase=\"gameOver\",this.bih=null,this.publish();return}if(\"playing\"!==e.status||null===this.net.slot){this.phase=\"waiting\",this.bih=null,this.publish();return}if(e.turn!==this.net.slot){this.phase=\"waiting\",this.bih=null,this.prediction=null,this.publish();return}if(this.power=this.myPower,this.pullback=0,this.wheelUsed=!1,e.ballInHand&&!e.cuePlaced){let t=this.view.cueBall;this.bih={x:t.inPlay?t.p.x:b,y:t.inPlay?t.p.y:0,legal:!0,restricted:e.behindHeadString},this.bih.legal=this.placementLegal(this.bih.x,this.bih.y),this.phase=\"ballInHand\"}else this.bih=null,this.phase=\"aiming\",this.faceNearestTarget();this.cueAlpha=1,this.predictionDirty=!0,this.remote=null,this.remoteSettled=!1,this.resetAimCache(),this.publish()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "canReposition",
      "source": "canReposition(){let e=this.state;return!!e&&null!==this.net.slot&&e.turn===this.net.slot&&!!e.ballInHand&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"ballInHand\"===this.phase)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "faceNearestTarget",
      "source": "faceNearestTarget(){let e=this.state;if(!e||null===this.net.slot)return;let t=this.view.cueBall,a=-1,i=1/0;for(let n of tX(e,this.net.slot)){let e=this.view.balls[n];if(!e.inPlay)continue;let l=Math.hypot(e.p.x-t.p.x,e.p.y-t.p.y);l<i&&(i=l,a=n)}if(a>=0){let e=this.view.balls[a];this.aimAngle=Math.atan2(e.p.y-t.p.y,e.p.x-t.p.x)}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "resize",
      "source": "resize(e,t,a){this.renderer.resize(e,t,a),this.predictionDirty=!0}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "setGuideLevel",
      "source": "setGuideLevel(e){this.guideLevel=e,\"extended\"!==e&&(this.practice=null),this.predictionDirty=!0,this.publish()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "setPractice",
      "source": "setPractice(e){if(\"extended\"!==this.guideLevel)return;let t=e?.cuePath?.[0],a=this.view.cueBall.p;e&&(!t||Math.hypot(t.x-a.x,t.y-a.y)>1e-6)||(this.practice=e,this.predictionDirty=!0)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "frame",
      "source": "frame(e){let t=Math.min(.05,(e-this.lastTime)/1e3),a=Math.min(50,e-this.lastTime);this.lastTime=e,this.now=e,this.update(t,a),this.broadcastAim(),this.view.spin(t);let i=\"waiting\"===this.phase&&null!==this.remote;this.renderer.render({world:this.view,time:e/1e3,angle:i?this.viewAngle:this.aimAngle,power:i?this.viewPower:this.power,spinX:i?this.viewSpinX:this.spinX,spinY:i?this.viewSpinY:this.spinY,prediction:i?this.watchPrediction:this.prediction,guideLevel:i?this.watchLevel():this.guideLevel,showAim:this.showAim()||i&&null!==this.watchPrediction,showCue:this.showCue(),pullback:i?this.viewPullback:this.pullback,cueAlpha:this.cueAlpha,ballInHand:this.bih,legalTargets:this.highlightTargets(),blockedTarget:this.blockedTarget(),foulFlash:this.foulFlash,aiThinking:!1,cue:this.net.cueOfShooter(),table:this.net.tableOfViewer()})}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "showAim",
      "source": "showAim(){return\"aiming\"===this.phase||\"charging\"===this.phase}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "showCue",
      "source": "showCue(){return\"place\"!==this.dragMode&&null===this.bih&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase||\"waiting\"===this.phase&&null!==this.remote)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "blockedTarget",
      "source": "blockedTarget(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return -1;let e=this.state;if(!e||null===this.net.slot)return -1;let t=this.prediction?.targetId??-1;return t<0||\"break\"===e.phase||tX(e,this.net.slot).includes(t)?-1:t}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "update",
      "source": "update(e,t){switch(this.foulFlash=Math.max(0,this.foulFlash-1.6*e),this.phase){case\"waiting\":this.followOpponent(e);break;case\"aiming\":case\"ballInHand\":{this.cueAlpha=Math.min(1,this.cueAlpha+6*e);let t=this.powerHeld||this.now<this.wheelShowUntil,a=t&&\"aiming\"===this.phase?this.power:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advance(t,this.view)))this.consumeEvent(a);this.player.finished&&this.finishPlayback();break;case\"resolving\":this.now>=this.resolveAt&&this.finishResolve()}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "followOpponent",
      "source": "followOpponent(e){let t=this.remote;if(t){if(this.remoteSettled){let a=Math.min(1,18*e);this.viewAngle+=eB(this.viewAngle,t.angle)*a,this.viewPower+=(t.power-this.viewPower)*a,this.viewPullback+=((t.charging?t.power:0)-this.viewPullback)*Math.min(1,22*e)}else this.remoteSettled=!0,this.viewAngle=t.angle,this.viewPower=t.power,this.viewPullback=t.charging?t.power:0;if(this.viewSpinX=t.spinX,this.viewSpinY=t.spinY,this.cueAlpha=Math.min(1,this.cueAlpha+6*e),this.refreshWatchGuide(t),t.cue){let e=this.view.cueBall;e.p.x=t.cue.x,e.p.y=t.cue.y,e.inPlay=!0,this.bih={x:t.cue.x,y:t.cue.y,legal:!0,restricted:this.state?.behindHeadString??!1}}else this.bih&&(this.bih=null)}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "refreshWatchGuide",
      "source": "refreshWatchGuide(e){if(e.cue||!this.view.cueBall.inPlay){this.watchPrediction=null,this.watchKey=\"\";return}let t=this.view.cueBall.p,a=`${this.viewAngle.toFixed(4)}:${t.x}:${t.y}:${this.watchLevel()}`;a!==this.watchKey&&(this.watchKey=a,this.watchPrediction=eQ(this.view,this.viewAngle,this.watchLevel()))}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "broadcastAim",
      "source": "broadcastAim(){let e=this.state;if(!e||null===this.net.slot||e.turn!==this.net.slot||\"aiming\"!==this.phase&&\"charging\"!==this.phase&&\"ballInHand\"!==this.phase||this.now-this.aimSentAt<50)return;let t=\"place\"===this.dragMode&&this.bih?this.bih:null,a=\"charging\"===this.phase,i=t?t.x:0/0,n=t?t.y:0/0;t$(this.sentAngle,this.aimAngle,.002)&&t$(this.sentPower,this.power,.01)&&t$(this.sentSpinX,this.spinX,.01)&&t$(this.sentSpinY,this.spinY,.01)&&t$(this.sentCueX,i,8e-4)&&t$(this.sentCueY,n,8e-4)&&this.sentCharging===a||(this.aimSentAt=this.now,this.sentAngle=this.aimAngle,this.sentPower=this.power,this.sentSpinX=this.spinX,this.sentSpinY=this.spinY,this.sentCueX=i,this.sentCueY=n,this.sentCharging=a,this.net.sendAim({angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY,cue:t?{x:t.x,y:t.y}:null,charging:a}))}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "resetAimCache",
      "source": "resetAimCache(){this.sentAngle=0/0,this.sentPower=0/0,this.sentSpinX=0/0,this.sentSpinY=0/0,this.sentCueX=0/0,this.sentCueY=0/0,this.sentCharging=!1}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "refreshPrediction",
      "source": "refreshPrediction(){if(this.predictionDirty){if(this.predictionDirty=!1,!this.view.cueBall.inPlay){this.prediction=null;return}this.prediction=\"extended\"===this.guideLevel&&this.practice?this.practice:eQ(this.view,this.aimAngle,this.guideLevel)}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "beginSet",
      "source": "beginSet(e){this.strokeAt=null,this.strokeMs=tE(this.power),this.setFor=e}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "noteShotAnswer",
      "source": "noteShotAnswer(e){let t=this.net.roundTripMs;t<=0||!(e>0)||e>1e4||(this.shotExtra+=(eL(e-t,0,450)-this.shotExtra)/2)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "awaitingOwnShot",
      "source": "awaitingOwnShot(){return null!==this.pendingShot&&(\"shooting\"===this.phase||\"sending\"===this.phase)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "centreSpin",
      "source": "centreSpin(){this.spinX=0,this.spinY=0}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "forgetShot",
      "source": "forgetShot(){this.pendingShot=null,this.shotUnsureAt=null,this.shotSentAt=null}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "abandonShot",
      "source": "abandonShot(){this.forgetShot(),this.centreSpin();let e=this.net.latest;e&&this.state&&e.sequence>this.state.sequence?(this.pendingState=null,this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0):this.setMessage(\"No answer from the table. If your shot does not play, take it again.\",\"foul\"),this.enterTurn()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "beginPlayback",
      "source": "beginPlayback(){let e=this.pendingReplay;e&&(this.pendingReplay=null,this.forgetShot(),this.centreSpin(),this.player.load(e.replay,e.elapsedMs),this.prediction=null,this.bih=null,this.remoteShot=null,this.phase=\"playing\",this.publish())}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "consumeEvent",
      "source": "consumeEvent(e){switch(this.renderer.effects.emit(e,[]),e.type){case\"ballBall\":e.speed>.06&&eK.ballHit(e.speed);break;case\"cushion\":case\"jaw\":e.speed>.12&&eK.cushion(e.speed);break;case\"pocketWall\":e.speed>.2&&eK.cushion(.6*e.speed);break;case\"pocket\":{eK.pocket();let t=v.find(t=>t.id===e.pocket),a=this.view.balls[e.a];this.renderer.notePot(e.a,e.x,e.y,t?t.hole.x:a.p.x,t?t.hole.y:a.p.y,this.now/1e3),a.inPlay=!1,0===e.a||this.track.includes(e.a)||(this.track=[...this.track,e.a],this.publish())}}}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "finishPlayback",
      "source": "finishPlayback(){this.player.clear();let e=this.pendingOutcome;e&&(this.pendingOutcome=null,e.foul?(this.foulFlash=1,eK.foul(),this.setMessage(e.message,\"foul\")):e.message&&this.setMessage(e.message,e.messageKind),e.gameOver&&(e.winner===this.net.slot?eK.win():eK.lose()),e.stalemate&&eK.rack(),this.resolveAt=this.now+(e.foul||e.gameOver?1e3:620),this.phase=\"resolving\",this.publish())}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "finishResolve",
      "source": "finishResolve(){let e=this.pendingState;this.pendingState=null,e&&(this.state=e,this.view.apply(e.balls),this.track=tW(e)),this.enterTurn()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "setPower",
      "source": "setPower(e){this.power=eL(e,0,1),this.myPower=this.power,this.predictionDirty=!0,\"aiming\"===this.phase&&(this.pullback=this.power)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "holdPower",
      "source": "holdPower(e){this.powerHeld=e}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "commitPower",
      "source": "commitPower(e){this.powerHeld=!1,this.setPower(e),this.shoot()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "setSpin",
      "source": "setSpin(e,t){let a=Math.hypot(e,t);a>1&&(e/=a,t/=a),this.spinX=e,this.spinY=t,this.predictionDirty=!0,this.publish()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "nudgeAim",
      "source": "nudgeAim(e){\"aiming\"===this.phase&&(this.aimAngle+=e,this.predictionDirty=!0)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "wheelAim",
      "source": "wheelAim(e){this.nudgeAim(3e-4*e*tB(this.sensitivity))}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "holdFineAim",
      "source": "holdFineAim(e,t,a=!1){if(0===e){this.turnHoldBy===t&&this.releaseFineAim();return}(this.turnHold!==e||this.turnHoldBy!==t)&&this.nudgeAim(.0035*e*(a?.1:1)),this.turnHold=e,this.turnHoldBy=t,this.turnHoldAt=performance.now()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "releaseFineAim",
      "source": "releaseFineAim(){this.turnHold=0,this.turnHoldBy=null}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "shoot",
      "source": "shoot(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase||null===this.state)return;if(this.power<.03){this.phase=\"aiming\";return}let e={angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY};this.myPower=e.power,this.pendingShot=e,this.pendingOutcome=null,this.pendingReplay=null,this.lastPotted=[],this.phase=\"shooting\",this.shootStart=this.now,this.shotSentAt=performance.now(),this.beginSet(this.setLead(tE(e.power))),this.publish();let t=this.state.sequence;this.net.shoot(e,t).then(t=>{if(tq(t)&&this.pendingShot===e&&this.awaitingOwnShot()&&!this.pendingReplay){if(tq(t)&&!0===t.undelivered){this.shotUnsureAt=this.now,this.setMessage(t.message,\"info\");return}this.forgetShot(),this.pendingReplay=null,this.setMessage(t.message,\"foul\"),\"out-of-order\"===t.code||\"internal\"===t.code?this.net.rejoin():this.enterTurn()}})}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "placeCueBall",
      "source": "async placeCueBall(e,t){if(!this.bih||!this.state||\"ballInHand\"!==this.phase&&!this.canReposition()||!this.placementLegal(e,t))return!1;let a=await this.net.placeCue(e,t,this.state.sequence);return tq(a)?(this.setMessage(a.message,\"foul\"),this.enterTurn(),!1):(eK.uiTap(),!0)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "placementLegal",
      "source": "placementLegal(e,t){return!(!S(e,t,.028575,this.view.balls.filter(e=>0!==e.id))||this.state?.behindHeadString&&e>b)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "overTable",
      "source": "overTable(e){return Math.abs(e.x)<r+.14&&Math.abs(e.y)<o+.14}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "overCue",
      "source": "overCue(e){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return!1;let t=this.view.cueBall;if(!t.inPlay)return!1;let a=-Math.cos(this.aimAngle),i=-Math.sin(this.aimAngle),n=e.x-t.p.x,l=e.y-t.p.y,r=n*a+l*i;return!(r<.017145)&&!(r>.58)&&.075>Math.abs(-(n*i)+l*a)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "overCueBall",
      "source": "overCueBall(e){let t=this.view.cueBall;return!!t.inPlay&&.051435>Math.hypot(e.x-t.p.x,e.y-t.p.y)}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "beginPlacing",
      "source": "beginPlacing(e,t){this.pointerId=e.pointerId,this.dragMode=\"place\",this.canvasEl.setPointerCapture(e.pointerId),this.updateBallInHand(t),e.preventDefault()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "beginStroke",
      "source": "beginStroke(e,t){this.dragMode=\"cue\",this.dragStart=t,this.phase=\"charging\",this.powerBeforeStroke=this.power,this.strokeMouse=\"mouse\"===e.pointerType,this.strokeBase=this.strokeMouse&&this.wheelUsed?this.power:0,this.strokeTravelPx=0,this.power=this.strokeBase,this.publish(),e.preventDefault()}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "turnAim",
      "source": "turnAim(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.turnLast,n)*tB(this.sensitivity)*(this.fineAim?.12:1),this.turnLast=n,this.predictionDirty=!0}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "followFinger",
      "source": "followFinger(e){if(tB(this.sensitivity)>=1)return void this.aimAt(e);let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.fingerLast,n)*tB(this.sensitivity),this.fingerLast=n,this.predictionDirty=!0}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "aimAt",
      "source": "aimAt(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.fineAim?this.aimAngle+=.12*eB(this.aimAngle,n):this.aimAngle=n,this.predictionDirty=!0}"
    },
    {
      "path": "engine",
      "prototype": "tD",
      "name": "updateBallInHand",
      "source": "updateBallInHand(e){let t=this.view.balls.filter(e=>0!==e.id),a=function(e,t,a=[]){let i=Math.min(Math.max(e,-r+.028575),r-.028575),n=Math.min(Math.max(t,-o+.028575),o-.028575);for(let e=0;e<12;e++){let e=!1;for(let t of a){if(!t.inPlay)continue;let a=i-t.p.x,l=n-t.p.y,r=Math.hypot(a,l);if(r<.05725){let o=r>1e-6?1/r:0,s=r>1e-6?a*o:1,c=r>1e-6?l*o:0;i=t.p.x+.05725*s,n=t.p.y+.05725*c,e=!0}}for(let t of v){let a=i-t.x,l=n-t.y,r=Math.hypot(a,l),o=t.captureRadius+.0142875;if(r<o){let s=r>1e-6?1/r:0,c=r>1e-6?a*s:-t.dirX,d=r>1e-6?l*s:-t.dirY;i=t.x+c*o,n=t.y+d*o,e=!0}}if(i=Math.min(Math.max(i,-r+.028575),r-.028575),n=Math.min(Math.max(n,-o+.028575),o-.028575),!e)break}if(S(i,n,.028575,a))return{x:i,y:n};for(let i=1;i<=26;i++){let n=.028575*i*.85,l=Math.min(48,6+3*i);for(let r=0;r<l;r++){let o=r/l*Math.PI*2+.7*i,s=e+Math.cos(o)*n,c=t+Math.sin(o)*n;if(S(s,c,.028575,a))return{x:s,y:c}}}return{x:i,y:n}}(e.x,e.y,t),i=this.placementLegal(e.x,e.y);this.bih={x:i?e.x:a.x,y:i?e.y:a.y,legal:this.placementLegal(i?e.x:a.x,i?e.y:a.y),restricted:this.state?.behindHeadString??!1}}"
    },
    {
      "path": "view",
      "prototype": "tL",
      "name": "apply",
      "source": "apply(e){for(let t of e){let e=this.balls[t.id];e&&(e.p.x=t.x,e.p.y=t.y,e.v.x=0,e.v.y=0,e.w.x=0,e.w.y=0,e.w.z=0,e.inPlay=t.inPlay,e.pocket=t.pocket)}}"
    },
    {
      "path": "view",
      "prototype": "tL",
      "name": "spin",
      "source": "spin(e){if(!(e<=0))for(let t of(this.orthoCounter++,this.balls)){if(!t.inPlay)continue;let{x:a,y:i,z:n}=t.w;(0!==a||0!==i||0!==n)&&(!function(e,t,a,i,n){let l=Math.hypot(t,a,i)*n;if(l<1e-9)return;let r=1/(l/n),o=t*r,s=a*r,c=i*r,d=Math.cos(l),h=Math.sin(l),u=1-d,f=u*o*o+d,g=u*o*s-h*c,b=u*o*c+h*s,p=u*o*s+h*c,m=u*s*s+d,w=u*s*c-h*o,y=u*o*c-h*s,x=u*s*c+h*o,k=u*c*c+d,v=e[0],M=e[1],S=e[2],P=e[3],j=e[4],T=e[5],C=e[6],A=e[7],N=e[8];e[0]=f*v+g*P+b*C,e[1]=f*M+g*j+b*A,e[2]=f*S+g*T+b*N,e[3]=p*v+m*P+w*C,e[4]=p*M+m*j+w*A,e[5]=p*S+m*T+w*N,e[6]=y*v+x*P+k*C,e[7]=y*M+x*j+k*A,e[8]=y*S+x*T+k*N}(t.orient,a,i,n,e),(this.orthoCounter+t.id)%60==0&&function(e){let t=e[0],a=e[1],i=e[2],n=Math.hypot(t,a,i)||1;t/=n,a/=n,i/=n;let l=e[3],r=e[4],o=e[5],s=t*l+a*r+i*o;l-=s*t,r-=s*a,o-=s*i,n=Math.hypot(l,r,o)||1,l/=n,r/=n,o/=n,e[0]=t,e[1]=a,e[2]=i,e[3]=l,e[4]=r,e[5]=o,e[6]=a*o-i*r,e[7]=i*l-t*o,e[8]=t*r-a*l}(t.orient))}}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "ballSkin",
      "source": "ballSkin(){return{skin:this.theme?.balls??null,mark:this.theme?.mark??null,pxPerMetre:this.scale*this.dpr}}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "render",
      "source": "render(e){let t=this.ctx,a=e.time,i=this.lastFrame?Math.min(.05,a-this.lastFrame):0;for(let n of(this.lastFrame=a,this.effects.update(i),this.drops=this.drops.filter(e=>a-e.t0<.44),this.syncTheme(e.table),t.setTransform(this.dpr,0,0,this.dpr,0,0),t.clearRect(0,0,this.cssW,this.cssH),t.save(),t.translate(this.originX,this.originY),this.rotated&&t.rotate(-Math.PI/2),t.scale(this.scale,this.scale),t.lineJoin=\"round\",t.lineCap=\"round\",this.sprite&&t.drawImage(this.sprite.canvas,this.sprite.x,this.sprite.y,this.sprite.w,this.sprite.h),this.effects.drawUnderBalls(t),e.ballInHand?.restricted&&this.drawKitchen(t,a),e.world.balls))n.inPlay&&ta(t,n.p.x,n.p.y,.028575);for(let a of(e.showAim&&e.prediction&&this.drawGuides(t,e),this.drawMotionTrails(t,e.world),e.world.balls)){if(!a.inPlay||0===a.id&&e.ballInHand)continue;let i=e.legalTargets.includes(a.id);ti(t,a,{dim:e.legalTargets.length&&!i&&0!==a.id?.24:0,...this.ballSkin()})}this.drawDrops(t,e.world,a),e.showAim&&e.blockedTarget>=0&&this.drawBlockedMarker(t,e.world.balls[e.blockedTarget],a),e.showCue&&e.cueAlpha>.01&&this.drawCue(t,e),this.effects.draw(t),e.ballInHand&&this.drawBallInHand(t,e,a),e.foulFlash>0&&(t.fillStyle=`rgba(255, 70, 70, ${.09*e.foulFlash})`,t.fillRect(-r,-o,2*r,2*o)),t.restore()}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawKitchen",
      "source": "drawKitchen(e,t){e.save(),e.fillStyle=\"rgba(120, 220, 190, 0.07)\",e.fillRect(-r,-o,b+r,2*o),e.strokeStyle=\"rgba(160, 240, 210, 0.55)\",e.lineWidth=.0035,e.setLineDash([.02,.016]),e.lineDashOffset=-(.08*t),e.beginPath(),e.moveTo(b,-o),e.lineTo(b,o),e.stroke(),e.restore()}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawMotionTrails",
      "source": "drawMotionTrails(e,t){for(let a of(e.save(),t.balls)){if(!a.inPlay)continue;let t=Math.hypot(a.v.x,a.v.y);if(t<.8)continue;let i=Math.min(1,(t-.8)/4),n=Math.min(.09,.019*t),l=a.v.x/t,r=a.v.y/t,o=_[a.id]??_[0],s=e.createLinearGradient(a.p.x,a.p.y,a.p.x-l*n,a.p.y-r*n);s.addColorStop(0,tT(o.color,.3*i)),s.addColorStop(1,tT(o.color,0)),e.fillStyle=s,e.beginPath(),e.moveTo(a.p.x-.028575*r*.92,a.p.y+.028575*l*.92),e.lineTo(a.p.x+.028575*r*.92,a.p.y-.028575*l*.92),e.lineTo(a.p.x-l*n,a.p.y-r*n),e.closePath(),e.fill()}e.restore()}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawDrops",
      "source": "drawDrops(e,t,a){for(let i of this.drops){let n=eL((a-i.t0)/.44,0,1),l=t.balls[i.id];if(!l)continue;let r=n*n,o=i.from.x+(i.to.x-i.from.x)*Math.min(1,1.7*n),s=i.from.y+(i.to.y-i.from.y)*Math.min(1,1.7*n),c={x:l.p.x,y:l.p.y};l.p.x=o,l.p.y=s,e.save();let d=v.reduce((e,t)=>Math.hypot(t.x-i.to.x,t.y-i.to.y)<Math.hypot(e.x-i.to.x,e.y-i.to.y)?t:e);e.beginPath(),e.arc(d.hole.x,d.hole.y,1.02*d.hole.r,0,eI),e.clip(),ti(e,l,{alpha:1-.85*r,scale:1-.42*r,dim:.5*r,...this.ballSkin()}),e.restore(),l.p.x=c.x,l.p.y=c.y}}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawGuides",
      "source": "drawGuides(e,t){let a,i=t.prediction;if(i.cuePath.length<2)return;let n=1/this.scale,l=1.15*n,r=t.blockedTarget>=0,o=r?null:(a=t.cue)&&tv[a]||null,s=o?.core??D.line;if(e.save(),e.lineCap=\"butt\",tS(e,i.cuePath,\"rgba(0,0,0,0.28)\",2.2*l),o){for(let[t,a]of(e.lineCap=\"round\",o.glow))tS(e,i.cuePath,t,n*a);e.lineCap=\"butt\"}tS(e,i.cuePath,r?D.blocked:s,l),o?.line?.(e,i.cuePath,l,t.time);let c=i.cuePath.length-1;for(let t=1;t<c;t++){let a=i.cuePath[t];e.beginPath(),e.arc(a.x,a.y,1.6*l,0,eI),e.fillStyle=s,e.fill()}if(!i.ghost||r)return void e.restore();if(o?.ghost?.(e,i.ghost,l,t.time),e.beginPath(),e.arc(i.ghost.x,i.ghost.y,.028575-.5*l,0,eI),e.strokeStyle=\"rgba(0,0,0,0.30)\",e.lineWidth=2.4*l,e.stroke(),e.strokeStyle=o?.core??D.ghost,e.lineWidth=1.1*l,e.stroke(),\"extended\"===t.guideLevel){if(i.objectPath.length>=2){let t=i.objectPocket?\"rgba(150, 255, 200, 0.95)\":D.objectPractice;tS(e,i.objectPath,\"rgba(0,0,0,0.26)\",2.2*l),tS(e,i.objectPath,t,l)}if(i.cuePathAfter.length>=2){let t=!!i.scratchPocket;tS(e,i.cuePathAfter,\"rgba(0,0,0,0.22)\",2*l),tS(e,i.cuePathAfter,t?D.danger:D.cueAfter,l);let a=i.cuePathAfter[i.cuePathAfter.length-1];e.beginPath(),e.arc(a.x,a.y,.0120015,0,eI),e.strokeStyle=t?D.danger:D.cueAfter,e.lineWidth=.9*l,e.stroke()}}else{let a=i.targetId>=0?t.world.balls[i.targetId]:null;if(i.objectDir&&a){let t={x:a.p.x,y:a.p.y},r=Math.min(.165,i.objectReach??1/0),s={x:t.x+i.objectDir.x*r,y:t.y+i.objectDir.y*r};if(tS(e,[t,s],\"rgba(0,0,0,0.26)\",2.2*l),o)for(let[a,i]of o.glow)tS(e,[t,s],a,n*i*.7);tS(e,[t,s],o?.object??D.object,l)}if(i.cueDir){let t=Math.min(.052,i.cueReach??1/0),a={x:i.ghost.x+i.cueDir.x*t,y:i.ghost.y+i.cueDir.y*t};tS(e,[i.ghost,a],\"rgba(0,0,0,0.22)\",2*l),tS(e,[i.ghost,a],o?.cueAfter??D.cueAfter,l)}}if(e.restore(),i.scratchPocket){let a=v.find(e=>e.id===i.scratchPocket);if(a){let i=.55+.45*Math.sin(6*t.time);e.beginPath(),e.arc(a.hole.x,a.hole.y,1.18*a.hole.r,0,eI),e.strokeStyle=`rgba(255, 86, 86, ${.35+.35*i})`,e.lineWidth=2*l,e.stroke()}}}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawBlockedMarker",
      "source": "drawBlockedMarker(e,t,a){if(!t||!t.inPlay)return;let i=.0245745*(.95+.05*Math.sin(5.5*a)),n=.24*i,l=(i-.5*n)*Math.SQRT1_2;for(let[a,r]of(e.save(),e.translate(t.p.x,t.p.y),e.beginPath(),e.arc(0,0,.028575,0,eI),e.fillStyle=\"rgba(120, 12, 14, 0.30)\",e.fill(),e.lineCap=\"butt\",[[\"rgba(0,0,0,0.5)\",n+.05*.028575],[D.blockedSolid,n]]))e.strokeStyle=a,e.lineWidth=r,e.beginPath(),e.arc(0,0,i,0,eI),e.stroke(),e.beginPath(),e.moveTo(-l,-l),e.lineTo(l,l),e.stroke();e.restore()}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawCue",
      "source": "drawCue(e,t){let a=t.world.balls[0];if(!a.inPlay)return;let i=Math.cos(t.angle),n=Math.sin(t.angle),l=.46*t.spinX*.028575,r=.46*t.spinY*.028575,o=.016+.19*t.pullback,s=a.p.x-i*(.028575+o)+-n*l,c=a.p.y-n*(.028575+o)+i*l,d=-(.35*r);e.save(),e.globalAlpha=t.cueAlpha,e.translate(s+i*d,c+n*d),e.rotate(t.angle);let h=function(e){if(!e||!ec(e))return null;let t=tu.get(e);return t||tp(e),t??null}(t.cue);if(h){let a=1/h.art.pxPerMetre,i=-h.art.tipX*a,n=-h.art.axisY*a,l=h.art.width*a,r=h.art.height*a;e.save(),e.translate(.012,.016),e.globalAlpha*=.38,e.drawImage(h.shadow,i,n,l,r),e.restore(),e.drawImage(h.sprite,i,n,l,r);let o=h.art.glow;h.glow&&o&&(e.save(),e.globalCompositeOperation=\"lighter\",e.globalAlpha*=.78+.22*Math.sin(2.2*t.time),e.drawImage(h.glow,-o.tipX*a,-o.axisY*a,o.width*a,o.height*a),e.restore()),e.restore();return}e.save(),e.translate(.012,.016),e.globalAlpha*=.38,tP(e,$.length,$.tipRadius,$.buttRadius,\"rgba(0,0,0,0.9)\"),e.restore();let u=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);u.addColorStop(0,$.shaftLight),u.addColorStop(.42,$.shaft),u.addColorStop(1,\"#8b6534\"),tP(e,$.length,$.tipRadius,$.buttRadius,u),e.save(),e.beginPath(),e.rect(-$.length,-(1.2*$.buttRadius),.46*$.length,2.4*$.buttRadius),e.clip();let f=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);f.addColorStop(0,$.buttLight),f.addColorStop(.45,$.butt),f.addColorStop(1,\"#1a0f08\"),tP(e,$.length,$.tipRadius,$.buttRadius,f),e.restore();let g=-(.46*$.length),b=-(.3*$.length);e.save(),e.beginPath(),e.rect(g,-(1.2*$.buttRadius),b-g,2.4*$.buttRadius),e.clip(),tP(e,$.length,$.tipRadius,$.buttRadius,$.wrap),e.strokeStyle=\"rgba(255,255,255,0.08)\",e.lineWidth=8e-4;for(let t=g;t<b;t+=.004)e.beginPath(),e.moveTo(t,-$.buttRadius),e.lineTo(t+.0025,$.buttRadius),e.stroke();e.restore(),tj(e,-(.47*$.length),.012,$,$.collar),tj(e,-(.462*$.length),.002,$,$.ring),tj(e,-(.295*$.length),.0035,$,$.ring),tj(e,-.028,.028,$,$.ferrule),e.beginPath(),e.moveTo(0,-$.tipRadius),e.lineTo(-.006,-$.tipRadius),e.lineTo(-.006,$.tipRadius),e.lineTo(0,$.tipRadius),e.quadraticCurveTo(.0022,0,0,-$.tipRadius),e.closePath(),e.fillStyle=$.tip,e.fill(),e.globalAlpha*=.5,e.beginPath(),e.moveTo(-.03,-(.45*$.tipRadius)),e.lineTo(-(.5*$.length),-(.5*$.buttRadius)),e.strokeStyle=\"rgba(255,240,214,0.55)\",e.lineWidth=.0016,e.stroke(),e.restore()}"
    },
    {
      "path": "renderer",
      "prototype": "tM",
      "name": "drawBallInHand",
      "source": "drawBallInHand(e,t,a){let i=t.ballInHand,n=t.world.balls[0],l={x:n.p.x,y:n.p.y};n.p.x=i.x,n.p.y=i.y,e.save(),e.globalAlpha=i.legal?.92:.5,ta(e,i.x,i.y,.028575,.6),ti(e,n,{alpha:i.legal?.95:.6,...this.ballSkin()}),e.restore();let r=.6+.4*Math.sin(5.2*a);e.beginPath(),e.arc(i.x,i.y,.028575+.008+.002*r,0,eI),e.strokeStyle=i.legal?`rgba(120, 240, 190, ${.55+.35*r})`:`rgba(255, 96, 96, ${.6+.3*r})`,e.lineWidth=.0032,e.stroke(),i.legal||(e.beginPath(),e.moveTo(i.x-.0142875,i.y-.0142875),e.lineTo(i.x+.0142875,i.y+.0142875),e.moveTo(i.x+.0142875,i.y-.0142875),e.lineTo(i.x-.0142875,i.y+.0142875),e.strokeStyle=\"rgba(255,96,96,0.9)\",e.lineWidth=.0032,e.stroke()),n.p.x=l.x,n.p.y=l.y}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "cueOfShooter",
      "source": "cueOfShooter(){let e=this.view;return e?e.players[e.turn]?.cue??\"classic\":\"classic\"}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "tableOfViewer",
      "source": "tableOfViewer(){return this.view?.table?.id??\"classic\"}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "ingest",
      "source": "ingest(e,t){var a,i;let n,l;if(!tC(e)){this.view=null;return}let r=this.view;this.view=e,this.slot=e.you;let o=(a=t.connected,{matchId:e.matchId??\"\",sequence:e.sequence,serverTime:0,status:tA[e.status],phase:e.phase,turn:e.turn,players:[tN(e.players[0],a),tN(e.players[1],a)],balls:e.balls.map(e=>({id:e.id,x:e.x,y:e.y,inPlay:e.inPlay,pocket:e.pocket})),ballInHand:e.ballInHand,behindHeadString:e.behindHeadString,cuePlaced:e.cuePlaced,winner:e.winner,winKind:e.winKind,rackNumber:e.rackNumber,busyForMs:e.busyForMs,potted:(n=(i=e).balls.filter(e=>0!==e.id&&!e.inPlay).map(e=>e.id),[...l=(i.potted??[]).filter(e=>n.includes(e)),...n.filter(e=>!l.includes(e)).sort((e,t)=>e-t)])});this.latest=o;let s=JSON.stringify({...o,busyForMs:0,serverTime:0}),c=null===r;this.syncPresence(e,t),this.syncArrival(e,r),c||\"active\"===r.status||\"active\"!==e.status||this.emit(\"gameStarted\",{state:o});let d=e.lastShot,h=d?`${d.at}:${d.by}`:\"\";d&&h!==this.lastShotKey?(this.lastShotKey=h,!(c&&e.busyForMs<=0)&&(this.emitShot(e,d,o),c||(this.lastStateKey=s))):d||(this.lastShotKey=\"\"),s!==this.lastStateKey&&(this.lastStateKey=s,this.emit(\"state\",o))}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "emitShot",
      "source": "emitShot(e,t,a){var i;let n;this.emit(\"started\",{sequence:e.sequence,by:t.by,shot:t.shot,cue:t.cue,startedAt:t.at,durationMs:t.durationMs}),this.emit(\"physics\",{sequence:e.sequence,replay:function(e){let t=atob(e),a=new Uint8Array(t.length);for(let e=0;e<t.length;e++)a[e]=t.charCodeAt(e);return a.buffer}(t.replay),durationMs:t.durationMs},(i=e.busyForMs,(n=t.durationMs+(t.pauseMs??0)-i)>400?n:0)),this.emit(\"finished\",{sequence:e.sequence,outcome:t.outcome,state:a})}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "receiveAim",
      "source": "receiveAim(e){e&&\"number\"==typeof e.angle&&(this.view?.you===null||this.view?.you===void 0||e.by!==this.view.you)&&this.emit(\"opponentAim\",{angle:e.angle,power:e.power??0,spinX:e.spinX??0,spinY:e.spinY??0,cue:e.cue??null,charging:!0===e.charging})}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "sendAim",
      "source": "sendAim(e){let t=this.view;if(t&&null!==t.you&&t.turn!==t.you)return;let a=performance.now();this.send(\"aim\",{angle:e.angle,power:e.power,spinX:e.spinX,spinY:e.spinY,cue:e.cue??null,charging:!0===e.charging}).then(e=>{e.ok&&this.noteRoundTrip(performance.now()-a)}).catch(()=>{})}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "placeCue",
      "source": "placeCue(e,t,a){return this.command(\"placeCue\",{x:e,y:t})}"
    },
    {
      "path": "net",
      "prototype": "tR",
      "name": "claimTurnTimeout",
      "source": "claimTurnTimeout(){return this.command(\"claimTurnTimeout\")}"
    },
    {
      "path": "player",
      "prototype": "tI",
      "name": "load",
      "source": "load(e,t){this.set(function(e){let t=new DataView(e),a=0,i=t.getUint16(a,!0);a+=2;let n=t.getUint16(a,!0);a+=2;let l=t.getUint16(a,!0);a+=4;let r=[];for(let e=0;e<i;e++){let e=t.getUint16(a,!0);a+=2;let i=t.getUint16(a,!0);a+=2;let n={t:e,mask:0,x:new Float64Array(16),y:new Float64Array(16),wx:new Float64Array(16),wy:new Float64Array(16),wz:new Float64Array(16)};n.mask=i;for(let e=0;e<16;e++)(i&1<<e)!=0&&(n.x[e]=t.getInt16(a,!0)/2e4,a+=2,n.y[e]=t.getInt16(a,!0)/2e4,a+=2,n.wx[e]=t.getInt16(a,!0)/40,a+=2,n.wy[e]=t.getInt16(a,!0)/40,a+=2,n.wz[e]=t.getInt16(a,!0)/40,a+=2);r.push(n)}let o=[];for(let e=0;e<l;e++){let e=t_[t.getUint8(a)]??\"ballBall\";a+=1;let i=t.getUint16(a,!0);a+=2;let n=t.getUint8(a);a+=1;let l=t.getUint8(a);a+=1;let r=t.getUint8(a);a+=1;let s=t.getUint16(a,!0)/500;a+=2;let c=t.getInt16(a,!0)/2e4;a+=2;let d=t.getInt16(a,!0)/2e4;a+=2;let h=t.getInt8(a)/127;a+=1;let u=t.getInt8(a)/127;a+=1,o.push({type:e,t:i,a:n,b:255===l?-1:l,pocket:255===r?null:tz[r]??null,speed:s,x:c,y:d,nx:h,ny:u})}return{durationMs:n,frames:r,events:o}}(e),t)}"
    },
    {
      "path": "player",
      "prototype": "tI",
      "name": "set",
      "source": "set(e,t){this.tracks=[];for(let t=0;t<16;t++){let a=0;for(let i of e.frames)i.mask&1<<t&&a++;let i={n:0,t:new Float64Array(a),x:new Float64Array(a),y:new Float64Array(a),wx:new Float64Array(a),wy:new Float64Array(a),wz:new Float64Array(a),cursor:0,end:0,present:a>0,pocketAt:1/0};this.tracks.push(i)}for(let t of e.frames)for(let e=0;e<16;e++){if((t.mask&1<<e)==0)continue;let a=this.tracks[e],i=a.n++;a.t[i]=t.t,a.x[i]=t.x[e],a.y[i]=t.y[e],a.wx[i]=t.wx[e],a.wy[i]=t.wy[e],a.wz[i]=t.wz[e]}for(let e of this.tracks)e.end=e.n>0?e.t[e.n-1]:0;for(let t of e.events){if(\"pocket\"!==t.type)continue;let e=this.tracks[t.a];e&&(e.pocketAt=Math.min(e.pocketAt,t.t))}for(this.events=e.events,this.duration=e.durationMs,this.time=Math.max(0,t),this.eventCursor=0;this.eventCursor<this.events.length&&this.events[this.eventCursor].t<this.time;)this.eventCursor++}"
    },
    {
      "path": "player",
      "prototype": "tI",
      "name": "sample",
      "source": "sample(e,t,a){let i=t.balls[a],n=this.time;if(n>=e.pocketAt&&(i.inPlay=!1),n<=e.t[0]){i.p.x=e.x[0],i.p.y=e.y[0],i.w.x=e.wx[0],i.w.y=e.wy[0],i.w.z=e.wz[0],i.v.x=0,i.v.y=0;return}if(n>=e.end){let t=e.n-1;i.p.x=e.x[t],i.p.y=e.y[t],i.w.x=0,i.w.y=0,i.w.z=0,i.v.x=0,i.v.y=0;return}let l=e.cursor;for((l>=e.n-1||e.t[l]>n)&&(l=0);l<e.n-2&&e.t[l+1]<=n;)l++;e.cursor=l;let r=e.t[l+1]-e.t[l],o=r>0?(n-e.t[l])/r:0,s=e.x[l+1]-e.x[l],c=e.y[l+1]-e.y[l];i.p.x=e.x[l]+s*o,i.p.y=e.y[l]+c*o;let d=r>0?1e3/r:0;i.v.x=s*d,i.v.y=c*d,i.w.x=e.wx[l]+(e.wx[l+1]-e.wx[l])*o,i.w.y=e.wy[l]+(e.wy[l+1]-e.wy[l])*o,i.w.z=e.wz[l]+(e.wz[l+1]-e.wz[l])*o}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "clear",
      "source": "clear(){for(let e of this.particles)e.active=!1;for(let e of this.rings)e.active=!1;this.pocketGlow.clear()}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "emit",
      "source": "emit(e,t){switch(e.type){case\"ballBall\":{let t=Math.min(14,3+Math.round(3*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=(Math.random()-.5)*2.4,i=-e.ny,n=e.nx,l=.12+.42*Math.random()*Math.min(2.2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=(i*Math.cos(a)+e.nx*Math.sin(a)*.35)*l,t.vy=(n*Math.cos(a)+e.ny*Math.sin(a)*.35)*l,t.life=t.maxLife=.16+.2*Math.random(),t.size=.0012+.0016*Math.random(),t.drag=7,t.r=226,t.g=240,t.b=236}if(e.speed>1.4){let t=this.ring();t.active=!0,t.x=e.x,t.y=e.y,t.from=.0085725,t.to=.028575*(1.1+Math.min(1.2,.25*e.speed)),t.life=t.maxLife=.17,t.width=.0016,t.color=\"rgba(255,255,255,0.5)\"}break}case\"cushion\":case\"jaw\":{let t=Math.min(10,2+Math.round(2.2*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=Math.atan2(e.ny,e.nx)+(Math.random()-.5)*2,i=.1+.36*Math.random()*Math.min(2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=Math.cos(a)*i,t.vy=Math.sin(a)*i,t.life=t.maxLife=.13+.16*Math.random(),t.size=.0011+.0013*Math.random(),t.drag=9,t.r=190,t.g=226,t.b=212}break}case\"pocket\":{let t,a=v.find(t=>t.id===e.pocket);if(!a)break;this.pocketGlow.set(a.id,.5);let[i,n,l]=[(t=parseInt((_[e.a]??_[0]).color.slice(1),16))>>16&255,t>>8&255,255&t];for(let e=0;e<16;e++){let e=this.particle(),t=Math.random()*eI,r=.06+.3*Math.random();e.active=!0,e.x=a.x-.012*a.dirX,e.y=a.y-.012*a.dirY,e.vx=Math.cos(t)*r-.1*a.dirX,e.vy=Math.sin(t)*r-.1*a.dirY,e.life=e.maxLife=.28+.3*Math.random(),e.size=.0013+.0019*Math.random(),e.drag=5,e.r=i,e.g=n,e.b=l}let r=this.ring();r.active=!0,r.x=a.hole.x,r.y=a.hole.y,r.from=.6*a.hole.r,r.to=2.1*a.hole.r,r.life=r.maxLife=.46,r.width=.0035,r.color=W}}}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "update",
      "source": "update(e){for(let t of this.particles){if(!t.active)continue;if(t.life-=e,t.life<=0){t.active=!1;continue}let a=Math.exp(-t.drag*e);t.x+=t.vx*e,t.y+=t.vy*e,t.vx*=a,t.vy*=a}for(let t of this.rings)t.active&&(t.life-=e,t.life<=0&&(t.active=!1));for(let[t,a]of this.pocketGlow){let i=a-e;i<=0?this.pocketGlow.delete(t):this.pocketGlow.set(t,i)}}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "glowFor",
      "source": "glowFor(e){return this.pocketGlow.get(e)??0}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "drawUnderBalls",
      "source": "drawUnderBalls(e){for(let[t,a]of this.pocketGlow){let i=v.find(e=>e.id===t);if(!i)continue;let n=a/.5,l=e.createRadialGradient(i.hole.x,i.hole.y,0,i.hole.x,i.hole.y,1.8*i.hole.r);l.addColorStop(0,`rgba(255,226,170,${.34*n})`),l.addColorStop(1,\"rgba(255,226,170,0)\"),e.fillStyle=l,e.beginPath(),e.arc(i.hole.x,i.hole.y,1.8*i.hole.r,0,eI),e.fill()}}"
    },
    {
      "path": "renderer.effects",
      "prototype": "tl",
      "name": "draw",
      "source": "draw(e){for(let t of(e.save(),e.globalCompositeOperation=\"lighter\",this.particles)){if(!t.active)continue;let a=t.life/t.maxLife;e.fillStyle=`rgba(${t.r},${t.g},${t.b},${.62*a*a})`,e.beginPath(),e.arc(t.x,t.y,t.size*(.5+a),0,eI),e.fill()}for(let t of(e.restore(),this.rings)){if(!t.active)continue;let a=1-t.life/t.maxLife,i=t.from+(t.to-t.from)*(1-(1-a)*(1-a));e.globalAlpha=1-a,e.strokeStyle=t.color,e.lineWidth=t.width*(1-.5*a),e.beginPath(),e.arc(t.x,t.y,i,0,eI),e.stroke(),e.globalAlpha=1}}"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "drawFocusIfNeeded",
      "source": "function drawFocusIfNeeded() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "drawImage",
      "source": "function drawImage() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "isPointInPath",
      "source": "function isPointInPath() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "isPointInStroke",
      "source": "function isPointInStroke() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "strokeText",
      "source": "function strokeText() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "beginPath",
      "source": "function beginPath() { [native code] }"
    },
    {
      "path": "renderer.ctx",
      "prototype": "CanvasRenderingContext2D",
      "name": "closePath",
      "source": "function closePath() { [native code] }"
    }
  ],
  "bundles": [
    {
      "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0gtf7gqm4h522.js",
      "bytes": 250538,
      "score": 126,
      "excerpts": [
        {
          "term": "refreshPrediction",
          "offset": 213730,
          "excerpt": "er:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advanc"
        },
        {
          "term": "cuePath",
          "offset": 150730,
          "excerpt": ",783.99,1046.5].forEach((t,a)=>this.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y"
        },
        {
          "term": "objectPath",
          "offset": 150764,
          "excerpt": "s.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y*m,S=Math.hypot(v,M);return{...eO,"
        },
        {
          "term": "pocket",
          "offset": 149523,
          "excerpt": "this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4.2),i=2100+1500*a+380*Math.random();this.burst(t,.045+.02*a,.1+.36*a,\"bandpass\",i,2.4),this.tone(t,.035+.02*a,.05+.16*a,.92*i,.55*i,\"triangle\")}cushion(e){if(!this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4);this.burst(t,.075+.03*a,.06+.2*a,\"lowpass\",620+520*a,.8),this.tone(t,.09,.04+.14*a,190+90*a,90,\"sine\")}pocket(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.13,.22,340,120,\"sine\"),this.burst(e+.02,.1,.14,\"lowpass\",900,.7),this.burst(e+.14,.13,.1,\"bandpass\",1500,1.4),this.tone(e+.16,.2,.12,150,62,\"sine\")}cueStrike(e){if(!this.ready())return;let t=this.ctx.currentTime,a=Math.min(1,Math.max(.05,e));this.burst(t,.05,.1+.3*a,\"bandpass\",900+700*a,1.1),this.tone(t,.05,.05+.14*a,520+260*a,180,\"triangle\")}rack(){if(!this.ready())return;let e=this.ctx.currentTime;for(let t=0;t<7;t++)this.burst(e+.022*t+.01*Math.random(),.05,.1,\"bandpass\",1600+1400*Math.random(),2)}foul(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.14,.16,300,190,\"square\"),this.tone(e+.11,.2,.14,205,130,\"square\")}win(){if(!this.ready())return;let e=this.ctx.currentTime;[523.25,659.25,783.99,1046."
        },
        {
          "term": "ghost",
          "offset": 8745,
          "excerpt": "allDeep:\"#140b07\",innerLight:\"rgba(120, 150, 140, 0.14)\"},G=\"rgba(0,0,0,0.5)\",E={x:.42,y:.56,z:.72,shadowOffset:.42,shadowBlur:.55,shadowAlpha:.42},$={tip:\"#3f6fa8\",ferrule:\"#f2ece0\",shaft:\"#d8b07a\",shaftLight:\"#f0d3a6\",collar:\"#1b1b1f\",ring:\"#c9a227\",butt:\"#2c1b12\",buttLight:\"#5e3a24\",wrap:\"#16181c\",length:.82,tipRadius:.0044,buttRadius:.0108},D={line:\"rgba(255, 255, 255, 0.90)\",lineSoft:\"rgba(255, 255, 255, 0.22)\",ghost:\"rgba(255, 255, 255, 0.92)\",ghostFill:\"rgba(255, 255, 255, 0.06)\",object:\"rgba(255, 255, 255, 0.86)\",objectPractice:\"rgba(255, 228, 150, 0.95)\",cueAfter:\"rgba(158, 206, 255, 0.72)\",danger:\"rgba(255, 96, 96, 0.95)\",blocked:\"rgba(255, 118, 110, 0.80)\",blockedSolid:\"#ff5a52\"},W=\"rgba(255, 238, 196, 0.85)\",U=(()=>{let{x:e,y:t,z:a}=E,i=Math.hypot(e,t,a);return{x:e/i,y:t/i,z:a/i}})();function F({id:e,size:a=22,potted:n=!1,title:l}){let r=(0,i.useId)().replace(/:/g,\"\"),o=_[e]??_[0],s=e>8;return(0,t.jsxs)(\"svg\",{width:a,height:a,viewBox:\"0 0 32 32\",role:l?\"img\":\"presentation\",\"aria-label\":l,style:{display:\"block\",opacity:n?.26:1,filter:n?\"grayscale(0.55)\":\"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",transition:\"opacity 0.35s var(--ease), filter 0.35s var(--ease)\"},children:[(0,t.jsxs)(\"defs\",{ch"
        }
      ]
    },
    {
      "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/19db_hr8jwljq.js",
      "bytes": 2746,
      "score": 12,
      "excerpts": [
        {
          "term": "pocket",
          "offset": 1280,
          "excerpt": "rer ${c}`,...t?{\"content-type\":\"application/json\"}:{}},body:t?JSON.stringify(t):void 0})}catch{return{ok:!1,code:\"UNAVAILABLE\"}}let d=await n.json().catch(()=>null);return n.ok&&d?.data?{ok:!0,wardrobe:(i=d.data,o=e=>e.filter(e=>e.owned).map(e=>e.id),l=i.throwables.some(e=>null===e.held),{coins:i.coins,verified:i.verified,owned:{name:o(i.names),frame:o(i.frames),fx:o(i.effects),theme:o(i.themes)},equipped:i.equipped,pocket:l?null:Object.fromEntries(i.throwables.map(e=>[e.id,e.held??0])),usedToday:i.usedToday,dailyThrows:i.dailyThrows})}:{ok:!1,code:d?.details?.code??d?.code??\"UNAVAILABLE\"}}var c=e.i(76522);e.s([\"UnoStore\",0,function({onClose:e}){let[s,d]=(0,t.useState)(null),[u,f]=(0,t.useState)(!1),h=(0,t.useMemo)(()=>{let e;return e=e=>e.ok?(d(e.wardrobe),{ok:!0,wardrobe:e.wardrobe}):e,{buy:async(a,t)=>e(await l(\"/purchase\",\"POST\",{kind:a,id:t})),wear:async a=>e(await l(\"/equip\",\"PATCH\",a)),buyPack:async(a,t)=>e(await l(\"/packs\",\"POST\",{id:a,size:t,idemKey:(0,o.Z)()}))}},[]),m=(0,r.v)()?.user,b={name:m?.globalName||m?.username||\"You\",avatar:function(e){if(!e?.id)return null;if(e.avatar)return`https://cdn.discordapp.com/avatars/${e.id}/${e.avatar}.png?size=128`;let a=0;try{a=Number((BigInt(e.id)>>Big"
        }
      ]
    },
    {
      "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/2zhaf-xcw67tg.js",
      "bytes": 46836,
      "score": 12,
      "excerpts": [
        {
          "term": "pocket",
          "offset": 35868,
          "excerpt": ",fx:\"Plays for everyone at the table when you call UNO.\",theme:\"Only you see your theme: cards, back and table.\",throw:\"Tap a player's picture during a game to throw one.\"},rarity:{common:\"Common\",rare:\"Rare\",epic:\"Epic\",legendary:\"Legendary\"},buy:e=>`Buy & wear \\xb7 ${e}`,wear:\"Wear\",wearing:\"Wearing\",free:\"Free\",owned:\"Owned\",busy:\"One moment…\",preview:\"Preview\",held:e=>`You have ${e}`,heldUnknown:\"Can't read your pocket\",pack:(e,a)=>`\\xd7${e} \\xb7 ${a}`,today:(e,a)=>`${e} of ${a} throws used today`,throwsAtMe:\"Throws at me\",throwsIn:{all:\"Everything\",hearts:\"Friendly only\",off:\"Nothing\"},friendly:\"Friendly\",playful:\"Playful\",coinsUnknown:\"—\",unverified:\"The shop can't read what you own right now. You can still wear free looks.\",errors:{INSUFFICIENT_FUNDS:\"Not enough EPIX for this yet.\",ALREADY_OWNED:\"You already own this.\",NOT_OWNED:\"You don't own that look.\",BLOCKED_SPEND:\"Your account can't buy right now.\",UNAVAILABLE:\"The shop can't reach your wallet right now — try again in a moment.\",DEFAULT:\"That didn't go through. You were not charged twice.\"}},U={name:N.NAMES,frame:N.FRAMES,fx:t.EFFECTS,theme:t.THEMES},O=[\"name\",\"frame\",\"fx\",\"theme\",\"throw\"],R=N.RARITY_COLORS,D=e=>`${new Intl.NumberFormat(\""
        }
      ]
    },
    {
      "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/1f3_j0-7srs8o.js",
      "bytes": 180551,
      "score": 3,
      "excerpts": [
        {
          "term": "rail",
          "offset": 964,
          "excerpt": "\"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var o=l?Object.getOwnPropertyDescriptor(e,u):null;o&&(o.get||o.set)?Object.defineProperty(a,u,o):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}},5550,(e,t,r)=>{e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"addBasePath\",{enumerable:!0,get:function(){return l}});let n=e.r(41858),a=e.r(82823);function l(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,\"\"))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"callServer\",{enumerable:!0,get:function(){return n.callServer}});let n=e.r(48658);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{let n;e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"findSourceMapURL\",{enumerable:!0,get:function(){"
        }
      ]
    },
    {
      "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0eobm8ikdrr9l.js",
      "bytes": 62120,
      "score": 3,
      "excerpts": [
        {
          "term": "rail",
          "offset": 15942,
          "excerpt": "ame||(\"u\">typeof location?location.hostname:\"localhost\"),this.port=e.port||(\"u\">typeof location&&location.port?location.port:this.secure?\"443\":\"80\"),this.transports=[],this._transportsByName={},e.transports.forEach(t=>{let e=t.prototype.name;this.transports.push(e),this._transportsByName[e]=t}),this.opts=Object.assign({path:\"/engine.io\",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:\"t\",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\\/$/,\"\")+(this.opts.addTrailingSlash?\"/\":\"\"),\"string\"==typeof this.opts.query&&(this.opts.query=function(t){let e={},s=t.split(\"&\");for(let t=0,i=s.length;t<i;t++){let i=s[t].split(\"=\");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}(this.opts.query)),X&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(\"beforeunload\",this._beforeunloadEventListener,!1)),\"localhost\"!==this.hostname&&(this._offlineEventListener=()=>{this._onClose(\"transport close\",{description:\"network connection lost\"})},Q.push(this._offli"
        }
      ]
    }
  ],
  "bundleFetchErrors": [],
  "live": {
    "capturedAt": "2026-11-02T16:53:32.935Z",
    "page": {
      "origin": "https://1536454561869332530.discordsays.com",
      "insideGameFrame": true,
      "viewport": [
        864,
        532
      ],
      "pixelRatio": 1.218749761581421,
      "phase": "ballInHand",
      "screenPhase": "ballInHand",
      "turn": "0"
    },
    "engine": {
      "phase": "ballInHand",
      "aimAngle": -0.366057,
      "power": 1,
      "spinX": 0,
      "spinY": 0,
      "pullback": 0,
      "cueAlpha": 1,
      "predictionDirty": false,
      "prediction": {
        "cuePath": [
          {
            "x": -0.4953,
            "y": 0
          },
          {
            "x": 0.191626,
            "y": -0.263322
          }
        ],
        "ghost": {
          "x": 0.191626,
          "y": -0.263322
        },
        "targetId": 15,
        "objectPath": [],
        "cuePathAfter": [],
        "objectDir": {
          "x": 0.986777,
          "y": 0.162084
        },
        "cueDir": {
          "x": 0.204112,
          "y": -0.978948
        },
        "objectPocket": null,
        "scratchPocket": null,
        "railsBeforeContact": 0,
        "cutAngle": 0.528859,
        "objectReach": 0.723572,
        "cueReach": 0.207777
      },
      "blockedTarget": -1,
      "viewBalls": [
        {
          "id": 0,
          "group": "cue",
          "p": {
            "x": -0.4953,
            "y": 0
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.639194,
              -0.634319,
              0.434823,
              -0.728783,
              0.68016,
              -0.079103,
              -0.245573,
              -0.367453,
              -0.897035
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 1,
          "group": "solid",
          "p": {
            "x": -0.039226,
            "y": -0.278441
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.536329,
              0.378206,
              0.754528,
              0.230215,
              -0.925636,
              0.300333,
              0.812005,
              0.012627,
              -0.583513
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 2,
          "group": "solid",
          "p": {
            "x": 1.021465,
            "y": -0.526165
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.192896,
              -0.915094,
              -0.354109,
              -0.000893,
              -0.36105,
              0.932546,
              -0.981219,
              -0.179568,
              -0.070463
            ]
          },
          "inPlay": false,
          "pocket": "topRight"
        },
        {
          "id": 3,
          "group": "solid",
          "p": {
            "x": 0.123323,
            "y": 0.381355
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.210475,
              -0.092405,
              -0.973222,
              0.524707,
              0.829298,
              -0.192217,
              0.824853,
              -0.551113,
              -0.126061
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 4,
          "group": "solid",
          "p": {
            "x": 0.616993,
            "y": 0.204055
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.580965,
              -0.229235,
              0.780981,
              0.573164,
              0.566043,
              0.592518,
              -0.577894,
              0.791863,
              -0.197462
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 5,
          "group": "solid",
          "p": {
            "x": 0.251337,
            "y": 0.360561
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.121432,
              0.031512,
              0.992099,
              -0.917369,
              0.385259,
              0.100048,
              -0.379063,
              -0.92227,
              0.075691
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 6,
          "group": "solid",
          "p": {
            "x": 0.116962,
            "y": 0.249824
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.516971,
              0.186249,
              -0.835495,
              0.587266,
              -0.63295,
              -0.504474,
              -0.622784,
              -0.751456,
              0.217839
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 7,
          "group": "solid",
          "p": {
            "x": -1.021465,
            "y": -0.526165
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.513551,
              0.681692,
              0.521116,
              -0.729123,
              -0.666872,
              0.153822,
              0.452377,
              -0.300962,
              0.83951
            ]
          },
          "inPlay": false,
          "pocket": "topLeft"
        },
        {
          "id": 8,
          "group": "eight",
          "p": {
            "x": 0.20002,
            "y": 0.457782
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.973919,
              -0.183742,
              -0.133121,
              0.125004,
              -0.055129,
              0.990623,
              -0.189358,
              -0.981427,
              -0.030723
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 9,
          "group": "stripe",
          "p": {
            "x": -0.872744,
            "y": -0.057685
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.570275,
              0.69273,
              0.441488,
              0.005304,
              -0.53433,
              0.845259,
              0.821437,
              0.484371,
              0.301041
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 10,
          "group": "stripe",
          "p": {
            "x": -0.184468,
            "y": 0.139737
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.169558,
              0.388685,
              -0.905635,
              0.778616,
              0.616176,
              0.118677,
              0.604158,
              -0.685019,
              -0.407113
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 11,
          "group": "stripe",
          "p": {
            "x": 0.356587,
            "y": 0.42555
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.409687,
              0.755881,
              0.510686,
              -0.815133,
              -0.554664,
              0.167051,
              0.40953,
              -0.347839,
              0.843382
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 12,
          "group": "stripe",
          "p": {
            "x": 0.659868,
            "y": 0.458733
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.925295,
              -0.198187,
              0.323344,
              -0.313494,
              -0.879507,
              0.358034,
              0.213426,
              -0.432653,
              -0.875934
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 13,
          "group": "stripe",
          "p": {
            "x": 0.184987,
            "y": 0.364461
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.788073,
              -0.548562,
              -0.279322,
              0.597228,
              0.79131,
              0.130947,
              0.149198,
              -0.270014,
              0.951227
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 14,
          "group": "stripe",
          "p": {
            "x": 0.036648,
            "y": 0.152676
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              -0.198794,
              -0.755209,
              -0.624612,
              -0.980029,
              0.15004,
              0.1305,
              -0.004837,
              0.63808,
              -0.769955
            ]
          },
          "inPlay": true,
          "pocket": null
        },
        {
          "id": 15,
          "group": "stripe",
          "p": {
            "x": 0.248021,
            "y": -0.254059
          },
          "v": {
            "x": 0,
            "y": 0
          },
          "w": {
            "x": 0,
            "y": 0,
            "z": 0
          },
          "orient": {
            "type": "Float64Array",
            "length": 9,
            "values": [
              0.762109,
              0.527498,
              -0.375414,
              0.327936,
              0.185461,
              0.926317,
              0.558255,
              -0.829066,
              -0.031644
            ]
          },
          "inPlay": true,
          "pocket": null
        }
      ],
      "serverState": {
        "matchId": "RyoP85XrqfX2",
        "sequence": 6,
        "serverTime": 0,
        "status": "playing",
        "phase": "open",
        "turn": 0,
        "players": [
          {
            "slot": 0,
            "name": "Sa2ḿmurai",
            "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
            "connected": true,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 2,
              "potted": 2,
              "fouls": 1,
              "bestRun": 2
            }
          },
          {
            "slot": 1,
            "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
            "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
            "connected": false,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 0,
              "potted": 0,
              "fouls": 0,
              "bestRun": 0
            }
          }
        ],
        "balls": [
          {
            "id": 0,
            "x": -0.4953,
            "y": 0,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 1,
            "x": -0.039226,
            "y": -0.278441,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 2,
            "x": 1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topRight"
          },
          {
            "id": 3,
            "x": 0.123323,
            "y": 0.381355,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 4,
            "x": 0.616993,
            "y": 0.204055,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 5,
            "x": 0.251337,
            "y": 0.360561,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 6,
            "x": 0.116962,
            "y": 0.249824,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 7,
            "x": -1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topLeft"
          },
          {
            "id": 8,
            "x": 0.20002,
            "y": 0.457782,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 9,
            "x": -0.872744,
            "y": -0.057685,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 10,
            "x": -0.184468,
            "y": 0.139737,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 11,
            "x": 0.356587,
            "y": 0.42555,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 12,
            "x": 0.659868,
            "y": 0.458733,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 13,
            "x": 0.184987,
            "y": 0.364461,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 14,
            "x": 0.036648,
            "y": 0.152676,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 15,
            "x": 0.248021,
            "y": -0.254059,
            "inPlay": true,
            "pocket": null
          }
        ],
        "ballInHand": true,
        "behindHeadString": false,
        "cuePlaced": false,
        "winner": null,
        "winKind": null,
        "rackNumber": 1,
        "busyForMs": 0,
        "potted": [
          2,
          7
        ]
      },
      "latestState": {
        "matchId": "RyoP85XrqfX2",
        "sequence": 6,
        "serverTime": 0,
        "status": "playing",
        "phase": "open",
        "turn": 0,
        "players": [
          {
            "slot": 0,
            "name": "Sa2ḿmurai",
            "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
            "connected": true,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 2,
              "potted": 2,
              "fouls": 1,
              "bestRun": 2
            }
          },
          {
            "slot": 1,
            "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
            "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
            "connected": false,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 0,
              "potted": 0,
              "fouls": 0,
              "bestRun": 0
            }
          }
        ],
        "balls": [
          {
            "id": 0,
            "x": -0.4953,
            "y": 0,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 1,
            "x": -0.039226,
            "y": -0.278441,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 2,
            "x": 1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topRight"
          },
          {
            "id": 3,
            "x": 0.123323,
            "y": 0.381355,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 4,
            "x": 0.616993,
            "y": 0.204055,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 5,
            "x": 0.251337,
            "y": 0.360561,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 6,
            "x": 0.116962,
            "y": 0.249824,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 7,
            "x": -1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topLeft"
          },
          {
            "id": 8,
            "x": 0.20002,
            "y": 0.457782,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 9,
            "x": -0.872744,
            "y": -0.057685,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 10,
            "x": -0.184468,
            "y": 0.139737,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 11,
            "x": 0.356587,
            "y": 0.42555,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 12,
            "x": 0.659868,
            "y": 0.458733,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 13,
            "x": 0.184987,
            "y": 0.364461,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 14,
            "x": 0.036648,
            "y": 0.152676,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 15,
            "x": 0.248021,
            "y": -0.254059,
            "inPlay": true,
            "pocket": null
          }
        ],
        "ballInHand": true,
        "behindHeadString": false,
        "cuePlaced": false,
        "winner": null,
        "winKind": null,
        "rackNumber": 1,
        "busyForMs": 0,
        "potted": [
          2,
          7
        ]
      },
      "netState": {
        "matchId": "RyoP85XrqfX2",
        "sequence": 6,
        "serverTime": 0,
        "status": "playing",
        "phase": "open",
        "turn": 0,
        "players": [
          {
            "slot": 0,
            "name": "Sa2ḿmurai",
            "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
            "connected": true,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 2,
              "potted": 2,
              "fouls": 1,
              "bestRun": 2
            }
          },
          {
            "slot": 1,
            "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
            "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
            "connected": false,
            "ready": true,
            "group": null,
            "onEight": false,
            "remaining": [],
            "stats": {
              "shots": 0,
              "potted": 0,
              "fouls": 0,
              "bestRun": 0
            }
          }
        ],
        "balls": [
          {
            "id": 0,
            "x": -0.4953,
            "y": 0,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 1,
            "x": -0.039226,
            "y": -0.278441,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 2,
            "x": 1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topRight"
          },
          {
            "id": 3,
            "x": 0.123323,
            "y": 0.381355,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 4,
            "x": 0.616993,
            "y": 0.204055,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 5,
            "x": 0.251337,
            "y": 0.360561,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 6,
            "x": 0.116962,
            "y": 0.249824,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 7,
            "x": -1.021465,
            "y": -0.526165,
            "inPlay": false,
            "pocket": "topLeft"
          },
          {
            "id": 8,
            "x": 0.20002,
            "y": 0.457782,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 9,
            "x": -0.872744,
            "y": -0.057685,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 10,
            "x": -0.184468,
            "y": 0.139737,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 11,
            "x": 0.356587,
            "y": 0.42555,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 12,
            "x": 0.659868,
            "y": 0.458733,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 13,
            "x": 0.184987,
            "y": 0.364461,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 14,
            "x": 0.036648,
            "y": 0.152676,
            "inPlay": true,
            "pocket": null
          },
          {
            "id": 15,
            "x": 0.248021,
            "y": -0.254059,
            "inPlay": true,
            "pocket": null
          }
        ],
        "ballInHand": true,
        "behindHeadString": false,
        "cuePlaced": false,
        "winner": null,
        "winKind": null,
        "rackNumber": 1,
        "busyForMs": 0,
        "potted": [
          2,
          7
        ]
      },
      "view": {
        "ownKeys": [
          "balls",
          "orthoCounter"
        ],
        "constructor": "tL",
        "orthoCounter": 19988
      },
      "renderer": {
        "ownKeys": [
          "canvas",
          "effects",
          "ctx",
          "sprite",
          "scale",
          "originX",
          "originY",
          "dpr",
          "cssW",
          "cssH",
          "rotated",
          "drops",
          "lastFrame",
          "spriteTable",
          "theme"
        ],
        "constructor": "tM",
        "scale": 305.17807,
        "originX": 408.012909,
        "originY": 193.269272,
        "dpr": 1.21875,
        "cssW": 816.025818,
        "cssH": 386.538544,
        "rotated": false,
        "sprite": {
          "x": -1.1286,
          "y": -0.6333,
          "w": 2.2572,
          "h": 1.2666
        },
        "spriteTable": "classic",
        "canvasBitmap": [
          995,
          471
        ],
        "canvasRect": {
          "x": 23.987185,
          "y": 85.987198,
          "width": 816.025818,
          "height": 386.538544
        }
      },
      "player": {
        "tracks": [],
        "events": [],
        "eventCursor": 0,
        "time": -1,
        "duration": 0
      },
      "net": {
        "handlers": {
          "session": {
            "type": "Set",
            "size": 0,
            "values": []
          },
          "connection": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "state": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "started": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "physics": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "finished": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "opponentJoined": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "opponentLeft": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "opponentBack": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "opponentAim": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "gameStarted": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          },
          "error": {
            "type": "Set",
            "size": 1,
            "values": [
              "[Function anonymous]"
            ]
          }
        },
        "slot": 0,
        "code": null,
        "connection": "online",
        "state": {
          "matchId": "RyoP85XrqfX2",
          "sequence": 6,
          "serverTime": 0,
          "status": "playing",
          "phase": "open",
          "turn": 0,
          "players": [
            {
              "slot": 0,
              "name": "Sa2ḿmurai",
              "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
              "connected": true,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 2,
                "potted": 2,
                "fouls": 1,
                "bestRun": 2
              }
            },
            {
              "slot": 1,
              "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
              "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
              "connected": false,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 0,
                "potted": 0,
                "fouls": 0,
                "bestRun": 0
              }
            }
          ],
          "balls": [
            {
              "id": 0,
              "x": -0.4953,
              "y": 0,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 1,
              "x": -0.039226,
              "y": -0.278441,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 2,
              "x": 1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topRight"
            },
            {
              "id": 3,
              "x": 0.123323,
              "y": 0.381355,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 4,
              "x": 0.616993,
              "y": 0.204055,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 5,
              "x": 0.251337,
              "y": 0.360561,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 6,
              "x": 0.116962,
              "y": 0.249824,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 7,
              "x": -1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topLeft"
            },
            {
              "id": 8,
              "x": 0.20002,
              "y": 0.457782,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 9,
              "x": -0.872744,
              "y": -0.057685,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 10,
              "x": -0.184468,
              "y": 0.139737,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 11,
              "x": 0.356587,
              "y": 0.42555,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 12,
              "x": 0.659868,
              "y": 0.458733,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 13,
              "x": 0.184987,
              "y": 0.364461,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 14,
              "x": 0.036648,
              "y": 0.152676,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 15,
              "x": 0.248021,
              "y": -0.254059,
              "inPlay": true,
              "pocket": null
            }
          ],
          "ballInHand": true,
          "behindHeadString": false,
          "cuePlaced": false,
          "winner": null,
          "winKind": null,
          "rackNumber": 1,
          "busyForMs": 0,
          "potted": [
            2,
            7
          ]
        },
        "latest": {
          "matchId": "RyoP85XrqfX2",
          "sequence": 6,
          "serverTime": 0,
          "status": "playing",
          "phase": "open",
          "turn": 0,
          "players": [
            {
              "slot": 0,
              "name": "Sa2ḿmurai",
              "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
              "connected": true,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 2,
                "potted": 2,
                "fouls": 1,
                "bestRun": 2
              }
            },
            {
              "slot": 1,
              "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
              "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
              "connected": false,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 0,
                "potted": 0,
                "fouls": 0,
                "bestRun": 0
              }
            }
          ],
          "balls": [
            {
              "id": 0,
              "x": -0.4953,
              "y": 0,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 1,
              "x": -0.039226,
              "y": -0.278441,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 2,
              "x": 1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topRight"
            },
            {
              "id": 3,
              "x": 0.123323,
              "y": 0.381355,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 4,
              "x": 0.616993,
              "y": 0.204055,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 5,
              "x": 0.251337,
              "y": 0.360561,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 6,
              "x": 0.116962,
              "y": 0.249824,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 7,
              "x": -1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topLeft"
            },
            {
              "id": 8,
              "x": 0.20002,
              "y": 0.457782,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 9,
              "x": -0.872744,
              "y": -0.057685,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 10,
              "x": -0.184468,
              "y": 0.139737,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 11,
              "x": 0.356587,
              "y": 0.42555,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 12,
              "x": 0.659868,
              "y": 0.458733,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 13,
              "x": 0.184987,
              "y": 0.364461,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 14,
              "x": 0.036648,
              "y": 0.152676,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 15,
              "x": 0.248021,
              "y": -0.254059,
              "inPlay": true,
              "pocket": null
            }
          ],
          "ballInHand": true,
          "behindHeadString": false,
          "cuePlaced": false,
          "winner": null,
          "winKind": null,
          "rackNumber": 1,
          "busyForMs": 0,
          "potted": [
            2,
            7
          ]
        },
        "view": {
          "status": "active",
          "matchId": "RyoP85XrqfX2",
          "hosted": false,
          "sequence": 6,
          "phase": "open",
          "turn": 0,
          "players": [
            {
              "slot": 0,
              "name": "Sa2ḿmurai",
              "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
              "userId": "690943650775040050",
              "cue": "classic",
              "connected": false,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 2,
                "potted": 2,
                "fouls": 1,
                "bestRun": 2
              }
            },
            {
              "slot": 1,
              "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
              "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
              "userId": "1254868628675760209",
              "cue": "classic",
              "connected": false,
              "ready": true,
              "group": null,
              "onEight": false,
              "remaining": [],
              "stats": {
                "shots": 0,
                "potted": 0,
                "fouls": 0,
                "bestRun": 0
              }
            }
          ],
          "balls": [
            {
              "id": 0,
              "x": -0.4953,
              "y": 0,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 1,
              "x": -0.039226,
              "y": -0.278441,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 2,
              "x": 1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topRight"
            },
            {
              "id": 3,
              "x": 0.123323,
              "y": 0.381355,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 4,
              "x": 0.616993,
              "y": 0.204055,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 5,
              "x": 0.251337,
              "y": 0.360561,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 6,
              "x": 0.116962,
              "y": 0.249824,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 7,
              "x": -1.021465,
              "y": -0.526165,
              "inPlay": false,
              "pocket": "topLeft"
            },
            {
              "id": 8,
              "x": 0.20002,
              "y": 0.457782,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 9,
              "x": -0.872744,
              "y": -0.057685,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 10,
              "x": -0.184468,
              "y": 0.139737,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 11,
              "x": 0.356587,
              "y": 0.42555,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 12,
              "x": 0.659868,
              "y": 0.458733,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 13,
              "x": 0.184987,
              "y": 0.364461,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 14,
              "x": 0.036648,
              "y": 0.152676,
              "inPlay": true,
              "pocket": null
            },
            {
              "id": 15,
              "x": 0.248021,
              "y": -0.254059,
              "inPlay": true,
              "pocket": null
            }
          ],
          "potted": [
            2,
            7
          ],
          "ballInHand": true,
          "behindHeadString": false,
          "cuePlaced": false,
          "winner": null,
          "winKind": null,
          "tournament": null,
          "rackNumber": 1,
          "busyForMs": 0,
          "turnRemainingMs": 60000,
          "turnTotalMs": 60000,
          "warmupRemainingMs": null,
          "arrived": [
            true,
            false
          ],
          "lastShot": null,
          "rematch": {
            "you": false,
            "them": false,
            "declined": false
          },
          "you": 0,
          "table": {
            "id": "classic",
            "host": "classic",
            "mine": false
          },
          "wallet": {
            "coins": 1085,
            "cues": [
              "classic"
            ],
            "owned": [
              "classic"
            ],
            "tables": [
              "classic"
            ],
            "cue": "classic",
            "table": "classic",
            "myTable": false
          },
          "developer": false
        },
        "send": "[Function anonymous]",
        "closer": "[Function anonymous]",
        "lastShotKey": "",
        "lastStateKey": "{\"matchId\":\"RyoP85XrqfX2\",\"sequence\":6,\"serverTime\":0,\"status\":\"playing\",\"phase\":\"open\",\"turn\":0,\"players\":[{\"slot\":0,\"name\":\"Sa2ḿmurai\",\"avatar\":\"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\"connected\":true,\"ready\":true,\"group\":null,\"onEight\":false,\"remaining\":[],\"stats\":{\"shots\":2,\"potted\":2,\"fouls\":1,\"bestRun\":2}},{\"slot\":1,\"name\":\"𝓎𝒶𝓈...",
        "opponentWasConnected": false,
        "opponentEverHere": false,
        "request": "[Function request]",
        "rtt": 306.708129,
        "rttVar": 4.614263
      }
    }
  }
}