TusDino || BEST CHROME DINO GAME T-REX MOD MENU CHEAT - (0.17.0)

THE BEST CHROME DINO HACK: SET SPEED, KILL PLAYER, ESP, NO-CLIP, TRACERS, TELEPORT, FLY +MORE EXPLOITS

目前为 2023-04-06 提交的版本。查看 最新版本

// ==UserScript==
// @name         TusDino || BEST CHROME DINO GAME T-REX MOD MENU CHEAT - (0.17.0)
// @namespace    https://github.com/nonumbershere/TusDino
// @homepageURL  https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/
// @supportURL   https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/issues
// @homepage     https://discord.gg/6eaDrx5J9s
// @version      0.17.0
// @description  THE BEST CHROME DINO HACK: SET SPEED, KILL PLAYER, ESP, NO-CLIP, TRACERS, TELEPORT, FLY +MORE EXPLOITS
// @author       Lapide (Lapide#0853), inon13 (inon13#0163)
// @license      MIT
// @match        *://chromedino.com/*
// @match        *://dino-chrome.com/*
// @match        *://tuckercraig.com/dino/*
// @match        *://elgoog.im/t-rex/*
// @match        *://www.dinogame.net/*
// @match        *://elgoog.im/t-rex/v2/*
// @match        *://nointernetgame.com/*
// @match        *://chromedino.io/
// @match        *://trex-runner.com/*
// @match        *://24glo.com/game/dino-play.html
// @match        *://fivesjs.skipser.com/trex-game/
// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11
// @icon         https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/assets/Logo.png?raw=true
// @run-at       document-start
// @grant        unsafeWindow
// @grant        GM_info
// ==/UserScript==

// NOTE: THE MOST SUPPORTED SITE IS: chromedino.com
// THE SCRIPT MIGHT BE BUGGY ON OTHERS

(function () {
    // Sorry if the code is a bit bad or out of order, just trying to code as easy as possible
    console.log("Running Tusdino...");
    var showDiscord = true;
    var info_ = GM_info;
    // Loading
    var supported = ['chromedino.com', 'dino-chrome.com', 'tuckercraig.com/dino', 'elgoog.im/t-rex', 'www.dinogame.net', 'elgoog.im/t-rex/v2', 'nointernetgame.com', 'chromedino.io', 'trex-runner.com', '24glo.com/game/dino-play.html', 'fivesjs.skipser.com/trex-game'];
    function isSupported(gameUrl) {
        return supported[gameUrl]
    }

    // Cheat
    var docoldEv = document.addEventListener;
    var winoldEv = window.addEventListener;

    function cont() {
        if (typeof Runner != typeof undefined) {
            function applyScript(src) {
                var b = document.createElement("script");
                b.src = src;
                document.body.append(b);
                b.remove();
            }
            const HSLToRGB = (h, s, l) => {
                s /= 100;
                l /= 100;
                const k = (n) => (n + h / 30) % 12;
                const a = s * Math.min(l, 1 - l);
                const f = (n) =>
                    l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
                return [255 * f(0), 255 * f(8), 255 * f(4)];
            };
            applyScript("https://cdn.jsdelivr.net/npm/toastify-js");
            applyScript(
                "https://raw.githubusercontent.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/main/assets/autorun.js"
            );
            var oldKeyDown = Runner.instance_.onKeyDown;
            var oldstartJump = Runner.instance_.tRex.startJump;
            // Addons
            var npso = 0;
            unsafeWindow.tusdino = {
                cheats: {
                    autoplayer: false
                    , fly: false
                    , walk: false
                    , allowFlyMode: false
                    , rainbowSquarePlayer: false
                    , esp: false
                    , objectEsp: false
                    , tracer: false
                    , notifier: false
                    , instantrespawn: false
                    , size: false
                    , noobstacles: false
                    , arc: false
                    , autofocus: false
                    , glide: false
                    , invisibility: false
                    , noclip: false
                    , obstacleBypass: false
                    , obstacleFloat: false
                    , duckAndJump: false
                    , glow: false
                    , bhop: false
                    , rainbowglow: false
                    , obliterate: false
                    , mute: false
                    , forcepause: false
                    , stormcloud: false
                    , airjump: false
                    , duckjump: false
                    , watermark: true
                    , lazervisual: false
                    , lazer: false
                    , lazerv: false
                , }
                , alert: function alert_(
                    title = ""
                    , description = ""
                    , alertonclick = function () {}
                ) {
                    tusdino.logs.success("Showing alert box (" + title + ")");
                    var styl = document.createElement("style");
                    styl.innerHTML =
                        "*:not(body,head,center,script,html,.alertbox,#pages,.standard-nav,#loading,#menu) {filter:blur(1px);pointer-events:none}";
                    document.body.append(styl);
                    var i = document.createElement("div");
                    ++npso;
                    i.className = "alertbox";
                    // Replace every "\n" with "<br>" in the description and title
                    description = description.replace(/\n/g, "<br>");
                    title = title.replace(/\n/g, "<br>");

                    // Replace every "/color^" with "<label class='alertbox' style='color: *color*'>" and every "/color-end" with "</label>"
                    description = description.replace(
                        /\/color\^(.*?)\^/g
                        , "<label class='alertbox' style='color: $1'>"
                    );
                    description = description.replace(/\/color-end/g, "</label>");
                    title = title.replace(
                        /\/color\^(.*?)\^/g
                        , "<label class='alertbox' style='color: $1'>"
                    );
                    title = title.replace(/\/color-end/g, "</label>");

                    // Replace every "/bgcolor^" with "<label class='alertbox' style='background-color: *color*'>" and every "/bgcolor-end" with "</label>"
                    description = description.replace(
                        /\/bgcolor\^(.*?)\^/g
                        , "<label class='alertbox' style='background-color: $1'>"
                    );
                    description = description.replace(/\/bgcolor-end/g, "</label>");
                    title = title.replace(
                        /\/bgcolor\^(.*?)\^/g
                        , "<label class='alertbox' style='background-color: $1'>"
                    );
                    title = title.replace(/\/bgcolor-end/g, "</label>");

                    // Replace every "italic>" with "<i>" and every "<italic" with "</i>"
                    description = description.replace(/italic>/g, "<i>");
                    description = description.replace(/<italic/g, "</i>");
                    title = title.replace(/italic>/g, "<i class = 'alertbox'>");
                    title = title.replace(/<italic/g, "</i>");
                    i.innerHTML = `<div class="alertbox" style="

    border-radius: 16px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%) scale(0.8);
    position: fixed;
    font-weight: bolder;
    z-index: 10000000;
    transform-origin: center center;
    width: 782px;
    color: white;
    background: #2c4470;
    border: solid 0.1px blue;
"><br><center><h3 class="alertbox" style="
    font-size: 33px;
    margin:0;
">${title}</h3></center><center><hr class="alertbox" style="
    width: 180px;
    border-color: #ffffff;
"></center><br>    <center><div class="alertbox alertboxbox" style="
    font-size: 20px;
"><p class = "alertbox" style = "width: 509px;font-size: 19px">${description}</p><button class="alertbox" style="
    background: #3737a9;
    border: none;
    margin-top: 20px;
    padding: 13px;
    color: white;
    font-size: 18px;
    border-radius: 11px;
    padding-right: 36px;
    padding-left: 36px;
    font-weight:bolder;
    cursor: pointer;
" id="remover${npso}">OK</button></div><br></center></div>`;
                    document.body.append(i);
                    i.style.left = innerWidth - (250 * 6 - 50) + "px";
                    document
                        .getElementById("remover" + npso)
                        .addEventListener("click", function () {
                            styl.remove();
                            i.remove();
                            alertonclick();
                        });
                }
                , hacked: {
                    Trex: function (canvas, spritePos) {
                        this.canvas = canvas;
                        this.canvasCtx = canvas.getContext("2d");
                        this.spritePos = this.spritePos || spritePos;
                        this.xPos = this.xPos || 0;
                        this.yPos = this.yPos || 0;
                        this.groundYPos = this.groundYPos || 0;
                        this.currentFrame = this.currentFrame || 0;
                        this.currentAnimFrames = this.currentAnimFrames || [];
                        this.blinkDelay = this.blinkDelay || 0;
                        this.animStartTime = this.animStartTime || 0;
                        this.timer = 0;
                        this.msPerFrame = 1000 / FPS;
                        this.config = tusdino.hacked.Trex.config;
                        this.status = tusdino.hacked.Trex.status.WAITING;
                        this.jumping = false;
                        this.ducking = false;
                        this.jumpVelocity = 0;
                        this.reachedMinHeight = false;
                        this.speedDrop = false;
                        this.jumpCount = 0;
                        this.jumpspotX = 0;
                        this.init();
                    }
                    , gameOver: function () {
                        if (!tusdino.cheats.noclip) {
                            this.playSound(this.soundFx.HIT);
                            vibrate(200);
                            this.stop();
                            this.crashed = true;
                            this.distanceMeter.acheivement = false;
                            var cscr = document.getElementById("currentScore");
                            cscr.innerText = currentScore;
                            var sb = document.getElementById("shareBlock");
                            sb.style.display = "none"; // block
                            this.tRex.update(100, Trex.status.CRASHED);
                            if (!this.gameOverPanel) {
                                this.gameOverPanel = new GameOverPanel(
                                    this.canvas
                                    , this.spriteDef.TEXT_SPRITE
                                    , this.spriteDef.RESTART
                                    , this.dimensions
                                );
                            } else {
                                this.gameOverPanel.draw();
                            }
                            if (this.distanceRan > this.highestScore) {
                                this.highestScore = Math.ceil(this.distanceRan);
                                this.distanceMeter.setHighScore(this.highestScore);
                                currentScore = Math.round(this.highestScore * 0.025);
                                try {
                                    cscr.innerText = currentScore;
                                } catch (e) {}
                                var score_d = 0;
                                if (document.getElementById("score-5") !== null) {
                                    score_d = document.getElementById("score-5").innerHTML;
                                }
                                try {
                                    if (currentScore > score_d) {
                                        var xhr = new XMLHttpRequest();
                                        xhr.open(
                                            "GET"
                                            , "/inc/check.php?score=" + currentScore
                                            , false
                                        );
                                        xhr.send();
                                        if (xhr.status != 200) {} else {
                                            if (xhr.responseText != "") {
                                                if (user_name == "") {
                                                    user_name = prompt(xhr.responseText, "Anonym");
                                                    if (user_name == "null" || user_name == "") {
                                                        user_name = "Anonym";
                                                    }
                                                } else {
                                                    alert(xhr.responseText);
                                                }
                                                xhr.open(
                                                    "GET"
                                                    , "/inc/set.php?name=" +
                                                    user_name +
                                                    "&score=" +
                                                    currentScore
                                                    , false
                                                );
                                                xhr.send();
                                                //location.reload()
                                            }
                                        }
                                    }
                                } catch (e) {}
                            }
                            this.time = getTimeStamp();
                            if (tusdino.cheats.instantrespawn) {
                                this.restart();
                            }
                            }
                    },

                    Obstacle: function (
                        canvasCtx
                        , type
                        , spriteImgPos
                        , dimensions
                        , gapCoefficient
                        , speed
                    ) {
                        this.canvasCtx = canvasCtx;
                        this.spritePos = spriteImgPos;
                        this.typeConfig = type;
                        this.gapCoefficient = gapCoefficient;
                        this.size = getRandomNum(1, Obstacle.MAX_OBSTACLE_LENGTH);
                        this.dimensions = dimensions;
                        this.remove = false;
                        this.xPos = 0;
                        this.yPos = 0;
                        this.width = 0;
                        this.collisionBoxes = [];
                        this.gap = 0;
                        this.speedOffset = 0;
                        this.currentFrame = 0;
                        this.timer = 0;
                        this.init(speed);
                    }
                    , DistanceMeter: function DistanceMeter(
                        canvas
                        , spritePos
                        , canvasWidth
                    ) {
                        this.canvas = canvas;
                        this.canvasCtx = canvas.getContext("2d");
                        this.image = Runner.imageSprite;
                        this.spritePos = spritePos;
                        this.x = 0;
                        this.y = 5;
                        this.currentDistance = 0;
                        this.maxScore = 0;
                        this.highScore = 0;
                        this.container = null;
                        this.digits = [];
                        this.acheivement = false;
                        this.defaultString = "";
                        this.flashTimer = 0;
                        this.flashIterations = 0;
                        this.config = DistanceMeter.config;
                        this.maxScoreUnits = this.config.MAX_DISTANCE_UNITS;
                        this.init(canvasWidth);
                    }
                    , Horizon: function Horizon(
                        canvas
                        , spritePos
                        , dimensions
                        , gapCoefficient
                    ) {
                        this.canvas = canvas;
                        this.canvasCtx = this.canvas.getContext("2d");
                        this.config = Horizon.config;
                        this.dimensions = dimensions;
                        this.gapCoefficient = gapCoefficient;
                        this.obstacles = [];
                        this.obstacleHistory = [];
                        this.horizonOffsets = [0, 0];
                        this.cloudFrequency = this.config.CLOUD_FREQUENCY;
                        this.spritePos = spritePos;
                        this.clouds = [];
                        this.cloudSpeed = this.config.BG_CLOUD_SPEED;
                        this.horizonLine = null;
                        this.init();
                    }
                , }
                , onclick: function (id, func) {
                    console.log("Applying click to: " + id);
                    document.getElementById(id).addEventListener("click", function (e) {
                        func(e);
                    });
                    document.getElementById(id).addEventListener("focus", function () {
                        this.blur();
                    });
                }
                , saved: {
                    clearCanvas: Runner.instance_.clearCanvas
                    , gameOver: Runner.instance_.gameOver
                    , update: Runner.instance_.update
                    , startGame: Runner.instance_.startGame
                    , trexDraw: Runner.instance_.tRex.draw
                    , playSound: Runner.instance_.playSound
                    , addNewObstacle: Runner.instance_.horizon.addNewObstacle
                    , CACTUS_LARGE: Runner.instance_.horizon.spritePos.CACTUS_LARGE
                    , CACTUS_SMALL: Runner.instance_.horizon.spritePos.CACTUS_SMALL
                    , PTERODACTYL: Runner.instance_.horizon.spritePos.PTERODACTYL
                    , TREX: Runner.instance_.horizon.spritePos.TREX
                , }
                , modules: {
                    onGround: false
                    , isPlaying: false
                , }
                , msg: function (text) {
                    Toastify({
                        text: text
                        , duration: 2000
                        , close: true
                        , gravity: "bottom", // `top` or `bottom`
                        position: "left", // `left`, `center` or `right`
                        stopOnFocus: true, // Prevents dismissing of toast on hover
                        style: {
                            background: "#343434"
                        , }
                        , onClick: function () {}, // Callback after click
                    }).showToast();
                }
                , setclick: function (id, func) {
                    document.getElementById(id, function (e) {
                        func(e);
                    });
                }
                , config: {
                    hotkeys: {
                        togglemenu: "j"
                    , }
                , }
                , logs: {
                    sent: []
                    , default: function (text) {
                        console.log(
                            "%c[" + "%cTusDino" + "%c] " + "%c" + text
                            , "color: #2b6eba"
                            , "color: #2ba5ba"
                            , "color: #2b6eba"
                            , "color: white"
                        );
                        this.sent.push({
                            type: "default"
                            , text: text
                        , });
                    }
                    , success: function (text) {
                        console.log(
                            "%c[" + "%cTusDinoSuccess" + "%c] " + "%c" + text
                            , "color: #58ba2b"
                            , "color: #2bba62"
                            , "color: #58ba2b"
                            , "color: white"
                        );
                        this.sent.push({
                            type: "success"
                            , text: text
                        , });
                    }
                    , error: function (text) {
                        console.log(
                            "%c[" + "%cTusDinoError" + "%c] " + "%c" + text
                            , "color: #ba2b2b"
                            , "color: #ba402b"
                            , "color: #ba2b2b"
                            , "color: white"
                        );
                        this.sent.push({
                            type: "error"
                            , text: text
                        , });
                    }
                , }
                , info: {
                    version: info_.script.version
                    , description: info_.script.description
                , }
            , };
            var d = document.createElement("link");
            d.href = "https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css";

            function getRandomNum(min, max) {
                return Math.floor(Math.random() * (max - min + 1)) + min;
            }

            function vibrate(duration) {
                if (IS_MOBILE && window.navigator.vibrate) {
                    window.navigator.vibrate(duration);
                }
            }

            function createCanvas(container, width, height, opt_classname) {
                var canvas = document.createElement("canvas");
                canvas.className = opt_classname ?
                    Runner.classes.CANVAS + " " + opt_classname :
                    Runner.classes.CANVAS;
                canvas.width = width;
                canvas.height = height;
                container.appendChild(canvas);
                return canvas;
            }

            function decodeBase64ToArrayBuffer(base64String) {
                var len = (base64String.length / 4) * 3;
                var str = atob(base64String);
                var arrayBuffer = new ArrayBuffer(len);
                var bytes = new Uint8Array(arrayBuffer);
                for (var i = 0; i < len; i++) {
                    bytes[i] = str.charCodeAt(i);
                }
                return bytes.buffer;
            }

            function getTimeStamp() {
                //return IS_IOS ? new Date().getTime() : performance.now()
                return new Date().getTime(); // Safari 5.17 Fix 12.06.17
            }

            function GameOverPanel(canvas, textImgPos, restartImgPos, dimensions) {
                this.canvas = canvas;
                this.canvasCtx = canvas.getContext("2d");
                this.canvasDimensions = dimensions;
                this.textImgPos = textImgPos;
                this.restartImgPos = restartImgPos;
                this.draw();
            }
            GameOverPanel.dimensions = {
                TEXT_X: 0
                , TEXT_Y: 13
                , TEXT_WIDTH: 191
                , TEXT_HEIGHT: 11
                , RESTART_WIDTH: 36
                , RESTART_HEIGHT: 32
            , };
            GameOverPanel.prototype = {
                updateDimensions: function (width, opt_height) {
                    this.canvasDimensions.WIDTH = width;
                    if (opt_height) {
                        this.canvasDimensions.HEIGHT = opt_height;
                    }
                }
                , draw: function () {
                    var dimensions = GameOverPanel.dimensions;
                    var centerX = this.canvasDimensions.WIDTH / 2;
                    var textSourceX = dimensions.TEXT_X;
                    var textSourceY = dimensions.TEXT_Y;
                    var textSourceWidth = dimensions.TEXT_WIDTH;
                    var textSourceHeight = dimensions.TEXT_HEIGHT;
                    var textTargetX = Math.round(centerX - dimensions.TEXT_WIDTH / 2);
                    var textTargetY = Math.round((this.canvasDimensions.HEIGHT - 25) / 3);
                    var textTargetWidth = dimensions.TEXT_WIDTH;
                    var textTargetHeight = dimensions.TEXT_HEIGHT;
                    var restartSourceWidth = dimensions.RESTART_WIDTH;
                    var restartSourceHeight = dimensions.RESTART_HEIGHT;
                    var restartTargetX = centerX - dimensions.RESTART_WIDTH / 2;
                    var restartTargetY = this.canvasDimensions.HEIGHT / 2;
                    if (IS_HIDPI) {
                        textSourceY *= 2;
                        textSourceX *= 2;
                        textSourceWidth *= 2;
                        textSourceHeight *= 2;
                        restartSourceWidth *= 2;
                        restartSourceHeight *= 2;
                    }
                    textSourceX += this.textImgPos.x;
                    textSourceY += this.textImgPos.y;
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , textSourceX
                        , textSourceY
                        , textSourceWidth
                        , textSourceHeight
                        , textTargetX
                        , textTargetY
                        , textTargetWidth
                        , textTargetHeight
                    );
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , this.restartImgPos.x
                        , this.restartImgPos.y
                        , restartSourceWidth
                        , restartSourceHeight
                        , restartTargetX
                        , restartTargetY
                        , dimensions.RESTART_WIDTH
                        , dimensions.RESTART_HEIGHT
                    );
                }
            , };

            d.rel = "stylesheet";
            document.body.append(d);
            var window = unsafeWindow;
            var Update = 2;
            var startBhop = true;
            var jum = true;
            var duc = true;
            var xSpeed = 1;
            var ySpeed = 1;
            var goflydown = false;
            var goflyup = false;
            var goright = false;
            var goleft = false;
            var tt = true;
            var y = Runner.instance_.tRex.yPos;
            var x = Runner.instance_.tRex.xPos;
            setInterval(function () {
                tusdino.modules.onGround =
                    Runner.instance_.tRex.yPos == Runner.instance_.tRex.groundYPos;
                tusdino.modules.isPlaying = Runner.instance_.activated;
                if (tusdino.cheats.bhop && startBhop) {
                    if (tusdino.modules.onGround && tusdino.modules.isPlaying) {
                        startBhop = false;
                        Runner.instance_.tRex.startJump(Runner.instance_.currentSpeed);
                        Runner.instance_.playSound(Runner.instance_.soundFx.BUTTON_PRESS);
                    }
                }
                if (!startBhop) {
                    if (!tusdino.modules.onGround) {
                        startBhop = true;
                    }
                }
                if (tusdino.cheats.stormcloud) {
                    Runner.instance_.horizon.addCloud();
                }
                if (tusdino.cheats.invisibility) {
                    Runner.instance_.tRex.spritePos = {};
                }
                if (tusdino.cheats.noobstacles) {
                    Runner.instance_.horizon.spritePos.CACTUS_LARGE = {};
                    Runner.instance_.horizon.spritePos.CACTUS_SMALL = {};
                    Runner.instance_.horizon.spritePos.PTERODACTYL = {};
                    Runner.instance_.horizon.obstacles = [];
                }
                if (tusdino.cheats.walk) {
                    if (goright) {
                        x += xSpeed;
                    }
                    if (goleft) {
                        x -= xSpeed;
                    }
                    Runner.instance_.tRex.xPos = x;
                }
                if (tusdino.cheats.fly) {
                    if (tt) {
                        if (Runner.instance_.tRex.yPos < 30) {
                            if (Runner.instance_.tRex.yPos != 30) {
                                y += 1;
                            } else {
                                tt = false;
                            }
                        } else {
                            if (Runner.instance_.tRex.yPos != 30) {
                                y -= 1;
                            } else {
                                tt = false;
                            }
                        }
                    } else {
                        tusdino.cheats.allowFlyMode = true;
                    }
                    if (goflyup) {
                        y += ySpeed;
                    }
                    if (goflydown) {
                        y -= ySpeed;
                    }
                    Runner.instance_.tRex.yPos = y;
                }
                if (tusdino.cheats.autoplayer) {
                    var tRex = Runner.instance_.tRex;
                    var obstacles = Runner.instance_.horizon.obstacles;
                    if (
                        Runner.instance_.horizon.obstacles[0] &&
                        Runner.instance_.horizon.obstacles[0].typeConfig.type ==
                        "PTERODACTYL" &&
                        Runner.instance_.horizon.obstacles[0].yPos < 75
                    ) {
                        if (
                            !tRex.jumping &&
                            obstacles.length > 0 &&
                            obstacles[0].xPos + obstacles[0].width <=
                            (parseInt(Runner.instance_.currentSpeed - 0.1) - 5) * 34 +
                            160 &&
                            obstacles[0].xPos + obstacles[0].width > 20
                        ) {
                            if (duc) Runner.instance_.tRex.setDuck(true);
                            duc = false;
                            setTimeout(() => {
                                Runner.instance_.tRex.setDuck(false);
                                duc = true;
                            }, 1500);
                        }
                    } else {
                        if (
                            obstacles[0] &&
                            !tRex.jumping &&
                            obstacles.length > 0 &&
                            obstacles[0].xPos + obstacles[0].width <=
                            (parseInt(Runner.instance_.currentSpeed - 0.1) - 5) * 34 +
                            160 &&
                            obstacles[0].xPos + obstacles[0].width > 20
                        ) {
                            if (jum) {
                                if (duc) duc = false;
                                Runner.instance_.tRex.setDuck(false);
                                duc = true;
                                Runner.instance_.playSound(
                                    Runner.instance_.soundFx.BUTTON_PRESS
                                );
                                tRex.startJump(Runner.instance_.currentSpeed);
                            }
                        }
                    }
                }
            }, Update);

            Runner.instance_.horizon.addNewObstacle = function (currentSpeed) {
                tusdino.saved.addNewObstacle.bind(this)(currentSpeed);
            };

            Runner.instance_.playSound = function (soundBuffer) {
                if (!tusdino.cheats.mute) {
                    tusdino.saved.playSound.bind(this)(soundBuffer);
                }
            };

            function checkForCollision(obstacle, tRex, opt_canvasCtx) {
                var obstacleBoxXPos = Runner.defaultDimensions.WIDTH + obstacle.xPos;
                var tRexBox = new CollisionBox(
                    tRex.xPos + 1
                    , tRex.yPos + 1
                    , tRex.config.WIDTH - 2
                    , tRex.config.HEIGHT - 2
                );
                var obstacleBox = new CollisionBox(
                    obstacle.xPos + 1
                    , obstacle.yPos + 1
                    , obstacle.typeConfig.width * obstacle.size - 2
                    , obstacle.typeConfig.height - 2
                );
                if (opt_canvasCtx) {
                    drawCollisionBoxes(opt_canvasCtx, tRexBox, obstacleBox);
                }
                if (boxCompare(tRexBox, obstacleBox)) {
                    var collisionBoxes = obstacle.collisionBoxes;
                    var tRexCollisionBoxes = tRex.ducking ?
                        Trex.collisionBoxes.DUCKING :
                        Trex.collisionBoxes.RUNNING;
                    for (var t = 0; t < tRexCollisionBoxes.length; t++) {
                        for (var i = 0; i < collisionBoxes.length; i++) {
                            var adjTrexBox = createAdjustedCollisionBox(
                                tRexCollisionBoxes[t]
                                , tRexBox
                            );
                            var adjObstacleBox = createAdjustedCollisionBox(
                                collisionBoxes[i]
                                , obstacleBox
                            );
                            var crashed = boxCompare(adjTrexBox, adjObstacleBox);
                            if (opt_canvasCtx) {
                                drawCollisionBoxes(opt_canvasCtx, adjTrexBox, adjObstacleBox);
                            }
                            if (crashed) {
                                return [adjTrexBox, adjObstacleBox];
                            }
                        }
                    }
                }
                return false;
            }

            function createAdjustedCollisionBox(box, adjustment) {
                return new CollisionBox(
                    box.x + adjustment.x
                    , box.y + adjustment.y
                    , box.width
                    , box.height
                );
            }

            function drawCollisionBoxes(canvasCtx, tRexBox, obstacleBox) {
                canvasCtx.save();
                canvasCtx.strokeStyle = "#f00";
                canvasCtx.strokeRect(
                    tRexBox.x
                    , tRexBox.y
                    , tRexBox.width
                    , tRexBox.height
                );
                canvasCtx.strokeStyle = "#0f0";
                canvasCtx.strokeRect(
                    obstacleBox.x
                    , obstacleBox.y
                    , obstacleBox.width
                    , obstacleBox.height
                );
                canvasCtx.restore();
            }

            function boxCompare(tRexBox, obstacleBox) {
                var crashed = false;
                var tRexBoxX = tRexBox.x;
                var tRexBoxY = tRexBox.y;
                var obstacleBoxX = obstacleBox.x;
                var obstacleBoxY = obstacleBox.y;
                if (
                    tRexBox.x < obstacleBoxX + obstacleBox.width &&
                    tRexBox.x + tRexBox.width > obstacleBoxX &&
                    tRexBox.y < obstacleBox.y + obstacleBox.height &&
                    tRexBox.height + tRexBox.y > obstacleBox.y
                ) {
                    crashed = true;
                }
                return crashed;
            }

            function CollisionBox(x, y, w, h) {
                this.x = x;
                this.y = y;
                this.width = w;
                this.height = h;
            }
            Runner.instance_.gameOver = tusdino.hacked.gameOver;
            tusdino.hacked.Trex.config = {
                DROP_VELOCITY: -5
                , GRAVITY: 0.6
                , HEIGHT: 47
                , HEIGHT_DUCK: 25
                , INIITAL_JUMP_VELOCITY: -10
                , INTRO_DURATION: 1500
                , MAX_JUMP_HEIGHT: 30
                , MIN_JUMP_HEIGHT: 30
                , SPEED_DROP_COEFFICIENT: 3
                , SPRITE_WIDTH: 262
                , START_X_POS: 50
                , WIDTH: 44
                , WIDTH_DUCK: 59
            , };
            tusdino.hacked.Trex.collisionBoxes = {
                DUCKING: [new CollisionBox(1, 18, 55, 25)]
                , RUNNING: [
                    new CollisionBox(22, 0, 17, 16)
                    , new CollisionBox(1, 18, 30, 9)
                    , new CollisionBox(10, 35, 14, 8)
                    , new CollisionBox(1, 24, 29, 5)
                    , new CollisionBox(5, 30, 21, 4)
                    , new CollisionBox(9, 34, 15, 4)
                , ]
            , };
            tusdino.hacked.Trex.status = {
                CRASHED: "CRASHED"
                , DUCKING: "DUCKING"
                , JUMPING: "JUMPING"
                , RUNNING: "RUNNING"
                , WAITING: "WAITING"
            , };
            if (!localStorage.joinedDiscordtusdino && showDiscord) {
                var f = confirm(
                    "Do you wan't to join the Discord server? (You can request, report bugs or inform the owner about something)"
                );
                if (f) {
                    localStorage.setItem("joinedDiscordtusdino", true);
                    open("https://discord.gg/6eaDrx5J9s");
                    alert("Thank you for joining the Discord server!");
                } else {
                    alert(
                        "Alright, we'll ask you next time. You can disable this in the userscript, replace true with false: var showDiscord = true;"
                    );
                }
            }
            tusdino.hacked.Trex.BLINK_TIMING = 7000;
            tusdino.hacked.Trex.animFrames = {
                WAITING: {
                    frames: [44, 0]
                    , msPerFrame: 1000 / 3
                , }
                , RUNNING: {
                    frames: [88, 132]
                    , msPerFrame: 1000 / 12
                , }
                , CRASHED: {
                    frames: [220]
                    , msPerFrame: 1000 / 60
                , }
                , JUMPING: {
                    frames: [0]
                    , msPerFrame: 1000 / 60
                , }
                , DUCKING: {
                    frames: [262, 321]
                    , msPerFrame: 1000 / 8
                , }
            , };
            tusdino.hacked.Trex.prototype = {
                init: function () {
                    this.blinkDelay = this.setBlinkDelay();
                    this.groundYPos =
                        Runner.defaultDimensions.HEIGHT -
                        this.config.HEIGHT -
                        Runner.config.BOTTOM_PAD;
                    this.yPos = this.groundYPos;
                    this.minJumpHeight = this.groundYPos - this.config.MIN_JUMP_HEIGHT;
                    this.draw(0, 0);
                    this.update(0, Trex.status.WAITING);
                }
                , setJumpVelocity: function (setting) {
                    this.config.INIITAL_JUMP_VELOCITY = -setting;
                    this.config.DROP_VELOCITY = -setting / 2;
                }
                , update: function (deltaTime, opt_status) {
                    this.timer += deltaTime;
                    if (opt_status) {
                        this.status = opt_status;
                        this.currentFrame = 0;
                        this.msPerFrame = Trex.animFrames[opt_status].msPerFrame;
                        this.currentAnimFrames = Trex.animFrames[opt_status].frames;
                        if (opt_status == Trex.status.WAITING) {
                            this.animStartTime = getTimeStamp();
                            this.setBlinkDelay();
                        }
                    }
                    if (this.playingIntro && this.xPos < this.config.START_X_POS) {
                        this.xPos += Math.round(
                            (this.config.START_X_POS / this.config.INTRO_DURATION) * deltaTime
                        );
                    }
                    if (this.status == Trex.status.WAITING) {
                        this.blink(getTimeStamp());
                    } else {
                        this.draw(this.currentAnimFrames[this.currentFrame], 0);
                    }
                    if (this.timer >= this.msPerFrame) {
                        this.currentFrame =
                            this.currentFrame == this.currentAnimFrames.length - 1 ?
                            0 :
                            this.currentFrame + 1;
                        this.timer = 0;
                    }
                    if (this.speedDrop && this.yPos == this.groundYPos) {
                        this.speedDrop = false;
                        this.setDuck(true);
                    }
                }
                , draw: function (x, y) {
                    var sourceX = x;
                    var sourceY = y;
                    var sourceWidth =
                        this.ducking && this.status != Trex.status.CRASHED ?
                        this.config.WIDTH_DUCK :
                        this.config.WIDTH;
                    var sourceHeight = this.config.HEIGHT;
                    if (IS_HIDPI) {
                        sourceX *= 2;
                        sourceY *= 2;
                        sourceWidth *= 2;
                        sourceHeight *= 2;
                    }
                    sourceX += this.spritePos.x;
                    sourceY += this.spritePos.y;
                    if (this.ducking && this.status != Trex.status.CRASHED) {
                        this.canvasCtx.drawImage(
                            Runner.imageSprite
                            , sourceX
                            , sourceY
                            , sourceWidth
                            , sourceHeight
                            , tusdino.cheats.size ? this.xPos/2 : this.xPos
                            , tusdino.cheats.size ? this.yPos/2 : this.yPos
                            , tusdino.cheats.size ? this.config.WIDTH_DUCK*2 : this.config.WIDTH_DUCK
                            , tusdino.cheats.size ? this.config.HEIGHT*2 : this.config.HEIGHT
                        );
                    } else {
                        if (this.ducking && this.status == Trex.status.CRASHED) {
                            this.xPos++;
                        }
                        this.canvasCtx.drawImage(
                            Runner.imageSprite
                            , sourceX
                            , sourceY
                            , sourceWidth
                            , sourceHeight
                            , tusdino.cheats.size ? this.xPos/2 : this.xPos
                            , tusdino.cheats.size ? this.yPos/2 : this.yPos
                            , tusdino.cheats.size ? this.config.WIDTH*2 : this.config.WIDTH
                            , tusdino.cheats.size ? this.config.HEIGHT*2 : this.config.HEIGHT
                        );
                    }
                }
                , setBlinkDelay: function () {
                    this.blinkDelay = Math.ceil(Math.random() * Trex.BLINK_TIMING);
                }
                , blink: function (time) {
                    var deltaTime = time - this.animStartTime;
                    if (deltaTime >= this.blinkDelay) {
                        this.draw(this.currentAnimFrames[this.currentFrame], 0);
                        if (this.currentFrame == 1) {
                            this.setBlinkDelay();
                            this.animStartTime = time;
                        }
                    }
                }
                , startJump: function (speed) {
                    if (!this.jumping) {
                        this.update(0, Trex.status.JUMPING);
                        this.jumpVelocity = this.config.INIITAL_JUMP_VELOCITY - speed / 10;
                        this.jumping = true;
                        this.reachedMinHeight = false;
                        this.speedDrop = false;
                    }
                }
                , endJump: function () {
                    if (
                        this.reachedMinHeight &&
                        this.jumpVelocity < this.config.DROP_VELOCITY
                    ) {
                        this.jumpVelocity = this.config.DROP_VELOCITY;
                    }
                }
                , updateJump: function (deltaTime, speed) {
                    var msPerFrame = Trex.animFrames[this.status].msPerFrame;
                    var framesElapsed = deltaTime / msPerFrame;
                    if (this.speedDrop) {
                        this.yPos += Math.round(
                            this.jumpVelocity *
                            this.config.SPEED_DROP_COEFFICIENT *
                            framesElapsed
                        );
                    } else {
                        this.yPos += Math.round(this.jumpVelocity * framesElapsed);
                    }
                    this.jumpVelocity += this.config.GRAVITY * framesElapsed;
                    if (this.yPos < this.minJumpHeight || this.speedDrop) {
                        this.reachedMinHeight = true;
                    }
                    if (this.yPos < this.config.MAX_JUMP_HEIGHT || this.speedDrop) {
                        this.endJump();
                    }
                    if (this.yPos > this.groundYPos) {
                        this.reset();
                        this.jumpCount++;
                    }
                    this.update(deltaTime);
                }
                , setSpeedDrop: function () {
                    this.speedDrop = true;
                    this.jumpVelocity = 1;
                }
                , setDuck: function (isDucking) {
                    if (isDucking && this.status != Trex.status.DUCKING) {
                        this.update(0, Trex.status.DUCKING);
                        this.ducking = true;
                    } else if (this.status == Trex.status.DUCKING) {
                        this.update(0, Trex.status.RUNNING);
                        this.ducking = false;
                    }
                }
                , reset: function () {
                    this.yPos = this.groundYPos;
                    this.jumpVelocity = 0;
                    this.jumping = false;
                    this.ducking = false;
                    this.update(0, Trex.status.RUNNING);
                    this.midair = false;
                    this.speedDrop = false;
                    this.jumpCount = 0;
                }
            , };

            function getTimeStamp() {
                //return IS_IOS ? new Date().getTime() : performance.now()
                return new Date().getTime(); // Safari 5.17 Fix 12.06.17
            }

            function hackedInit() {
                this.horizon = new tusdino.hacked.Horizon(
                    this.canvas
                    , this.spriteDef
                    , this.dimensions
                    , this.config.GAP_COEFFICIENT
                );
                this.distanceMeter = new tusdino.hacked.DistanceMeter(
                    this.canvas
                    , this.spriteDef.TEXT_SPRITE
                    , this.dimensions.WIDTH
                );
                this.tRex = new tusdino.hacked.Trex(this.canvas, this.spriteDef.TREX);
            }
            tusdino.hacked.Obstacle.MAX_GAP_COEFFICIENT = 1.5;
            tusdino.hacked.Obstacle.MAX_OBSTACLE_LENGTH = 3;
            tusdino.hacked.Obstacle.prototype = {
                init: function (speed) {
                    this.cloneCollisionBoxes();
                    if (this.size > 1 && this.typeConfig.multipleSpeed > speed) {
                        this.size = 1;
                    }
                    this.width = this.typeConfig.width * this.size;
                    this.xPos = this.dimensions.WIDTH - this.width;
                    if (Array.isArray(this.typeConfig.yPos)) {
                        var yPosConfig = IS_MOBILE ?
                            this.typeConfig.yPosMobile :
                            this.typeConfig.yPos;
                        this.yPos = yPosConfig[getRandomNum(0, yPosConfig.length - 1)];
                    } else {
                        this.yPos = this.typeConfig.yPos;
                    }
                    this.draw();
                    if (this.size > 1) {
                        this.collisionBoxes[1].width =
                            this.width -
                            this.collisionBoxes[0].width -
                            this.collisionBoxes[2].width;
                        this.collisionBoxes[2].x =
                            this.width - this.collisionBoxes[2].width;
                    }
                    if (this.typeConfig.speedOffset) {
                        this.speedOffset =
                            Math.random() > 0.5 ?
                            this.typeConfig.speedOffset :
                            -this.typeConfig.speedOffset;
                    }
                    this.gap = this.getGap(this.gapCoefficient, speed);
                }
                , draw: function () {
                    var sourceWidth = this.typeConfig.width;
                    var sourceHeight = this.typeConfig.height;
                    if (IS_HIDPI) {
                        sourceWidth = sourceWidth * 2;
                        sourceHeight = sourceHeight * 2;
                    }
                    var sourceX =
                        sourceWidth * this.size * (0.5 * (this.size - 1)) +
                        this.spritePos.x;
                    if (this.currentFrame > 0) {
                        sourceX += sourceWidth * this.currentFrame;
                    }
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , sourceX
                        , this.spritePos.y
                        , sourceWidth * this.size
                        , sourceHeight
                        , this.xPos
                        , this.yPos
                        , this.typeConfig.width * this.size
                        , this.typeConfig.height
                    );
                }
                , update: function (deltaTime, speed) {
                    if (!this.remove) {
                        if (this.typeConfig.speedOffset) {
                            speed += this.speedOffset;
                        }
                        this.xPos -= Math.floor(((speed * FPS) / 1000) * deltaTime);
                        if (this.typeConfig.numFrames) {
                            this.timer += deltaTime;
                            if (this.timer >= this.typeConfig.frameRate) {
                                this.currentFrame =
                                    this.currentFrame == this.typeConfig.numFrames - 1 ?
                                    0 :
                                    this.currentFrame + 1;
                                this.timer = 0;
                            }
                        }
                        this.draw();
                        if (!this.isVisible()) {
                            this.remove = true;
                        }
                    }
                }
                , getGap: function (gapCoefficient, speed) {
                    var minGap = Math.round(
                        this.width * speed + this.typeConfig.minGap * gapCoefficient
                    );
                    var maxGap = Math.round(minGap * Obstacle.MAX_GAP_COEFFICIENT);
                    return getRandomNum(minGap, maxGap);
                }
                , isVisible: function () {
                    return this.xPos + this.width > 0;
                }
                , cloneCollisionBoxes: function () {
                    var collisionBoxes = this.typeConfig.collisionBoxes;
                    for (var i = collisionBoxes.length - 1; i >= 0; i--) {
                        this.collisionBoxes[i] = new CollisionBox(
                            collisionBoxes[i].x
                            , collisionBoxes[i].y
                            , collisionBoxes[i].width
                            , collisionBoxes[i].height
                        );
                    }
                }
            , };
            tusdino.hacked.Obstacle.types = [{
                    type: "CACTUS_SMALL"
                    , width: 17
                    , height: 35
                    , yPos: 105
                    , multipleSpeed: 4
                    , minGap: 120
                    , minSpeed: 0
                    , collisionBoxes: [
                        new CollisionBox(0, 7, 5, 27)
                        , new CollisionBox(4, 0, 6, 34)
                        , new CollisionBox(10, 4, 7, 14)
                    , ]
                , }
                , {
                    type: "CACTUS_LARGE"
                    , width: 25
                    , height: 50
                    , yPos: 90
                    , multipleSpeed: 7
                    , minGap: 120
                    , minSpeed: 0
                    , collisionBoxes: [
                        new CollisionBox(0, 12, 7, 38)
                        , new CollisionBox(8, 0, 7, 49)
                        , new CollisionBox(13, 10, 10, 38)
                    , ]
                , }
                , {
                    type: "PTERODACTYL"
                    , width: 46
                    , height: 40
                    , yPos: [100, 75, 50]
                    , yPosMobile: [100, 50]
                    , multipleSpeed: 999
                    , minSpeed: 8.5
                    , minGap: 150
                    , collisionBoxes: [
                        new CollisionBox(15, 15, 16, 5)
                        , new CollisionBox(18, 21, 24, 6)
                        , new CollisionBox(2, 14, 4, 3)
                        , new CollisionBox(6, 10, 4, 7)
                        , new CollisionBox(10, 8, 6, 9)
                    , ]
                    , numFrames: 2
                    , frameRate: 1000 / 6
                    , speedOffset: 0.8
                , }
            , ];
            var DEFAULT_WIDTH = 600;
            Runner.instance_.horizon.addNewObstacle = function (currentSpeed) {
                var obstacleTypeIndex = getRandomNum(0, Obstacle.types.length - 1);
                var obstacleType = tusdino.hacked.Obstacle.types[obstacleTypeIndex];
                if (
                    this.duplicateObstacleCheck(obstacleType.type) ||
                    currentSpeed < obstacleType.minSpeed
                ) {
                    this.addNewObstacle(currentSpeed);
                } else {
                    var obstacleSpritePos = this.spritePos[obstacleType.type];
                    this.obstacles.push(
                        new Obstacle(
                            this.canvasCtx
                            , obstacleType
                            , obstacleSpritePos
                            , this.dimensions
                            , this.gapCoefficient
                            , currentSpeed
                        )
                    );
                    this.obstacleHistory.unshift(obstacleType.type);
                    if (this.obstacleHistory.length > 1) {
                        this.obstacleHistory.splice(Runner.config.MAX_OBSTACLE_DUPLICATION);
                    }
                }
            };
            var FPS = 60;
            var IS_HIDPI = window.devicePixelRatio > 1;
            var IS_IOS =
                window.navigator.userAgent.indexOf("CriOS") > -1 ||
                window.navigator.userAgent == "UIWebViewForStaticFileContent";
            var IS_MOBILE = window.navigator.userAgent.indexOf("Mobi") > -1 || IS_IOS;
            var IS_TOUCH_ENABLED = "ontouchstart" in window;

            tusdino.hacked.Horizon.config = {
                BG_CLOUD_SPEED: 0.2
                , BUMPY_THRESHOLD: 0.3
                , CLOUD_FREQUENCY: 0.5
                , HORIZON_HEIGHT: 16
                , MAX_CLOUDS: 6
            , };
            tusdino.hacked.Horizon.prototype = {
                init: function () {
                    this.addCloud();
                    this.horizonLine = new HorizonLine(
                        this.canvas
                        , this.spritePos.HORIZON
                    );
                }
                , update: function (deltaTime, currentSpeed, updateObstacles) {
                    this.runningTime += deltaTime;
                    this.horizonLine.update(deltaTime, currentSpeed);
                    this.updateClouds(deltaTime, currentSpeed);
                    if (updateObstacles) {
                        this.updateObstacles(deltaTime, currentSpeed);
                    }
                }
                , updateClouds: function (deltaTime, speed) {
                    var cloudSpeed = (this.cloudSpeed / 1000) * deltaTime * speed;
                    var numClouds = this.clouds.length;
                    if (numClouds) {
                        for (var i = numClouds - 1; i >= 0; i--) {
                            this.clouds[i].update(cloudSpeed);
                        }
                        var lastCloud = this.clouds[numClouds - 1];
                        if (
                            numClouds < this.config.MAX_CLOUDS &&
                            this.dimensions.WIDTH - lastCloud.xPos > lastCloud.cloudGap &&
                            this.cloudFrequency > Math.random()
                        ) {
                            this.addCloud();
                        }
                        this.clouds = this.clouds.filter(function (obj) {
                            return !obj.remove;
                        });
                    }
                }
                , updateObstacles: function (deltaTime, currentSpeed) {
                    var updatedObstacles = this.obstacles.slice(0);
                    for (var i = 0; i < this.obstacles.length; i++) {
                        var obstacle = this.obstacles[i];
                        obstacle.update(deltaTime, currentSpeed);
                        if (obstacle.remove) {
                            updatedObstacles.shift();
                        }
                    }
                    this.obstacles = updatedObstacles;
                    if (this.obstacles.length > 0) {
                        var lastObstacle = this.obstacles[this.obstacles.length - 1];
                        if (
                            lastObstacle &&
                            !lastObstacle.followingObstacleCreated &&
                            lastObstacle.isVisible() &&
                            lastObstacle.xPos + lastObstacle.width + lastObstacle.gap <
                            this.dimensions.WIDTH
                        ) {
                            this.addNewObstacle(currentSpeed);
                            lastObstacle.followingObstacleCreated = true;
                        }
                    } else {
                        this.addNewObstacle(currentSpeed);
                    }
                }
                , addNewObstacle: function (currentSpeed) {
                    var obstacleTypeIndex = getRandomNum(0, Obstacle.types.length - 1);
                    var obstacleType = Obstacle.types[obstacleTypeIndex];
                    if (
                        this.duplicateObstacleCheck(obstacleType.type) ||
                        currentSpeed < obstacleType.minSpeed
                    ) {
                        this.addNewObstacle(currentSpeed);
                    } else {
                        var obstacleSpritePos = this.spritePos[obstacleType.type];
                        this.obstacles.push(
                            new Obstacle(
                                this.canvasCtx
                                , obstacleType
                                , obstacleSpritePos
                                , this.dimensions
                                , this.gapCoefficient
                                , currentSpeed
                            )
                        );
                        this.obstacleHistory.unshift(obstacleType.type);
                        if (this.obstacleHistory.length > 1) {
                            this.obstacleHistory.splice(
                                Runner.config.MAX_OBSTACLE_DUPLICATION
                            );
                        }
                    }
                }
                , duplicateObstacleCheck: function (nextObstacleType) {
                    var duplicateCount = 0;
                    for (var i = 0; i < this.obstacleHistory.length; i++) {
                        duplicateCount =
                            this.obstacleHistory[i] == nextObstacleType ?
                            duplicateCount + 1 :
                            0;
                    }
                    return duplicateCount >= Runner.config.MAX_OBSTACLE_DUPLICATION;
                }
                , reset: function () {
                    this.obstacles = [];
                    this.horizonLine.reset();
                }
                , resize: function (width, height) {
                    this.canvas.width = width;
                    this.canvas.height = height;
                }
                , addCloud: function () {
                    this.clouds.push(
                        new Cloud(this.canvas, this.spritePos.CLOUD, this.dimensions.WIDTH)
                    );
                }
            , };

            function Cloud(canvas, spritePos, containerWidth) {
                this.canvas = canvas;
                this.canvasCtx = this.canvas.getContext("2d");
                this.spritePos = spritePos;
                this.containerWidth = containerWidth;
                this.xPos = containerWidth;
                this.yPos = 0;
                this.remove = false;
                this.cloudGap = getRandomNum(
                    Cloud.config.MIN_CLOUD_GAP
                    , Cloud.config.MAX_CLOUD_GAP
                );
                this.init();
            }
            Cloud.config = {
                HEIGHT: 14
                , MAX_CLOUD_GAP: 400
                , MAX_SKY_LEVEL: 30
                , MIN_CLOUD_GAP: 100
                , MIN_SKY_LEVEL: 71
                , WIDTH: 46
            , };
            Cloud.prototype = {
                init: function () {
                    this.yPos = getRandomNum(
                        Cloud.config.MAX_SKY_LEVEL
                        , Cloud.config.MIN_SKY_LEVEL
                    );
                    this.draw();
                }
                , draw: function () {
                    this.canvasCtx.save();
                    var sourceWidth = Cloud.config.WIDTH;
                    var sourceHeight = Cloud.config.HEIGHT;
                    if (IS_HIDPI) {
                        sourceWidth = sourceWidth * 2;
                        sourceHeight = sourceHeight * 2;
                    }
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , this.spritePos.x
                        , this.spritePos.y
                        , sourceWidth
                        , sourceHeight
                        , this.xPos
                        , this.yPos
                        , Cloud.config.WIDTH
                        , Cloud.config.HEIGHT
                    );
                    this.canvasCtx.restore();
                }
                , update: function (speed) {
                    if (!this.remove) {
                        this.xPos -= Math.ceil(speed);
                        this.draw();
                        if (!this.isVisible()) {
                            this.remove = true;
                        }
                    }
                }
                , isVisible: function () {
                    return this.xPos + Cloud.config.WIDTH > 0;
                }
            , };

            function HorizonLine(canvas, spritePos) {
                this.spritePos = spritePos;
                this.canvas = canvas;
                this.canvasCtx = canvas.getContext("2d");
                this.sourceDimensions = {};
                this.dimensions = HorizonLine.dimensions;
                this.sourceXPos = [
                    this.spritePos.x
                    , this.spritePos.x + this.dimensions.WIDTH
                , ];
                this.xPos = [];
                this.yPos = 0;
                this.bumpThreshold = 0.5;
                this.setSourceDimensions();
                this.draw();
            }
            HorizonLine.dimensions = {
                WIDTH: 600
                , HEIGHT: 12
                , YPOS: 127
            , };
            HorizonLine.prototype = {
                setSourceDimensions: function () {
                    for (var dimension in HorizonLine.dimensions) {
                        if (IS_HIDPI) {
                            if (dimension != "YPOS") {
                                this.sourceDimensions[dimension] =
                                    HorizonLine.dimensions[dimension] * 2;
                            }
                        } else {
                            this.sourceDimensions[dimension] =
                                HorizonLine.dimensions[dimension];
                        }
                        this.dimensions[dimension] = HorizonLine.dimensions[dimension];
                    }
                    this.xPos = [0, HorizonLine.dimensions.WIDTH];
                    this.yPos = HorizonLine.dimensions.YPOS;
                }
                , getRandomType: function () {
                    return Math.random() > this.bumpThreshold ? this.dimensions.WIDTH : 0;
                }
                , draw: function () {
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , this.sourceXPos[0]
                        , this.spritePos.y
                        , this.sourceDimensions.WIDTH
                        , this.sourceDimensions.HEIGHT
                        , this.xPos[0]
                        , this.yPos
                        , this.dimensions.WIDTH
                        , this.dimensions.HEIGHT
                    );
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , this.sourceXPos[1]
                        , this.spritePos.y
                        , this.sourceDimensions.WIDTH
                        , this.sourceDimensions.HEIGHT
                        , this.xPos[1]
                        , this.yPos
                        , this.dimensions.WIDTH
                        , this.dimensions.HEIGHT
                    );
                }
                , updateXPos: function (pos, increment) {
                    var line1 = pos;
                    var line2 = pos == 0 ? 1 : 0;
                    this.xPos[line1] -= increment;
                    this.xPos[line2] = this.xPos[line1] + this.dimensions.WIDTH;
                    if (this.xPos[line1] <= -this.dimensions.WIDTH) {
                        this.xPos[line1] += this.dimensions.WIDTH * 2;
                        this.xPos[line2] = this.xPos[line1] - this.dimensions.WIDTH;
                        this.sourceXPos[line1] = this.getRandomType() + this.spritePos.x;
                    }
                }
                , update: function (deltaTime, speed) {
                    var increment = Math.floor(speed * (FPS / 1000) * deltaTime);
                    if (this.xPos[0] <= 0) {
                        this.updateXPos(0, increment);
                    } else {
                        this.updateXPos(1, increment);
                    }
                    this.draw();
                }
                , reset: function () {
                    this.xPos[0] = 0;
                    this.xPos[1] = HorizonLine.dimensions.WIDTH;
                }
            , };

            function getRandomNum(min, max) {
                return Math.floor(Math.random() * (max - min + 1)) + min;
            }

            function vibrate(duration) {
                if (IS_MOBILE && window.navigator.vibrate) {
                    window.navigator.vibrate(duration);
                }
            }
            tusdino.hacked.DistanceMeter.dimensions = {
                WIDTH: 10
                , HEIGHT: 13
                , DEST_WIDTH: 11
            , };
            tusdino.hacked.DistanceMeter.yPos = [
                0, 13, 27, 40, 53, 67, 80, 93, 107, 120
            , ];
            tusdino.hacked.DistanceMeter.config = {
                MAX_DISTANCE_UNITS: 5
                , ACHIEVEMENT_DISTANCE: 100
                , COEFFICIENT: 0.025
                , FLASH_DURATION: 1000 / 4
                , FLASH_ITERATIONS: 3
            , };
            tusdino.hacked.DistanceMeter.prototype = {
                init: function (width) {
                    var maxDistanceStr = "";
                    this.calcXPos(width);
                    this.maxScore = this.maxScoreUnits;
                    for (var i = 0; i < this.maxScoreUnits; i++) {
                        this.draw(i, 0);
                        this.defaultString += "0";
                        maxDistanceStr += "9";
                    }
                    this.maxScore = parseInt(maxDistanceStr);
                }
                , calcXPos: function (canvasWidth) {
                    this.x =
                        canvasWidth -
                        DistanceMeter.dimensions.DEST_WIDTH * (this.maxScoreUnits + 1);
                }
                , draw: function (digitPos, value, opt_highScore) {
                    var sourceWidth = DistanceMeter.dimensions.WIDTH;
                    var sourceHeight = DistanceMeter.dimensions.HEIGHT;
                    var sourceX = DistanceMeter.dimensions.WIDTH * value;
                    var sourceY = 0;
                    var targetX = digitPos * DistanceMeter.dimensions.DEST_WIDTH;
                    var targetY = this.y;
                    var targetWidth = DistanceMeter.dimensions.WIDTH;
                    var targetHeight = DistanceMeter.dimensions.HEIGHT;
                    if (IS_HIDPI) {
                        sourceWidth *= 2;
                        sourceHeight *= 2;
                        sourceX *= 2;
                    }
                    sourceX += this.spritePos.x;
                    sourceY += this.spritePos.y;
                    this.canvasCtx.save();
                    if (opt_highScore) {
                        var highScoreX =
                            this.x - this.maxScoreUnits * 2 * DistanceMeter.dimensions.WIDTH;
                        this.canvasCtx.translate(highScoreX, this.y);
                    } else {
                        this.canvasCtx.translate(this.x, this.y);
                    }
                    this.canvasCtx.drawImage(
                        this.image
                        , sourceX
                        , sourceY
                        , sourceWidth
                        , sourceHeight
                        , targetX
                        , targetY
                        , targetWidth
                        , targetHeight
                    );
                    this.canvasCtx.restore();
                }
                , getActualDistance: function (distance) {
                    return distance ? Math.round(distance * this.config.COEFFICIENT) : 0;
                }
                , update: function (deltaTime, distance) {
                    var paint = true;
                    var playSound = false;
                    if (!this.acheivement) {
                        distance = this.getActualDistance(distance);
                        if (
                            distance > this.maxScore &&
                            this.maxScoreUnits == this.config.MAX_DISTANCE_UNITS
                        ) {
                            this.maxScoreUnits++;
                            this.maxScore = parseInt(this.maxScore + "9");
                        } else {
                            this.distance = 0;
                        }
                        if (distance > 0) {
                            if (distance % this.config.ACHIEVEMENT_DISTANCE == 0) {
                                this.acheivement = true;
                                this.flashTimer = 0;
                                playSound = true;
                            }
                            var distanceStr = (this.defaultString + distance).substr(
                                -this.maxScoreUnits
                            );
                            this.digits = distanceStr.split("");
                        } else {
                            this.digits = this.defaultString.split("");
                        }
                    } else {
                        if (this.flashIterations <= this.config.FLASH_ITERATIONS) {
                            this.flashTimer += deltaTime;
                            if (this.flashTimer < this.config.FLASH_DURATION) {
                                paint = false;
                            } else if (this.flashTimer > this.config.FLASH_DURATION * 2) {
                                this.flashTimer = 0;
                                this.flashIterations++;
                            }
                        } else {
                            this.acheivement = false;
                            this.flashIterations = 0;
                            this.flashTimer = 0;
                        }
                    }
                    if (paint) {
                        for (var i = this.digits.length - 1; i >= 0; i--) {
                            this.draw(i, parseInt(this.digits[i]));
                        }
                    }
                    this.drawHighScore();
                    return playSound;
                }
                , drawHighScore: function () {
                    this.canvasCtx.save();
                    this.canvasCtx.globalAlpha = 0.8;
                    for (var i = this.highScore.length - 1; i >= 0; i--) {
                        this.draw(i, parseInt(this.highScore[i], 10), true);
                    }
                    this.canvasCtx.restore();
                }
                , setHighScore: function (distance) {
                    distance = this.getActualDistance(distance);
                    var highScoreStr = (this.defaultString + distance).substr(
                        -this.maxScoreUnits
                    );
                    this.highScore = ["10", "11", ""].concat(highScoreStr.split(""));
                }
                , reset: function () {
                    this.update(0);
                    this.acheivement = false;
                }
            , };

            var Trex = tusdino.hacked.Trex;
            var DistanceMeter = tusdino.hacked.DistanceMeter;
            var Obstacle = tusdino.hacked.Obstacle;
            var Horizon = tusdino.hacked.Horizon;

            Runner.instance_.init = function () {
                hackedInit.call(Runner.instance_);
            };
            Runner.instance_.init();

            function customUpdate() {
                if (document.getElementById("shareBlock")) {
                    var sb = document.getElementById("shareBlock");
                    sb.style.display = "none";
                }
                this.drawPending = false;
                var now = getTimeStamp();
                var deltaTime = now - (this.time || now);
                this.time = now;
                if (this.activated) {
                    this.clearCanvas();
                    if (this.tRex.jumping) {
                        this.tRex.updateJump(deltaTime);
                    }
                    this.runningTime += deltaTime;
                    var hasObstacles = this.runningTime > this.config.CLEAR_TIME;
                    if (this.tRex.jumpCount == 1 && !this.playingIntro) {
                        this.playIntro();
                    }
                    if (this.playingIntro) {
                        this.horizon.update(0, this.currentSpeed, hasObstacles);
                    } else {
                        deltaTime = !this.started ? 0 : deltaTime;
                        this.horizon.update(deltaTime, this.currentSpeed, hasObstacles);
                    }
                    var collision =
                        hasObstacles &&
                        checkForCollision(this.horizon.obstacles[0], this.tRex);
                    if (!collision) {
                        this.distanceRan +=
                            (this.currentSpeed * deltaTime) / this.msPerFrame;
                        if (this.currentSpeed < this.config.MAX_SPEED) {
                            this.currentSpeed += this.config.ACCELERATION;
                        }
                    } else {
                        if (tusdino.cheats.obliterate) {
                            Runner.instance_.horizon.obstacles.length > 0 ?
                                (Runner.instance_.horizon.obstacles =
                                    Runner.instance_.horizon.obstacles.slice(
                                        1
                                        , Runner.instance_.horizon.obstacles.length
                                    )) :
                                "";
                        } else if (tusdino.cheats.obstacleBypass) {
                            Runner.instance_.tRex.xPos +=
                                Runner.instance_.horizon.obstacles[0].xPos / 2;
                            setTimeout(() => {
                                Runner.instance_.tRex.xPos = x;
                            }, 100);
                        } else {
                            this.gameOver();
                        }
                    }
                    var playAcheivementSound = this.distanceMeter.update(
                        deltaTime
                        , Math.ceil(this.distanceRan)
                    );
                    if (playAcheivementSound) {
                        this.playSound(this.soundFx.SCORE);
                    }
                }
                if (!this.crashed) {
                    this.tRex.update(deltaTime);
                    if (this.raq) this.raq();
                }
            }

            function customRestart() {
                if (!this.raqId) {
                    this.playCount++;
                    this.runningTime = 0;
                    this.activated = true;
                    this.crashed = false;
                    this.distanceRan = 0;
                    this.setSpeed(this.config.SPEED);
                    this.time = getTimeStamp();
                    this.containerEl.classList.remove(Runner.classes.CRASHED);
                    this.clearCanvas();
                    this.distanceMeter.reset(this.highestScore);
                    this.horizon.reset();
                    this.tRex.reset();
                    this.playSound(this.soundFx.BUTTON_PRESS);
                    this.update();
                    x = Runner.instance_.tRex.xPos;
                }
            }

            Runner.instance_.restart = function () {
                customRestart.call(Runner.instance_);
            };

            if (Runner.instance_.started) {
                Runner.instance_.restart();
            }
            var oldVisChange = Runner.instance_.onVisibilityChange;
            Runner.instance_.onVisibilityChange = function (e) {
                if (!tusdino.cheats.forcefocus) {
                    oldVisChange.bind(this)(e);
                }
            };

            Runner.instance_.startGame = function () {
                this.runningTime = 0;
                this.playingIntro = false;
                this.tRex.playingIntro = false;
                this.containerEl.style.webkitAnimation = "";
                this.playCount++;
                document.addEventListener(
                    Runner.events.VISIBILITY
                    , this.onVisibilityChange.bind(this)
                );
                window.addEventListener(
                    Runner.events.BLUR
                    , this.onVisibilityChange.bind(this)
                );
                window.addEventListener(
                    Runner.events.FOCUS
                    , this.onVisibilityChange.bind(this)
                );
                x = Runner.instance_.tRex.xPos;
            };

            Runner.instance_.tRex.draw = function (x, y) {
                if (tusdino.cheats.rainbowglow) {
                    hslStart = true;
                    this.canvasCtx.shadowColor = hslCol;
                    this.canvasCtx.shadowOffsetX = 0;
                    this.canvasCtx.shadowOffsetY = 0;
                    this.canvasCtx.shadowBlur = 15;
                }
                if (tusdino.cheats.glow) {
                    this.canvasCtx.shadowColor = "yellow";
                    this.canvasCtx.shadowOffsetX = 0;
                    this.canvasCtx.shadowOffsetY = 0;
                    this.canvasCtx.shadowBlur = 15;
                }
                var sourceX = x;
                var sourceY = y;
                var sourceWidth =
                    this.ducking && this.status != Trex.status.CRASHED ?
                    this.config.WIDTH_DUCK :
                    this.config.WIDTH;
                var sourceHeight = this.config.HEIGHT;
                if (IS_HIDPI) {
                    sourceX *= 2;
                    sourceY *= 2;
                    sourceWidth *= 2;
                    sourceHeight *= 2;
                }
                sourceX += this.spritePos.x;
                sourceY += this.spritePos.y;
                if (this.ducking && this.status != Trex.status.CRASHED) {
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , sourceX
                        , sourceY
                        , sourceWidth
                        , sourceHeight
                        , this.xPos
                        , this.yPos
                        , this.config.WIDTH_DUCK
                        , this.config.HEIGHT
                    );
                } else {
                    if (this.ducking && this.status == Trex.status.CRASHED) {
                        this.xPos++;
                    }
                    this.canvasCtx.drawImage(
                        Runner.imageSprite
                        , sourceX
                        , sourceY
                        , sourceWidth
                        , sourceHeight
                        , this.xPos
                        , this.yPos
                        , this.config.WIDTH
                        , this.config.HEIGHT
                    );
                }
                if (tusdino.cheats.rainbowglow) {
                    this.canvasCtx.shadowColor = "";
                    this.canvasCtx.shadowOffsetX = 0;
                    this.canvasCtx.shadowOffsetY = 0;
                    this.canvasCtx.shadowBlur = 0;
                }
                if (tusdino.cheats.glow) {
                    this.canvasCtx.shadowColor = "";
                    this.canvasCtx.shadowOffsetX = 0;
                    this.canvasCtx.shadowOffsetY = 0;
                    this.canvasCtx.shadowBlur = 0;
                }
            };

            Runner.instance_.update = function () {
                customUpdate.call(Runner.instance_);
                if (!tusdino.cheats.forcepause) {
                    if (tusdino.cheats.obstacleFloat) {
                        if (Runner.instance_.horizon.obstacles[0]) {
                            for (var i in Runner.instance_.horizon.obstacles) {
                                Runner.instance_.horizon.obstacles[i].yPos = 25;
                            }
                        }
                    }

                    if (tusdino.cheats.objectEsp) {
                        var ctx = Runner.instance_.canvasCtx;
                        if (Runner.instance_.horizon.obstacles[0]) {
                            for (var i in Runner.instance_.horizon.obstacles) {
                                ctx.beginPath();
                                ctx.strokeStyle = "#EB5834";
                                ctx.strokeRect(
                                    Runner.instance_.horizon.obstacles[i].xPos - 1
                                    , Runner.instance_.horizon.obstacles[i].yPos - 0.5
                                    , Runner.instance_.horizon.obstacles[i].width + 3
                                    , Runner.instance_.horizon.obstacles[i].typeConfig.height + 2
                                );
                                ctx.stroke();
                            }
                        }
                    }

                    if (tusdino.cheats.rainbowSquarePlayer) {
                        Runner.instance_.canvasCtx.beginPath();
                        hslStart = true;
                        Runner.instance_.canvasCtx.fillStyle = hslCol;
                        Runner.instance_.canvasCtx.fillRect(
                            Runner.instance_.tRex.xPos
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.yPos + 15 :
                            Runner.instance_.tRex.yPos
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.config.WIDTH_DUCK + 2 :
                            Runner.instance_.tRex.config.WIDTH + 2
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.config.HEIGHT_DUCK + 2 :
                            Runner.instance_.tRex.config.HEIGHT + 2
                        );
                        Runner.instance_.canvasCtx.closePath();
                    }
                    if (tusdino.cheats.arc) {
                        Runner.instance_.canvasCtx.beginPath();
                        Runner.instance_.canvasCtx.strokeStyle = "#FF0000";
                        Runner.instance_.canvasCtx.arc(
                            Runner.instance_.tRex.xPos + 23
                            , Runner.instance_.tRex.yPos + 20
                            , 30
                            , 0
                            , 2 * Math.PI
                        );
                        Runner.instance_.canvasCtx.stroke();
                    }

                    if (tusdino.cheats.watermark) {
                        var ctx = Runner.instance_.canvasCtx;

                        function ff() {
                            ctx.beginPath();
                            ctx.globalAlpha = 0.6;
                            ctx.fillStyle = "#212121";
                            ctx.fillRect(4, 4, 70, 30);
                            ctx.globalAlpha = 1;
                            ctx.closePath();
                        }

                        function dd() {
                            ctx.beginPath();
                            ctx.globalAlpha = 0.6;
                            ctx.strokeStyle = "#425AF5";
                            ctx.strokeRect(3, 3, 72, 32);
                            ctx.globalAlpha = 1;
                            ctx.closePath();
                        }

                        function hh() {
                            ctx.beginPath();
                            ctx.globalAlpha = 1;
                            ctx.fillStyle = "#FFFFFF";
                            ctx.font = "bolder 15px sans-serif";
                            ctx.fillText(atob("VHVzRGlubw=="), 10, 24, 25252);
                            ctx.globalAlpha = 1;
                            ctx.closePath();
                        }
                        dd();
                        ff();
                        hh();
                    }
                    if (Runner.instance_.horizon.obstacles[0] && tusdino.cheats.tracer) {
                        for (var i in Runner.instance_.horizon.obstacles) {
                            Runner.instance_.canvasCtx.beginPath();
                            hslStart = true;
                            Runner.instance_.canvasCtx.moveTo(
                                Runner.instance_.tRex.xPos + 23
                                , Runner.instance_.tRex.yPos + 10
                            );
                            Runner.instance_.canvasCtx.lineTo(
                                Runner.instance_.horizon.obstacles[i].xPos + 10
                                , Runner.instance_.horizon.obstacles[i].yPos + 10
                            );
                            Runner.instance_.canvasCtx.strokeStyle = hslCol;
                            Runner.instance_.canvasCtx.stroke();
                        }
                    }
                    if (
                        Runner.instance_.horizon.obstacles[0] &&
                        tusdino.cheats.lazervisual
                    ) {
                        if (!laz) laz = Runner.instance_.horizon.obstacles[0];
                        Runner.instance_.canvasCtx.beginPath();
                        Runner.instance_.canvasCtx.moveTo(
                            Runner.instance_.tRex.xPos + 23
                            , Runner.instance_.tRex.yPos + 10
                        );
                        Runner.instance_.canvasCtx.lineTo(laz.xPos + 10, laz.yPos + 10);
                        Runner.instance_.canvasCtx.strokeStyle = "Red";
                        Runner.instance_.canvasCtx.stroke();
                        if (tusdino.cheats.lazer)
                            Runner.instance_.horizon.obstacles.length > 0 ?
                            (Runner.instance_.horizon.obstacles =
                                Runner.instance_.horizon.obstacles.slice(
                                    1
                                    , Runner.instance_.horizon.obstacles.length
                                )) :
                            "";
                        tusdino.cheats.lazer = false;
                    }
                    if (
                        Runner.instance_.horizon.obstacles[0] &&
                        tusdino.cheats.notifier
                    ) {
                        for (var i in Runner.instance_.horizon.obstacles) {
                            Runner.instance_.canvasCtx.beginPath();
                            Runner.instance_.canvasCtx.moveTo(
                                Runner.instance_.horizon.obstacles[i].xPos - 70
                                , 130
                            );
                            Runner.instance_.canvasCtx.lineTo(
                                Runner.instance_.horizon.obstacles[i].xPos - 40
                                , 130
                            );
                            Runner.instance_.canvasCtx.strokeStyle = "Blue";
                            Runner.instance_.canvasCtx.stroke();
                        }
                    }
                    if (tusdino.cheats.esp) {
                        Runner.instance_.canvasCtx.beginPath();
                        Runner.instance_.canvasCtx.strokeStyle = "Red";
                        Runner.instance_.canvasCtx.rect(
                            Runner.instance_.tRex.xPos
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.yPos + 15 :
                            Runner.instance_.tRex.yPos
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.config.WIDTH_DUCK + 2 :
                            Runner.instance_.tRex.config.WIDTH + 2
                            , Runner.instance_.tRex.ducking ?
                            Runner.instance_.tRex.config.HEIGHT_DUCK + 2 :
                            Runner.instance_.tRex.config.HEIGHT + 2
                        );
                        Runner.instance_.canvasCtx.stroke();
                    }
                }
            };

            // Style and UI
            var StylePanel = document.createElement("style");
            StylePanel.innerHTML = `
        #tradingmenu hr {
    border: solid 0.1px white;
    border-radius: 66px;
}
#tradingpagesettings button {
    border-radius: 0;
    color: #adadad;
    border: solid 2px #adadad;
}
        .tradingshow button {
    background: none;
    border: solid 1px #a7a7ff;
    color: #a7a7ff;
    padding: 7px;
    transition: 0.5s;
    cursor: pointer;
    height: 30px;
    float: initial;
    border-radius: 20px;
    padding-left: 18px;
    padding-right: 18px;
        }
#tradingmenuheader {
    line-height: 1.13;
}
        .tradingshow .tradingcheckbox {
            background: none;
    border: solid 1px #1212a5;
    color: #0101ab;
    margin-bottom:5px;
    padding: 7px;
    transition: 0.5s;
    cursor: pointer;
    border-radius: 90px;
    padding-left: 18px;
    padding-right: 18px;
        }
        .tradingshow .tradingcheckbox:hover {
    background: none;
    border: solid 1px #1313b9;
    color: #0404cb;
    padding: 7px;
    transition: 0.5s;
    cursor: pointer;
    border-radius: 90px;
    padding-left: 18px;
    padding-right: 18px;
        }
        .swal2-container {
        z-index: 100000000000000000000;
        }
        .tradingshow button:hover {
    border: solid 1px #7d7dff;
    transition: 0.5s;
    color: #8080ff;
        }
        .tradingshow input::placeholder {
           color: #8272bf;
           opacity:0.8;
           transition:1s;
        }
        .tradingshow input:focus::placeholder {
    color: #86c7ff;
           transition:1s;
        }
        .tradingshow input:focus {
    border-color: #86c7ff;
    transition: 1s;
}
        .tradingshow input {
          padding: 7px;
    transition: 1s;
    outline: none;
    margin-bottom:5px;
          border-radius: 20px;
       border: solid 1px #a7a7ff;
       color: #a7a7ff;
    background: transparent;
    }
        .tradingtab {
    font-weight: 700;
    padding: 0px;
    border-radius: 0px;
    height: -webkit-fill-available;
    width: 100px;
    line-height: 2;
    font-family: system-ui;
                margin:0;
    background: transparent;
    font-size: 15px;
    cursor: pointer;
    border: none;
    ${
      // Gone for now
      /*
        `border-left: solid 1px #9191ff;
    border-right: solid 1px #9191ff;
    `
    */
      ``
    }
    color: #855dff;
}
.tradingpage {
text-align: left;
    z-index: -1;
    display: none;
}
.tradingshow {
    z-index: 1;
    padding: 10px;
    font-weight: 400;
    display: block;
}
.tradinginputset {
    display: inline-flex;
}
.tradinginputset button {
    margin-bottom:5px;
    border-top-right-radius: 0px;
    border-bottom-right-radius: 0px;
}
.tradinginputset select {
    background: none;
    border: solid 1px #a7a7ff;
    color: #a7a7ff;
    padding: 7px;
    transition: 0.5s;
    cursor: pointer;
    width: 120px;
    outline: none;
    height: 30px;
    float: initial;
    text-align: center;
    border-radius: 20px;
    border-bottom-left-radius: 0px;
    border-top-left-radius: 0px;
    padding-left: 18px;
    padding-right: 18px;
}
#tradingborder {
    background: linear-gradient(45deg, #a9b8ff, #4b10ff);
    height: 2px;
   animation: an 30s ease infinite;
   background-size: 1000% 1000%;
}


.tradingactive {
 filter: brightness(1.2);
 font-weight: 400;
}
            #tradingmenu {
            color: white;
            font-weight: 400;
            font-size: initial;
            font-family: sans-serif;
            }
            #tradingmenu *:not(button, input, .tradingtab) {
                cursor:default;
                margin:0;
    box-sizing: revert;
            }
            #tradingmenu a {
                color: white;
    text-decoration: underline;
    cursor: pointer;
            }
.tradingshow input {
        margin:0;
    border-top-left-radius: 0px;
    border-bottom-left-radius: 0px;
    font-size: 13px;
    box-sizing: revert;
    line-height: 14px;
    cursor: text;
    margin-bottom:5px;
}
        .tradingshow button {
        margin:0;
    font-size: 13px;
    line-height: 14px;
    box-sizing: revert;
        cursor: pointer;
           margin-bottom:5px;
        }`;
            var Panel = document.createElement("div");
            Panel.innerHTML = `<div style="transform: scale(0.8); top: 98px; position: fixed; left: 309px; z-index: 2147483647;" id="tradingmenu">
  <div style="
    height: 353px;
    font-weight: bolder;
    width: 599px;
    background: #1a1a1a;
">
    <div style="">
      <div style="
    font-size: 20px;
    font-family: revert;
    padding-top: 6px;
    padding-left: 6px;
    padding-bottom: 4px;
" id="tradingmenuheader">${atob("VHVzRGlubw==")} - <i style="
    font-size: 16px;
">${tusdino.info.version} [By ${atob(
        "TGFwaWRl"
      )}]</i><img src="https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/assets/Logo.png?raw=true" style="height: 24px;position: fixed;display: inline;margin-top: -2px;margin-left: 2px;right: 274px;margin-right: 3px;"><a href="https://discord.gg/6eaDrx5J9s" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 11px;
    cursor: pointer;
">Discord</a><a href="https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 10px;
    cursor: pointer;
">Github</a><a href="https://www.youtube.com/channel/UCRA3KXViuDmsmfuP0RF45_w?sub_confirmation=1" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 10px;
    cursor: pointer;
">YouTube</a>
      </div>
      <div id="tradingborder" style="
"></div>
      <div id="trading_contents" style="">
        <div style="
    height: 44px;
    outline: none;
    display: flex;
    overflow-x: auto;
    background: #16161a;
    border-bottom: solid 2px #6e6dc7;
">
          <button tab="main" title="Cheats that effect the player" class="tradingtab tradingactive">Player</button>
          <button tab="game" title="Cheats that effect the whole game" class="tradingtab">Game</button>
          <button tab="movement" title="Cheats that effect the movement" class="tradingtab">Movement</button>
          <button tab="visual" title="Cheats that effect the visuals of the game" class="tradingtab">Visuals</button>
          <button tab="misc" title="Cheats and utilities to better edit the game, or just random cheats to bug the game (Random cheats I created)" class="tradingtab">Miscs/Special</button>
          <button tab="other" title="Cheats that can help out in the game or for fun. There will also be unkown cheats in this tab" class="tradingtab">Others</button>
          <button tab="settings" title="Change the settings of cheats or the UI. Or TusDino in general [COMING SOON]" class="tradingtab">Settings</button>
        </div>
        <div>
        <div style="
    background: #161616;
    height: 223px;
    overflow-y: auto;
" id="tradingtabs">

          <div class="tradingshow" id="tradingpagemain" style="">
 <button id="instantrespawn" class="tradingcheckbox" title="Instantly respawns when you die">Instant Respawn - OFF</button>
     <button id="invisibilitycheat" class="tradingcheckbox" title="Makes the player invisible">Invisibility - OFF</button>
     <button id="bhop" class="tradingcheckbox" title="Makes the player jump automatically">Bhop - OFF</button>
    <div class="tradinginputset"><button id="setxaxis" title="Changes the players X axis">Teleport X axis</button><input id="setxaxischeatinput" style="
    width: 78px;" value = "0" placeholder="0"></div>
     <button id="restartgame" title="Need a restart? Try this, it will force your player to respawn">Restart</button>
    <div class="tradinginputset"><button id="setyaxis" title="Changes the players Y axis">Teleport Y axis</button><input id="setyaxischeatinput" style="
    width: 78px;" value = "93" placeholder="93"></div>
 <button id="killplayer" title="Instantly kills your T-Rex player">Kill Player</button>
 <button id="autoplayer" class="tradingcheckbox" title="Make a bot play for you (Note: This isn't the best autoplayer, it will still lose sometimes, we might change this to a better autoplayer)">Autoplayer - OFF</button>
 <button id="largerdino" class="tradingcheckbox" disabled title="Makes the dino bigger and larger">Larger Dino (COMING SOON) - OFF</button>
 <button id="smallerdino" class="tradingcheckbox" title="(COMING SOON)" disabled>Smaller Dino (COMING SOON) - OFF</button>
  <div class="tradinginputset"><button id="setgravity" title="Change the gravity of the tRex to whatever you want">Set Gravity</button><input id="setgravitycheatinput" style="
    width: 78px;" value = "0.6" placeholder="0.6"></div>
      <div class="tradinginputset"><button id="setskin" title="Changes the dino skin to a list of skins, this will soon be customizable">Set Skin (Buggy)</button><select id="setskincheatselect">
      <option value="default">Default</option>
      <option value="batman">Batman Colored</option>
      <option value="sonic">Sonic</option>
      <option value="soniccol">Sonic Colored</option>
      <option value="soniccol2">Sonic Colored (2)</option>
      <option value="dinocol">Dino Colored</option>
      <option value="dinocol2">Dino Colored (2)</option>
      <option value="godzilla">Godzilla Colored</option>
      <option value="joker">Joker Colored</option>
      <option value="mario">Mario</option>
      <option value="mariocol">Mario Colored</option>
      <option value="mario2">Mario (2)</option>
      <option value="mariocol2">Mario Colored (2)</option>
      <option value="minecraft">Minecraft</option>
      <option value="naruto">Naruto Colored</option>
      <option value="noface">Noface Halloween</option>
      <option value="nyancat">Nyan Cat</option>
      <option value="pikachu">Pikachu</option>
      <option value="santa">Santa Colored</option>
      <option value="pikachucol">Pikachu Colored</option>
      </select>
      </div>
          </div>

          <div class="tradingpage" id="tradingpageother" style="">
          <button id="toggledarkmode" title="Enable or disable in-game dark mode (Developed by inon13, modified by Lapide)">Dark Game Mode - OFF</button>
 <button id="noobstacle" class="tradingcheckbox" title="Removes all nearby obstacles">No Obstacle - OFF</button>
     <button id="lazervison" title="It remove the nearest obstacle, with a lazer">Lazer Vision</button>
     <button id="lazervisonkey" class="tradingcheckbox" title="If you press L, it will active lazer vison">Lazer Vision Key (L) - OFF</button>
 <button id="noclip" class="tradingcheckbox" title="You can phase thru any object and enemy">No Clip - OFF</button>
 <button id="obliterate" class="tradingcheckbox" title="When the player collides with the obstacle, the obstacle gets destroyed instead of the player">Obliterate Obstacles - OFF</button>
               <button id="addcloud" title="Forces a cloud into the game">Add Cloud</button>
               <button id="removecloud" title="Removes the newest cloud">Remove Cloud</button>
               <button id="removeallcloud" title="Removes all clouds">Remove All Clouds</button>
               <button id="removeallobstacle" title="Removes all near-by obstacles">Remove Near Obstacles</button>
               <button id="removeobstacle" title="Removes the nearest obstacle">Remove Obstacle</button>
               <button id="addobstacle" title="Creates a new obstacle">Add Obstacle</button>
          <p>
          </div>
          <div class="tradingpage" id="tradingpagesettings" style="">
          <div style="margin-bottom: 19px;">
    <h2><img src="https://cdn.glitch.global/4aba5d04-d76d-4769-bec8-f2da58f4b0ac/SettingsIcon.png?v=1680464901415" height="30" style="
    position: relative;
    top: 7px;
">Settings</h2>
</div>

<div><button id="tradingcredits">Credits</button>
<br>
<div class="tradinginputset"><button id="setmenuscale" title="Changes the mod menu's scale (Developed by inon13)">Set Menu Scale</button><input id="setmenuscaleinput" style="
    width: 78px;" min="0.7" max="1.2" value="0.9" placeholder="0.9" type = "number" step="0.1"></div>

</div>
<br>
<hr><br><a href="https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/issues/new">Report an issue</a> • <a href="https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/discussions/new?category=suggestions">Suggest option</a> • <a href="https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/fork">Fork the Github</a>
          </div>
          <div class="tradingpage" id="tradingpagemisc" style="">
 <button id="rainbowbackground" class="tradingcheckbox" title="Make the background become rainbow">Rainbow Background - OFF</button>
 <button id="rainbowsquareplayer" class="tradingcheckbox" title="Make the player become rainbow square">Rainbow Square Player - OFF</button>
 <button id="stormcloud" class="tradingcheckbox" title="Continuously spam clouds in the sky">Storm Cloud - OFF</button>
 <button id="obstacleFloat" class="tradingcheckbox" title="Makes all near-by obstacles go up in the air">Obstacle Float - OFF</button>
 <button id="arc" class="tradingcheckbox" title="Puts a red circle ring around the player">Arc - OFF</button>
          </div>
          <div class="tradingpage" id="tradingpagemovement" style="">
<div class="tradinginputset"><button id="setspeed" title="Sets your players speed, if you put too much it can bug out">Set Speed</button><input id="setspeedcheatinput" style="
    width: 78px;" value = "6.5" placeholder="6.5"></div>
 <button id="glide" class="tradingcheckbox" title="Make's your player glide into the air and fly until ducking (Suggested & created by inon13)">Glide - OFF</button>
 <button id="fly" class="tradingcheckbox" title="You now have the ability to fly! You can use 'W' to go higher and 'S' to go lower">Fly - OFF</button>
 <button id="highjump" class="tradingcheckbox" title="Makes you jump higher">High Jump - OFF</button>
 <button id="fastfall" class="tradingcheckbox" title="You can fall more faster">Fast Fall - OFF</button>
 <button id="walk" class="tradingcheckbox" title="You now have the ability to get out of the window and walk use 'A' to go left and 'D' to go right">Walk - OFF</button>
 <button id="obstacleBypass" class="tradingcheckbox" title="This cheat makes you zoom thru the obstacles">Obstacle Bypass - OFF</button>
<div class="tradinginputset"><button id="setwalkspeed" title="Set the walk cheats speed">Set Walk Speed (Walk Cheat)</button><input id="setwalkspeedcheatinput" style="
    width: 78px;" value = "1" placeholder="1"></div>

<div class="tradinginputset"><button id="setflyspeed" title="Set the fly cheats speed">Set Fly Speed (Fly Cheat)</button><input id="setflyspeedcheatinput" style="
    width: 78px;" value = "1" placeholder="1"></div>
 <button id="blockyjump" class="tradingcheckbox" title="You can have a robotic jump">Blocky Jump - OFF</button>
 <button id="airjump" class="tradingcheckbox" title="You can jump forever non-stop">Airjump - OFF</button>
          </div>
          <div class="tradingpage" id="tradingpagevisual" style="">
 <button id="esp" class="tradingcheckbox" title="This cheat shows a box around you">ESP - OFF</button>
 <button id="tracers" class="tradingcheckbox" title="Lines go from you to all the obstacles">Tracers - OFF</button>
     <button id="glow" class="tradingcheckbox" title="Makes the player have a yellow glow around them">Glow - OFF</button>
     <button id="rainbowglow" class="tradingcheckbox" title="Makes the player have a rainbow glow around them">Rainbow Glow - OFF</button>
 <button id="jumpnotifier" class="tradingcheckbox" title="Small lines on the screen tell you where to jump">Jump Notifier - OFF</button>
 <button id="watermark" class="tradingcheckbox" title="A watermark to show you're using TusDino">Watermark - ON </button>
 <button id="obstacleesp" class="tradingcheckbox" title="ESP for obstacles">Obstacle ESP - OFF</button>
          </div>
          <div class="tradingpage" id="tradingpagegame" style="">
<div class="tradinginputset"><button id="setfps" title="Sets your games FPS, which will make it faster">Set FPS</button><input id="setfpscheatinput" style="
    width: 78px;" value = "60" placeholder="60"></div>
 <button id="autofocus" class="tradingcheckbox" title="Automatically focuses on the game whenever you switch out from the tab, it will still play and not pause">Auto Focus - OFF</button>
 <button id="forcefocus" class="tradingcheckbox" title="Just like auto focus, but this time ignores if you ever switched tabs">Force Focus - OFF</button>
          <div class="tradinginputset"><button id="setgamespeed" title="Sets your games speed, if you put too much it can bug out">Set Game Speed</button><input id="setgamespeedcheatinput" style="
    width: 78px;" value = "0.001" placeholder="0.001"></div>
 <button id="duckAndJump" class="tradingcheckbox" title="You can still jump when ducking">Duck and Jump - OFF</button>
 <button id="playingIntro" class="tradingcheckbox" title="Still get scored while your player is inactive">Playing Intro - OFF</button>
                <div style=""class="tradinginputset"><button id="setscore" title="Sets your players score" style="">Set Score</button><input id="setscorecheatinput" style="
    width: 78px;" value = "999999" placeholder="999999"></div><div style=""class="tradinginputset"><button id="sethighscore" title="Sets your players highest score (Suggested & created by inon13)" style="">Set Highest Score</button><input id="sethighscorecheatinput" style="
    width: 78px;" value = "999999" placeholder="999999"></div>
 <button id="mutegame" class="tradingcheckbox" title="Use this if you're tired of hearing the sound">Mute Game - OFF</button>
 <button id="forcepausegame" class="tradingcheckbox" title="Need to pause the game and everything in the game? Use this">Force Pause Game - OFF</button>
 <button id="pausegame" class="tradingcheckbox" title="Need to pause the game and everything in the game? Use this">Pause - OFF</button>
 <div class="tradinginputset"><button id="setscorespeed" title="This will change how fast your score adds up">Set Score Speed</button><input id="setscorespeedcheatinput" style="
    width: 78px;" value = "30" placeholder="30"></div>
<div class="tradinginputset"><button id="setgroundy" title="Change the Y position of the ground">Set Ground Y</button><input id="setgroundycheatinput" style="
    width: 78px;" value = "93" placeholder="93"></div>
          </div>

        </div>
        <div style="
    border-top: solid 1px #4f4fe9;
    font-weight: 100;
    display: flex;
    color: #6b6bff;
    justify-content: space-between;
"><div style="
    color: white;
    text-align: left;

    line-height: 3.4;
    font-size: 14px;
    margin-left: 6px;
"><a href="https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/issues/new">Report an issue</a> • <a href="https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/discussions/new?category=suggestions">Suggest option</a> • <a href="https://github.com/Fault-Utilities/TusDino-Chrome-Dino-Mod-Menu/fork">Fork the Github</a>
          </div><div style="
    align-self: center;
    font-size: 14px;
    margin-right: 7px;
    background: transparent;
    " title="Info">*J to hide/show the menu*<br>Version: ${
      tusdino.info.version
    }<br>Game URL: ${location.hostname}</div></div>
        </div>
      </div>
    </div>
  </div>
  <div style="
    height: 359px;
    width: 603px;
    top: -3px;
    left: -2px;
    z-index: -1;
    position: inherit;
    background: linear-gradient(45deg, #a9b8ff, #4b10ff);
"></div>
</div>`;
            document.body.prepend(Panel);
            document.body.prepend(StylePanel);

            function dragElement(elmnt) {
                var pos1 = 0
                    , pos2 = 0
                    , pos3 = 0
                    , pos4 = 0;
                if (document.getElementById(elmnt.id + "header")) {
                    document.getElementById(elmnt.id + "header").onmousedown =
                        dragMouseDown;
                } else {
                    elmnt.onmousedown = dragMouseDown;
                }

                function dragMouseDown(e) {
                    e = e || window.event;
                    e.preventDefault();
                    pos3 = e.clientX;
                    pos4 = e.clientY;
                    document.onmouseup = closeDragElement;
                    document.onmousemove = elementDrag;
                }

                function elementDrag(e) {
                    e = e || window.event;
                    e.preventDefault();
                    pos1 = pos3 - e.clientX;
                    pos2 = pos4 - e.clientY;
                    pos3 = e.clientX;
                    pos4 = e.clientY;
                    elmnt.style.top = elmnt.offsetTop - pos2 + "px";
                    elmnt.style.left = elmnt.offsetLeft - pos1 + "px";
                }

                function closeDragElement() {
                    document.onmouseup = null;
                    document.onmousemove = null;
                }
            }
            var hslI = 0;
            var hslCol = "rgb(0, 74 55)";
            var hslUp = false;
            var hslUp2 = false;
            var laz = false;
            var hslStart = false;

            setInterval(() => {
                if (hslStart) {
                    hslUp = hslUp ? hslI > -1 : hslI < 361;
                    hslCol = "rgb(" + HSLToRGB(hslI, 74, 55).join(", ") + ")";
                    if (hslUp) {
                        ++hslI;
                    } else {
                        --hslI;
                    }
                }
            });

            Runner.instance_.clearCanvas = function () {
                tusdino.saved.clearCanvas.call(this);
            };
            for (
                var i = 0; i < document.getElementsByClassName("tradingtab").length;
                ++i
            ) {
                document
                    .getElementsByClassName("tradingtab")[i].addEventListener("click", function () {
                        for (
                            var gg = 0; gg < document.getElementsByClassName("tradingshow").length;
                            ++gg
                        ) {
                            document.getElementsByClassName("tradingshow")[gg].className =
                                "tradingpage";
                        }
                        for (
                            var bb = 0; bb < document.getElementsByClassName("tradingactive").length;
                            ++bb
                        ) {
                            document.getElementsByClassName("tradingactive")[bb].className =
                                "tradingtab";
                        }
                        // console.log(this);
                        this.classList.add("tradingactive");
                        document.getElementById(
                            "tradingpage" + this.getAttribute("tab")
                        ).className = "tradingshow";
                    });
            }
            dragElement(Panel.children[0]);
            var show = false;
            document.addEventListener("keydown", function (e) {
                //console.log(e);
                if (
                    e.key.toLowerCase() == tusdino.config.hotkeys.togglemenu &&
                    (e.path ? e.path[0].tagName != "INPUT" : e)
                ) {
                    show = !show;
                    Panel.style.display = show ? "block" : "none";
                }
                if (tusdino.cheats.lazerv) {
                    if (e.key.toLowerCase() == "l") {
                        tusdino.cheats.lazervisual = true;
                        tusdino.cheats.lazer = true;
                        setTimeout(() => {
                            tusdino.cheats.lazervisual = false;
                            laz = false;
                        }, 50);
                    }
                }
                if (tusdino.cheats.allowFlyMode) {
                    if (
                        e.key.toLowerCase() == "w" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goflydown = true;
                    }
                    if (
                        e.key.toLowerCase() == "s" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goflyup = true;
                    }
                }
                if (tusdino.cheats.walk) {
                    if (
                        e.key.toLowerCase() == "d" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goright = true;
                    }
                    if (
                        e.key.toLowerCase() == "a" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goleft = true;
                    }
                }
            });
            document.addEventListener("keyup", function (e) {
                if (tusdino.cheats.allowFlyMode) {
                    if (
                        e.key.toLowerCase() == "w" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goflydown = false;
                    }
                    if (
                        e.key.toLowerCase() == "s" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goflyup = false;
                    }
                }
                if (tusdino.cheats.walk) {
                    if (
                        e.key.toLowerCase() == "d" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goright = false;
                    }
                    if (
                        e.key.toLowerCase() == "a" &&
                        (e.path ? e.path[0].tagName != "INPUT" : e)
                    ) {
                        goleft = false;
                    }
                }
            });

            // Listeners / Clicks
            tusdino.onclick("killplayer", function () {
                var n = Runner.instance_.gameOver;
                Runner.instance_.gameOver = tusdino.saved.gameOver;
                if (Runner.instance_.gameOver.toString() !== "function() {}") {
                    if (tusdino.cheats.instantrespawn) {
                    Runner.instance_.gameOver();
                        Runner.instance_.restart();
                    } else {
                    Runner.instance_.gameOver();
                    }
                    tusdino.msg("Killed player");
                } else {
                    swal.fire({
                        icon: "error"
                        , title: "Can't kill player"
                        , text: "Unable to kill player, can be due to a cheat preventing this being enabled."
                    , });
                    tusdino.logs.error("Unable to kill dino (killplayer)");
                }
                Runner.instance_.gameOver = n;
            });
            tusdino.onclick("setspeed", function () {
                var inp = parseFloat(
                    document.getElementById("setspeedcheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.setSpeed(inp);
                    tusdino.msg("Set Speed to " + inp);
                }
            });
            tusdino.onclick("setfps", function () {
                var inp = parseFloat(
                    document.getElementById("setfpscheatinput").value
                );
                if (!isNaN(inp)) {
                    FPS = (inp);
                    tusdino.msg("Set FPS to " + inp);
                }
            });
            tusdino.onclick("setgamespeed", function () {
                var inp = parseFloat(
                    document.getElementById("setgamespeedcheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.config.ACCELERATION = inp;
                    tusdino.msg("Set game speed to " + inp);
                }
            });
            tusdino.onclick("setscore", function () {
                var inp = parseFloat(
                    document.getElementById("setscorecheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.distanceRan =
                        inp / Runner.instance_.distanceMeter.config.COEFFICIENT;
                    tusdino.msg("Set score to " + inp);
                }
            });
            tusdino.onclick("sethighscore", function () {
                var inp = parseFloat(
                    document.getElementById("sethighscorecheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.highestScore =
                        inp / Runner.instance_.distanceMeter.config.COEFFICIENT;
                    Runner.instance_.distanceMeter.setHighScore(
                        inp / Runner.instance_.distanceMeter.config.COEFFICIENT
                    );
                    tusdino.msg("Set highest score to " + inp);
                }
            });
            tusdino.onclick("setgroundy", function () {
                var inp = parseFloat(
                    document.getElementById("setgroundycheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.tRex.groundYPos = inp;
                    Runner.instance_.tRex.startJump(0.5);
                    tusdino.msg("Set ground Y to " + inp);
                }
            });
            tusdino.onclick("setscorespeed", function () {
                var inp = parseFloat(
                    document.getElementById("setscorespeedcheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.msPerFrame = inp / 2;
                    tusdino.msg("Set score speed to " + inp);
                }
            });
            tusdino.onclick("setxaxis", function () {
                var inp = parseFloat(
                    document.getElementById("setxaxischeatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.tRex.xPos = inp;
                    tusdino.msg("Set X axis to " + inp);
                }
            });
            tusdino.onclick("setyaxis", function () {
                var inp = parseFloat(
                    document.getElementById("setyaxischeatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.tRex.yPos = inp;
                    tusdino.msg("Set Y axis to " + inp);
                }
            });
            tusdino.onclick("setgravity", function () {
                var inp = parseFloat(
                    document.getElementById("setgravitycheatinput").value
                );
                if (!isNaN(inp)) {
                    Runner.instance_.tRex.config.GRAVITY = inp;
                    tusdino.msg("Set gravity to " + inp);
                }
            });
            tusdino.onclick("setwalkspeed", function () {
                var inp = parseFloat(
                    document.getElementById("setwalkspeedcheatinput").value
                );
                if (!isNaN(inp)) {
                    xSpeed = inp;
                    tusdino.msg("Set walk speed to " + inp);
                }
            });
            tusdino.onclick("setflyspeed", function () {
                var inp = parseFloat(
                    document.getElementById("setflyspeedcheatinput").value
                );
                if (!isNaN(inp)) {
                    ySpeed = inp;
                    tusdino.msg("Set fly speed to " + inp);
                }
            });

            let setSkin = function (x1, x2) {
                let x_1 = document.getElementById("offline-resources-1x");
                let x_2 = document.getElementById("offline-resources-2x");
                if (x1) x_1.src = x1;
                if (x2) x_2.src = x2;
            };

            var skins = {
                default: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/default.png?raw=true"
                , batman: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/batman%20colored.png?raw=true"
                , dinocol2: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/dino%20colored%202.png?raw=true"
                , dinocol: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/dino%20colored.png?raw=true"
                , godzilla: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/godzilla.png?raw=true"
                , joker: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/joker.png?raw=true"
                , mario2: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/mario%202.png?raw=true"
                , mariocol2: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/mario%20colored%202.png?raw=true"
                , mariocol: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/mario%20colored.png?raw=true"
                , mario: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/mario.png?raw=true"
                , minecraft: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/minecraft.png?raw=true"
                , naruto: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/naruto%20colored.png?raw=true"
                , noface: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/noface%20halloween.png?raw=true"
                , nyancat: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/nyan%20cat.png?raw=true"
                , pikachu: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/pikachu.png?raw=true"
                , santa: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/santa%20colored.png?raw=true"
                , soniccol2: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/sonic%20colored%202.png?raw=true"
                , soniccol: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/sonic%20colored.png?raw=true"
                , sonic: "https://github.com/Case-Clicker-2-Utilities/TusDino-Chrome-Dino-Mod-Menu/blob/main/skins/sonic.png?raw=true"
            , };

            function setSki(i) {
                setSkin(skins[i]);
            }
            tusdino.onclick("setskin", function () {
                var inp = document.getElementById("setskincheatselect").value;
                setSki(inp);
                var jsf = false;
                for (var i in document.querySelector("#setskincheatselect").children) {
                    if (
                        document.querySelector("#setskincheatselect").children[i].value ==
                        document.querySelector("#setskincheatselect").value
                    ) {
                        jsf = document.querySelector("#setskincheatselect").children[i]
                            .innerText;
                    }
                }
                if (jsf) {
                    tusdino.msg("Set skin to " + jsf + " [NOTE: SKINS MIGHT BE BUGGY]");
                }
            });
            var noclip = false;
            tusdino.onclick("noclip", function () {
                noclip = !noclip;
                if (noclip) {
                    tusdino.cheats.noclip = true;
                    document.getElementById("noclip").innerText = "No Clip - ON ";
                    tusdino.msg("Enabled No-Clip");
                } else {
                    tusdino.cheats.noclip = false;
                    document.getElementById("noclip").innerText = "No Clip - OFF";
                    tusdino.msg("Disabled No-Clip");
                }
            });
            var blockyjump = false;
            tusdino.onclick("blockyjump", function () {
                blockyjump = !blockyjump;
                if (blockyjump) {
                    Runner.instance_.tRex.config.DROP_VELOCITY = 2;
                    document.getElementById("blockyjump").innerText = "Blocky Jump - ON ";
                    tusdino.msg("Enabled Blocky Jump");
                } else {
                    Runner.instance_.tRex.config.DROP_VELOCITY = -5;
                    document.getElementById("blockyjump").innerText = "Blocky Jump - OFF";
                    tusdino.msg("Disabled Blocky Jump");
                }
            });
            var highjump = false;
            tusdino.onclick("highjump", function () {
                highjump = !highjump;
                if (highjump) {
                    Runner.instance_.tRex.setJumpVelocity(14);
                    document.getElementById("highjump").innerText = "High Jump - ON ";
                    tusdino.msg("Enabled High Jump");
                } else {
                    Runner.instance_.tRex.setJumpVelocity(10);
                    document.getElementById("highjump").innerText = "High Jump - OFF";
                    tusdino.msg("Disabled High Jump");
                }
            });
            var pausegame = false;
            tusdino.onclick("pausegame", function () {
                pausegame = !pausegame;
                if (pausegame) {
                    Runner.instance_.stop();
                    document.getElementById("pausegame").innerText = "Pause - ON ";
                    tusdino.msg("Enabled Pause");
                } else {
                    Runner.instance_.play();
                    document.getElementById("pausegame").innerText = "Pause - OFF";
                    tusdino.msg("Disabled Pause");
                }
            });
            tusdino.onclick("forcepausegame", function () {
                tusdino.cheats.forcepause = !tusdino.cheats.forcepause;
                if (tusdino.cheats.forcepause) {
                    document.getElementById("forcepausegame").innerText =
                        "Force Pause - ON ";
                    tusdino.msg("Enabled Force Pause");
                } else {
                    Runner.instance_.play();
                    document.getElementById("forcepausegame").innerText =
                        "Force Pause - OFF";
                    tusdino.msg("Disabled Force Pause");
                }
            });
            tusdino.onclick("restartgame", function () {
                var n = Runner.instance_.gameOver;
                Runner.instance_.gameOver = tusdino.saved.gameOver;
                Runner.instance_.gameOver();
                Runner.instance_.restart();
                Runner.instance_.gameOver = n;
                tusdino.msg("Restarted the game");
            });
            tusdino.onclick("mutegame", function () {
                tusdino.cheats.mute = !tusdino.cheats.mute;
                if (tusdino.cheats.mute) {
                    document.getElementById("mutegame").innerText = "Mute Game - ON ";
                    tusdino.msg("Enabled Mute");
                } else {
                    document.getElementById("mutegame").innerText = "Mute Game - OFF";
                    tusdino.msg("Disabled Mute");
                }
            });
            tusdino.onclick("rainbowsquareplayer", function () {
                tusdino.cheats.rainbowSquarePlayer = !tusdino.cheats.rainbowSquarePlayer;
                if (tusdino.cheats.rainbowSquarePlayer) {
                    document.getElementById("rainbowsquareplayer").innerText =
                        "Rainbow Square Player - ON ";
                    tusdino.msg("Enabled Rainbow Square Player");
                } else {
                    hslStart = false;
                    document.getElementById("rainbowsquareplayer").innerText =
                        "Rainbow Square Player - OFF";
                    tusdino.msg("Disabled Rainbow Square Player");
                }
            });
            var rainbowbackground = false;

            var oldtrans = document.body.transition;
            var oldbg = document.body.background;

            function flash() {
                if (rainbowbackground) {
                    document.body.style.transition = "2s ease 0s";
                    document.body.style.background = "red";
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "red";
                        }
                    }, 1000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "orange";
                        }
                    }, 2000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "yellow";
                        }
                    }, 3000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "white";
                        }
                    }, 4000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "green";
                        }
                    }, 5000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "blue";
                        }
                    }, 6000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "darkblue";
                        }
                    }, 7000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "black";
                        }
                    }, 8000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            document.body.style.background = "red";
                        }
                    }, 9000);
                    setTimeout(function () {
                        if (rainbowbackground) {
                            flash();
                        }
                    }, 9000);
                }
            }
            tusdino.onclick("rainbowbackground", function () {
                rainbowbackground = !rainbowbackground;
                if (rainbowbackground) {
                    flash();
                    document.getElementById("rainbowbackground").innerText =
                        "Rainbow Background - ON ";
                    tusdino.msg("Enabled Rainbow Background");
                } else {
                    window.oldbg = oldbg;
                    document.body.style.background = oldbg;
                    document.body.style.transition = oldtrans;
                    document.getElementById("rainbowbackground").innerText =
                        "Rainbow Background - OFF";
                    tusdino.msg("Disabled Rainbow Background");
                }
            });
            var fastfall = false;
            Runner.instance_.tRex.startJump = function (speed) {
                if (this.airjump) {
                    this.jumping = false;
                    if (!this.jumping) {
                        this.update(0, "JUMPING");
                        // Tweak the jump velocity based on the speed.
                        this.jumpVelocity = this.config.INIITAL_JUMP_VELOCITY - speed / 10;
                        this.jumping = true;
                        this.reachedMinHeight = false;
                        this.speedDrop = false;
                    }
                } else {
                    this.jumping = false;
                    if (!this.jumping) {
                        this.update(0, "JUMPING");
                        // Tweak the jump velocity based on the speed.
                        this.jumpVelocity = this.config.INIITAL_JUMP_VELOCITY - speed / 10;
                        this.jumping = true;
                        this.reachedMinHeight = false;
                        this.speedDrop = false;
                    }
                }
            };
            tusdino.onclick("fastfall", function () {
                fastfall = !fastfall;
                if (fastfall) {
                    Runner.instance_.tRex.config.DROP_VELOCITY = 12;
                    document.getElementById("fastfall").innerText = "Fast Fall - ON ";
                    tusdino.msg("Enabled Fast Fall");
                } else {
                    Runner.instance_.tRex.config.DROP_VELOCITY = -5;
                    document.getElementById("fastfall").innerText = "Fast Fall - OFF";
                    tusdino.msg("Disabled Fast Fall");
                }
            });
            var IS_HIDPI = window.devicePixelRatio > 1;

            /** @const */
            var IS_IOS =
                window.navigator.userAgent.indexOf("CriOS") > -1 ||
                window.navigator.userAgent == "UIWebViewForStaticFileContent";

            /** @const */
            var IS_MOBILE = window.navigator.userAgent.indexOf("Mobi") > -1 || IS_IOS;

            /** @const */
            var IS_TOUCH_ENABLED = "ontouchstart" in window;
            Runner.instance_.onKeyDown = function (e) {
                // Prevent native page scrolling whilst tapping on mobile.
                if (IS_MOBILE) {
                    e.preventDefault();
                }

                // if (e.target != this.detailsButton) {
                if (
                    !this.crashed &&
                    (Runner.keycodes.JUMP[e.keyCode] ||
                        e.type == Runner.events.TOUCHSTART ||
                        e.type == Runner.events.GAMEPADCONNECTED)
                ) {
                    if (!this.activated) {
                        this.loadSounds();
                        this.activated = true;
                        // errorPageController.trackEasterEgg();
                    }

                    if (
                        (tusdino.cheats.airjump ? true : !this.tRex.jumping) &&
                        (tusdino.cheats.duckAndJump ? true : !this.tRex.ducking)
                    ) {
                        this.playSound(this.soundFx.BUTTON_PRESS);
                        this.tRex.startJump(this.currentSpeed);
                    }
                }

                if (
                    this.crashed &&
                    e.type == Runner.events.TOUCHSTART &&
                    e.currentTarget == this.containerEl
                ) {
                    this.restart();
                }
                // }

                if (
                    this.activated &&
                    !this.crashed &&
                    Runner.keycodes.DUCK[e.keyCode]
                ) {
                    e.preventDefault();
                    if (this.tRex.jumping) {
                        // Speed drop, activated only when jump key is not pressed.
                        this.tRex.setSpeedDrop();
                    } else if (!this.tRex.ducking) {
                        // Duck.
                        this.tRex.setDuck(true);
                    }
                }
            };
            tusdino.onclick("airjump", function () {
                tusdino.cheats.airjump = !tusdino.cheats.airjump;
                if (tusdino.cheats.airjump) {
                    document.getElementById("airjump").innerText = "Airjump - ON ";
                    tusdino.msg("Enabled Airjump");
                } else {
                    document.getElementById("airjump").innerText = "Airjump - OFF";
                    tusdino.msg("Disabled Airjump");
                }
            });
            tusdino.onclick("autoplayer", function () {
                tusdino.cheats.autoplayer = !tusdino.cheats.autoplayer;
                if (tusdino.cheats.autoplayer) {
                    document.getElementById("autoplayer").innerText = "Autoplayer - ON ";
                    tusdino.msg("Enabled Autoplayer");
                } else {
                    document.getElementById("autoplayer").innerText = "Autoplayer - OFF";
                    tusdino.msg("Disabled Autoplayer");
                }
            });
            tusdino.onclick("autofocus", function () {
                tusdino.cheats.autofocus = !tusdino.cheats.autofocus;
                if (tusdino.cheats.autofocus) {
                    document.getElementById("autofocus").innerText = "Auto Focus - ON ";
                    tusdino.msg("Enabled Auto Focus");
                } else {
                    document.getElementById("autofocus").innerText = "Auto Focus - OFF";
                    tusdino.msg("Disabled Auto Focus");
                }
            });
            tusdino.onclick("forcefocus", function () {
                tusdino.cheats.forcefocus = !tusdino.cheats.forcefocus;
                if (tusdino.cheats.forcefocus) {
                    document.getElementById("forcefocus").innerText = "Force Focus - ON ";
                    tusdino.msg("Enabled Force Focus");
                } else {
                    document.getElementById("forcefocus").innerText = "Force Focus - OFF";
                    tusdino.msg("Disabled Force Focus");
                }
            });
            tusdino.onclick("jumpnotifier", function () {
                tusdino.cheats.notifier = !tusdino.cheats.notifier;
                if (tusdino.cheats.notifier) {
                    document.getElementById("jumpnotifier").innerText =
                        "Jump Notifier - ON ";
                    tusdino.msg("Enabled Jump Notifier");
                } else {
                    document.getElementById("jumpnotifier").innerText =
                        "Jump Notifier - OFF";
                    tusdino.msg("Disabled Jump Notifier");
                }
            });
            tusdino.onclick("walk", function () {
                tusdino.cheats.walk = !tusdino.cheats.walk;
                if (tusdino.cheats.walk) {
                    document.getElementById("walk").innerText = "Walk - ON ";
                    tusdino.msg("Enabled Walk");
                } else {
                    x = Runner.instance_.tRex.xPos;
                    document.getElementById("walk").innerText = "Walk - OFF";
                    tusdino.msg("Disabled Walk");
                }
            });
            tusdino.onclick("obstacleesp", function () {
                tusdino.cheats.objectEsp = !tusdino.cheats.objectEsp;
                if (tusdino.cheats.objectEsp) {
                    document.getElementById("obstacleesp").innerText =
                        "Obstacle ESP - ON ";
                    tusdino.msg("Enabled Obstacle ESP");
                } else {
                    document.getElementById("obstacleesp").innerText =
                        "Obstacle ESP - OFF";
                    tusdino.msg("Disabled Obstacle ESP");
                }
            });
            tusdino.onclick("tracers", function () {
                tusdino.cheats.tracer = !tusdino.cheats.tracer;
                if (tusdino.cheats.tracer) {
                    document.getElementById("tracers").innerText = "Tracers - ON ";
                    tusdino.msg("Enabled Tracers");
                } else {
                    hslStart = false;
                    document.getElementById("tracers").innerText = "Tracers - OFF";
                    tusdino.msg("Disabled Tracers");
                }
            });
            tusdino.onclick("lazervisonkey", function () {
                tusdino.cheats.lazerv = !tusdino.cheats.lazerv;
                if (tusdino.cheats.lazerv) {
                    document.getElementById("lazervisonkey").innerText =
                        "Lazer Vison Key (L) - ON ";
                    tusdino.msg("Enabled Lazer Vison Key");
                } else {
                    hslStart = false;
                    document.getElementById("lazervisonkey").innerText =
                        "Lazer Vison Key (L) - OFF";
                    tusdino.msg("Disabled Lazer Vison Key");
                }
            });
            tusdino.onclick("lazervison", function () {
                tusdino.cheats.lazervisual = true;
                tusdino.cheats.lazer = true;
                setTimeout(() => {
                    tusdino.cheats.lazervisual = false;
                    laz = false;
                }, 50);
                tusdino.msg("Shot a lazer");
            });
            tusdino.onclick("esp", function () {
                tusdino.cheats.esp = !tusdino.cheats.esp;
                if (tusdino.cheats.esp) {
                    document.getElementById("esp").innerText = "ESP - ON ";
                    tusdino.msg("Enabled ESP");
                } else {
                    document.getElementById("esp").innerText = "ESP - OFF";
                    tusdino.msg("Disabled ESP");
                }
            });
            tusdino.onclick("fly", function () {
                tusdino.cheats.fly = !tusdino.cheats.fly;
                if (tusdino.cheats.fly) {
                    y = Runner.instance_.tRex.yPos;
                    x = Runner.instance_.tRex.xPos;
                    document.getElementById("fly").innerText = "Fly - ON ";
                    tusdino.msg("Enabled Fly");
                } else {
                    tt = true;
                    Runner.instance_.tRex.startJump(0.5);
                    y = 96;
                    document.getElementById("fly").innerText = "Fly - OFF";
                    tusdino.msg("Disabled Fly");
                }
            });
            tusdino.onclick("stormcloud", function () {
                tusdino.cheats.stormcloud = !tusdino.cheats.stormcloud;
                if (tusdino.cheats.stormcloud) {
                    document.getElementById("stormcloud").innerText = "Storm Cloud - ON ";
                    tusdino.msg("Enabled Storm Cloud");
                } else {
                    document.getElementById("stormcloud").innerText = "Storm Cloud - OFF";
                    tusdino.msg("Disabled Storm Cloud");
                }
            });
            tusdino.onclick("noobstacle", function () {
                tusdino.cheats.noobstacles = !tusdino.cheats.noobstacles;
                if (tusdino.cheats.noobstacles) {
                    document.getElementById("noobstacle").innerText = "No Obstacle - ON ";
                    tusdino.msg("Enabled No Obstacle");
                } else {
                    Runner.instance_.horizon.spritePos.CACTUS_LARGE =
                        tusdino.saved.CACTUS_LARGE;
                    Runner.instance_.horizon.spritePos.CACTUS_SMALL =
                        tusdino.saved.CACTUS_SMALL;
                    Runner.instance_.horizon.spritePos.PTERODACTYL =
                        tusdino.saved.PTERODACTYL;
                    document.getElementById("noobstacle").innerText = "No Obstacle - OFF";
                    tusdino.msg("Disabled No Obstacle");
                }
            });
            var oldGrav = Runner.instance_.tRex.config.GRAVITY;
            var oldinjumpvel = Runner.config.INITIAL_JUMP_VELOCITY;
            tusdino.onclick("glide", function () {
                tusdino.cheats.glide = !tusdino.cheats.glide;
                if (tusdino.cheats.glide) {
                    Runner.instance_.tRex.config.GRAVITY = 0;
                    Runner.instance_.updateConfigSetting("INITIAL_JUMP_VELOCITY", 0.39);
                    document.getElementById("glide").innerText = "Glide - ON ";
                    tusdino.msg("Enabled Glide");
                } else {
                    Runner.instance_.tRex.config.GRAVITY = oldGrav;
                    Runner.instance_.updateConfigSetting(
                        "INITIAL_JUMP_VELOCITY"
                        , oldinjumpvel
                    );
                    document.getElementById("glide").innerText = "Glide - OFF";
                    tusdino.msg("Disabled Glide");
                }
            });
            tusdino.onclick("obliterate", function () {
                tusdino.cheats.obliterate = !tusdino.cheats.obliterate;
                if (tusdino.cheats.obliterate) {
                    document.getElementById("obliterate").innerText =
                        "Obliterate Obstacles - ON ";
                    tusdino.msg("Enabled Obliterate Obstacles");
                } else {
                    document.getElementById("obliterate").innerText =
                        "Obliterate Obstacles - OFF";
                    tusdino.msg("Disabled Obliterate Obstacles");
                }
            });
            tusdino.onclick("invisibilitycheat", function () {
                tusdino.cheats.invisibility = !tusdino.cheats.invisibility;
                if (tusdino.cheats.invisibility) {
                    document.getElementById("invisibilitycheat").innerText =
                        "Invisibility - ON ";
                    tusdino.msg("Enabled Invisibility");
                } else {
                    Runner.instance_.tRex.spritePos = {
                        x: 677
                        , y: 2
                    , };
                    document.getElementById("invisibilitycheat").innerText =
                        "Invisibility - OFF";
                    tusdino.msg("Disabled Invisibility");
                }
            });
            tusdino.onclick("instantrespawn", function () {
                tusdino.cheats.instantrespawn = !tusdino.cheats.instantrespawn;
                if (tusdino.cheats.instantrespawn) {
                    document.getElementById("instantrespawn").innerText = "Instant Respawn - ON ";
                    tusdino.msg("Enabled Instant Respawn");
                } else {
                    document.getElementById("instantrespawn").innerText = "Instant Respawn - OFF";
                    tusdino.msg("Disabled Instant Respawn");
                }
            });
            tusdino.onclick("obstacleBypass", function () {
                tusdino.cheats.obstacleBypass = !tusdino.cheats.obstacleBypass;
                if (tusdino.cheats.obstacleBypass) {
                    document.getElementById("obstacleBypass").innerText =
                        "Obstacle Bypass - ON ";
                    tusdino.msg("Enabled Obstacle Bypass");
                } else {
                    Runner.instance_.tRex.spritePos = {
                        x: 677
                        , y: 2
                    , };
                    document.getElementById("obstacleBypass").innerText =
                        "Obstacle Bypass - OFF";
                    tusdino.msg("Disabled Obstacle Bypass");
                }
            });
            tusdino.onclick("duckAndJump", function () {
                tusdino.cheats.duckAndJump = !tusdino.cheats.duckAndJump;
                if (tusdino.cheats.duckAndJump) {
                    document.getElementById("duckAndJump").innerText =
                        "Duck and Jump - ON ";
                    tusdino.msg("Enabled Duck and Jump");
                } else {
                    document.getElementById("duckAndJump").innerText =
                        "Duck and Jump - OFF";
                    tusdino.msg("Disabled Duck and Jump");
                }
            });
            tusdino.onclick("playingIntro", function () {
                Runner.instance_.playingIntro = !Runner.instance_.playingIntro;
                if (Runner.instance_.playingIntro) {
                    document.getElementById("playingIntro").innerText =
                        "Playing Intro - ON ";
                    tusdino.msg("Enabled Playing Intro");
                } else {
                    document.getElementById("playingIntro").innerText =
                        "Playing Intro - OFF";
                    tusdino.msg("Disabled Playing Intro");
                }
            });
            tusdino.onclick("watermark", function () {
                tusdino.cheats.watermark = !tusdino.cheats.watermark;
                if (tusdino.cheats.watermark) {
                    document.getElementById("watermark").innerText = "Watermark - ON ";
                    tusdino.msg("Enabled Watermark");
                } else {
                    document.getElementById("watermark").innerText = "Watermark - OFF";
                    tusdino.msg("Disabled Watermark");
                }
            });
            tusdino.onclick("obstacleFloat", function () {
                tusdino.cheats.obstacleFloat = !tusdino.cheats.obstacleFloat;
                if (tusdino.cheats.obstacleFloat) {
                    document.getElementById("obstacleFloat").innerText =
                        "Obstacle Float - ON ";
                    tusdino.msg("Enabled Obstacle Float");
                } else {
                    document.getElementById("obstacleFloat").innerText =
                        "Obstacle Float - OFF";
                    tusdino.msg("Disabled Obstacle Float");
                }
            });
            tusdino.onclick("arc", function () {
                tusdino.cheats.arc = !tusdino.cheats.arc;
                if (tusdino.cheats.arc) {
                    document.getElementById("arc").innerText = "Arc - ON ";
                    tusdino.msg("Enabled Arc");
                } else {
                    document.getElementById("arc").innerText = "Arc - OFF";
                    tusdino.msg("Disabled Arc");
                }
            });
            tusdino.onclick("rainbowglow", function () {
                tusdino.cheats.rainbowglow = !tusdino.cheats.rainbowglow;
                if (tusdino.cheats.rainbowglow) {
                    document.getElementById("rainbowglow").innerText =
                        "Rainbow Glow - ON ";
                    tusdino.msg("Enabled Rainbow Glow");
                } else {
                    document.getElementById("rainbowglow").innerText =
                        "Rainbow Glow - OFF";
                    tusdino.msg("Disabled Rainbow Glow");
                }
            });
            var darkmodeg = false;
                var oldBg = '';
                var oldInv = '';
            var oldCol = '';
            tusdino.onclick("toggledarkmode", function () {
                darkmodeg = !darkmodeg;
                if (darkmodeg) {
                    var d = document.createElement('style');
                    d.innerHTML = `
            h1 {
             color: white;
            }
            h2 {
             color: white;
            }
            h3 {
             color: white;
            }
            p {
            color: white
            }
            `;
                    d.id="darkmodestyle";
                    document.body.append(d);
                    oldBg = document.body.style.background;
                    oldCol = document.body.style.color;
                    oldInv = document.getElementsByClassName('runner-canvas')[0].style.filter;
                    document.body.style.color = 'white';
                    document.getElementsByClassName('runner-canvas')[0].style.filter = 'invert(1)';
                    document.body.style.background = "rgb(32 33 36)";
                    document.getElementById("toggledarkmode").innerText =
                        "Dark Game Mode - ON ";
                    tusdino.msg("Enabled Dark Mode");
                } else {
                    document.getElementById('darkmodestyle').remove();
                    document.getElementsByClassName('runner-canvas')[0].style.filter = oldInv;
                    document.body.style.background = oldBg;
                    document.body.style.color = oldCol;
                    document.getElementById("toggledarkmode").innerText =
                        "Dark Game Mode - OFF";
                    tusdino.msg("Disabled Dark Mode");
                }
            });
            tusdino.onclick("glow", function () {
                tusdino.cheats.glow = !tusdino.cheats.glow;
                if (tusdino.cheats.glow) {
                    document.getElementById("glow").innerText = "Glow - ON ";
                    tusdino.msg("Enabled Glow");
                } else {
                    document.getElementById("glow").innerText = "Glow - OFF";
                    tusdino.msg("Disabled Glow");
                }
            });
            tusdino.onclick("bhop", function () {
                tusdino.cheats.bhop = !tusdino.cheats.bhop;
                if (tusdino.cheats.bhop) {
                    document.getElementById("bhop").innerText = "Bhop - ON ";
                    tusdino.msg("Enabled Bhop");
                } else {
                    document.getElementById("bhop").innerText = "Bhop - OFF";
                    tusdino.msg("Disabled Bhop");
                }
            });
            tusdino.onclick("tradingcredits", function () {
                tusdino.alert(
                    "TusDino Credits"
                    , "Lapide: Main Developer & Coder - Developed modules & menu\n\ninon13: Secondary Developer & Coder - Developed modules".replaceAll(
                        "\n"
                        , "<br>"
                    )
                );
            });
            tusdino.onclick("removeallcloud", function () {
                Runner.instance_.horizon.clouds = [];
                tusdino.msg("Removed all clouds");
            });
            tusdino.onclick("addcloud", function () {
                Runner.instance_.horizon.addCloud();
                tusdino.msg("Added one cloud");
            });
            tusdino.onclick("setmenuscale", function () {
                const tradingmenuDiv = document.getElementById("tradingmenu");
                const setmenuscaleinput = document.getElementById("setmenuscaleinput");
                // active tusdino.alert if the value is more or less then the limits
                if (setmenuscaleinput.value > 1.2 || setmenuscaleinput.value < 0.7) {
                    tusdino.alert(
                        "Limits"
                        , 'The limits for the menu scale <br> are from  <label class="alertbox" style="color: #f02626;"> 0.7 </label> <label class="alertbox" style="color: lightblue;">to</label> <label class="alertbox" style="color: #f02626;">1.2</label> <br> sorry :('
                    );
                } else {
                    tradingmenuDiv.style.transform =
                        "scale(" + setmenuscaleinput.value + ")";
                }
            });
            tusdino.onclick("removecloud", function () {
                Runner.instance_.horizon.clouds.length > 0 ?
                    (Runner.instance_.horizon.clouds =
                        Runner.instance_.horizon.clouds.slice(
                            0
                            , Runner.instance_.horizon.clouds.length - 1
                        )) :
                    "";
                tusdino.msg("Removed one cloud");
            });
            tusdino.onclick("removeallobstacle", function () {
                Runner.instance_.horizon.obstacles = [];
                tusdino.msg("Removed all obstacles");
            });
            tusdino.onclick("addobstacle", function () {
                Runner.instance_.horizon.addNewObstacle(Runner.instance_.currentSpeed);
                tusdino.msg("Added one obstacle");
            });
            tusdino.onclick("removeobstacle", function () {
                Runner.instance_.horizon.obstacles.length > 0 ?
                    (Runner.instance_.horizon.obstacles =
                        Runner.instance_.horizon.obstacles.slice(
                            1
                            , Runner.instance_.horizon.obstacles.length
                        )) :
                    "";
                tusdino.msg("Removed one obstacle");
            });
            tusdino.logs.success("Successfully loaded " + atob("VHVzRGlubw==") + "!");
        } else {
            alert(
                "TUSDINO ERROR: We cannot find the Runner object, try using a VPN.\n\nIf you don't know any free ones, here's some (Chrome Only):\nZenMate - https://chrome.google.com/webstore/detail/free-vpn-zenmate-best-vpn/fdcgdnkidjaadafnichfpabhfomcebme\n\nTouchVPN (Recommended) - https://chrome.google.com/webstore/detail/touch-vpn-secure-and-unli/bihmplhobchoageeokmgbdihknkjbknd/related\n\n\n----------------------\nThese free VPN's are secure and trusted by millions of people."
            );
        }
    }
    setTimeout(() => {
        // Detects if Runner exists when the script has loaded. If not, it will wait for the page to load.
        if (typeof Runner != typeof undefined) {
            cont();
        } else {
            window.addEventListener("load", function () {
                cont();
            });
        }
    }, 500);

    // Code to run when page loaded
    window.addEventListener("load", function () {
        // Just for the auto focus module
        setTimeout(() => {
            window.addEventListener("blur", function () {
                if (tusdino.cheats.autofocus) {
                    console.log("Auto focusing on website");
                    var focusevent = new Event("focus");
                    window.dispatchEvent(focusevent);
                }
            });
        }, 2000);
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址