Sleazy Fork is available in English.

Pathfinder

A pathfinder made by WYND C:

// ==UserScript==
// @name         Pathfinder
// @namespace    http://tampermonkey.net/
// @version      -
// @match        *://moomoo.io/*
// @description A pathfinder made by WYND C:
// @match        *://dev.moomoo.io/*
// @match        *://sandbox.moomoo.io/*
// @author       Wynd
// @grant        none
// ==/UserScript==
const WorkerCode = `
self.onmessage = (msg) => {
    let bitmap = msg.data;
    let canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
    let ctx = canvas.getContext("2d");
    ctx.drawImage(bitmap, 0, 0);
    ctx.clearRect(Math.floor(bitmap.width/2), Math.floor(bitmap.height/2), 1, 1);


    let endpoints = [];
    let data = ctx.getImageData(0,0,bitmap.width, bitmap.height).data;

    let map = new Map(canvas);


    for(let i = 0;i < data.length;i += 4){
        let l = i / 4;
        map.graph[l % bitmap.width][Math.floor(l / bitmap.width)].cost = data[i];
        if(data[i + 2]){
            endpoints.push({
                x: l % bitmap.width,
                y: Math.floor(l / bitmap.width),
            });
        }
    }
    bitmap.close();

    if(!endpoints.length){
        endpoints.push(map.getCentreNode());
    }

    //begin the pathfinding

    let openSet = new BinHeap();
    openSet.setCompare = (a, b) => a.f > b.f;
    openSet.push(map.getCentreNode());

    let currentNode;


    while(openSet.length){
        currentNode = openSet.remove(0)
        if(endpoints.some((goal) => goal.x == currentNode.x && goal.y == currentNode.y)){
            break;
        }

        let neighbors = map.getNeighbor(currentNode.x, currentNode.y);
        for(let i = 0;i < neighbors.length;i++){
            let neighbor = neighbors[i];
            if(neighbor && neighbor.cost == 0){//may make it weighted later
                let tempG = currentNode.g + Map[i % 2 == 0 ? "DiagonalCost" : "TraversalCost"];
                if(tempG < neighbor.g){
                    neighbor.parent = currentNode;
                    neighbor.g = tempG;
                    neighbor.h = Math.min.apply(Math, endpoints.map((goal) => fastHypot(neighbor.x - goal.x, neighbor.y - goal.y)));
                    if(!neighbor.inset){
                        openSet.insert(neighbor);
                    }
                }
            }
        }
    }


    //recontruct path
    if(!endpoints.some((goal) => goal.x == currentNode.x && goal.y == currentNode.y)){
        currentNode = map.getLowest('h');
    }
    let output = [];
    while(currentNode.parent){
        let nextNode = currentNode.parent;
        let d = Math.round(Math.atan2(nextNode.y - currentNode.y, nextNode.x - currentNode.x) / Math.PI * 4);
        if(d < 0){d+=8};
        output.push(d);
        currentNode = nextNode;
    }
    output = new Uint8Array(output.reverse()).buffer;

    self.postMessage(output, [output]);
}

//approximate hypot
function fastHypot(a, b){
    const c = Math.SQRT2-1;
    a = Math.abs(a);
    b = Math.abs(b);
    if(a > b){
        let temp = a;
        a = b;
        b = temp;
    }
    return (c * a) + b
}

//Map Constructor for object
class Map{
    static TraversalCost = 1;
    static DiagonalCost = Math.sqrt(2) * 1;
    constructor(canvas){
        //init variables
        this.width = canvas.width;
        this.height = canvas.height;

        this.middleWidth = Math.floor(this.width / 2);
        this.middleHeight = Math.floor(this.height / 2);

        this.graph = new Array(canvas.width);
        for(let x = 0;x < this.width;x++){
            this.graph[x] = new Array(this.height);
            for(let y = 0;y < this.height; y++){
                this.graph[x][y] = new Node(x, y);
            }
        }
        this.getCentreNode().g = 0;
        this.getCentreNode().pending = false;
    }
    getLowest(type){
        let lowestNode = this.graph[0][0];
        for(let x = 0;x < this.width;x++){
            for(let y = 0;y < this.height; y++){
                if(lowestNode[type] > this.getNode(x, y)[type]){
                    lowestNode = this.getNode(x, y);
                }
            }
        }
        return lowestNode;
    }
    getNode(x, y){
        if(this.graph[x]){
            return this.graph[x][y];
        }
    }
    getCentreNode(){
        return this.graph[this.middleWidth][this.middleHeight];
    }
    getNeighbor(x, y){
        return [
            this.getNode(x - 1, y - 1),
            this.getNode(x + 0, y - 1),
            this.getNode(x + 1, y - 1),
            this.getNode(x + 1, y + 0),
            this.getNode(x + 1, y + 1),
            this.getNode(x + 0, y + 1),
            this.getNode(x - 1, y + 1),
            this.getNode(x - 1, y + 0),
        ]
    }
}

//Node for Map
class Node{
    constructor(x, y){
        this.x = x;
        this.y = y;
        this.g = Number.POSITIVE_INFINITY;//distance to start
        this.h = Number.POSITIVE_INFINITY;//estimated distance to end
        this.parent;//where it came from
    }
    get f(){
        return this.h + this.g;
    }
}

//binary heap object constructor
class BinHeap extends Array {
    //private variable declaration
    #compare = (a, b) => a < b;
    //constuctor
    constructor(len = 0) {
        super(len);
    }
    //change compare function
    set setCompare(func) {
        if (typeof func == "function") {
            this.#compare = func;
        } else {
            throw new Error("Needs a function for comparing")
        }
    }
    //sort into a binary heap
    sort() {
        for (let i = Math.trunc(this.length / 2); i >= 0; i--) {
            this.siftDown(i)
        }
    }
    //old array sort
    arraySort(compare) {
        super.sort(compare)
    }
    //sift down
    siftDown(index) {
        let left = index * 2 + 1;
        let right = index * 2 + 2;
        let max = index;
        if (left < this.length && this.#compare(this[max], this[left])){
            max = left;
        }
        if (right < this.length && this.#compare(this[max], this[right])){
            max = right;
        }
        if (max != index) {
            this.swap(index, max);
            this.siftDown(max);
        }
    }
    //sift up
    siftUp(index) {
        let parent = (index - (index % 2 || 2)) / 2;
        if (parent >= 0 && this.#compare(this[parent], this[index])) {
            this.swap(index, parent);
            this.siftUp(parent);
        }
    }
    //inserts element into the binary heap
    insert(elem) {
        this.push(elem);
        this.siftUp(this.length - 1);
    }
    //removes elem at index from binary heap
    remove(index) {
        if (index < this.length) {
            this.swap(index, this.length - 1);
            let elem = super.pop();
            this.siftUp(index);
            this.siftDown(index);
            return elem;
        } else {
            throw new Error("Index Out Of Bounds")
        }
    }
    //changes elem at index
    update(index, elem) {
        if (index < this.length) {
            this[index] = elem;
            this.siftUp(index);
            this.siftDown(index);
        } else {
            throw new Error("Index Out Of Bounds")
        }
    }
    //swap two elem at indexes
    swap(i1, i2) {
        let temp = this[i1];
        this[i1] = this[i2];
        this[i2] = temp;
    }
}
`;
let sz =750;
let rs = 5;

//pathfinding instance
class WorkerAStar{
    constructor(size = 750, resolution = 5){
        //setup essential variables
        this.size = size;
        this.res = resolution;
        this.prevPos = {};
        this.prevPath = [];//might change

        //setup worker
        this.blob = new Blob([
            WorkerCode
        ], {
            type: "application/javascript"
        })
        this.url = URL.createObjectURL(this.blob);
        this.worker = new Worker(this.url);
        this.worker.url = this.url;

        //message receiving
        this.worker.onmessage = (msg) => {
            this.attemptFulfil(new Uint8Array(msg.data));
        }

        //error handling
        this.worker.onerror = (err) => {
            throw err;
        }

        this.initiateCanvas();

        //test canvas
        var canvasMap = document.createElement("CANVAS");
        canvasMap.id = 'canvasMap';
        document.body.append(canvasMap);
        canvasMap.style.zIndex = "-1";
        canvasMap.style = "position:absolute; left: 50%; top: 60px;margin-left:-100px; pointer-events: none; border-style:solid;";
        this.mapWriter = canvasMap.getContext("2d");
        canvasMap.width = Math.ceil(this.size * 2 / this.res) + 1;
        canvasMap.height = Math.ceil(this.size * 2 / this.res) + 1;
    }
    //attempts to recieve a message
    attemptFulfil(msg, depth = 0){
        if(this.resolve){
            //relay message onward
            this.resolve(msg);
            this.resolve = null;
        }else{
            //allow 5 attempts to recieve
            if(depth < 5){
                setTimeout(() => {
                    //could have just passed function as param, but this is more "consistent"
                    this.attemptFulfil(msg, depth + 1);
                }, 0);
            }else{
                console.error("Unexpected Message from Worker at ", this);
            }
        }
    }

    //gets new canvas
    initiateCanvas(){
        this.width = Math.ceil(this.size * 2 / this.res) + 1;
        if(this.canvas){
            this.canvas.width = this.width;
            this.canvas.height = this.width;
        }else{
            this.canvas = new OffscreenCanvas(this.width, this.width);
            this.ctx = this.canvas.getContext("2d");
        }
    }

    //setter for buildings
    setBuildings(buildings){
        this.buildings = buildings;
    }

    //set estimates speed
    setSpeed(spd){
        this.estimatedSpeed = spd;
    }

    //set pos in real time
    setPos(x, y){
        this.x = x;
        this.y = y;
    }

    //clear the previous path to force a recalculation
    clearPath(){
        this.prevPath = [];
    }

    drawPath(ctx, pathColor = "#0000FF", myPos = this, dirColor = "#00FF00"){
        if(this.prevPath.length){
            //draw path
            ctx.strokeStyle = pathColor;
            ctx.lineWidth = 3;
            ctx.beginPath();
            for(let i = 0;i < this.prevPath.length;i++){
                ctx.lineTo(this.prevPath[i].x, this.prevPath[i].y);
                ctx.moveTo(this.prevPath[i].x, this.prevPath[i].y);
            }
            ctx.stroke();

            //draw movement dir
            if(myPos.x && myPos.y && false){
                ctx.lineWidth = 5;
                ctx.strokeStyle = dirColor;
                ctx.beginPath();
                for(let point of this.prevPath){
                    let dist = Math.hypot(myPos.x - point.x, myPos.y - point.y);
                    if(dist < this.estimatedSpeed + this.res * 2){
                        if(dist > this.estimatedSpeed){
                            ctx.moveTo(myPos.x, myPos.y);
                            ctx.lineTo(point.x, point.y);
                        }
                        break;
                    }
                }
                ctx.stroke();
            }
        }
    }

    //async function for recieving response
    async response(){
        return await new Promise((resolve) => {
            this.resolve = resolve;
        });
    }
    //attempt to get a path
    getPath(){
        window.pf = this;
        for(let i in this.prevPath){
            let point = this.prevPath[i];
            let dist = Math.hypot(this.x - point.x, this.y - point.y);
            if(dist < this.estimatedSpeed + this.res * 2){
                if(dist > this.estimatedSpeed){
                    return {
                        ang: Math.atan2(point.y - this.y, point.x - this.x),
                        dist: parseInt(i),
                    };
                }else{
                    break;
                }
            }
        }
    }

    //makes position on the canvas(may improve, repl.it/@pyrwynd, project:test map)
    norm(value){
        return Math.max(0, Math.min(this.width - 1, value));
    }

    async initCalc(positions, append = false){
        //prevents multiple instances of calculation
        if(this.resolve){
            return;
        }

        //sets last position
        this.prevGoal = positions.map((elem) => {
            return {
                x: elem.x,
                y: elem.y,
            }
        })

        //modify position values
        if(append){
            this.prevPos = this.prevPath[0];
        }else{
            this.prevPos = {
                x: this.x,
                y: this.y,
            }
        }
        positions = positions.map((elem) => {
            return {
                x: this.norm((elem.x - this.prevPos.x + this.size) / this.res),
                y: this.norm((elem.y - this.prevPos.y + this.size) / this.res),
            }
        })

        //put buildings on canvas here
        const Circle = Math.PI * 2;
        this.ctx.fillStyle = "#FF0000";
        for(let obj of this.buildings){
            if(obj.active){
                let x = (obj.x - this.prevPos.x + this.size) / this.res;
                let y = (obj.y - this.prevPos.y + this.size) / this.res;
                let r = obj.scale;

                //modify radius of natural objects
                if(obj.owner == null){
                    if(obj.type == 0){
                        //reduce tree hitbox by 40%(may be changed later)
                        r *= 0.6;
                    }else if(obj.type == 1){
                        //reduce bush hitbox by 25%(may be changed later)
                        r *= 0.75;
                        if(obj.x > 12000){
                            //cactus
                            r += 25;
                        }
                    }
                }

                //increase avoidance of spikes
                if(obj.dmg){
                    r += 30;//number may vary
                }

                //account for player size
                r += 18;

                this.ctx.beginPath();
                this.ctx.arc(x, y, r / this.res, 0, Circle);
                this.ctx.fill();
            }
        }

        //draw destination on canvas
        this.ctx.fillStyle = "#0000FF";
        for(let goal of positions){
            this.ctx.fillRect(Math.round(goal.x), Math.round(goal.y), 1, 1);
        }

        //test canvas draw
        this.mapWriter.clearRect(0, 0, this.width, this.width);
        this.mapWriter.drawImage(this.canvas, 0, 0);

        //instant data transfer(saves 10ms)
        let bitmap = await createImageBitmap(this.canvas, 0, 0, this.width, this.width);
        this.worker.postMessage(bitmap, [bitmap]);

        //meanwhile get a new canvas
        this.initiateCanvas();

        //wait until recieve data
        let data = await this.response();

        //turn into list of points
        const xTable = [-1, -1, 0, 1, 1, 1, 0, -1];
        const yTable = [0, -1, -1, -1, 0, 1, 1, 1];
        if(!append){
            this.prevPath = [];
        }
        let currPos = {
            x: this.prevPos.x,
            y: this.prevPos.y,
        };
        let displayPos = {
            x: Math.floor(this.width/2),
            y: Math.floor(this.width/2),
        }
        for(let i = 0;i < data.length;i++){
            this.mapWriter
            currPos = {
                x: currPos.x + xTable[data[i]] * this.res,
                y: currPos.y + yTable[data[i]] * this.res,
            }
            displayPos = {
                x: displayPos.x + xTable[data[i]],
                y: displayPos.y + yTable[data[i]],
            }
            this.mapWriter.fillRect(displayPos.x, displayPos.y, 1, 1);

            this.prevPath.unshift(currPos);
        }
        return;
    }

    //requests a path/calculation
    async pathTo(positions){
        //fix positions
        if(!(positions instanceof Array)){
            positions = [positions];
        }

        //remove path if not matching
        if(this.prevGoal?.length == positions.length && this.prevGoal.every((elem, i) => elem.x == positions[i].x && elem.y == positions[i].y)){

            //reuse previous path if nearby
            let path = this.getPath();
            if(path){
                if(path.dist < this.estimatedSpeed / this.res * 5){
                    this.initCalc(positions, true);
                }
                return path;
            }
        }

        await this.initCalc(positions);
        return this.getPath();
    }
}


var Pathfinder = new WorkerAStar();
Pathfinder.setSpeed(500 / 9);


//an interface to interact with the pathfinder
class Tachyon{
    constructor(pathfinder){
        this.pathfinder = pathfinder;
        this.goal = {
            pathing: false,
            type: null,
            entity: null,
            pos: {
                x: null,
                y: null,
            },
        }
        this.waypoints = {
            death: {
                x: null,
                y: null,
            },
            quick: {
                x: null,
                y: null,
            },
        }
    }
    setWaypoint(name, pos){
        if(pos.x && pos.y){
            this.waypoints[name] = {
                x: pos.x,
                y: pos.y,
            }
        }
    }
    drawWaypointMap(mapCtx, canvas){
        mapCtx.font = "34px Hammersmith One";
        mapCtx.textBaseline = "middle";
        mapCtx.textAlign = "center";
        for(let tag in this.waypoints){
            if(tag == "death"){
                mapCtx.fillStyle = "#E44";
            }else if(tag == "quick"){
                mapCtx.fillStyle = "#44E";
            }else{
                mapCtx.fillStyle = "#fff";
            }
			if(this.waypoints[tag].x && this.waypoints[tag].y){
				mapCtx.fillText("x", this.waypoints[tag].x / 14400 * canvas.width, this.waypoints[tag].y / 14400 * canvas.height);
			}
        }
		mapCtx.strokeStyle = "#4E4";
		if(this.goal.type == "xpos"){
			mapCtx.beginPath();
			mapCtx.moveTo(this.goal.pos.x / 14400 * canvas.width, 0);
			mapCtx.lineTo(this.goal.pos.x / 14400 * canvas.width, canvas.height);
			mapCtx.stroke();
        }else if(this.goal.type == "ypos"){
			mapCtx.beginPath();
			mapCtx.moveTo(0, this.goal.pos.y / 14400 * canvas.height);
			mapCtx.lineTo(canvas.width, this.goal.pos.y / 14400 * canvas.height);
			mapCtx.stroke();
		}else if(this.goal.pos.x && this.goal.pos.y){
            mapCtx.fillStyle = "#4E4";
			mapCtx.fillText("x", this.goal.pos.x / 14400 * canvas.width, this.goal.pos.y / 14400 * canvas.height);
		}
    }
	drawWaypoints(ctx, theta){
        //waypoints
        for(let tag in this.waypoints){
            if(tag == "death"){
                ctx.strokeStyle = "#E44";
            }else if(tag == "quick"){
                ctx.strokeStyle = "#44E";
            }else{
                ctx.strokeStyle = "#fff";
            }
			if(this.waypoints[tag].x && this.waypoints[tag].y){
                ctx.save();
                ctx.translate(this.waypoints[tag].x, this.waypoints[tag].y);
                ctx.rotate(theta);
                ctx.globalAlpha = 0.6;
                ctx.lineWidth = 8;
                for(let i = 0;i < 4;i++){
                    //spinning thing
                    ctx.rotate(i * Math.PI / 2);
                    ctx.beginPath();
                    ctx.arc(0, 0, 50, 0, Math.PI / 4);
                    ctx.stroke();
                }
                //pulsing thing
                ctx.lineWidth = 6;
                ctx.globalAlpha = Math.min(0.4, 1 - Math.pow(Math.sin(theta / 2), 2) / 1.2);
                ctx.beginPath();
                ctx.arc(0, 0, 50 + Math.max(0, Math.tan(theta / 2)), 0, Math.PI * 2);
                ctx.stroke();
                ctx.restore();
			}
        }
        //goal
        ctx.strokeStyle = "#4F4";
        ctx.lineWidth = 10;
        ctx.globalAlpha = 0.8;
        if(this.goal.type == "xpos"){
            ctx.beginPath();
            ctx.moveTo(this.goal.pos.x, 0);
            ctx.lineTo(this.goal.pos.x, 14400);
            ctx.stroke();
        }else if(this.goal.type == "ypos"){
            ctx.beginPath();
            ctx.moveTo(0, this.goal.pos.y);
            ctx.lineTo(14400, this.goal.pos.y);
            ctx.stroke();
        }else if(this.goal.pos.x && this.goal.pos.y){
            ctx.save();
            ctx.translate(this.goal.pos.x, this.goal.pos.y);
            ctx.beginPath();
            ctx.arc(0, 0, 10, 0, Math.PI * 2)
            ctx.stroke();
            ctx.beginPath();
            ctx.rotate(theta / 3);
            let r = Math.cos(theta) * 10;
            for(let i = 0;i < 3;i++){
                ctx.rotate(Math.PI * 2 / 3);
                ctx.moveTo(60 + r, 0);
                ctx.lineTo(120 + r, -20);
                ctx.lineTo(100 + r, 0);
                ctx.lineTo(120 + r, 20);
                ctx.closePath();
            }
            ctx.stroke();
            ctx.restore();
        }
    }
    setSelf(self){
        this.self = self;
    }
    setSend(sender){
        this.send = sender;
    }
    //ideas: https://github.com/cabaletta/baritone/blob/master/USAGE.md
	/**Current Commands
	 * path
	 * stop
	 * goal
	 * <goal/goto> x [Number: x position]
	 * <goal/goto> y [Number: y position]
	 * <goal/goto> [x: Number] [y: Number]
	 * waypoint set [name: String]
	 * waypoint del [name: String]
	 * waypoint goto [name: String]
	 * follow player <[ID/Name: Any]/all(default)>
	 * follow animal <[ID/Name: Any]/all(default)>
     * wander
	 **Planned Commands
	 * multigoal [wp1: String] ...
	 * find [id: Number]
	 * find [name: String] [owner(optional): Number]
	*/
    abort(){
        this.goal.pathing = false;
    }
    updateChat(txt, ownerID){
        //handle commands here
        if(ownerID != this.self.sid){
            return;
        }

        let args = txt.trimEnd().split(" ");

        if(args[0] == "path"){
            //start pathfinding(assuming there is a goal)
            if(this.goal.type){
                this.goal.pathing = true;
                this.pathfinder.clearPath();
                console.log('ez')
            }
        }else if(args[0] == "stop"){
            if(this.goal.pathing){
                this.goal.pathing = false;
                this.pathfinder.clearPath();
                this.send("33", null);
            }
        }else if(args[0] == "goal" || args[0] == "goto"){
            //goal sets goal
            //goto sets a path and starts walking towards it
            if(isNaN(parseInt(args[1]))){
                if(args[1] == "x"){
                    //get to a x position
                    //<goal/goto> x [Number: x position]
                    let pos = parseInt(args[2]);
                    if(pos >= 0 && pos <= 14400){
                        this.goal.pathing = args[0] == "goto";
                        this.goal.type = "xpos";
                        this.goal.pos.x = pos;
                    }
                }else if(args[1] == "y"){
                    //get to a y position
                    //<goal/goto> y [Number: y position]
                    let pos = parseInt(args[2]);
                    if(pos >= 0 && pos <= 14400){
                        this.goal.pathing = args[0] == "goto";
                        this.goal.type = "ypos";
                        this.goal.pos.y = pos;
                    }
                }else if(args[0] == "goal" && !args[1]){
                    this.goal.type = "pos";
                    this.goal.pos.x = this.self.x;
                    this.goal.pos.y = this.self.y;
                }
            }else{
                //get to a x and y position
                //<goal/goto> [x: Number] [y: Number]
                let xPos = parseInt(args[1]);
                let yPos = parseInt(args[2]);
                if(xPos >= 0 && xPos <= 14400 && yPos >= 0 && yPos <= 14400){
                    this.goal.pathing = args[0] == "goto";
                    this.goal.type = "pos";
                    this.goal.pos.x = xPos;
                    this.goal.pos.y = yPos;
                }
            }
        }else if(args[0] == "thisway" || args[0] == "project"){
            //project my position x distance from my position
            //thisway [distance: Number] [angle(optional): Number]
            let amt = parseInt(args[1]);
            let dir = parseFloat(args[2]) || this.self.dir;
            if(!isNaN(amt) && this.self.x && this.self.y && this.self.dir){
                this.goal.type = "pos";
                this.goal.pos.x = Math.max(0, Math.min(14400, this.self.x + Math.cos(dir) * amt));
                this.goal.pos.y = Math.max(0, Math.min(14400, this.self.y + Math.sin(dir) * amt));
            }
        }else if(args[0] == "follow" || args[0] == "flw"){
            if(args[1] == "player" || args[1] == "ply"){
                //follow player <[ID: Number]/all(default)>
                this.goal.pathing = true;
                this.goal.type = "player";
                if(args[2]){
                    this.goal.entity = args.slice(2).join(" ");
                }else{
                    this.goal.entity = -1;
                }
            }else if(args[1] == "team"){
                //follow team
                this.goal.pathing = true;
                this.goal.type = "team";
            }else if(args[1] == "animal"){
                this.goal.pathing = true;
                this.goal.type = "animal";
                if(args[2]){
                    this.goal.entity = args[2];
                }else{
                    this.goal.entity = -1;
                }
            }
        }else if(args[0] == "find" || args[0] == "fnd"){
            //finds a object: natural or placed
            //find [id: Number]
            //find [name: String] [owner(optional): Number]
        }else if(args[0] == "waypoint" || args[0] == "wp"){
            if(args[1] == "set"){
                //waypoint set [name: String]
                if(Boolean(args[2]) && !this.waypoints[args[2]]){
                    this.waypoints[args[2]] = {
                        x: this.self.x,
                        y: this.self.y,
                    }
                }
            }else if(args[1] == "del"){
                //waypoint del [name: String]
                delete this.waypoints[args[2]];
            }else if(args[1] == "goto"){
                //waypoint goto [name: String]
                if(this.waypoints[args[2]]?.x && this.waypoints[args[2]]?.y){
                    this.goal.pathing = true;
                    this.goal.type = "pos";
                    this.goal.pos.x = this.waypoints[args[2]].x;
                    this.goal.pos.y = this.waypoints[args[2]].y;
                }
            }
        }else if(args[0] == "wander" || args[0] == "wnd"){
            this.goal.pathing = true;
            this.goal.type = "wander";
            this.goal.pos.x = Math.random() * 14400;
            this.goal.pos.y = Math.random() * 14400;
		}
    }
    //determines if we are nearing goal
    reachedGoal(){
        if(this.goal.type == "xpos"){
            return Math.abs(this.self.x - this.goal.pos.x) < this.pathfinder.estimatedSpeed;
        }else if(this.goal.type == "ypos"){
            return Math.abs(this.self.y - this.goal.pos.y) < this.pathfinder.estimatedSpeed;
        }else if(this.goal.type == "pos" || this.goal.type == "wander"){
            return Math.hypot(this.self.x - this.goal.pos.x, this.self.y - this.goal.pos.y) < this.pathfinder.estimatedSpeed;
        }
    }
    async updatePlayers(players){
        if(this.goal.pathing){
            let finalGoal;
            if(this.goal.type == "xpos"){
                //go towards x position
                finalGoal = [];
                for(let i = -this.pathfinder.size; i <= this.pathfinder.size; i++){
					finalGoal.push({
						x: this.goal.pos.x,
						y: this.self.y + i * this.pathfinder.res,
					})
                }
            }else if(this.goal.type == "ypos"){
                //go towards y position
                finalGoal = [];
                for(let i = -this.pathfinder.size; i <= this.pathfinder.size;i += 3){
					finalGoal.push({
						x: this.self.x + i * this.pathfinder.res,
						y: this.goal.pos.y,
					})
                }
            }else if(this.goal.type == "pos" || this.goal.type == "wander"){
                //simple go towards position
                finalGoal = {
                    x: this.goal.pos.x,
                    y: this.goal.pos.y,
                };
            }else if(this.goal.type == "player"){
                //do pathfinding for following player
                if(this.goal.entity === -1){
                    finalGoal = [];
                    for(let player of players){
                        if(player.visible && player.sid != this.self.sid){
                            finalGoal.push(player)
                        }
                    }
                    if(!finalGoal.length){
                        finalGoal = null;
                    }
                }else{
                    for(let player of players){
                        if(player.visible && player.sid != this.self.sid && (player.sid == this.goal.entity || player.name == this.goal.entity)){
                            finalGoal = player;
                            break;
                        }
                    }
                }
            }else if(this.goal.type == "team"){
                //follow teammates
                finalGoal = [];
                for(let player of players){
                    if(player.team == this.self.team && player.sid != this.self.sid){
                        finalGoal.push(player)
                    }
                }
                if(!finalGoal.length || !this.self.team){
                    finalGoal = null;
                }
            }
            if(finalGoal){
                if(this.reachedGoal()){
					if(this.goal.type == "wander"){
						this.goal.pos.x = Math.random() * 14400;
						this.goal.pos.y = Math.random() * 14400;
					}else{
						this.goal.pathing = false;
					}
                    this.pathfinder.clearPath();
					this.send("33", null);
                }else{
                    let path = await Pathfinder.pathTo(finalGoal);
                    if(path){
                        this.send("33", path.ang);
                    }else{
                        this.send("33", null);
					}
                }
            }
        }
    }
    async updateAnimals(animals){
        if(this.goal.type == "animal" && this.goal.pathing){
            let finalGoal;
            if(this.goal.entity === -1){
                finalGoal = [];
                for(let animal of animals){
                    if(animal.visible && animal.sid != this.self.sid){
                        finalGoal.push(animal)
                    }
                }
                if(!finalGoal.length){
                    finalGoal = null;
                }
            }else{
                for(let animal of animals){
                    if(animal.visible && (animal.sid == this.goal.entity || animal.name == this.goal.entity)){
                        finalGoal = animal;
                        break;
                    }
                }
            }
            if(this.reachedGoal()){
                this.pathfinder.clearPath();
                this.goal.pathing = false;
                this.send("33", null);
            }else if(finalGoal){
                let path = await this.pathfinder.pathTo(finalGoal);
                if(path){
                    this.send("33", path.ang);
                }else{
                    this.send("33", null);
                }
            }
        }
    }
    async addBuilding(obj){
        await new Promise((resolve) => {
            let id = setInterval(() => {
                if(!this.pathfinder.resolve){
                    resolve();
                    clearInterval(id);
                }
            })
        })
        let path = this.pathfinder.getPath();
        let dist = path?.dist + this.pathfinder.estimatedSpeed / this.pathfinder.res + 3;
        dist = Math.min(this.pathfinder.prevPath.length - 1, Math.trunc(dist));
        if(dist){
            for(let i = dist; i >= 0; i--){
                let point = this.pathfinder.prevPath[i];
                if(Math.hypot(point.x - obj.x, point.y - obj.y) < obj.scale + 30){
                    this.pathfinder.prevPath = this.pathfinder.prevPath.slice(i);
                    break;
                }
            }
        }
    }
}

var Tach = new Tachyon(Pathfinder);



!function(e) {
    var t = {};
    function n(i) {
        if (t[i])
            return t[i].exports;
        var r = t[i] = {
            i: i,
            l: !1,
            exports: {}
        };
        return e[i].call(r.exports, r, r.exports, n),
        r.l = !0,
        r.exports
    }
    n.m = e,
    n.c = t,
    n.d = function(e, t, i) {
        n.o(e, t) || Object.defineProperty(e, t, {
            enumerable: !0,
            get: i
        })
    }
    ,
    n.r = function(e) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
            value: "Module"
        }),
        Object.defineProperty(e, "__esModule", {
            value: !0
        })
    }
    ,
    n.t = function(e, t) {
        if (1 & t && (e = n(e)),
        8 & t)
            return e;
        if (4 & t && "object" == typeof e && e && e.__esModule)
            return e;
        var i = Object.create(null);
        if (n.r(i),
        Object.defineProperty(i, "default", {
            enumerable: !0,
            value: e
        }),
        2 & t && "string" != typeof e)
            for (var r in e)
                n.d(i, r, function(t) {
                    return e[t]
                }
                .bind(null, r));
        return i
    }
    ,
    n.n = function(e) {
        var t = e && e.__esModule ? function() {
            return e.default
        }
        : function() {
            return e
        }
        ;
        return n.d(t, "a", t),
        t
    }
    ,
    n.o = function(e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }
    ,
    n.p = "",
    n(n.s = 21)
}([function(e, t, n) {
    var i = t.global = n(25)
      , r = t.hasBuffer = i && !!i.isBuffer
      , s = t.hasArrayBuffer = "undefined" != typeof ArrayBuffer
      , a = t.isArray = n(5);
    t.isArrayBuffer = s ? function(e) {
        return e instanceof ArrayBuffer || p(e)
    }
    : m;
    var o = t.isBuffer = r ? i.isBuffer : m
      , c = t.isView = s ? ArrayBuffer.isView || y("ArrayBuffer", "buffer") : m;
    t.alloc = d,
    t.concat = function(e, n) {
        n || (n = 0,
        Array.prototype.forEach.call(e, (function(e) {
            n += e.length
        }
        )));
        var i = this !== t && this || e[0]
          , r = d.call(i, n)
          , s = 0;
        return Array.prototype.forEach.call(e, (function(e) {
            s += f.copy.call(e, r, s)
        }
        )),
        r
    }
    ,
    t.from = function(e) {
        return "string" == typeof e ? function(e) {
            var t = 3 * e.length
              , n = d.call(this, t)
              , i = f.write.call(n, e);
            return t !== i && (n = f.slice.call(n, 0, i)),
            n
        }
        .call(this, e) : g(this).from(e)
    }
    ;
    var l = t.Array = n(28)
      , h = t.Buffer = n(29)
      , u = t.Uint8Array = n(30)
      , f = t.prototype = n(6);
    function d(e) {
        return g(this).alloc(e)
    }
    var p = y("ArrayBuffer");
    function g(e) {
        return o(e) ? h : c(e) ? u : a(e) ? l : r ? h : s ? u : l
    }
    function m() {
        return !1
    }
    function y(e, t) {
        return e = "[object " + e + "]",
        function(n) {
            return null != n && {}.toString.call(t ? n[t] : n) === e
        }
    }
}
, function(e, t, n) {
    var i = n(5);
    t.createCodec = o,
    t.install = function(e) {
        for (var t in e)
            s.prototype[t] = a(s.prototype[t], e[t])
    }
    ,
    t.filter = function(e) {
        return i(e) ? function(e) {
            return e = e.slice(),
            function(n) {
                return e.reduce(t, n)
            }
            ;
            function t(e, t) {
                return t(e)
            }
        }(e) : e
    }
    ;
    var r = n(0);
    function s(e) {
        if (!(this instanceof s))
            return new s(e);
        this.options = e,
        this.init()
    }
    function a(e, t) {
        return e && t ? function() {
            return e.apply(this, arguments),
            t.apply(this, arguments)
        }
        : e || t
    }
    function o(e) {
        return new s(e)
    }
    s.prototype.init = function() {
        var e = this.options;
        return e && e.uint8array && (this.bufferish = r.Uint8Array),
        this
    }
    ,
    t.preset = o({
        preset: !0
    })
}
, function(e, t, n) {
    var i = n(3).ExtBuffer
      , r = n(32)
      , s = n(33)
      , a = n(1);
    function o() {
        var e = this.options;
        return this.encode = function(e) {
            var t = s.getWriteType(e);
            return function(e, n) {
                var i = t[typeof n];
                if (!i)
                    throw new Error('Unsupported type "' + typeof n + '": ' + n);
                i(e, n)
            }
        }(e),
        e && e.preset && r.setExtPackers(this),
        this
    }
    a.install({
        addExtPacker: function(e, t, n) {
            n = a.filter(n);
            var r = t.name;
            r && "Object" !== r ? (this.extPackers || (this.extPackers = {}))[r] = s : (this.extEncoderList || (this.extEncoderList = [])).unshift([t, s]);
            function s(t) {
                return n && (t = n(t)),
                new i(t,e)
            }
        },
        getExtPacker: function(e) {
            var t = this.extPackers || (this.extPackers = {})
              , n = e.constructor
              , i = n && n.name && t[n.name];
            if (i)
                return i;
            for (var r = this.extEncoderList || (this.extEncoderList = []), s = r.length, a = 0; a < s; a++) {
                var o = r[a];
                if (n === o[0])
                    return o[1]
            }
        },
        init: o
    }),
    t.preset = o.call(a.preset)
}
, function(e, t, n) {
    t.ExtBuffer = function e(t, n) {
        if (!(this instanceof e))
            return new e(t,n);
        this.buffer = i.from(t),
        this.type = n
    }
    ;
    var i = n(0)
}
, function(e, t) {
    t.read = function(e, t, n, i, r) {
        var s, a, o = 8 * r - i - 1, c = (1 << o) - 1, l = c >> 1, h = -7, u = n ? r - 1 : 0, f = n ? -1 : 1, d = e[t + u];
        for (u += f,
        s = d & (1 << -h) - 1,
        d >>= -h,
        h += o; h > 0; s = 256 * s + e[t + u],
        u += f,
        h -= 8)
            ;
        for (a = s & (1 << -h) - 1,
        s >>= -h,
        h += i; h > 0; a = 256 * a + e[t + u],
        u += f,
        h -= 8)
            ;
        if (0 === s)
            s = 1 - l;
        else {
            if (s === c)
                return a ? NaN : 1 / 0 * (d ? -1 : 1);
            a += Math.pow(2, i),
            s -= l
        }
        return (d ? -1 : 1) * a * Math.pow(2, s - i)
    }
    ,
    t.write = function(e, t, n, i, r, s) {
        var a, o, c, l = 8 * s - r - 1, h = (1 << l) - 1, u = h >> 1, f = 23 === r ? Math.pow(2, -24) - Math.pow(2, -77) : 0, d = i ? 0 : s - 1, p = i ? 1 : -1, g = t < 0 || 0 === t && 1 / t < 0 ? 1 : 0;
        for (t = Math.abs(t),
        isNaN(t) || t === 1 / 0 ? (o = isNaN(t) ? 1 : 0,
        a = h) : (a = Math.floor(Math.log(t) / Math.LN2),
        t * (c = Math.pow(2, -a)) < 1 && (a--,
        c *= 2),
        (t += a + u >= 1 ? f / c : f * Math.pow(2, 1 - u)) * c >= 2 && (a++,
        c /= 2),
        a + u >= h ? (o = 0,
        a = h) : a + u >= 1 ? (o = (t * c - 1) * Math.pow(2, r),
        a += u) : (o = t * Math.pow(2, u - 1) * Math.pow(2, r),
        a = 0)); r >= 8; e[n + d] = 255 & o,
        d += p,
        o /= 256,
        r -= 8)
            ;
        for (a = a << r | o,
        l += r; l > 0; e[n + d] = 255 & a,
        d += p,
        a /= 256,
        l -= 8)
            ;
        e[n + d - p] |= 128 * g
    }
}
, function(e, t) {
    var n = {}.toString;
    e.exports = Array.isArray || function(e) {
        return "[object Array]" == n.call(e)
    }
}
, function(e, t, n) {
    var i = n(31);
    t.copy = c,
    t.slice = l,
    t.toString = function(e, t, n) {
        return (!a && r.isBuffer(this) ? this.toString : i.toString).apply(this, arguments)
    }
    ,
    t.write = function(e) {
        return function() {
            return (this[e] || i[e]).apply(this, arguments)
        }
    }("write");
    var r = n(0)
      , s = r.global
      , a = r.hasBuffer && "TYPED_ARRAY_SUPPORT"in s
      , o = a && !s.TYPED_ARRAY_SUPPORT;
    function c(e, t, n, s) {
        var a = r.isBuffer(this)
          , c = r.isBuffer(e);
        if (a && c)
            return this.copy(e, t, n, s);
        if (o || a || c || !r.isView(this) || !r.isView(e))
            return i.copy.call(this, e, t, n, s);
        var h = n || null != s ? l.call(this, n, s) : this;
        return e.set(h, t),
        h.length
    }
    function l(e, t) {
        var n = this.slice || !o && this.subarray;
        if (n)
            return n.call(this, e, t);
        var i = r.alloc.call(this, t - e);
        return c.call(this, i, 0, e, t),
        i
    }
}
, function(e, t, n) {
    (function(e) {
        !function(t) {
            var n, i = "undefined", r = i !== typeof e && e, s = i !== typeof Uint8Array && Uint8Array, a = i !== typeof ArrayBuffer && ArrayBuffer, o = [0, 0, 0, 0, 0, 0, 0, 0], c = Array.isArray || function(e) {
                return !!e && "[object Array]" == Object.prototype.toString.call(e)
            }
            , l = 4294967296;
            function h(e, c, h) {
                var b = c ? 0 : 4
                  , x = c ? 4 : 0
                  , S = c ? 0 : 3
                  , T = c ? 1 : 2
                  , I = c ? 2 : 1
                  , E = c ? 3 : 0
                  , M = c ? y : v
                  , A = c ? k : w
                  , P = O.prototype
                  , B = "is" + e
                  , C = "_" + B;
                return P.buffer = void 0,
                P.offset = 0,
                P[C] = !0,
                P.toNumber = R,
                P.toString = function(e) {
                    var t = this.buffer
                      , n = this.offset
                      , i = _(t, n + b)
                      , r = _(t, n + x)
                      , s = ""
                      , a = !h && 2147483648 & i;
                    for (a && (i = ~i,
                    r = l - r),
                    e = e || 10; ; ) {
                        var o = i % e * l + r;
                        if (i = Math.floor(i / e),
                        r = Math.floor(o / e),
                        s = (o % e).toString(e) + s,
                        !i && !r)
                            break
                    }
                    return a && (s = "-" + s),
                    s
                }
                ,
                P.toJSON = R,
                P.toArray = u,
                r && (P.toBuffer = f),
                s && (P.toArrayBuffer = d),
                O[B] = function(e) {
                    return !(!e || !e[C])
                }
                ,
                t[e] = O,
                O;
                function O(e, t, r, c) {
                    return this instanceof O ? function(e, t, r, c, h) {
                        if (s && a && (t instanceof a && (t = new s(t)),
                        c instanceof a && (c = new s(c))),
                        t || r || c || n) {
                            if (!p(t, r))
                                h = r,
                                c = t,
                                r = 0,
                                t = new (n || Array)(8);
                            e.buffer = t,
                            e.offset = r |= 0,
                            i !== typeof c && ("string" == typeof c ? function(e, t, n, i) {
                                var r = 0
                                  , s = n.length
                                  , a = 0
                                  , o = 0;
                                "-" === n[0] && r++;
                                for (var c = r; r < s; ) {
                                    var h = parseInt(n[r++], i);
                                    if (!(h >= 0))
                                        break;
                                    o = o * i + h,
                                    a = a * i + Math.floor(o / l),
                                    o %= l
                                }
                                c && (a = ~a,
                                o ? o = l - o : a++),
                                j(e, t + b, a),
                                j(e, t + x, o)
                            }(t, r, c, h || 10) : p(c, h) ? g(t, r, c, h) : "number" == typeof h ? (j(t, r + b, c),
                            j(t, r + x, h)) : c > 0 ? M(t, r, c) : c < 0 ? A(t, r, c) : g(t, r, o, 0))
                        } else
                            e.buffer = m(o, 0)
                    }(this, e, t, r, c) : new O(e,t,r,c)
                }
                function R() {
                    var e = this.buffer
                      , t = this.offset
                      , n = _(e, t + b)
                      , i = _(e, t + x);
                    return h || (n |= 0),
                    n ? n * l + i : i
                }
                function j(e, t, n) {
                    e[t + E] = 255 & n,
                    n >>= 8,
                    e[t + I] = 255 & n,
                    n >>= 8,
                    e[t + T] = 255 & n,
                    n >>= 8,
                    e[t + S] = 255 & n
                }
                function _(e, t) {
                    return 16777216 * e[t + S] + (e[t + T] << 16) + (e[t + I] << 8) + e[t + E]
                }
            }
            function u(e) {
                var t = this.buffer
                  , i = this.offset;
                return n = null,
                !1 !== e && 0 === i && 8 === t.length && c(t) ? t : m(t, i)
            }
            function f(t) {
                var i = this.buffer
                  , s = this.offset;
                if (n = r,
                !1 !== t && 0 === s && 8 === i.length && e.isBuffer(i))
                    return i;
                var a = new r(8);
                return g(a, 0, i, s),
                a
            }
            function d(e) {
                var t = this.buffer
                  , i = this.offset
                  , r = t.buffer;
                if (n = s,
                !1 !== e && 0 === i && r instanceof a && 8 === r.byteLength)
                    return r;
                var o = new s(8);
                return g(o, 0, t, i),
                o.buffer
            }
            function p(e, t) {
                var n = e && e.length;
                return t |= 0,
                n && t + 8 <= n && "string" != typeof e[t]
            }
            function g(e, t, n, i) {
                t |= 0,
                i |= 0;
                for (var r = 0; r < 8; r++)
                    e[t++] = 255 & n[i++]
            }
            function m(e, t) {
                return Array.prototype.slice.call(e, t, t + 8)
            }
            function y(e, t, n) {
                for (var i = t + 8; i > t; )
                    e[--i] = 255 & n,
                    n /= 256
            }
            function k(e, t, n) {
                var i = t + 8;
                for (n++; i > t; )
                    e[--i] = 255 & -n ^ 255,
                    n /= 256
            }
            function v(e, t, n) {
                for (var i = t + 8; t < i; )
                    e[t++] = 255 & n,
                    n /= 256
            }
            function w(e, t, n) {
                var i = t + 8;
                for (n++; t < i; )
                    e[t++] = 255 & -n ^ 255,
                    n /= 256
            }
            h("Uint64BE", !0, !0),
            h("Int64BE", !0, !1),
            h("Uint64LE", !1, !0),
            h("Int64LE", !1, !1)
        }("string" != typeof t.nodeName ? t : this || {})
    }
    ).call(this, n(11).Buffer)
}
, function(e, t, n) {
    var i = n(3).ExtBuffer
      , r = n(35)
      , s = n(17).readUint8
      , a = n(36)
      , o = n(1);
    function c() {
        var e = this.options;
        return this.decode = function(e) {
            var t = a.getReadToken(e);
            return function(e) {
                var n = s(e)
                  , i = t[n];
                if (!i)
                    throw new Error("Invalid type: " + (n ? "0x" + n.toString(16) : n));
                return i(e)
            }
        }(e),
        e && e.preset && r.setExtUnpackers(this),
        this
    }
    o.install({
        addExtUnpacker: function(e, t) {
            (this.extUnpackers || (this.extUnpackers = []))[e] = o.filter(t)
        },
        getExtUnpacker: function(e) {
            return (this.extUnpackers || (this.extUnpackers = []))[e] || function(t) {
                return new i(t,e)
            }
        },
        init: c
    }),
    t.preset = c.call(o.preset)
}
, function(e, t, n) {
    t.encode = function(e, t) {
        var n = new i(t);
        return n.write(e),
        n.read()
    }
    ;
    var i = n(10).EncodeBuffer
}
, function(e, t, n) {
    t.EncodeBuffer = r;
    var i = n(2).preset;
    function r(e) {
        if (!(this instanceof r))
            return new r(e);
        if (e && (this.options = e,
        e.codec)) {
            var t = this.codec = e.codec;
            t.bufferish && (this.bufferish = t.bufferish)
        }
    }
    n(14).FlexEncoder.mixin(r.prototype),
    r.prototype.codec = i,
    r.prototype.write = function(e) {
        this.codec.encode(this, e)
    }
}
, function(e, t, n) {
    "use strict";
    (function(e) {
        var i = n(26)
          , r = n(4)
          , s = n(27);
        function a() {
            return c.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823
        }
        function o(e, t) {
            if (a() < t)
                throw new RangeError("Invalid typed array length");
            return c.TYPED_ARRAY_SUPPORT ? (e = new Uint8Array(t)).__proto__ = c.prototype : (null === e && (e = new c(t)),
            e.length = t),
            e
        }
        function c(e, t, n) {
            if (!(c.TYPED_ARRAY_SUPPORT || this instanceof c))
                return new c(e,t,n);
            if ("number" == typeof e) {
                if ("string" == typeof t)
                    throw new Error("If encoding is specified then the first argument must be a string");
                return u(this, e)
            }
            return l(this, e, t, n)
        }
        function l(e, t, n, i) {
            if ("number" == typeof t)
                throw new TypeError('"value" argument must not be a number');
            return "undefined" != typeof ArrayBuffer && t instanceof ArrayBuffer ? function(e, t, n, i) {
                if (t.byteLength,
                n < 0 || t.byteLength < n)
                    throw new RangeError("'offset' is out of bounds");
                if (t.byteLength < n + (i || 0))
                    throw new RangeError("'length' is out of bounds");
                return t = void 0 === n && void 0 === i ? new Uint8Array(t) : void 0 === i ? new Uint8Array(t,n) : new Uint8Array(t,n,i),
                c.TYPED_ARRAY_SUPPORT ? (e = t).__proto__ = c.prototype : e = f(e, t),
                e
            }(e, t, n, i) : "string" == typeof t ? function(e, t, n) {
                if ("string" == typeof n && "" !== n || (n = "utf8"),
                !c.isEncoding(n))
                    throw new TypeError('"encoding" must be a valid string encoding');
                var i = 0 | p(t, n)
                  , r = (e = o(e, i)).write(t, n);
                return r !== i && (e = e.slice(0, r)),
                e
            }(e, t, n) : function(e, t) {
                if (c.isBuffer(t)) {
                    var n = 0 | d(t.length);
                    return 0 === (e = o(e, n)).length || t.copy(e, 0, 0, n),
                    e
                }
                if (t) {
                    if ("undefined" != typeof ArrayBuffer && t.buffer instanceof ArrayBuffer || "length"in t)
                        return "number" != typeof t.length || function(e) {
                            return e != e
                        }(t.length) ? o(e, 0) : f(e, t);
                    if ("Buffer" === t.type && s(t.data))
                        return f(e, t.data)
                }
                throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")
            }(e, t)
        }
        function h(e) {
            if ("number" != typeof e)
                throw new TypeError('"size" argument must be a number');
            if (e < 0)
                throw new RangeError('"size" argument must not be negative')
        }
        function u(e, t) {
            if (h(t),
            e = o(e, t < 0 ? 0 : 0 | d(t)),
            !c.TYPED_ARRAY_SUPPORT)
                for (var n = 0; n < t; ++n)
                    e[n] = 0;
            return e
        }
        function f(e, t) {
            var n = t.length < 0 ? 0 : 0 | d(t.length);
            e = o(e, n);
            for (var i = 0; i < n; i += 1)
                e[i] = 255 & t[i];
            return e
        }
        function d(e) {
            if (e >= a())
                throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + a().toString(16) + " bytes");
            return 0 | e
        }
        function p(e, t) {
            if (c.isBuffer(e))
                return e.length;
            if ("undefined" != typeof ArrayBuffer && "function" == typeof ArrayBuffer.isView && (ArrayBuffer.isView(e) || e instanceof ArrayBuffer))
                return e.byteLength;
            "string" != typeof e && (e = "" + e);
            var n = e.length;
            if (0 === n)
                return 0;
            for (var i = !1; ; )
                switch (t) {
                case "ascii":
                case "latin1":
                case "binary":
                    return n;
                case "utf8":
                case "utf-8":
                case void 0:
                    return z(e).length;
                case "ucs2":
                case "ucs-2":
                case "utf16le":
                case "utf-16le":
                    return 2 * n;
                case "hex":
                    return n >>> 1;
                case "base64":
                    return H(e).length;
                default:
                    if (i)
                        return z(e).length;
                    t = ("" + t).toLowerCase(),
                    i = !0
                }
        }
        function g(e, t, n) {
            var i = e[t];
            e[t] = e[n],
            e[n] = i
        }
        function m(e, t, n, i, r) {
            if (0 === e.length)
                return -1;
            if ("string" == typeof n ? (i = n,
            n = 0) : n > 2147483647 ? n = 2147483647 : n < -2147483648 && (n = -2147483648),
            n = +n,
            isNaN(n) && (n = r ? 0 : e.length - 1),
            n < 0 && (n = e.length + n),
            n >= e.length) {
                if (r)
                    return -1;
                n = e.length - 1
            } else if (n < 0) {
                if (!r)
                    return -1;
                n = 0
            }
            if ("string" == typeof t && (t = c.from(t, i)),
            c.isBuffer(t))
                return 0 === t.length ? -1 : y(e, t, n, i, r);
            if ("number" == typeof t)
                return t &= 255,
                c.TYPED_ARRAY_SUPPORT && "function" == typeof Uint8Array.prototype.indexOf ? r ? Uint8Array.prototype.indexOf.call(e, t, n) : Uint8Array.prototype.lastIndexOf.call(e, t, n) : y(e, [t], n, i, r);
            throw new TypeError("val must be string, number or Buffer")
        }
        function y(e, t, n, i, r) {
            var s, a = 1, o = e.length, c = t.length;
            if (void 0 !== i && ("ucs2" === (i = String(i).toLowerCase()) || "ucs-2" === i || "utf16le" === i || "utf-16le" === i)) {
                if (e.length < 2 || t.length < 2)
                    return -1;
                a = 2,
                o /= 2,
                c /= 2,
                n /= 2
            }
            function l(e, t) {
                return 1 === a ? e[t] : e.readUInt16BE(t * a)
            }
            if (r) {
                var h = -1;
                for (s = n; s < o; s++)
                    if (l(e, s) === l(t, -1 === h ? 0 : s - h)) {
                        if (-1 === h && (h = s),
                        s - h + 1 === c)
                            return h * a
                    } else
                        -1 !== h && (s -= s - h),
                        h = -1
            } else
                for (n + c > o && (n = o - c),
                s = n; s >= 0; s--) {
                    for (var u = !0, f = 0; f < c; f++)
                        if (l(e, s + f) !== l(t, f)) {
                            u = !1;
                            break
                        }
                    if (u)
                        return s
                }
            return -1
        }
        function k(e, t, n, i) {
            n = Number(n) || 0;
            var r = e.length - n;
            i ? (i = Number(i)) > r && (i = r) : i = r;
            var s = t.length;
            if (s % 2 != 0)
                throw new TypeError("Invalid hex string");
            i > s / 2 && (i = s / 2);
            for (var a = 0; a < i; ++a) {
                var o = parseInt(t.substr(2 * a, 2), 16);
                if (isNaN(o))
                    return a;
                e[n + a] = o
            }
            return a
        }
        function v(e, t, n, i) {
            return V(z(t, e.length - n), e, n, i)
        }
        function w(e, t, n, i) {
            return V(function(e) {
                for (var t = [], n = 0; n < e.length; ++n)
                    t.push(255 & e.charCodeAt(n));
                return t
            }(t), e, n, i)
        }
        function b(e, t, n, i) {
            return w(e, t, n, i)
        }
        function x(e, t, n, i) {
            return V(H(t), e, n, i)
        }
        function S(e, t, n, i) {
            return V(function(e, t) {
                for (var n, i, r, s = [], a = 0; a < e.length && !((t -= 2) < 0); ++a)
                    i = (n = e.charCodeAt(a)) >> 8,
                    r = n % 256,
                    s.push(r),
                    s.push(i);
                return s
            }(t, e.length - n), e, n, i)
        }
        function T(e, t, n) {
            return 0 === t && n === e.length ? i.fromByteArray(e) : i.fromByteArray(e.slice(t, n))
        }
        function I(e, t, n) {
            n = Math.min(e.length, n);
            for (var i = [], r = t; r < n; ) {
                var s, a, o, c, l = e[r], h = null, u = l > 239 ? 4 : l > 223 ? 3 : l > 191 ? 2 : 1;
                if (r + u <= n)
                    switch (u) {
                    case 1:
                        l < 128 && (h = l);
                        break;
                    case 2:
                        128 == (192 & (s = e[r + 1])) && (c = (31 & l) << 6 | 63 & s) > 127 && (h = c);
                        break;
                    case 3:
                        s = e[r + 1],
                        a = e[r + 2],
                        128 == (192 & s) && 128 == (192 & a) && (c = (15 & l) << 12 | (63 & s) << 6 | 63 & a) > 2047 && (c < 55296 || c > 57343) && (h = c);
                        break;
                    case 4:
                        s = e[r + 1],
                        a = e[r + 2],
                        o = e[r + 3],
                        128 == (192 & s) && 128 == (192 & a) && 128 == (192 & o) && (c = (15 & l) << 18 | (63 & s) << 12 | (63 & a) << 6 | 63 & o) > 65535 && c < 1114112 && (h = c)
                    }
                null === h ? (h = 65533,
                u = 1) : h > 65535 && (h -= 65536,
                i.push(h >>> 10 & 1023 | 55296),
                h = 56320 | 1023 & h),
                i.push(h),
                r += u
            }
            return function(e) {
                var t = e.length;
                if (t <= E)
                    return String.fromCharCode.apply(String, e);
                for (var n = "", i = 0; i < t; )
                    n += String.fromCharCode.apply(String, e.slice(i, i += E));
                return n
            }(i)
        }
        t.Buffer = c,
        t.SlowBuffer = function(e) {
            return +e != e && (e = 0),
            c.alloc(+e)
        }
        ,
        t.INSPECT_MAX_BYTES = 50,
        c.TYPED_ARRAY_SUPPORT = void 0 !== e.TYPED_ARRAY_SUPPORT ? e.TYPED_ARRAY_SUPPORT : function() {
            try {
                var e = new Uint8Array(1);
                return e.__proto__ = {
                    __proto__: Uint8Array.prototype,
                    foo: function() {
                        return 42
                    }
                },
                42 === e.foo() && "function" == typeof e.subarray && 0 === e.subarray(1, 1).byteLength
            } catch (e) {
                return !1
            }
        }(),
        t.kMaxLength = a(),
        c.poolSize = 8192,
        c._augment = function(e) {
            return e.__proto__ = c.prototype,
            e
        }
        ,
        c.from = function(e, t, n) {
            return l(null, e, t, n)
        }
        ,
        c.TYPED_ARRAY_SUPPORT && (c.prototype.__proto__ = Uint8Array.prototype,
        c.__proto__ = Uint8Array,
        "undefined" != typeof Symbol && Symbol.species && c[Symbol.species] === c && Object.defineProperty(c, Symbol.species, {
            value: null,
            configurable: !0
        })),
        c.alloc = function(e, t, n) {
            return function(e, t, n, i) {
                return h(t),
                t <= 0 ? o(e, t) : void 0 !== n ? "string" == typeof i ? o(e, t).fill(n, i) : o(e, t).fill(n) : o(e, t)
            }(null, e, t, n)
        }
        ,
        c.allocUnsafe = function(e) {
            return u(null, e)
        }
        ,
        c.allocUnsafeSlow = function(e) {
            return u(null, e)
        }
        ,
        c.isBuffer = function(e) {
            return !(null == e || !e._isBuffer)
        }
        ,
        c.compare = function(e, t) {
            if (!c.isBuffer(e) || !c.isBuffer(t))
                throw new TypeError("Arguments must be Buffers");
            if (e === t)
                return 0;
            for (var n = e.length, i = t.length, r = 0, s = Math.min(n, i); r < s; ++r)
                if (e[r] !== t[r]) {
                    n = e[r],
                    i = t[r];
                    break
                }
            return n < i ? -1 : i < n ? 1 : 0
        }
        ,
        c.isEncoding = function(e) {
            switch (String(e).toLowerCase()) {
            case "hex":
            case "utf8":
            case "utf-8":
            case "ascii":
            case "latin1":
            case "binary":
            case "base64":
            case "ucs2":
            case "ucs-2":
            case "utf16le":
            case "utf-16le":
                return !0;
            default:
                return !1
            }
        }
        ,
        c.concat = function(e, t) {
            if (!s(e))
                throw new TypeError('"list" argument must be an Array of Buffers');
            if (0 === e.length)
                return c.alloc(0);
            var n;
            if (void 0 === t)
                for (t = 0,
                n = 0; n < e.length; ++n)
                    t += e[n].length;
            var i = c.allocUnsafe(t)
              , r = 0;
            for (n = 0; n < e.length; ++n) {
                var a = e[n];
                if (!c.isBuffer(a))
                    throw new TypeError('"list" argument must be an Array of Buffers');
                a.copy(i, r),
                r += a.length
            }
            return i
        }
        ,
        c.byteLength = p,
        c.prototype._isBuffer = !0,
        c.prototype.swap16 = function() {
            var e = this.length;
            if (e % 2 != 0)
                throw new RangeError("Buffer size must be a multiple of 16-bits");
            for (var t = 0; t < e; t += 2)
                g(this, t, t + 1);
            return this
        }
        ,
        c.prototype.swap32 = function() {
            var e = this.length;
            if (e % 4 != 0)
                throw new RangeError("Buffer size must be a multiple of 32-bits");
            for (var t = 0; t < e; t += 4)
                g(this, t, t + 3),
                g(this, t + 1, t + 2);
            return this
        }
        ,
        c.prototype.swap64 = function() {
            var e = this.length;
            if (e % 8 != 0)
                throw new RangeError("Buffer size must be a multiple of 64-bits");
            for (var t = 0; t < e; t += 8)
                g(this, t, t + 7),
                g(this, t + 1, t + 6),
                g(this, t + 2, t + 5),
                g(this, t + 3, t + 4);
            return this
        }
        ,
        c.prototype.toString = function() {
            var e = 0 | this.length;
            return 0 === e ? "" : 0 === arguments.length ? I(this, 0, e) : function(e, t, n) {
                var i = !1;
                if ((void 0 === t || t < 0) && (t = 0),
                t > this.length)
                    return "";
                if ((void 0 === n || n > this.length) && (n = this.length),
                n <= 0)
                    return "";
                if ((n >>>= 0) <= (t >>>= 0))
                    return "";
                for (e || (e = "utf8"); ; )
                    switch (e) {
                    case "hex":
                        return P(this, t, n);
                    case "utf8":
                    case "utf-8":
                        return I(this, t, n);
                    case "ascii":
                        return M(this, t, n);
                    case "latin1":
                    case "binary":
                        return A(this, t, n);
                    case "base64":
                        return T(this, t, n);
                    case "ucs2":
                    case "ucs-2":
                    case "utf16le":
                    case "utf-16le":
                        return B(this, t, n);
                    default:
                        if (i)
                            throw new TypeError("Unknown encoding: " + e);
                        e = (e + "").toLowerCase(),
                        i = !0
                    }
            }
            .apply(this, arguments)
        }
        ,
        c.prototype.equals = function(e) {
            if (!c.isBuffer(e))
                throw new TypeError("Argument must be a Buffer");
            return this === e || 0 === c.compare(this, e)
        }
        ,
        c.prototype.inspect = function() {
            var e = ""
              , n = t.INSPECT_MAX_BYTES;
            return this.length > 0 && (e = this.toString("hex", 0, n).match(/.{2}/g).join(" "),
            this.length > n && (e += " ... ")),
            "<Buffer " + e + ">"
        }
        ,
        c.prototype.compare = function(e, t, n, i, r) {
            if (!c.isBuffer(e))
                throw new TypeError("Argument must be a Buffer");
            if (void 0 === t && (t = 0),
            void 0 === n && (n = e ? e.length : 0),
            void 0 === i && (i = 0),
            void 0 === r && (r = this.length),
            t < 0 || n > e.length || i < 0 || r > this.length)
                throw new RangeError("out of range index");
            if (i >= r && t >= n)
                return 0;
            if (i >= r)
                return -1;
            if (t >= n)
                return 1;
            if (this === e)
                return 0;
            for (var s = (r >>>= 0) - (i >>>= 0), a = (n >>>= 0) - (t >>>= 0), o = Math.min(s, a), l = this.slice(i, r), h = e.slice(t, n), u = 0; u < o; ++u)
                if (l[u] !== h[u]) {
                    s = l[u],
                    a = h[u];
                    break
                }
            return s < a ? -1 : a < s ? 1 : 0
        }
        ,
        c.prototype.includes = function(e, t, n) {
            return -1 !== this.indexOf(e, t, n)
        }
        ,
        c.prototype.indexOf = function(e, t, n) {
            return m(this, e, t, n, !0)
        }
        ,
        c.prototype.lastIndexOf = function(e, t, n) {
            return m(this, e, t, n, !1)
        }
        ,
        c.prototype.write = function(e, t, n, i) {
            if (void 0 === t)
                i = "utf8",
                n = this.length,
                t = 0;
            else if (void 0 === n && "string" == typeof t)
                i = t,
                n = this.length,
                t = 0;
            else {
                if (!isFinite(t))
                    throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
                t |= 0,
                isFinite(n) ? (n |= 0,
                void 0 === i && (i = "utf8")) : (i = n,
                n = void 0)
            }
            var r = this.length - t;
            if ((void 0 === n || n > r) && (n = r),
            e.length > 0 && (n < 0 || t < 0) || t > this.length)
                throw new RangeError("Attempt to write outside buffer bounds");
            i || (i = "utf8");
            for (var s = !1; ; )
                switch (i) {
                case "hex":
                    return k(this, e, t, n);
                case "utf8":
                case "utf-8":
                    return v(this, e, t, n);
                case "ascii":
                    return w(this, e, t, n);
                case "latin1":
                case "binary":
                    return b(this, e, t, n);
                case "base64":
                    return x(this, e, t, n);
                case "ucs2":
                case "ucs-2":
                case "utf16le":
                case "utf-16le":
                    return S(this, e, t, n);
                default:
                    if (s)
                        throw new TypeError("Unknown encoding: " + i);
                    i = ("" + i).toLowerCase(),
                    s = !0
                }
        }
        ,
        c.prototype.toJSON = function() {
            return {
                type: "Buffer",
                data: Array.prototype.slice.call(this._arr || this, 0)
            }
        }
        ;
        var E = 4096;
        function M(e, t, n) {
            var i = "";
            n = Math.min(e.length, n);
            for (var r = t; r < n; ++r)
                i += String.fromCharCode(127 & e[r]);
            return i
        }
        function A(e, t, n) {
            var i = "";
            n = Math.min(e.length, n);
            for (var r = t; r < n; ++r)
                i += String.fromCharCode(e[r]);
            return i
        }
        function P(e, t, n) {
            var i = e.length;
            (!t || t < 0) && (t = 0),
            (!n || n < 0 || n > i) && (n = i);
            for (var r = "", s = t; s < n; ++s)
                r += F(e[s]);
            return r
        }
        function B(e, t, n) {
            for (var i = e.slice(t, n), r = "", s = 0; s < i.length; s += 2)
                r += String.fromCharCode(i[s] + 256 * i[s + 1]);
            return r
        }
        function C(e, t, n) {
            if (e % 1 != 0 || e < 0)
                throw new RangeError("offset is not uint");
            if (e + t > n)
                throw new RangeError("Trying to access beyond buffer length")
        }
        function O(e, t, n, i, r, s) {
            if (!c.isBuffer(e))
                throw new TypeError('"buffer" argument must be a Buffer instance');
            if (t > r || t < s)
                throw new RangeError('"value" argument is out of bounds');
            if (n + i > e.length)
                throw new RangeError("Index out of range")
        }
        function R(e, t, n, i) {
            t < 0 && (t = 65535 + t + 1);
            for (var r = 0, s = Math.min(e.length - n, 2); r < s; ++r)
                e[n + r] = (t & 255 << 8 * (i ? r : 1 - r)) >>> 8 * (i ? r : 1 - r)
        }
        function j(e, t, n, i) {
            t < 0 && (t = 4294967295 + t + 1);
            for (var r = 0, s = Math.min(e.length - n, 4); r < s; ++r)
                e[n + r] = t >>> 8 * (i ? r : 3 - r) & 255
        }
        function _(e, t, n, i, r, s) {
            if (n + i > e.length)
                throw new RangeError("Index out of range");
            if (n < 0)
                throw new RangeError("Index out of range")
        }
        function U(e, t, n, i, s) {
            return s || _(e, 0, n, 4),
            r.write(e, t, n, i, 23, 4),
            n + 4
        }
        function D(e, t, n, i, s) {
            return s || _(e, 0, n, 8),
            r.write(e, t, n, i, 52, 8),
            n + 8
        }
        c.prototype.slice = function(e, t) {
            var n, i = this.length;
            if ((e = ~~e) < 0 ? (e += i) < 0 && (e = 0) : e > i && (e = i),
            (t = void 0 === t ? i : ~~t) < 0 ? (t += i) < 0 && (t = 0) : t > i && (t = i),
            t < e && (t = e),
            c.TYPED_ARRAY_SUPPORT)
                (n = this.subarray(e, t)).__proto__ = c.prototype;
            else {
                var r = t - e;
                n = new c(r,void 0);
                for (var s = 0; s < r; ++s)
                    n[s] = this[s + e]
            }
            return n
        }
        ,
        c.prototype.readUIntLE = function(e, t, n) {
            e |= 0,
            t |= 0,
            n || C(e, t, this.length);
            for (var i = this[e], r = 1, s = 0; ++s < t && (r *= 256); )
                i += this[e + s] * r;
            return i
        }
        ,
        c.prototype.readUIntBE = function(e, t, n) {
            e |= 0,
            t |= 0,
            n || C(e, t, this.length);
            for (var i = this[e + --t], r = 1; t > 0 && (r *= 256); )
                i += this[e + --t] * r;
            return i
        }
        ,
        c.prototype.readUInt8 = function(e, t) {
            return t || C(e, 1, this.length),
            this[e]
        }
        ,
        c.prototype.readUInt16LE = function(e, t) {
            return t || C(e, 2, this.length),
            this[e] | this[e + 1] << 8
        }
        ,
        c.prototype.readUInt16BE = function(e, t) {
            return t || C(e, 2, this.length),
            this[e] << 8 | this[e + 1]
        }
        ,
        c.prototype.readUInt32LE = function(e, t) {
            return t || C(e, 4, this.length),
            (this[e] | this[e + 1] << 8 | this[e + 2] << 16) + 16777216 * this[e + 3]
        }
        ,
        c.prototype.readUInt32BE = function(e, t) {
            return t || C(e, 4, this.length),
            16777216 * this[e] + (this[e + 1] << 16 | this[e + 2] << 8 | this[e + 3])
        }
        ,
        c.prototype.readIntLE = function(e, t, n) {
            e |= 0,
            t |= 0,
            n || C(e, t, this.length);
            for (var i = this[e], r = 1, s = 0; ++s < t && (r *= 256); )
                i += this[e + s] * r;
            return i >= (r *= 128) && (i -= Math.pow(2, 8 * t)),
            i
        }
        ,
        c.prototype.readIntBE = function(e, t, n) {
            e |= 0,
            t |= 0,
            n || C(e, t, this.length);
            for (var i = t, r = 1, s = this[e + --i]; i > 0 && (r *= 256); )
                s += this[e + --i] * r;
            return s >= (r *= 128) && (s -= Math.pow(2, 8 * t)),
            s
        }
        ,
        c.prototype.readInt8 = function(e, t) {
            return t || C(e, 1, this.length),
            128 & this[e] ? -1 * (255 - this[e] + 1) : this[e]
        }
        ,
        c.prototype.readInt16LE = function(e, t) {
            t || C(e, 2, this.length);
            var n = this[e] | this[e + 1] << 8;
            return 32768 & n ? 4294901760 | n : n
        }
        ,
        c.prototype.readInt16BE = function(e, t) {
            t || C(e, 2, this.length);
            var n = this[e + 1] | this[e] << 8;
            return 32768 & n ? 4294901760 | n : n
        }
        ,
        c.prototype.readInt32LE = function(e, t) {
            return t || C(e, 4, this.length),
            this[e] | this[e + 1] << 8 | this[e + 2] << 16 | this[e + 3] << 24
        }
        ,
        c.prototype.readInt32BE = function(e, t) {
            return t || C(e, 4, this.length),
            this[e] << 24 | this[e + 1] << 16 | this[e + 2] << 8 | this[e + 3]
        }
        ,
        c.prototype.readFloatLE = function(e, t) {
            return t || C(e, 4, this.length),
            r.read(this, e, !0, 23, 4)
        }
        ,
        c.prototype.readFloatBE = function(e, t) {
            return t || C(e, 4, this.length),
            r.read(this, e, !1, 23, 4)
        }
        ,
        c.prototype.readDoubleLE = function(e, t) {
            return t || C(e, 8, this.length),
            r.read(this, e, !0, 52, 8)
        }
        ,
        c.prototype.readDoubleBE = function(e, t) {
            return t || C(e, 8, this.length),
            r.read(this, e, !1, 52, 8)
        }
        ,
        c.prototype.writeUIntLE = function(e, t, n, i) {
            e = +e,
            t |= 0,
            n |= 0,
            i || O(this, e, t, n, Math.pow(2, 8 * n) - 1, 0);
            var r = 1
              , s = 0;
            for (this[t] = 255 & e; ++s < n && (r *= 256); )
                this[t + s] = e / r & 255;
            return t + n
        }
        ,
        c.prototype.writeUIntBE = function(e, t, n, i) {
            e = +e,
            t |= 0,
            n |= 0,
            i || O(this, e, t, n, Math.pow(2, 8 * n) - 1, 0);
            var r = n - 1
              , s = 1;
            for (this[t + r] = 255 & e; --r >= 0 && (s *= 256); )
                this[t + r] = e / s & 255;
            return t + n
        }
        ,
        c.prototype.writeUInt8 = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 1, 255, 0),
            c.TYPED_ARRAY_SUPPORT || (e = Math.floor(e)),
            this[t] = 255 & e,
            t + 1
        }
        ,
        c.prototype.writeUInt16LE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 2, 65535, 0),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = 255 & e,
            this[t + 1] = e >>> 8) : R(this, e, t, !0),
            t + 2
        }
        ,
        c.prototype.writeUInt16BE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 2, 65535, 0),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = e >>> 8,
            this[t + 1] = 255 & e) : R(this, e, t, !1),
            t + 2
        }
        ,
        c.prototype.writeUInt32LE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 4, 4294967295, 0),
            c.TYPED_ARRAY_SUPPORT ? (this[t + 3] = e >>> 24,
            this[t + 2] = e >>> 16,
            this[t + 1] = e >>> 8,
            this[t] = 255 & e) : j(this, e, t, !0),
            t + 4
        }
        ,
        c.prototype.writeUInt32BE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 4, 4294967295, 0),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = e >>> 24,
            this[t + 1] = e >>> 16,
            this[t + 2] = e >>> 8,
            this[t + 3] = 255 & e) : j(this, e, t, !1),
            t + 4
        }
        ,
        c.prototype.writeIntLE = function(e, t, n, i) {
            if (e = +e,
            t |= 0,
            !i) {
                var r = Math.pow(2, 8 * n - 1);
                O(this, e, t, n, r - 1, -r)
            }
            var s = 0
              , a = 1
              , o = 0;
            for (this[t] = 255 & e; ++s < n && (a *= 256); )
                e < 0 && 0 === o && 0 !== this[t + s - 1] && (o = 1),
                this[t + s] = (e / a >> 0) - o & 255;
            return t + n
        }
        ,
        c.prototype.writeIntBE = function(e, t, n, i) {
            if (e = +e,
            t |= 0,
            !i) {
                var r = Math.pow(2, 8 * n - 1);
                O(this, e, t, n, r - 1, -r)
            }
            var s = n - 1
              , a = 1
              , o = 0;
            for (this[t + s] = 255 & e; --s >= 0 && (a *= 256); )
                e < 0 && 0 === o && 0 !== this[t + s + 1] && (o = 1),
                this[t + s] = (e / a >> 0) - o & 255;
            return t + n
        }
        ,
        c.prototype.writeInt8 = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 1, 127, -128),
            c.TYPED_ARRAY_SUPPORT || (e = Math.floor(e)),
            e < 0 && (e = 255 + e + 1),
            this[t] = 255 & e,
            t + 1
        }
        ,
        c.prototype.writeInt16LE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 2, 32767, -32768),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = 255 & e,
            this[t + 1] = e >>> 8) : R(this, e, t, !0),
            t + 2
        }
        ,
        c.prototype.writeInt16BE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 2, 32767, -32768),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = e >>> 8,
            this[t + 1] = 255 & e) : R(this, e, t, !1),
            t + 2
        }
        ,
        c.prototype.writeInt32LE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 4, 2147483647, -2147483648),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = 255 & e,
            this[t + 1] = e >>> 8,
            this[t + 2] = e >>> 16,
            this[t + 3] = e >>> 24) : j(this, e, t, !0),
            t + 4
        }
        ,
        c.prototype.writeInt32BE = function(e, t, n) {
            return e = +e,
            t |= 0,
            n || O(this, e, t, 4, 2147483647, -2147483648),
            e < 0 && (e = 4294967295 + e + 1),
            c.TYPED_ARRAY_SUPPORT ? (this[t] = e >>> 24,
            this[t + 1] = e >>> 16,
            this[t + 2] = e >>> 8,
            this[t + 3] = 255 & e) : j(this, e, t, !1),
            t + 4
        }
        ,
        c.prototype.writeFloatLE = function(e, t, n) {
            return U(this, e, t, !0, n)
        }
        ,
        c.prototype.writeFloatBE = function(e, t, n) {
            return U(this, e, t, !1, n)
        }
        ,
        c.prototype.writeDoubleLE = function(e, t, n) {
            return D(this, e, t, !0, n)
        }
        ,
        c.prototype.writeDoubleBE = function(e, t, n) {
            return D(this, e, t, !1, n)
        }
        ,
        c.prototype.copy = function(e, t, n, i) {
            if (n || (n = 0),
            i || 0 === i || (i = this.length),
            t >= e.length && (t = e.length),
            t || (t = 0),
            i > 0 && i < n && (i = n),
            i === n)
                return 0;
            if (0 === e.length || 0 === this.length)
                return 0;
            if (t < 0)
                throw new RangeError("targetStart out of bounds");
            if (n < 0 || n >= this.length)
                throw new RangeError("sourceStart out of bounds");
            if (i < 0)
                throw new RangeError("sourceEnd out of bounds");
            i > this.length && (i = this.length),
            e.length - t < i - n && (i = e.length - t + n);
            var r, s = i - n;
            if (this === e && n < t && t < i)
                for (r = s - 1; r >= 0; --r)
                    e[r + t] = this[r + n];
            else if (s < 1e3 || !c.TYPED_ARRAY_SUPPORT)
                for (r = 0; r < s; ++r)
                    e[r + t] = this[r + n];
            else
                Uint8Array.prototype.set.call(e, this.subarray(n, n + s), t);
            return s
        }
        ,
        c.prototype.fill = function(e, t, n, i) {
            if ("string" == typeof e) {
                if ("string" == typeof t ? (i = t,
                t = 0,
                n = this.length) : "string" == typeof n && (i = n,
                n = this.length),
                1 === e.length) {
                    var r = e.charCodeAt(0);
                    r < 256 && (e = r)
                }
                if (void 0 !== i && "string" != typeof i)
                    throw new TypeError("encoding must be a string");
                if ("string" == typeof i && !c.isEncoding(i))
                    throw new TypeError("Unknown encoding: " + i)
            } else
                "number" == typeof e && (e &= 255);
            if (t < 0 || this.length < t || this.length < n)
                throw new RangeError("Out of range index");
            if (n <= t)
                return this;
            var s;
            if (t >>>= 0,
            n = void 0 === n ? this.length : n >>> 0,
            e || (e = 0),
            "number" == typeof e)
                for (s = t; s < n; ++s)
                    this[s] = e;
            else {
                var a = c.isBuffer(e) ? e : z(new c(e,i).toString())
                  , o = a.length;
                for (s = 0; s < n - t; ++s)
                    this[s + t] = a[s % o]
            }
            return this
        }
        ;
        var L = /[^+\/0-9A-Za-z-_]/g;
        function F(e) {
            return e < 16 ? "0" + e.toString(16) : e.toString(16)
        }
        function z(e, t) {
            var n;
            t = t || 1 / 0;
            for (var i = e.length, r = null, s = [], a = 0; a < i; ++a) {
                if ((n = e.charCodeAt(a)) > 55295 && n < 57344) {
                    if (!r) {
                        if (n > 56319) {
                            (t -= 3) > -1 && s.push(239, 191, 189);
                            continue
                        }
                        if (a + 1 === i) {
                            (t -= 3) > -1 && s.push(239, 191, 189);
                            continue
                        }
                        r = n;
                        continue
                    }
                    if (n < 56320) {
                        (t -= 3) > -1 && s.push(239, 191, 189),
                        r = n;
                        continue
                    }
                    n = 65536 + (r - 55296 << 10 | n - 56320)
                } else
                    r && (t -= 3) > -1 && s.push(239, 191, 189);
                if (r = null,
                n < 128) {
                    if ((t -= 1) < 0)
                        break;
                    s.push(n)
                } else if (n < 2048) {
                    if ((t -= 2) < 0)
                        break;
                    s.push(n >> 6 | 192, 63 & n | 128)
                } else if (n < 65536) {
                    if ((t -= 3) < 0)
                        break;
                    s.push(n >> 12 | 224, n >> 6 & 63 | 128, 63 & n | 128)
                } else {
                    if (!(n < 1114112))
                        throw new Error("Invalid code point");
                    if ((t -= 4) < 0)
                        break;
                    s.push(n >> 18 | 240, n >> 12 & 63 | 128, n >> 6 & 63 | 128, 63 & n | 128)
                }
            }
            return s
        }
        function H(e) {
            return i.toByteArray(function(e) {
                if ((e = function(e) {
                    return e.trim ? e.trim() : e.replace(/^\s+|\s+$/g, "")
                }(e).replace(L, "")).length < 2)
                    return "";
                for (; e.length % 4 != 0; )
                    e += "=";
                return e
            }(e))
        }
        function V(e, t, n, i) {
            for (var r = 0; r < i && !(r + n >= t.length || r >= e.length); ++r)
                t[r + n] = e[r];
            return r
        }
    }
    ).call(this, n(12))
}
, function(e, t) {
    var n;
    n = function() {
        return this
    }();
    try {
        n = n || new Function("return this")()
    } catch (e) {
        "object" == typeof window && (n = window)
    }
    e.exports = n
}
, function(e, t) {
    for (var n = t.uint8 = new Array(256), i = 0; i <= 255; i++)
        n[i] = r(i);
    function r(e) {
        return function(t) {
            var n = t.reserve(1);
            t.buffer[n] = e
        }
    }
}
, function(e, t, n) {
    t.FlexDecoder = s,
    t.FlexEncoder = a;
    var i = n(0)
      , r = "BUFFER_SHORTAGE";
    function s() {
        if (!(this instanceof s))
            return new s
    }
    function a() {
        if (!(this instanceof a))
            return new a
    }
    function o() {
        throw new Error("method not implemented: write()")
    }
    function c() {
        throw new Error("method not implemented: fetch()")
    }
    function l() {
        return this.buffers && this.buffers.length ? (this.flush(),
        this.pull()) : this.fetch()
    }
    function h(e) {
        (this.buffers || (this.buffers = [])).push(e)
    }
    function u() {
        return (this.buffers || (this.buffers = [])).shift()
    }
    function f(e) {
        return function(t) {
            for (var n in e)
                t[n] = e[n];
            return t
        }
    }
    s.mixin = f({
        bufferish: i,
        write: function(e) {
            var t = this.offset ? i.prototype.slice.call(this.buffer, this.offset) : this.buffer;
            this.buffer = t ? e ? this.bufferish.concat([t, e]) : t : e,
            this.offset = 0
        },
        fetch: c,
        flush: function() {
            for (; this.offset < this.buffer.length; ) {
                var e, t = this.offset;
                try {
                    e = this.fetch()
                } catch (e) {
                    if (e && e.message != r)
                        throw e;
                    this.offset = t;
                    break
                }
                this.push(e)
            }
        },
        push: h,
        pull: u,
        read: l,
        reserve: function(e) {
            var t = this.offset
              , n = t + e;
            if (n > this.buffer.length)
                throw new Error(r);
            return this.offset = n,
            t
        },
        offset: 0
    }),
    s.mixin(s.prototype),
    a.mixin = f({
        bufferish: i,
        write: o,
        fetch: function() {
            var e = this.start;
            if (e < this.offset) {
                var t = this.start = this.offset;
                return i.prototype.slice.call(this.buffer, e, t)
            }
        },
        flush: function() {
            for (; this.start < this.offset; ) {
                var e = this.fetch();
                e && this.push(e)
            }
        },
        push: h,
        pull: function() {
            var e = this.buffers || (this.buffers = [])
              , t = e.length > 1 ? this.bufferish.concat(e) : e[0];
            return e.length = 0,
            t
        },
        read: l,
        reserve: function(e) {
            var t = 0 | e;
            if (this.buffer) {
                var n = this.buffer.length
                  , i = 0 | this.offset
                  , r = i + t;
                if (r < n)
                    return this.offset = r,
                    i;
                this.flush(),
                e = Math.max(e, Math.min(2 * n, this.maxBufferSize))
            }
            return e = Math.max(e, this.minBufferSize),
            this.buffer = this.bufferish.alloc(e),
            this.start = 0,
            this.offset = t,
            0
        },
        send: function(e) {
            var t = e.length;
            if (t > this.minBufferSize)
                this.flush(),
                this.push(e);
            else {
                var n = this.reserve(t);
                i.prototype.copy.call(e, this.buffer, n)
            }
        },
        maxBufferSize: 65536,
        minBufferSize: 2048,
        offset: 0,
        start: 0
    }),
    a.mixin(a.prototype)
}
, function(e, t, n) {
    t.decode = function(e, t) {
        var n = new i(t);
        return n.write(e),
        n.read()
    }
    ;
    var i = n(16).DecodeBuffer
}
, function(e, t, n) {
    t.DecodeBuffer = r;
    var i = n(8).preset;
    function r(e) {
        if (!(this instanceof r))
            return new r(e);
        if (e && (this.options = e,
        e.codec)) {
            var t = this.codec = e.codec;
            t.bufferish && (this.bufferish = t.bufferish)
        }
    }
    n(14).FlexDecoder.mixin(r.prototype),
    r.prototype.codec = i,
    r.prototype.fetch = function() {
        return this.codec.decode(this)
    }
}
, function(e, t, n) {
    var i = n(4)
      , r = n(7)
      , s = r.Uint64BE
      , a = r.Int64BE;
    t.getReadFormat = function(e) {
        var t = o.hasArrayBuffer && e && e.binarraybuffer
          , n = e && e.int64;
        return {
            map: l && e && e.usemap ? u : h,
            array: f,
            str: d,
            bin: t ? g : p,
            ext: m,
            uint8: y,
            uint16: v,
            uint32: b,
            uint64: S(8, n ? E : T),
            int8: k,
            int16: w,
            int32: x,
            int64: S(8, n ? M : I),
            float32: S(4, A),
            float64: S(8, P)
        }
    }
    ,
    t.readUint8 = y;
    var o = n(0)
      , c = n(6)
      , l = "undefined" != typeof Map;
    function h(e, t) {
        var n, i = {}, r = new Array(t), s = new Array(t), a = e.codec.decode;
        for (n = 0; n < t; n++)
            r[n] = a(e),
            s[n] = a(e);
        for (n = 0; n < t; n++)
            i[r[n]] = s[n];
        return i
    }
    function u(e, t) {
        var n, i = new Map, r = new Array(t), s = new Array(t), a = e.codec.decode;
        for (n = 0; n < t; n++)
            r[n] = a(e),
            s[n] = a(e);
        for (n = 0; n < t; n++)
            i.set(r[n], s[n]);
        return i
    }
    function f(e, t) {
        for (var n = new Array(t), i = e.codec.decode, r = 0; r < t; r++)
            n[r] = i(e);
        return n
    }
    function d(e, t) {
        var n = e.reserve(t)
          , i = n + t;
        return c.toString.call(e.buffer, "utf-8", n, i)
    }
    function p(e, t) {
        var n = e.reserve(t)
          , i = n + t
          , r = c.slice.call(e.buffer, n, i);
        return o.from(r)
    }
    function g(e, t) {
        var n = e.reserve(t)
          , i = n + t
          , r = c.slice.call(e.buffer, n, i);
        return o.Uint8Array.from(r).buffer
    }
    function m(e, t) {
        var n = e.reserve(t + 1)
          , i = e.buffer[n++]
          , r = n + t
          , s = e.codec.getExtUnpacker(i);
        if (!s)
            throw new Error("Invalid ext type: " + (i ? "0x" + i.toString(16) : i));
        return s(c.slice.call(e.buffer, n, r))
    }
    function y(e) {
        var t = e.reserve(1);
        return e.buffer[t]
    }
    function k(e) {
        var t = e.reserve(1)
          , n = e.buffer[t];
        return 128 & n ? n - 256 : n
    }
    function v(e) {
        var t = e.reserve(2)
          , n = e.buffer;
        return n[t++] << 8 | n[t]
    }
    function w(e) {
        var t = e.reserve(2)
          , n = e.buffer
          , i = n[t++] << 8 | n[t];
        return 32768 & i ? i - 65536 : i
    }
    function b(e) {
        var t = e.reserve(4)
          , n = e.buffer;
        return 16777216 * n[t++] + (n[t++] << 16) + (n[t++] << 8) + n[t]
    }
    function x(e) {
        var t = e.reserve(4)
          , n = e.buffer;
        return n[t++] << 24 | n[t++] << 16 | n[t++] << 8 | n[t]
    }
    function S(e, t) {
        return function(n) {
            var i = n.reserve(e);
            return t.call(n.buffer, i, !0)
        }
    }
    function T(e) {
        return new s(this,e).toNumber()
    }
    function I(e) {
        return new a(this,e).toNumber()
    }
    function E(e) {
        return new s(this,e)
    }
    function M(e) {
        return new a(this,e)
    }
    function A(e) {
        return i.read(this, e, !1, 23, 4)
    }
    function P(e) {
        return i.read(this, e, !1, 52, 8)
    }
}
, function(e, t, n) {
    !function(t) {
        e.exports = t;
        var n = "listeners"
          , i = {
            on: function(e, t) {
                return a(this, e).push(t),
                this
            },
            once: function(e, t) {
                var n = this;
                return i.originalListener = t,
                a(n, e).push(i),
                n;
                function i() {
                    s.call(n, e, i),
                    t.apply(this, arguments)
                }
            },
            off: s,
            emit: function(e, t) {
                var n = this
                  , i = a(n, e, !0);
                if (!i)
                    return !1;
                var r = arguments.length;
                if (1 === r)
                    i.forEach((function(e) {
                        e.call(n)
                    }
                    ));
                else if (2 === r)
                    i.forEach((function(e) {
                        e.call(n, t)
                    }
                    ));
                else {
                    var s = Array.prototype.slice.call(arguments, 1);
                    i.forEach((function(e) {
                        e.apply(n, s)
                    }
                    ))
                }
                return !!i.length
            }
        };
        function r(e) {
            for (var t in i)
                e[t] = i[t];
            return e
        }
        function s(e, t) {
            var i;
            if (arguments.length) {
                if (t) {
                    if (i = a(this, e, !0)) {
                        if (!(i = i.filter((function(e) {
                            return e !== t && e.originalListener !== t
                        }
                        ))).length)
                            return s.call(this, e);
                        this[n][e] = i
                    }
                } else if ((i = this[n]) && (delete i[e],
                !Object.keys(i).length))
                    return s.call(this)
            } else
                delete this[n];
            return this
        }
        function a(e, t, i) {
            if (!i || e[n]) {
                var r = e[n] || (e[n] = {});
                return r[t] || (r[t] = [])
            }
        }
        r(t.prototype),
        t.mixin = r
    }((
    function e() {
        if (!(this instanceof e))
            return new e
    }
    ))
}
, function(e, t, n) {
    (function(t) {
        e.exports.maxScreenWidth = 1920,
        e.exports.maxScreenHeight = 1080,
        e.exports.serverUpdateRate = 9,
        e.exports.maxPlayers = t && -1 != t.argv.indexOf("--largeserver") ? 80 : 40,
        e.exports.maxPlayersHard = e.exports.maxPlayers + 10,
        e.exports.collisionDepth = 6,
        e.exports.minimapRate = 3e3,
        e.exports.colGrid = 10,
        e.exports.clientSendRate = 5,
        e.exports.healthBarWidth = 50,
        e.exports.healthBarPad = 4.5,
        e.exports.iconPadding = 15,
        e.exports.iconPad = .9,
        e.exports.deathFadeout = 3e3,
        e.exports.crownIconScale = 60,
        e.exports.crownPad = 35,
        e.exports.chatCountdown = 3e3,
        e.exports.chatCooldown = 500,
        e.exports.inSandbox = t && "mm_exp" === t.env.VULTR_SCHEME,
        e.exports.maxAge = 100,
        e.exports.gatherAngle = Math.PI / 2.6,
        e.exports.gatherWiggle = 10,
        e.exports.hitReturnRatio = .25,
        e.exports.hitAngle = Math.PI / 2,
        e.exports.playerScale = 35,
        e.exports.playerSpeed = .0016,
        e.exports.playerDecel = .993,
        e.exports.nameY = 34,
        e.exports.skinColors = ["#bf8f54", "#cbb091", "#896c4b", "#fadadc", "#ececec", "#c37373", "#4c4c4c", "#ecaff7", "#738cc3", "#8bc373"],
        e.exports.animalCount = 7,
        e.exports.aiTurnRandom = .06,
        e.exports.cowNames = ["Sid", "Steph", "Bmoe", "Romn", "Jononthecool", "Fiona", "Vince", "Nathan", "Nick", "Flappy", "Ronald", "Otis", "Pepe", "Mc Donald", "Theo", "Fabz", "Oliver", "Jeff", "Jimmy", "Helena", "Reaper", "Ben", "Alan", "Naomi", "XYZ", "Clever", "Jeremy", "Mike", "Destined", "Stallion", "Allison", "Meaty", "Sophia", "Vaja", "Joey", "Pendy", "Murdoch", "Theo", "Jared", "July", "Sonia", "Mel", "Dexter", "Quinn", "Milky"],
        e.exports.shieldAngle = Math.PI / 3,
        e.exports.weaponVariants = [{
            id: 0,
            src: "",
            xp: 0,
            val: 1
        }, {
            id: 1,
            src: "_g",
            xp: 3e3,
            val: 1.1
        }, {
            id: 2,
            src: "_d",
            xp: 7e3,
            val: 1.18
        }, {
            id: 3,
            src: "_r",
            poison: !0,
            xp: 12e3,
            val: 1.18
        }],
        e.exports.fetchVariant = function(t) {
            for (var n = t.weaponXP[t.weaponIndex] || 0, i = e.exports.weaponVariants.length - 1; i >= 0; --i)
                if (n >= e.exports.weaponVariants[i].xp)
                    return e.exports.weaponVariants[i]
        }
        ,
        e.exports.resourceTypes = ["wood", "food", "stone", "points"],
        e.exports.areaCount = 7,
        e.exports.treesPerArea = 9,
        e.exports.bushesPerArea = 3,
        e.exports.totalRocks = 32,
        e.exports.goldOres = 7,
        e.exports.riverWidth = 724,
        e.exports.riverPadding = 114,
        e.exports.waterCurrent = .0011,
        e.exports.waveSpeed = 1e-4,
        e.exports.waveMax = 1.3,
        e.exports.treeScales = [150, 160, 165, 175],
        e.exports.bushScales = [80, 85, 95],
        e.exports.rockScales = [80, 85, 90],
        e.exports.snowBiomeTop = 2400,
        e.exports.snowSpeed = .75,
        e.exports.maxNameLength = 15,
        e.exports.mapScale = 14400,
        e.exports.mapPingScale = 40,
        e.exports.mapPingTime = 2200
    }
    ).call(this, n(41))
}
, function(e, t) {
    var n = {
        utf8: {
            stringToBytes: function(e) {
                return n.bin.stringToBytes(unescape(encodeURIComponent(e)))
            },
            bytesToString: function(e) {
                return decodeURIComponent(escape(n.bin.bytesToString(e)))
            }
        },
        bin: {
            stringToBytes: function(e) {
                for (var t = [], n = 0; n < e.length; n++)
                    t.push(255 & e.charCodeAt(n));
                return t
            },
            bytesToString: function(e) {
                for (var t = [], n = 0; n < e.length; n++)
                    t.push(String.fromCharCode(e[n]));
                return t.join("")
            }
        }
    };
    e.exports = n
}
, function(e, t, n) {
    "use strict";
    window.loadedScript = !0;
    var i = "127.0.0.1" !== location.hostname && !location.hostname.startsWith("192.168.");
    n(22);
    var r = n(23)
      , s = n(42)
      , a = n(43)
      , o = n(19)
      , c = n(44)
      , l = n(45)
      , h = (n(46),
    n(47))
      , u = n(48)
      , f = n(55)
      , d = n(56)
      , p = n(57)
      , g = n(58).obj
      , m = new a.TextManager
      , y = new (n(59))("moomoo.io",3e3,o.maxPlayers,5,!1);
    y.debugLog = !1;
    var k = !1;
    function v() {
        ht && ut && (k = !0,
        i ? window.grecaptcha.execute("6LevKusUAAAAAAFknhlV8sPtXAk5Z5dGP5T2FYIZ", {
            action: "homepage"
        }).then((function(e) {
            w(e)
        }
        )) : w(null))
    }
    function w(e) {
        y.start((function(t, n, a) {
            var c = (i ? "wss" : "ws") + "://" + t + ":8008/?gameIndex=" + a;
            e && (c += "&token=" + encodeURIComponent(e)),
            r.connect(c, (function(e) {
                Bi(),
                setInterval(()=>Bi(), 2500),
                e ? ft(e) : (ue.onclick = s.checkTrusted((function() {
                    !function() {
                        var e = ++bt > 1
                          , t = Date.now() - wt > vt;
                        e && t ? (wt = Date.now(),
                        xt()) : Tn()
                    }()
                }
                )),
                s.hookTouchEvents(ue),
                fe.onclick = s.checkTrusted((function() {
                    Oi("https://krunker.io/?play=SquidGame_KB")
                }
                )),
                s.hookTouchEvents(fe),
                pe.onclick = s.checkTrusted((function() {
                    setTimeout((function() {
                        !function() {
                            var e = xe.value
                              , t = prompt("party key", e);
                            t && (window.onbeforeunload = void 0,
                            window.location.href = "/?server=" + t)
                        }()
                    }
                    ), 10)
                }
                )),
                s.hookTouchEvents(pe),
                ge.onclick = s.checkTrusted((function() {
                    Ae.classList.contains("showing") ? (Ae.classList.remove("showing"),
                    me.innerText = "Settings") : (Ae.classList.add("showing"),
                    me.innerText = "Close")
                }
                )),
                s.hookTouchEvents(ge),
                ye.onclick = s.checkTrusted((function() {
                    yn(),
                    "block" != Ye.style.display ? Ut() : Ye.style.display = "none"
                }
                )),
                s.hookTouchEvents(ye),
                ke.onclick = s.checkTrusted((function() {
                    "block" != Qe.style.display ? (Qe.style.display = "block",
                    Ye.style.display = "none",
                    an(),
                    Gt()) : Qe.style.display = "none"
                }
                )),
                s.hookTouchEvents(ke),
                ve.onclick = s.checkTrusted((function() {
                    rn()
                }
                )),
                s.hookTouchEvents(ve),
                Ne.onclick = s.checkTrusted((function() {
                    xn()
                }
                )),
                s.hookTouchEvents(Ne),
                function() {
                    for (var e = 0; e < jn.length; ++e) {
                        var t = new Image;
                        t.onload = function() {
                            this.isLoaded = !0
                        }
                        ,
                        t.src = ".././img/icons/" + jn[e] + ".png",
                        Rn[jn[e]] = t
                    }
                }(),
                Pe.style.display = "none",
                Me.style.display = "block",
                Le.value = E("moo_name") || "",
                function() {
                    var e = E("native_resolution");
                    Zt(e ? "true" == e : "undefined" != typeof cordova),
                    A = "true" == E("show_ping"),
                    Ie.hidden = !A,
                    E("moo_moosic"),
                    setInterval((function() {
                        window.cordova && (document.getElementById("downloadButtonContainer").classList.add("cordova"),
                        document.getElementById("mobileDownloadButtonContainer").classList.add("cordova"))
                    }
                    ), 1e3),
                    en(),
                    s.removeAllChildren(Ce);
                    for (var t = 0; t < l.weapons.length + l.list.length; ++t)
                        !function(e) {
                            s.generateElement({
                                id: "actionBarItem" + e,
                                class: "actionBarItem",
                                style: "display:none",
                                onmouseout: function() {
                                    Tt()
                                },
                                parent: Ce
                            })
                        }(t);
                    for (t = 0; t < l.list.length + l.weapons.length; ++t)
                        !function(e) {
                            var t = document.createElement("canvas");
                            t.width = t.height = 66;
                            var n = t.getContext("2d");
                            if (n.translate(t.width / 2, t.height / 2),
                            n.imageSmoothingEnabled = !1,
                            n.webkitImageSmoothingEnabled = !1,
                            n.mozImageSmoothingEnabled = !1,
                            l.weapons[e]) {
                                n.rotate(Math.PI / 4 + Math.PI);
                                var i = new Image;
                                Zn[l.weapons[e].src] = i,
                                i.onload = function() {
                                    this.isLoaded = !0;
                                    var i = 1 / (this.height / this.width)
                                      , r = l.weapons[e].iPad || 1;
                                    n.drawImage(this, -t.width * r * o.iconPad * i / 2, -t.height * r * o.iconPad / 2, t.width * r * i * o.iconPad, t.height * r * o.iconPad),
                                    n.fillStyle = "rgba(0, 0, 70, 0.1)",
                                    n.globalCompositeOperation = "source-atop",
                                    n.fillRect(-t.width / 2, -t.height / 2, t.width, t.height),
                                    document.getElementById("actionBarItem" + e).style.backgroundImage = "url(" + t.toDataURL() + ")"
                                }
                                ,
                                i.src = ".././img/weapons/" + l.weapons[e].src + ".png",
                                (r = document.getElementById("actionBarItem" + e)).onmouseover = s.checkTrusted((function() {
                                    Tt(l.weapons[e], !0)
                                }
                                )),
                                r.onclick = s.checkTrusted((function() {
                                    Sn(e, !0)
                                }
                                )),
                                s.hookTouchEvents(r)
                            } else {
                                i = ri(l.list[e - l.weapons.length], !0);
                                var r, a = Math.min(t.width - o.iconPadding, i.width);
                                n.globalAlpha = 1,
                                n.drawImage(i, -a / 2, -a / 2, a, a),
                                n.fillStyle = "rgba(0, 0, 70, 0.1)",
                                n.globalCompositeOperation = "source-atop",
                                n.fillRect(-a / 2, -a / 2, a, a),
                                document.getElementById("actionBarItem" + e).style.backgroundImage = "url(" + t.toDataURL() + ")",
                                (r = document.getElementById("actionBarItem" + e)).onmouseover = s.checkTrusted((function() {
                                    Tt(l.list[e - l.weapons.length])
                                }
                                )),
                                r.onclick = s.checkTrusted((function() {
                                    Sn(e - l.weapons.length)
                                }
                                )),
                                s.hookTouchEvents(r)
                            }
                        }(t);
                    Le.ontouchstart = s.checkTrusted((function(e) {
                        e.preventDefault();
                        var t = prompt("enter name", e.currentTarget.value);
                        e.currentTarget.value = t.slice(0, 15)
                    }
                    )),
                    Se.checked = M,
                    Se.onchange = s.checkTrusted((function(e) {
                        Zt(e.target.checked)
                    }
                    )),
                    Te.checked = A,
                    Te.onchange = s.checkTrusted((function(e) {
                        A = Te.checked,
                        Ie.hidden = !A,
                        I("show_ping", A ? "true" : "false")
                    }
                    ))
                }())
            }
            ), {
                id: st,
                d: ft,
                1: En,
                2: vi,
                4: wi,
                33: Ti,
                5: Ln,
                6: li,
                a: gi,
                aa: pi,
                7: Wn,
                8: hi,
                sp: ui,
                9: xi,
                h: Si,
                11: Pn,
                12: Cn,
                13: Bn,
                14: bi,
                15: Dn,
                16: Un,
                17: $t,
                18: fi,
                19: di,
                20: Ci,
                ac: Ot,
                ad: _t,
                an: Bt,
                st: Rt,
                sa: jt,
                us: Nt,
                ch: hn,
                mm: Wt,
                t: Mn,
                p: Yt,
                pp: Pi
            }),
            pt(),
            setTimeout(()=>gt(), 3e3)
        }
        ), (function(e) {
            console.error("Vultr error:", e),
            alert("Error:\n" + e),
            ft("disconnected")
        }
        ))
    }
    var b, x = new g(o,s), S = Math.PI, T = 2 * S;
    function I(e, t) {
        b && localStorage.setItem(e, t)
    }
    function E(e) {
        return b ? localStorage.getItem(e) : null
    }
    Math.lerpAngle = function(e, t, n) {
        Math.abs(t - e) > S && (e > t ? t += T : e += T);
        var i = t + (e - t) * n;
        return i >= 0 && i <= T ? i : i % T
    }
    ,
    CanvasRenderingContext2D.prototype.roundRect = function(e, t, n, i, r) {
        return n < 2 * r && (r = n / 2),
        i < 2 * r && (r = i / 2),
        r < 0 && (r = 0),
        this.beginPath(),
        this.moveTo(e + r, t),
        this.arcTo(e + n, t, e + n, t + i, r),
        this.arcTo(e + n, t + i, e, t + i, r),
        this.arcTo(e, t + i, e, t, r),
        this.arcTo(e, t, e + n, t, r),
        this.closePath(),
        this
    };
    var M, A, P, B, C, O, R, j, _, U, D, L, F, z, H = E("moofoll"), V = 1, q = Date.now(), Y = [], W = [], X = [], N = [], G = [], J = new p(d,G,W,Y,nt,l,o,s), K = n(70), Q = n(71), Z = new K(Y,Q,W,l,null,o,s), ee = 1, te = 0, ne = 0, ie = 0, re = {
        id: -1,
        startX: 0,
        startY: 0,
        currentX: 0,
        currentY: 0
    }, se = {
        id: -1,
        startX: 0,
        startY: 0,
        currentX: 0,
        currentY: 0
    }, ae = 0, oe = o.maxScreenWidth, ce = o.maxScreenHeight, le = !1, he = (document.getElementById("ad-container"),
    document.getElementById("mainMenu")), ue = document.getElementById("enterGame"), fe = document.getElementById("promoImg"), de = document.getElementById("partyButton"), pe = document.getElementById("joinPartyButton"), ge = document.getElementById("settingsButton"), me = ge.getElementsByTagName("span")[0], ye = document.getElementById("allianceButton"), ke = document.getElementById("storeButton"), ve = document.getElementById("chatButton"), we = document.getElementById("gameCanvas"), be = we.getContext("2d"), xe = document.getElementById("serverBrowser"), Se = document.getElementById("nativeResolution"), Te = document.getElementById("showPing"), Ie = (document.getElementById("playMusic"),
    document.getElementById("pingDisplay")), Ee = document.getElementById("shutdownDisplay"), Me = document.getElementById("menuCardHolder"), Ae = document.getElementById("guideCard"), Pe = document.getElementById("loadingText"), Be = document.getElementById("gameUI"), Ce = document.getElementById("actionBar"), Oe = document.getElementById("scoreDisplay"), Re = document.getElementById("foodDisplay"), je = document.getElementById("woodDisplay"), _e = document.getElementById("stoneDisplay"), Ue = document.getElementById("killCounter"), De = document.getElementById("leaderboardData"), Le = document.getElementById("nameInput"), Fe = document.getElementById("itemInfoHolder"), ze = document.getElementById("ageText"), He = document.getElementById("ageBarBody"), Ve = document.getElementById("upgradeHolder"), qe = document.getElementById("upgradeCounter"), Ye = document.getElementById("allianceMenu"), We = document.getElementById("allianceHolder"), Xe = document.getElementById("allianceManager"), Ne = document.getElementById("mapDisplay"), Ge = document.getElementById("diedText"), Je = document.getElementById("skinColorHolder"), Ke = Ne.getContext("2d");
    Ne.width = 300,
    Ne.height = 300;
    var Qe = document.getElementById("storeMenu")
      , $e = document.getElementById("storeHolder")
      , Ze = document.getElementById("noticationDisplay")
      , et = f.hats
      , tt = f.accessories
      , nt = new h(c,N,s,o)
      , it = "#525252"
      , rt = "#3d3f42";
    function st(e) {
        X = e.teams
    }
    var at = document.getElementById("featuredYoutube")
      , ot = [{
        name: "Corrupt X",
        link: "https://www.youtube.com/channel/UC0UH2LfQvBSeH24bmtbmITw"
    }, {
        name: "Tweak Big",
        link: "https://www.youtube.com/channel/UCbwvzJ38AndDTkoX8sD9YOw"
    }, {
        name: "Arena Closer",
        link: "https://www.youtube.com/channel/UCazucVSJqW-kiHMIhQhD-QQ"
    }, {
        name: "Godenot",
        link: "https://www.youtube.com/user/SirGodenot"
    }, {
        name: "RajNoobTV",
        link: "https://www.youtube.com/channel/UCVLo9brXBWrCttMaGzvm0-Q"
    }, {
        name: "TomNotTom",
        link: "https://www.youtube.com/channel/UC7z97RgHFJRcv2niXgArBDw"
    }, {
        name: "Nation",
        link: "https://www.youtube.com/channel/UCSl-MBn3qzjrIvLNESQRk-g"
    }, {
        name: "Pidyohago",
        link: "https://www.youtube.com/channel/UC04p8Mg8nDaDx04A9is2B8Q"
    }, {
        name: "Enigma",
        link: "https://www.youtube.com/channel/UC5HhLbs3sReHo8Bb9NDdFrg"
    }, {
        name: "Bauer",
        link: "https://www.youtube.com/channel/UCwU2TbJx3xTSlPqg-Ix3R1g"
    }, {
        name: "iStealth",
        link: "https://www.youtube.com/channel/UCGrvlEOsQFViZbyFDE6t69A"
    }, {
        name: "SICKmania",
        link: "https://www.youtube.com/channel/UCvVI98ezn4TpX5wDMZjMa3g"
    }, {
        name: "LightThief",
        link: "https://www.youtube.com/channel/UCj6C_tiDeATiKd3GX127XoQ"
    }, {
        name: "Fortish",
        link: "https://www.youtube.com/channel/UCou6CLU-szZA3Tb340TB9_Q"
    }, {
        name: "巧克力",
        link: "https://www.youtube.com/channel/UCgL6J6oL8F69vm-GcPScmwg"
    }, {
        name: "i Febag",
        link: "https://www.youtube.com/channel/UCiU6WZwiKbsnt5xmwr0OFbg"
    }, {
        name: "GoneGaming",
        link: "https://www.youtube.com/channel/UCOcQthRanYcwYY0XVyVeK0g"
    }]
      , ct = ot[s.randInt(0, ot.length - 1)];
    at.innerHTML = "<a target='_blank' class='ytLink' href='" + ct.link + "'><i class='material-icons' style='vertical-align: top;'>&#xE064;</i> " + ct.name + "</a>";
    var lt = !0
      , ht = !1
      , ut = !1;
    function ft(e) {
        r.close(),
        dt(e)
    }
    function dt(e) {
        he.style.display = "block",
        Be.style.display = "none",
        Me.style.display = "none",
        Ge.style.display = "none",
        Pe.style.display = "block",
        Pe.innerHTML = e + "<a href='javascript:window.location.href=window.location.href' class='ytLink'>reload</a>"
    }
    window.onblur = function() {
        lt = !1
    }
    ,
    window.onfocus = function() {
        lt = !0,
        R && R.alive && yn()
    }
    ,
    window.onload = function() {
        ht = !0,
        v(),
        setTimeout((function() {
            k || (alert("Captcha failed to load"),
            window.location.reload())
        }
        ), 2e4)
    }
    ,
    window.captchaCallback = function() {
        ut = !0,
        v()
    }
    ,
    we.oncontextmenu = function() {
        return !1
    }
    ;
    function pt() {
        var e, t, n = "", i = 0;
        for (var r in y.servers) {
            for (var s = y.servers[r], a = 0, c = 0; c < s.length; c++)
                for (var l = 0; l < s[c].games.length; l++)
                    a += s[c].games[l].playerCount;
            i += a;
            var h = y.regionInfo[r].name;
            n += "<option disabled>" + h + " - " + a + " players</option>";
            for (var u = 0; u < s.length; u++)
                for (var f = s[u], d = 0; d < f.games.length; d++) {
                    var p = f.games[d]
                      , g = 1 * f.index + d + 1
                      , m = y.server && y.server.region === f.region && y.server.index === f.index && y.gameIndex == d
                      , k = h + " " + g + " [" + Math.min(p.playerCount, o.maxPlayers) + "/" + o.maxPlayers + "]";
                    let e = y.stripRegion(r) + ":" + u + ":" + d;
                    m && (de.getElementsByTagName("span")[0].innerText = e),
                    n += "<option value='" + e + "' " + (m ? "selected" : "") + ">" + k + "</option>"
                }
            n += "<option disabled></option>"
        }
        n += "<option disabled>All Servers - " + i + " players</option>",
        xe.innerHTML = n,
        "sandbox.moomoo.io" == location.hostname ? (e = "Back to MooMoo",
        t = "//moomoo.io/") : (e = "Try the sandbox",
        t = "//sandbox.moomoo.io/"),
        document.getElementById("altServer").innerHTML = "<a href='" + t + "'>" + e + "<i class='material-icons' style='font-size:10px;vertical-align:middle'>arrow_forward_ios</i></a>"
    }
    function gt() {
        var e = new XMLHttpRequest;
        e.onreadystatechange = function() {
            4 == this.readyState && (200 == this.status ? (window.vultr = JSON.parse(this.responseText),
            y.processServers(vultr.servers),
            pt()) : console.error("Failed to load server data with status code:", this.status))
        }
        ,
        e.open("GET", "/serverData", !0),
        e.send()
    }
    xe.addEventListener("change", s.checkTrusted((function() {
        let e = xe.value.split(":");
        y.switchServer(e[0], e[1], e[2])
    }
    )));
    var mt = document.getElementById("pre-content-container")
      , yt = null
      , kt = null;
window.cpmstarAPI = function(e) {
           e.game.setTarget(mt),
               kt = e
       }
    var vt = 3e5
      , wt = 0
      , bt = 0;
    function xt() {
        void Tn();
    }
    function St() {
        mt.style.display = "none",
        Tn()
    }
    function Tt(e, t, n) {
        if (R && e)
            if (s.removeAllChildren(Fe),
            Fe.classList.add("visible"),
            s.generateElement({
                id: "itemInfoName",
                text: s.capitalizeFirst(e.name),
                parent: Fe
            }),
            s.generateElement({
                id: "itemInfoDesc",
                text: e.desc,
                parent: Fe
            }),
            n)
                ;
            else if (t)
                s.generateElement({
                    class: "itemInfoReq",
                    text: e.type ? "secondary" : "primary",
                    parent: Fe
                });
            else {
                for (var i = 0; i < e.req.length; i += 2)
                    s.generateElement({
                        class: "itemInfoReq",
                        html: e.req[i] + "<span class='itemInfoReqVal'> x" + e.req[i + 1] + "</span>",
                        parent: Fe
                    });
                e.group.limit && s.generateElement({
                    class: "itemInfoLmt",
                    text: (R.itemCounts[e.group.id] || 0) + "/" + e.group.limit,
                    parent: Fe
                })
            }
        else
            Fe.classList.remove("visible")
    }
    window.showPreAd = xt;
    var It, Et, Mt, At = [], Pt = [];
    function Bt(e, t) {
        At.push({
            sid: e,
            name: t
        }),
        Ct()
    }
    function Ct() {
        if (At[0]) {
            var e = At[0];
            s.removeAllChildren(Ze),
            Ze.style.display = "block",
            s.generateElement({
                class: "notificationText",
                text: e.name,
                parent: Ze
            }),
            s.generateElement({
                class: "notifButton",
                html: "<i class='material-icons' style='font-size:28px;color:#cc5151;'>&#xE14C;</i>",
                parent: Ze,
                onclick: function() {
                    Dt(0)
                },
                hookTouch: !0
            }),
            s.generateElement({
                class: "notifButton",
                html: "<i class='material-icons' style='font-size:28px;color:#8ecc51;'>&#xE876;</i>",
                parent: Ze,
                onclick: function() {
                    Dt(1)
                },
                hookTouch: !0
            })
        } else
            Ze.style.display = "none"
    }
    function Ot(e) {
        X.push(e),
        "block" == Ye.style.display && Ut()
    }
    function Rt(e, t) {
        R && (R.team = e,
        R.isOwner = t,
        "block" == Ye.style.display && Ut())
    }
    function jt(e) {
        Pt = e,
        "block" == Ye.style.display && Ut()
    }
    function _t(e) {
        for (var t = X.length - 1; t >= 0; t--)
            X[t].sid == e && X.splice(t, 1);
        "block" == Ye.style.display && Ut()
    }
    function Ut() {
        if (R && R.alive) {
            if (an(),
            Qe.style.display = "none",
            Ye.style.display = "block",
            s.removeAllChildren(We),
            R.team)
                for (var e = 0; e < Pt.length; e += 2)
                    !function(e) {
                        var t = s.generateElement({
                            class: "allianceItem",
                            style: "color:" + (Pt[e] == R.sid ? "#fff" : "rgba(255,255,255,0.6)"),
                            text: Pt[e + 1],
                            parent: We
                        });
                        R.isOwner && Pt[e] != R.sid && s.generateElement({
                            class: "joinAlBtn",
                            text: "Kick",
                            onclick: function() {
                                Lt(Pt[e])
                            },
                            hookTouch: !0,
                            parent: t
                        })
                    }(e);
            else if (X.length)
                for (e = 0; e < X.length; ++e)
                    !function(e) {
                        var t = s.generateElement({
                            class: "allianceItem",
                            style: "color:" + (X[e].sid == R.team ? "#fff" : "rgba(255,255,255,0.6)"),
                            text: X[e].sid,
                            parent: We
                        });
                        s.generateElement({
                            class: "joinAlBtn",
                            text: "Join",
                            onclick: function() {
                                Ft(e)
                            },
                            hookTouch: !0,
                            parent: t
                        })
                    }(e);
            else
                s.generateElement({
                    class: "allianceItem",
                    text: "No Tribes Yet",
                    parent: We
                });
            s.removeAllChildren(Xe),
            R.team ? s.generateElement({
                class: "allianceButtonM",
                style: "width: 360px",
                text: R.isOwner ? "Delete Tribe" : "Leave Tribe",
                onclick: function() {
                    Ht()
                },
                hookTouch: !0,
                parent: Xe
            }) : (s.generateElement({
                tag: "input",
                type: "text",
                id: "allianceInput",
                maxLength: 7,
                placeholder: "unique name",
                ontouchstart: function(e) {
                    e.preventDefault();
                    var t = prompt("unique name", e.currentTarget.value);
                    e.currentTarget.value = t.slice(0, 7)
                },
                parent: Xe
            }),
            s.generateElement({
                tag: "div",
                class: "allianceButtonM",
                style: "width: 140px;",
                text: "Create",
                onclick: function() {
                    zt()
                },
                hookTouch: !0,
                parent: Xe
            }))
        }
    }
    function Dt(e) {
        r.send("11", At[0].sid, e),
        At.splice(0, 1),
        Ct()
    }
    function Lt(e) {
        r.send("12", e)
    }
    function Ft(e) {
        r.send("10", X[e].sid)
    }
    function zt() {
        r.send("8", document.getElementById("allianceInput").value)
    }
    function Ht() {
        At = [],
        Ct(),
        r.send("9")
    }
    var Vt, qt = [];
    function Yt(e, t) {
        for (var n = 0; n < qt.length; ++n)
            if (!qt[n].active) {
                Vt = qt[n];
                break
            }
        Vt || (Vt = new function() {
            this.init = function(e, t) {
                this.scale = 0,
                this.x = e,
                this.y = t,
                this.active = !0
            }
            ,
            this.update = function(e, t) {
                this.active && (this.scale += .05 * t,
                this.scale >= o.mapPingScale ? this.active = !1 : (e.globalAlpha = 1 - Math.max(0, this.scale / o.mapPingScale),
                e.beginPath(),
                e.arc(this.x / o.mapScale * Ne.width, this.y / o.mapScale * Ne.width, this.scale, 0, 2 * Math.PI),
                e.stroke()))
            }
        }
        ,
        qt.push(Vt)),
        Vt.init(e, t)
    }
    function Wt(e) {
        Et = e
    }
    var Xt = 0;
    function Nt(e, t, n) {
        n ? e ? R.tailIndex = t : R.tails[t] = 1 : e ? R.skinIndex = t : R.skins[t] = 1,
        "block" == Qe.style.display && Gt()
    }
    function Gt() {
        if (R) {
            s.removeAllChildren($e);
            for (var e = Xt, t = e ? tt : et, n = 0; n < t.length; ++n)
                t[n].dontSell || function(n) {
                    var i = s.generateElement({
                        id: "storeDisplay" + n,
                        class: "storeItem",
                        onmouseout: function() {
                            Tt()
                        },
                        onmouseover: function() {
                            Tt(t[n], !1, !0)
                        },
                        parent: $e
                    });
                    s.hookTouchEvents(i, !0),
                    s.generateElement({
                        tag: "img",
                        class: "hatPreview",
                        src: "../img/" + (e ? "accessories/access_" : "hats/hat_") + t[n].id + (t[n].topSprite ? "_p" : "") + ".png",
                        parent: i
                    }),
                    s.generateElement({
                        tag: "span",
                        text: t[n].name,
                        parent: i
                    }),
                    (e ? R.tails[t[n].id] : R.skins[t[n].id]) ? (e ? R.tailIndex : R.skinIndex) == t[n].id ? s.generateElement({
                        class: "joinAlBtn",
                        style: "margin-top: 5px",
                        text: "Unequip",
                        onclick: function() {
                            Jt(0, e)
                        },
                        hookTouch: !0,
                        parent: i
                    }) : s.generateElement({
                        class: "joinAlBtn",
                        style: "margin-top: 5px",
                        text: "Equip",
                        onclick: function() {
                            Jt(t[n].id, e)
                        },
                        hookTouch: !0,
                        parent: i
                    }) : (s.generateElement({
                        class: "joinAlBtn",
                        style: "margin-top: 5px",
                        text: "Buy",
                        onclick: function() {
                            Kt(t[n].id, e)
                        },
                        hookTouch: !0,
                        parent: i
                    }),
                    s.generateElement({
                        tag: "span",
                        class: "itemPrice",
                        text: t[n].price,
                        parent: i
                    }))
                }(n)
        }
    }
    function Jt(e, t) {
        r.send("13c", 0, e, t)
    }
    function Kt(e, t) {
        r.send("13c", 1, e, t)
    }
    function Qt() {
        Qe.style.display = "none",
        Ye.style.display = "none",
        an()
    }
    function $t(e, t) {
        e && (t ? R.weapons = e : R.items = e);
        for (var n = 0; n < l.list.length; ++n) {
            var i = l.weapons.length + n;
            document.getElementById("actionBarItem" + i).style.display = R.items.indexOf(l.list[n].id) >= 0 ? "inline-block" : "none"
        }
        for (n = 0; n < l.weapons.length; ++n)
            document.getElementById("actionBarItem" + n).style.display = R.weapons[l.weapons[n].type] == l.weapons[n].id ? "inline-block" : "none"
    }
    function Zt(e) {
        M = e,
        V = e && window.devicePixelRatio || 1,
        Se.checked = e,
        I("native_resolution", e.toString()),
        un()
    }
    function en() {
        for (var e = "", t = 0; t < o.skinColors.length; ++t)
            e += t == ae ? "<div class='skinColorItem activeSkin' style='background-color:" + o.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>" : "<div class='skinColorItem' style='background-color:" + o.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>";
        Je.innerHTML = e
    }
    var tn = document.getElementById("chatBox")
      , nn = document.getElementById("chatHolder");
    function rn() {
        on ? setTimeout((function() {
            var e = prompt("chat message");
            e && sn(e)
        }
        ), 1) : "block" == nn.style.display ? (tn.value && sn(tn.value),
        an()) : (Qe.style.display = "none",
        Ye.style.display = "none",
        nn.style.display = "block",
        tn.focus(),
        yn()),
        tn.value = ""
    }
    function sn(e) {
        r.send("ch", e.slice(0, 30))
    }
    function an() {
        tn.value = "",
        nn.style.display = "none"
    }
    var on, cn, ln = ["cunt", "whore", "fuck", "shit", "faggot", "nigger", "nigga", "dick", "vagina", "minge", "cock", "rape", "cum", "sex", "tits", "penis", "clit", "pussy", "meatcurtain", "jizz", "prune", "douche", "wanker", "damn", "bitch", "dick", "fag", "bastard"];
    function hn(e, t) {
        var n = Ii(e);
        Tach.updateChat(t, e);
        n && (n.chatMessage = function(e) {
            for (var t, n = 0; n < ln.length; ++n)
                if (e.indexOf(ln[n]) > -1) {
                    t = "";
                    for (var i = 0; i < ln[n].length; ++i)
                        t += t.length ? "o" : "M";
                    var r = new RegExp(ln[n],"g");
                    e = e.replace(r, t)
                }
            return e
        }(t),
        n.chatCountdown = o.chatCountdown)
    }
    function un() {
        F = window.innerWidth,
        z = window.innerHeight;
        var e = Math.max(F / oe, z / ce) * V;
        we.width = F * V,
        we.height = z * V,
        we.style.width = F + "px",
        we.style.height = z + "px",
        be.setTransform(e, 0, 0, e, (F * V - oe * e) / 2, (z * V - ce * e) / 2)
    }
    function fn(e) {
        (on = e) ? Ae.classList.add("touch") : Ae.classList.remove("touch")
    }
    function dn(e) {
        e.preventDefault(),
        e.stopPropagation(),
        fn(!0);
        for (var t = 0; t < e.changedTouches.length; t++) {
            var n = e.changedTouches[t];
            n.identifier == re.id ? (re.id = -1,
            bn()) : n.identifier == se.id && (se.id = -1,
            R.buildIndex >= 0 && (O = 1,
            vn()),
            O = 0,
            vn())
        }
    }
    function pn() {
        return R ? (-1 != se.id ? cn = Math.atan2(se.currentY - se.startY, se.currentX - se.startX) : R.lockDir || on || (cn = Math.atan2(ie - z / 2, ne - F / 2)),
        s.fixTo(cn || 0, 2)) : 0
    }
    window.addEventListener("resize", s.checkTrusted(un)),
    un(),
    fn(!1),
    window.setUsingTouch = fn,
    we.addEventListener("touchmove", s.checkTrusted((function(e) {
        e.preventDefault(),
        e.stopPropagation(),
        fn(!0);
        for (var t = 0; t < e.changedTouches.length; t++) {
            var n = e.changedTouches[t];
            n.identifier == re.id ? (re.currentX = n.pageX,
            re.currentY = n.pageY,
            bn()) : n.identifier == se.id && (se.currentX = n.pageX,
            se.currentY = n.pageY,
            O = 1)
        }
    }
    )), !1),
    we.addEventListener("touchstart", s.checkTrusted((function(e) {
        e.preventDefault(),
        e.stopPropagation(),
        fn(!0);
        for (var t = 0; t < e.changedTouches.length; t++) {
            var n = e.changedTouches[t];
            n.pageX < document.body.scrollWidth / 2 && -1 == re.id ? (re.id = n.identifier,
            re.startX = re.currentX = n.pageX,
            re.startY = re.currentY = n.pageY,
            bn()) : n.pageX > document.body.scrollWidth / 2 && -1 == se.id && (se.id = n.identifier,
            se.startX = se.currentX = n.pageX,
            se.startY = se.currentY = n.pageY,
            R.buildIndex < 0 && (O = 1,
            vn()))
        }
    }
    )), !1),
    we.addEventListener("touchend", s.checkTrusted(dn), !1),
    we.addEventListener("touchcancel", s.checkTrusted(dn), !1),
    we.addEventListener("touchleave", s.checkTrusted(dn), !1),
    we.addEventListener("mousemove", (function(e) {
        e.preventDefault(),
        e.stopPropagation(),
        fn(!1),
        ne = e.clientX,
        ie = e.clientY
    }
    ), !1),
    we.addEventListener("mousedown", (function(e) {
        fn(!1),
        1 != O && (O = 1,
        vn())
    }
    ), !1),
    we.addEventListener("mouseup", (function(e) {
        fn(!1),
        0 != O && (O = 0,
        vn())
    }
    ), !1);
    var gn = {}
      , mn = {
        87: [0, -1],
        38: [0, -1],
        83: [0, 1],
        40: [0, 1],
        65: [-1, 0],
        37: [-1, 0],
        68: [1, 0],
        39: [1, 0]
    };
    function yn() {
        gn = {},
        r.send("rmd")
    }
    function kn() {
        return "block" != Ye.style.display && "block" != nn.style.display
    }
    function vn() {
        R && R.alive && r.send("c", O, R.buildIndex >= 0 ? pn() : null)
    }
    window.addEventListener("keydown", s.checkTrusted((function(e) {
        var t = e.which || e.keyCode || 0;
        27 == t ? Qt() : R && R.alive && kn() && (gn[t] || (gn[t] = 1,
        69 == t ? r.send("7", 1) : 67 == t ? Tach.setWaypoint("quick", R) : 88 == t ? (R.lockDir = R.lockDir ? 0 : 1,
        r.send("7", 0)) : null != R.weapons[t - 49] ? Sn(R.weapons[t - 49], !0) : null != R.items[t - 49 - R.weapons.length] ? Sn(R.items[t - 49 - R.weapons.length]) : 81 == t ? Sn(R.items[0]) : 82 == t ? xn() : mn[t] ? bn() : 32 == t && (O = 1,
        vn())))
    }
    ))),
    window.addEventListener("keyup", s.checkTrusted((function(e) {
        if (R && R.alive) {
            var t = e.which || e.keyCode || 0;
            13 == t ? rn() : kn() && gn[t] && (gn[t] = 0,
            mn[t] ? bn() : 32 == t && (O = 0,
            vn()))
        }
    }
    )));
    var wn = void 0;
    function bn() {
        var e = function() {
            var e = 0
              , t = 0;
            if (-1 != re.id)
                e += re.currentX - re.startX,
                t += re.currentY - re.startY;
            else
                for (var n in mn) {
                    var i = mn[n];
                    e += !!gn[n] * i[0],
                    t += !!gn[n] * i[1]
                }
            return 0 == e && 0 == t ? void 0 : s.fixTo(Math.atan2(t, e), 2)
        }();
        (null == wn || null == e || Math.abs(e - wn) > .3) && (r.send("33", e),
        wn = e)
    }
    function xn() {
        r.send("14", 1)
    }
    function Sn(e, t) {
        r.send("5", e, t)
    }
    function Tn() {
        I("moo_name", Le.value),
        !le && r.connected && (le = !0,
        x.stop("menu"),
        dt("Loading..."),
        r.send("sp", {
            name: Le.value,
            moofoll: H,
            skin: ae
        }))
        try{
            document.getElementById("ot-sdk-btn-floating").style.display = "none";
            Tach.abort();
        }catch(e){}
    }
    var In = !0;
    function En(e) {
        Pe.style.display = "none",
        Me.style.display = "block",
        he.style.display = "none",
        gn = {},
        j = e,
        O = 0,
        le = !0,
        In && (In = !1,
        N.length = 0)
    }
    function Mn(e, t, n, i) {
        m.showText(e, t, 50, .18, 500, Math.abs(n), n >= 0 ? "#fff" : "#8ecc51")
    }
    var An = 99999;
    function Pn() {
        try{
            document.getElementById("ot-sdk-btn-floating").style.display = "block";
        }catch(e){}
        le = !1;
        Be.style.display = "none",
        Qt(),
        Tach.setWaypoint("death", R),
        Pe.style.display = "none",
        Ge.style.display = "block",
        Ge.style.fontSize = "0px",
        An = 0,
        setTimeout((function() {
            Me.style.display = "block",
            he.style.display = "block",
            Ge.style.display = "none"
        }
        ), o.deathFadeout),
        gt()
    }
    function Bn(e) {
        R && nt.removeAllItems(e)
    }
    function Cn(e) {
        nt.disableBySid(e)
    }
    function On() {
        Oe.innerText = R.points,
        Re.innerText = R.food,
        je.innerText = R.wood,
        _e.innerText = R.stone,
        Ue.innerText = R.kills
    }
    var Rn = {}
      , jn = ["crown", "skull"]
      , _n = [];
    function Un(e, t) {
        if (R.upgradePoints = e,
        R.upgrAge = t,
        e > 0) {
            _n.length = 0,
            s.removeAllChildren(Ve);
            for (var n = 0; n < l.weapons.length; ++n)
                l.weapons[n].age == t && (null == l.weapons[n].pre || R.weapons.indexOf(l.weapons[n].pre) >= 0) && (s.generateElement({
                    id: "upgradeItem" + n,
                    class: "actionBarItem",
                    onmouseout: function() {
                        Tt()
                    },
                    parent: Ve
                }).style.backgroundImage = document.getElementById("actionBarItem" + n).style.backgroundImage,
                _n.push(n));
            for (n = 0; n < l.list.length; ++n)
                if (l.list[n].age == t && (null == l.list[n].pre || R.items.indexOf(l.list[n].pre) >= 0)) {
                    var i = l.weapons.length + n;
                    s.generateElement({
                        id: "upgradeItem" + i,
                        class: "actionBarItem",
                        onmouseout: function() {
                            Tt()
                        },
                        parent: Ve
                    }).style.backgroundImage = document.getElementById("actionBarItem" + i).style.backgroundImage,
                    _n.push(i)
                }
            for (n = 0; n < _n.length; n++)
                !function(e) {
                    var t = document.getElementById("upgradeItem" + e);
                    t.onmouseover = function() {
                        l.weapons[e] ? Tt(l.weapons[e], !0) : Tt(l.list[e - l.weapons.length])
                    }
                    ,
                    t.onclick = s.checkTrusted((function() {
                        r.send("6", e)
                    }
                    )),
                    s.hookTouchEvents(t)
                }(_n[n]);
            _n.length ? (Ve.style.display = "block",
            qe.style.display = "block",
            qe.innerHTML = "SELECT ITEMS (" + e + ")") : (Ve.style.display = "none",
            qe.style.display = "none",
            Tt())
        } else
            Ve.style.display = "none",
            qe.style.display = "none",
            Tt()
    }
    function Dn(e, t, n) {
        null != e && (R.XP = e),
        null != t && (R.maxXP = t),
        null != n && (R.age = n),
        n == o.maxAge ? (ze.innerHTML = "MAX AGE",
        He.style.width = "100%") : (ze.innerHTML = "AGE " + R.age,
        He.style.width = R.XP / R.maxXP * 100 + "%")
    }
    function Ln(e) {
        s.removeAllChildren(De);
        for (var t = 1, n = 0; n < e.length; n += 3)
            !function(n) {
                s.generateElement({
                    class: "leaderHolder",
                    parent: De,
                    children: [s.generateElement({
                        class: "leaderboardItem",
                        style: "color:" + (e[n] == j ? "#fff" : "rgba(255,255,255,0.6)"),
                        text: t + ". " + ("" != e[n + 1] ? e[n + 1] : "unknown")
                    }), s.generateElement({
                        class: "leaderScore",
                        text: s.kFormat(e[n + 2]) || "0"
                    })]
                })
            }(n),
            t++
    }
    function Fn(e, t, n, i) {
        be.save(),
        be.setTransform(1, 0, 0, 1, 0, 0),
        be.scale(V, V);
        var r = 50;
        be.beginPath(),
        be.arc(e, t, r, 0, 2 * Math.PI, !1),
        be.closePath(),
        be.fillStyle = "rgba(255, 255, 255, 0.3)",
        be.fill(),
        r = 50;
        var s = n - e
          , a = i - t
          , o = Math.sqrt(Math.pow(s, 2) + Math.pow(a, 2))
          , c = o > r ? o / r : 1;
        s /= c,
        a /= c,
        be.beginPath(),
        be.arc(e + s, t + a, .5 * r, 0, 2 * Math.PI, !1),
        be.closePath(),
        be.fillStyle = "white",
        be.fill(),
        be.restore()
    }
    function zn(e, t, n) {
        for (var i = 0; i < G.length; ++i)
            (_ = G[i]).active && _.layer == e && (_.update(P),
            _.active && ki(_.x - t, _.y - n, _.scale) && (be.save(),
            be.translate(_.x - t, _.y - n),
            be.rotate(_.dir),
            Vn(0, 0, _, be, 1),
            be.restore()))
    }
    var Hn = {};
    function Vn(e, t, n, i, r) {
        if (n.src) {
            var s = l.projectiles[n.indx].src
              , a = Hn[s];
            a || ((a = new Image).onload = function() {
                this.isLoaded = !0
            }
            ,
            a.src = ".././img/weapons/" + s + ".png",
            Hn[s] = a),
            a.isLoaded && i.drawImage(a, e - n.scale / 2, t - n.scale / 2, n.scale, n.scale)
        } else
            1 == n.indx && (i.fillStyle = "#939393",
            si(e, t, n.scale, i))
    }
    function qn(e, t, n, i) {
        var r = o.riverWidth + i
          , s = o.mapScale / 2 - t - r / 2;
        s < ce && s + r > 0 && n.fillRect(0, s, oe, r)
    }
    function Yn(e, t, n) {
        for (var i, r, s, a = 0; a < N.length; ++a)
            (_ = N[a]).active && (r = _.x + _.xWiggle - t,
            s = _.y + _.yWiggle - n,
            0 == e && _.update(P),
            _.layer == e && ki(r, s, _.scale + (_.blocker || 0)) && (be.globalAlpha = _.hideFromEnemy ? .6 : 1,
            _.isItem ? (i = ri(_),
            be.save(),
            be.translate(r, s),
            be.rotate(_.dir),
            be.drawImage(i, -i.width / 2, -i.height / 2),
            _.blocker && (be.strokeStyle = "#db6e6e",
            be.globalAlpha = .3,
            be.lineWidth = 6,
            si(0, 0, _.blocker, be, !1, !0)),
            be.restore()) : (i = ni(_),
            be.drawImage(i, r - i.width / 2, s - i.height / 2))))
    }
    function Wn(e, t, n) {
        (_ = Ii(e)) && _.startAnim(t, n)
    }
    function Xn(e, t, n) {
        be.globalAlpha = 1;
        for (var i = 0; i < W.length; ++i)
            (_ = W[i]).zIndex == n && (_.animate(P),
            _.visible && (_.skinRot += .002 * P,
            L = (_ == R ? pn() : _.dir) + _.dirPlus,
            be.save(),
            be.translate(_.x - e, _.y - t),
            be.rotate(L),
            Nn(_, be),
            be.restore()))
    }
    function Nn(e, t) {
        (t = t || be).lineWidth = 5.5,
        t.lineJoin = "miter";
        var n = Math.PI / 4 * (l.weapons[e.weaponIndex].armS || 1)
          , i = e.buildIndex < 0 && l.weapons[e.weaponIndex].hndS || 1
          , r = e.buildIndex < 0 && l.weapons[e.weaponIndex].hndD || 1;
        if (e.tailIndex > 0 && function(e, t, n) {
            if (!(Gn = Qn[e])) {
                var i = new Image;
                i.onload = function() {
                    this.isLoaded = !0,
                    this.onload = null
                }
                ,
                i.src = ".././img/accessories/access_" + e + ".png",
                Qn[e] = i,
                Gn = i
            }
            var r = $n[e];
            if (!r) {
                for (var s = 0; s < tt.length; ++s)
                    if (tt[s].id == e) {
                        r = tt[s];
                        break
                    }
                $n[e] = r
            }
            Gn.isLoaded && (t.save(),
            t.translate(-20 - (r.xOff || 0), 0),
            r.spin && t.rotate(n.skinRot),
            t.drawImage(Gn, -r.scale / 2, -r.scale / 2, r.scale, r.scale),
            t.restore())
        }(e.tailIndex, t, e),
        e.buildIndex < 0 && !l.weapons[e.weaponIndex].aboveHand && (ei(l.weapons[e.weaponIndex], o.weaponVariants[e.weaponVariant].src, e.scale, 0, t),
        null == l.weapons[e.weaponIndex].projectile || l.weapons[e.weaponIndex].hideProjectile || Vn(e.scale, 0, l.projectiles[l.weapons[e.weaponIndex].projectile], be)),
        t.fillStyle = o.skinColors[e.skinColor],
        si(e.scale * Math.cos(n), e.scale * Math.sin(n), 14),
        si(e.scale * r * Math.cos(-n * i), e.scale * r * Math.sin(-n * i), 14),
        e.buildIndex < 0 && l.weapons[e.weaponIndex].aboveHand && (ei(l.weapons[e.weaponIndex], o.weaponVariants[e.weaponVariant].src, e.scale, 0, t),
        null == l.weapons[e.weaponIndex].projectile || l.weapons[e.weaponIndex].hideProjectile || Vn(e.scale, 0, l.projectiles[l.weapons[e.weaponIndex].projectile], be)),
        e.buildIndex >= 0) {
            var s = ri(l.list[e.buildIndex]);
            t.drawImage(s, e.scale - l.list[e.buildIndex].holdOffset, -s.width / 2)
        }
        si(0, 0, e.scale, t),
        e.skinIndex > 0 && (t.rotate(Math.PI / 2),
        function e(t, n, i, r) {
            if (!(Gn = Jn[t])) {
                var s = new Image;
                s.onload = function() {
                    this.isLoaded = !0,
                    this.onload = null
                }
                ,
                s.src = ".././img/hats/hat_" + t + ".png",
                Jn[t] = s,
                Gn = s
            }
            var a = i || Kn[t];
            if (!a) {
                for (var o = 0; o < et.length; ++o)
                    if (et[o].id == t) {
                        a = et[o];
                        break
                    }
                Kn[t] = a
            }
            Gn.isLoaded && n.drawImage(Gn, -a.scale / 2, -a.scale / 2, a.scale, a.scale),
            !i && a.topSprite && (n.save(),
            n.rotate(r.skinRot),
            e(t + "_top", n, a, r),
            n.restore())
        }(e.skinIndex, t, null, e))
    }
    var Gn, Jn = {}, Kn = {}, Qn = {}, $n = {}, Zn = {};
    function ei(e, t, n, i, r) {
        var s = e.src + (t || "")
          , a = Zn[s];
        a || ((a = new Image).onload = function() {
            this.isLoaded = !0
        }
        ,
        a.src = ".././img/weapons/" + s + ".png",
        Zn[s] = a),
        a.isLoaded && r.drawImage(a, n + e.xOff - e.length / 2, i + e.yOff - e.width / 2, e.length, e.width)
    }
    var ti = {};
    function ni(e) {
        var t = e.y >= o.mapScale - o.snowBiomeTop ? 2 : e.y <= o.snowBiomeTop ? 1 : 0
          , n = e.type + "_" + e.scale + "_" + t
          , i = ti[n];
        if (!i) {
            var r = document.createElement("canvas");
            r.width = r.height = 2.1 * e.scale + 5.5;
            var a = r.getContext("2d");
            if (a.translate(r.width / 2, r.height / 2),
            a.rotate(s.randFloat(0, Math.PI)),
            a.strokeStyle = it,
            a.lineWidth = 5.5,
            0 == e.type)
                for (var c, l = 0; l < 2; ++l)
                    ai(a, 7, c = _.scale * (l ? .5 : 1), .7 * c),
                    a.fillStyle = t ? l ? "#fff" : "#e3f1f4" : l ? "#b4db62" : "#9ebf57",
                    a.fill(),
                    l || a.stroke();
            else if (1 == e.type)
                if (2 == t)
                    a.fillStyle = "#606060",
                    ai(a, 6, .3 * e.scale, .71 * e.scale),
                    a.fill(),
                    a.stroke(),
                    a.fillStyle = "#89a54c",
                    si(0, 0, .55 * e.scale, a),
                    a.fillStyle = "#a5c65b",
                    si(0, 0, .3 * e.scale, a, !0);
                else {
                    var h;
                    !function(e, t, n, i) {
                        var r, a = Math.PI / 2 * 3, o = Math.PI / 6;
                        e.beginPath(),
                        e.moveTo(0, -i);
                        for (var c = 0; c < 6; c++)
                            r = s.randInt(n + .9, 1.2 * n),
                            e.quadraticCurveTo(Math.cos(a + o) * r, Math.sin(a + o) * r, Math.cos(a + 2 * o) * i, Math.sin(a + 2 * o) * i),
                            a += 2 * o;
                        e.lineTo(0, -i),
                        e.closePath()
                    }(a, 0, _.scale, .7 * _.scale),
                    a.fillStyle = t ? "#e3f1f4" : "#89a54c",
                    a.fill(),
                    a.stroke(),
                    a.fillStyle = t ? "#6a64af" : "#c15555";
                    var u = T / 4;
                    for (l = 0; l < 4; ++l)
                        si((h = s.randInt(_.scale / 3.5, _.scale / 2.3)) * Math.cos(u * l), h * Math.sin(u * l), s.randInt(10, 12), a)
                }
            else
                2 != e.type && 3 != e.type || (a.fillStyle = 2 == e.type ? 2 == t ? "#938d77" : "#939393" : "#e0c655",
                ai(a, 3, e.scale, e.scale),
                a.fill(),
                a.stroke(),
                a.fillStyle = 2 == e.type ? 2 == t ? "#b2ab90" : "#bcbcbc" : "#ebdca3",
                ai(a, 3, .55 * e.scale, .65 * e.scale),
                a.fill());
            i = r,
            ti[n] = i
        }
        return i
    }
    var ii = [];
    function ri(e, t) {
        var n = ii[e.id];
        if (!n || t) {
            var i = document.createElement("canvas");
            i.width = i.height = 2.5 * e.scale + 5.5 + (l.list[e.id].spritePadding || 0);
            var r = i.getContext("2d");
            if (r.translate(i.width / 2, i.height / 2),
            r.rotate(t ? 0 : Math.PI / 2),
            r.strokeStyle = it,
            r.lineWidth = 5.5 * (t ? i.width / 81 : 1),
            "apple" == e.name) {
                r.fillStyle = "#c15555",
                si(0, 0, e.scale, r),
                r.fillStyle = "#89a54c";
                var a = -Math.PI / 2;
                !function(e, t, n, i, r) {
                    var s = e + 25 * Math.cos(i)
                      , a = t + 25 * Math.sin(i);
                    r.moveTo(e, t),
                    r.beginPath(),
                    r.quadraticCurveTo((e + s) / 2 + 10 * Math.cos(i + Math.PI / 2), (t + a) / 2 + 10 * Math.sin(i + Math.PI / 2), s, a),
                    r.quadraticCurveTo((e + s) / 2 - 10 * Math.cos(i + Math.PI / 2), (t + a) / 2 - 10 * Math.sin(i + Math.PI / 2), e, t),
                    r.closePath(),
                    r.fill(),
                    r.stroke()
                }(e.scale * Math.cos(a), e.scale * Math.sin(a), 0, a + Math.PI / 2, r)
            } else if ("cookie" == e.name) {
                r.fillStyle = "#cca861",
                si(0, 0, e.scale, r),
                r.fillStyle = "#937c4b";
                for (var o = T / (h = 4), c = 0; c < h; ++c)
                    si((u = s.randInt(e.scale / 2.5, e.scale / 1.7)) * Math.cos(o * c), u * Math.sin(o * c), s.randInt(4, 5), r, !0)
            } else if ("cheese" == e.name) {
                var h, u;
                for (r.fillStyle = "#f4f3ac",
                si(0, 0, e.scale, r),
                r.fillStyle = "#c3c28b",
                o = T / (h = 4),
                c = 0; c < h; ++c)
                    si((u = s.randInt(e.scale / 2.5, e.scale / 1.7)) * Math.cos(o * c), u * Math.sin(o * c), s.randInt(4, 5), r, !0)
            } else if ("wood wall" == e.name || "stone wall" == e.name || "castle wall" == e.name) {
                r.fillStyle = "castle wall" == e.name ? "#83898e" : "wood wall" == e.name ? "#a5974c" : "#939393";
                var f = "castle wall" == e.name ? 4 : 3;
                ai(r, f, 1.1 * e.scale, 1.1 * e.scale),
                r.fill(),
                r.stroke(),
                r.fillStyle = "castle wall" == e.name ? "#9da4aa" : "wood wall" == e.name ? "#c9b758" : "#bcbcbc",
                ai(r, f, .65 * e.scale, .65 * e.scale),
                r.fill()
            } else if ("spikes" == e.name || "greater spikes" == e.name || "poison spikes" == e.name || "spinning spikes" == e.name) {
                r.fillStyle = "poison spikes" == e.name ? "#7b935d" : "#939393";
                var d = .6 * e.scale;
                ai(r, "spikes" == e.name ? 5 : 6, e.scale, d),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#a5974c",
                si(0, 0, d, r),
                r.fillStyle = "#c9b758",
                si(0, 0, d / 2, r, !0)
            } else if ("windmill" == e.name || "faster windmill" == e.name || "power mill" == e.name)
                r.fillStyle = "#a5974c",
                si(0, 0, e.scale, r),
                r.fillStyle = "#c9b758",
                ci(0, 0, 1.5 * e.scale, 29, 4, r),
                r.fillStyle = "#a5974c",
                si(0, 0, .5 * e.scale, r);
            else if ("mine" == e.name)
                r.fillStyle = "#939393",
                ai(r, 3, e.scale, e.scale),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#bcbcbc",
                ai(r, 3, .55 * e.scale, .65 * e.scale),
                r.fill();
            else if ("sapling" == e.name)
                for (c = 0; c < 2; ++c)
                    ai(r, 7, d = e.scale * (c ? .5 : 1), .7 * d),
                    r.fillStyle = c ? "#b4db62" : "#9ebf57",
                    r.fill(),
                    c || r.stroke();
            else if ("pit trap" == e.name)
                r.fillStyle = "#a5974c",
                ai(r, 3, 1.1 * e.scale, 1.1 * e.scale),
                r.fill(),
                r.stroke(),
                r.fillStyle = it,
                ai(r, 3, .65 * e.scale, .65 * e.scale),
                r.fill();
            else if ("boost pad" == e.name)
                r.fillStyle = "#7e7f82",
                oi(0, 0, 2 * e.scale, 2 * e.scale, r),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#dbd97d",
                function(e, t) {
                    t = t || be;
                    var n = e * (Math.sqrt(3) / 2);
                    t.beginPath(),
                    t.moveTo(0, -n / 2),
                    t.lineTo(-e / 2, n / 2),
                    t.lineTo(e / 2, n / 2),
                    t.lineTo(0, -n / 2),
                    t.fill(),
                    t.closePath()
                }(1 * e.scale, r);
            else if ("turret" == e.name)
                r.fillStyle = "#a5974c",
                si(0, 0, e.scale, r),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#939393",
                oi(0, -25, .9 * e.scale, 50, r),
                si(0, 0, .6 * e.scale, r),
                r.fill(),
                r.stroke();
            else if ("platform" == e.name) {
                r.fillStyle = "#cebd5f";
                var p = 2 * e.scale
                  , g = p / 4
                  , m = -e.scale / 2;
                for (c = 0; c < 4; ++c)
                    oi(m - g / 2, 0, g, 2 * e.scale, r),
                    r.fill(),
                    r.stroke(),
                    m += p / 4
            } else
                "healing pad" == e.name ? (r.fillStyle = "#7e7f82",
                oi(0, 0, 2 * e.scale, 2 * e.scale, r),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#db6e6e",
                ci(0, 0, .65 * e.scale, 20, 4, r, !0)) : "spawn pad" == e.name ? (r.fillStyle = "#7e7f82",
                oi(0, 0, 2 * e.scale, 2 * e.scale, r),
                r.fill(),
                r.stroke(),
                r.fillStyle = "#71aad6",
                si(0, 0, .6 * e.scale, r)) : "blocker" == e.name ? (r.fillStyle = "#7e7f82",
                si(0, 0, e.scale, r),
                r.fill(),
                r.stroke(),
                r.rotate(Math.PI / 4),
                r.fillStyle = "#db6e6e",
                ci(0, 0, .65 * e.scale, 20, 4, r, !0)) : "teleporter" == e.name && (r.fillStyle = "#7e7f82",
                si(0, 0, e.scale, r),
                r.fill(),
                r.stroke(),
                r.rotate(Math.PI / 4),
                r.fillStyle = "#d76edb",
                si(0, 0, .5 * e.scale, r, !0));
            n = i,
            t || (ii[e.id] = n)
        }
        return n
    }
    function si(e, t, n, i, r, s) {
        (i = i || be).beginPath(),
        i.arc(e, t, n, 0, 2 * Math.PI),
        s || i.fill(),
        r || i.stroke()
    }
    function ai(e, t, n, i) {
        var r, s, a = Math.PI / 2 * 3, o = Math.PI / t;
        e.beginPath(),
        e.moveTo(0, -n);
        for (var c = 0; c < t; c++)
            r = Math.cos(a) * n,
            s = Math.sin(a) * n,
            e.lineTo(r, s),
            a += o,
            r = Math.cos(a) * i,
            s = Math.sin(a) * i,
            e.lineTo(r, s),
            a += o;
        e.lineTo(0, -n),
        e.closePath()
    }
    function oi(e, t, n, i, r, s) {
        r.fillRect(e - n / 2, t - i / 2, n, i),
        s || r.strokeRect(e - n / 2, t - i / 2, n, i)
    }
    function ci(e, t, n, i, r, s, a) {
        s.save(),
        s.translate(e, t),
        r = Math.ceil(r / 2);
        for (var o = 0; o < r; o++)
            oi(0, 0, 2 * n, i, s, a),
            s.rotate(Math.PI / r);
        s.restore()
    }
    function li(e) {
        for (var t = 0; t < e.length; )
            nt.add(e[t], e[t + 1], e[t + 2], e[t + 3], e[t + 4], e[t + 5], l.list[e[t + 6]], !0, e[t + 7] >= 0 ? {
                sid: e[t + 7]
            } : null),
            t += 8
    }
    function hi(e, t) {
        (_ = Mi(t)) && (_.xWiggle += o.gatherWiggle * Math.cos(e),
        _.yWiggle += o.gatherWiggle * Math.sin(e))
    }
    function ui(e, t) {
        (_ = Mi(e)) && (_.dir = t,
        _.xWiggle += o.gatherWiggle * Math.cos(t + Math.PI),
        _.yWiggle += o.gatherWiggle * Math.sin(t + Math.PI))
    }
    function fi(e, t, n, i, r, s, a, o) {
        lt && (J.addProjectile(e, t, n, i, r, s, null, null, a).sid = o)
    }
    function di(e, t) {
        for (var n = 0; n < G.length; ++n)
            G[n].sid == e && (G[n].range = t)
    }
    function pi(e) {
        (_ = Ei(e)) && _.startAnim()
    }
    function gi(e) {
        for (var t = 0; t < Y.length; ++t)
            Y[t].forcePos = !Y[t].visible,
            Y[t].visible = !1;
        if (e) {
            var n = Date.now();
            for (t = 0; t < e.length; )
                (_ = Ei(e[t])) ? (_.index = e[t + 1],
                _.t1 = void 0 === _.t2 ? n : _.t2,
                _.t2 = n,
                _.x1 = _.x,
                _.y1 = _.y,
                _.x2 = e[t + 2],
                _.y2 = e[t + 3],
                _.d1 = void 0 === _.d2 ? e[t + 4] : _.d2,
                _.d2 = e[t + 4],
                _.health = e[t + 5],
                _.dt = 0,
                _.visible = !0) : ((_ = Z.spawn(e[t + 2], e[t + 3], e[t + 4], e[t + 1])).x2 = _.x,
                _.y2 = _.y,
                _.d2 = _.dir,
                _.health = e[t + 5],
                Z.aiTypes[e[t + 1]].name || (_.name = o.cowNames[e[t + 6]]),
                _.forcePos = !0,
                _.sid = e[t],
                _.visible = !0),
                t += 7
        }
        Tach.updateAnimals(Y);
    }
    var mi = {};
    function yi(e, t) {
        var n = e.index
          , i = mi[n];
        if (!i) {
            var r = new Image;
            r.onload = function() {
                this.isLoaded = !0,
                this.onload = null
            }
            ,
            r.src = ".././img/animals/" + e.src + ".png",
            i = r,
            mi[n] = i
        }
        if (i.isLoaded) {
            var s = 1.2 * e.scale * (e.spriteMlt || 1);
            t.drawImage(i, -s, -s, 2 * s, 2 * s)
        }
    }
    function ki(e, t, n) {
        return e + n >= 0 && e - n <= oe && t + n >= 0 && t - n <= ce
    }
    function vi(e, t) {
        var n = function(e) {
            for (var t = 0; t < W.length; ++t)
                if (W[t].id == e)
                    return W[t];
            return null
        }(e[0]);
        n || (n = new u(e[0],e[1],o,s,J,nt,W,Y,l,et,tt),
        W.push(n)),
        n.spawn(t ? H : null),
        n.visible = !1,
        n.x2 = void 0,
        n.y2 = void 0,
        n.setData(e),
        t && (U = (R = n).x,
        D = R.y,
        $t(),
        On(),
        Dn(),
        Un(0),
        Be.style.display = "block")
    }
    function wi(e) {
        for (var t = 0; t < W.length; t++)
            if (W[t].id == e) {
                W.splice(t, 1);
                break
            }
    }
    function bi(e, t) {
        R && (R.itemCounts[e] = t)
    }
    function xi(e, t, n) {
        R && (R[e] = t,
        n && On())
    }
    function Si(e, t) {
        (_ = Ii(e)) && (_.health = t)
    }
    Pathfinder.setBuildings(N);
    function Ti(e) {
        for (var t = Date.now(), n = 0; n < W.length; ++n)
            W[n].forcePos = !W[n].visible,
            W[n].visible = !1;
        for (n = 0; n < e.length; )
            (_ = Ii(e[n])) && (_.t1 = void 0 === _.t2 ? t : _.t2,
            _.t2 = t,
            _.x1 = _.x,
            _.y1 = _.y,
            _.x2 = e[n + 1],
            _.y2 = e[n + 2],
            _.d1 = void 0 === _.d2 ? e[n + 3] : _.d2,
            _.d2 = e[n + 3],
            _.dt = 0,
            _.buildIndex = e[n + 4],
            _.weaponIndex = e[n + 5],
            _.weaponVariant = e[n + 6],
            _.team = e[n + 7],
            _.isLeader = e[n + 8],
            _.skinIndex = e[n + 9],
            _.tailIndex = e[n + 10],
            _.iconIndex = e[n + 11],
            _.zIndex = e[n + 12],
            _.visible = !0),
            n += 13;
        Pathfinder.setPos(R.x2, R.y2);
        Tach.setSend(r.send.bind(r));
        Tach.setSelf(R);
        Tach.updatePlayers(W);
    }
    function Ii(e) {
        for (var t = 0; t < W.length; ++t)
            if (W[t].sid == e)
                return W[t];
        return null
    }
    function Ei(e) {
        for (var t = 0; t < Y.length; ++t)
            if (Y[t].sid == e)
                return Y[t];
        return null
    }
    function Mi(e) {
        for (var t = 0; t < N.length; ++t)
            if (N[t].sid == e)
                return N[t];
        return null
    }
    var Ai = -1;
    function Pi() {
        var e = Date.now() - Ai;
        window.pingTime = e,
        Ie.innerText = "Ping: " + e + " ms"
    }
    function Bi() {
        Ai = Date.now(),
        r.send("pp")
    }
    function Ci(e) {
        if (!(e < 0)) {
            var t = Math.floor(e / 60)
              , n = e % 60;
            n = ("0" + n).slice(-2),
            Ee.innerText = "Server restarting in " + t + ":" + n,
            Ee.hidden = !1
        }
    }
    function Oi(e) {
        window.open(e, "_blank")
    }
    window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(e) {
        window.setTimeout(e, 1e3 / 60)
    }
    ,
    function() {
        var e = o.mapScale / 2;
        nt.add(0, e, e + 200, 0, o.treeScales[3], 0),
        nt.add(1, e, e - 480, 0, o.treeScales[3], 0),
        nt.add(2, e + 300, e + 450, 0, o.treeScales[3], 0),
        nt.add(3, e - 950, e - 130, 0, o.treeScales[2], 0),
        nt.add(4, e - 750, e - 400, 0, o.treeScales[3], 0),
        nt.add(5, e - 700, e + 400, 0, o.treeScales[2], 0),
        nt.add(6, e + 800, e - 200, 0, o.treeScales[3], 0),
        nt.add(7, e - 260, e + 340, 0, o.bushScales[3], 1),
        nt.add(8, e + 760, e + 310, 0, o.bushScales[3], 1),
        nt.add(9, e - 800, e + 100, 0, o.bushScales[3], 1),
        nt.add(10, e - 800, e + 300, 0, l.list[4].scale, l.list[4].id, l.list[10]),
        nt.add(11, e + 650, e - 390, 0, l.list[4].scale, l.list[4].id, l.list[10]),
        nt.add(12, e - 400, e - 450, 0, o.rockScales[2], 2)
    }(),
    function e() {
        B = Date.now(),
        P = B - q,
        q = B,
        function() {
            if (R && (!C || B - C >= 1e3 / o.clientSendRate) && (C = B,
            r.send("2", pn())),
            An < 120 && (An += .1 * P,
            Ge.style.fontSize = Math.min(Math.round(An), 120) + "px"),
            R) {
                var e = s.getDistance(U, D, R.x, R.y)
                  , t = s.getDirection(R.x, R.y, U, D)
                  , n = Math.min(.01 * e * P, e);
                e > .05 ? (U += n * Math.cos(t),
                D += n * Math.sin(t)) : (U = R.x,
                D = R.y)
            } else
                U = o.mapScale / 2,
                D = o.mapScale / 2;
            for (var i = B - 1e3 / o.serverUpdateRate, a = 0; a < W.length + Y.length; ++a)
                if ((_ = W[a] || Y[a - W.length]) && _.visible)
                    if (_.forcePos)
                        _.x = _.x2,
                        _.y = _.y2,
                        _.dir = _.d2;
                    else {
                        var c = _.t2 - _.t1
                          , l = (i - _.t1) / c;
                        _.dt += P;
                        var h = Math.min(1.7, _.dt / 170)
                          , u = _.x2 - _.x1;
                        _.x = _.x1 + u * h,
                        u = _.y2 - _.y1,
                        _.y = _.y1 + u * h,
                        _.dir = Math.lerpAngle(_.d2, _.d1, Math.min(1.2, l))
                    }
            var f = U - oe / 2
              , d = D - ce / 2;
            o.snowBiomeTop - d <= 0 && o.mapScale - o.snowBiomeTop - d >= ce ? (be.fillStyle = "#b6db66",
            be.fillRect(0, 0, oe, ce)) : o.mapScale - o.snowBiomeTop - d <= 0 ? (be.fillStyle = "#dbc666",
            be.fillRect(0, 0, oe, ce)) : o.snowBiomeTop - d >= ce ? (be.fillStyle = "#fff",
            be.fillRect(0, 0, oe, ce)) : o.snowBiomeTop - d >= 0 ? (be.fillStyle = "#fff",
            be.fillRect(0, 0, oe, o.snowBiomeTop - d),
            be.fillStyle = "#b6db66",
            be.fillRect(0, o.snowBiomeTop - d, oe, ce - (o.snowBiomeTop - d))) : (be.fillStyle = "#b6db66",
            be.fillRect(0, 0, oe, o.mapScale - o.snowBiomeTop - d),
            be.fillStyle = "#dbc666",
            be.fillRect(0, o.mapScale - o.snowBiomeTop - d, oe, ce - (o.mapScale - o.snowBiomeTop - d))),
            In || ((ee += te * o.waveSpeed * P) >= o.waveMax ? (ee = o.waveMax,
            te = -1) : ee <= 1 && (ee = te = 1),
            be.globalAlpha = 1,
            be.fillStyle = "#dbc666",
            qn(f, d, be, o.riverPadding),
            be.fillStyle = "#91b2db",
            qn(f, d, be, 250 * (ee - 1))),
            be.lineWidth = 4,
            be.strokeStyle = "#000",
            be.globalAlpha = .06,
            be.beginPath();
            for (var p = (14400-f) % 1440; p < oe; p += 1440){
                p > 0 && (be.moveTo(p, 0),
                be.lineTo(p, ce));
			}
            for (var g = (14400-d) % 1440; g < ce; g += 1440){
                g > 0 && (be.moveTo(0, g),
                be.lineTo(oe, g));
            }
			be.stroke();
            for (be.globalAlpha = 1,
            be.strokeStyle = it,
            Yn(-1, f, d),
            be.globalAlpha = 1,
            be.lineWidth = 5.5,
            zn(0, f, d),
            Xn(f, d, 0),
            be.globalAlpha = 1,
            a = 0; a < Y.length; ++a)
                (_ = Y[a]).active && _.visible && (_.animate(P),
                be.save(),
                be.translate(_.x - f, _.y - d),
                be.rotate(_.dir + _.dirPlus - Math.PI / 2),
                yi(_, be),
                be.restore());
            if (Yn(0, f, d),
            zn(1, f, d),
            Yn(1, f, d),
            Xn(f, d, 1),
            Yn(2, f, d),
            Yn(3, f, d),
            be.fillStyle = "#000",
            be.globalAlpha = .09,
            f <= 0 && be.fillRect(0, 0, -f, ce),
            o.mapScale - f <= oe) {
                var y = Math.max(0, -d);
                be.fillRect(o.mapScale - f, y, oe - (o.mapScale - f), ce - y)
            }
            if (d <= 0 && be.fillRect(-f, 0, oe + f, -d),
            o.mapScale - d <= ce) {
                var k = Math.max(0, -f)
                  , v = 0;
                o.mapScale - f <= oe && (v = oe - (o.mapScale - f)),
                be.fillRect(k, o.mapScale - d, oe - k - v, ce - (o.mapScale - d))
            }
            if(R){
                be.globalAlpha = 0.6;
                be.save();
                be.translate(-f, -d);
                Pathfinder.drawPath(be, "#0000FF", R, "#00FF00");
                Tach.drawWaypoints(be, R.skinRot);
                be.restore();
            }
            for (be.globalAlpha = 1,
            be.fillStyle = "rgba(0, 0, 70, 0.35)",
            be.fillRect(0, 0, oe, ce),
            be.strokeStyle = rt,
            a = 0; a < W.length + Y.length; ++a)
                if ((_ = W[a] || Y[a - W.length]).visible && (10 != _.skinIndex || _ == R || _.team && _.team == R.team)) {
                    var w = (_.team ? "[" + _.team + "] " : "") + (_.name || "");
                    if ("" != w) {
                        if (be.font = (_.nameScale || 30) + "px Hammersmith One",
                        be.fillStyle = "#fff",
                        be.textBaseline = "middle",
                        be.textAlign = "center",
                        be.lineWidth = _.nameScale ? 11 : 8,
                        be.lineJoin = "round",
                        be.strokeText(w, _.x - f, _.y - d - _.scale - o.nameY),
                        be.fillText(w, _.x - f, _.y - d - _.scale - o.nameY),
                        _.isLeader && Rn.crown.isLoaded) {
                            var b = o.crownIconScale;
                            k = _.x - f - b / 2 - be.measureText(w).width / 2 - o.crownPad,
                            be.drawImage(Rn.crown, k, _.y - d - _.scale - o.nameY - b / 2 - 5, b, b)
                        }
                        1 == _.iconIndex && Rn.skull.isLoaded && (b = o.crownIconScale,
                        k = _.x - f - b / 2 + be.measureText(w).width / 2 + o.crownPad,
                        be.drawImage(Rn.skull, k, _.y - d - _.scale - o.nameY - b / 2 - 5, b, b))
                    }
                    _.health > 0 && (o.healthBarWidth,
                    be.fillStyle = rt,
                    be.roundRect(_.x - f - o.healthBarWidth - o.healthBarPad, _.y - d + _.scale + o.nameY, 2 * o.healthBarWidth + 2 * o.healthBarPad, 17, 8),
                    be.fill(),
                    be.fillStyle = _ == R || _.team && _.team == R.team ? "#8ecc51" : "#cc5151",
                    be.roundRect(_.x - f - o.healthBarWidth, _.y - d + _.scale + o.nameY + o.healthBarPad, 2 * o.healthBarWidth * (_.health / _.maxHealth), 17 - 2 * o.healthBarPad, 7),
                    be.fill())
                }
            for (m.update(P, be, f, d),
            a = 0; a < W.length; ++a)
                if ((_ = W[a]).visible && _.chatCountdown > 0) {
                    _.chatCountdown -= P,
                    _.chatCountdown <= 0 && (_.chatCountdown = 0),
                    be.font = "32px Hammersmith One";
                    var x = be.measureText(_.chatMessage);
                    be.textBaseline = "middle",
                    be.textAlign = "center",
                    k = _.x - f,
                    y = _.y - _.scale - d - 90;
                    var S = x.width + 17;
                    be.fillStyle = "rgba(0,0,0,0.2)",
                    be.roundRect(k - S / 2, y - 23.5, S, 47, 6),
                    be.fill(),
                    be.fillStyle = "#fff",
                    be.fillText(_.chatMessage, k, y)
                }
            !function(e) {
                if (R && R.alive) {
                    Ke.clearRect(0, 0, Ne.width, Ne.height),
                    Ke.strokeStyle = "#fff",
                    Ke.lineWidth = 4;
                    for (var t = 0; t < qt.length; ++t)
                        (Vt = qt[t]).update(Ke, e);
                    if (Ke.globalAlpha = 1,
                    Ke.fillStyle = "#fff",
                    si(R.x / o.mapScale * Ne.width, R.y / o.mapScale * Ne.height, 7, Ke, !0),
                    Ke.fillStyle = "rgba(255,255,255,0.35)",
                    R.team && Et)
                        for (t = 0; t < Et.length; )
                            si(Et[t] / o.mapScale * Ne.width, Et[t + 1] / o.mapScale * Ne.height, 7, Ke, !0),
                            t += 2;
                    Tach.drawWaypointMap(Ke, Ne);
                    /*It && (Ke.fillStyle = "#fc5553",
                    Ke.font = "34px Hammersmith One",
                    Ke.textBaseline = "middle",
                    Ke.textAlign = "center",
                    Ke.fillText("x", It.x / o.mapScale * Ne.width, It.y / o.mapScale * Ne.height)),
                    Mt && (Ke.fillStyle = "#fff",
                    Ke.font = "34px Hammersmith One",
                    Ke.textBaseline = "middle",
                    Ke.textAlign = "center",
                    Ke.fillText("x", Mt.x / o.mapScale * Ne.width, Mt.y / o.mapScale * Ne.height))*/
                }
            }(P),
            -1 !== re.id && Fn(re.startX, re.startY, re.currentX, re.currentY),
            -1 !== se.id && Fn(se.startX, se.startY, se.currentX, se.currentY)
        }(),
        requestAnimFrame(e)
    }(),
    window.openLink = Oi,
    window.aJoinReq = Dt,
    window.follmoo = function() {
        H || (H = !0,
        I("moofoll", 1))
    }
    ,
    window.kickFromClan = Lt,
    window.sendJoin = Ft,
    window.leaveAlliance = Ht,
    window.createAlliance = zt,
    window.storeBuy = Kt,
    window.storeEquip = Jt,
    window.showItemInfo = Tt,
    window.selectSkinColor = function(e) {
        ae = e,
        en()
    }
    ,
    window.changeStoreIndex = function(e) {
        Xt != e && (Xt = e,
        Gt())
    }
    ,
    window.config = o
}
, function(e, t) {
    !function(e, t, n) {
        function i(e, t) {
            return typeof e === t
        }
        var r = []
          , s = []
          , a = {
            _version: "3.5.0",
            _config: {
                classPrefix: "",
                enableClasses: !0,
                enableJSClass: !0,
                usePrefixes: !0
            },
            _q: [],
            on: function(e, t) {
                var n = this;
                setTimeout((function() {
                    t(n[e])
                }
                ), 0)
            },
            addTest: function(e, t, n) {
                s.push({
                    name: e,
                    fn: t,
                    options: n
                })
            },
            addAsyncTest: function(e) {
                s.push({
                    name: null,
                    fn: e
                })
            }
        }
          , o = function() {};
        o.prototype = a,
        o = new o;
        var c = t.documentElement
          , l = "svg" === c.nodeName.toLowerCase();
        o.addTest("passiveeventlisteners", (function() {
            var t = !1;
            try {
                var n = Object.defineProperty({}, "passive", {
                    get: function() {
                        t = !0
                    }
                });
                e.addEventListener("test", null, n)
            } catch (e) {}
            return t
        }
        )),
        function() {
            var e, t, n, a, c, l;
            for (var h in s)
                if (s.hasOwnProperty(h)) {
                    if (e = [],
                    (t = s[h]).name && (e.push(t.name.toLowerCase()),
                    t.options && t.options.aliases && t.options.aliases.length))
                        for (n = 0; n < t.options.aliases.length; n++)
                            e.push(t.options.aliases[n].toLowerCase());
                    for (a = i(t.fn, "function") ? t.fn() : t.fn,
                    c = 0; c < e.length; c++)
                        1 === (l = e[c].split(".")).length ? o[l[0]] = a : (!o[l[0]] || o[l[0]]instanceof Boolean || (o[l[0]] = new Boolean(o[l[0]])),
                        o[l[0]][l[1]] = a),
                        r.push((a ? "" : "no-") + l.join("-"))
                }
        }(),
        function(e) {
            var t = c.className
              , n = o._config.classPrefix || "";
            if (l && (t = t.baseVal),
            o._config.enableJSClass) {
                var i = new RegExp("(^|\\s)" + n + "no-js(\\s|$)");
                t = t.replace(i, "$1" + n + "js$2")
            }
            o._config.enableClasses && (t += " " + n + e.join(" " + n),
            l ? c.className.baseVal = t : c.className = t)
        }(r),
        delete a.addTest,
        delete a.addAsyncTest;
        for (var h = 0; h < o._q.length; h++)
            o._q[h]();
        e.Modernizr = o
    }(window, document)
}
, function(e, t, n) {
    var i = n(24);
    n(19),
    e.exports = {
        socket: null,
        connected: !1,
        socketId: -1,
        connect: function(e, t, n) {
            if (!this.socket) {
                var r = this;
                try {
                    var s = !1
                      , a = e;
                    this.socket = new WebSocket(a),
                    this.socket.binaryType = "arraybuffer",
                    this.socket.onmessage = function(e) {
                        var t = new Uint8Array(e.data)
                          , s = i.decode(t)
                          , a = s[0];
                        t = s[1],
                        "io-init" == a ? r.socketId = t[0] : n[a].apply(void 0, t)
                    }
                    ,
                    this.socket.onopen = function() {
                        r.connected = !0,
                        t()
                    }
                    ,
                    this.socket.onclose = function(e) {
                        r.connected = !1,
                        4001 == e.code ? t("Invalid Connection") : s || t("disconnected")
                    }
                    ,
                    this.socket.onerror = function(e) {
                        this.socket && this.socket.readyState != WebSocket.OPEN && (s = !0,
                        console.error("Socket error", arguments),
                        t("Socket error"))
                    }
                } catch (e) {
                    console.warn("Socket connection error:", e),
                    t(e)
                }
            }
        },
        send: function(e) {
            var t = Array.prototype.slice.call(arguments, 1)
              , n = i.encode([e, t]);
            this.socket.send(n)
        },
        socketReady: function() {
            return this.socket && this.connected
        },
        close: function() {
            this.socket && this.socket.close()
        }
    }
}
, function(e, t, n) {
    t.encode = n(9).encode,
    t.decode = n(15).decode,
    t.Encoder = n(37).Encoder,
    t.Decoder = n(38).Decoder,
    t.createCodec = n(39).createCodec,
    t.codec = n(40).codec
}
, function(e, t, n) {
    (function(t) {
        function n(e) {
            return e && e.isBuffer && e
        }
        e.exports = n(void 0 !== t && t) || n(this.Buffer) || n("undefined" != typeof window && window.Buffer) || this.Buffer
    }
    ).call(this, n(11).Buffer)
}
, function(e, t, n) {
    "use strict";
    t.byteLength = function(e) {
        var t = l(e)
          , n = t[0]
          , i = t[1];
        return 3 * (n + i) / 4 - i
    }
    ,
    t.toByteArray = function(e) {
        var t, n, i = l(e), a = i[0], o = i[1], c = new s(function(e, t, n) {
            return 3 * (t + n) / 4 - n
        }(0, a, o)), h = 0, u = o > 0 ? a - 4 : a;
        for (n = 0; n < u; n += 4)
            t = r[e.charCodeAt(n)] << 18 | r[e.charCodeAt(n + 1)] << 12 | r[e.charCodeAt(n + 2)] << 6 | r[e.charCodeAt(n + 3)],
            c[h++] = t >> 16 & 255,
            c[h++] = t >> 8 & 255,
            c[h++] = 255 & t;
        return 2 === o && (t = r[e.charCodeAt(n)] << 2 | r[e.charCodeAt(n + 1)] >> 4,
        c[h++] = 255 & t),
        1 === o && (t = r[e.charCodeAt(n)] << 10 | r[e.charCodeAt(n + 1)] << 4 | r[e.charCodeAt(n + 2)] >> 2,
        c[h++] = t >> 8 & 255,
        c[h++] = 255 & t),
        c
    }
    ,
    t.fromByteArray = function(e) {
        for (var t, n = e.length, r = n % 3, s = [], a = 0, o = n - r; a < o; a += 16383)
            s.push(u(e, a, a + 16383 > o ? o : a + 16383));
        return 1 === r ? (t = e[n - 1],
        s.push(i[t >> 2] + i[t << 4 & 63] + "==")) : 2 === r && (t = (e[n - 2] << 8) + e[n - 1],
        s.push(i[t >> 10] + i[t >> 4 & 63] + i[t << 2 & 63] + "=")),
        s.join("")
    }
    ;
    for (var i = [], r = [], s = "undefined" != typeof Uint8Array ? Uint8Array : Array, a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", o = 0, c = a.length; o < c; ++o)
        i[o] = a[o],
        r[a.charCodeAt(o)] = o;
    function l(e) {
        var t = e.length;
        if (t % 4 > 0)
            throw new Error("Invalid string. Length must be a multiple of 4");
        var n = e.indexOf("=");
        return -1 === n && (n = t),
        [n, n === t ? 0 : 4 - n % 4]
    }
    function h(e) {
        return i[e >> 18 & 63] + i[e >> 12 & 63] + i[e >> 6 & 63] + i[63 & e]
    }
    function u(e, t, n) {
        for (var i, r = [], s = t; s < n; s += 3)
            i = (e[s] << 16 & 16711680) + (e[s + 1] << 8 & 65280) + (255 & e[s + 2]),
            r.push(h(i));
        return r.join("")
    }
    r["-".charCodeAt(0)] = 62,
    r["_".charCodeAt(0)] = 63
}
, function(e, t) {
    var n = {}.toString;
    e.exports = Array.isArray || function(e) {
        return "[object Array]" == n.call(e)
    }
}
, function(e, t, n) {
    var i = n(0);
    function r(e) {
        return new Array(e)
    }
    (t = e.exports = r(0)).alloc = r,
    t.concat = i.concat,
    t.from = function(e) {
        if (!i.isBuffer(e) && i.isView(e))
            e = i.Uint8Array.from(e);
        else if (i.isArrayBuffer(e))
            e = new Uint8Array(e);
        else {
            if ("string" == typeof e)
                return i.from.call(t, e);
            if ("number" == typeof e)
                throw new TypeError('"value" argument must not be a number')
        }
        return Array.prototype.slice.call(e)
    }
}
, function(e, t, n) {
    var i = n(0)
      , r = i.global;
    function s(e) {
        return new r(e)
    }
    (t = e.exports = i.hasBuffer ? s(0) : []).alloc = i.hasBuffer && r.alloc || s,
    t.concat = i.concat,
    t.from = function(e) {
        if (!i.isBuffer(e) && i.isView(e))
            e = i.Uint8Array.from(e);
        else if (i.isArrayBuffer(e))
            e = new Uint8Array(e);
        else {
            if ("string" == typeof e)
                return i.from.call(t, e);
            if ("number" == typeof e)
                throw new TypeError('"value" argument must not be a number')
        }
        return r.from && 1 !== r.from.length ? r.from(e) : new r(e)
    }
}
, function(e, t, n) {
    var i = n(0);
    function r(e) {
        return new Uint8Array(e)
    }
    (t = e.exports = i.hasArrayBuffer ? r(0) : []).alloc = r,
    t.concat = i.concat,
    t.from = function(e) {
        if (i.isView(e)) {
            var n = e.byteOffset
              , r = e.byteLength;
            (e = e.buffer).byteLength !== r && (e.slice ? e = e.slice(n, n + r) : (e = new Uint8Array(e)).byteLength !== r && (e = Array.prototype.slice.call(e, n, n + r)))
        } else {
            if ("string" == typeof e)
                return i.from.call(t, e);
            if ("number" == typeof e)
                throw new TypeError('"value" argument must not be a number')
        }
        return new Uint8Array(e)
    }
}
, function(e, t) {
    t.copy = function(e, t, n, i) {
        var r;
        n || (n = 0),
        i || 0 === i || (i = this.length),
        t || (t = 0);
        var s = i - n;
        if (e === this && n < t && t < i)
            for (r = s - 1; r >= 0; r--)
                e[r + t] = this[r + n];
        else
            for (r = 0; r < s; r++)
                e[r + t] = this[r + n];
        return s
    }
    ,
    t.toString = function(e, t, n) {
        var i = 0 | t;
        n || (n = this.length);
        for (var r = "", s = 0; i < n; )
            (s = this[i++]) < 128 ? r += String.fromCharCode(s) : (192 == (224 & s) ? s = (31 & s) << 6 | 63 & this[i++] : 224 == (240 & s) ? s = (15 & s) << 12 | (63 & this[i++]) << 6 | 63 & this[i++] : 240 == (248 & s) && (s = (7 & s) << 18 | (63 & this[i++]) << 12 | (63 & this[i++]) << 6 | 63 & this[i++]),
            s >= 65536 ? (s -= 65536,
            r += String.fromCharCode(55296 + (s >>> 10), 56320 + (1023 & s))) : r += String.fromCharCode(s));
        return r
    }
    ,
    t.write = function(e, t) {
        for (var n = t || (t |= 0), i = e.length, r = 0, s = 0; s < i; )
            (r = e.charCodeAt(s++)) < 128 ? this[n++] = r : r < 2048 ? (this[n++] = 192 | r >>> 6,
            this[n++] = 128 | 63 & r) : r < 55296 || r > 57343 ? (this[n++] = 224 | r >>> 12,
            this[n++] = 128 | r >>> 6 & 63,
            this[n++] = 128 | 63 & r) : (r = 65536 + (r - 55296 << 10 | e.charCodeAt(s++) - 56320),
            this[n++] = 240 | r >>> 18,
            this[n++] = 128 | r >>> 12 & 63,
            this[n++] = 128 | r >>> 6 & 63,
            this[n++] = 128 | 63 & r);
        return n - t
    }
}
, function(e, t, n) {
    t.setExtPackers = function(e) {
        e.addExtPacker(14, Error, [u, c]),
        e.addExtPacker(1, EvalError, [u, c]),
        e.addExtPacker(2, RangeError, [u, c]),
        e.addExtPacker(3, ReferenceError, [u, c]),
        e.addExtPacker(4, SyntaxError, [u, c]),
        e.addExtPacker(5, TypeError, [u, c]),
        e.addExtPacker(6, URIError, [u, c]),
        e.addExtPacker(10, RegExp, [h, c]),
        e.addExtPacker(11, Boolean, [l, c]),
        e.addExtPacker(12, String, [l, c]),
        e.addExtPacker(13, Date, [Number, c]),
        e.addExtPacker(15, Number, [l, c]),
        "undefined" != typeof Uint8Array && (e.addExtPacker(17, Int8Array, a),
        e.addExtPacker(18, Uint8Array, a),
        e.addExtPacker(19, Int16Array, a),
        e.addExtPacker(20, Uint16Array, a),
        e.addExtPacker(21, Int32Array, a),
        e.addExtPacker(22, Uint32Array, a),
        e.addExtPacker(23, Float32Array, a),
        "undefined" != typeof Float64Array && e.addExtPacker(24, Float64Array, a),
        "undefined" != typeof Uint8ClampedArray && e.addExtPacker(25, Uint8ClampedArray, a),
        e.addExtPacker(26, ArrayBuffer, a),
        e.addExtPacker(29, DataView, a)),
        r.hasBuffer && e.addExtPacker(27, s, r.from)
    }
    ;
    var i, r = n(0), s = r.global, a = r.Uint8Array.from, o = {
        name: 1,
        message: 1,
        stack: 1,
        columnNumber: 1,
        fileName: 1,
        lineNumber: 1
    };
    function c(e) {
        return i || (i = n(9).encode),
        i(e)
    }
    function l(e) {
        return e.valueOf()
    }
    function h(e) {
        (e = RegExp.prototype.toString.call(e).split("/")).shift();
        var t = [e.pop()];
        return t.unshift(e.join("/")),
        t
    }
    function u(e) {
        var t = {};
        for (var n in o)
            t[n] = e[n];
        return t
    }
}
, function(e, t, n) {
    var i = n(5)
      , r = n(7)
      , s = r.Uint64BE
      , a = r.Int64BE
      , o = n(0)
      , c = n(6)
      , l = n(34)
      , h = n(13).uint8
      , u = n(3).ExtBuffer
      , f = "undefined" != typeof Uint8Array
      , d = "undefined" != typeof Map
      , p = [];
    p[1] = 212,
    p[2] = 213,
    p[4] = 214,
    p[8] = 215,
    p[16] = 216,
    t.getWriteType = function(e) {
        var t = l.getWriteToken(e)
          , n = e && e.useraw
          , r = f && e && e.binarraybuffer
          , g = r ? o.isArrayBuffer : o.isBuffer
          , m = r ? function(e, t) {
            w(e, new Uint8Array(t))
        }
        : w
          , y = d && e && e.usemap ? function(e, n) {
            if (!(n instanceof Map))
                return b(e, n);
            var i = n.size;
            t[i < 16 ? 128 + i : i <= 65535 ? 222 : 223](e, i);
            var r = e.codec.encode;
            n.forEach((function(t, n, i) {
                r(e, n),
                r(e, t)
            }
            ))
        }
        : b;
        return {
            boolean: function(e, n) {
                t[n ? 195 : 194](e, n)
            },
            function: v,
            number: function(e, n) {
                var i = 0 | n;
                n === i ? t[-32 <= i && i <= 127 ? 255 & i : 0 <= i ? i <= 255 ? 204 : i <= 65535 ? 205 : 206 : -128 <= i ? 208 : -32768 <= i ? 209 : 210](e, i) : t[203](e, n)
            },
            object: n ? function(e, n) {
                if (g(n))
                    return function(e, n) {
                        var i = n.length;
                        t[i < 32 ? 160 + i : i <= 65535 ? 218 : 219](e, i),
                        e.send(n)
                    }(e, n);
                k(e, n)
            }
            : k,
            string: function(e) {
                return function(n, i) {
                    var r = i.length
                      , s = 5 + 3 * r;
                    n.offset = n.reserve(s);
                    var a = n.buffer
                      , o = e(r)
                      , l = n.offset + o;
                    r = c.write.call(a, i, l);
                    var h = e(r);
                    if (o !== h) {
                        var u = l + h - o
                          , f = l + r;
                        c.copy.call(a, a, u, l, f)
                    }
                    t[1 === h ? 160 + r : h <= 3 ? 215 + h : 219](n, r),
                    n.offset += r
                }
            }(n ? function(e) {
                return e < 32 ? 1 : e <= 65535 ? 3 : 5
            }
            : function(e) {
                return e < 32 ? 1 : e <= 255 ? 2 : e <= 65535 ? 3 : 5
            }
            ),
            symbol: v,
            undefined: v
        };
        function k(e, n) {
            if (null === n)
                return v(e, n);
            if (g(n))
                return m(e, n);
            if (i(n))
                return function(e, n) {
                    var i = n.length;
                    t[i < 16 ? 144 + i : i <= 65535 ? 220 : 221](e, i);
                    for (var r = e.codec.encode, s = 0; s < i; s++)
                        r(e, n[s])
                }(e, n);
            if (s.isUint64BE(n))
                return function(e, n) {
                    t[207](e, n.toArray())
                }(e, n);
            if (a.isInt64BE(n))
                return function(e, n) {
                    t[211](e, n.toArray())
                }(e, n);
            var r = e.codec.getExtPacker(n);
            if (r && (n = r(n)),
            n instanceof u)
                return function(e, n) {
                    var i = n.buffer
                      , r = i.length
                      , s = p[r] || (r < 255 ? 199 : r <= 65535 ? 200 : 201);
                    t[s](e, r),
                    h[n.type](e),
                    e.send(i)
                }(e, n);
            y(e, n)
        }
        function v(e, n) {
            t[192](e, n)
        }
        function w(e, n) {
            var i = n.length;
            t[i < 255 ? 196 : i <= 65535 ? 197 : 198](e, i),
            e.send(n)
        }
        function b(e, n) {
            var i = Object.keys(n)
              , r = i.length;
            t[r < 16 ? 128 + r : r <= 65535 ? 222 : 223](e, r);
            var s = e.codec.encode;
            i.forEach((function(t) {
                s(e, t),
                s(e, n[t])
            }
            ))
        }
    }
}
, function(e, t, n) {
    var i = n(4)
      , r = n(7)
      , s = r.Uint64BE
      , a = r.Int64BE
      , o = n(13).uint8
      , c = n(0)
      , l = c.global
      , h = c.hasBuffer && "TYPED_ARRAY_SUPPORT"in l && !l.TYPED_ARRAY_SUPPORT
      , u = c.hasBuffer && l.prototype || {};
    function f() {
        var e = o.slice();
        return e[196] = d(196),
        e[197] = p(197),
        e[198] = g(198),
        e[199] = d(199),
        e[200] = p(200),
        e[201] = g(201),
        e[202] = m(202, 4, u.writeFloatBE || v, !0),
        e[203] = m(203, 8, u.writeDoubleBE || w, !0),
        e[204] = d(204),
        e[205] = p(205),
        e[206] = g(206),
        e[207] = m(207, 8, y),
        e[208] = d(208),
        e[209] = p(209),
        e[210] = g(210),
        e[211] = m(211, 8, k),
        e[217] = d(217),
        e[218] = p(218),
        e[219] = g(219),
        e[220] = p(220),
        e[221] = g(221),
        e[222] = p(222),
        e[223] = g(223),
        e
    }
    function d(e) {
        return function(t, n) {
            var i = t.reserve(2)
              , r = t.buffer;
            r[i++] = e,
            r[i] = n
        }
    }
    function p(e) {
        return function(t, n) {
            var i = t.reserve(3)
              , r = t.buffer;
            r[i++] = e,
            r[i++] = n >>> 8,
            r[i] = n
        }
    }
    function g(e) {
        return function(t, n) {
            var i = t.reserve(5)
              , r = t.buffer;
            r[i++] = e,
            r[i++] = n >>> 24,
            r[i++] = n >>> 16,
            r[i++] = n >>> 8,
            r[i] = n
        }
    }
    function m(e, t, n, i) {
        return function(r, s) {
            var a = r.reserve(t + 1);
            r.buffer[a++] = e,
            n.call(r.buffer, s, a, i)
        }
    }
    function y(e, t) {
        new s(this,t,e)
    }
    function k(e, t) {
        new a(this,t,e)
    }
    function v(e, t) {
        i.write(this, e, t, !1, 23, 4)
    }
    function w(e, t) {
        i.write(this, e, t, !1, 52, 8)
    }
    t.getWriteToken = function(e) {
        return e && e.uint8array ? function() {
            var e = f();
            return e[202] = m(202, 4, v),
            e[203] = m(203, 8, w),
            e
        }() : h || c.hasBuffer && e && e.safe ? function() {
            var e = o.slice();
            return e[196] = m(196, 1, l.prototype.writeUInt8),
            e[197] = m(197, 2, l.prototype.writeUInt16BE),
            e[198] = m(198, 4, l.prototype.writeUInt32BE),
            e[199] = m(199, 1, l.prototype.writeUInt8),
            e[200] = m(200, 2, l.prototype.writeUInt16BE),
            e[201] = m(201, 4, l.prototype.writeUInt32BE),
            e[202] = m(202, 4, l.prototype.writeFloatBE),
            e[203] = m(203, 8, l.prototype.writeDoubleBE),
            e[204] = m(204, 1, l.prototype.writeUInt8),
            e[205] = m(205, 2, l.prototype.writeUInt16BE),
            e[206] = m(206, 4, l.prototype.writeUInt32BE),
            e[207] = m(207, 8, y),
            e[208] = m(208, 1, l.prototype.writeInt8),
            e[209] = m(209, 2, l.prototype.writeInt16BE),
            e[210] = m(210, 4, l.prototype.writeInt32BE),
            e[211] = m(211, 8, k),
            e[217] = m(217, 1, l.prototype.writeUInt8),
            e[218] = m(218, 2, l.prototype.writeUInt16BE),
            e[219] = m(219, 4, l.prototype.writeUInt32BE),
            e[220] = m(220, 2, l.prototype.writeUInt16BE),
            e[221] = m(221, 4, l.prototype.writeUInt32BE),
            e[222] = m(222, 2, l.prototype.writeUInt16BE),
            e[223] = m(223, 4, l.prototype.writeUInt32BE),
            e
        }() : f()
    }
}
, function(e, t, n) {
    t.setExtUnpackers = function(e) {
        e.addExtUnpacker(14, [o, l(Error)]),
        e.addExtUnpacker(1, [o, l(EvalError)]),
        e.addExtUnpacker(2, [o, l(RangeError)]),
        e.addExtUnpacker(3, [o, l(ReferenceError)]),
        e.addExtUnpacker(4, [o, l(SyntaxError)]),
        e.addExtUnpacker(5, [o, l(TypeError)]),
        e.addExtUnpacker(6, [o, l(URIError)]),
        e.addExtUnpacker(10, [o, c]),
        e.addExtUnpacker(11, [o, h(Boolean)]),
        e.addExtUnpacker(12, [o, h(String)]),
        e.addExtUnpacker(13, [o, h(Date)]),
        e.addExtUnpacker(15, [o, h(Number)]),
        "undefined" != typeof Uint8Array && (e.addExtUnpacker(17, h(Int8Array)),
        e.addExtUnpacker(18, h(Uint8Array)),
        e.addExtUnpacker(19, [u, h(Int16Array)]),
        e.addExtUnpacker(20, [u, h(Uint16Array)]),
        e.addExtUnpacker(21, [u, h(Int32Array)]),
        e.addExtUnpacker(22, [u, h(Uint32Array)]),
        e.addExtUnpacker(23, [u, h(Float32Array)]),
        "undefined" != typeof Float64Array && e.addExtUnpacker(24, [u, h(Float64Array)]),
        "undefined" != typeof Uint8ClampedArray && e.addExtUnpacker(25, h(Uint8ClampedArray)),
        e.addExtUnpacker(26, u),
        e.addExtUnpacker(29, [u, h(DataView)])),
        r.hasBuffer && e.addExtUnpacker(27, h(s))
    }
    ;
    var i, r = n(0), s = r.global, a = {
        name: 1,
        message: 1,
        stack: 1,
        columnNumber: 1,
        fileName: 1,
        lineNumber: 1
    };
    function o(e) {
        return i || (i = n(15).decode),
        i(e)
    }
    function c(e) {
        return RegExp.apply(null, e)
    }
    function l(e) {
        return function(t) {
            var n = new e;
            for (var i in a)
                n[i] = t[i];
            return n
        }
    }
    function h(e) {
        return function(t) {
            return new e(t)
        }
    }
    function u(e) {
        return new Uint8Array(e).buffer
    }
}
, function(e, t, n) {
    var i = n(17);
    function r(e) {
        var t, n = new Array(256);
        for (t = 0; t <= 127; t++)
            n[t] = s(t);
        for (t = 128; t <= 143; t++)
            n[t] = o(t - 128, e.map);
        for (t = 144; t <= 159; t++)
            n[t] = o(t - 144, e.array);
        for (t = 160; t <= 191; t++)
            n[t] = o(t - 160, e.str);
        for (n[192] = s(null),
        n[193] = null,
        n[194] = s(!1),
        n[195] = s(!0),
        n[196] = a(e.uint8, e.bin),
        n[197] = a(e.uint16, e.bin),
        n[198] = a(e.uint32, e.bin),
        n[199] = a(e.uint8, e.ext),
        n[200] = a(e.uint16, e.ext),
        n[201] = a(e.uint32, e.ext),
        n[202] = e.float32,
        n[203] = e.float64,
        n[204] = e.uint8,
        n[205] = e.uint16,
        n[206] = e.uint32,
        n[207] = e.uint64,
        n[208] = e.int8,
        n[209] = e.int16,
        n[210] = e.int32,
        n[211] = e.int64,
        n[212] = o(1, e.ext),
        n[213] = o(2, e.ext),
        n[214] = o(4, e.ext),
        n[215] = o(8, e.ext),
        n[216] = o(16, e.ext),
        n[217] = a(e.uint8, e.str),
        n[218] = a(e.uint16, e.str),
        n[219] = a(e.uint32, e.str),
        n[220] = a(e.uint16, e.array),
        n[221] = a(e.uint32, e.array),
        n[222] = a(e.uint16, e.map),
        n[223] = a(e.uint32, e.map),
        t = 224; t <= 255; t++)
            n[t] = s(t - 256);
        return n
    }
    function s(e) {
        return function() {
            return e
        }
    }
    function a(e, t) {
        return function(n) {
            var i = e(n);
            return t(n, i)
        }
    }
    function o(e, t) {
        return function(n) {
            return t(n, e)
        }
    }
    t.getReadToken = function(e) {
        var t = i.getReadFormat(e);
        return e && e.useraw ? function(e) {
            var t, n = r(e).slice();
            for (n[217] = n[196],
            n[218] = n[197],
            n[219] = n[198],
            t = 160; t <= 191; t++)
                n[t] = o(t - 160, e.bin);
            return n
        }(t) : r(t)
    }
}
, function(e, t, n) {
    t.Encoder = s;
    var i = n(18)
      , r = n(10).EncodeBuffer;
    function s(e) {
        if (!(this instanceof s))
            return new s(e);
        r.call(this, e)
    }
    s.prototype = new r,
    i.mixin(s.prototype),
    s.prototype.encode = function(e) {
        this.write(e),
        this.emit("data", this.read())
    }
    ,
    s.prototype.end = function(e) {
        arguments.length && this.encode(e),
        this.flush(),
        this.emit("end")
    }
}
, function(e, t, n) {
    t.Decoder = s;
    var i = n(18)
      , r = n(16).DecodeBuffer;
    function s(e) {
        if (!(this instanceof s))
            return new s(e);
        r.call(this, e)
    }
    s.prototype = new r,
    i.mixin(s.prototype),
    s.prototype.decode = function(e) {
        arguments.length && this.write(e),
        this.flush()
    }
    ,
    s.prototype.push = function(e) {
        this.emit("data", e)
    }
    ,
    s.prototype.end = function(e) {
        this.decode(e),
        this.emit("end")
    }
}
, function(e, t, n) {
    n(8),
    n(2),
    t.createCodec = n(1).createCodec
}
, function(e, t, n) {
    n(8),
    n(2),
    t.codec = {
        preset: n(1).preset
    }
}
, function(e, t) {
    var n, i, r = e.exports = {};
    function s() {
        throw new Error("setTimeout has not been defined")
    }
    function a() {
        throw new Error("clearTimeout has not been defined")
    }
    function o(e) {
        if (n === setTimeout)
            return setTimeout(e, 0);
        if ((n === s || !n) && setTimeout)
            return n = setTimeout,
            setTimeout(e, 0);
        try {
            return n(e, 0)
        } catch (t) {
            try {
                return n.call(null, e, 0)
            } catch (t) {
                return n.call(this, e, 0)
            }
        }
    }
    !function() {
        try {
            n = "function" == typeof setTimeout ? setTimeout : s
        } catch (e) {
            n = s
        }
        try {
            i = "function" == typeof clearTimeout ? clearTimeout : a
        } catch (e) {
            i = a
        }
    }();
    var c, l = [], h = !1, u = -1;
    function f() {
        h && c && (h = !1,
        c.length ? l = c.concat(l) : u = -1,
        l.length && d())
    }
    function d() {
        if (!h) {
            var e = o(f);
            h = !0;
            for (var t = l.length; t; ) {
                for (c = l,
                l = []; ++u < t; )
                    c && c[u].run();
                u = -1,
                t = l.length
            }
            c = null,
            h = !1,
            function(e) {
                if (i === clearTimeout)
                    return clearTimeout(e);
                if ((i === a || !i) && clearTimeout)
                    return i = clearTimeout,
                    clearTimeout(e);
                try {
                    i(e)
                } catch (t) {
                    try {
                        return i.call(null, e)
                    } catch (t) {
                        return i.call(this, e)
                    }
                }
            }(e)
        }
    }
    function p(e, t) {
        this.fun = e,
        this.array = t
    }
    function g() {}
    r.nextTick = function(e) {
        var t = new Array(arguments.length - 1);
        if (arguments.length > 1)
            for (var n = 1; n < arguments.length; n++)
                t[n - 1] = arguments[n];
        l.push(new p(e,t)),
        1 !== l.length || h || o(d)
    }
    ,
    p.prototype.run = function() {
        this.fun.apply(null, this.array)
    }
    ,
    r.title = "browser",
    r.browser = !0,
    r.env = {},
    r.argv = [],
    r.version = "",
    r.versions = {},
    r.on = g,
    r.addListener = g,
    r.once = g,
    r.off = g,
    r.removeListener = g,
    r.removeAllListeners = g,
    r.emit = g,
    r.prependListener = g,
    r.prependOnceListener = g,
    r.listeners = function(e) {
        return []
    }
    ,
    r.binding = function(e) {
        throw new Error("process.binding is not supported")
    }
    ,
    r.cwd = function() {
        return "/"
    }
    ,
    r.chdir = function(e) {
        throw new Error("process.chdir is not supported")
    }
    ,
    r.umask = function() {
        return 0
    }
}
, function(e, t) {
    var n = Math.abs
      , i = (Math.cos,
    Math.sin,
    Math.pow,
    Math.sqrt)
      , r = (n = Math.abs,
    Math.atan2)
      , s = Math.PI;
    e.exports.randInt = function(e, t) {
        return Math.floor(Math.random() * (t - e + 1)) + e
    }
    ,
    e.exports.randFloat = function(e, t) {
        return Math.random() * (t - e + 1) + e
    }
    ,
    e.exports.lerp = function(e, t, n) {
        return e + (t - e) * n
    }
    ,
    e.exports.decel = function(e, t) {
        return e > 0 ? e = Math.max(0, e - t) : e < 0 && (e = Math.min(0, e + t)),
        e
    }
    ,
    e.exports.getDistance = function(e, t, n, r) {
        return i((n -= e) * n + (r -= t) * r)
    }
    ,
    e.exports.getDirection = function(e, t, n, i) {
        return r(t - i, e - n)
    }
    ,
    e.exports.getAngleDist = function(e, t) {
        var i = n(t - e) % (2 * s);
        return i > s ? 2 * s - i : i
    }
    ,
    e.exports.isNumber = function(e) {
        return "number" == typeof e && !isNaN(e) && isFinite(e)
    }
    ,
    e.exports.isString = function(e) {
        return e && "string" == typeof e
    }
    ,
    e.exports.kFormat = function(e) {
        return e > 999 ? (e / 1e3).toFixed(1) + "k" : e
    }
    ,
    e.exports.capitalizeFirst = function(e) {
        return e.charAt(0).toUpperCase() + e.slice(1)
    }
    ,
    e.exports.fixTo = function(e, t) {
        return parseFloat(e.toFixed(t))
    }
    ,
    e.exports.sortByPoints = function(e, t) {
        return parseFloat(t.points) - parseFloat(e.points)
    }
    ,
    e.exports.lineInRect = function(e, t, n, i, r, s, a, o) {
        var c = r
          , l = a;
        if (r > a && (c = a,
        l = r),
        l > n && (l = n),
        c < e && (c = e),
        c > l)
            return !1;
        var h = s
          , u = o
          , f = a - r;
        if (Math.abs(f) > 1e-7) {
            var d = (o - s) / f
              , p = s - d * r;
            h = d * c + p,
            u = d * l + p
        }
        if (h > u) {
            var g = u;
            u = h,
            h = g
        }
        return u > i && (u = i),
        h < t && (h = t),
        !(h > u)
    }
    ,
    e.exports.containsPoint = function(e, t, n) {
        var i = e.getBoundingClientRect()
          , r = i.left + window.scrollX
          , s = i.top + window.scrollY
          , a = i.width
          , o = i.height;
        return t > r && t < r + a && n > s && n < s + o
    }
    ,
    e.exports.mousifyTouchEvent = function(e) {
        var t = e.changedTouches[0];
        e.screenX = t.screenX,
        e.screenY = t.screenY,
        e.clientX = t.clientX,
        e.clientY = t.clientY,
        e.pageX = t.pageX,
        e.pageY = t.pageY
    }
    ,
    e.exports.hookTouchEvents = function(t, n) {
        var i = !n
          , r = !1;
        function s(n) {
            e.exports.mousifyTouchEvent(n),
            window.setUsingTouch(!0),
            i && (n.preventDefault(),
            n.stopPropagation()),
            r && (t.onclick && t.onclick(n),
            t.onmouseout && t.onmouseout(n),
            r = !1)
        }
        t.addEventListener("touchstart", e.exports.checkTrusted((function(n) {
            e.exports.mousifyTouchEvent(n),
            window.setUsingTouch(!0),
            i && (n.preventDefault(),
            n.stopPropagation()),
            t.onmouseover && t.onmouseover(n),
            r = !0
        }
        )), !1),
        t.addEventListener("touchmove", e.exports.checkTrusted((function(n) {
            e.exports.mousifyTouchEvent(n),
            window.setUsingTouch(!0),
            i && (n.preventDefault(),
            n.stopPropagation()),
            e.exports.containsPoint(t, n.pageX, n.pageY) ? r || (t.onmouseover && t.onmouseover(n),
            r = !0) : r && (t.onmouseout && t.onmouseout(n),
            r = !1)
        }
        )), !1),
        t.addEventListener("touchend", e.exports.checkTrusted(s), !1),
        t.addEventListener("touchcancel", e.exports.checkTrusted(s), !1),
        t.addEventListener("touchleave", e.exports.checkTrusted(s), !1)
    }
    ,
    e.exports.removeAllChildren = function(e) {
        for (; e.hasChildNodes(); )
            e.removeChild(e.lastChild)
    }
    ,
    e.exports.generateElement = function(t) {
        var n = document.createElement(t.tag || "div");
        function i(e, i) {
            t[e] && (n[i] = t[e])
        }
        for (var r in i("text", "textContent"),
        i("html", "innerHTML"),
        i("class", "className"),
        t) {
            switch (r) {
            case "tag":
            case "text":
            case "html":
            case "class":
            case "style":
            case "hookTouch":
            case "parent":
            case "children":
                continue
            }
            n[r] = t[r]
        }
        if (n.onclick && (n.onclick = e.exports.checkTrusted(n.onclick)),
        n.onmouseover && (n.onmouseover = e.exports.checkTrusted(n.onmouseover)),
        n.onmouseout && (n.onmouseout = e.exports.checkTrusted(n.onmouseout)),
        t.style && (n.style.cssText = t.style),
        t.hookTouch && e.exports.hookTouchEvents(n),
        t.parent && t.parent.appendChild(n),
        t.children)
            for (var s = 0; s < t.children.length; s++)
                n.appendChild(t.children[s]);
        return n
    }
    ,
    e.exports.eventIsTrusted = function(e) {
        return !e || "boolean" != typeof e.isTrusted || e.isTrusted
    }
    ,
    e.exports.checkTrusted = function(t) {
        return function(n) {
            n && n instanceof Event && e.exports.eventIsTrusted(n) && t(n)
        }
    }
    ,
    e.exports.randomString = function(e) {
        for (var t = "", n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", i = 0; i < e; i++)
            t += n.charAt(Math.floor(Math.random() * n.length));
        return t
    }
    ,
    e.exports.countInArray = function(e, t) {
        for (var n = 0, i = 0; i < e.length; i++)
            e[i] === t && n++;
        return n
    }
}
, function(e, t) {
    e.exports.AnimText = function() {
        this.init = function(e, t, n, i, r, s, a) {
            this.x = e,
            this.y = t,
            this.color = a,
            this.scale = n,
            this.startScale = this.scale,
            this.maxScale = 1.5 * n,
            this.scaleSpeed = .7,
            this.speed = i,
            this.life = r,
            this.text = s
        }
        ,
        this.update = function(e) {
            this.life && (this.life -= e,
            this.y -= this.speed * e,
            this.scale += this.scaleSpeed * e,
            this.scale >= this.maxScale ? (this.scale = this.maxScale,
            this.scaleSpeed *= -1) : this.scale <= this.startScale && (this.scale = this.startScale,
            this.scaleSpeed = 0),
            this.life <= 0 && (this.life = 0))
        }
        ,
        this.render = function(e, t, n) {
            e.fillStyle = this.color,
            e.font = this.scale + "px Hammersmith One",
            e.fillText(this.text, this.x - t, this.y - n)
        }
    }
    ,
    e.exports.TextManager = function() {
        this.texts = [],
        this.update = function(e, t, n, i) {
            t.textBaseline = "middle",
            t.textAlign = "center";
            for (var r = 0; r < this.texts.length; ++r)
                this.texts[r].life && (this.texts[r].update(e),
                this.texts[r].render(t, n, i))
        }
        ,
        this.showText = function(t, n, i, r, s, a, o) {
            for (var c, l = 0; l < this.texts.length; ++l)
                if (!this.texts[l].life) {
                    c = this.texts[l];
                    break
                }
            c || (c = new e.exports.AnimText,
            this.texts.push(c)),
            c.init(t, n, i, r, s, a, o)
        }
    }
}
, function(e, t) {
    e.exports = function(e) {
        this.sid = e,
        this.init = function(e, t, n, i, r, s, a) {
            s = s || {},
            this.sentTo = {},
            this.gridLocations = [],
            this.active = !0,
            this.doUpdate = s.doUpdate,
            this.x = e,
            this.y = t,
            this.dir = n,
            this.xWiggle = 0,
            this.yWiggle = 0,
            this.scale = i,
            this.type = r,
            this.id = s.id,
            this.owner = a,
            this.name = s.name,
            this.isItem = null != this.id,
            this.group = s.group,
            this.health = s.health,
            this.layer = 2,
            null != this.group ? this.layer = this.group.layer : 0 == this.type ? this.layer = 3 : 2 == this.type ? this.layer = 0 : 4 == this.type && (this.layer = -1),
            this.colDiv = s.colDiv || 1,
            this.blocker = s.blocker,
            this.ignoreCollision = s.ignoreCollision,
            this.dontGather = s.dontGather,
            this.hideFromEnemy = s.hideFromEnemy,
            this.friction = s.friction,
            this.projDmg = s.projDmg,
            this.dmg = s.dmg,
            this.pDmg = s.pDmg,
            this.pps = s.pps,
            this.zIndex = s.zIndex || 0,
            this.turnSpeed = s.turnSpeed,
            this.req = s.req,
            this.trap = s.trap,
            this.healCol = s.healCol,
            this.teleport = s.teleport,
            this.boostSpeed = s.boostSpeed,
            this.projectile = s.projectile,
            this.shootRange = s.shootRange,
            this.shootRate = s.shootRate,
            this.shootCount = this.shootRate,
            this.spawnPoint = s.spawnPoint
        }
        ,
        this.changeHealth = function(e, t) {
            return this.health += e,
            this.health <= 0
        }
        ,
        this.getScale = function(e, t) {
            return e = e || 1,
            this.scale * (this.isItem || 2 == this.type || 3 == this.type || 4 == this.type ? 1 : .6 * e) * (t ? 1 : this.colDiv)
        }
        ,
        this.visibleToPlayer = function(e) {
            return !this.hideFromEnemy || this.owner && (this.owner == e || this.owner.team && e.team == this.owner.team)
        }
        ,
        this.update = function(e) {
            this.active && (this.xWiggle && (this.xWiggle *= Math.pow(.99, e)),
            this.yWiggle && (this.yWiggle *= Math.pow(.99, e)),
            this.turnSpeed && (this.dir += this.turnSpeed * e))
        }
    }
}
, function(e, t) {
    e.exports.groups = [{
        id: 0,
        name: "food",
        layer: 0
    }, {
        id: 1,
        name: "walls",
        place: !0,
        limit: 30,
        layer: 0
    }, {
        id: 2,
        name: "spikes",
        place: !0,
        limit: 15,
        layer: 0
    }, {
        id: 3,
        name: "mill",
        place: !0,
        limit: 7,
        layer: 1
    }, {
        id: 4,
        name: "mine",
        place: !0,
        limit: 1,
        layer: 0
    }, {
        id: 5,
        name: "trap",
        place: !0,
        limit: 6,
        layer: -1
    }, {
        id: 6,
        name: "booster",
        place: !0,
        limit: 12,
        layer: -1
    }, {
        id: 7,
        name: "turret",
        place: !0,
        limit: 2,
        layer: 1
    }, {
        id: 8,
        name: "watchtower",
        place: !0,
        limit: 12,
        layer: 1
    }, {
        id: 9,
        name: "buff",
        place: !0,
        limit: 4,
        layer: -1
    }, {
        id: 10,
        name: "spawn",
        place: !0,
        limit: 1,
        layer: -1
    }, {
        id: 11,
        name: "sapling",
        place: !0,
        limit: 2,
        layer: 0
    }, {
        id: 12,
        name: "blocker",
        place: !0,
        limit: 3,
        layer: -1
    }, {
        id: 13,
        name: "teleporter",
        place: !0,
        limit: 2,
        layer: -1
    }],
    t.projectiles = [{
        indx: 0,
        layer: 0,
        src: "arrow_1",
        dmg: 25,
        speed: 1.6,
        scale: 103,
        range: 1e3
    }, {
        indx: 1,
        layer: 1,
        dmg: 25,
        scale: 20
    }, {
        indx: 0,
        layer: 0,
        src: "arrow_1",
        dmg: 35,
        speed: 2.5,
        scale: 103,
        range: 1200
    }, {
        indx: 0,
        layer: 0,
        src: "arrow_1",
        dmg: 30,
        speed: 2,
        scale: 103,
        range: 1200
    }, {
        indx: 1,
        layer: 1,
        dmg: 16,
        scale: 20
    }, {
        indx: 0,
        layer: 0,
        src: "bullet_1",
        dmg: 50,
        speed: 3.6,
        scale: 160,
        range: 1400
    }],
    t.weapons = [{
        id: 0,
        type: 0,
        name: "tool hammer",
        desc: "tool for gathering all resources",
        src: "hammer_1",
        length: 140,
        width: 140,
        xOff: -3,
        yOff: 18,
        dmg: 25,
        range: 65,
        gather: 1,
        speed: 300
    }, {
        id: 1,
        type: 0,
        age: 2,
        name: "hand axe",
        desc: "gathers resources at a higher rate",
        src: "axe_1",
        length: 140,
        width: 140,
        xOff: 3,
        yOff: 24,
        dmg: 30,
        spdMult: 1,
        range: 70,
        gather: 2,
        speed: 400
    }, {
        id: 2,
        type: 0,
        age: 8,
        pre: 1,
        name: "great axe",
        desc: "deal more damage and gather more resources",
        src: "great_axe_1",
        length: 140,
        width: 140,
        xOff: -8,
        yOff: 25,
        dmg: 35,
        spdMult: 1,
        range: 75,
        gather: 4,
        speed: 400
    }, {
        id: 3,
        type: 0,
        age: 2,
        name: "short sword",
        desc: "increased attack power but slower move speed",
        src: "sword_1",
        iPad: 1.3,
        length: 130,
        width: 210,
        xOff: -8,
        yOff: 46,
        dmg: 35,
        spdMult: .85,
        range: 110,
        gather: 1,
        speed: 300
    }, {
        id: 4,
        type: 0,
        age: 8,
        pre: 3,
        name: "katana",
        desc: "greater range and damage",
        src: "samurai_1",
        iPad: 1.3,
        length: 130,
        width: 210,
        xOff: -8,
        yOff: 59,
        dmg: 40,
        spdMult: .8,
        range: 118,
        gather: 1,
        speed: 300
    }, {
        id: 5,
        type: 0,
        age: 2,
        name: "polearm",
        desc: "long range melee weapon",
        src: "spear_1",
        iPad: 1.3,
        length: 130,
        width: 210,
        xOff: -8,
        yOff: 53,
        dmg: 45,
        knock: .2,
        spdMult: .82,
        range: 142,
        gather: 1,
        speed: 700
    }, {
        id: 6,
        type: 0,
        age: 2,
        name: "bat",
        desc: "fast long range melee weapon",
        src: "bat_1",
        iPad: 1.3,
        length: 110,
        width: 180,
        xOff: -8,
        yOff: 53,
        dmg: 20,
        knock: .7,
        range: 110,
        gather: 1,
        speed: 300
    }, {
        id: 7,
        type: 0,
        age: 2,
        name: "daggers",
        desc: "really fast short range weapon",
        src: "dagger_1",
        iPad: .8,
        length: 110,
        width: 110,
        xOff: 18,
        yOff: 0,
        dmg: 20,
        knock: .1,
        range: 65,
        gather: 1,
        hitSlow: .1,
        spdMult: 1.13,
        speed: 100
    }, {
        id: 8,
        type: 0,
        age: 2,
        name: "stick",
        desc: "great for gathering but very weak",
        src: "stick_1",
        length: 140,
        width: 140,
        xOff: 3,
        yOff: 24,
        dmg: 1,
        spdMult: 1,
        range: 70,
        gather: 7,
        speed: 400
    }, {
        id: 9,
        type: 1,
        age: 6,
        name: "hunting bow",
        desc: "bow used for ranged combat and hunting",
        src: "bow_1",
        req: ["wood", 4],
        length: 120,
        width: 120,
        xOff: -6,
        yOff: 0,
        projectile: 0,
        spdMult: .75,
        speed: 600
    }, {
        id: 10,
        type: 1,
        age: 6,
        name: "great hammer",
        desc: "hammer used for destroying structures",
        src: "great_hammer_1",
        length: 140,
        width: 140,
        xOff: -9,
        yOff: 25,
        dmg: 10,
        spdMult: .88,
        range: 75,
        sDmg: 7.5,
        gather: 1,
        speed: 400
    }, {
        id: 11,
        type: 1,
        age: 6,
        name: "wooden shield",
        desc: "blocks projectiles and reduces melee damage",
        src: "shield_1",
        length: 120,
        width: 120,
        shield: .2,
        xOff: 6,
        yOff: 0,
        spdMult: .7
    }, {
        id: 12,
        type: 1,
        age: 8,
        pre: 9,
        name: "crossbow",
        desc: "deals more damage and has greater range",
        src: "crossbow_1",
        req: ["wood", 5],
        aboveHand: !0,
        armS: .75,
        length: 120,
        width: 120,
        xOff: -4,
        yOff: 0,
        projectile: 2,
        spdMult: .7,
        speed: 700
    }, {
        id: 13,
        type: 1,
        age: 9,
        pre: 12,
        name: "repeater crossbow",
        desc: "high firerate crossbow with reduced damage",
        src: "crossbow_2",
        req: ["wood", 10],
        aboveHand: !0,
        armS: .75,
        length: 120,
        width: 120,
        xOff: -4,
        yOff: 0,
        projectile: 3,
        spdMult: .7,
        speed: 230
    }, {
        id: 14,
        type: 1,
        age: 6,
        name: "mc grabby",
        desc: "steals resources from enemies",
        src: "grab_1",
        length: 130,
        width: 210,
        xOff: -8,
        yOff: 53,
        dmg: 0,
        steal: 250,
        knock: .2,
        spdMult: 1.05,
        range: 125,
        gather: 0,
        speed: 700
    }, {
        id: 15,
        type: 1,
        age: 9,
        pre: 12,
        name: "musket",
        desc: "slow firerate but high damage and range",
        src: "musket_1",
        req: ["stone", 10],
        aboveHand: !0,
        rec: .35,
        armS: .6,
        hndS: .3,
        hndD: 1.6,
        length: 205,
        width: 205,
        xOff: 25,
        yOff: 0,
        projectile: 5,
        hideProjectile: !0,
        spdMult: .6,
        speed: 1500
    }],
    e.exports.list = [{
        group: e.exports.groups[0],
        name: "apple",
        desc: "restores 20 health when consumed",
        req: ["food", 10],
        consume: function(e) {
            return e.changeHealth(20, e)
        },
        scale: 22,
        holdOffset: 15
    }, {
        age: 3,
        group: e.exports.groups[0],
        name: "cookie",
        desc: "restores 40 health when consumed",
        req: ["food", 15],
        consume: function(e) {
            return e.changeHealth(40, e)
        },
        scale: 27,
        holdOffset: 15
    }, {
        age: 7,
        group: e.exports.groups[0],
        name: "cheese",
        desc: "restores 30 health and another 50 over 5 seconds",
        req: ["food", 25],
        consume: function(e) {
            return !!(e.changeHealth(30, e) || e.health < 100) && (e.dmgOverTime.dmg = -10,
            e.dmgOverTime.doer = e,
            e.dmgOverTime.time = 5,
            !0)
        },
        scale: 27,
        holdOffset: 15
    }, {
        group: e.exports.groups[1],
        name: "wood wall",
        desc: "provides protection for your village",
        req: ["wood", 10],
        projDmg: !0,
        health: 380,
        scale: 50,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 3,
        group: e.exports.groups[1],
        name: "stone wall",
        desc: "provides improved protection for your village",
        req: ["stone", 25],
        health: 900,
        scale: 50,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        pre: 1,
        group: e.exports.groups[1],
        name: "castle wall",
        desc: "provides powerful protection for your village",
        req: ["stone", 35],
        health: 1500,
        scale: 52,
        holdOffset: 20,
        placeOffset: -5
    }, {
        group: e.exports.groups[2],
        name: "spikes",
        desc: "damages enemies when they touch them",
        req: ["wood", 20, "stone", 5],
        health: 400,
        dmg: 20,
        scale: 49,
        spritePadding: -23,
        holdOffset: 8,
        placeOffset: -5
    }, {
        age: 5,
        group: e.exports.groups[2],
        name: "greater spikes",
        desc: "damages enemies when they touch them",
        req: ["wood", 30, "stone", 10],
        health: 500,
        dmg: 35,
        scale: 52,
        spritePadding: -23,
        holdOffset: 8,
        placeOffset: -5
    }, {
        age: 9,
        pre: 1,
        group: e.exports.groups[2],
        name: "poison spikes",
        desc: "poisons enemies when they touch them",
        req: ["wood", 35, "stone", 15],
        health: 600,
        dmg: 30,
        pDmg: 5,
        scale: 52,
        spritePadding: -23,
        holdOffset: 8,
        placeOffset: -5
    }, {
        age: 9,
        pre: 2,
        group: e.exports.groups[2],
        name: "spinning spikes",
        desc: "damages enemies when they touch them",
        req: ["wood", 30, "stone", 20],
        health: 500,
        dmg: 45,
        turnSpeed: .003,
        scale: 52,
        spritePadding: -23,
        holdOffset: 8,
        placeOffset: -5
    }, {
        group: e.exports.groups[3],
        name: "windmill",
        desc: "generates gold over time",
        req: ["wood", 50, "stone", 10],
        health: 400,
        pps: 1,
        turnSpeed: .0016,
        spritePadding: 25,
        iconLineMult: 12,
        scale: 45,
        holdOffset: 20,
        placeOffset: 5
    }, {
        age: 5,
        pre: 1,
        group: e.exports.groups[3],
        name: "faster windmill",
        desc: "generates more gold over time",
        req: ["wood", 60, "stone", 20],
        health: 500,
        pps: 1.5,
        turnSpeed: .0025,
        spritePadding: 25,
        iconLineMult: 12,
        scale: 47,
        holdOffset: 20,
        placeOffset: 5
    }, {
        age: 8,
        pre: 1,
        group: e.exports.groups[3],
        name: "power mill",
        desc: "generates more gold over time",
        req: ["wood", 100, "stone", 50],
        health: 800,
        pps: 2,
        turnSpeed: .005,
        spritePadding: 25,
        iconLineMult: 12,
        scale: 47,
        holdOffset: 20,
        placeOffset: 5
    }, {
        age: 5,
        group: e.exports.groups[4],
        type: 2,
        name: "mine",
        desc: "allows you to mine stone",
        req: ["wood", 20, "stone", 100],
        iconLineMult: 12,
        scale: 65,
        holdOffset: 20,
        placeOffset: 0
    }, {
        age: 5,
        group: e.exports.groups[11],
        type: 0,
        name: "sapling",
        desc: "allows you to farm wood",
        req: ["wood", 150],
        iconLineMult: 12,
        colDiv: .5,
        scale: 110,
        holdOffset: 50,
        placeOffset: -15
    }, {
        age: 4,
        group: e.exports.groups[5],
        name: "pit trap",
        desc: "pit that traps enemies if they walk over it",
        req: ["wood", 30, "stone", 30],
        trap: !0,
        ignoreCollision: !0,
        hideFromEnemy: !0,
        health: 500,
        colDiv: .2,
        scale: 50,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 4,
        group: e.exports.groups[6],
        name: "boost pad",
        desc: "provides boost when stepped on",
        req: ["stone", 20, "wood", 5],
        ignoreCollision: !0,
        boostSpeed: 1.5,
        health: 150,
        colDiv: .7,
        scale: 45,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        group: e.exports.groups[7],
        doUpdate: !0,
        name: "turret",
        desc: "defensive structure that shoots at enemies",
        req: ["wood", 200, "stone", 150],
        health: 800,
        projectile: 1,
        shootRange: 700,
        shootRate: 2200,
        scale: 43,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        group: e.exports.groups[8],
        name: "platform",
        desc: "platform to shoot over walls and cross over water",
        req: ["wood", 20],
        ignoreCollision: !0,
        zIndex: 1,
        health: 300,
        scale: 43,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        group: e.exports.groups[9],
        name: "healing pad",
        desc: "standing on it will slowly heal you",
        req: ["wood", 30, "food", 10],
        ignoreCollision: !0,
        healCol: 15,
        health: 400,
        colDiv: .7,
        scale: 45,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 9,
        group: e.exports.groups[10],
        name: "spawn pad",
        desc: "you will spawn here when you die but it will dissapear",
        req: ["wood", 100, "stone", 100],
        health: 400,
        ignoreCollision: !0,
        spawnPoint: !0,
        scale: 45,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        group: e.exports.groups[12],
        name: "blocker",
        desc: "blocks building in radius",
        req: ["wood", 30, "stone", 25],
        ignoreCollision: !0,
        blocker: 300,
        health: 400,
        colDiv: .7,
        scale: 45,
        holdOffset: 20,
        placeOffset: -5
    }, {
        age: 7,
        group: e.exports.groups[13],
        name: "teleporter",
        desc: "teleports you to a random point on the map",
        req: ["wood", 60, "stone", 60],
        ignoreCollision: !0,
        teleport: !0,
        health: 200,
        colDiv: .7,
        scale: 45,
        holdOffset: 20,
        placeOffset: -5
    }];
    for (var n = 0; n < e.exports.list.length; ++n)
        e.exports.list[n].id = n,
        e.exports.list[n].pre && (e.exports.list[n].pre = n - e.exports.list[n].pre)
}
, function(e, t) {
    e.exports = {}
}
, function(e, t) {
    var n = Math.floor
      , i = Math.abs
      , r = Math.cos
      , s = Math.sin
      , a = (Math.pow,
    Math.sqrt);
    e.exports = function(e, t, o, c, l, h) {
        var u, f;
        this.objects = t,
        this.grids = {},
        this.updateObjects = [];
        var d = c.mapScale / c.colGrid;
        this.setObjectGrids = function(e) {
            for (var t = Math.min(c.mapScale, Math.max(0, e.x)), n = Math.min(c.mapScale, Math.max(0, e.y)), i = 0; i < c.colGrid; ++i) {
                u = i * d;
                for (var r = 0; r < c.colGrid; ++r)
                    f = r * d,
                    t + e.scale >= u && t - e.scale <= u + d && n + e.scale >= f && n - e.scale <= f + d && (this.grids[i + "_" + r] || (this.grids[i + "_" + r] = []),
                    this.grids[i + "_" + r].push(e),
                    e.gridLocations.push(i + "_" + r))
            }
        }
        ,
        this.removeObjGrid = function(e) {
            for (var t, n = 0; n < e.gridLocations.length; ++n)
                (t = this.grids[e.gridLocations[n]].indexOf(e)) >= 0 && this.grids[e.gridLocations[n]].splice(t, 1)
        }
        ,
        this.disableObj = function(e) {
            if (e.active = !1,
            h) {
                e.owner && e.pps && (e.owner.pps -= e.pps),
                this.removeObjGrid(e);
                var t = this.updateObjects.indexOf(e);
                t >= 0 && this.updateObjects.splice(t, 1)
            }
        }
        ,
        this.hitObj = function(e, t) {
            for (var n = 0; n < l.length; ++n)
                l[n].active && (e.sentTo[l[n].id] && (e.active ? l[n].canSee(e) && h.send(l[n].id, "8", o.fixTo(t, 1), e.sid) : h.send(l[n].id, "12", e.sid)),
                e.active || e.owner != l[n] || l[n].changeItemCount(e.group.id, -1))
        }
        ;
        var p, g, m = [];
        this.getGridArrays = function(e, t, i) {
            u = n(e / d),
            f = n(t / d),
            m.length = 0;
            try {
                this.grids[u + "_" + f] && m.push(this.grids[u + "_" + f]),
                e + i >= (u + 1) * d && ((p = this.grids[u + 1 + "_" + f]) && m.push(p),
                f && t - i <= f * d ? (p = this.grids[u + 1 + "_" + (f - 1)]) && m.push(p) : t + i >= (f + 1) * d && (p = this.grids[u + 1 + "_" + (f + 1)]) && m.push(p)),
                u && e - i <= u * d && ((p = this.grids[u - 1 + "_" + f]) && m.push(p),
                f && t - i <= f * d ? (p = this.grids[u - 1 + "_" + (f - 1)]) && m.push(p) : t + i >= (f + 1) * d && (p = this.grids[u - 1 + "_" + (f + 1)]) && m.push(p)),
                t + i >= (f + 1) * d && (p = this.grids[u + "_" + (f + 1)]) && m.push(p),
                f && t - i <= f * d && (p = this.grids[u + "_" + (f - 1)]) && m.push(p)
            } catch (e) {}
            return m
        }
        ,
        this.add = function(n, i, r, s, a, o, c, l, u) {
            g = null;
            for (var f = 0; f < t.length; ++f)
                if (t[f].sid == n) {
                    g = t[f];
                    break
                }
            if (!g)
                for (f = 0; f < t.length; ++f)
                    if (!t[f].active) {
                        g = t[f];
                        break
                    }
            g || (g = new e(n),
            t.push(g)),
            l && (g.sid = n),
            g.init(i, r, s, a, o, c, u),
            h && (this.setObjectGrids(g),
            g.doUpdate && this.updateObjects.push(g));
            Tach.addBuilding(g);
        }
        ,
        this.disableBySid = function(e) {
            for (var n = 0; n < t.length; ++n)
                if (t[n].sid == e) {
                    this.disableObj(t[n]);
                    break
                }
        }
        ,
        this.removeAllItems = function(e, n) {
            for (var i = 0; i < t.length; ++i)
                t[i].active && t[i].owner && t[i].owner.sid == e && this.disableObj(t[i]);
            n && n.broadcast("13", e)
        }
        ,
        this.fetchSpawnObj = function(e) {
            for (var n = null, i = 0; i < t.length; ++i)
                if ((g = t[i]).active && g.owner && g.owner.sid == e && g.spawnPoint) {
                    n = [g.x, g.y],
                    this.disableObj(g),
                    h.broadcast("12", g.sid),
                    g.owner && g.owner.changeItemCount(g.group.id, -1);
                    break
                }
            return n
        }
        ,
        this.checkItemLocation = function(e, n, i, r, s, a, l) {
            for (var h = 0; h < t.length; ++h) {
                var u = t[h].blocker ? t[h].blocker : t[h].getScale(r, t[h].isItem);
                if (t[h].active && o.getDistance(e, n, t[h].x, t[h].y) < i + u)
                    return !1
            }
            return !(!a && 18 != s && n >= c.mapScale / 2 - c.riverWidth / 2 && n <= c.mapScale / 2 + c.riverWidth / 2)
        }
        ,
        this.addProjectile = function(e, t, n, i, r) {
            for (var s, a = items.projectiles[r], c = 0; c < projectiles.length; ++c)
                if (!projectiles[c].active) {
                    s = projectiles[c];
                    break
                }
            s || (s = new Projectile(l,o),
            projectiles.push(s)),
            s.init(r, e, t, n, a.speed, i, a.scale)
        }
        ,
        this.checkCollision = function(e, t, n) {
            n = n || 1;
            var l = e.x - t.x
              , h = e.y - t.y
              , u = e.scale + t.scale;
            if (i(l) <= u || i(h) <= u) {
                u = e.scale + (t.getScale ? t.getScale() : t.scale);
                var f = a(l * l + h * h) - u;
                if (f <= 0) {
                    if (t.ignoreCollision)
                        !t.trap || e.noTrap || t.owner == e || t.owner && t.owner.team && t.owner.team == e.team ? t.boostSpeed ? (e.xVel += n * t.boostSpeed * (t.weightM || 1) * r(t.dir),
                        e.yVel += n * t.boostSpeed * (t.weightM || 1) * s(t.dir)) : t.healCol ? e.healCol = t.healCol : t.teleport && (e.x = o.randInt(0, c.mapScale),
                        e.y = o.randInt(0, c.mapScale)) : (e.lockMove = !0,
                        t.hideFromEnemy = !1);
                    else {
                        var d = o.getDirection(e.x, e.y, t.x, t.y);
                        if (o.getDistance(e.x, e.y, t.x, t.y),
                        t.isPlayer ? (f = -1 * f / 2,
                        e.x += f * r(d),
                        e.y += f * s(d),
                        t.x -= f * r(d),
                        t.y -= f * s(d)) : (e.x = t.x + u * r(d),
                        e.y = t.y + u * s(d),
                        e.xVel *= .75,
                        e.yVel *= .75),
                        t.dmg && t.owner != e && (!t.owner || !t.owner.team || t.owner.team != e.team)) {
                            e.changeHealth(-t.dmg, t.owner, t);
                            var p = 1.5 * (t.weightM || 1);
                            e.xVel += p * r(d),
                            e.yVel += p * s(d),
                            !t.pDmg || e.skin && e.skin.poisonRes || (e.dmgOverTime.dmg = t.pDmg,
                            e.dmgOverTime.time = 5,
                            e.dmgOverTime.doer = t.owner),
                            e.colDmg && t.health && (t.changeHealth(-e.colDmg) && this.disableObj(t),
                            this.hitObj(t, o.getDirection(e.x, e.y, t.x, t.y)))
                        }
                    }
                    return t.zIndex > e.zIndex && (e.zIndex = t.zIndex),
                    !0
                }
            }
            return !1
        }
    }
}
, function(e, t, n) {
    var i = new (n(49));
    i.addWords("jew", "black", "baby", "child", "white", "porn", "pedo", "trump", "clinton", "hitler", "nazi", "gay", "pride", "sex", "pleasure", "touch", "poo", "kids", "rape", "white power", "nigga", "nig nog", "doggy", "rapist", "boner", "nigger", "nigg", "finger", "nogger", "nagger", "nig", "fag", "gai", "pole", "stripper", "penis", "vagina", "pussy", "nazi", "hitler", "stalin", "burn", "chamber", "cock", "peen", "dick", "spick", "nieger", "die", "satan", "n|ig", "nlg", "cunt", "c0ck", "fag", "lick", "condom", "anal", "shit", "phile", "little", "kids", "free KR", "tiny", "sidney", "ass", "kill", ".io", "(dot)", "[dot]", "mini", "whiore", "whore", "faggot", "github", "1337", "666", "satan", "senpa", "discord", "d1scord", "mistik", ".io", "senpa.io", "sidney", "sid", "senpaio", "vries", "asa");
    var r = Math.abs
      , s = Math.cos
      , a = Math.sin
      , o = Math.pow
      , c = Math.sqrt;
    e.exports = function(e, t, n, l, h, u, f, d, p, g, m, y, k, v) {
        this.id = e,
        this.sid = t,
        this.tmpScore = 0,
        this.team = null,
        this.skinIndex = 0,
        this.tailIndex = 0,
        this.hitTime = 0,
        this.tails = {};
        for (var w = 0; w < m.length; ++w)
            m[w].price <= 0 && (this.tails[m[w].id] = 1);
        for (this.skins = {},
        w = 0; w < g.length; ++w)
            g[w].price <= 0 && (this.skins[g[w].id] = 1);
        this.points = 0,
        this.dt = 0,
        this.hidden = !1,
        this.itemCounts = {},
        this.isPlayer = !0,
        this.pps = 0,
        this.moveDir = void 0,
        this.skinRot = 0,
        this.lastPing = 0,
        this.iconIndex = 0,
        this.skinColor = 0,
        this.spawn = function(e) {
            this.active = !0,
            this.alive = !0,
            this.lockMove = !1,
            this.lockDir = !1,
            this.minimapCounter = 0,
            this.chatCountdown = 0,
            this.shameCount = 0,
            this.shameTimer = 0,
            this.sentTo = {},
            this.gathering = 0,
            this.autoGather = 0,
            this.animTime = 0,
            this.animSpeed = 0,
            this.mouseState = 0,
            this.buildIndex = -1,
            this.weaponIndex = 0,
            this.dmgOverTime = {},
            this.noMovTimer = 0,
            this.maxXP = 300,
            this.XP = 0,
            this.age = 1,
            this.kills = 0,
            this.upgrAge = 2,
            this.upgradePoints = 0,
            this.x = 0,
            this.y = 0,
            this.zIndex = 0,
            this.xVel = 0,
            this.yVel = 0,
            this.slowMult = 1,
            this.dir = 0,
            this.dirPlus = 0,
            this.targetDir = 0,
            this.targetAngle = 0,
            this.maxHealth = 100,
            this.health = this.maxHealth,
            this.scale = n.playerScale,
            this.speed = n.playerSpeed,
            this.resetMoveDir(),
            this.resetResources(e),
            this.items = [0, 3, 6, 10],
            this.weapons = [0],
            this.shootCount = 0,
            this.weaponXP = [],
            this.reloads = {}
        }
        ,
        this.resetMoveDir = function() {
            this.moveDir = void 0
        }
        ,
        this.resetResources = function(e) {
            for (var t = 0; t < n.resourceTypes.length; ++t)
                this[n.resourceTypes[t]] = e ? 100 : 0
        }
        ,
        this.addItem = function(e) {
            var t = p.list[e];
            if (t) {
                for (var n = 0; n < this.items.length; ++n)
                    if (p.list[this.items[n]].group == t.group)
                        return this.buildIndex == this.items[n] && (this.buildIndex = e),
                        this.items[n] = e,
                        !0;
                return this.items.push(e),
                !0
            }
            return !1
        }
        ,
        this.setUserData = function(e) {
            if (e) {
                this.name = "unknown";
                var t = e.name + ""
                  , r = !1
                  , s = (t = (t = (t = (t = t.slice(0, n.maxNameLength)).replace(/[^\w:\(\)\/? -]+/gim, " ")).replace(/[^\x00-\x7F]/g, " ")).trim()).toLowerCase().replace(/\s/g, "").replace(/1/g, "i").replace(/0/g, "o").replace(/5/g, "s");
                for (var a of i.list)
                    if (-1 != s.indexOf(a)) {
                        r = !0;
                        break
                    }
                t.length > 0 && !r && (this.name = t),
                this.skinColor = 0,
                n.skinColors[e.skin] && (this.skinColor = e.skin)
            }
        }
        ,
        this.getData = function() {
            return [this.id, this.sid, this.name, l.fixTo(this.x, 2), l.fixTo(this.y, 2), l.fixTo(this.dir, 3), this.health, this.maxHealth, this.scale, this.skinColor]
        }
        ,
        this.setData = function(e) {
            this.id = e[0],
            this.sid = e[1],
            this.name = e[2],
            this.x = e[3],
            this.y = e[4],
            this.dir = e[5],
            this.health = e[6],
            this.maxHealth = e[7],
            this.scale = e[8],
            this.skinColor = e[9]
        }
        ;
        var b = 0;
        this.update = function(e) {
            if (this.alive) {
                if (this.shameTimer > 0 && (this.shameTimer -= e,
                this.shameTimer <= 0 && (this.shameTimer = 0,
                this.shameCount = 0)),
                (b -= e) <= 0) {
                    var t = (this.skin && this.skin.healthRegen ? this.skin.healthRegen : 0) + (this.tail && this.tail.healthRegen ? this.tail.healthRegen : 0);
                    t && this.changeHealth(t, this),
                    this.dmgOverTime.dmg && (this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer),
                    this.dmgOverTime.time -= 1,
                    this.dmgOverTime.time <= 0 && (this.dmgOverTime.dmg = 0)),
                    this.healCol && this.changeHealth(this.healCol, this),
                    b = 1e3
                }
                if (this.alive) {
                    if (this.slowMult < 1 && (this.slowMult += 8e-4 * e,
                    this.slowMult > 1 && (this.slowMult = 1)),
                    this.noMovTimer += e,
                    (this.xVel || this.yVel) && (this.noMovTimer = 0),
                    this.lockMove)
                        this.xVel = 0,
                        this.yVel = 0;
                    else {
                        var i = (this.buildIndex >= 0 ? .5 : 1) * (p.weapons[this.weaponIndex].spdMult || 1) * (this.skin && this.skin.spdMult || 1) * (this.tail && this.tail.spdMult || 1) * (this.y <= n.snowBiomeTop ? this.skin && this.skin.coldM ? 1 : n.snowSpeed : 1) * this.slowMult;
                        !this.zIndex && this.y >= n.mapScale / 2 - n.riverWidth / 2 && this.y <= n.mapScale / 2 + n.riverWidth / 2 && (this.skin && this.skin.watrImm ? (i *= .75,
                        this.xVel += .4 * n.waterCurrent * e) : (i *= .33,
                        this.xVel += n.waterCurrent * e));
                        var r = null != this.moveDir ? s(this.moveDir) : 0
                          , d = null != this.moveDir ? a(this.moveDir) : 0
                          , g = c(r * r + d * d);
                        0 != g && (r /= g,
                        d /= g),
                        r && (this.xVel += r * this.speed * i * e),
                        d && (this.yVel += d * this.speed * i * e)
                    }
                    var m;
                    this.zIndex = 0,
                    this.lockMove = !1,
                    this.healCol = 0;
                    for (var y = l.getDistance(0, 0, this.xVel * e, this.yVel * e), k = Math.min(4, Math.max(1, Math.round(y / 40))), v = 1 / k, w = 0; w < k; ++w) {
                        this.xVel && (this.x += this.xVel * e * v),
                        this.yVel && (this.y += this.yVel * e * v),
                        m = u.getGridArrays(this.x, this.y, this.scale);
                        for (var x = 0; x < m.length; ++x)
                            for (var S = 0; S < m[x].length; ++S)
                                m[x][S].active && u.checkCollision(this, m[x][S], v)
                    }
                    for (w = (I = f.indexOf(this)) + 1; w < f.length; ++w)
                        f[w] != this && f[w].alive && u.checkCollision(this, f[w]);
                    if (this.xVel && (this.xVel *= o(n.playerDecel, e),
                    this.xVel <= .01 && this.xVel >= -.01 && (this.xVel = 0)),
                    this.yVel && (this.yVel *= o(n.playerDecel, e),
                    this.yVel <= .01 && this.yVel >= -.01 && (this.yVel = 0)),
                    this.x - this.scale < 0 ? this.x = this.scale : this.x + this.scale > n.mapScale && (this.x = n.mapScale - this.scale),
                    this.y - this.scale < 0 ? this.y = this.scale : this.y + this.scale > n.mapScale && (this.y = n.mapScale - this.scale),
                    this.buildIndex < 0)
                        if (this.reloads[this.weaponIndex] > 0)
                            this.reloads[this.weaponIndex] -= e,
                            this.gathering = this.mouseState;
                        else if (this.gathering || this.autoGather) {
                            var T = !0;
                            if (null != p.weapons[this.weaponIndex].gather)
                                this.gather(f);
                            else if (null != p.weapons[this.weaponIndex].projectile && this.hasRes(p.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0)) {
                                this.useRes(p.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0),
                                this.noMovTimer = 0;
                                var I = p.weapons[this.weaponIndex].projectile
                                  , E = 2 * this.scale
                                  , M = this.skin && this.skin.aMlt ? this.skin.aMlt : 1;
                                p.weapons[this.weaponIndex].rec && (this.xVel -= p.weapons[this.weaponIndex].rec * s(this.dir),
                                this.yVel -= p.weapons[this.weaponIndex].rec * a(this.dir)),
                                h.addProjectile(this.x + E * s(this.dir), this.y + E * a(this.dir), this.dir, p.projectiles[I].range * M, p.projectiles[I].speed * M, I, this, null, this.zIndex)
                            } else
                                T = !1;
                            this.gathering = this.mouseState,
                            T && (this.reloads[this.weaponIndex] = p.weapons[this.weaponIndex].speed * (this.skin && this.skin.atkSpd || 1))
                        }
                }
            }
        }
        ,
        this.addWeaponXP = function(e) {
            this.weaponXP[this.weaponIndex] || (this.weaponXP[this.weaponIndex] = 0),
            this.weaponXP[this.weaponIndex] += e
        }
        ,
        this.earnXP = function(e) {
            this.age < n.maxAge && (this.XP += e,
            this.XP >= this.maxXP ? (this.age < n.maxAge ? (this.age++,
            this.XP = 0,
            this.maxXP *= 1.2) : this.XP = this.maxXP,
            this.upgradePoints++,
            y.send(this.id, "16", this.upgradePoints, this.upgrAge),
            y.send(this.id, "15", this.XP, l.fixTo(this.maxXP, 1), this.age)) : y.send(this.id, "15", this.XP))
        }
        ,
        this.changeHealth = function(e, t) {
            if (e > 0 && this.health >= this.maxHealth)
                return !1;
            e < 0 && this.skin && (e *= this.skin.dmgMult || 1),
            e < 0 && this.tail && (e *= this.tail.dmgMult || 1),
            e < 0 && (this.hitTime = Date.now()),
            this.health += e,
            this.health > this.maxHealth && (e -= this.health - this.maxHealth,
            this.health = this.maxHealth),
            this.health <= 0 && this.kill(t);
            for (var n = 0; n < f.length; ++n)
                this.sentTo[f[n].id] && y.send(f[n].id, "h", this.sid, Math.round(this.health));
            return !t || !t.canSee(this) || t == this && e < 0 || y.send(t.id, "t", Math.round(this.x), Math.round(this.y), Math.round(-e), 1),
            !0
        }
        ,
        this.kill = function(e) {
            e && e.alive && (e.kills++,
            e.skin && e.skin.goldSteal ? k(e, Math.round(this.points / 2)) : k(e, Math.round(100 * this.age * (e.skin && e.skin.kScrM ? e.skin.kScrM : 1))),
            y.send(e.id, "9", "kills", e.kills, 1)),
            this.alive = !1,
            y.send(this.id, "11"),
            v()
        }
        ,
        this.addResource = function(e, t, i) {
            !i && t > 0 && this.addWeaponXP(t),
            3 == e ? k(this, t, !0) : (this[n.resourceTypes[e]] += t,
            y.send(this.id, "9", n.resourceTypes[e], this[n.resourceTypes[e]], 1))
        }
        ,
        this.changeItemCount = function(e, t) {
            this.itemCounts[e] = this.itemCounts[e] || 0,
            this.itemCounts[e] += t,
            y.send(this.id, "14", e, this.itemCounts[e])
        }
        ,
        this.buildItem = function(e) {
            var t = this.scale + e.scale + (e.placeOffset || 0)
              , n = this.x + t * s(this.dir)
              , i = this.y + t * a(this.dir);
            if (this.canBuild(e) && !(e.consume && this.skin && this.skin.noEat) && (e.consume || u.checkItemLocation(n, i, e.scale, .6, e.id, !1, this))) {
                var r = !1;
                if (e.consume) {
                    if (this.hitTime) {
                        var o = Date.now() - this.hitTime;
                        this.hitTime = 0,
                        o <= 120 ? (this.shameCount++,
                        this.shameCount >= 8 && (this.shameTimer = 3e4,
                        this.shameCount = 0)) : (this.shameCount -= 2,
                        this.shameCount <= 0 && (this.shameCount = 0))
                    }
                    this.shameTimer <= 0 && (r = e.consume(this))
                } else
                    r = !0,
                    e.group.limit && this.changeItemCount(e.group.id, 1),
                    e.pps && (this.pps += e.pps),
                    u.add(u.objects.length, n, i, this.dir, e.scale, e.type, e, !1, this);
                r && (this.useRes(e),
                this.buildIndex = -1)
            }
        }
        ,
        this.hasRes = function(e, t) {
            for (var n = 0; n < e.req.length; ) {
                if (this[e.req[n]] < Math.round(e.req[n + 1] * (t || 1)))
                    return !1;
                n += 2
            }
            return !0
        }
        ,
        this.useRes = function(e, t) {
            if (!n.inSandbox)
                for (var i = 0; i < e.req.length; )
                    this.addResource(n.resourceTypes.indexOf(e.req[i]), -Math.round(e.req[i + 1] * (t || 1))),
                    i += 2
        }
        ,
        this.canBuild = function(e) {
            return !!n.inSandbox || !(e.group.limit && this.itemCounts[e.group.id] >= e.group.limit) && this.hasRes(e)
        }
        ,
        this.gather = function() {
            this.noMovTimer = 0,
            this.slowMult -= p.weapons[this.weaponIndex].hitSlow || .3,
            this.slowMult < 0 && (this.slowMult = 0);
            for (var e, t, i, r = n.fetchVariant(this), o = r.poison, c = r.val, h = {}, g = u.getGridArrays(this.x, this.y, p.weapons[this.weaponIndex].range), m = 0; m < g.length; ++m)
                for (var y = 0; y < g[m].length; ++y)
                    if ((t = g[m][y]).active && !t.dontGather && !h[t.sid] && t.visibleToPlayer(this) && l.getDistance(this.x, this.y, t.x, t.y) - t.scale <= p.weapons[this.weaponIndex].range && (e = l.getDirection(t.x, t.y, this.x, this.y),
                    l.getAngleDist(e, this.dir) <= n.gatherAngle)) {
                        if (h[t.sid] = 1,
                        t.health) {
                            if (t.changeHealth(-p.weapons[this.weaponIndex].dmg * c * (p.weapons[this.weaponIndex].sDmg || 1) * (this.skin && this.skin.bDmg ? this.skin.bDmg : 1), this)) {
                                for (var k = 0; k < t.req.length; )
                                    this.addResource(n.resourceTypes.indexOf(t.req[k]), t.req[k + 1]),
                                    k += 2;
                                u.disableObj(t)
                            }
                        } else {
                            this.earnXP(4 * p.weapons[this.weaponIndex].gather);
                            var v = p.weapons[this.weaponIndex].gather + (3 == t.type ? 4 : 0);
                            this.skin && this.skin.extraGold && this.addResource(3, 1),
                            this.addResource(t.type, v)
                        }
                        i = !0,
                        u.hitObj(t, e)
                    }
            for (y = 0; y < f.length + d.length; ++y)
                if ((t = f[y] || d[y - f.length]) != this && t.alive && (!t.team || t.team != this.team) && l.getDistance(this.x, this.y, t.x, t.y) - 1.8 * t.scale <= p.weapons[this.weaponIndex].range && (e = l.getDirection(t.x, t.y, this.x, this.y),
                l.getAngleDist(e, this.dir) <= n.gatherAngle)) {
                    var w = p.weapons[this.weaponIndex].steal;
                    w && t.addResource && (w = Math.min(t.points || 0, w),
                    this.addResource(3, w),
                    t.addResource(3, -w));
                    var b = c;
                    null != t.weaponIndex && p.weapons[t.weaponIndex].shield && l.getAngleDist(e + Math.PI, t.dir) <= n.shieldAngle && (b = p.weapons[t.weaponIndex].shield);
                    var x = p.weapons[this.weaponIndex].dmg * (this.skin && this.skin.dmgMultO ? this.skin.dmgMultO : 1) * (this.tail && this.tail.dmgMultO ? this.tail.dmgMultO : 1)
                      , S = .3 * (t.weightM || 1) + (p.weapons[this.weaponIndex].knock || 0);
                    t.xVel += S * s(e),
                    t.yVel += S * a(e),
                    this.skin && this.skin.healD && this.changeHealth(x * b * this.skin.healD, this),
                    this.tail && this.tail.healD && this.changeHealth(x * b * this.tail.healD, this),
                    t.skin && t.skin.dmg && 1 == b && this.changeHealth(-x * t.skin.dmg, t),
                    t.tail && t.tail.dmg && 1 == b && this.changeHealth(-x * t.tail.dmg, t),
                    !(t.dmgOverTime && this.skin && this.skin.poisonDmg) || t.skin && t.skin.poisonRes || (t.dmgOverTime.dmg = this.skin.poisonDmg,
                    t.dmgOverTime.time = this.skin.poisonTime || 1,
                    t.dmgOverTime.doer = this),
                    !t.dmgOverTime || !o || t.skin && t.skin.poisonRes || (t.dmgOverTime.dmg = 5,
                    t.dmgOverTime.time = 5,
                    t.dmgOverTime.doer = this),
                    t.skin && t.skin.dmgK && (this.xVel -= t.skin.dmgK * s(e),
                    this.yVel -= t.skin.dmgK * a(e)),
                    t.changeHealth(-x * b, this, this)
                }
            this.sendAnimation(i ? 1 : 0)
        }
        ,
        this.sendAnimation = function(e) {
            for (var t = 0; t < f.length; ++t)
                this.sentTo[f[t].id] && this.canSee(f[t]) && y.send(f[t].id, "7", this.sid, e ? 1 : 0, this.weaponIndex)
        }
        ;
        var x = 0
          , S = 0;
        this.animate = function(e) {
            this.animTime > 0 && (this.animTime -= e,
            this.animTime <= 0 ? (this.animTime = 0,
            this.dirPlus = 0,
            x = 0,
            S = 0) : 0 == S ? (x += e / (this.animSpeed * n.hitReturnRatio),
            this.dirPlus = l.lerp(0, this.targetAngle, Math.min(1, x)),
            x >= 1 && (x = 1,
            S = 1)) : (x -= e / (this.animSpeed * (1 - n.hitReturnRatio)),
            this.dirPlus = l.lerp(0, this.targetAngle, Math.max(0, x))))
        }
        ,
        this.startAnim = function(e, t) {
            this.animTime = this.animSpeed = p.weapons[t].speed,
            this.targetAngle = e ? -n.hitAngle : -Math.PI,
            x = 0,
            S = 0
        }
        ,
        this.canSee = function(e) {
            if (!e)
                return !1;
            if (e.skin && e.skin.invisTimer && e.noMovTimer >= e.skin.invisTimer)
                return !1;
            var t = r(e.x - this.x) - e.scale
              , i = r(e.y - this.y) - e.scale;
            return t <= n.maxScreenWidth / 2 * 1.3 && i <= n.maxScreenHeight / 2 * 1.3
        }
    }
}
, function(e, t, n) {
    const i = n(50).words
      , r = n(51).array;
    e.exports = class {
        constructor(e={}) {
            Object.assign(this, {
                list: e.emptyList && [] || Array.prototype.concat.apply(i, [r, e.list || []]),
                exclude: e.exclude || [],
                placeHolder: e.placeHolder || "*",
                regex: e.regex || /[^a-zA-Z0-9|\$|\@]|\^/g,
                replaceRegex: e.replaceRegex || /\w/g
            })
        }
        isProfane(e) {
            return this.list.filter(t=>{
                const n = new RegExp(`\\b${t.replace(/(\W)/g, "\\$1")}\\b`,"gi");
                return !this.exclude.includes(t.toLowerCase()) && n.test(e)
            }
            ).length > 0 || !1
        }
        replaceWord(e) {
            return e.replace(this.regex, "").replace(this.replaceRegex, this.placeHolder)
        }
        clean(e) {
            return e.split(/\b/).map(e=>this.isProfane(e) ? this.replaceWord(e) : e).join("")
        }
        addWords() {
            let e = Array.from(arguments);
            this.list.push(...e),
            e.map(e=>e.toLowerCase()).forEach(e=>{
                this.exclude.includes(e) && this.exclude.splice(this.exclude.indexOf(e), 1)
            }
            )
        }
        removeWords() {
            this.exclude.push(...Array.from(arguments).map(e=>e.toLowerCase()))
        }
    }
}
, function(e) {
    e.exports = {
        words: ["ahole", "anus", "ash0le", "ash0les", "asholes", "ass", "Ass Monkey", "Assface", "assh0le", "assh0lez", "asshole", "assholes", "assholz", "asswipe", "azzhole", "bassterds", "bastard", "bastards", "bastardz", "basterds", "basterdz", "Biatch", "bitch", "bitches", "Blow Job", "boffing", "butthole", "buttwipe", "c0ck", "c0cks", "c0k", "Carpet Muncher", "cawk", "cawks", "Clit", "cnts", "cntz", "cock", "cockhead", "cock-head", "cocks", "CockSucker", "cock-sucker", "crap", "cum", "cunt", "cunts", "cuntz", "dick", "dild0", "dild0s", "dildo", "dildos", "dilld0", "dilld0s", "dominatricks", "dominatrics", "dominatrix", "dyke", "enema", "f u c k", "f u c k e r", "fag", "fag1t", "faget", "fagg1t", "faggit", "faggot", "fagg0t", "fagit", "fags", "fagz", "faig", "faigs", "fart", "flipping the bird", "fuck", "fucker", "fuckin", "fucking", "fucks", "Fudge Packer", "fuk", "Fukah", "Fuken", "fuker", "Fukin", "Fukk", "Fukkah", "Fukken", "Fukker", "Fukkin", "g00k", "God-damned", "h00r", "h0ar", "h0re", "hells", "hoar", "hoor", "hoore", "jackoff", "jap", "japs", "jerk-off", "jisim", "jiss", "jizm", "jizz", "knob", "knobs", "knobz", "kunt", "kunts", "kuntz", "Lezzian", "Lipshits", "Lipshitz", "masochist", "masokist", "massterbait", "masstrbait", "masstrbate", "masterbaiter", "masterbate", "masterbates", "Motha Fucker", "Motha Fuker", "Motha Fukkah", "Motha Fukker", "Mother Fucker", "Mother Fukah", "Mother Fuker", "Mother Fukkah", "Mother Fukker", "mother-fucker", "Mutha Fucker", "Mutha Fukah", "Mutha Fuker", "Mutha Fukkah", "Mutha Fukker", "n1gr", "nastt", "nigger;", "nigur;", "niiger;", "niigr;", "orafis", "orgasim;", "orgasm", "orgasum", "oriface", "orifice", "orifiss", "packi", "packie", "packy", "paki", "pakie", "paky", "pecker", "peeenus", "peeenusss", "peenus", "peinus", "pen1s", "penas", "penis", "penis-breath", "penus", "penuus", "Phuc", "Phuck", "Phuk", "Phuker", "Phukker", "polac", "polack", "polak", "Poonani", "pr1c", "pr1ck", "pr1k", "pusse", "pussee", "pussy", "puuke", "puuker", "queer", "queers", "queerz", "qweers", "qweerz", "qweir", "recktum", "rectum", "retard", "sadist", "scank", "schlong", "screwing", "semen", "sex", "sexy", "Sh!t", "sh1t", "sh1ter", "sh1ts", "sh1tter", "sh1tz", "shit", "shits", "shitter", "Shitty", "Shity", "shitz", "Shyt", "Shyte", "Shytty", "Shyty", "skanck", "skank", "skankee", "skankey", "skanks", "Skanky", "slag", "slut", "sluts", "Slutty", "slutz", "son-of-a-bitch", "tit", "turd", "va1jina", "vag1na", "vagiina", "vagina", "vaj1na", "vajina", "vullva", "vulva", "w0p", "wh00r", "wh0re", "whore", "xrated", "xxx", "b!+ch", "bitch", "blowjob", "clit", "arschloch", "fuck", "shit", "ass", "asshole", "b!tch", "b17ch", "b1tch", "bastard", "bi+ch", "boiolas", "buceta", "c0ck", "cawk", "chink", "cipa", "clits", "cock", "cum", "cunt", "dildo", "dirsa", "ejakulate", "fatass", "fcuk", "fuk", "fux0r", "hoer", "hore", "jism", "kawk", "l3itch", "l3i+ch", "lesbian", "masturbate", "masterbat*", "masterbat3", "motherfucker", "s.o.b.", "mofo", "nazi", "nigga", "nigger", "nutsack", "phuck", "pimpis", "pusse", "pussy", "scrotum", "sh!t", "shemale", "shi+", "sh!+", "slut", "smut", "teets", "tits", "boobs", "b00bs", "teez", "testical", "testicle", "titt", "w00se", "jackoff", "wank", "whoar", "whore", "*damn", "*dyke", "*fuck*", "*shit*", "@$$", "amcik", "andskota", "arse*", "assrammer", "ayir", "bi7ch", "bitch*", "bollock*", "breasts", "butt-pirate", "cabron", "cazzo", "chraa", "chuj", "Cock*", "cunt*", "d4mn", "daygo", "dego", "dick*", "dike*", "dupa", "dziwka", "ejackulate", "Ekrem*", "Ekto", "enculer", "faen", "fag*", "fanculo", "fanny", "feces", "feg", "Felcher", "ficken", "fitt*", "Flikker", "foreskin", "Fotze", "Fu(*", "fuk*", "futkretzn", "gook", "guiena", "h0r", "h4x0r", "hell", "helvete", "hoer*", "honkey", "Huevon", "hui", "injun", "jizz", "kanker*", "kike", "klootzak", "kraut", "knulle", "kuk", "kuksuger", "Kurac", "kurwa", "kusi*", "kyrpa*", "lesbo", "mamhoon", "masturbat*", "merd*", "mibun", "monkleigh", "mouliewop", "muie", "mulkku", "muschi", "nazis", "nepesaurio", "nigger*", "orospu", "paska*", "perse", "picka", "pierdol*", "pillu*", "pimmel", "piss*", "pizda", "poontsee", "poop", "porn", "p0rn", "pr0n", "preteen", "pula", "pule", "puta", "puto", "qahbeh", "queef*", "rautenberg", "schaffer", "scheiss*", "schlampe", "schmuck", "screw", "sh!t*", "sharmuta", "sharmute", "shipal", "shiz", "skribz", "skurwysyn", "sphencter", "spic", "spierdalaj", "splooge", "suka", "b00b*", "testicle*", "titt*", "twat", "vittu", "wank*", "wetback*", "wichser", "wop*", "yed", "zabourah"]
    }
}
, function(e, t, n) {
    e.exports = {
        object: n(52),
        array: n(53),
        regex: n(54)
    }
}
, function(e, t) {
    e.exports = {
        "4r5e": 1,
        "5h1t": 1,
        "5hit": 1,
        a55: 1,
        anal: 1,
        anus: 1,
        ar5e: 1,
        arrse: 1,
        arse: 1,
        ass: 1,
        "ass-fucker": 1,
        asses: 1,
        assfucker: 1,
        assfukka: 1,
        asshole: 1,
        assholes: 1,
        asswhole: 1,
        a_s_s: 1,
        "b!tch": 1,
        b00bs: 1,
        b17ch: 1,
        b1tch: 1,
        ballbag: 1,
        balls: 1,
        ballsack: 1,
        bastard: 1,
        beastial: 1,
        beastiality: 1,
        bellend: 1,
        bestial: 1,
        bestiality: 1,
        "bi+ch": 1,
        biatch: 1,
        bitch: 1,
        bitcher: 1,
        bitchers: 1,
        bitches: 1,
        bitchin: 1,
        bitching: 1,
        bloody: 1,
        "blow job": 1,
        blowjob: 1,
        blowjobs: 1,
        boiolas: 1,
        bollock: 1,
        bollok: 1,
        boner: 1,
        boob: 1,
        boobs: 1,
        booobs: 1,
        boooobs: 1,
        booooobs: 1,
        booooooobs: 1,
        breasts: 1,
        buceta: 1,
        bugger: 1,
        bum: 1,
        "bunny fucker": 1,
        butt: 1,
        butthole: 1,
        buttmuch: 1,
        buttplug: 1,
        c0ck: 1,
        c0cksucker: 1,
        "carpet muncher": 1,
        cawk: 1,
        chink: 1,
        cipa: 1,
        cl1t: 1,
        clit: 1,
        clitoris: 1,
        clits: 1,
        cnut: 1,
        cock: 1,
        "cock-sucker": 1,
        cockface: 1,
        cockhead: 1,
        cockmunch: 1,
        cockmuncher: 1,
        cocks: 1,
        cocksuck: 1,
        cocksucked: 1,
        cocksucker: 1,
        cocksucking: 1,
        cocksucks: 1,
        cocksuka: 1,
        cocksukka: 1,
        cok: 1,
        cokmuncher: 1,
        coksucka: 1,
        coon: 1,
        cox: 1,
        crap: 1,
        cum: 1,
        cummer: 1,
        cumming: 1,
        cums: 1,
        cumshot: 1,
        cunilingus: 1,
        cunillingus: 1,
        cunnilingus: 1,
        cunt: 1,
        cuntlick: 1,
        cuntlicker: 1,
        cuntlicking: 1,
        cunts: 1,
        cyalis: 1,
        cyberfuc: 1,
        cyberfuck: 1,
        cyberfucked: 1,
        cyberfucker: 1,
        cyberfuckers: 1,
        cyberfucking: 1,
        d1ck: 1,
        damn: 1,
        dick: 1,
        dickhead: 1,
        dildo: 1,
        dildos: 1,
        dink: 1,
        dinks: 1,
        dirsa: 1,
        dlck: 1,
        "dog-fucker": 1,
        doggin: 1,
        dogging: 1,
        donkeyribber: 1,
        doosh: 1,
        duche: 1,
        dyke: 1,
        ejaculate: 1,
        ejaculated: 1,
        ejaculates: 1,
        ejaculating: 1,
        ejaculatings: 1,
        ejaculation: 1,
        ejakulate: 1,
        "f u c k": 1,
        "f u c k e r": 1,
        f4nny: 1,
        fag: 1,
        fagging: 1,
        faggitt: 1,
        faggot: 1,
        faggs: 1,
        fagot: 1,
        fagots: 1,
        fags: 1,
        fanny: 1,
        fannyflaps: 1,
        fannyfucker: 1,
        fanyy: 1,
        fatass: 1,
        fcuk: 1,
        fcuker: 1,
        fcuking: 1,
        feck: 1,
        fecker: 1,
        felching: 1,
        fellate: 1,
        fellatio: 1,
        fingerfuck: 1,
        fingerfucked: 1,
        fingerfucker: 1,
        fingerfuckers: 1,
        fingerfucking: 1,
        fingerfucks: 1,
        fistfuck: 1,
        fistfucked: 1,
        fistfucker: 1,
        fistfuckers: 1,
        fistfucking: 1,
        fistfuckings: 1,
        fistfucks: 1,
        flange: 1,
        fook: 1,
        fooker: 1,
        fuck: 1,
        fucka: 1,
        fucked: 1,
        fucker: 1,
        fuckers: 1,
        fuckhead: 1,
        fuckheads: 1,
        fuckin: 1,
        fucking: 1,
        fuckings: 1,
        fuckingshitmotherfucker: 1,
        fuckme: 1,
        fucks: 1,
        fuckwhit: 1,
        fuckwit: 1,
        "fudge packer": 1,
        fudgepacker: 1,
        fuk: 1,
        fuker: 1,
        fukker: 1,
        fukkin: 1,
        fuks: 1,
        fukwhit: 1,
        fukwit: 1,
        fux: 1,
        fux0r: 1,
        f_u_c_k: 1,
        gangbang: 1,
        gangbanged: 1,
        gangbangs: 1,
        gaylord: 1,
        gaysex: 1,
        goatse: 1,
        God: 1,
        "god-dam": 1,
        "god-damned": 1,
        goddamn: 1,
        goddamned: 1,
        hardcoresex: 1,
        hell: 1,
        heshe: 1,
        hoar: 1,
        hoare: 1,
        hoer: 1,
        homo: 1,
        hore: 1,
        horniest: 1,
        horny: 1,
        hotsex: 1,
        "jack-off": 1,
        jackoff: 1,
        jap: 1,
        "jerk-off": 1,
        jism: 1,
        jiz: 1,
        jizm: 1,
        jizz: 1,
        kawk: 1,
        knob: 1,
        knobead: 1,
        knobed: 1,
        knobend: 1,
        knobhead: 1,
        knobjocky: 1,
        knobjokey: 1,
        kock: 1,
        kondum: 1,
        kondums: 1,
        kum: 1,
        kummer: 1,
        kumming: 1,
        kums: 1,
        kunilingus: 1,
        "l3i+ch": 1,
        l3itch: 1,
        labia: 1,
        lust: 1,
        lusting: 1,
        m0f0: 1,
        m0fo: 1,
        m45terbate: 1,
        ma5terb8: 1,
        ma5terbate: 1,
        masochist: 1,
        "master-bate": 1,
        masterb8: 1,
        "masterbat*": 1,
        masterbat3: 1,
        masterbate: 1,
        masterbation: 1,
        masterbations: 1,
        masturbate: 1,
        "mo-fo": 1,
        mof0: 1,
        mofo: 1,
        mothafuck: 1,
        mothafucka: 1,
        mothafuckas: 1,
        mothafuckaz: 1,
        mothafucked: 1,
        mothafucker: 1,
        mothafuckers: 1,
        mothafuckin: 1,
        mothafucking: 1,
        mothafuckings: 1,
        mothafucks: 1,
        "mother fucker": 1,
        motherfuck: 1,
        motherfucked: 1,
        motherfucker: 1,
        motherfuckers: 1,
        motherfuckin: 1,
        motherfucking: 1,
        motherfuckings: 1,
        motherfuckka: 1,
        motherfucks: 1,
        muff: 1,
        mutha: 1,
        muthafecker: 1,
        muthafuckker: 1,
        muther: 1,
        mutherfucker: 1,
        n1gga: 1,
        n1gger: 1,
        nazi: 1,
        nigg3r: 1,
        nigg4h: 1,
        nigga: 1,
        niggah: 1,
        niggas: 1,
        niggaz: 1,
        nigger: 1,
        niggers: 1,
        nob: 1,
        "nob jokey": 1,
        nobhead: 1,
        nobjocky: 1,
        nobjokey: 1,
        numbnuts: 1,
        nutsack: 1,
        orgasim: 1,
        orgasims: 1,
        orgasm: 1,
        orgasms: 1,
        p0rn: 1,
        pawn: 1,
        pecker: 1,
        penis: 1,
        penisfucker: 1,
        phonesex: 1,
        phuck: 1,
        phuk: 1,
        phuked: 1,
        phuking: 1,
        phukked: 1,
        phukking: 1,
        phuks: 1,
        phuq: 1,
        pigfucker: 1,
        pimpis: 1,
        piss: 1,
        pissed: 1,
        pisser: 1,
        pissers: 1,
        pisses: 1,
        pissflaps: 1,
        pissin: 1,
        pissing: 1,
        pissoff: 1,
        poop: 1,
        porn: 1,
        porno: 1,
        pornography: 1,
        pornos: 1,
        prick: 1,
        pricks: 1,
        pron: 1,
        pube: 1,
        pusse: 1,
        pussi: 1,
        pussies: 1,
        pussy: 1,
        pussys: 1,
        rectum: 1,
        retard: 1,
        rimjaw: 1,
        rimming: 1,
        "s hit": 1,
        "s.o.b.": 1,
        sadist: 1,
        schlong: 1,
        screwing: 1,
        scroat: 1,
        scrote: 1,
        scrotum: 1,
        semen: 1,
        sex: 1,
        "sh!+": 1,
        "sh!t": 1,
        sh1t: 1,
        shag: 1,
        shagger: 1,
        shaggin: 1,
        shagging: 1,
        shemale: 1,
        "shi+": 1,
        shit: 1,
        shitdick: 1,
        shite: 1,
        shited: 1,
        shitey: 1,
        shitfuck: 1,
        shitfull: 1,
        shithead: 1,
        shiting: 1,
        shitings: 1,
        shits: 1,
        shitted: 1,
        shitter: 1,
        shitters: 1,
        shitting: 1,
        shittings: 1,
        shitty: 1,
        skank: 1,
        slut: 1,
        sluts: 1,
        smegma: 1,
        smut: 1,
        snatch: 1,
        "son-of-a-bitch": 1,
        spac: 1,
        spunk: 1,
        s_h_i_t: 1,
        t1tt1e5: 1,
        t1tties: 1,
        teets: 1,
        teez: 1,
        testical: 1,
        testicle: 1,
        tit: 1,
        titfuck: 1,
        tits: 1,
        titt: 1,
        tittie5: 1,
        tittiefucker: 1,
        titties: 1,
        tittyfuck: 1,
        tittywank: 1,
        titwank: 1,
        tosser: 1,
        turd: 1,
        tw4t: 1,
        twat: 1,
        twathead: 1,
        twatty: 1,
        twunt: 1,
        twunter: 1,
        v14gra: 1,
        v1gra: 1,
        vagina: 1,
        viagra: 1,
        vulva: 1,
        w00se: 1,
        wang: 1,
        wank: 1,
        wanker: 1,
        wanky: 1,
        whoar: 1,
        whore: 1,
        willies: 1,
        willy: 1,
        xrated: 1,
        xxx: 1
    }
}
, function(e, t) {
    e.exports = ["4r5e", "5h1t", "5hit", "a55", "anal", "anus", "ar5e", "arrse", "arse", "ass", "ass-fucker", "asses", "assfucker", "assfukka", "asshole", "assholes", "asswhole", "a_s_s", "b!tch", "b00bs", "b17ch", "b1tch", "ballbag", "balls", "ballsack", "bastard", "beastial", "beastiality", "bellend", "bestial", "bestiality", "bi+ch", "biatch", "bitch", "bitcher", "bitchers", "bitches", "bitchin", "bitching", "bloody", "blow job", "blowjob", "blowjobs", "boiolas", "bollock", "bollok", "boner", "boob", "boobs", "booobs", "boooobs", "booooobs", "booooooobs", "breasts", "buceta", "bugger", "bum", "bunny fucker", "butt", "butthole", "buttmuch", "buttplug", "c0ck", "c0cksucker", "carpet muncher", "cawk", "chink", "cipa", "cl1t", "clit", "clitoris", "clits", "cnut", "cock", "cock-sucker", "cockface", "cockhead", "cockmunch", "cockmuncher", "cocks", "cocksuck", "cocksucked", "cocksucker", "cocksucking", "cocksucks", "cocksuka", "cocksukka", "cok", "cokmuncher", "coksucka", "coon", "cox", "crap", "cum", "cummer", "cumming", "cums", "cumshot", "cunilingus", "cunillingus", "cunnilingus", "cunt", "cuntlick", "cuntlicker", "cuntlicking", "cunts", "cyalis", "cyberfuc", "cyberfuck", "cyberfucked", "cyberfucker", "cyberfuckers", "cyberfucking", "d1ck", "damn", "dick", "dickhead", "dildo", "dildos", "dink", "dinks", "dirsa", "dlck", "dog-fucker", "doggin", "dogging", "donkeyribber", "doosh", "duche", "dyke", "ejaculate", "ejaculated", "ejaculates", "ejaculating", "ejaculatings", "ejaculation", "ejakulate", "f u c k", "f u c k e r", "f4nny", "fag", "fagging", "faggitt", "faggot", "faggs", "fagot", "fagots", "fags", "fanny", "fannyflaps", "fannyfucker", "fanyy", "fatass", "fcuk", "fcuker", "fcuking", "feck", "fecker", "felching", "fellate", "fellatio", "fingerfuck", "fingerfucked", "fingerfucker", "fingerfuckers", "fingerfucking", "fingerfucks", "fistfuck", "fistfucked", "fistfucker", "fistfuckers", "fistfucking", "fistfuckings", "fistfucks", "flange", "fook", "fooker", "fuck", "fucka", "fucked", "fucker", "fuckers", "fuckhead", "fuckheads", "fuckin", "fucking", "fuckings", "fuckingshitmotherfucker", "fuckme", "fucks", "fuckwhit", "fuckwit", "fudge packer", "fudgepacker", "fuk", "fuker", "fukker", "fukkin", "fuks", "fukwhit", "fukwit", "fux", "fux0r", "f_u_c_k", "gangbang", "gangbanged", "gangbangs", "gaylord", "gaysex", "goatse", "God", "god-dam", "god-damned", "goddamn", "goddamned", "hardcoresex", "hell", "heshe", "hoar", "hoare", "hoer", "homo", "hore", "horniest", "horny", "hotsex", "jack-off", "jackoff", "jap", "jerk-off", "jism", "jiz", "jizm", "jizz", "kawk", "knob", "knobead", "knobed", "knobend", "knobhead", "knobjocky", "knobjokey", "kock", "kondum", "kondums", "kum", "kummer", "kumming", "kums", "kunilingus", "l3i+ch", "l3itch", "labia", "lust", "lusting", "m0f0", "m0fo", "m45terbate", "ma5terb8", "ma5terbate", "masochist", "master-bate", "masterb8", "masterbat*", "masterbat3", "masterbate", "masterbation", "masterbations", "masturbate", "mo-fo", "mof0", "mofo", "mothafuck", "mothafucka", "mothafuckas", "mothafuckaz", "mothafucked", "mothafucker", "mothafuckers", "mothafuckin", "mothafucking", "mothafuckings", "mothafucks", "mother fucker", "motherfuck", "motherfucked", "motherfucker", "motherfuckers", "motherfuckin", "motherfucking", "motherfuckings", "motherfuckka", "motherfucks", "muff", "mutha", "muthafecker", "muthafuckker", "muther", "mutherfucker", "n1gga", "n1gger", "nazi", "nigg3r", "nigg4h", "nigga", "niggah", "niggas", "niggaz", "nigger", "niggers", "nob", "nob jokey", "nobhead", "nobjocky", "nobjokey", "numbnuts", "nutsack", "orgasim", "orgasims", "orgasm", "orgasms", "p0rn", "pawn", "pecker", "penis", "penisfucker", "phonesex", "phuck", "phuk", "phuked", "phuking", "phukked", "phukking", "phuks", "phuq", "pigfucker", "pimpis", "piss", "pissed", "pisser", "pissers", "pisses", "pissflaps", "pissin", "pissing", "pissoff", "poop", "porn", "porno", "pornography", "pornos", "prick", "pricks", "pron", "pube", "pusse", "pussi", "pussies", "pussy", "pussys", "rectum", "retard", "rimjaw", "rimming", "s hit", "s.o.b.", "sadist", "schlong", "screwing", "scroat", "scrote", "scrotum", "semen", "sex", "sh!+", "sh!t", "sh1t", "shag", "shagger", "shaggin", "shagging", "shemale", "shi+", "shit", "shitdick", "shite", "shited", "shitey", "shitfuck", "shitfull", "shithead", "shiting", "shitings", "shits", "shitted", "shitter", "shitters", "shitting", "shittings", "shitty", "skank", "slut", "sluts", "smegma", "smut", "snatch", "son-of-a-bitch", "spac", "spunk", "s_h_i_t", "t1tt1e5", "t1tties", "teets", "teez", "testical", "testicle", "tit", "titfuck", "tits", "titt", "tittie5", "tittiefucker", "titties", "tittyfuck", "tittywank", "titwank", "tosser", "turd", "tw4t", "twat", "twathead", "twatty", "twunt", "twunter", "v14gra", "v1gra", "vagina", "viagra", "vulva", "w00se", "wang", "wank", "wanker", "wanky", "whoar", "whore", "willies", "willy", "xrated", "xxx"]
}
, function(e, t) {
    e.exports = /\b(4r5e|5h1t|5hit|a55|anal|anus|ar5e|arrse|arse|ass|ass-fucker|asses|assfucker|assfukka|asshole|assholes|asswhole|a_s_s|b!tch|b00bs|b17ch|b1tch|ballbag|balls|ballsack|bastard|beastial|beastiality|bellend|bestial|bestiality|bi\+ch|biatch|bitch|bitcher|bitchers|bitches|bitchin|bitching|bloody|blow job|blowjob|blowjobs|boiolas|bollock|bollok|boner|boob|boobs|booobs|boooobs|booooobs|booooooobs|breasts|buceta|bugger|bum|bunny fucker|butt|butthole|buttmuch|buttplug|c0ck|c0cksucker|carpet muncher|cawk|chink|cipa|cl1t|clit|clitoris|clits|cnut|cock|cock-sucker|cockface|cockhead|cockmunch|cockmuncher|cocks|cocksuck|cocksucked|cocksucker|cocksucking|cocksucks|cocksuka|cocksukka|cok|cokmuncher|coksucka|coon|cox|crap|cum|cummer|cumming|cums|cumshot|cunilingus|cunillingus|cunnilingus|cunt|cuntlick|cuntlicker|cuntlicking|cunts|cyalis|cyberfuc|cyberfuck|cyberfucked|cyberfucker|cyberfuckers|cyberfucking|d1ck|damn|dick|dickhead|dildo|dildos|dink|dinks|dirsa|dlck|dog-fucker|doggin|dogging|donkeyribber|doosh|duche|dyke|ejaculate|ejaculated|ejaculates|ejaculating|ejaculatings|ejaculation|ejakulate|f u c k|f u c k e r|f4nny|fag|fagging|faggitt|faggot|faggs|fagot|fagots|fags|fanny|fannyflaps|fannyfucker|fanyy|fatass|fcuk|fcuker|fcuking|feck|fecker|felching|fellate|fellatio|fingerfuck|fingerfucked|fingerfucker|fingerfuckers|fingerfucking|fingerfucks|fistfuck|fistfucked|fistfucker|fistfuckers|fistfucking|fistfuckings|fistfucks|flange|fook|fooker|fuck|fucka|fucked|fucker|fuckers|fuckhead|fuckheads|fuckin|fucking|fuckings|fuckingshitmotherfucker|fuckme|fucks|fuckwhit|fuckwit|fudge packer|fudgepacker|fuk|fuker|fukker|fukkin|fuks|fukwhit|fukwit|fux|fux0r|f_u_c_k|gangbang|gangbanged|gangbangs|gaylord|gaysex|goatse|God|god-dam|god-damned|goddamn|goddamned|hardcoresex|hell|heshe|hoar|hoare|hoer|homo|hore|horniest|horny|hotsex|jack-off|jackoff|jap|jerk-off|jism|jiz|jizm|jizz|kawk|knob|knobead|knobed|knobend|knobhead|knobjocky|knobjokey|kock|kondum|kondums|kum|kummer|kumming|kums|kunilingus|l3i\+ch|l3itch|labia|lust|lusting|m0f0|m0fo|m45terbate|ma5terb8|ma5terbate|masochist|master-bate|masterb8|masterbat*|masterbat3|masterbate|masterbation|masterbations|masturbate|mo-fo|mof0|mofo|mothafuck|mothafucka|mothafuckas|mothafuckaz|mothafucked|mothafucker|mothafuckers|mothafuckin|mothafucking|mothafuckings|mothafucks|mother fucker|motherfuck|motherfucked|motherfucker|motherfuckers|motherfuckin|motherfucking|motherfuckings|motherfuckka|motherfucks|muff|mutha|muthafecker|muthafuckker|muther|mutherfucker|n1gga|n1gger|nazi|nigg3r|nigg4h|nigga|niggah|niggas|niggaz|nigger|niggers|nob|nob jokey|nobhead|nobjocky|nobjokey|numbnuts|nutsack|orgasim|orgasims|orgasm|orgasms|p0rn|pawn|pecker|penis|penisfucker|phonesex|phuck|phuk|phuked|phuking|phukked|phukking|phuks|phuq|pigfucker|pimpis|piss|pissed|pisser|pissers|pisses|pissflaps|pissin|pissing|pissoff|poop|porn|porno|pornography|pornos|prick|pricks|pron|pube|pusse|pussi|pussies|pussy|pussys|rectum|retard|rimjaw|rimming|s hit|s.o.b.|sadist|schlong|screwing|scroat|scrote|scrotum|semen|sex|sh!\+|sh!t|sh1t|shag|shagger|shaggin|shagging|shemale|shi\+|shit|shitdick|shite|shited|shitey|shitfuck|shitfull|shithead|shiting|shitings|shits|shitted|shitter|shitters|shitting|shittings|shitty|skank|slut|sluts|smegma|smut|snatch|son-of-a-bitch|spac|spunk|s_h_i_t|t1tt1e5|t1tties|teets|teez|testical|testicle|tit|titfuck|tits|titt|tittie5|tittiefucker|titties|tittyfuck|tittywank|titwank|tosser|turd|tw4t|twat|twathead|twatty|twunt|twunter|v14gra|v1gra|vagina|viagra|vulva|w00se|wang|wank|wanker|wanky|whoar|whore|willies|willy|xrated|xxx)\b/gi
}
, function(e, t) {
    e.exports.hats = [{
        id: 45,
        name: "Shame!",
        dontSell: !0,
        price: 0,
        scale: 120,
        desc: "hacks are for losers"
    }, {
        id: 51,
        name: "Moo Cap",
        price: 0,
        scale: 120,
        desc: "coolest mooer around"
    }, {
        id: 50,
        name: "Apple Cap",
        price: 0,
        scale: 120,
        desc: "apple farms remembers"
    }, {
        id: 28,
        name: "Moo Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 29,
        name: "Pig Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 30,
        name: "Fluff Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 36,
        name: "Pandou Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 37,
        name: "Bear Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 38,
        name: "Monkey Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 44,
        name: "Polar Head",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 35,
        name: "Fez Hat",
        price: 0,
        scale: 120,
        desc: "no effect"
    }, {
        id: 42,
        name: "Enigma Hat",
        price: 0,
        scale: 120,
        desc: "join the enigma army"
    }, {
        id: 43,
        name: "Blitz Hat",
        price: 0,
        scale: 120,
        desc: "hey everybody i'm blitz"
    }, {
        id: 49,
        name: "Bob XIII Hat",
        price: 0,
        scale: 120,
        desc: "like and subscribe"
    }, {
        id: 57,
        name: "Pumpkin",
        price: 50,
        scale: 120,
        desc: "Spooooky"
    }, {
        id: 8,
        name: "Bummle Hat",
        price: 100,
        scale: 120,
        desc: "no effect"
    }, {
        id: 2,
        name: "Straw Hat",
        price: 500,
        scale: 120,
        desc: "no effect"
    }, {
        id: 15,
        name: "Winter Cap",
        price: 600,
        scale: 120,
        desc: "allows you to move at normal speed in snow",
        coldM: 1
    }, {
        id: 5,
        name: "Cowboy Hat",
        price: 1e3,
        scale: 120,
        desc: "no effect"
    }, {
        id: 4,
        name: "Ranger Hat",
        price: 2e3,
        scale: 120,
        desc: "no effect"
    }, {
        id: 18,
        name: "Explorer Hat",
        price: 2e3,
        scale: 120,
        desc: "no effect"
    }, {
        id: 31,
        name: "Flipper Hat",
        price: 2500,
        scale: 120,
        desc: "have more control while in water",
        watrImm: !0
    }, {
        id: 1,
        name: "Marksman Cap",
        price: 3e3,
        scale: 120,
        desc: "increases arrow speed and range",
        aMlt: 1.3
    }, {
        id: 10,
        name: "Bush Gear",
        price: 3e3,
        scale: 160,
        desc: "allows you to disguise yourself as a bush"
    }, {
        id: 48,
        name: "Halo",
        price: 3e3,
        scale: 120,
        desc: "no effect"
    }, {
        id: 6,
        name: "Soldier Helmet",
        price: 4e3,
        scale: 120,
        desc: "reduces damage taken but slows movement",
        spdMult: .94,
        dmgMult: .75
    }, {
        id: 23,
        name: "Anti Venom Gear",
        price: 4e3,
        scale: 120,
        desc: "makes you immune to poison",
        poisonRes: 1
    }, {
        id: 13,
        name: "Medic Gear",
        price: 5e3,
        scale: 110,
        desc: "slowly regenerates health over time",
        healthRegen: 3
    }, {
        id: 9,
        name: "Miners Helmet",
        price: 5e3,
        scale: 120,
        desc: "earn 1 extra gold per resource",
        extraGold: 1
    }, {
        id: 32,
        name: "Musketeer Hat",
        price: 5e3,
        scale: 120,
        desc: "reduces cost of projectiles",
        projCost: .5
    }, {
        id: 7,
        name: "Bull Helmet",
        price: 6e3,
        scale: 120,
        desc: "increases damage done but drains health",
        healthRegen: -5,
        dmgMultO: 1.5,
        spdMult: .96
    }, {
        id: 22,
        name: "Emp Helmet",
        price: 6e3,
        scale: 120,
        desc: "turrets won't attack but you move slower",
        antiTurret: 1,
        spdMult: .7
    }, {
        id: 12,
        name: "Booster Hat",
        price: 6e3,
        scale: 120,
        desc: "increases your movement speed",
        spdMult: 1.16
    }, {
        id: 26,
        name: "Barbarian Armor",
        price: 8e3,
        scale: 120,
        desc: "knocks back enemies that attack you",
        dmgK: .6
    }, {
        id: 21,
        name: "Plague Mask",
        price: 1e4,
        scale: 120,
        desc: "melee attacks deal poison damage",
        poisonDmg: 5,
        poisonTime: 6
    }, {
        id: 46,
        name: "Bull Mask",
        price: 1e4,
        scale: 120,
        desc: "bulls won't target you unless you attack them",
        bullRepel: 1
    }, {
        id: 14,
        name: "Windmill Hat",
        topSprite: !0,
        price: 1e4,
        scale: 120,
        desc: "generates points while worn",
        pps: 1.5
    }, {
        id: 11,
        name: "Spike Gear",
        topSprite: !0,
        price: 1e4,
        scale: 120,
        desc: "deal damage to players that damage you",
        dmg: .45
    }, {
        id: 53,
        name: "Turret Gear",
        topSprite: !0,
        price: 1e4,
        scale: 120,
        desc: "you become a walking turret",
        turret: {
            proj: 1,
            range: 700,
            rate: 2500
        },
        spdMult: .7
    }, {
        id: 20,
        name: "Samurai Armor",
        price: 12e3,
        scale: 120,
        desc: "increased attack speed and fire rate",
        atkSpd: .78
    }, {
        id: 58,
        name: "Dark Knight",
        price: 12e3,
        scale: 120,
        desc: "restores health when you deal damage",
        healD: .4
    }, {
        id: 27,
        name: "Scavenger Gear",
        price: 15e3,
        scale: 120,
        desc: "earn double points for each kill",
        kScrM: 2
    }, {
        id: 40,
        name: "Tank Gear",
        price: 15e3,
        scale: 120,
        desc: "increased damage to buildings but slower movement",
        spdMult: .3,
        bDmg: 3.3
    }, {
        id: 52,
        name: "Thief Gear",
        price: 15e3,
        scale: 120,
        desc: "steal half of a players gold when you kill them",
        goldSteal: .5
    }, {
        id: 55,
        name: "Bloodthirster",
        price: 2e4,
        scale: 120,
        desc: "Restore Health when dealing damage. And increased damage",
        healD: .25,
        dmgMultO: 1.2
    }, {
        id: 56,
        name: "Assassin Gear",
        price: 2e4,
        scale: 120,
        desc: "Go invisible when not moving. Can't eat. Increased speed",
        noEat: !0,
        spdMult: 1.1,
        invisTimer: 1e3
    }],
    e.exports.accessories = [{
        id: 12,
        name: "Snowball",
        price: 1e3,
        scale: 105,
        xOff: 18,
        desc: "no effect"
    }, {
        id: 9,
        name: "Tree Cape",
        price: 1e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 10,
        name: "Stone Cape",
        price: 1e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 3,
        name: "Cookie Cape",
        price: 1500,
        scale: 90,
        desc: "no effect"
    }, {
        id: 8,
        name: "Cow Cape",
        price: 2e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 11,
        name: "Monkey Tail",
        price: 2e3,
        scale: 97,
        xOff: 25,
        desc: "Super speed but reduced damage",
        spdMult: 1.35,
        dmgMultO: .2
    }, {
        id: 17,
        name: "Apple Basket",
        price: 3e3,
        scale: 80,
        xOff: 12,
        desc: "slowly regenerates health over time",
        healthRegen: 1
    }, {
        id: 6,
        name: "Winter Cape",
        price: 3e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 4,
        name: "Skull Cape",
        price: 4e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 5,
        name: "Dash Cape",
        price: 5e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 2,
        name: "Dragon Cape",
        price: 6e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 1,
        name: "Super Cape",
        price: 8e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 7,
        name: "Troll Cape",
        price: 8e3,
        scale: 90,
        desc: "no effect"
    }, {
        id: 14,
        name: "Thorns",
        price: 1e4,
        scale: 115,
        xOff: 20,
        desc: "no effect"
    }, {
        id: 15,
        name: "Blockades",
        price: 1e4,
        scale: 95,
        xOff: 15,
        desc: "no effect"
    }, {
        id: 20,
        name: "Devils Tail",
        price: 1e4,
        scale: 95,
        xOff: 20,
        desc: "no effect"
    }, {
        id: 16,
        name: "Sawblade",
        price: 12e3,
        scale: 90,
        spin: !0,
        xOff: 0,
        desc: "deal damage to players that damage you",
        dmg: .15
    }, {
        id: 13,
        name: "Angel Wings",
        price: 15e3,
        scale: 138,
        xOff: 22,
        desc: "slowly regenerates health over time",
        healthRegen: 3
    }, {
        id: 19,
        name: "Shadow Wings",
        price: 15e3,
        scale: 138,
        xOff: 22,
        desc: "increased movement speed",
        spdMult: 1.1
    }, {
        id: 18,
        name: "Blood Wings",
        price: 2e4,
        scale: 178,
        xOff: 26,
        desc: "restores health when you deal damage",
        healD: .2
    }, {
        id: 21,
        name: "Corrupt X Wings",
        price: 2e4,
        scale: 178,
        xOff: 26,
        desc: "deal damage to players that damage you",
        dmg: .25
    }]
}
, function(e, t) {
    e.exports = function(e, t, n, i, r, s, a) {
        this.init = function(e, t, n, i, r, s, o, c, l) {
            this.active = !0,
            this.indx = e,
            this.x = t,
            this.y = n,
            this.dir = i,
            this.skipMov = !0,
            this.speed = r,
            this.dmg = s,
            this.scale = c,
            this.range = o,
            this.owner = l,
            a && (this.sentTo = {})
        }
        ;
        var o, c = [];
        this.update = function(l) {
            if (this.active) {
                var h, u = this.speed * l;
                if (this.skipMov ? this.skipMov = !1 : (this.x += u * Math.cos(this.dir),
                this.y += u * Math.sin(this.dir),
                this.range -= u,
                this.range <= 0 && (this.x += this.range * Math.cos(this.dir),
                this.y += this.range * Math.sin(this.dir),
                u = 1,
                this.range = 0,
                this.active = !1)),
                a) {
                    for (var f = 0; f < e.length; ++f)
                        !this.sentTo[e[f].id] && e[f].canSee(this) && (this.sentTo[e[f].id] = 1,
                        a.send(e[f].id, "18", s.fixTo(this.x, 1), s.fixTo(this.y, 1), s.fixTo(this.dir, 2), s.fixTo(this.range, 1), this.speed, this.indx, this.layer, this.sid));
                    for (c.length = 0,
                    f = 0; f < e.length + t.length; ++f)
                        !(o = e[f] || t[f - e.length]).alive || o == this.owner || this.owner.team && o.team == this.owner.team || s.lineInRect(o.x - o.scale, o.y - o.scale, o.x + o.scale, o.y + o.scale, this.x, this.y, this.x + u * Math.cos(this.dir), this.y + u * Math.sin(this.dir)) && c.push(o);
                    for (var d = n.getGridArrays(this.x, this.y, this.scale), p = 0; p < d.length; ++p)
                        for (var g = 0; g < d[p].length; ++g)
                            h = (o = d[p][g]).getScale(),
                            o.active && this.ignoreObj != o.sid && this.layer <= o.layer && c.indexOf(o) < 0 && !o.ignoreCollision && s.lineInRect(o.x - h, o.y - h, o.x + h, o.y + h, this.x, this.y, this.x + u * Math.cos(this.dir), this.y + u * Math.sin(this.dir)) && c.push(o);
                    if (c.length > 0) {
                        var m = null
                          , y = null
                          , k = null;
                        for (f = 0; f < c.length; ++f)
                            k = s.getDistance(this.x, this.y, c[f].x, c[f].y),
                            (null == y || k < y) && (y = k,
                            m = c[f]);
                        if (m.isPlayer || m.isAI) {
                            var v = .3 * (m.weightM || 1);
                            m.xVel += v * Math.cos(this.dir),
                            m.yVel += v * Math.sin(this.dir),
                            null != m.weaponIndex && i.weapons[m.weaponIndex].shield && s.getAngleDist(this.dir + Math.PI, m.dir) <= r.shieldAngle || m.changeHealth(-this.dmg, this.owner, this.owner)
                        } else
                            for (m.projDmg && m.health && m.changeHealth(-this.dmg) && n.disableObj(m),
                            f = 0; f < e.length; ++f)
                                e[f].active && (m.sentTo[e[f].id] && (m.active ? e[f].canSee(m) && a.send(e[f].id, "8", s.fixTo(this.dir, 2), m.sid) : a.send(e[f].id, "12", m.sid)),
                                m.active || m.owner != e[f] || e[f].changeItemCount(m.group.id, -1));
                        for (this.active = !1,
                        f = 0; f < e.length; ++f)
                            this.sentTo[e[f].id] && a.send(e[f].id, "19", this.sid, s.fixTo(y, 1))
                    }
                }
            }
        }
    }
}
, function(e, t) {
    e.exports = function(e, t, n, i, r, s, a, o, c) {
        this.addProjectile = function(l, h, u, f, d, p, g, m, y) {
            for (var k, v = s.projectiles[p], w = 0; w < t.length; ++w)
                if (!t[w].active) {
                    k = t[w];
                    break
                }
            return k || ((k = new e(n,i,r,s,a,o,c)).sid = t.length,
            t.push(k)),
            k.init(p, l, h, u, d, v.dmg, f, v.scale, g),
            k.ignoreObj = m,
            k.layer = y || v.layer,
            k.src = v.src,
            k
        }
    }
}
, function(e, t) {
    e.exports.obj = function(e, t) {
        var n;
        this.sounds = [],
        this.active = !0,
        this.play = function(t, i, r) {
            i && this.active && ((n = this.sounds[t]) || (n = new Howl({
                src: ".././sound/" + t + ".mp3"
            }),
            this.sounds[t] = n),
            r && n.isPlaying || (n.isPlaying = !0,
            n.play(),
            n.volume((i || 1) * e.volumeMult),
            n.loop(r)))
        }
        ,
        this.toggleMute = function(e, t) {
            (n = this.sounds[e]) && n.mute(t)
        }
        ,
        this.stop = function(e) {
            (n = this.sounds[e]) && (n.stop(),
            n.isPlaying = !1)
        }
    }
}
, function(e, t, n) {
    var i = n(60)
      , r = n(67);
    function s(e, t, n, i, r) {
        "localhost" == location.hostname && (window.location.hostname = "127.0.0.1"),
        this.debugLog = !1,
        this.baseUrl = e,
        this.lobbySize = n,
        this.devPort = t,
        this.lobbySpread = i,
        this.rawIPs = !!r,
        this.server = void 0,
        this.gameIndex = void 0,
        this.callback = void 0,
        this.errorCallback = void 0,
        this.processServers(vultr.servers)
    }
    s.prototype.regionInfo = {
        0: {
            name: "Local",
            latitude: 0,
            longitude: 0
        },
        "vultr:1": {
            name: "New Jersey",
            latitude: 40.1393329,
            longitude: -75.8521818
        },
        "vultr:2": {
            name: "Chicago",
            latitude: 41.8339037,
            longitude: -87.872238
        },
        "vultr:3": {
            name: "Dallas",
            latitude: 32.8208751,
            longitude: -96.8714229
        },
        "vultr:4": {
            name: "Seattle",
            latitude: 47.6149942,
            longitude: -122.4759879
        },
        "vultr:5": {
            name: "Los Angeles",
            latitude: 34.0207504,
            longitude: -118.691914
        },
        "vultr:6": {
            name: "Atlanta",
            latitude: 33.7676334,
            longitude: -84.5610332
        },
        "vultr:7": {
            name: "Amsterdam",
            latitude: 52.3745287,
            longitude: 4.7581878
        },
        "vultr:8": {
            name: "London",
            latitude: 51.5283063,
            longitude: -.382486
        },
        "vultr:9": {
            name: "Frankfurt",
            latitude: 50.1211273,
            longitude: 8.496137
        },
        "vultr:12": {
            name: "Silicon Valley",
            latitude: 37.4024714,
            longitude: -122.3219752
        },
        "vultr:19": {
            name: "Sydney",
            latitude: -33.8479715,
            longitude: 150.651084
        },
        "vultr:24": {
            name: "Paris",
            latitude: 48.8588376,
            longitude: 2.2773454
        },
        "vultr:25": {
            name: "Tokyo",
            latitude: 35.6732615,
            longitude: 139.569959
        },
        "vultr:39": {
            name: "Miami",
            latitude: 25.7823071,
            longitude: -80.3012156
        },
        "vultr:40": {
            name: "Singapore",
            latitude: 1.3147268,
            longitude: 103.7065876
        }
    },
    s.prototype.start = function(e, t) {
        this.callback = e,
        this.errorCallback = t;
        var n = this.parseServerQuery();
        n ? (this.log("Found server in query."),
        this.password = n[3],
        this.connect(n[0], n[1], n[2])) : (this.log("Pinging servers..."),
        this.pingServers())
    }
    ,
    s.prototype.parseServerQuery = function() {
        var e = i.parse(location.href, !0)
          , t = e.query.server;
        if ("string" == typeof t) {
            var n = t.split(":");
            if (3 == n.length) {
                var r = n[0]
                  , s = parseInt(n[1])
                  , a = parseInt(n[2]);
                return "0" == r || r.startsWith("vultr:") || (r = "vultr:" + r),
                [r, s, a, e.query.password]
            }
            this.errorCallback("Invalid number of server parameters in " + t)
        }
    }
    ,
    s.prototype.findServer = function(e, t) {
        var n = this.servers[e];
        if (Array.isArray(n)) {
            for (var i = 0; i < n.length; i++) {
                var r = n[i];
                if (r.index == t)
                    return r
            }
            console.warn("Could not find server in region " + e + " with index " + t + ".")
        } else
            this.errorCallback("No server list for region " + e)
    }
    ,
    s.prototype.pingServers = function() {
        var e = this
          , t = [];
        for (var n in this.servers)
            if (this.servers.hasOwnProperty(n)) {
                var i = this.servers[n]
                  , r = i[Math.floor(Math.random() * i.length)];
                null != r ? function(i, r) {
                    var s = new XMLHttpRequest;
                    s.onreadystatechange = function(i) {
                        var s = i.target;
                        if (4 == s.readyState)
                            if (200 == s.status) {
                                for (var a = 0; a < t.length; a++)
                                    t[a].abort();
                                e.log("Connecting to region", r.region);
                                var o = e.seekServer(r.region);
                                e.connect(o[0], o[1], o[2])
                            } else
                                console.warn("Error pinging " + r.ip + " in region " + n)
                    }
                    ;
                    var a = "//" + e.serverAddress(r.ip, !0) + ":" + e.serverPort(r) + "/ping";
                    s.open("GET", a, !0),
                    s.send(null),
                    e.log("Pinging", a),
                    t.push(s)
                }(0, r) : console.log("No target server for region " + n)
            }
    }
    ,
    s.prototype.seekServer = function(e, t, n) {
        null == n && (n = "random"),
        null == t && (t = !1);
        const i = ["random"];
        var r = this.lobbySize
          , s = this.lobbySpread
          , a = this.servers[e].flatMap((function(e) {
            var t = 0;
            return e.games.map((function(n) {
                var i = t++;
                return {
                    region: e.region,
                    index: e.index * e.games.length + i,
                    gameIndex: i,
                    gameCount: e.games.length,
                    playerCount: n.playerCount,
                    isPrivate: n.isPrivate
                }
            }
            ))
        }
        )).filter((function(e) {
            return !e.isPrivate
        }
        )).filter((function(e) {
            return !t || 0 == e.playerCount && e.gameIndex >= e.gameCount / 2
        }
        )).filter((function(e) {
            return "random" == n || i[e.index % i.length].key == n
        }
        )).sort((function(e, t) {
            return t.playerCount - e.playerCount
        }
        )).filter((function(e) {
            return e.playerCount < r
        }
        ));
        if (t && a.reverse(),
        0 != a.length) {
            var o = Math.min(s, a.length)
              , c = Math.floor(Math.random() * o)
              , l = a[c = Math.min(c, a.length - 1)]
              , h = l.region
              , u = (c = Math.floor(l.index / l.gameCount),
            l.index % l.gameCount);
            return this.log("Found server."),
            [h, c, u]
        }
        this.errorCallback("No open servers.")
    }
    ,
    s.prototype.connect = function(e, t, n) {
        if (!this.connected) {
            var i = this.findServer(e, t);
            null != i ? (this.log("Connecting to server", i, "with game index", n),
            i.games[n].playerCount >= this.lobbySize ? this.errorCallback("Server is already full.") : (window.history.replaceState(document.title, document.title, this.generateHref(e, t, n, this.password)),
            this.server = i,
            this.gameIndex = n,
            this.log("Calling callback with address", this.serverAddress(i.ip), "on port", this.serverPort(i), "with game index", n),
            this.callback(this.serverAddress(i.ip), this.serverPort(i), n))) : this.errorCallback("Failed to find server for region " + e + " and index " + t)
        }
    }
    ,
    s.prototype.switchServer = function(e, t, n, i) {
        this.switchingServers = !0,
        window.location.href = this.generateHref(e, t, n, i)
    }
    ,
    s.prototype.generateHref = function(e, t, n, i) {
        var r = "/?server=" + (e = this.stripRegion(e)) + ":" + t + ":" + n;
        return i && (r += "&password=" + encodeURIComponent(i)),
        r
    }
    ,
    s.prototype.serverAddress = function(e, t) {
        return "127.0.0.1" == e || "7f000001" == e || "903d62ef5d1c2fecdcaeb5e7dd485eff" == e ? window.location.hostname : this.rawIPs ? t ? "ip_" + this.hashIP(e) + "." + this.baseUrl : e : "ip_" + e + "." + this.baseUrl
    }
    ,
    s.prototype.serverPort = function(e) {
        return 0 == e.region ? this.devPort : location.protocol.startsWith("https") ? 443 : 80
    }
    ,
    s.prototype.processServers = function(e) {
        for (var t = {}, n = 0; n < e.length; n++) {
            var i = e[n]
              , r = t[i.region];
            null == r && (r = [],
            t[i.region] = r),
            r.push(i)
        }
        for (var s in t)
            t[s] = t[s].sort((function(e, t) {
                return e.index - t.index
            }
            ));
        this.servers = t
    }
    ,
    s.prototype.ipToHex = function(e) {
        return e.split(".").map(e=>("00" + parseInt(e).toString(16)).substr(-2)).join("").toLowerCase()
    }
    ,
    s.prototype.hashIP = function(e) {
        return r(this.ipToHex(e))
    }
    ,
    s.prototype.log = function() {
        return this.debugLog ? console.log.apply(void 0, arguments) : console.verbose ? console.verbose.apply(void 0, arguments) : void 0
    }
    ,
    s.prototype.stripRegion = function(e) {
        return e.startsWith("vultr:") ? e = e.slice(6) : e.startsWith("do:") && (e = e.slice(3)),
        e
    }
    ,
    window.testVultrClient = function() {
        var e = 1;
        function t(t, n) {
            (t = "" + t) == (n = "" + n) ? console.log(`Assert ${e} passed.`) : console.warn(`Assert ${e} failed. Expected ${n}, got ${t}.`),
            e++
        }
        var n = new s("test.io",-1,5,1,!1);
        n.errorCallback = function(e) {}
        ,
        n.processServers(function(e) {
            var t = [];
            for (var n in e)
                for (var i = e[n], r = 0; r < i.length; r++)
                    t.push({
                        ip: n + ":" + r,
                        scheme: "testing",
                        region: n,
                        index: r,
                        games: i[r].map(e=>({
                            playerCount: e,
                            isPrivate: !1
                        }))
                    });
            return t
        }({
            1: [[0, 0, 0, 0], [0, 0, 0, 0]],
            2: [[5, 1, 0, 0], [0, 0, 0, 0]],
            3: [[5, 0, 1, 5], [0, 0, 0, 0]],
            4: [[5, 1, 1, 5], [1, 0, 0, 0]],
            5: [[5, 1, 1, 5], [1, 0, 4, 0]],
            6: [[5, 5, 5, 5], [2, 3, 1, 4]],
            7: [[5, 5, 5, 5], [5, 5, 5, 5]]
        })),
        t(n.seekServer(1, !1), [1, 0, 0]),
        t(n.seekServer(1, !0), [1, 1, 3]),
        t(n.seekServer(2, !1), [2, 0, 1]),
        t(n.seekServer(2, !0), [2, 1, 3]),
        t(n.seekServer(3, !1), [3, 0, 2]),
        t(n.seekServer(3, !0), [3, 1, 3]),
        t(n.seekServer(4, !1), [4, 0, 1]),
        t(n.seekServer(4, !0), [4, 1, 3]),
        t(n.seekServer(5, !1), [5, 1, 2]),
        t(n.seekServer(5, !0), [5, 1, 3]),
        t(n.seekServer(6, !1), [6, 1, 3]),
        t(n.seekServer(6, !0), void 0),
        t(n.seekServer(7, !1), void 0),
        t(n.seekServer(7, !0), void 0),
        console.log("Tests passed.")
    }
    ;
    var a = function(e, t) {
        return e.concat(t)
    };
    Array.prototype.flatMap = function(e) {
        return function(e, t) {
            return t.map(e).reduce(a, [])
        }(e, this)
    }
    ,
    e.exports = s
}
, function(e, t, n) {
    "use strict";
    var i = n(61)
      , r = n(63);
    function s() {
        this.protocol = null,
        this.slashes = null,
        this.auth = null,
        this.host = null,
        this.port = null,
        this.hostname = null,
        this.hash = null,
        this.search = null,
        this.query = null,
        this.pathname = null,
        this.path = null,
        this.href = null
    }
    t.parse = v,
    t.resolve = function(e, t) {
        return v(e, !1, !0).resolve(t)
    }
    ,
    t.resolveObject = function(e, t) {
        return e ? v(e, !1, !0).resolveObject(t) : t
    }
    ,
    t.format = function(e) {
        return r.isString(e) && (e = v(e)),
        e instanceof s ? e.format() : s.prototype.format.call(e)
    }
    ,
    t.Url = s;
    var a = /^([a-z0-9.+-]+:)/i
      , o = /:[0-9]*$/
      , c = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/
      , l = ["{", "}", "|", "\\", "^", "`"].concat(["<", ">", '"', "`", " ", "\r", "\n", "\t"])
      , h = ["'"].concat(l)
      , u = ["%", "/", "?", ";", "#"].concat(h)
      , f = ["/", "?", "#"]
      , d = /^[+a-z0-9A-Z_-]{0,63}$/
      , p = /^([+a-z0-9A-Z_-]{0,63})(.*)$/
      , g = {
        javascript: !0,
        "javascript:": !0
    }
      , m = {
        javascript: !0,
        "javascript:": !0
    }
      , y = {
        http: !0,
        https: !0,
        ftp: !0,
        gopher: !0,
        file: !0,
        "http:": !0,
        "https:": !0,
        "ftp:": !0,
        "gopher:": !0,
        "file:": !0
    }
      , k = n(64);
    function v(e, t, n) {
        if (e && r.isObject(e) && e instanceof s)
            return e;
        var i = new s;
        return i.parse(e, t, n),
        i
    }
    s.prototype.parse = function(e, t, n) {
        if (!r.isString(e))
            throw new TypeError("Parameter 'url' must be a string, not " + typeof e);
        var s = e.indexOf("?")
          , o = -1 !== s && s < e.indexOf("#") ? "?" : "#"
          , l = e.split(o);
        l[0] = l[0].replace(/\\/g, "/");
        var v = e = l.join(o);
        if (v = v.trim(),
        !n && 1 === e.split("#").length) {
            var w = c.exec(v);
            if (w)
                return this.path = v,
                this.href = v,
                this.pathname = w[1],
                w[2] ? (this.search = w[2],
                this.query = t ? k.parse(this.search.substr(1)) : this.search.substr(1)) : t && (this.search = "",
                this.query = {}),
                this
        }
        var b = a.exec(v);
        if (b) {
            var x = (b = b[0]).toLowerCase();
            this.protocol = x,
            v = v.substr(b.length)
        }
        if (n || b || v.match(/^\/\/[^@\/]+@[^@\/]+/)) {
            var S = "//" === v.substr(0, 2);
            !S || b && m[b] || (v = v.substr(2),
            this.slashes = !0)
        }
        if (!m[b] && (S || b && !y[b])) {
            for (var T, I, E = -1, M = 0; M < f.length; M++)
                -1 !== (A = v.indexOf(f[M])) && (-1 === E || A < E) && (E = A);
            for (-1 !== (I = -1 === E ? v.lastIndexOf("@") : v.lastIndexOf("@", E)) && (T = v.slice(0, I),
            v = v.slice(I + 1),
            this.auth = decodeURIComponent(T)),
            E = -1,
            M = 0; M < u.length; M++) {
                var A;
                -1 !== (A = v.indexOf(u[M])) && (-1 === E || A < E) && (E = A)
            }
            -1 === E && (E = v.length),
            this.host = v.slice(0, E),
            v = v.slice(E),
            this.parseHost(),
            this.hostname = this.hostname || "";
            var P = "[" === this.hostname[0] && "]" === this.hostname[this.hostname.length - 1];
            if (!P)
                for (var B = this.hostname.split(/\./), C = (M = 0,
                B.length); M < C; M++) {
                    var O = B[M];
                    if (O && !O.match(d)) {
                        for (var R = "", j = 0, _ = O.length; j < _; j++)
                            O.charCodeAt(j) > 127 ? R += "x" : R += O[j];
                        if (!R.match(d)) {
                            var U = B.slice(0, M)
                              , D = B.slice(M + 1)
                              , L = O.match(p);
                            L && (U.push(L[1]),
                            D.unshift(L[2])),
                            D.length && (v = "/" + D.join(".") + v),
                            this.hostname = U.join(".");
                            break
                        }
                    }
                }
            this.hostname.length > 255 ? this.hostname = "" : this.hostname = this.hostname.toLowerCase(),
            P || (this.hostname = i.toASCII(this.hostname));
            var F = this.port ? ":" + this.port : ""
              , z = this.hostname || "";
            this.host = z + F,
            this.href += this.host,
            P && (this.hostname = this.hostname.substr(1, this.hostname.length - 2),
            "/" !== v[0] && (v = "/" + v))
        }
        if (!g[x])
            for (M = 0,
            C = h.length; M < C; M++) {
                var H = h[M];
                if (-1 !== v.indexOf(H)) {
                    var V = encodeURIComponent(H);
                    V === H && (V = escape(H)),
                    v = v.split(H).join(V)
                }
            }
        var q = v.indexOf("#");
        -1 !== q && (this.hash = v.substr(q),
        v = v.slice(0, q));
        var Y = v.indexOf("?");
        if (-1 !== Y ? (this.search = v.substr(Y),
        this.query = v.substr(Y + 1),
        t && (this.query = k.parse(this.query)),
        v = v.slice(0, Y)) : t && (this.search = "",
        this.query = {}),
        v && (this.pathname = v),
        y[x] && this.hostname && !this.pathname && (this.pathname = "/"),
        this.pathname || this.search) {
            F = this.pathname || "";
            var W = this.search || "";
            this.path = F + W
        }
        return this.href = this.format(),
        this
    }
    ,
    s.prototype.format = function() {
        var e = this.auth || "";
        e && (e = (e = encodeURIComponent(e)).replace(/%3A/i, ":"),
        e += "@");
        var t = this.protocol || ""
          , n = this.pathname || ""
          , i = this.hash || ""
          , s = !1
          , a = "";
        this.host ? s = e + this.host : this.hostname && (s = e + (-1 === this.hostname.indexOf(":") ? this.hostname : "[" + this.hostname + "]"),
        this.port && (s += ":" + this.port)),
        this.query && r.isObject(this.query) && Object.keys(this.query).length && (a = k.stringify(this.query));
        var o = this.search || a && "?" + a || "";
        return t && ":" !== t.substr(-1) && (t += ":"),
        this.slashes || (!t || y[t]) && !1 !== s ? (s = "//" + (s || ""),
        n && "/" !== n.charAt(0) && (n = "/" + n)) : s || (s = ""),
        i && "#" !== i.charAt(0) && (i = "#" + i),
        o && "?" !== o.charAt(0) && (o = "?" + o),
        t + s + (n = n.replace(/[?#]/g, (function(e) {
            return encodeURIComponent(e)
        }
        ))) + (o = o.replace("#", "%23")) + i
    }
    ,
    s.prototype.resolve = function(e) {
        return this.resolveObject(v(e, !1, !0)).format()
    }
    ,
    s.prototype.resolveObject = function(e) {
        if (r.isString(e)) {
            var t = new s;
            t.parse(e, !1, !0),
            e = t
        }
        for (var n = new s, i = Object.keys(this), a = 0; a < i.length; a++) {
            var o = i[a];
            n[o] = this[o]
        }
        if (n.hash = e.hash,
        "" === e.href)
            return n.href = n.format(),
            n;
        if (e.slashes && !e.protocol) {
            for (var c = Object.keys(e), l = 0; l < c.length; l++) {
                var h = c[l];
                "protocol" !== h && (n[h] = e[h])
            }
            return y[n.protocol] && n.hostname && !n.pathname && (n.path = n.pathname = "/"),
            n.href = n.format(),
            n
        }
        if (e.protocol && e.protocol !== n.protocol) {
            if (!y[e.protocol]) {
                for (var u = Object.keys(e), f = 0; f < u.length; f++) {
                    var d = u[f];
                    n[d] = e[d]
                }
                return n.href = n.format(),
                n
            }
            if (n.protocol = e.protocol,
            e.host || m[e.protocol])
                n.pathname = e.pathname;
            else {
                for (var p = (e.pathname || "").split("/"); p.length && !(e.host = p.shift()); )
                    ;
                e.host || (e.host = ""),
                e.hostname || (e.hostname = ""),
                "" !== p[0] && p.unshift(""),
                p.length < 2 && p.unshift(""),
                n.pathname = p.join("/")
            }
            if (n.search = e.search,
            n.query = e.query,
            n.host = e.host || "",
            n.auth = e.auth,
            n.hostname = e.hostname || e.host,
            n.port = e.port,
            n.pathname || n.search) {
                var g = n.pathname || ""
                  , k = n.search || "";
                n.path = g + k
            }
            return n.slashes = n.slashes || e.slashes,
            n.href = n.format(),
            n
        }
        var v = n.pathname && "/" === n.pathname.charAt(0)
          , w = e.host || e.pathname && "/" === e.pathname.charAt(0)
          , b = w || v || n.host && e.pathname
          , x = b
          , S = n.pathname && n.pathname.split("/") || []
          , T = (p = e.pathname && e.pathname.split("/") || [],
        n.protocol && !y[n.protocol]);
        if (T && (n.hostname = "",
        n.port = null,
        n.host && ("" === S[0] ? S[0] = n.host : S.unshift(n.host)),
        n.host = "",
        e.protocol && (e.hostname = null,
        e.port = null,
        e.host && ("" === p[0] ? p[0] = e.host : p.unshift(e.host)),
        e.host = null),
        b = b && ("" === p[0] || "" === S[0])),
        w)
            n.host = e.host || "" === e.host ? e.host : n.host,
            n.hostname = e.hostname || "" === e.hostname ? e.hostname : n.hostname,
            n.search = e.search,
            n.query = e.query,
            S = p;
        else if (p.length)
            S || (S = []),
            S.pop(),
            S = S.concat(p),
            n.search = e.search,
            n.query = e.query;
        else if (!r.isNullOrUndefined(e.search))
            return T && (n.hostname = n.host = S.shift(),
            (P = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@")) && (n.auth = P.shift(),
            n.host = n.hostname = P.shift())),
            n.search = e.search,
            n.query = e.query,
            r.isNull(n.pathname) && r.isNull(n.search) || (n.path = (n.pathname ? n.pathname : "") + (n.search ? n.search : "")),
            n.href = n.format(),
            n;
        if (!S.length)
            return n.pathname = null,
            n.search ? n.path = "/" + n.search : n.path = null,
            n.href = n.format(),
            n;
        for (var I = S.slice(-1)[0], E = (n.host || e.host || S.length > 1) && ("." === I || ".." === I) || "" === I, M = 0, A = S.length; A >= 0; A--)
            "." === (I = S[A]) ? S.splice(A, 1) : ".." === I ? (S.splice(A, 1),
            M++) : M && (S.splice(A, 1),
            M--);
        if (!b && !x)
            for (; M--; M)
                S.unshift("..");
        !b || "" === S[0] || S[0] && "/" === S[0].charAt(0) || S.unshift(""),
        E && "/" !== S.join("/").substr(-1) && S.push("");
        var P, B = "" === S[0] || S[0] && "/" === S[0].charAt(0);
        return T && (n.hostname = n.host = B ? "" : S.length ? S.shift() : "",
        (P = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@")) && (n.auth = P.shift(),
        n.host = n.hostname = P.shift())),
        (b = b || n.host && S.length) && !B && S.unshift(""),
        S.length ? n.pathname = S.join("/") : (n.pathname = null,
        n.path = null),
        r.isNull(n.pathname) && r.isNull(n.search) || (n.path = (n.pathname ? n.pathname : "") + (n.search ? n.search : "")),
        n.auth = e.auth || n.auth,
        n.slashes = n.slashes || e.slashes,
        n.href = n.format(),
        n
    }
    ,
    s.prototype.parseHost = function() {
        var e = this.host
          , t = o.exec(e);
        t && (":" !== (t = t[0]) && (this.port = t.substr(1)),
        e = e.substr(0, e.length - t.length)),
        e && (this.hostname = e)
    }
}
, function(e, t, n) {
    (function(e, i) {
        var r;
        !function(s) {
            t && t.nodeType,
            e && e.nodeType;
            var a = "object" == typeof i && i;
            a.global !== a && a.window !== a && a.self;
            var o, c = 2147483647, l = 36, h = /^xn--/, u = /[^\x20-\x7E]/, f = /[\x2E\u3002\uFF0E\uFF61]/g, d = {
                overflow: "Overflow: input needs wider integers to process",
                "not-basic": "Illegal input >= 0x80 (not a basic code point)",
                "invalid-input": "Invalid input"
            }, p = Math.floor, g = String.fromCharCode;
            function m(e) {
                throw new RangeError(d[e])
            }
            function y(e, t) {
                for (var n = e.length, i = []; n--; )
                    i[n] = t(e[n]);
                return i
            }
            function k(e, t) {
                var n = e.split("@")
                  , i = "";
                return n.length > 1 && (i = n[0] + "@",
                e = n[1]),
                i + y((e = e.replace(f, ".")).split("."), t).join(".")
            }
            function v(e) {
                for (var t, n, i = [], r = 0, s = e.length; r < s; )
                    (t = e.charCodeAt(r++)) >= 55296 && t <= 56319 && r < s ? 56320 == (64512 & (n = e.charCodeAt(r++))) ? i.push(((1023 & t) << 10) + (1023 & n) + 65536) : (i.push(t),
                    r--) : i.push(t);
                return i
            }
            function w(e) {
                return y(e, (function(e) {
                    var t = "";
                    return e > 65535 && (t += g((e -= 65536) >>> 10 & 1023 | 55296),
                    e = 56320 | 1023 & e),
                    t + g(e)
                }
                )).join("")
            }
            function b(e) {
                return e - 48 < 10 ? e - 22 : e - 65 < 26 ? e - 65 : e - 97 < 26 ? e - 97 : l
            }
            function x(e, t) {
                return e + 22 + 75 * (e < 26) - ((0 != t) << 5)
            }
            function S(e, t, n) {
                var i = 0;
                for (e = n ? p(e / 700) : e >> 1,
                e += p(e / t); e > 455; i += l)
                    e = p(e / 35);
                return p(i + 36 * e / (e + 38))
            }
            function T(e) {
                var t, n, i, r, s, a, o, h, u, f, d = [], g = e.length, y = 0, k = 128, v = 72;
                for ((n = e.lastIndexOf("-")) < 0 && (n = 0),
                i = 0; i < n; ++i)
                    e.charCodeAt(i) >= 128 && m("not-basic"),
                    d.push(e.charCodeAt(i));
                for (r = n > 0 ? n + 1 : 0; r < g; ) {
                    for (s = y,
                    a = 1,
                    o = l; r >= g && m("invalid-input"),
                    ((h = b(e.charCodeAt(r++))) >= l || h > p((c - y) / a)) && m("overflow"),
                    y += h * a,
                    !(h < (u = o <= v ? 1 : o >= v + 26 ? 26 : o - v)); o += l)
                        a > p(c / (f = l - u)) && m("overflow"),
                        a *= f;
                    v = S(y - s, t = d.length + 1, 0 == s),
                    p(y / t) > c - k && m("overflow"),
                    k += p(y / t),
                    y %= t,
                    d.splice(y++, 0, k)
                }
                return w(d)
            }
            function I(e) {
                var t, n, i, r, s, a, o, h, u, f, d, y, k, w, b, T = [];
                for (y = (e = v(e)).length,
                t = 128,
                n = 0,
                s = 72,
                a = 0; a < y; ++a)
                    (d = e[a]) < 128 && T.push(g(d));
                for (i = r = T.length,
                r && T.push("-"); i < y; ) {
                    for (o = c,
                    a = 0; a < y; ++a)
                        (d = e[a]) >= t && d < o && (o = d);
                    for (o - t > p((c - n) / (k = i + 1)) && m("overflow"),
                    n += (o - t) * k,
                    t = o,
                    a = 0; a < y; ++a)
                        if ((d = e[a]) < t && ++n > c && m("overflow"),
                        d == t) {
                            for (h = n,
                            u = l; !(h < (f = u <= s ? 1 : u >= s + 26 ? 26 : u - s)); u += l)
                                b = h - f,
                                w = l - f,
                                T.push(g(x(f + b % w, 0))),
                                h = p(b / w);
                            T.push(g(x(h, 0))),
                            s = S(n, k, i == r),
                            n = 0,
                            ++i
                        }
                    ++n,
                    ++t
                }
                return T.join("")
            }
            o = {
                version: "1.4.1",
                ucs2: {
                    decode: v,
                    encode: w
                },
                decode: T,
                encode: I,
                toASCII: function(e) {
                    return k(e, (function(e) {
                        return u.test(e) ? "xn--" + I(e) : e
                    }
                    ))
                },
                toUnicode: function(e) {
                    return k(e, (function(e) {
                        return h.test(e) ? T(e.slice(4).toLowerCase()) : e
                    }
                    ))
                }
            },
            void 0 === (r = function() {
                return o
            }
            .call(t, n, t, e)) || (e.exports = r)
        }()
    }
    ).call(this, n(62)(e), n(12))
}
, function(e, t) {
    e.exports = function(e) {
        return e.webpackPolyfill || (e.deprecate = function() {}
        ,
        e.paths = [],
        e.children || (e.children = []),
        Object.defineProperty(e, "loaded", {
            enumerable: !0,
            get: function() {
                return e.l
            }
        }),
        Object.defineProperty(e, "id", {
            enumerable: !0,
            get: function() {
                return e.i
            }
        }),
        e.webpackPolyfill = 1),
        e
    }
}
, function(e, t, n) {
    "use strict";
    e.exports = {
        isString: function(e) {
            return "string" == typeof e
        },
        isObject: function(e) {
            return "object" == typeof e && null !== e
        },
        isNull: function(e) {
            return null === e
        },
        isNullOrUndefined: function(e) {
            return null == e
        }
    }
}
, function(e, t, n) {
    "use strict";
    t.decode = t.parse = n(65),
    t.encode = t.stringify = n(66)
}
, function(e, t, n) {
    "use strict";
    function i(e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }
    e.exports = function(e, t, n, s) {
        t = t || "&",
        n = n || "=";
        var a = {};
        if ("string" != typeof e || 0 === e.length)
            return a;
        var o = /\+/g;
        e = e.split(t);
        var c = 1e3;
        s && "number" == typeof s.maxKeys && (c = s.maxKeys);
        var l = e.length;
        c > 0 && l > c && (l = c);
        for (var h = 0; h < l; ++h) {
            var u, f, d, p, g = e[h].replace(o, "%20"), m = g.indexOf(n);
            m >= 0 ? (u = g.substr(0, m),
            f = g.substr(m + 1)) : (u = g,
            f = ""),
            d = decodeURIComponent(u),
            p = decodeURIComponent(f),
            i(a, d) ? r(a[d]) ? a[d].push(p) : a[d] = [a[d], p] : a[d] = p
        }
        return a
    }
    ;
    var r = Array.isArray || function(e) {
        return "[object Array]" === Object.prototype.toString.call(e)
    }
}
, function(e, t, n) {
    "use strict";
    var i = function(e) {
        switch (typeof e) {
        case "string":
            return e;
        case "boolean":
            return e ? "true" : "false";
        case "number":
            return isFinite(e) ? e : "";
        default:
            return ""
        }
    };
    e.exports = function(e, t, n, o) {
        return t = t || "&",
        n = n || "=",
        null === e && (e = void 0),
        "object" == typeof e ? s(a(e), (function(a) {
            var o = encodeURIComponent(i(a)) + n;
            return r(e[a]) ? s(e[a], (function(e) {
                return o + encodeURIComponent(i(e))
            }
            )).join(t) : o + encodeURIComponent(i(e[a]))
        }
        )).join(t) : o ? encodeURIComponent(i(o)) + n + encodeURIComponent(i(e)) : ""
    }
    ;
    var r = Array.isArray || function(e) {
        return "[object Array]" === Object.prototype.toString.call(e)
    }
    ;
    function s(e, t) {
        if (e.map)
            return e.map(t);
        for (var n = [], i = 0; i < e.length; i++)
            n.push(t(e[i], i));
        return n
    }
    var a = Object.keys || function(e) {
        var t = [];
        for (var n in e)
            Object.prototype.hasOwnProperty.call(e, n) && t.push(n);
        return t
    }
}
, function(e, t, n) {
    !function() {
        var t = n(68)
          , i = n(20).utf8
          , r = n(69)
          , s = n(20).bin
          , a = function(e, n) {
            e.constructor == String ? e = n && "binary" === n.encoding ? s.stringToBytes(e) : i.stringToBytes(e) : r(e) ? e = Array.prototype.slice.call(e, 0) : Array.isArray(e) || (e = e.toString());
            for (var o = t.bytesToWords(e), c = 8 * e.length, l = 1732584193, h = -271733879, u = -1732584194, f = 271733878, d = 0; d < o.length; d++)
                o[d] = 16711935 & (o[d] << 8 | o[d] >>> 24) | 4278255360 & (o[d] << 24 | o[d] >>> 8);
            o[c >>> 5] |= 128 << c % 32,
            o[14 + (c + 64 >>> 9 << 4)] = c;
            var p = a._ff
              , g = a._gg
              , m = a._hh
              , y = a._ii;
            for (d = 0; d < o.length; d += 16) {
                var k = l
                  , v = h
                  , w = u
                  , b = f;
                h = y(h = y(h = y(h = y(h = m(h = m(h = m(h = m(h = g(h = g(h = g(h = g(h = p(h = p(h = p(h = p(h, u = p(u, f = p(f, l = p(l, h, u, f, o[d + 0], 7, -680876936), h, u, o[d + 1], 12, -389564586), l, h, o[d + 2], 17, 606105819), f, l, o[d + 3], 22, -1044525330), u = p(u, f = p(f, l = p(l, h, u, f, o[d + 4], 7, -176418897), h, u, o[d + 5], 12, 1200080426), l, h, o[d + 6], 17, -1473231341), f, l, o[d + 7], 22, -45705983), u = p(u, f = p(f, l = p(l, h, u, f, o[d + 8], 7, 1770035416), h, u, o[d + 9], 12, -1958414417), l, h, o[d + 10], 17, -42063), f, l, o[d + 11], 22, -1990404162), u = p(u, f = p(f, l = p(l, h, u, f, o[d + 12], 7, 1804603682), h, u, o[d + 13], 12, -40341101), l, h, o[d + 14], 17, -1502002290), f, l, o[d + 15], 22, 1236535329), u = g(u, f = g(f, l = g(l, h, u, f, o[d + 1], 5, -165796510), h, u, o[d + 6], 9, -1069501632), l, h, o[d + 11], 14, 643717713), f, l, o[d + 0], 20, -373897302), u = g(u, f = g(f, l = g(l, h, u, f, o[d + 5], 5, -701558691), h, u, o[d + 10], 9, 38016083), l, h, o[d + 15], 14, -660478335), f, l, o[d + 4], 20, -405537848), u = g(u, f = g(f, l = g(l, h, u, f, o[d + 9], 5, 568446438), h, u, o[d + 14], 9, -1019803690), l, h, o[d + 3], 14, -187363961), f, l, o[d + 8], 20, 1163531501), u = g(u, f = g(f, l = g(l, h, u, f, o[d + 13], 5, -1444681467), h, u, o[d + 2], 9, -51403784), l, h, o[d + 7], 14, 1735328473), f, l, o[d + 12], 20, -1926607734), u = m(u, f = m(f, l = m(l, h, u, f, o[d + 5], 4, -378558), h, u, o[d + 8], 11, -2022574463), l, h, o[d + 11], 16, 1839030562), f, l, o[d + 14], 23, -35309556), u = m(u, f = m(f, l = m(l, h, u, f, o[d + 1], 4, -1530992060), h, u, o[d + 4], 11, 1272893353), l, h, o[d + 7], 16, -155497632), f, l, o[d + 10], 23, -1094730640), u = m(u, f = m(f, l = m(l, h, u, f, o[d + 13], 4, 681279174), h, u, o[d + 0], 11, -358537222), l, h, o[d + 3], 16, -722521979), f, l, o[d + 6], 23, 76029189), u = m(u, f = m(f, l = m(l, h, u, f, o[d + 9], 4, -640364487), h, u, o[d + 12], 11, -421815835), l, h, o[d + 15], 16, 530742520), f, l, o[d + 2], 23, -995338651), u = y(u, f = y(f, l = y(l, h, u, f, o[d + 0], 6, -198630844), h, u, o[d + 7], 10, 1126891415), l, h, o[d + 14], 15, -1416354905), f, l, o[d + 5], 21, -57434055), u = y(u, f = y(f, l = y(l, h, u, f, o[d + 12], 6, 1700485571), h, u, o[d + 3], 10, -1894986606), l, h, o[d + 10], 15, -1051523), f, l, o[d + 1], 21, -2054922799), u = y(u, f = y(f, l = y(l, h, u, f, o[d + 8], 6, 1873313359), h, u, o[d + 15], 10, -30611744), l, h, o[d + 6], 15, -1560198380), f, l, o[d + 13], 21, 1309151649), u = y(u, f = y(f, l = y(l, h, u, f, o[d + 4], 6, -145523070), h, u, o[d + 11], 10, -1120210379), l, h, o[d + 2], 15, 718787259), f, l, o[d + 9], 21, -343485551),
                l = l + k >>> 0,
                h = h + v >>> 0,
                u = u + w >>> 0,
                f = f + b >>> 0
            }
            return t.endian([l, h, u, f])
        };
        a._ff = function(e, t, n, i, r, s, a) {
            var o = e + (t & n | ~t & i) + (r >>> 0) + a;
            return (o << s | o >>> 32 - s) + t
        }
        ,
        a._gg = function(e, t, n, i, r, s, a) {
            var o = e + (t & i | n & ~i) + (r >>> 0) + a;
            return (o << s | o >>> 32 - s) + t
        }
        ,
        a._hh = function(e, t, n, i, r, s, a) {
            var o = e + (t ^ n ^ i) + (r >>> 0) + a;
            return (o << s | o >>> 32 - s) + t
        }
        ,
        a._ii = function(e, t, n, i, r, s, a) {
            var o = e + (n ^ (t | ~i)) + (r >>> 0) + a;
            return (o << s | o >>> 32 - s) + t
        }
        ,
        a._blocksize = 16,
        a._digestsize = 16,
        e.exports = function(e, n) {
            if (null == e)
                throw new Error("Illegal argument " + e);
            var i = t.wordsToBytes(a(e, n));
            return n && n.asBytes ? i : n && n.asString ? s.bytesToString(i) : t.bytesToHex(i)
        }
    }()
}
, function(e, t) {
    !function() {
        var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
          , n = {
            rotl: function(e, t) {
                return e << t | e >>> 32 - t
            },
            rotr: function(e, t) {
                return e << 32 - t | e >>> t
            },
            endian: function(e) {
                if (e.constructor == Number)
                    return 16711935 & n.rotl(e, 8) | 4278255360 & n.rotl(e, 24);
                for (var t = 0; t < e.length; t++)
                    e[t] = n.endian(e[t]);
                return e
            },
            randomBytes: function(e) {
                for (var t = []; e > 0; e--)
                    t.push(Math.floor(256 * Math.random()));
                return t
            },
            bytesToWords: function(e) {
                for (var t = [], n = 0, i = 0; n < e.length; n++,
                i += 8)
                    t[i >>> 5] |= e[n] << 24 - i % 32;
                return t
            },
            wordsToBytes: function(e) {
                for (var t = [], n = 0; n < 32 * e.length; n += 8)
                    t.push(e[n >>> 5] >>> 24 - n % 32 & 255);
                return t
            },
            bytesToHex: function(e) {
                for (var t = [], n = 0; n < e.length; n++)
                    t.push((e[n] >>> 4).toString(16)),
                    t.push((15 & e[n]).toString(16));
                return t.join("")
            },
            hexToBytes: function(e) {
                for (var t = [], n = 0; n < e.length; n += 2)
                    t.push(parseInt(e.substr(n, 2), 16));
                return t
            },
            bytesToBase64: function(e) {
                for (var n = [], i = 0; i < e.length; i += 3)
                    for (var r = e[i] << 16 | e[i + 1] << 8 | e[i + 2], s = 0; s < 4; s++)
                        8 * i + 6 * s <= 8 * e.length ? n.push(t.charAt(r >>> 6 * (3 - s) & 63)) : n.push("=");
                return n.join("")
            },
            base64ToBytes: function(e) {
                e = e.replace(/[^A-Z0-9+\/]/gi, "");
                for (var n = [], i = 0, r = 0; i < e.length; r = ++i % 4)
                    0 != r && n.push((t.indexOf(e.charAt(i - 1)) & Math.pow(2, -2 * r + 8) - 1) << 2 * r | t.indexOf(e.charAt(i)) >>> 6 - 2 * r);
                return n
            }
        };
        e.exports = n
    }()
}
, function(e, t) {
    function n(e) {
        return !!e.constructor && "function" == typeof e.constructor.isBuffer && e.constructor.isBuffer(e)
    }
    e.exports = function(e) {
        return null != e && (n(e) || function(e) {
            return "function" == typeof e.readFloatLE && "function" == typeof e.slice && n(e.slice(0, 0))
        }(e) || !!e._isBuffer)
    }
}
, function(e, t) {
    e.exports = function(e, t, n, i, r, s, a, o, c) {
        this.aiTypes = [{
            id: 0,
            src: "cow_1",
            killScore: 150,
            health: 500,
            weightM: .8,
            speed: 95e-5,
            turnSpeed: .001,
            scale: 72,
            drop: ["food", 50]
        }, {
            id: 1,
            src: "pig_1",
            killScore: 200,
            health: 800,
            weightM: .6,
            speed: 85e-5,
            turnSpeed: .001,
            scale: 72,
            drop: ["food", 80]
        }, {
            id: 2,
            name: "Bull",
            src: "bull_2",
            hostile: !0,
            dmg: 20,
            killScore: 1e3,
            health: 1800,
            weightM: .5,
            speed: 94e-5,
            turnSpeed: 74e-5,
            scale: 78,
            viewRange: 800,
            chargePlayer: !0,
            drop: ["food", 100]
        }, {
            id: 3,
            name: "Bully",
            src: "bull_1",
            hostile: !0,
            dmg: 20,
            killScore: 2e3,
            health: 2800,
            weightM: .45,
            speed: .001,
            turnSpeed: 8e-4,
            scale: 90,
            viewRange: 900,
            chargePlayer: !0,
            drop: ["food", 400]
        }, {
            id: 4,
            name: "Wolf",
            src: "wolf_1",
            hostile: !0,
            dmg: 8,
            killScore: 500,
            health: 300,
            weightM: .45,
            speed: .001,
            turnSpeed: .002,
            scale: 84,
            viewRange: 800,
            chargePlayer: !0,
            drop: ["food", 200]
        }, {
            id: 5,
            name: "Quack",
            src: "chicken_1",
            dmg: 8,
            killScore: 2e3,
            noTrap: !0,
            health: 300,
            weightM: .2,
            speed: .0018,
            turnSpeed: .006,
            scale: 70,
            drop: ["food", 100]
        }, {
            id: 6,
            name: "MOOSTAFA",
            nameScale: 50,
            src: "enemy",
            hostile: !0,
            dontRun: !0,
            fixedSpawn: !0,
            spawnDelay: 6e4,
            noTrap: !0,
            colDmg: 100,
            dmg: 40,
            killScore: 8e3,
            health: 18e3,
            weightM: .4,
            speed: 7e-4,
            turnSpeed: .01,
            scale: 80,
            spriteMlt: 1.8,
            leapForce: .9,
            viewRange: 1e3,
            hitRange: 210,
            hitDelay: 1e3,
            chargePlayer: !0,
            drop: ["food", 100]
        }, {
            id: 7,
            name: "Treasure",
            hostile: !0,
            nameScale: 35,
            src: "crate_1",
            fixedSpawn: !0,
            spawnDelay: 12e4,
            colDmg: 200,
            killScore: 5e3,
            health: 2e4,
            weightM: .1,
            speed: 0,
            turnSpeed: 0,
            scale: 70,
            spriteMlt: 1
        }, {
            id: 8,
            name: "MOOFIE",
            src: "wolf_2",
            hostile: !0,
            fixedSpawn: !0,
            dontRun: !0,
            hitScare: 4,
            spawnDelay: 3e4,
            noTrap: !0,
            nameScale: 35,
            dmg: 10,
            colDmg: 100,
            killScore: 3e3,
            health: 7e3,
            weightM: .45,
            speed: .0015,
            turnSpeed: .002,
            scale: 90,
            viewRange: 800,
            chargePlayer: !0,
            drop: ["food", 1e3]
        }],
        this.spawn = function(l, h, u, f) {
            for (var d, p = 0; p < e.length; ++p)
                if (!e[p].active) {
                    d = e[p];
                    break
                }
            return d || (d = new t(e.length,r,n,i,a,s,o,c),
            e.push(d)),
            d.init(l, h, u, f, this.aiTypes[f]),
            d
        }
    }
}
, function(e, t) {
    var n = 2 * Math.PI;
    e.exports = function(e, t, i, r, s, a, o, c) {
        this.sid = e,
        this.isAI = !0,
        this.nameIndex = s.randInt(0, a.cowNames.length - 1),
        this.init = function(e, t, n, i, r) {
            this.x = e,
            this.y = t,
            this.startX = r.fixedSpawn ? e : null,
            this.startY = r.fixedSpawn ? t : null,
            this.xVel = 0,
            this.yVel = 0,
            this.zIndex = 0,
            this.dir = n,
            this.dirPlus = 0,
            this.index = i,
            this.src = r.src,
            r.name && (this.name = r.name),
            this.weightM = r.weightM,
            this.speed = r.speed,
            this.killScore = r.killScore,
            this.turnSpeed = r.turnSpeed,
            this.scale = r.scale,
            this.maxHealth = r.health,
            this.leapForce = r.leapForce,
            this.health = this.maxHealth,
            this.chargePlayer = r.chargePlayer,
            this.viewRange = r.viewRange,
            this.drop = r.drop,
            this.dmg = r.dmg,
            this.hostile = r.hostile,
            this.dontRun = r.dontRun,
            this.hitRange = r.hitRange,
            this.hitDelay = r.hitDelay,
            this.hitScare = r.hitScare,
            this.spriteMlt = r.spriteMlt,
            this.nameScale = r.nameScale,
            this.colDmg = r.colDmg,
            this.noTrap = r.noTrap,
            this.spawnDelay = r.spawnDelay,
            this.hitWait = 0,
            this.waitCount = 1e3,
            this.moveCount = 0,
            this.targetDir = 0,
            this.active = !0,
            this.alive = !0,
            this.runFrom = null,
            this.chargeTarget = null,
            this.dmgOverTime = {}
        }
        ;
        var l = 0;
        this.update = function(e) {
            if (this.active) {
                if (this.spawnCounter)
                    return this.spawnCounter -= e,
                    void (this.spawnCounter <= 0 && (this.spawnCounter = 0,
                    this.x = this.startX || s.randInt(0, a.mapScale),
                    this.y = this.startY || s.randInt(0, a.mapScale)));
                (l -= e) <= 0 && (this.dmgOverTime.dmg && (this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer),
                this.dmgOverTime.time -= 1,
                this.dmgOverTime.time <= 0 && (this.dmgOverTime.dmg = 0)),
                l = 1e3);
                var r = !1
                  , o = 1;
                if (!this.zIndex && !this.lockMove && this.y >= a.mapScale / 2 - a.riverWidth / 2 && this.y <= a.mapScale / 2 + a.riverWidth / 2 && (o = .33,
                this.xVel += a.waterCurrent * e),
                this.lockMove)
                    this.xVel = 0,
                    this.yVel = 0;
                else if (this.waitCount > 0) {
                    if (this.waitCount -= e,
                    this.waitCount <= 0)
                        if (this.chargePlayer) {
                            for (var h, u, f, d = 0; d < i.length; ++d)
                                !i[d].alive || i[d].skin && i[d].skin.bullRepel || (f = s.getDistance(this.x, this.y, i[d].x, i[d].y)) <= this.viewRange && (!h || f < u) && (u = f,
                                h = i[d]);
                            h ? (this.chargeTarget = h,
                            this.moveCount = s.randInt(8e3, 12e3)) : (this.moveCount = s.randInt(1e3, 2e3),
                            this.targetDir = s.randFloat(-Math.PI, Math.PI))
                        } else
                            this.moveCount = s.randInt(4e3, 1e4),
                            this.targetDir = s.randFloat(-Math.PI, Math.PI)
                } else if (this.moveCount > 0) {
                    var p = this.speed * o;
                    if (this.runFrom && this.runFrom.active && (!this.runFrom.isPlayer || this.runFrom.alive) ? (this.targetDir = s.getDirection(this.x, this.y, this.runFrom.x, this.runFrom.y),
                    p *= 1.42) : this.chargeTarget && this.chargeTarget.alive && (this.targetDir = s.getDirection(this.chargeTarget.x, this.chargeTarget.y, this.x, this.y),
                    p *= 1.75,
                    r = !0),
                    this.hitWait && (p *= .3),
                    this.dir != this.targetDir) {
                        this.dir %= n;
                        var g = (this.dir - this.targetDir + n) % n
                          , m = Math.min(Math.abs(g - n), g, this.turnSpeed * e)
                          , y = g - Math.PI >= 0 ? 1 : -1;
                        this.dir += y * m + n
                    }
                    this.dir %= n,
                    this.xVel += p * e * Math.cos(this.dir),
                    this.yVel += p * e * Math.sin(this.dir),
                    this.moveCount -= e,
                    this.moveCount <= 0 && (this.runFrom = null,
                    this.chargeTarget = null,
                    this.waitCount = this.hostile ? 1500 : s.randInt(1500, 6e3))
                }
                this.zIndex = 0,
                this.lockMove = !1;
                var k = s.getDistance(0, 0, this.xVel * e, this.yVel * e)
                  , v = Math.min(4, Math.max(1, Math.round(k / 40)))
                  , w = 1 / v;
                for (d = 0; d < v; ++d) {
                    this.xVel && (this.x += this.xVel * e * w),
                    this.yVel && (this.y += this.yVel * e * w),
                    M = t.getGridArrays(this.x, this.y, this.scale);
                    for (var b = 0; b < M.length; ++b)
                        for (var x = 0; x < M[b].length; ++x)
                            M[b][x].active && t.checkCollision(this, M[b][x], w)
                }
                var S, T, I, E = !1;
                if (this.hitWait > 0 && (this.hitWait -= e,
                this.hitWait <= 0)) {
                    E = !0,
                    this.hitWait = 0,
                    this.leapForce && !s.randInt(0, 2) && (this.xVel += this.leapForce * Math.cos(this.dir),
                    this.yVel += this.leapForce * Math.sin(this.dir));
                    for (var M = t.getGridArrays(this.x, this.y, this.hitRange), A = 0; A < M.length; ++A)
                        for (b = 0; b < M[A].length; ++b)
                            (S = M[A][b]).health && (T = s.getDistance(this.x, this.y, S.x, S.y)) < S.scale + this.hitRange && (S.changeHealth(5 * -this.dmg) && t.disableObj(S),
                            t.hitObj(S, s.getDirection(this.x, this.y, S.x, S.y)));
                    for (b = 0; b < i.length; ++b)
                        i[b].canSee(this) && c.send(i[b].id, "aa", this.sid)
                }
                if (r || E)
                    for (d = 0; d < i.length; ++d)
                        (S = i[d]) && S.alive && (T = s.getDistance(this.x, this.y, S.x, S.y),
                        this.hitRange ? !this.hitWait && T <= this.hitRange + S.scale && (E ? (I = s.getDirection(S.x, S.y, this.x, this.y),
                        S.changeHealth(-this.dmg),
                        S.xVel += .6 * Math.cos(I),
                        S.yVel += .6 * Math.sin(I),
                        this.runFrom = null,
                        this.chargeTarget = null,
                        this.waitCount = 3e3,
                        this.hitWait = s.randInt(0, 2) ? 0 : 600) : this.hitWait = this.hitDelay) : T <= this.scale + S.scale && (I = s.getDirection(S.x, S.y, this.x, this.y),
                        S.changeHealth(-this.dmg),
                        S.xVel += .55 * Math.cos(I),
                        S.yVel += .55 * Math.sin(I)));
                this.xVel && (this.xVel *= Math.pow(a.playerDecel, e)),
                this.yVel && (this.yVel *= Math.pow(a.playerDecel, e));
                var P = this.scale;
                this.x - P < 0 ? (this.x = P,
                this.xVel = 0) : this.x + P > a.mapScale && (this.x = a.mapScale - P,
                this.xVel = 0),
                this.y - P < 0 ? (this.y = P,
                this.yVel = 0) : this.y + P > a.mapScale && (this.y = a.mapScale - P,
                this.yVel = 0)
            }
        }
        ,
        this.canSee = function(e) {
            if (!e)
                return !1;
            if (e.skin && e.skin.invisTimer && e.noMovTimer >= e.skin.invisTimer)
                return !1;
            var t = Math.abs(e.x - this.x) - e.scale
              , n = Math.abs(e.y - this.y) - e.scale;
            return t <= a.maxScreenWidth / 2 * 1.3 && n <= a.maxScreenHeight / 2 * 1.3
        }
        ;
        var h = 0
          , u = 0;
        this.animate = function(e) {
            this.animTime > 0 && (this.animTime -= e,
            this.animTime <= 0 ? (this.animTime = 0,
            this.dirPlus = 0,
            h = 0,
            u = 0) : 0 == u ? (h += e / (this.animSpeed * a.hitReturnRatio),
            this.dirPlus = s.lerp(0, this.targetAngle, Math.min(1, h)),
            h >= 1 && (h = 1,
            u = 1)) : (h -= e / (this.animSpeed * (1 - a.hitReturnRatio)),
            this.dirPlus = s.lerp(0, this.targetAngle, Math.max(0, h))))
        }
        ,
        this.startAnim = function() {
            this.animTime = this.animSpeed = 600,
            this.targetAngle = .8 * Math.PI,
            h = 0,
            u = 0
        }
        ,
        this.changeHealth = function(e, t, n) {
            if (this.active && (this.health += e,
            n && (this.hitScare && !s.randInt(0, this.hitScare) ? (this.runFrom = n,
            this.waitCount = 0,
            this.moveCount = 2e3) : this.hostile && this.chargePlayer && n.isPlayer ? (this.chargeTarget = n,
            this.waitCount = 0,
            this.moveCount = 8e3) : this.dontRun || (this.runFrom = n,
            this.waitCount = 0,
            this.moveCount = 2e3)),
            e < 0 && this.hitRange && s.randInt(0, 1) && (this.hitWait = 500),
            t && t.canSee(this) && e < 0 && c.send(t.id, "t", Math.round(this.x), Math.round(this.y), Math.round(-e), 1),
            this.health <= 0 && (this.spawnDelay ? (this.spawnCounter = this.spawnDelay,
            this.x = -1e6,
            this.y = -1e6) : (this.x = this.startX || s.randInt(0, a.mapScale),
            this.y = this.startY || s.randInt(0, a.mapScale)),
            this.health = this.maxHealth,
            this.runFrom = null,
            t && (o(t, this.killScore),
            this.drop))))
                for (var i = 0; i < this.drop.length; )
                    t.addResource(a.resourceTypes.indexOf(this.drop[i]), this.drop[i + 1]),
                    i += 2
        }
    }
}
]);
//# sourceMappingURL=bundle.js.map