Save
Save
ctrl+s
Publish
Export
New
Run
Run
f5
Test
f6
Actions
Clone this project
Update game libraries
What are you working on?
Log in or sign up
Platform Tutorial 1
Edit
Test Platform Tutorial 1
x
Choose an Export Method
Zip File
Packaged for Chrome Web Store
Embed Code
x
New File
Choose type
×
Edit Project
Title
[{"path":"src/square.coffee","type":"blob","contents":"# Defining a constructor for a object of class \"Square\"\n# Constructors accept an object of key/value pairs \n# (I) to define their instance variables.\nSquare = (I) ->\n # Make sure I is at least an empty object\n I ||= {}\n\n # Object.reverseMerge takes I and adds some \n # default instance variables if I doesn't\n # already have a key with the same name.\n Object.reverseMerge I,\n color: \"red\"\n x: 100\n y: 180\n width: 30\n height: 30\n velocity: Point(2, 0) \n\n # Give this object all the methods \n # that GameObject provides. This is \n # how PixieEngine does inheritance.\n self = GameObject(I)\n\n # Code that is bound to the step event\n # is executed each time through the main loop.\n # The engine steps through the loop for us.\n self.bind 'step', ->\n # Incrementing the square's \n # position by its current velocity.\n I.x += I.velocity.x\n I.y += I.velocity.y\n\n # key handling\n\n # We must return `self` at the end of our constructors.\n self\n","size":984,"mtime":1316549487},{"path":"src/main.coffee","type":"blob","contents":"# We attach engine to window so that \n# it is accessible throughout your project\n\n# The Engine constructor, like GameObject, also accepts\n# a parameter I, which is a collection of instance variables. \n# Here we have defined the canvas instance variable and you \n# will define the backgroundColor during the tutorial.\nwindow.engine = Engine\n # color\n canvas: $(\"canvas\").pixieCanvas()\n\n# Add an instance of the class square, defined\n# in src/square to the game simulation.\nengine.add\n class: \"Square\"\n\n# start the simulation\nengine.start()\n\n","size":543,"mtime":1320340695},{"path":"lib/browserlib.js","type":"blob","contents":";\n;\ndocument.oncontextmenu = function() {\n return false;\n};\n$(document).bind(\"keydown\", function(event) {\n if (!$(event.target).is(\"input\")) {\n return event.preventDefault();\n }\n});;\n/**\nThis error handler captures any runtime errors and reports them to the IDE\nif present.\n*/window.onerror = function(message) {\n return typeof parent.displayRuntimeError === \"function\" ? parent.displayRuntimeError(message) : void 0;\n};;\nvar Joysticks;\nvar __slice = Array.prototype.slice;\nJoysticks = (function() {\n var AXIS_MAX, Controller, DEAD_ZONE, MAX_BUFFER, TRIP_HIGH, TRIP_LOW, axisMappingDefault, axisMappingOSX, buttonMappingDefault, buttonMappingOSX, controllers, displayInstallPrompt, joysticks, plugin, previousJoysticks, type;\n type = \"application/x-boomstickjavascriptjoysticksupport\";\n plugin = null;\n MAX_BUFFER = 2000;\n AXIS_MAX = 32767 - MAX_BUFFER;\n DEAD_ZONE = AXIS_MAX * 0.2;\n TRIP_HIGH = AXIS_MAX * 0.75;\n TRIP_LOW = AXIS_MAX * 0.5;\n previousJoysticks = [];\n joysticks = [];\n controllers = [];\n buttonMappingDefault = {\n \"A\": 1,\n \"B\": 2,\n \"C\": 4,\n \"D\": 8,\n \"X\": 4,\n \"Y\": 8,\n \"R\": 32,\n \"RB\": 32,\n \"R1\": 32,\n \"L\": 16,\n \"LB\": 16,\n \"L1\": 16,\n \"SELECT\": 64,\n \"BACK\": 64,\n \"START\": 128,\n \"HOME\": 256,\n \"GUIDE\": 256,\n \"TL\": 512,\n \"TR\": 1024,\n \"ANY\": 0xFFFFFF\n };\n buttonMappingOSX = {\n \"A\": 2048,\n \"B\": 4096,\n \"C\": 8192,\n \"D\": 16384,\n \"X\": 8192,\n \"Y\": 16384,\n \"R\": 512,\n \"L\": 256,\n \"SELECT\": 32,\n \"BACK\": 32,\n \"START\": 16,\n \"HOME\": 1024,\n \"LT\": 64,\n \"TR\": 128,\n \"ANY\": 0xFFFFFF0\n };\n axisMappingDefault = {\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5\n };\n axisMappingOSX = {\n 0: 2,\n 1: 3,\n 2: 4,\n 3: 5,\n 4: 0,\n 5: 1\n };\n displayInstallPrompt = function(text, url) {\n return $(\"<a />\", {\n css: {\n backgroundColor: \"yellow\",\n boxSizing: \"border-box\",\n color: \"#000\",\n display: \"block\",\n fontWeight: \"bold\",\n left: 0,\n padding: \"1em\",\n position: \"absolute\",\n textDecoration: \"none\",\n top: 0,\n width: \"100%\",\n zIndex: 2000\n },\n href: url,\n target: \"_blank\",\n text: text\n }).appendTo(\"body\");\n };\n Controller = function(i, remapOSX) {\n var axisMapping, axisTrips, buttonMapping, currentState, previousState, self;\n if (remapOSX === void 0) {\n remapOSX = navigator.platform.match(/^Mac/);\n }\n if (remapOSX) {\n buttonMapping = buttonMappingOSX;\n axisMapping = axisMappingOSX;\n } else {\n buttonMapping = buttonMappingDefault;\n axisMapping = axisMappingDefault;\n }\n currentState = function() {\n return joysticks[i];\n };\n previousState = function() {\n return previousJoysticks[i];\n };\n axisTrips = [];\n return self = Core().include(Bindable).extend({\n actionDown: function() {\n var buttons, state;\n buttons = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n if (state = currentState()) {\n return buttons.inject(false, function(down, button) {\n return down || state.buttons & buttonMapping[button];\n });\n } else {\n return false;\n }\n },\n buttonPressed: function(button) {\n var buttonId;\n buttonId = buttonMapping[button];\n return (self.buttons() & buttonId) && !(previousState().buttons & buttonId);\n },\n position: function(stick) {\n var magnitude, p, ratio, state;\n if (stick == null) {\n stick = 0;\n }\n if (state = currentState()) {\n p = Point(self.axis(2 * stick), self.axis(2 * stick + 1));\n magnitude = p.magnitude();\n if (magnitude > AXIS_MAX) {\n return p.norm();\n } else if (magnitude < DEAD_ZONE) {\n return Point(0, 0);\n } else {\n ratio = magnitude / AXIS_MAX;\n return p.scale(ratio / AXIS_MAX);\n }\n } else {\n return Point(0, 0);\n }\n },\n axis: function(n) {\n n = axisMapping[n];\n return self.axes()[n] || 0;\n },\n axes: function() {\n var state;\n if (state = currentState()) {\n return state.axes;\n } else {\n return [];\n }\n },\n buttons: function() {\n var state;\n if (state = currentState()) {\n return state.buttons;\n }\n },\n processEvents: function() {\n var x, y, _ref;\n _ref = [0, 1].map(function(n) {\n if (!axisTrips[n] && self.axis(n).abs() > TRIP_HIGH) {\n axisTrips[n] = true;\n return self.axis(n).sign();\n }\n if (axisTrips[n] && self.axis(n).abs() < TRIP_LOW) {\n axisTrips[n] = false;\n }\n return 0;\n }), x = _ref[0], y = _ref[1];\n if (!x || !y) {\n return self.trigger(\"tap\", Point(x, y));\n }\n },\n drawDebug: function(canvas) {\n var axis, i, lineHeight, _len, _ref;\n lineHeight = 18;\n canvas.fillColor(\"#FFF\");\n _ref = self.axes();\n for (i = 0, _len = _ref.length; i < _len; i++) {\n axis = _ref[i];\n canvas.fillText(axis, 0, i * lineHeight);\n }\n return canvas.fillText(self.buttons(), 0, i * lineHeight);\n }\n });\n };\n return {\n getController: function(i) {\n return controllers[i] || (controllers[i] = Controller(i));\n },\n init: function() {\n var periodicCheck, promptElement;\n if (!plugin) {\n plugin = document.createElement(\"object\");\n plugin.type = type;\n plugin.width = 0;\n plugin.height = 0;\n $(\"body\").append(plugin);\n plugin.maxAxes = 6;\n if (!plugin.status) {\n promptElement = displayInstallPrompt(\"Your browser does not yet handle joysticks, please click here to install the Boomstick plugin!\", \"https://github.com/STRd6/Boomstick/wiki\");\n periodicCheck = function() {\n if (plugin.status) {\n return promptElement.remove();\n } else {\n return setTimeout(periodicCheck, 500);\n }\n };\n return periodicCheck();\n }\n }\n },\n status: function() {\n return plugin != null ? plugin.status : void 0;\n },\n update: function() {\n var controller, _i, _len, _results;\n if (plugin.joysticksJSON) {\n previousJoysticks = joysticks;\n joysticks = JSON.parse(plugin.joysticksJSON());\n }\n _results = [];\n for (_i = 0, _len = controllers.length; _i < _len; _i++) {\n controller = controllers[_i];\n _results.push(controller != null ? controller.processEvents() : void 0);\n }\n return _results;\n },\n joysticks: function() {\n return joysticks;\n }\n };\n})();;\n/**\njQuery Hotkeys Plugin\nCopyright 2010, John Resig\nDual licensed under the MIT or GPL Version 2 licenses.\n\nBased upon the plugin by Tzury Bar Yochay:\nhttp://github.com/tzuryby/hotkeys\n\nOriginal idea by:\nBinny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/\n*/(function(jQuery) {\n var isFunctionKey, isTextAcceptingInput, keyHandler;\n isTextAcceptingInput = function(element) {\n return /textarea|select/i.test(element.nodeName) || element.type === \"text\" || element.type === \"password\";\n };\n isFunctionKey = function(event) {\n var _ref;\n return (event.type !== \"keypress\") && ((112 <= (_ref = event.which) && _ref <= 123));\n };\n jQuery.hotkeys = {\n version: \"0.8\",\n specialKeys: {\n 8: \"backspace\",\n 9: \"tab\",\n 13: \"return\",\n 16: \"shift\",\n 17: \"ctrl\",\n 18: \"alt\",\n 19: \"pause\",\n 20: \"capslock\",\n 27: \"esc\",\n 32: \"space\",\n 33: \"pageup\",\n 34: \"pagedown\",\n 35: \"end\",\n 36: \"home\",\n 37: \"left\",\n 38: \"up\",\n 39: \"right\",\n 40: \"down\",\n 45: \"insert\",\n 46: \"del\",\n 96: \"0\",\n 97: \"1\",\n 98: \"2\",\n 99: \"3\",\n 100: \"4\",\n 101: \"5\",\n 102: \"6\",\n 103: \"7\",\n 104: \"8\",\n 105: \"9\",\n 106: \"*\",\n 107: \"+\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 112: \"f1\",\n 113: \"f2\",\n 114: \"f3\",\n 115: \"f4\",\n 116: \"f5\",\n 117: \"f6\",\n 118: \"f7\",\n 119: \"f8\",\n 120: \"f9\",\n 121: \"f10\",\n 122: \"f11\",\n 123: \"f12\",\n 144: \"numlock\",\n 145: \"scroll\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 224: \"meta\"\n },\n shiftNums: {\n \"`\": \"~\",\n \"1\": \"!\",\n \"2\": \"@\",\n \"3\": \"#\",\n \"4\": \"$\",\n \"5\": \"%\",\n \"6\": \"^\",\n \"7\": \"&\",\n \"8\": \"*\",\n \"9\": \"(\",\n \"0\": \")\",\n \"-\": \"_\",\n \"=\": \"+\",\n \";\": \":\",\n \"'\": \"\\\"\",\n \",\": \"<\",\n \".\": \">\",\n \"/\": \"?\",\n \"\\\\\": \"|\"\n }\n };\n keyHandler = function(handleObj) {\n var keys, origHandler;\n if (typeof handleObj.data !== \"string\") {\n return;\n }\n origHandler = handleObj.handler;\n keys = handleObj.data.toLowerCase().split(\" \");\n return handleObj.handler = function(event) {\n var character, key, modif, possible, special, target, _i, _len;\n special = event.type !== \"keypress\" && jQuery.hotkeys.specialKeys[event.which];\n character = String.fromCharCode(event.which).toLowerCase();\n modif = \"\";\n possible = {};\n target = event.target;\n if (event.altKey && special !== \"alt\") {\n modif += \"alt+\";\n }\n if (event.ctrlKey && special !== \"ctrl\") {\n modif += \"ctrl+\";\n }\n if (event.metaKey && !event.ctrlKey && special !== \"meta\") {\n modif += \"meta+\";\n }\n if (this !== target) {\n if (isTextAcceptingInput(target) && !modif && !isFunctionKey(event)) {\n return;\n }\n }\n if (event.shiftKey && special !== \"shift\") {\n modif += \"shift+\";\n }\n if (special) {\n possible[modif + special] = true;\n } else {\n possible[modif + character] = true;\n possible[modif + jQuery.hotkeys.shiftNums[character]] = true;\n if (modif === \"shift+\") {\n possible[jQuery.hotkeys.shiftNums[character]] = true;\n }\n }\n for (_i = 0, _len = keys.length; _i < _len; _i++) {\n key = keys[_i];\n if (possible[key]) {\n return origHandler.apply(this, arguments);\n }\n }\n };\n };\n return jQuery.each([\"keydown\", \"keyup\", \"keypress\"], function() {\n return jQuery.event.special[this] = {\n add: keyHandler\n };\n });\n})(jQuery);;\n/**\nMerges properties from objects into target without overiding.\nFirst come, first served.\n\n@name reverseMerge\n@methodOf jQuery#\n\n@param {Object} target the object to merge the given properties onto\n@param {Object} objects... one or more objects whose properties are merged onto target\n\n@return {Object} target\n*/var __slice = Array.prototype.slice;\njQuery.extend({\n reverseMerge: function() {\n var name, object, objects, target, _i, _len;\n target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = objects.length; _i < _len; _i++) {\n object = objects[_i];\n for (name in object) {\n if (!target.hasOwnProperty(name)) {\n target[name] = object[name];\n }\n }\n }\n return target;\n }\n});;\n$(function() {\n /**\n The global keydown property lets your query the status of keys.\n\n <code><pre>\n if keydown.left\n moveLeft()\n\n if keydown.a or keydown.space\n attack()\n\n if keydown.return\n confirm()\n\n if keydown.esc\n cancel()\n </pre></code>\n\n @name keydown\n @namespace\n */\n /**\n The global justPressed property lets your query the status of keys. However, \n unlike keydown it will only trigger once for each time the key is pressed.\n\n <code><pre>\n if justPressed.left\n moveLeft()\n\n if justPressed.a or justPressed.space\n attack()\n\n if justPressed.return\n confirm()\n\n if justPressed.esc\n cancel()\n </pre></code>\n\n @name justPressed\n @namespace\n */ var keyName, prevKeysDown;\n window.keydown = {};\n window.justPressed = {};\n prevKeysDown = {};\n keyName = function(event) {\n return jQuery.hotkeys.specialKeys[event.which] || String.fromCharCode(event.which).toLowerCase();\n };\n $(document).bind(\"keydown\", function(event) {\n var key;\n key = keyName(event);\n return keydown[key] = true;\n });\n $(document).bind(\"keyup\", function(event) {\n var key;\n key = keyName(event);\n return keydown[key] = false;\n });\n return window.updateKeys = function() {\n var key, value, _results;\n window.justPressed = {};\n for (key in keydown) {\n value = keydown[key];\n if (!prevKeysDown[key]) {\n justPressed[key] = value;\n }\n }\n prevKeysDown = {};\n _results = [];\n for (key in keydown) {\n value = keydown[key];\n _results.push(prevKeysDown[key] = value);\n }\n return _results;\n };\n});;\n/**\nThe Music object provides an easy API to play\nsongs from your sounds project directory. By\ndefault, the track is looped.\n\n<code><pre>\n Music.play('intro_theme')\n</pre></code>\n\n@name Music\n@namespace\n*/var Music;\nMusic = (function() {\n var track;\n track = $(\"<audio />\", {\n loop: \"loop\"\n }).appendTo('body').get(0);\n track.volume = 1;\n return {\n play: function(name) {\n track.src = \"\" + BASE_URL + \"/sounds/\" + name + \".mp3\";\n return track.play();\n }\n };\n})();;\nvar __slice = Array.prototype.slice;\n(function($) {\n return $.fn.pixieCanvas = function(options) {\n var $canvas, canvas, canvasAttrAccessor, context, contextAttrAccessor;\n options || (options = {});\n canvas = this.get(0);\n context = void 0;\n /**\n PixieCanvas provides a convenient wrapper for working with Context2d.\n\n Methods try to be as flexible as possible as to what arguments they take.\n\n Non-getter methods return `this` for method chaining.\n\n @name PixieCanvas\n @constructor\n */\n $canvas = $(canvas).extend((function() {\n /**\n Passes this canvas to the block with the given matrix transformation\n applied. All drawing methods called within the block will draw\n into the canvas with the transformation applied. The transformation\n is removed at the end of the block, even if the block throws an error.\n\n @name withTransform\n @methodOf PixieCanvas#\n\n @param {Matrix} matrix\n @param {Function} block\n\n @returns {PixieCanvas} this\n */\n })(), {\n withTransform: function(matrix, block) {\n context.save();\n context.transform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n try {\n block(this);\n } finally {\n context.restore();\n }\n return this;\n }\n }, (function() {\n /**\n Clear the canvas (or a portion of it).\n\n Clear the entire canvas\n\n <code><pre>\n canvas.clear()\n </pre></code>\n\n Clear a portion of the canvas\n\n <code class=\"run\"><pre>\n # Set up: Fill canvas with blue\n canvas.fill(\"blue\") \n\n # Clear a portion of the canvas\n canvas.clear\n x: 50\n y: 50\n width: 50\n height: 50\n </pre></code>\n\n You can also clear the canvas by passing x, y, width height as\n unnamed parameters:\n\n <code><pre>\n canvas.clear(25, 25, 50, 50)\n </pre></code>\n\n @name clear\n @methodOf PixieCanvas#\n\n @param {Number} [x] where to start clearing on the x axis\n @param {Number} [y] where to start clearing on the y axis\n @param {Number} [width] width of area to clear\n @param {Number} [height] height of area to clear\n\n @returns {PixieCanvas} this\n */\n })(), {\n clear: function(x, y, width, height) {\n var _ref;\n if (x == null) {\n x = {};\n }\n if (y == null) {\n _ref = x, x = _ref.x, y = _ref.y, width = _ref.width, height = _ref.height;\n }\n x || (x = 0);\n y || (y = 0);\n if (width == null) {\n width = canvas.width;\n }\n if (height == null) {\n height = canvas.height;\n }\n context.clearRect(x, y, width, height);\n return this;\n }\n }, (function() {\n /**\n Fills the entire canvas (or a specified section of it) with\n the given color.\n\n <code class=\"run\"><pre>\n # Paint the town (entire canvas) red\n canvas.fill \"red\"\n\n # Fill a section of the canvas white (#FFF)\n canvas.fill\n x: 50\n y: 50\n width: 50\n height: 50\n color: \"#FFF\"\n </pre></code>\n\n @name fill\n @methodOf PixieCanvas#\n\n @param {Number} [x=0] Optional x position to fill from\n @param {Number} [y=0] Optional y position to fill from\n @param {Number} [width=canvas.width] Optional width of area to fill\n @param {Number} [height=canvas.height] Optional height of area to fill \n @param {Bounds} [bounds] bounds object to fill\n @param {String|Color} [color] color of area to fill\n\n @returns {PixieCanvas} this\n */\n })(), {\n fill: function(color) {\n var bounds, height, width, x, y, _ref;\n if (color == null) {\n color = {};\n }\n if (!((typeof color.isString === \"function\" ? color.isString() : void 0) || color.channels)) {\n _ref = color, x = _ref.x, y = _ref.y, width = _ref.width, height = _ref.height, bounds = _ref.bounds, color = _ref.color;\n }\n if (bounds) {\n x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;\n }\n x || (x = 0);\n y || (y = 0);\n if (width == null) {\n width = canvas.width;\n }\n if (height == null) {\n height = canvas.height;\n }\n this.fillColor(color);\n context.fillRect(x, y, width, height);\n return this;\n }\n }, (function() {\n /**\n A direct map to the Context2d draw image. `GameObject`s\n that implement drawable will have this wrapped up nicely,\n so there is a good chance that you will not have to deal with\n it directly.\n\n @name drawImage\n @methodOf PixieCanvas#\n\n @param image\n @param {Number} sx\n @param {Number} sy\n @param {Number} sWidth\n @param {Number} sHeight\n @param {Number} dx\n @param {Number} dy\n @param {Number} dWidth\n @param {Number} dHeight\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawImage: function(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) {\n context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n return this;\n }\n }, (function() {\n /**\n Draws a circle at the specified position with the specified\n radius and color.\n\n <code class=\"run\"><pre>\n # Draw a large orange circle\n canvas.drawCircle\n radius: 30\n position: Point(100, 75)\n color: \"orange\"\n\n # Draw a blue circle with radius 10 at (25, 50)\n # and a red stroke\n canvas.drawCircle\n x: 25\n y: 50\n radius: 10\n color: \"blue\"\n stroke:\n color: \"red\"\n width: 1\n\n # Create a circle object to set up the next examples\n circle =\n radius: 20\n x: 50\n y: 50\n\n # Draw a given circle in yellow\n canvas.drawCircle\n circle: circle\n color: \"yellow\"\n\n # Draw the circle in green at a different position\n canvas.drawCircle\n circle: circle\n position: Point(25, 75)\n color: \"green\"\n\n # Draw an outline circle in purple.\n canvas.drawCircle\n x: 50\n y: 75\n radius: 10\n stroke:\n color: \"purple\"\n width: 2\n </pre></code>\n\n @name drawCircle\n @methodOf PixieCanvas#\n\n @param {Number} [x] location on the x axis to start drawing\n @param {Number} [y] location on the y axis to start drawing\n @param {Point} [position] position object of location to start drawing. This will override x and y values passed\n @param {Number} [radius] length of the radius of the circle\n @param {Color|String} [color] color of the circle\n @param {Circle} [circle] circle object that contains position and radius. Overrides x, y, and radius if passed\n @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawCircle: function(_arg) {\n var circle, color, position, radius, stroke, x, y;\n x = _arg.x, y = _arg.y, radius = _arg.radius, position = _arg.position, color = _arg.color, stroke = _arg.stroke, circle = _arg.circle;\n if (circle) {\n x = circle.x, y = circle.y, radius = circle.radius;\n }\n if (position) {\n x = position.x, y = position.y;\n }\n context.beginPath();\n context.arc(x, y, radius, 0, Math.TAU, true);\n context.closePath();\n if (color) {\n this.fillColor(color);\n context.fill();\n }\n if (stroke) {\n this.strokeColor(stroke.color);\n this.lineWidth(stroke.width);\n context.stroke();\n }\n return this;\n }\n }, (function() {\n /**\n Draws a rectangle at the specified position with given \n width and height. Optionally takes a position, bounds\n and color argument.\n\n <code class=\"run\"><pre>\n # Draw a red rectangle using x, y, width and height\n canvas.drawRect\n x: 50\n y: 50\n width: 50\n height: 50\n color: \"#F00\"\n\n # Draw a blue rectangle using position, width and height\n # and throw in a stroke for good measure\n canvas.drawRect\n position: Point(0, 0)\n width: 50\n height: 50\n color: \"blue\"\n stroke:\n color: \"orange\"\n width: 3\n\n # Set up a bounds object for the next examples\n bounds =\n x: 100\n y: 0\n width: 100\n height: 100\n\n # Draw a purple rectangle using bounds\n canvas.drawRect\n bounds: bounds\n color: \"green\"\n\n # Draw the outline of the same bounds, but at a different position\n canvas.drawRect\n bounds: bounds\n position: Point(0, 50)\n stroke:\n color: \"purple\"\n width: 2\n </pre></code>\n\n @name drawRect\n @methodOf PixieCanvas#\n\n @param {Number} [x] location on the x axis to start drawing\n @param {Number} [y] location on the y axis to start drawing\n @param {Number} [width] width of rectangle to draw\n @param {Number} [height] height of rectangle to draw\n @param {Point} [position] position to start drawing. Overrides x and y if passed\n @param {Color|String} [color] color of rectangle\n @param {Bounds} [bounds] bounds of rectangle. Overrides x, y, width, height if passed\n @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawRect: function(_arg) {\n var bounds, color, height, position, stroke, width, x, y;\n x = _arg.x, y = _arg.y, width = _arg.width, height = _arg.height, position = _arg.position, bounds = _arg.bounds, color = _arg.color, stroke = _arg.stroke;\n if (bounds) {\n x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;\n }\n if (position) {\n x = position.x, y = position.y;\n }\n if (color) {\n this.fillColor(color);\n context.fillRect(x, y, width, height);\n }\n if (stroke) {\n this.strokeColor(stroke.color);\n this.lineWidth(stroke.width);\n context.strokeRect(x, y, width, height);\n }\n return this;\n }\n }, (function() {\n /**\n Draw a line from `start` to `end`.\n\n <code class=\"run\"><pre>\n # Draw a sweet diagonal\n canvas.drawLine\n start: Point(0, 0)\n end: Point(200, 200)\n color: \"purple\"\n\n # Draw another sweet diagonal\n canvas.drawLine\n start: Point(200, 0)\n end: Point(0, 200)\n color: \"red\"\n width: 6\n\n # Now draw a sweet horizontal with a direction and a length\n canvas.drawLine\n start: Point(0, 100)\n length: 200\n direction: Point(1, 0)\n color: \"orange\"\n\n </pre></code>\n\n @name drawLine\n @methodOf PixieCanvas#\n\n @param {Point} start position to start drawing from\n @param {Point} [end] position to stop drawing\n @param {Number} [width] width of the line\n @param {String|Color} [color] color of the line\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawLine: function(_arg) {\n var color, direction, end, length, start, width;\n start = _arg.start, end = _arg.end, width = _arg.width, color = _arg.color, direction = _arg.direction, length = _arg.length;\n width || (width = 3);\n if (direction) {\n end = direction.norm(length).add(start);\n }\n this.lineWidth(width);\n this.strokeColor(color);\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.closePath();\n context.stroke();\n return this;\n }\n }, (function() {\n /**\n Draw a polygon.\n\n <code class=\"run\"><pre>\n # Draw a sweet rhombus\n canvas.drawPoly\n points: [\n Point(50, 25)\n Point(75, 50)\n Point(50, 75)\n Point(25, 50)\n ]\n color: \"purple\"\n stroke:\n color: \"red\"\n width: 2\n </pre></code>\n\n @name drawPoly\n @methodOf PixieCanvas#\n\n @param {Point[]} [points] collection of points that define the vertices of the polygon\n @param {String|Color} [color] color of the polygon\n @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawPoly: function(_arg) {\n var color, points, stroke;\n points = _arg.points, color = _arg.color, stroke = _arg.stroke;\n context.beginPath();\n points.each(function(point, i) {\n if (i === 0) {\n return context.moveTo(point.x, point.y);\n } else {\n return context.lineTo(point.x, point.y);\n }\n });\n context.lineTo(points[0].x, points[0].y);\n if (color) {\n this.fillColor(color);\n context.fill();\n }\n if (stroke) {\n this.strokeColor(stroke.color);\n this.lineWidth(stroke.width);\n context.stroke();\n }\n return this;\n }\n }, (function() {\n /**\n Draw a rounded rectangle.\n\n Adapted from http://js-bits.blogspot.com/2010/07/canvas-rounded-corner-rectangles.html\n\n <code class=\"run\"><pre>\n # Draw a purple rounded rectangle with a red outline\n canvas.drawRoundRect\n position: Point(25, 25)\n radius: 10\n width: 150\n height: 100\n color: \"purple\"\n stroke:\n color: \"red\"\n width: 2\n </pre></code>\n\n @name drawRoundRect\n @methodOf PixieCanvas#\n\n @param {Number} [x] location on the x axis to start drawing\n @param {Number} [y] location on the y axis to start drawing\n @param {Number} [width] width of the rounded rectangle\n @param {Number} [height] height of the rounded rectangle\n @param {Number} [radius=5] radius to round the rectangle corners\n @param {Point} [position] position to start drawing. Overrides x and y if passed\n @param {Color|String} [color] color of the rounded rectangle\n @param {Bounds} [bounds] bounds of the rounded rectangle. Overrides x, y, width, and height if passed\n @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawRoundRect: function(_arg) {\n var bounds, color, height, position, radius, stroke, width, x, y;\n x = _arg.x, y = _arg.y, width = _arg.width, height = _arg.height, radius = _arg.radius, position = _arg.position, bounds = _arg.bounds, color = _arg.color, stroke = _arg.stroke;\n if (radius == null) {\n radius = 5;\n }\n if (bounds) {\n x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height;\n }\n if (position) {\n x = position.x, y = position.y;\n }\n context.beginPath();\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n context.closePath();\n if (color) {\n this.fillColor(color);\n context.fill();\n }\n if (stroke) {\n this.lineWidth(stroke.width);\n this.strokeColor(stroke.color);\n context.stroke();\n }\n return this;\n }\n }, (function() {\n /**\n Draws text on the canvas at the given position, in the given color.\n If no color is given then the previous fill color is used.\n\n <code class=\"run\"><pre>\n # Fill canvas to indicate bounds\n canvas.fill\n color: '#eee'\n\n # A line to indicate the baseline\n canvas.drawLine\n start: Point(25, 50)\n end: Point(125, 50)\n color: \"#333\"\n width: 1\n\n # Draw some text, note the position of the baseline\n canvas.drawText\n position: Point(25, 50)\n color: \"red\"\n text: \"It's dangerous to go alone\"\n\n </pre></code>\n\n @name drawText\n @methodOf PixieCanvas#\n\n @param {Number} [x] location on x axis to start printing\n @param {Number} [y] location on y axis to start printing\n @param {String} text text to print\n @param {Point} [position] position to start printing. Overrides x and y if passed\n @param {String|Color} [color] color of text to start printing\n\n @returns {PixieCanvas} this\n */\n })(), {\n drawText: function(_arg) {\n var color, position, text, x, y;\n x = _arg.x, y = _arg.y, text = _arg.text, position = _arg.position, color = _arg.color;\n if (position) {\n x = position.x, y = position.y;\n }\n this.fillColor(color);\n context.fillText(text, x, y);\n return this;\n }\n }, (function() {\n /**\n Centers the given text on the canvas at the given y position. An x position\n or point position can also be given in which case the text is centered at the\n x, y or position value specified.\n\n <code class=\"run\"><pre>\n # Fill canvas to indicate bounds\n canvas.fill\n color: \"#eee\"\n\n # A line to indicate the baseline\n canvas.drawLine\n start: Point(25, 25)\n end: Point(125, 25)\n color: \"#333\"\n width: 1\n\n # Center text on the screen at y value 25\n canvas.centerText\n y: 25\n color: \"red\"\n text: \"It's dangerous to go alone\"\n\n # Center text at point (75, 75)\n canvas.centerText\n position: Point(75, 75)\n color: \"green\"\n text: \"take this\"\n\n </pre></code>\n\n @name centerText\n @methodOf PixieCanvas#\n\n @param {String} text Text to print\n @param {Number} [y] location on the y axis to start printing\n @param {Number} [x] location on the x axis to start printing. Overrides the default centering behavior if passed\n @param {Point} [position] position to start printing. Overrides x and y if passed\n @param {String|Color} [color] color of text to print\n\n @returns {PixieCanvas} this\n */\n })(), {\n centerText: function(_arg) {\n var color, position, text, textWidth, x, y;\n text = _arg.text, x = _arg.x, y = _arg.y, position = _arg.position, color = _arg.color;\n if (position) {\n x = position.x, y = position.y;\n }\n if (x == null) {\n x = canvas.width / 2;\n }\n textWidth = this.measureText(text);\n return this.drawText({\n text: text,\n color: color,\n x: x - textWidth / 2,\n y: y\n });\n }\n }, (function() {\n /**\n A getter / setter method to set the canvas fillColor.\n\n <code><pre>\n # Set the fill color\n canvas.fillColor('#FF0000')\n\n # Passing no arguments returns the fillColor\n canvas.fillColor()\n # => '#FF0000'\n\n # You can also pass a Color object\n canvas.fillColor(Color('sky blue'))\n </pre></code> \n\n @name fillColor\n @methodOf PixieCanvas#\n\n @param {String|Color} [color] color to make the canvas fillColor \n\n @returns {PixieCanvas} this\n */\n })(), {\n fillColor: function(color) {\n if (color) {\n if (color.channels) {\n context.fillStyle = color.toString();\n } else {\n context.fillStyle = color;\n }\n return this;\n } else {\n return context.fillStyle;\n }\n }\n }, (function() {\n /**\n A getter / setter method to set the canvas strokeColor.\n\n <code><pre>\n # Set the stroke color\n canvas.strokeColor('#FF0000')\n\n # Passing no arguments returns the strokeColor\n canvas.strokeColor()\n # => '#FF0000'\n\n # You can also pass a Color object\n canvas.strokeColor(Color('sky blue'))\n </pre></code> \n\n @name strokeColor\n @methodOf PixieCanvas#\n\n @param {String|Color} [color] color to make the canvas strokeColor \n\n @returns {PixieCanvas} this\n */\n })(), {\n strokeColor: function(color) {\n if (color) {\n if (color.channels) {\n context.strokeStyle = color.toString();\n } else {\n context.strokeStyle = color;\n }\n return this;\n } else {\n return context.strokeStyle;\n }\n }\n }, (function() {\n /**\n Determine how wide some text is.\n\n <code><pre>\n canvas.measureText('Hello World!')\n # => 55\n </pre></code> \n\n @name measureText\n @methodOf PixieCanvas#\n\n @param {String} [text] the text to measure \n\n @returns {PixieCanvas} this\n */\n })(), {\n measureText: function(text) {\n return context.measureText(text).width;\n },\n putImageData: function(imageData, x, y) {\n context.putImageData(imageData, x, y);\n return this;\n },\n context: function() {\n return context;\n },\n element: function() {\n return canvas;\n },\n createPattern: function(image, repitition) {\n return context.createPattern(image, repitition);\n }\n });\n contextAttrAccessor = function() {\n var attrs;\n attrs = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrs.each(function(attr) {\n return $canvas[attr] = function(newVal) {\n if (newVal != null) {\n context[attr] = newVal;\n return this;\n } else {\n return context[attr];\n }\n };\n });\n };\n canvasAttrAccessor = function() {\n var attrs;\n attrs = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrs.each(function(attr) {\n return $canvas[attr] = function(newVal) {\n if (newVal != null) {\n canvas[attr] = newVal;\n return this;\n } else {\n return canvas[attr];\n }\n };\n });\n };\n contextAttrAccessor(\"font\", \"globalAlpha\", \"globalCompositeOperation\", \"lineWidth\", \"textAlign\");\n canvasAttrAccessor(\"height\", \"width\");\n if (canvas != null ? canvas.getContext : void 0) {\n context = canvas.getContext('2d');\n if (options.init) {\n options.init($canvas);\n }\n return $canvas;\n }\n };\n})(jQuery);;\nvar __slice = Array.prototype.slice;\n(function($) {\n return $.fn.powerCanvas = function(options) {\n var $canvas, canvas, context;\n options || (options = {});\n canvas = this.get(0);\n context = void 0;\n /**\n * PowerCanvas provides a convenient wrapper for working with Context2d.\n * @name PowerCanvas\n * @deprecated Use {@link PixieCanvas} instead\n * @constructor\n */\n $canvas = $(canvas).extend((function() {\n /**\n * Passes this canvas to the block with the given matrix transformation\n * applied. All drawing methods called within the block will draw\n * into the canvas with the transformation applied. The transformation\n * is removed at the end of the block, even if the block throws an error.\n *\n * @name withTransform\n * @methodOf PowerCanvas#\n *\n * @param {Matrix} matrix\n * @param {Function} block\n * @returns this\n */\n })(), {\n withTransform: function(matrix, block) {\n context.save();\n context.transform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n try {\n block(this);\n } finally {\n context.restore();\n }\n return this;\n },\n clear: function() {\n context.clearRect(0, 0, canvas.width, canvas.height);\n return this;\n },\n clearRect: function(x, y, width, height) {\n context.clearRect(x, y, width, height);\n return this;\n },\n context: function() {\n return context;\n },\n element: function() {\n return canvas;\n },\n globalAlpha: function(newVal) {\n if (newVal != null) {\n context.globalAlpha = newVal;\n return this;\n } else {\n return context.globalAlpha;\n }\n },\n compositeOperation: function(newVal) {\n if (newVal != null) {\n context.globalCompositeOperation = newVal;\n return this;\n } else {\n return context.globalCompositeOperation;\n }\n },\n createLinearGradient: function(x0, y0, x1, y1) {\n return context.createLinearGradient(x0, y0, x1, y1);\n },\n createRadialGradient: function(x0, y0, r0, x1, y1, r1) {\n return context.createRadialGradient(x0, y0, r0, x1, y1, r1);\n },\n buildRadialGradient: function(c1, c2, stops) {\n var color, gradient, position;\n gradient = context.createRadialGradient(c1.x, c1.y, c1.radius, c2.x, c2.y, c2.radius);\n for (position in stops) {\n color = stops[position];\n gradient.addColorStop(position, color);\n }\n return gradient;\n },\n createPattern: function(image, repitition) {\n return context.createPattern(image, repitition);\n },\n drawImage: function(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) {\n context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n return this;\n },\n drawLine: function(x1, y1, x2, y2, width) {\n if (arguments.length === 3) {\n width = x2;\n x2 = y1.x;\n y2 = y1.y;\n y1 = x1.y;\n x1 = x1.x;\n }\n width || (width = 3);\n context.lineWidth = width;\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.closePath();\n context.stroke();\n return this;\n },\n fill: function(color) {\n $canvas.fillColor(color);\n context.fillRect(0, 0, canvas.width, canvas.height);\n return this;\n }\n }, (function() {\n /**\n * Fills a circle at the specified position with the specified\n * radius and color.\n *\n * @name fillCircle\n * @methodOf PowerCanvas#\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} radius\n * @param {Number} color\n * @see PowerCanvas#fillColor \n * @returns this\n */\n })(), {\n fillCircle: function(x, y, radius, color) {\n $canvas.fillColor(color);\n context.beginPath();\n context.arc(x, y, radius, 0, Math.TAU, true);\n context.closePath();\n context.fill();\n return this;\n }\n }, (function() {\n /**\n * Fills a rectangle with the current fillColor\n * at the specified position with the specified\n * width and height \n\n * @name fillRect\n * @methodOf PowerCanvas#\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n * @see PowerCanvas#fillColor \n * @returns this\n */\n })(), {\n fillRect: function(x, y, width, height) {\n context.fillRect(x, y, width, height);\n return this;\n },\n fillShape: function() {\n var points;\n points = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n context.beginPath();\n points.each(function(point, i) {\n if (i === 0) {\n return context.moveTo(point.x, point.y);\n } else {\n return context.lineTo(point.x, point.y);\n }\n });\n context.lineTo(points[0].x, points[0].y);\n return context.fill();\n }\n }, (function() {\n /**\n * Adapted from http://js-bits.blogspot.com/2010/07/canvas-rounded-corner-rectangles.html\n */\n })(), {\n fillRoundRect: function(x, y, width, height, radius, strokeWidth) {\n radius || (radius = 5);\n context.beginPath();\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n context.closePath();\n if (strokeWidth) {\n context.lineWidth = strokeWidth;\n context.stroke();\n }\n context.fill();\n return this;\n },\n fillText: function(text, x, y) {\n context.fillText(text, x, y);\n return this;\n },\n centerText: function(text, y) {\n var textWidth;\n textWidth = $canvas.measureText(text);\n return $canvas.fillText(text, (canvas.width - textWidth) / 2, y);\n },\n fillWrappedText: function(text, x, y, width) {\n var lineHeight, tokens, tokens2;\n tokens = text.split(\" \");\n tokens2 = text.split(\" \");\n lineHeight = 16;\n if ($canvas.measureText(text) > width) {\n if (tokens.length % 2 === 0) {\n tokens2 = tokens.splice(tokens.length / 2, tokens.length / 2, \"\");\n } else {\n tokens2 = tokens.splice(tokens.length / 2 + 1, (tokens.length / 2) + 1, \"\");\n }\n context.fillText(tokens.join(\" \"), x, y);\n return context.fillText(tokens2.join(\" \"), x, y + lineHeight);\n } else {\n return context.fillText(tokens.join(\" \"), x, y + lineHeight);\n }\n },\n fillColor: function(color) {\n if (color) {\n if (color.channels) {\n context.fillStyle = color.toString();\n } else {\n context.fillStyle = color;\n }\n return this;\n } else {\n return context.fillStyle;\n }\n },\n font: function(font) {\n if (font != null) {\n context.font = font;\n return this;\n } else {\n return context.font;\n }\n },\n measureText: function(text) {\n return context.measureText(text).width;\n },\n putImageData: function(imageData, x, y) {\n context.putImageData(imageData, x, y);\n return this;\n },\n strokeColor: function(color) {\n if (color) {\n if (color.channels) {\n context.strokeStyle = color.toString();\n } else {\n context.strokeStyle = color;\n }\n return this;\n } else {\n return context.strokeStyle;\n }\n },\n strokeCircle: function(x, y, radius, color) {\n $canvas.strokeColor(color);\n context.beginPath();\n context.arc(x, y, radius, 0, Math.TAU, true);\n context.closePath();\n context.stroke();\n return this;\n },\n strokeRect: function(x, y, width, height) {\n context.strokeRect(x, y, width, height);\n return this;\n },\n textAlign: function(textAlign) {\n context.textAlign = textAlign;\n return this;\n },\n height: function() {\n return canvas.height;\n },\n width: function() {\n return canvas.width;\n }\n });\n if (canvas != null ? canvas.getContext : void 0) {\n context = canvas.getContext('2d');\n if (options.init) {\n options.init($canvas);\n }\n return $canvas;\n }\n };\n})(jQuery);;\n/**\nA browser polyfill so you can consistently \ncall requestAnimationFrame. Using \nrequestAnimationFrame is preferred to \nsetInterval for main game loops.\n\nhttp://paulirish.com/2011/requestanimationframe-for-smart-animating/\n\n@name requestAnimationFrame\n@namespace\n*/window.requestAnimationFrame || (window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {\n return window.setTimeout(function() {\n return callback(+new Date());\n }, 1000 / 60);\n});;\n(function($) {\n /**\n A simple interface for playing sounds in games.\n\n @name Sound\n @namespace\n */ var Sound, directory, format, loadSoundChannel, sounds, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref.sounds : void 0 : void 0) || \"sounds\";\n format = \"wav\";\n sounds = {};\n loadSoundChannel = function(name) {\n var sound, url;\n url = \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".\" + format;\n return sound = $('<audio />', {\n autobuffer: true,\n preload: 'auto',\n src: url\n }).get(0);\n };\n Sound = function(id, maxChannels) {\n return {\n play: function() {\n return Sound.play(id, maxChannels);\n },\n stop: function() {\n return Sound.stop(id);\n }\n };\n };\n return Object.extend(Sound, (function() {\n /**\n Play a sound from your sounds \n directory with the name of `id`.\n\n <code><pre>\n # plays a sound called explode from your sounds directory\n Sound.play('explode')\n </pre></code>\n\n @name play\n @methodOf Sound\n\n @param {String} id id or name of the sound file to play\n @param {String} maxChannels max number of sounds able to be played simultaneously\n */\n })(), {\n play: function(id, maxChannels) {\n var channel, channels, freeChannels, sound;\n maxChannels || (maxChannels = 4);\n if (!sounds[id]) {\n sounds[id] = [loadSoundChannel(id)];\n }\n channels = sounds[id];\n freeChannels = $.grep(channels, function(sound) {\n return sound.currentTime === sound.duration || sound.currentTime === 0;\n });\n if (channel = freeChannels.first()) {\n try {\n channel.currentTime = 0;\n } catch (_e) {}\n return channel.play();\n } else {\n if (!maxChannels || channels.length < maxChannels) {\n sound = loadSoundChannel(id);\n channels.push(sound);\n return sound.play();\n }\n }\n }\n }, (function() {\n /**\n Play a sound from the given\n url with the name of `id`.\n\n <code><pre>\n # plays the sound at the specified url\n Sound.playFromUrl('http://YourSoundWebsite.com/explode.wav')\n </pre></code>\n\n @name playFromUrl\n @methodOf Sound\n\n @param {String} url location of sound file to play\n\n @returns {Sound} this sound object\n */\n })(), {\n playFromUrl: function(url) {\n var sound;\n sound = $('<audio />').get(0);\n sound.src = url;\n sound.play();\n return sound;\n }\n }, (function() {\n /**\n Stop a sound while it is playing.\n\n <code><pre>\n # stops the sound 'explode' from \n # playing if it is currently playing \n Sound.stop('explode')\n </pre></code>\n\n @name stop\n @methodOf Sound\n\n @param {String} id id or name of sound to stop playing.\n */\n })(), {\n stop: function(id) {\n var _ref2;\n return (_ref2 = sounds[id]) != null ? _ref2.stop() : void 0;\n }\n }, (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Sound\"] = Sound);\n})(jQuery);;\n(function() {\n /**\n A wrapper on the Local Storage API \n\n @name Local\n @namespace\n */\n /**\n Store an object in local storage.\n\n <code><pre>\n # you can store strings\n Local.set('name', 'Matt')\n\n # and numbers\n Local.set('age', 26)\n\n # and even objects\n Local.set('person', {name: 'Matt', age: 26})\n </pre></code>\n\n @name set\n @methodOf Local\n\n @param {String} key string used to identify the object you are storing\n @param {Object} value value of the object you are storing\n\n @returns {Object} value\n */ var retrieve, store;\n store = function(key, value) {\n localStorage[key] = JSON.stringify(value);\n return value;\n };\n /**\n Retrieve an object from local storage.\n\n <code><pre>\n Local.get('name')\n # => 'Matt'\n\n Local.get('age')\n # => 26\n\n Local.get('person')\n # => { age: 26, name: 'Matt' }\n </pre></code>\n\n @name get\n @methodOf Local\n\n @param {String} key string that identifies the stored object\n\n @returns {Object} The object that was stored or undefined if no object was stored.\n */\n retrieve = function(key) {\n var value;\n value = localStorage[key];\n if (value != null) {\n return JSON.parse(value);\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Local\"] = {\n get: retrieve,\n set: store,\n put: store,\n /**\n Access an instance of Local with a specified prefix.\n\n @name new\n @methodOf Local\n\n @param {String} prefix \n @returns {Local} An interface to local storage with the given prefix applied.\n */\n \"new\": function(prefix) {\n prefix || (prefix = \"\");\n return {\n get: function(key) {\n return retrieve(\"\" + prefix + \"_\" + key);\n },\n set: function(key, value) {\n return store(\"\" + prefix + \"_\" + key, value);\n },\n put: function(key, value) {\n return store(\"\" + prefix + \"_\" + key, value);\n }\n };\n }\n };\n})();;\n;\n","size":51157,"mtime":1320340625},{"path":"lib/extralib.js","type":"blob","contents":";\n;\n/**\nThe Animated module, when included in a GameObject, gives the object \nmethods to transition from one animation state to another\n\n@name Animated\n@module\n@constructor\n\n@param {Object} I Instance variables\n@param {Object} self Reference to including object\n*/var Animated;\nAnimated = function(I, self) {\n var advanceFrame, find, initializeState, loadByName, updateSprite, _name, _ref;\n I || (I = {});\n $.reverseMerge(I, {\n animationName: (_ref = I[\"class\"]) != null ? _ref.underscore() : void 0,\n data: {\n version: \"\",\n tileset: [\n {\n id: 0,\n src: \"\",\n title: \"\",\n circles: [\n {\n x: 0,\n y: 0,\n radius: 0\n }\n ]\n }\n ],\n animations: [\n {\n name: \"\",\n complete: \"\",\n interruptible: false,\n speed: \"\",\n transform: [\n {\n hflip: false,\n vflip: false\n }\n ],\n triggers: {\n \"0\": [\"a trigger\"]\n },\n frames: [0],\n transform: [void 0]\n }\n ]\n },\n activeAnimation: {\n name: \"\",\n complete: \"\",\n interruptible: false,\n speed: \"\",\n transform: [\n {\n hflip: false,\n vflip: false\n }\n ],\n triggers: {\n \"0\": [\"\"]\n },\n frames: [0]\n },\n currentFrameIndex: 0,\n debugAnimation: false,\n hflip: false,\n vflip: false,\n lastUpdate: new Date().getTime(),\n useTimer: false\n });\n loadByName = function(name, callback) {\n var url;\n url = \"\" + BASE_URL + \"/animations/\" + name + \".animation?\" + (new Date().getTime());\n $.getJSON(url, function(data) {\n I.data = data;\n return typeof callback === \"function\" ? callback(data) : void 0;\n });\n return I.data;\n };\n initializeState = function() {\n I.activeAnimation = I.data.animations.first();\n return I.spriteLookup = I.data.tileset.map(function(spriteData) {\n return Sprite.fromURL(spriteData.src);\n });\n };\n window[_name = \"\" + I.animationName + \"SpriteLookup\"] || (window[_name] = []);\n if (!window[\"\" + I.animationName + \"SpriteLookup\"].length) {\n window[\"\" + I.animationName + \"SpriteLookup\"] = I.data.tileset.map(function(spriteData) {\n return Sprite.fromURL(spriteData.src);\n });\n }\n I.spriteLookup = window[\"\" + I.animationName + \"SpriteLookup\"];\n if (I.data.animations.first().name !== \"\") {\n initializeState();\n } else if (I.animationName) {\n loadByName(I.animationName, function() {\n return initializeState();\n });\n } else {\n throw \"No animation data provided. Use animationName to specify an animation to load from the project or pass in raw JSON to the data key.\";\n }\n advanceFrame = function() {\n var frames, nextState, sprite;\n frames = I.activeAnimation.frames;\n if (I.currentFrameIndex === frames.indexOf(frames.last())) {\n self.trigger(\"Complete\");\n if (nextState = I.activeAnimation.complete) {\n I.activeAnimation = find(nextState) || I.activeAnimation;\n I.currentFrameIndex = 0;\n }\n } else {\n I.currentFrameIndex = (I.currentFrameIndex + 1) % frames.length;\n }\n sprite = I.spriteLookup[frames[I.currentFrameIndex]];\n return updateSprite(sprite);\n };\n find = function(name) {\n var nameLower, result;\n result = null;\n nameLower = name.toLowerCase();\n I.data.animations.each(function(animation) {\n if (animation.name.toLowerCase() === nameLower) {\n return result = animation;\n }\n });\n return result;\n };\n updateSprite = function(spriteData) {\n I.sprite = spriteData;\n I.width = spriteData.width;\n return I.height = spriteData.height;\n };\n return {\n /**\n Transitions to a new active animation. Will not transition if the new state\n has the same name as the current one or if the active animation is marked as locked.\n\n @param {String} newState The name of the target state you wish to transition to.\n */\n transition: function(newState, force) {\n var toNextState;\n if (newState === I.activeAnimation.name) {\n return;\n }\n toNextState = function(state) {\n var firstFrame, firstSprite, nextState;\n if (nextState = find(state)) {\n I.activeAnimation = nextState;\n firstFrame = I.activeAnimation.frames.first();\n firstSprite = I.spriteLookup[firstFrame];\n I.currentFrameIndex = 0;\n return updateSprite(firstSprite);\n } else {\n if (I.debugAnimation) {\n return warn(\"Could not find animation state '\" + newState + \"'. The current transition will be ignored\");\n }\n }\n };\n if (force) {\n return toNextState(newState);\n } else {\n if (!I.activeAnimation.interruptible) {\n if (I.debugAnimation) {\n warn(\"Cannot transition to '\" + newState + \"' because '\" + I.activeAnimation.name + \"' is locked\");\n }\n return;\n }\n return toNextState(newState);\n }\n },\n before: {\n update: function() {\n var time, triggers, updateFrame, _ref2, _ref3;\n if (I.useTimer) {\n time = new Date().getTime();\n if (updateFrame = (time - I.lastUpdate) >= I.activeAnimation.speed) {\n I.lastUpdate = time;\n if (triggers = (_ref2 = I.activeAnimation.triggers) != null ? _ref2[I.currentFrameIndex] : void 0) {\n triggers.each(function(event) {\n return self.trigger(event);\n });\n }\n return advanceFrame();\n }\n } else {\n if (triggers = (_ref3 = I.activeAnimation.triggers) != null ? _ref3[I.currentFrameIndex] : void 0) {\n triggers.each(function(event) {\n return self.trigger(event);\n });\n }\n return advanceFrame();\n }\n }\n }\n };\n};;\n(function() {\n var Animation, fromPixieId;\n Animation = function(data) {\n var activeAnimation, advanceFrame, currentSprite, spriteLookup;\n spriteLookup = {};\n activeAnimation = data.animations[0];\n currentSprite = data.animations[0].frames[0];\n advanceFrame = function(animation) {\n var frames;\n frames = animation.frames;\n return currentSprite = frames[(frames.indexOf(currentSprite) + 1) % frames.length];\n };\n data.tileset.each(function(spriteData, i) {\n return spriteLookup[i] = Sprite.fromURL(spriteData.src);\n });\n return $.extend(data, {\n currentSprite: function() {\n return currentSprite;\n },\n draw: function(canvas, x, y) {\n return canvas.withTransform(Matrix.translation(x, y), function() {\n return spriteLookup[currentSprite].draw(canvas, 0, 0);\n });\n },\n frames: function() {\n return activeAnimation.frames;\n },\n update: function() {\n return advanceFrame(activeAnimation);\n },\n active: function(name) {\n if (name !== void 0) {\n if (data.animations[name]) {\n return currentSprite = data.animations[name].frames[0];\n }\n } else {\n return activeAnimation;\n }\n }\n });\n };\n window.Animation = function(name, callback) {\n return fromPixieId(App.Animations[name], callback);\n };\n fromPixieId = function(id, callback) {\n var proxy, url;\n url = \"http://pixie.strd6.com/s3/animations/\" + id + \"/data.json\";\n proxy = {\n active: $.noop,\n draw: $.noop\n };\n $.getJSON(url, function(data) {\n $.extend(proxy, Animation(data));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n return window.Animation.fromPixieId = fromPixieId;\n})();;\n(function($) {\n /**\n The <code>Developer</code> module provides a debug overlay and methods for debugging and live coding.\n\n @name Developer\n @fieldOf Engine\n @module\n\n @param {Object} I Instance variables\n @param {Object} self Reference to the engine\n */ var developerHotkeys, developerMode, developerModeMousedown, namespace, objectToUpdate;\n Engine.Developer = function(I, self) {\n var boxHeight, boxWidth, font, lineHeight, margin, screenHeight, screenWidth, textStart;\n screenWidth = (typeof App !== \"undefined\" && App !== null ? App.width : void 0) || 480;\n screenHeight = (typeof App !== \"undefined\" && App !== null ? App.height : void 0) || 320;\n margin = 10;\n boxWidth = 240;\n boxHeight = 60;\n textStart = screenWidth - boxWidth + margin;\n font = \"bold 9pt arial\";\n lineHeight = 16;\n self.bind(\"draw\", function(canvas) {\n if (I.paused) {\n canvas.withTransform(I.cameraTransform, function(canvas) {\n return I.objects.each(function(object) {\n canvas.fillColor('rgba(255, 0, 0, 0.5)');\n return canvas.fillRect(object.bounds().x, object.bounds().y, object.bounds().width, object.bounds().height);\n });\n });\n canvas.font(font);\n canvas.fillColor('rgba(0, 0, 0, 0.5)');\n canvas.fillRect(screenWidth - boxWidth, 0, boxWidth, boxHeight);\n canvas.fillColor('#fff');\n canvas.fillText(\"Developer Mode. Press Esc to resume\", textStart, margin + 5);\n canvas.fillText(\"Shift+Left click to add boxes\", textStart, margin + 5 + lineHeight);\n return canvas.fillText(\"Right click red boxes to edit properties\", textStart, margin + 5 + 2 * lineHeight);\n }\n });\n self.bind(\"init\", function() {\n var fn, key, _results;\n window.updateObjectProperties = function(newProperties) {\n if (objectToUpdate) {\n return Object.extend(objectToUpdate, GameObject.construct(newProperties));\n }\n };\n $(document).unbind(\".\" + namespace);\n $(document).bind(\"mousedown.\" + namespace, developerModeMousedown);\n _results = [];\n for (key in developerHotkeys) {\n fn = developerHotkeys[key];\n _results.push((function(key, fn) {\n return $(document).bind(\"keydown.\" + namespace, key, function(event) {\n event.preventDefault();\n return fn();\n });\n })(key, fn));\n }\n return _results;\n });\n return {};\n };\n namespace = \"engine_developer\";\n developerMode = false;\n objectToUpdate = null;\n developerModeMousedown = function(event) {\n var object;\n if (developerMode) {\n console.log(event.which);\n if (event.which === 3) {\n if (object = engine.objectAt(event.pageX, event.pageY)) {\n parent.editProperties(object.I);\n objectToUpdate = object;\n }\n return console.log(object);\n } else if (event.which === 2 || keydown.shift) {\n return typeof window.developerAddObject === \"function\" ? window.developerAddObject(event) : void 0;\n }\n }\n };\n return developerHotkeys = {\n esc: function() {\n developerMode = !developerMode;\n if (developerMode) {\n return engine.pause();\n } else {\n return engine.play();\n }\n },\n f3: function() {\n return Local.set(\"level\", engine.saveState());\n },\n f4: function() {\n return engine.loadState(Local.get(\"level\"));\n },\n f5: function() {\n return engine.reload();\n }\n };\n})(jQuery);;\n/**\nThe <code>FPSCounter</code> module tracks and displays the framerate.\n\n<code><pre>\nwindow.engine = Engine\n ...\n includedModules: [\"FPSCounter\"]\n FPSColor: \"#080\"\n</pre></code>\n\n@name FPSCounter\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.FPSCounter = function(I, self) {\n var framerate;\n Object.reverseMerge(I, {\n showFPS: true,\n FPSColor: \"#FFF\"\n });\n framerate = Framerate({\n noDOM: true\n });\n return self.bind(\"overlay\", function(canvas) {\n if (I.showFPS) {\n canvas.font(\"bold 9pt consolas, 'Courier New', 'andale mono', 'lucida console', monospace\");\n canvas.drawText({\n color: I.FPSColor,\n position: Point(6, 18),\n text: \"fps: \" + framerate.fps\n });\n }\n return framerate.rendered();\n });\n};;\n/**\nThe <code>HUD</code> module provides an extra canvas to draw to. GameObjects that respond to the\n<code>drawHUD</code> method will draw to the HUD canvas. The HUD canvas is not cleared each frame, it is\nthe responsibility of the objects drawing on it to manage that themselves.\n\n@name HUD\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.HUD = function(I, self) {\n var hudCanvas;\n hudCanvas = $(\"<canvas width=\" + App.width + \" height=\" + App.height + \" />\").powerCanvas();\n hudCanvas.font(\"bold 9pt consolas, 'Courier New', 'andale mono', 'lucida console', monospace\");\n self.bind(\"draw\", function(canvas) {\n var hud;\n I.objects.each(function(object) {\n return typeof object.drawHUD === \"function\" ? object.drawHUD(hudCanvas) : void 0;\n });\n hud = hudCanvas.element();\n return canvas.drawImage(hud, 0, 0, hud.width, hud.height, 0, 0, hud.width, hud.height);\n });\n return {};\n};;\n(function($) {\n /**\n The <code>Joysticks</code> module gives the engine access to joysticks.\n\n <code><pre>\n # First you need to add the joysticks module to the engine\n window.engine = Engine\n ...\n includedModules: [\"Joysticks\"]\n # Then you need to get a controller reference\n # id = 0 for player 1, etc.\n controller = engine.controller(id)\n\n # Point indicating direction primary axis is held\n direction = controller.position()\n\n # Check if buttons are held\n controller.actionDown(\"A\")\n controller.actionDown(\"B\")\n controller.actionDown(\"X\")\n controller.actionDown(\"Y\")\n </pre></code>\n\n @name Joysticks\n @fieldOf Engine\n @module\n\n @param {Object} I Instance variables\n @param {Object} self Reference to the engine\n */ return Engine.Joysticks = function(I, self) {\n Joysticks.init();\n self.bind(\"update\", function() {\n Joysticks.init();\n return Joysticks.update();\n });\n return {\n /**\n Get a controller for a given joystick id.\n\n @name controller\n @methodOf Engine.Joysticks#\n\n @param {Number} i The joystick id to get the controller of.\n */\n controller: function(i) {\n return Joysticks.getController(i);\n }\n };\n };\n})();;\n/**\nThe <code>Shadows</code> module provides a lighting extension to the Engine. Objects that have\nan illuminate method will add light to the scene. Objects that have an true opaque attribute will cast\nshadows.\n\n@name Shadows\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Shadows = function(I, self) {\n var shadowCanvas;\n shadowCanvas = $(\"<canvas width=640 height=480 />\").powerCanvas();\n self.bind(\"draw\", function(canvas) {\n var shadows;\n if (I.ambientLight < 1) {\n shadowCanvas.compositeOperation(\"source-over\");\n shadowCanvas.clear();\n shadowCanvas.fill(\"rgba(0, 0, 0, \" + (1 - I.ambientLight) + \")\");\n shadowCanvas.compositeOperation(\"destination-out\");\n shadowCanvas.withTransform(I.cameraTransform, function(shadowCanvas) {\n return I.objects.each(function(object, i) {\n if (object.illuminate) {\n shadowCanvas.globalAlpha(1);\n return object.illuminate(shadowCanvas);\n }\n });\n });\n shadows = shadowCanvas.element();\n return canvas.drawImage(shadows, 0, 0, shadows.width, shadows.height, 0, 0, shadows.width, shadows.height);\n }\n });\n return {};\n};;\n/**\nThe <code>Tilemap</code> module provides a way to load tilemaps in the engine.\n\n@name Tilemap\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Tilemap = function(I, self) {\n var clearObjects, map, updating;\n map = null;\n updating = false;\n clearObjects = false;\n self.bind(\"preDraw\", function(canvas) {\n return map != null ? map.draw(canvas) : void 0;\n });\n self.bind(\"update\", function() {\n return updating = true;\n });\n self.bind(\"afterUpdate\", function() {\n updating = false;\n if (clearObjects) {\n I.objects.clear();\n return clearObjects = false;\n }\n });\n return {\n /**\n Loads a new may and unloads any existing map or entities.\n\n @name loadMap\n @methodOf Engine#\n */\n loadMap: function(name, complete) {\n clearObjects = updating;\n return map = Tilemap.load({\n name: name,\n complete: complete,\n entity: self.add\n });\n }\n };\n};;\n/**\nThis object keeps track of framerate and displays it by creating and appending an\nhtml element to the DOM.\n\nOnce created you call snapshot at the end of every rendering cycle.\n\n@name Framerate\n@constructor\n*/var Framerate;\nFramerate = function(options) {\n var element, framerateUpdateInterval, framerates, numFramerates, renderTime, self, updateFramerate;\n options || (options = {});\n if (!options.noDOM) {\n element = $(\"<div>\", {\n css: {\n color: \"#FFF\",\n fontFamily: \"consolas, 'Courier New', 'andale mono', 'lucida console', monospace\",\n fontWeight: \"bold\",\n paddingLeft: 4,\n position: \"fixed\",\n top: 0,\n left: 0\n }\n }).appendTo('body').get(0);\n }\n numFramerates = 15;\n framerateUpdateInterval = 250;\n renderTime = -1;\n framerates = [];\n updateFramerate = function() {\n var framerate, rate, tot, _i, _len;\n tot = 0;\n for (_i = 0, _len = framerates.length; _i < _len; _i++) {\n rate = framerates[_i];\n tot += rate;\n }\n framerate = (tot / framerates.length).round();\n self.fps = framerate;\n if (element) {\n return element.innerHTML = \"fps: \" + framerate;\n }\n };\n setInterval(updateFramerate, framerateUpdateInterval);\n /**\n Call this method everytime you render.\n\n @name rendered\n @methodOf Framerate#\n */\n return self = {\n rendered: function() {\n var framerate, newTime, t;\n if (renderTime < 0) {\n return renderTime = new Date().getTime();\n } else {\n newTime = new Date().getTime();\n t = newTime - renderTime;\n framerate = 1000 / t;\n framerates.push(framerate);\n while (framerates.length > numFramerates) {\n framerates.shift();\n }\n return renderTime = newTime;\n }\n }\n };\n};;\n(function() {\n var Map, Tilemap, fromPixieId, loadByName;\n Map = function(data, entityCallback) {\n var entity, loadEntities, spriteLookup, tileHeight, tileWidth, uuid, _ref;\n tileHeight = data.tileHeight;\n tileWidth = data.tileWidth;\n spriteLookup = {};\n _ref = App.entities;\n for (uuid in _ref) {\n entity = _ref[uuid];\n spriteLookup[uuid] = Sprite.fromURL(entity.tileSrc);\n }\n loadEntities = function() {\n if (!entityCallback) {\n return;\n }\n return data.layers.each(function(layer, layerIndex) {\n var entities, entity, entityData, x, y, _i, _len, _results;\n if (layer.name.match(/entities/i)) {\n if (entities = layer.entities) {\n _results = [];\n for (_i = 0, _len = entities.length; _i < _len; _i++) {\n entity = entities[_i];\n x = entity.x, y = entity.y, uuid = entity.uuid;\n entityData = Object.extend({\n layer: layerIndex,\n sprite: spriteLookup[uuid],\n x: x,\n y: y\n }, App.entities[uuid], entity.properties);\n _results.push(entityCallback(entityData));\n }\n return _results;\n }\n }\n });\n };\n loadEntities();\n return Object.extend(data, {\n draw: function(canvas, x, y) {\n return canvas.withTransform(Matrix.translation(x, y), function() {\n return data.layers.each(function(layer) {\n if (layer.name.match(/entities/i)) {\n return;\n }\n return layer.tiles.each(function(row, y) {\n return row.each(function(uuid, x) {\n var sprite;\n if (sprite = spriteLookup[uuid]) {\n return sprite.draw(canvas, x * tileWidth, y * tileHeight);\n }\n });\n });\n });\n });\n }\n });\n };\n Tilemap = function(name, callback, entityCallback) {\n return fromPixieId(App.Tilemaps[name], callback, entityCallback);\n };\n fromPixieId = function(id, callback, entityCallback) {\n var proxy, url;\n url = \"http://pixieengine.com/s3/tilemaps/\" + id + \"/data.json\";\n proxy = {\n draw: function() {}\n };\n $.getJSON(url, function(data) {\n Object.extend(proxy, Map(data, entityCallback));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n loadByName = function(name, callback, entityCallback) {\n var directory, proxy, url, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref.tilemaps : void 0 : void 0) || \"data\";\n url = \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".tilemap?\" + (new Date().getTime());\n proxy = {\n draw: function() {}\n };\n $.getJSON(url, function(data) {\n Object.extend(proxy, Map(data, entityCallback));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n Tilemap.fromPixieId = fromPixieId;\n Tilemap.load = function(options) {\n if (options.pixieId) {\n return fromPixieId(options.pixieId, options.complete, options.entity);\n } else if (options.name) {\n return loadByName(options.name, options.complete, options.entity);\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Tilemap\"] = Tilemap;\n})();;\n;\n","size":21792,"mtime":1320340626},{"path":"lib/00_gamelib.js","type":"blob","contents":";\n;\n;\n/**\nReturns a copy of the array without null and undefined values.\n\n<code><pre>\n[null, undefined, 3, 3, undefined, 5].compact()\n# => [3, 3, 5]\n</pre></code>\n\n@name compact\n@methodOf Array#\n@returns {Array} A new array that contains only the non-null values.\n*/var __slice = Array.prototype.slice;\nArray.prototype.compact = function() {\n return this.select(function(element) {\n return element != null;\n });\n};\n/**\nCreates and returns a copy of the array. The copy contains\nthe same objects.\n\n<code><pre>\na = [\"a\", \"b\", \"c\"]\nb = a.copy()\n\n# their elements are equal\na[0] == b[0] && a[1] == b[1] && a[2] == b[2]\n# => true\n\n# but they aren't the same object in memory\na === b\n# => false\n</pre></code>\n\n@name copy\n@methodOf Array#\n@returns {Array} A new array that is a copy of the array\n*/\nArray.prototype.copy = function() {\n return this.concat();\n};\n/**\nEmpties the array of its contents. It is modified in place.\n\n<code><pre>\nfullArray = [1, 2, 3]\nfullArray.clear()\nfullArray\n# => []\n</pre></code>\n\n@name clear\n@methodOf Array#\n@returns {Array} this, now emptied.\n*/\nArray.prototype.clear = function() {\n this.length = 0;\n return this;\n};\n/**\nFlatten out an array of arrays into a single array of elements.\n\n<code><pre>\n[[1, 2], [3, 4], 5].flatten()\n# => [1, 2, 3, 4, 5]\n\n# won't flatten twice nested arrays. call\n# flatten twice if that is what you want\n[[1, 2], [3, [4, 5]], 6].flatten()\n# => [1, 2, 3, [4, 5], 6]\n</pre></code>\n\n@name flatten\n@methodOf Array#\n@returns {Array} A new array with all the sub-arrays flattened to the top.\n*/\nArray.prototype.flatten = function() {\n return this.inject([], function(a, b) {\n return a.concat(b);\n });\n};\n/**\nInvoke the named method on each element in the array\nand return a new array containing the results of the invocation.\n\n<code><pre>\n[1.1, 2.2, 3.3, 4.4].invoke(\"floor\")\n# => [1, 2, 3, 4]\n\n['hello', 'world', 'cool!'].invoke('substring', 0, 3)\n# => ['hel', 'wor', 'coo']\n</pre></code>\n\n@param {String} method The name of the method to invoke.\n@param [arg...] Optional arguments to pass to the method being invoked.\n@name invoke\n@methodOf Array#\n@returns {Array} A new array containing the results of invoking the named method on each element.\n*/\nArray.prototype.invoke = function() {\n var args, method;\n method = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n return this.map(function(element) {\n return element[method].apply(element, args);\n });\n};\n/**\nRandomly select an element from the array.\n\n<code><pre>\n[1, 2, 3].rand()\n# => 2\n</pre></code>\n\n@name rand\n@methodOf Array#\n@returns {Object} A random element from an array\n*/\nArray.prototype.rand = function() {\n return this[rand(this.length)];\n};\n/**\nRemove the first occurrence of the given object from the array if it is\npresent. The array is modified in place.\n\n<code><pre>\na = [1, 1, \"a\", \"b\"]\na.remove(1)\n# => 1\n\na\n# => [1, \"a\", \"b\"]\n</pre></code>\n\n@name remove\n@methodOf Array#\n@param {Object} object The object to remove from the array if present.\n@returns {Object} The removed object if present otherwise undefined.\n*/\nArray.prototype.remove = function(object) {\n var index;\n index = this.indexOf(object);\n if (index >= 0) {\n return this.splice(index, 1)[0];\n } else {\n return;\n }\n};\n/**\nReturns true if the element is present in the array.\n\n<code><pre>\n[\"a\", \"b\", \"c\"].include(\"c\")\n# => true\n\n[40, \"a\"].include(700)\n# => false\n</pre></code>\n\n@name include\n@methodOf Array#\n@param {Object} element The element to check if present.\n@returns {Boolean} true if the element is in the array, false otherwise.\n*/\nArray.prototype.include = function(element) {\n return this.indexOf(element) !== -1;\n};\n/**\nCall the given iterator once for each element in the array,\npassing in the element as the first argument, the index of \nthe element as the second argument, and <code>this</code> array as the\nthird argument.\n\n<code><pre>\nword = \"\"\nindices = []\n[\"r\", \"a\", \"d\"].each (letter, index) ->\n word += letter\n indices.push(index)\n\n# => [\"r\", \"a\", \"d\"]\n\nword\n# => \"rad\"\n\nindices\n# => [0, 1, 2]\n</pre></code>\n\n@name each\n@methodOf Array#\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this to enable method chaining.\n*/\nArray.prototype.each = function(iterator, context) {\n var element, i, _len;\n if (this.forEach) {\n this.forEach(iterator, context);\n } else {\n for (i = 0, _len = this.length; i < _len; i++) {\n element = this[i];\n iterator.call(context, element, i, this);\n }\n }\n return this;\n};\n/**\nCall the given iterator once for each element in the array, \npassing in the element as the first argument, the index of \nthe element as the second argument, and `this` array as the\nthird argument.\n\n<code><pre>\n[1, 2, 3].map (number) ->\n number * number\n# => [1, 4, 9]\n</pre></code>\n\n@name map\n@methodOf Array#\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array of the results of the iterator function being called on the original array elements.\n*/\nArray.prototype.map || (Array.prototype.map = function(iterator, context) {\n var element, i, results, _len;\n results = [];\n for (i = 0, _len = this.length; i < _len; i++) {\n element = this[i];\n results.push(iterator.call(context, element, i, this));\n }\n return results;\n});\n/**\nCall the given iterator once for each pair of objects in the array.\n\n<code><pre>\n[1, 2, 3, 4].eachPair (a, b) ->\n # 1, 2\n # 1, 3\n # 1, 4\n # 2, 3\n # 2, 4\n # 3, 4\n</pre></code>\n\n@name eachPair\n@methodOf Array#\n@param {Function} iterator Function to be called once for each pair of elements in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n*/\nArray.prototype.eachPair = function(iterator, context) {\n var a, b, i, j, length, _results;\n length = this.length;\n i = 0;\n _results = [];\n while (i < length) {\n a = this[i];\n j = i + 1;\n i += 1;\n _results.push((function() {\n var _results2;\n _results2 = [];\n while (j < length) {\n b = this[j];\n j += 1;\n _results2.push(iterator.call(context, a, b));\n }\n return _results2;\n }).call(this));\n }\n return _results;\n};\n/**\nCall the given iterator once for each element in the array,\npassing in the element as the first argument and the given object\nas the second argument. Additional arguments are passed similar to\n<code>each</code>.\n\n@see Array#each\n@name eachWithObject\n@methodOf Array#\n@param {Object} object The object to pass to the iterator on each visit.\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this\n*/\nArray.prototype.eachWithObject = function(object, iterator, context) {\n this.each(function(element, i, self) {\n return iterator.call(context, element, object, i, self);\n });\n return object;\n};\n/**\nCall the given iterator once for each group of elements in the array,\npassing in the elements in groups of n. Additional argumens are\npassed as in each.\n\n<code><pre>\nresults = []\n[1, 2, 3, 4].eachSlice 2, (slice) ->\n results.push(slice)\n# => [1, 2, 3, 4]\n\nresults\n# => [[1, 2], [3, 4]]\n</pre></code>\n\n@see Array#each\n@name eachSlice\n@methodOf Array#\n@param {Number} n The number of elements in each group.\n@param {Function} iterator Function to be called once for each group of elements in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this\n*/\nArray.prototype.eachSlice = function(n, iterator, context) {\n var i, len;\n if (n > 0) {\n len = (this.length / n).floor();\n i = -1;\n while (++i < len) {\n iterator.call(context, this.slice(i * n, (i + 1) * n), i * n, this);\n }\n }\n return this;\n};\n/**\nReturns a new array with the elements all shuffled up.\n\n<code><pre>\na = [1, 2, 3]\n\na.shuffle()\n# => [2, 3, 1]\n\na # => [1, 2, 3]\n</pre></code>\n\n@name shuffle\n@methodOf Array#\n@returns {Array} A new array that is randomly shuffled.\n*/\nArray.prototype.shuffle = function() {\n var shuffledArray;\n shuffledArray = [];\n this.each(function(element) {\n return shuffledArray.splice(rand(shuffledArray.length + 1), 0, element);\n });\n return shuffledArray;\n};\n/**\nReturns the first element of the array, undefined if the array is empty.\n\n<code><pre>\n[\"first\", \"second\", \"third\"].first()\n# => \"first\"\n</pre></code>\n\n@name first\n@methodOf Array#\n@returns {Object} The first element, or undefined if the array is empty.\n*/\nArray.prototype.first = function() {\n return this[0];\n};\n/**\nReturns the last element of the array, undefined if the array is empty.\n\n<code><pre>\n[\"first\", \"second\", \"third\"].last()\n# => \"third\"\n</pre></code>\n\n@name last\n@methodOf Array#\n@returns {Object} The last element, or undefined if the array is empty.\n*/\nArray.prototype.last = function() {\n return this[this.length - 1];\n};\n/**\nReturns an object containing the extremes of this array.\n\n<code><pre>\n[-1, 3, 0].extremes()\n# => {min: -1, max: 3}\n</pre></code>\n\n@name extremes\n@methodOf Array#\n@param {Function} [fn] An optional funtion used to evaluate each element to calculate its value for determining extremes.\n@returns {Object} {min: minElement, max: maxElement}\n*/\nArray.prototype.extremes = function(fn) {\n var max, maxResult, min, minResult;\n fn || (fn = function(n) {\n return n;\n });\n min = max = void 0;\n minResult = maxResult = void 0;\n this.each(function(object) {\n var result;\n result = fn(object);\n if (min != null) {\n if (result < minResult) {\n min = object;\n minResult = result;\n }\n } else {\n min = object;\n minResult = result;\n }\n if (max != null) {\n if (result > maxResult) {\n max = object;\n return maxResult = result;\n }\n } else {\n max = object;\n return maxResult = result;\n }\n });\n return {\n min: min,\n max: max\n };\n};\n/**\nPretend the array is a circle and grab a new array containing length elements. \nIf length is not given return the element at start, again assuming the array \nis a circle.\n\n<code><pre>\n[1, 2, 3].wrap(-1)\n# => 3\n\n[1, 2, 3].wrap(6)\n# => 1\n\n[\"l\", \"o\", \"o\", \"p\"].wrap(0, 16)\n# => [\"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\"]\n</pre></code>\n\n@name wrap\n@methodOf Array#\n@param {Number} start The index to start wrapping at, or the index of the sole element to return if no length is given.\n@param {Number} [length] Optional length determines how long result array should be.\n@returns {Object} or {Array} The element at start mod array.length, or an array of length elements, starting from start and wrapping.\n*/\nArray.prototype.wrap = function(start, length) {\n var end, i, result;\n if (length != null) {\n end = start + length;\n i = start;\n result = [];\n while (i++ < end) {\n result.push(this[i.mod(this.length)]);\n }\n return result;\n } else {\n return this[start.mod(this.length)];\n }\n};\n/**\nPartitions the elements into two groups: those for which the iterator returns\ntrue, and those for which it returns false.\n\n<code><pre>\n[evens, odds] = [1, 2, 3, 4].partition (n) ->\n n.even()\n\nevens\n# => [2, 4]\n\nodds\n# => [1, 3]\n</pre></code>\n\n@name partition\n@methodOf Array#\n@param {Function} iterator\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array in the form of [trueCollection, falseCollection]\n*/\nArray.prototype.partition = function(iterator, context) {\n var falseCollection, trueCollection;\n trueCollection = [];\n falseCollection = [];\n this.each(function(element) {\n if (iterator.call(context, element)) {\n return trueCollection.push(element);\n } else {\n return falseCollection.push(element);\n }\n });\n return [trueCollection, falseCollection];\n};\n/**\nReturn the group of elements for which the return value of the iterator is true.\n\n@name select\n@methodOf Array#\n@param {Function} iterator The iterator receives each element in turn as the first agument.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array containing the elements for which the iterator returned true.\n*/\nArray.prototype.select = function(iterator, context) {\n return this.partition(iterator, context)[0];\n};\n/**\nReturn the group of elements that are not in the passed in set.\n\n<code><pre>\n[1, 2, 3, 4].without ([2, 3])\n# => [1, 4]\n</pre></code>\n\n@name without\n@methodOf Array#\n@param {Array} values List of elements to exclude.\n@returns {Array} An array containing the elements that are not passed in.\n*/\nArray.prototype.without = function(values) {\n return this.reject(function(element) {\n return values.include(element);\n });\n};\n/**\nReturn the group of elements for which the return value of the iterator is false.\n\n@name reject\n@methodOf Array#\n@param {Function} iterator The iterator receives each element in turn as the first agument.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array containing the elements for which the iterator returned false.\n*/\nArray.prototype.reject = function(iterator, context) {\n return this.partition(iterator, context)[1];\n};\n/**\nCombines all elements of the array by applying a binary operation.\nfor each element in the arra the iterator is passed an accumulator \nvalue (memo) and the element.\n\n@name inject\n@methodOf Array#\n@returns {Object} The result of a\n*/\nArray.prototype.inject = function(initial, iterator) {\n this.each(function(element) {\n return initial = iterator(initial, element);\n });\n return initial;\n};\n/**\nAdd all the elements in the array.\n\n<code><pre>\n[1, 2, 3, 4].sum()\n# => 10\n</pre></code>\n\n@name sum\n@methodOf Array#\n@returns {Number} The sum of the elements in the array.\n*/\nArray.prototype.sum = function() {\n return this.inject(0, function(sum, n) {\n return sum + n;\n });\n};\n/**\nMultiply all the elements in the array.\n\n<code><pre>\n[1, 2, 3, 4].product()\n# => 24\n</pre></code>\n\n@name product\n@methodOf Array#\n@returns {Number} The product of the elements in the array.\n*/\nArray.prototype.product = function() {\n return this.inject(1, function(product, n) {\n return product * n;\n });\n};\n/**\nMerges together the values of each of the arrays with the values at the corresponding position.\n\n<code><pre>\n['a', 'b', 'c'].zip([1, 2, 3])\n# => [['a', 1], ['b', 2], ['c', 3]]\n</pre></code>\n\n@name zip\n@methodOf Array#\n@returns {Array} Array groupings whose values are arranged by their positions in the original input arrays.\n*/\nArray.prototype.zip = function() {\n var args;\n args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return this.map(function(element, index) {\n var output;\n output = args.map(function(arr) {\n return arr[index];\n });\n output.unshift(element);\n return output;\n });\n};;\n/**\nBindable module.\n\n<code><pre>\nplayer = Core\n x: 5\n y: 10\n\nplayer.bind \"update\", ->\n updatePlayer()\n# => Uncaught TypeError: Object has no method 'bind'\n\nplayer.include(Bindable)\n\nplayer.bind \"update\", ->\n updatePlayer()\n# => this will call updatePlayer each time through the main loop\n</pre></code>\n\n@name Bindable\n@module\n@constructor\n*/var Bindable;\nvar __slice = Array.prototype.slice;\nBindable = function() {\n var eventCallbacks;\n eventCallbacks = {};\n return {\n /**\n The bind method adds a function as an event listener.\n\n <code><pre>\n # this will call coolEventHandler after\n # yourObject.trigger \"someCustomEvent\" is called.\n yourObject.bind \"someCustomEvent\", coolEventHandler\n\n #or\n yourObject.bind \"anotherCustomEvent\", ->\n doSomething()\n </pre></code>\n\n @name bind\n @methodOf Bindable#\n @param {String} event The event to listen to.\n @param {Function} callback The function to be called when the specified event\n is triggered.\n */\n bind: function(event, callback) {\n eventCallbacks[event] = eventCallbacks[event] || [];\n return eventCallbacks[event].push(callback);\n },\n /**\n The unbind method removes a specific event listener, or all event listeners if\n no specific listener is given.\n\n <code><pre>\n # removes the handler coolEventHandler from the event\n # \"someCustomEvent\" while leaving the other events intact.\n yourObject.unbind \"someCustomEvent\", coolEventHandler\n\n # removes all handlers attached to \"anotherCustomEvent\" \n yourObject.unbind \"anotherCustomEvent\"\n </pre></code>\n\n @name unbind\n @methodOf Bindable#\n @param {String} event The event to remove the listener from.\n @param {Function} [callback] The listener to remove.\n */\n unbind: function(event, callback) {\n eventCallbacks[event] = eventCallbacks[event] || [];\n if (callback) {\n return eventCallbacks[event].remove(callback);\n } else {\n return eventCallbacks[event] = [];\n }\n },\n /**\n The trigger method calls all listeners attached to the specified event.\n\n <code><pre>\n # calls each event handler bound to \"someCustomEvent\"\n yourObject.trigger \"someCustomEvent\"\n </pre></code>\n\n @name trigger\n @methodOf Bindable#\n @param {String} event The event to trigger.\n @param {Array} [parameters] Additional parameters to pass to the event listener.\n */\n trigger: function() {\n var callbacks, event, parameters, self;\n event = arguments[0], parameters = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n callbacks = eventCallbacks[event];\n if (callbacks && callbacks.length) {\n self = this;\n return callbacks.each(function(callback) {\n return callback.apply(self, parameters);\n });\n }\n }\n };\n};\n(typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Bindable\"] = Bindable;;\nvar CommandStack;\nCommandStack = function() {\n var index, stack;\n stack = [];\n index = 0;\n return {\n execute: function(command) {\n stack[index] = command;\n command.execute();\n return index += 1;\n },\n undo: function() {\n var command;\n if (this.canUndo()) {\n index -= 1;\n command = stack[index];\n command.undo();\n return command;\n }\n },\n redo: function() {\n var command;\n if (this.canRedo()) {\n command = stack[index];\n command.execute();\n index += 1;\n return command;\n }\n },\n canUndo: function() {\n return index > 0;\n },\n canRedo: function() {\n return stack[index] != null;\n }\n };\n};;\n/**\nThe Core class is used to add extended functionality to objects without\nextending the object class directly. Inherit from Core to gain its utility\nmethods.\n\n@name Core\n@constructor\n\n@param {Object} I Instance variables\n*/var Core;\nvar __slice = Array.prototype.slice;\nCore = function(I) {\n var self;\n I || (I = {});\n return self = {\n /**\n External access to instance variables. Use of this property should be avoided\n in general, but can come in handy from time to time.\n\n <code><pre>\n I =\n r: 255\n g: 0\n b: 100\n\n myObject = Core(I)\n\n # a bad idea most of the time, but it's \n # pretty convenient to have available.\n myObject.I.r\n # => 255\n\n myObject.I.g\n # => 0\n\n myObject.I.b\n # => 100\n </pre></code>\n\n @name I\n @fieldOf Core#\n */\n I: I,\n /**\n Generates a public jQuery style getter / setter method for each \n String argument.\n\n <code><pre>\n myObject = Core\n r: 255\n g: 0\n b: 100\n\n myObject.attrAccessor \"r\", \"g\", \"b\"\n\n myObject.r(254)\n myObject.r()\n\n => 254\n </pre></code>\n\n @name attrAccessor\n @methodOf Core#\n */\n attrAccessor: function() {\n var attrNames;\n attrNames = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrNames.each(function(attrName) {\n return self[attrName] = function(newValue) {\n if (newValue != null) {\n I[attrName] = newValue;\n return self;\n } else {\n return I[attrName];\n }\n };\n });\n },\n /**\n Generates a public jQuery style getter method for each String argument.\n\n <code><pre>\n myObject = Core\n r: 255\n g: 0\n b: 100\n\n myObject.attrReader \"r\", \"g\", \"b\"\n\n myObject.r()\n => 255\n\n myObject.g()\n => 0\n\n myObject.b()\n => 100\n </pre></code>\n\n @name attrReader\n @methodOf Core#\n */\n attrReader: function() {\n var attrNames;\n attrNames = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrNames.each(function(attrName) {\n return self[attrName] = function() {\n return I[attrName];\n };\n });\n },\n /**\n Extends this object with methods from the passed in object. `before` and \n `after` are special option names that glue functionality before or after \n existing methods.\n\n <code><pre>\n I =\n x: 30\n y: 40\n maxSpeed: 5\n\n # we are using extend to give player\n # additional methods that Core doesn't have\n player = Core(I).extend\n increaseSpeed: ->\n I.maxSpeed += 1\n\n # this will execute before the update method\n beforeUpdate: ->\n checkPowerupStatus()\n\n player.I.maxSpeed\n => 5\n\n player.increaseSpeed()\n\n player.I.maxSpeed\n => 6\n </pre></code>\n\n @name extend\n @methodOf Core#\n */\n extend: function(options) {\n var afterMethods, beforeMethods, fn, name;\n afterMethods = options.after;\n beforeMethods = options.before;\n delete options.after;\n delete options.before;\n Object.extend(self, options);\n if (beforeMethods) {\n for (name in beforeMethods) {\n fn = beforeMethods[name];\n self[name] = self[name].withBefore(fn);\n }\n }\n if (afterMethods) {\n for (name in afterMethods) {\n fn = afterMethods[name];\n self[name] = self[name].withAfter(fn);\n }\n }\n return self;\n },\n /** \n Includes a module in this object.\n\n <code><pre>\n myObject = Core()\n myObject.include(Bindable)\n\n # now you can bind handlers to functions\n myObject.bind \"someEvent\", ->\n alert(\"wow. that was easy.\")\n </pre></code>\n\n @name include\n @methodOf Core#\n @param {Module} Module the module to include. A module is a constructor that takes two parameters, I and self, and returns an object containing the public methods to extend the including object with.\n */\n include: function(Module) {\n return self.extend(Module(I, self));\n }\n };\n};;\nFunction.prototype.withBefore = function(interception) {\n var method;\n method = this;\n return function() {\n interception.apply(this, arguments);\n return method.apply(this, arguments);\n };\n};\nFunction.prototype.withAfter = function(interception) {\n var method;\n method = this;\n return function() {\n var result;\n result = method.apply(this, arguments);\n interception.apply(this, arguments);\n return result;\n };\n};;\n/**\n@name Logging\n@namespace\n\nGives you some convenience methods for outputting data while developing. \n\n<code><pre>\n log \"Testing123\"\n info \"Hey, this is happening\"\n warn \"Be careful, this might be a problem\"\n error \"Kaboom!\"\n</pre></code>\n*/[\"log\", \"info\", \"warn\", \"error\"].each(function(name) {\n if (typeof console !== \"undefined\") {\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[name] = function(message) {\n if (console[name]) {\n return console[name](message);\n }\n };\n } else {\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[name] = function() {};\n }\n});;\n/**\n* Matrix.js v1.3.0pre\n* \n* Copyright (c) 2010 STRd6\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in\n* all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n* THE SOFTWARE.\n*\n* Loosely based on flash:\n* http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html\n*/(function() {\n /**\n <pre>\n _ _\n | a c tx |\n | b d ty |\n |_0 0 1 _|\n </pre>\n Creates a matrix for 2d affine transformations.\n\n concat, inverse, rotate, scale and translate return new matrices with the\n transformations applied. The matrix is not modified in place.\n\n Returns the identity matrix when called with no arguments.\n\n @name Matrix\n @param {Number} [a]\n @param {Number} [b]\n @param {Number} [c]\n @param {Number} [d]\n @param {Number} [tx]\n @param {Number} [ty]\n @constructor\n */ var Matrix;\n Matrix = function(a, b, c, d, tx, ty) {\n return {\n __proto__: Matrix.prototype,\n /**\n @name a\n @fieldOf Matrix#\n */\n a: a != null ? a : 1,\n /**\n @name b\n @fieldOf Matrix#\n */\n b: b || 0,\n /**\n @name c\n @fieldOf Matrix#\n */\n c: c || 0,\n /**\n @name d\n @fieldOf Matrix#\n */\n d: d != null ? d : 1,\n /**\n @name tx\n @fieldOf Matrix#\n */\n tx: tx || 0,\n /**\n @name ty\n @fieldOf Matrix#\n */\n ty: ty || 0\n };\n };\n Matrix.prototype = {\n /**\n Returns the result of this matrix multiplied by another matrix\n combining the geometric effects of the two. In mathematical terms, \n concatenating two matrixes is the same as combining them using matrix multiplication.\n If this matrix is A and the matrix passed in is B, the resulting matrix is A x B\n http://mathworld.wolfram.com/MatrixMultiplication.html\n @name concat\n @methodOf Matrix#\n @param {Matrix} matrix The matrix to multiply this matrix by.\n @returns {Matrix} The result of the matrix multiplication, a new matrix.\n */\n concat: function(matrix) {\n return Matrix(this.a * matrix.a + this.c * matrix.b, this.b * matrix.a + this.d * matrix.b, this.a * matrix.c + this.c * matrix.d, this.b * matrix.c + this.d * matrix.d, this.a * matrix.tx + this.c * matrix.ty + this.tx, this.b * matrix.tx + this.d * matrix.ty + this.ty);\n },\n /**\n Given a point in the pretransform coordinate space, returns the coordinates of \n that point after the transformation occurs. Unlike the standard transformation \n applied using the transformPoint() method, the deltaTransformPoint() method \n does not consider the translation parameters tx and ty.\n @name deltaTransformPoint\n @methodOf Matrix#\n @see #transformPoint\n @return {Point} A new point transformed by this matrix ignoring tx and ty.\n */\n deltaTransformPoint: function(point) {\n return Point(this.a * point.x + this.c * point.y, this.b * point.x + this.d * point.y);\n },\n /**\n Returns the inverse of the matrix.\n http://mathworld.wolfram.com/MatrixInverse.html\n @name inverse\n @methodOf Matrix#\n @returns {Matrix} A new matrix that is the inverse of this matrix.\n */\n inverse: function() {\n var determinant;\n determinant = this.a * this.d - this.b * this.c;\n return Matrix(this.d / determinant, -this.b / determinant, -this.c / determinant, this.a / determinant, (this.c * this.ty - this.d * this.tx) / determinant, (this.b * this.tx - this.a * this.ty) / determinant);\n },\n /**\n Returns a new matrix that corresponds this matrix multiplied by a\n a rotation matrix.\n @name rotate\n @methodOf Matrix#\n @see Matrix.rotation\n @param {Number} theta Amount to rotate in radians.\n @param {Point} [aboutPoint] The point about which this rotation occurs. Defaults to (0,0).\n @returns {Matrix} A new matrix, rotated by the specified amount.\n */\n rotate: function(theta, aboutPoint) {\n return this.concat(Matrix.rotation(theta, aboutPoint));\n },\n /**\n Returns a new matrix that corresponds this matrix multiplied by a\n a scaling matrix.\n @name scale\n @methodOf Matrix#\n @see Matrix.scale\n @param {Number} sx\n @param {Number} [sy]\n @param {Point} [aboutPoint] The point that remains fixed during the scaling\n @returns {Matrix} A new Matrix. The original multiplied by a scaling matrix.\n */\n scale: function(sx, sy, aboutPoint) {\n return this.concat(Matrix.scale(sx, sy, aboutPoint));\n },\n /**\n Returns a string representation of this matrix.\n\n @name toString\n @methodOf Matrix#\n @returns {String} A string reperesentation of this matrix.\n */\n toString: function() {\n return \"Matrix(\" + this.a + \", \" + this.b + \", \" + this.c + \", \" + this.d + \", \" + this.tx + \", \" + this.ty + \")\";\n },\n /**\n Returns the result of applying the geometric transformation represented by the \n Matrix object to the specified point.\n @name transformPoint\n @methodOf Matrix#\n @see #deltaTransformPoint\n @returns {Point} A new point with the transformation applied.\n */\n transformPoint: function(point) {\n return Point(this.a * point.x + this.c * point.y + this.tx, this.b * point.x + this.d * point.y + this.ty);\n },\n /**\n Translates the matrix along the x and y axes, as specified by the tx and ty parameters.\n @name translate\n @methodOf Matrix#\n @see Matrix.translation\n @param {Number} tx The translation along the x axis.\n @param {Number} ty The translation along the y axis.\n @returns {Matrix} A new matrix with the translation applied.\n */\n translate: function(tx, ty) {\n return this.concat(Matrix.translation(tx, ty));\n }\n /**\n Creates a matrix transformation that corresponds to the given rotation,\n around (0,0) or the specified point.\n @see Matrix#rotate\n @param {Number} theta Rotation in radians.\n @param {Point} [aboutPoint] The point about which this rotation occurs. Defaults to (0,0).\n @returns {Matrix} A new matrix rotated by the given amount.\n */\n };\n Matrix.rotate = Matrix.rotation = function(theta, aboutPoint) {\n var rotationMatrix;\n rotationMatrix = Matrix(Math.cos(theta), Math.sin(theta), -Math.sin(theta), Math.cos(theta));\n if (aboutPoint != null) {\n rotationMatrix = Matrix.translation(aboutPoint.x, aboutPoint.y).concat(rotationMatrix).concat(Matrix.translation(-aboutPoint.x, -aboutPoint.y));\n }\n return rotationMatrix;\n };\n /**\n Returns a matrix that corresponds to scaling by factors of sx, sy along\n the x and y axis respectively.\n If only one parameter is given the matrix is scaled uniformly along both axis.\n If the optional aboutPoint parameter is given the scaling takes place\n about the given point.\n @see Matrix#scale\n @param {Number} sx The amount to scale by along the x axis or uniformly if no sy is given.\n @param {Number} [sy] The amount to scale by along the y axis.\n @param {Point} [aboutPoint] The point about which the scaling occurs. Defaults to (0,0).\n @returns {Matrix} A matrix transformation representing scaling by sx and sy.\n */\n Matrix.scale = function(sx, sy, aboutPoint) {\n var scaleMatrix;\n sy = sy || sx;\n scaleMatrix = Matrix(sx, 0, 0, sy);\n if (aboutPoint) {\n scaleMatrix = Matrix.translation(aboutPoint.x, aboutPoint.y).concat(scaleMatrix).concat(Matrix.translation(-aboutPoint.x, -aboutPoint.y));\n }\n return scaleMatrix;\n };\n /**\n Returns a matrix that corresponds to a translation of tx, ty.\n @see Matrix#translate\n @param {Number} tx The amount to translate in the x direction.\n @param {Number} ty The amount to translate in the y direction.\n @return {Matrix} A matrix transformation representing a translation by tx and ty.\n */\n Matrix.translate = Matrix.translation = function(tx, ty) {\n return Matrix(1, 0, 0, 1, tx, ty);\n };\n /**\n A constant representing the identity matrix.\n @name IDENTITY\n @fieldOf Matrix\n */\n Matrix.IDENTITY = Matrix();\n /**\n A constant representing the horizontal flip transformation matrix.\n @name HORIZONTAL_FLIP\n @fieldOf Matrix\n */\n Matrix.HORIZONTAL_FLIP = Matrix(-1, 0, 0, 1);\n /**\n A constant representing the vertical flip transformation matrix.\n @name VERTICAL_FLIP\n @fieldOf Matrix\n */\n Matrix.VERTICAL_FLIP = Matrix(1, 0, 0, -1);\n if (Object.freeze) {\n Object.freeze(Matrix.IDENTITY);\n Object.freeze(Matrix.HORIZONTAL_FLIP);\n Object.freeze(Matrix.VERTICAL_FLIP);\n }\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Matrix\"] = Matrix;\n})();;\n/** \nReturns the absolute value of this number.\n\n<code><pre>\n(-4).abs()\n# => 4\n</pre></code>\n\n@name abs\n@methodOf Number#\n@returns {Number} The absolute value of the number.\n*/Number.prototype.abs = function() {\n return Math.abs(this);\n};\n/**\nReturns the mathematical ceiling of this number.\n\n<code><pre>\n4.9.ceil() \n# => 5\n\n4.2.ceil()\n# => 5\n\n(-1.2).ceil()\n# => -1\n</pre></code>\n\n@name ceil\n@methodOf Number#\n@returns {Number} The number truncated to the nearest integer of greater than or equal value.\n*/\nNumber.prototype.ceil = function() {\n return Math.ceil(this);\n};\n/**\nReturns the mathematical floor of this number.\n\n<code><pre>\n4.9.floor()\n# => 4\n\n4.2.floor()\n# => 4\n\n(-1.2).floor()\n# => -2\n</pre></code>\n\n@name floor\n@methodOf Number#\n@returns {Number} The number truncated to the nearest integer of less than or equal value.\n*/\nNumber.prototype.floor = function() {\n return Math.floor(this);\n};\n/**\nReturns this number rounded to the nearest integer.\n\n<code><pre>\n4.5.round()\n# => 5\n\n4.4.round()\n# => 4\n</pre></code>\n\n@name round\n@methodOf Number#\n@returns {Number} The number rounded to the nearest integer.\n*/\nNumber.prototype.round = function() {\n return Math.round(this);\n};\n/**\nReturns a number whose value is limited to the given range.\n\n<code><pre>\n# limit the output of this computation to between 0 and 255\n(2 * 255).clamp(0, 255)\n# => 255\n</pre></code>\n\n@name clamp\n@methodOf Number#\n@param {Number} min The lower boundary of the output range\n@param {Number} max The upper boundary of the output range\n@returns {Number} A number in the range [min, max]\n*/\nNumber.prototype.clamp = function(min, max) {\n return Math.min(Math.max(this, min), max);\n};\n/**\nA mod method useful for array wrapping. The range of the function is\nconstrained to remain in bounds of array indices.\n\n<code><pre>\n(-1).mod(5)\n# => 4\n</pre></code>\n\n@name mod\n@methodOf Number#\n@param {Number} base\n@returns {Number} An integer between 0 and (base - 1) if base is positive.\n*/\nNumber.prototype.mod = function(base) {\n var result;\n result = this % base;\n if (result < 0 && base > 0) {\n result += base;\n }\n return result;\n};\n/**\nGet the sign of this number as an integer (1, -1, or 0).\n\n<code><pre>\n(-5).sign()\n# => -1\n\n0.sign()\n# => 0\n\n5.sign()\n# => 1\n</pre></code>\n\n@name sign\n@methodOf Number#\n@returns {Number} The sign of this number, 0 if the number is 0.\n*/\nNumber.prototype.sign = function() {\n if (this > 0) {\n return 1;\n } else if (this < 0) {\n return -1;\n } else {\n return 0;\n }\n};\n/**\nReturns true if this number is even (evenly divisible by 2).\n\n<code><pre>\n2.even()\n# => true\n\n3.even()\n# => false\n\n0.even()\n# => true \n</pre></code>\n\n@name even\n@methodOf Number#\n@returns {Boolean} true if this number is an even integer, false otherwise.\n*/\nNumber.prototype.even = function() {\n return this % 2 === 0;\n};\n/**\nReturns true if this number is odd (has remainder of 1 when divided by 2).\n\n<code><pre>\n2.odd()\n# => false\n\n3.odd()\n# => true\n\n0.odd()\n# => false \n</pre></code>\n\n@name odd\n@methodOf Number#\n@returns {Boolean} true if this number is an odd integer, false otherwise.\n*/\nNumber.prototype.odd = function() {\n if (this > 0) {\n return this % 2 === 1;\n } else {\n return this % 2 === -1;\n }\n};\n/**\nCalls iterator the specified number of times, passing in the number of the \ncurrent iteration as a parameter: 0 on first call, 1 on the second call, etc. \n\n<code><pre>\noutput = []\n\n5.times (n) ->\n output.push(n)\n\noutput\n# => [0, 1, 2, 3, 4]\n</pre></code>\n\n@name times\n@methodOf Number#\n@param {Function} iterator The iterator takes a single parameter, the number of the current iteration.\n@param {Object} [context] The optional context parameter specifies an object to treat as <code>this</code> in the iterator block.\n@returns {Number} The number of times the iterator was called.\n*/\nNumber.prototype.times = function(iterator, context) {\n var i;\n i = -1;\n while (++i < this) {\n iterator.call(context, i);\n }\n return i;\n};\n/**\nReturns the the nearest grid resolution less than or equal to the number. \n\n<code><pre>\n7.snap(8) \n# => 0\n\n4.snap(8) \n# => 0\n\n12.snap(8) \n# => 8\n</pre></code>\n\n@name snap\n@methodOf Number#\n@param {Number} resolution The grid resolution to snap to.\n@returns {Number} The nearest multiple of resolution lower than the number.\n*/\nNumber.prototype.snap = function(resolution) {\n var n;\n n = this / resolution;\n 1 / 1;\n return n.floor() * resolution;\n};\n/**\nIn number theory, integer factorization or prime factorization is the\nbreaking down of a composite number into smaller non-trivial divisors,\nwhich when multiplied together equal the original integer.\n\nFloors the number for purposes of factorization.\n\n<code><pre>\n60.primeFactors()\n# => [2, 2, 3, 5]\n\n37.primeFactors()\n# => [37]\n</pre></code>\n\n@name primeFactors\n@methodOf Number#\n@returns {Array} An array containing the factorization of this number.\n*/\nNumber.prototype.primeFactors = function() {\n var factors, i, iSquared, n;\n factors = [];\n n = Math.floor(this);\n if (n === 0) {\n return;\n }\n if (n < 0) {\n factors.push(-1);\n n /= -1;\n }\n i = 2;\n iSquared = i * i;\n while (iSquared < n) {\n while ((n % i) === 0) {\n factors.push(i);\n n /= i;\n }\n i += 1;\n iSquared = i * i;\n }\n if (n !== 1) {\n factors.push(n);\n }\n return factors;\n};\n/**\nReturns the two character hexidecimal \nrepresentation of numbers 0 through 255.\n\n<code><pre>\n255.toColorPart()\n# => \"ff\"\n\n0.toColorPart()\n# => \"00\"\n\n200.toColorPart()\n# => \"c8\"\n</pre></code>\n\n@name toColorPart\n@methodOf Number#\n@returns {String} Hexidecimal representation of the number\n*/\nNumber.prototype.toColorPart = function() {\n var s;\n s = parseInt(this.clamp(0, 255), 10).toString(16);\n if (s.length === 1) {\n s = '0' + s;\n }\n return s;\n};\n/**\nReturns a number that is maxDelta closer to target.\n\n<code><pre>\n255.approach(0, 5)\n# => 250\n\n5.approach(0, 10)\n# => 0\n</pre></code>\n\n@name approach\n@methodOf Number#\n@returns {Number} A number maxDelta toward target\n*/\nNumber.prototype.approach = function(target, maxDelta) {\n return (target - this).clamp(-maxDelta, maxDelta) + this;\n};\n/**\nReturns a number that is closer to the target by the ratio.\n\n<code><pre>\n255.approachByRatio(0, 0.1)\n# => 229.5\n</pre></code>\n\n@name approachByRatio\n@methodOf Number#\n@returns {Number} A number toward target by the ratio\n*/\nNumber.prototype.approachByRatio = function(target, ratio) {\n return this.approach(target, this * ratio);\n};\n/**\nReturns a number that is closer to the target angle by the delta.\n\n<code><pre>\nMath.PI.approachRotation(0, Math.PI/4)\n# => 2.356194490192345 # this is (3/4) * Math.PI, which is (1/4) * Math.PI closer to 0 from Math.PI\n</pre></code>\n\n@name approachRotation\n@methodOf Number#\n@returns {Number} A number toward the target angle by maxDelta\n*/\nNumber.prototype.approachRotation = function(target, maxDelta) {\n while (target > this + Math.PI) {\n target -= Math.TAU;\n }\n while (target < this - Math.PI) {\n target += Math.TAU;\n }\n return (target - this).clamp(-maxDelta, maxDelta) + this;\n};\n/**\nConstrains a rotation to between -PI and PI.\n\n<code><pre>\n(9/4 * Math.PI).constrainRotation() \n# => 0.7853981633974483 # this is (1/4) * Math.PI\n</pre></code>\n\n@name constrainRotation\n@methodOf Number#\n@returns {Number} This number constrained between -PI and PI.\n*/\nNumber.prototype.constrainRotation = function() {\n var target;\n target = this;\n while (target > Math.PI) {\n target -= Math.TAU;\n }\n while (target < -Math.PI) {\n target += Math.TAU;\n }\n return target;\n};\n/**\nThe mathematical d operator. Useful for simulating dice rolls.\n\n@name d\n@methodOf Number#\n@returns {Number} The sum of rolling <code>this</code> many <code>sides</code>-sided dice\n*/\nNumber.prototype.d = function(sides) {\n var sum;\n sum = 0;\n this.times(function() {\n return sum += rand(sides) + 1;\n });\n return sum;\n};\n/** \nThe mathematical circle constant of 1 turn.\n\n@name TAU\n@fieldOf Math\n*/\nMath.TAU = 2 * Math.PI;;\n/**\nChecks whether an object is an array.\n\n<code><pre>\nObject.isArray([1, 2, 4])\n# => true\n\nObject.isArray({key: \"value\"})\n# => false\n</pre></code>\n\n@name isArray\n@methodOf Object\n@param {Object} object The object to check for array-ness.\n@returns {Boolean} A boolean expressing whether the object is an instance of Array \n*/var __slice = Array.prototype.slice;\nObject.isArray = function(object) {\n return Object.prototype.toString.call(object) === \"[object Array]\";\n};\n/**\nChecks whether an object is a string.\n\n<code><pre>\nObject.isString(\"a string\")\n# => true\n\nObject.isString([1, 2, 4])\n# => false\n\nObject.isString({key: \"value\"})\n# => false\n</pre></code>\n\n@name isString\n@methodOf Object\n@param {Object} object The object to check for string-ness.\n@returns {Boolean} A boolean expressing whether the object is an instance of String \n*/\nObject.isString = function(object) {\n return Object.prototype.toString.call(object) === \"[object String]\";\n};\n/**\nMerges properties from objects into target without overiding.\nFirst come, first served.\n\n<code><pre>\n I =\n a: 1\n b: 2\n c: 3\n\n Object.reverseMerge I,\n c: 6\n d: 4 \n\n I # => {a: 1, b:2, c:3, d: 4}\n</pre></code>\n\n@name reverseMerge\n@methodOf Object\n@param {Object} target The object to merge the properties into.\n@returns {Object} target\n*/\nObject.reverseMerge = function() {\n var name, object, objects, target, _i, _len;\n target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = objects.length; _i < _len; _i++) {\n object = objects[_i];\n for (name in object) {\n if (!target.hasOwnProperty(name)) {\n target[name] = object[name];\n }\n }\n }\n return target;\n};\n/**\nMerges properties from sources into target with overiding.\nLast in covers earlier properties.\n\n<code><pre>\n I =\n a: 1\n b: 2\n c: 3\n\n Object.extend I,\n c: 6\n d: 4\n\n I # => {a: 1, b:2, c:6, d: 4}\n</pre></code>\n\n@name extend\n@methodOf Object\n@param {Object} target The object to merge the properties into.\n@returns {Object} target\n*/\nObject.extend = function() {\n var name, source, sources, target, _i, _len;\n target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = sources.length; _i < _len; _i++) {\n source = sources[_i];\n for (name in source) {\n target[name] = source[name];\n }\n }\n return target;\n};\n/**\nHelper method that tells you if something is an object.\n\n<code><pre>\nobject = {a: 1}\n\nObject.isObject(object)\n# => true\n</pre></code>\n\n@name isObject\n@methodOf Object\n@param {Object} object Maybe this guy is an object.\n@returns {Boolean} true if this guy is an object.\n*/\nObject.isObject = function(object) {\n return Object.prototype.toString.call(object) === '[object Object]';\n};;\n(function() {\n /**\n Create a new point with given x and y coordinates. If no arguments are given\n defaults to (0, 0).\n\n <code><pre>\n point = Point()\n\n p.x\n # => 0\n\n p.y\n # => 0\n\n point = Point(-2, 5)\n\n p.x\n # => -2\n\n p.y\n # => 5\n </pre></code>\n\n @name Point\n @param {Number} [x]\n @param {Number} [y]\n @constructor\n */ var Point;\n Point = function(x, y) {\n return {\n __proto__: Point.prototype,\n /**\n The x coordinate of this point.\n @name x\n @fieldOf Point#\n */\n x: x || 0,\n /**\n The y coordinate of this point.\n @name y\n @fieldOf Point#\n */\n y: y || 0\n };\n };\n Point.prototype = {\n /**\n Creates a copy of this point.\n\n @name copy\n @methodOf Point#\n @returns {Point} A new point with the same x and y value as this point.\n\n <code><pre>\n point = Point(1, 1)\n pointCopy = point.copy()\n\n point.equal(pointCopy)\n # => true\n\n point == pointCopy\n # => false \n </pre></code>\n */\n copy: function() {\n return Point(this.x, this.y);\n },\n /**\n Adds a point to this one and returns the new point. You may\n also use a two argument call like <code>point.add(x, y)</code>\n to add x and y values without a second point object.\n\n <code><pre>\n point = Point(2, 3).add(Point(3, 4))\n\n point.x\n # => 5\n\n point.y\n # => 7\n\n anotherPoint = Point(2, 3).add(3, 4)\n\n anotherPoint.x\n # => 5\n\n anotherPoint.y\n # => 7\n </pre></code>\n\n @name add\n @methodOf Point#\n @param {Point} other The point to add this point to.\n @returns {Point} A new point, the sum of both.\n */\n add: function(first, second) {\n return this.copy().add$(first, second);\n },\n /**\n Adds a point to this one, returning a modified point. You may\n also use a two argument call like <code>point.add(x, y)</code>\n to add x and y values without a second point object.\n\n <code><pre>\n point = Point(2, 3)\n\n point.x\n # => 2\n\n point.y\n # => 3\n\n point.add$(Point(3, 4))\n\n point.x\n # => 5\n\n point.y\n # => 7\n\n anotherPoint = Point(2, 3)\n anotherPoint.add$(3, 4)\n\n anotherPoint.x\n # => 5\n\n anotherPoint.y\n # => 7\n </pre></code>\n\n @name add$\n @methodOf Point#\n @param {Point} other The point to add this point to.\n @returns {Point} The sum of both points.\n */\n add$: function(first, second) {\n if (second != null) {\n this.x += first;\n this.y += second;\n } else {\n this.x += first.x;\n this.y += first.y;\n }\n return this;\n },\n /**\n Subtracts a point to this one and returns the new point.\n\n <code><pre>\n point = Point(1, 2).subtract(Point(2, 0))\n\n point.x\n # => -1\n\n point.y\n # => 2\n\n anotherPoint = Point(1, 2).subtract(2, 0)\n\n anotherPoint.x\n # => -1\n\n anotherPoint.y\n # => 2\n </pre></code>\n\n @name subtract\n @methodOf Point#\n @param {Point} other The point to subtract from this point.\n @returns {Point} A new point, this - other.\n */\n subtract: function(first, second) {\n return this.copy().subtract$(first, second);\n },\n /**\n Subtracts a point to this one and returns the new point.\n\n <code><pre>\n point = Point(1, 2)\n\n point.x\n # => 1\n\n point.y\n # => 2\n\n point.subtract$(Point(2, 0))\n\n point.x\n # => -1\n\n point.y\n # => 2\n\n anotherPoint = Point(1, 2)\n anotherPoint.subtract$(2, 0)\n\n anotherPoint.x\n # => -1\n\n anotherPoint.y\n # => 2\n </pre></code>\n\n @name subtract$\n @methodOf Point#\n @param {Point} other The point to subtract from this point.\n @returns {Point} The difference of the two points.\n */\n subtract$: function(first, second) {\n if (second != null) {\n this.x -= first;\n this.y -= second;\n } else {\n this.x -= first.x;\n this.y -= first.y;\n }\n return this;\n },\n /**\n Scale this Point (Vector) by a constant amount.\n\n <code><pre>\n point = Point(5, 6).scale(2)\n\n point.x\n # => 10\n\n point.y\n # => 12\n </pre></code>\n\n @name scale\n @methodOf Point#\n @param {Number} scalar The amount to scale this point by.\n @returns {Point} A new point, this * scalar.\n */\n scale: function(scalar) {\n return this.copy().scale$(scalar);\n },\n /**\n Scale this Point (Vector) by a constant amount. Modifies the point in place.\n\n <code><pre>\n point = Point(5, 6)\n\n point.x\n # => 5\n\n point.y\n # => 6\n\n point.scale$(2)\n\n point.x\n # => 10\n\n point.y\n # => 12\n </pre></code>\n\n @name scale$\n @methodOf Point#\n @param {Number} scalar The amount to scale this point by.\n @returns {Point} this * scalar.\n */\n scale$: function(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n /**\n The norm of a vector is the unit vector pointing in the same direction. This method\n treats the point as though it is a vector from the origin to (x, y).\n\n <code><pre>\n point = Point(2, 3).norm()\n\n point.x\n # => 0.5547001962252291\n\n point.y \n # => 0.8320502943378437\n\n anotherPoint = Point(2, 3).norm(2)\n\n anotherPoint.x\n # => 1.1094003924504583\n\n anotherPoint.y \n # => 1.6641005886756874 \n </pre></code>\n\n @name norm\n @methodOf Point#\n @returns {Point} The unit vector pointing in the same direction as this vector.\n */\n norm: function(length) {\n if (length == null) {\n length = 1.0;\n }\n return this.copy().norm$(length);\n },\n /**\n The norm of a vector is the unit vector pointing in the same direction. This method\n treats the point as though it is a vector from the origin to (x, y). Modifies the point in place.\n\n <code><pre>\n point = Point(2, 3).norm$()\n\n point.x\n # => 0.5547001962252291\n\n point.y \n # => 0.8320502943378437\n\n anotherPoint = Point(2, 3).norm$(2)\n\n anotherPoint.x\n # => 1.1094003924504583\n\n anotherPoint.y \n # => 1.6641005886756874 \n </pre></code>\n\n @name norm$\n @methodOf Point#\n @returns {Point} The unit vector pointing in the same direction as this vector.\n */\n norm$: function(length) {\n var m;\n if (length == null) {\n length = 1.0;\n }\n if (m = this.length()) {\n return this.scale$(length / m);\n } else {\n return this;\n }\n },\n /**\n Floor the x and y values, returning a new point.\n\n <code><pre>\n point = Point(3.4, 5.8).floor()\n\n point.x\n # => 3\n\n point.y\n # => 5\n </pre></code>\n\n @name floor\n @methodOf Point#\n @returns {Point} A new point, with x and y values each floored to the largest previous integer.\n */\n floor: function() {\n return this.copy().floor$();\n },\n /**\n Floor the x and y values, returning a modified point.\n\n <code><pre>\n point = Point(3.4, 5.8)\n point.floor$()\n\n point.x\n # => 3\n\n point.y\n # => 5\n </pre></code>\n\n @name floor$\n @methodOf Point#\n @returns {Point} A modified point, with x and y values each floored to the largest previous integer.\n */\n floor$: function() {\n this.x = this.x.floor();\n this.y = this.y.floor();\n return this;\n },\n /**\n Determine whether this point is equal to another point.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(2, 3)\n pointC = Point(4, 5)\n\n pointA.equal(pointB)\n # => true\n\n pointA.equal(pointC)\n # => false\n </pre></code>\n\n @name equal\n @methodOf Point#\n @param {Point} other The point to check for equality.\n @returns {Boolean} true if the other point has the same x, y coordinates, false otherwise.\n */\n equal: function(other) {\n return this.x === other.x && this.y === other.y;\n },\n /**\n Computed the length of this point as though it were a vector from (0,0) to (x,y).\n\n <code><pre>\n point = Point(5, 7)\n\n point.length()\n # => 8.602325267042627\n </pre></code>\n\n @name length\n @methodOf Point#\n @returns {Number} The length of the vector from the origin to this point.\n */\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n /**\n Calculate the magnitude of this Point (Vector).\n\n <code><pre>\n point = Point(5, 7)\n\n point.magnitude()\n # => 8.602325267042627\n </pre></code>\n\n @name magnitude\n @methodOf Point#\n @returns {Number} The magnitude of this point as if it were a vector from (0, 0) -> (x, y).\n */\n magnitude: function() {\n return this.length();\n },\n /**\n Returns the direction in radians of this point from the origin.\n\n <code><pre>\n point = Point(0, 1)\n\n point.direction()\n # => 1.5707963267948966 # Math.PI / 2\n </pre></code>\n\n @name direction\n @methodOf Point#\n @returns {Number} The direction in radians of this point from the origin\n */\n direction: function() {\n return Math.atan2(this.y, this.x);\n },\n /**\n Calculate the dot product of this point and another point (Vector).\n @name dot\n @methodOf Point#\n @param {Point} other The point to dot with this point.\n @returns {Number} The dot product of this point dot other as a scalar value.\n */\n dot: function(other) {\n return this.x * other.x + this.y * other.y;\n },\n /**\n Calculate the cross product of this point and another point (Vector). \n Usually cross products are thought of as only applying to three dimensional vectors,\n but z can be treated as zero. The result of this method is interpreted as the magnitude \n of the vector result of the cross product between [x1, y1, 0] x [x2, y2, 0]\n perpendicular to the xy plane.\n\n @name cross\n @methodOf Point#\n @param {Point} other The point to cross with this point.\n @returns {Number} The cross product of this point with the other point as scalar value.\n */\n cross: function(other) {\n return this.x * other.y - other.x * this.y;\n },\n /**\n Compute the Euclidean distance between this point and another point.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(9, 2)\n\n pointA.distance(pointB)\n # => 7.0710678118654755 # Math.sqrt(50)\n </pre></code>\n\n @name distance\n @methodOf Point#\n @param {Point} other The point to compute the distance to.\n @returns {Number} The distance between this point and another point.\n */\n distance: function(other) {\n return Point.distance(this, other);\n },\n /**\n @name toString\n @methodOf Point#\n @returns {String} A string representation of this point.\n */\n toString: function() {\n return \"Point(\" + this.x + \", \" + this.y + \")\";\n }\n /**\n Compute the Euclidean distance between two points.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(9, 2)\n\n Point.distance(pointA, pointB)\n # => 7.0710678118654755 # Math.sqrt(50)\n </pre></code>\n\n @name distance\n @fieldOf Point\n @param {Point} p1\n @param {Point} p2\n @returns {Number} The Euclidean distance between two points.\n */\n };\n Point.distance = function(p1, p2) {\n return Math.sqrt(Point.distanceSquared(p1, p2));\n };\n /**\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(9, 2)\n\n Point.distanceSquared(pointA, pointB)\n # => 50\n </pre></code>\n\n @name distanceSquared\n @fieldOf Point\n @param {Point} p1\n @param {Point} p2\n @returns {Number} The square of the Euclidean distance between two points.\n */\n Point.distanceSquared = function(p1, p2) {\n return Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2);\n };\n /**\n @name interpolate\n @fieldOf Point\n\n @param {Point} p1\n @param {Point} p2\n @param {Number} t\n @returns {Point} A point along the path from p1 to p2\n */\n Point.interpolate = function(p1, p2, t) {\n return p2.subtract(p1).scale(t).add(p1);\n };\n /**\n Construct a point on the unit circle for the given angle.\n\n <code><pre>\n point = Point.fromAngle(Math.PI / 2)\n\n point.x\n # => 0\n\n point.y\n # => 1\n </pre></code>\n\n @name fromAngle\n @fieldOf Point\n @param {Number} angle The angle in radians\n @returns {Point} The point on the unit circle.\n */\n Point.fromAngle = function(angle) {\n return Point(Math.cos(angle), Math.sin(angle));\n };\n /**\n If you have two dudes, one standing at point p1, and the other\n standing at point p2, then this method will return the direction\n that the dude standing at p1 will need to face to look at p2.\n\n <code><pre>\n p1 = Point(0, 0)\n p2 = Point(7, 3)\n\n Point.direction(p1, p2)\n # => 0.40489178628508343\n </pre></code>\n\n @name direction\n @fieldOf Point\n @param {Point} p1 The starting point.\n @param {Point} p2 The ending point.\n @returns {Number} The direction from p1 to p2 in radians.\n */\n Point.direction = function(p1, p2) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n };\n /**\n @name ZERO\n @fieldOf Point\n @returns {Point} The point (0, 0)\n */\n Point.ZERO = Point();\n if (Object.freeze) {\n Object.freeze(Point.ZERO);\n }\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Point\"] = Point;\n})();;\n(function() {\n /**\n @name Random\n @namespace Some useful methods for generating random things.\n */ (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Random\"] = {\n /**\n Returns a random angle, uniformly distributed, between 0 and 2pi.\n\n @name angle\n @methodOf Random\n @returns {Number} A random angle between 0 and 2pi\n */\n angle: function() {\n return rand() * Math.TAU;\n },\n /**\n Returns a random color.\n\n @name color\n @methodOf Random\n @returns {Color} A random color\n */\n color: function() {\n return Color.random();\n },\n /**\n Happens often.\n\n @name often\n @methodOf Random\n */\n often: function() {\n return rand(3);\n },\n /**\n Happens sometimes.\n\n @name sometimes\n @methodOf Random\n */\n sometimes: function() {\n return !rand(3);\n }\n /**\n Returns random integers from [0, n) if n is given.\n Otherwise returns random float between 0 and 1.\n\n @name rand\n @methodOf window\n @param {Number} n\n @returns {Number} A random integer from 0 to n - 1 if n is given. If n is not given, a random float between 0 and 1. \n */\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"rand\"] = function(n) {\n if (n) {\n return Math.floor(n * Math.random());\n } else {\n return Math.random();\n }\n };\n})();;\n/**\nReturns true if this string only contains whitespace characters.\n\n<code><pre>\n\"\".blank()\n# => true\n\n\"hello\".blank()\n# => false\n\n\" \".blank()\n# => true\n</pre></code>\n\n@name blank\n@methodOf String#\n@returns {Boolean} Whether or not this string is blank.\n*/String.prototype.blank = function() {\n return /^\\s*$/.test(this);\n};\n/**\nReturns a new string that is a camelCase version.\n\n<code><pre>\n\"camel_case\".camelize()\n\"camel-case\".camelize()\n\"camel case\".camelize()\n\n# => \"camelCase\"\n</pre></code>\n\n@name camelize\n@methodOf String#\n@returns {String} A new string. camelCase version of `this`. \n*/\nString.prototype.camelize = function() {\n return this.trim().replace(/(\\-|_|\\s)+(.)?/g, function(match, separator, chr) {\n if (chr) {\n return chr.toUpperCase();\n } else {\n return '';\n }\n });\n};\n/**\nReturns a new string with the first letter capitalized and the rest lower cased.\n\n<code><pre>\n\"capital\".capitalize()\n\"cAPITAL\".capitalize()\n\"cApItAl\".capitalize()\n\"CAPITAL\".capitalize()\n\n# => \"Capital\"\n</pre></code>\n\n@name capitalize\n@methodOf String#\n@returns {String} A new string. Capitalized version of `this`\n*/\nString.prototype.capitalize = function() {\n return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\n};\n/**\nReturn the class or constant named in this string.\n\n<code><pre>\n\n\"Constant\".constantize()\n# => Constant\n# notice this isn't a string. Useful for calling methods on class with the same name as `this`.\n</pre></code>\n\n@name constantize\n@methodOf String#\n@returns {Object} The class or constant named in this string.\n*/\nString.prototype.constantize = function() {\n if (this.match(/[A-Z][A-Za-z0-9]*/)) {\n eval(\"var that = \" + this);\n return that;\n } else {\n throw \"String#constantize: '\" + this + \"' is not a valid constant name.\";\n }\n};\n/**\nReturns a new string that is a more human readable version.\n\n<code><pre>\n\"player_id\".humanize()\n# => \"Player\"\n\n\"player_ammo\".humanize()\n# => \"Player ammo\"\n</pre></code>\n\n@name humanize\n@methodOf String#\n@returns {String} A new string. Replaces _id and _ with \"\" and capitalizes the word.\n*/\nString.prototype.humanize = function() {\n return this.replace(/_id$/, \"\").replace(/_/g, \" \").capitalize();\n};\n/**\nReturns true.\n\n@name isString\n@methodOf String#\n@returns {Boolean} true\n*/\nString.prototype.isString = function() {\n return true;\n};\n/**\nParse this string as though it is JSON and return the object it represents. If it\nis not valid JSON returns the string itself.\n\n<code><pre>\n# this is valid json, so an object is returned\n'{\"a\": 3}'.parse()\n# => {a: 3}\n\n# double quoting instead isn't valid JSON so a string is returned\n\"{'a': 3}\".parse()\n# => \"{'a': 3}\"\n\n</pre></code>\n\n@name parse\n@methodOf String#\n@returns {Object} Returns an object from the JSON this string contains. If it is not valid JSON returns the string itself.\n*/\nString.prototype.parse = function() {\n try {\n return JSON.parse(this.toString());\n } catch (e) {\n return this.toString();\n }\n};\n/**\nReturns a new string in Title Case.\n\n<code><pre>\n\"title-case\".titleize()\n# => \"Title Case\"\n\n\"title case\".titleize()\n# => \"Title Case\"\n</pre></code>\n\n@name titleize\n@methodOf String#\n@returns {String} A new string. Title Cased.\n*/\nString.prototype.titleize = function() {\n return this.split(/[- ]/).map(function(word) {\n return word.capitalize();\n }).join(' ');\n};\n/**\nUnderscore a word, changing camelCased with under_scored.\n\n<code><pre>\n\"UNDERScore\".underscore()\n# => \"under_score\"\n\n\"UNDER-SCORE\".underscore()\n# => \"under_score\"\n\n\"UnDEr-SCorE\".underscore()\n# => \"un_d_er_s_cor_e\"\n</pre></code>\n\n@name underscore\n@methodOf String#\n@returns {String} A new string. Separated by _.\n*/\nString.prototype.underscore = function() {\n return this.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase();\n};\n/**\nAssumes the string is something like a file name and returns the \ncontents of the string without the extension.\n\n<code><pre>\n\"neat.png\".witouthExtension() \n# => \"neat\"\n</pre></code>\n\n@name withoutExtension\n@methodOf String#\n@returns {String} A new string without the extension name.\n*/\nString.prototype.withoutExtension = function() {\n return this.replace(/\\.[^\\.]*$/, '');\n};;\n/**\nNon-standard\n\n@name toSource\n@methodOf Boolean#\n*/\n/**\nReturns a string representing the specified Boolean object.\n\n<code><em>bool</em>.toString()</code>\n\n@name toString\n@methodOf Boolean#\n*/\n/**\nReturns the primitive value of a Boolean object.\n\n<code><em>bool</em>.valueOf()</code>\n\n@name valueOf\n@methodOf Boolean#\n*/\n/**\nReturns a string representing the Number object in exponential notation\n\n<code><i>number</i>.toExponential( [<em>fractionDigits</em>] )</code>\n@param fractionDigits\nAn integer specifying the number of digits after the decimal point. Defaults\nto as many digits as necessary to specify the number.\n@name toExponential\n@methodOf Number#\n*/\n/**\nFormats a number using fixed-point notation\n\n<code><i>number</i>.toFixed( [<em>digits</em>] )</code>\n@param digits The number of digits to appear after the decimal point; this\nmay be a value between 0 and 20, inclusive, and implementations may optionally\nsupport a larger range of values. If this argument is omitted, it is treated as\n0.\n@name toFixed\n@methodOf Number#\n*/\n/**\nnumber.toLocaleString();\n\n@name toLocaleString\n@methodOf Number#\n*/\n/**\nReturns a string representing the Number object to the specified precision. \n\n<code><em>number</em>.toPrecision( [ <em>precision</em> ] )</code>\n@param precision An integer specifying the number of significant digits.\n@name toPrecision\n@methodOf Number#\n*/\n/**\nNon-standard\n\n@name toSource\n@methodOf Number#\n*/\n/**\nReturns a string representing the specified Number object\n\n<code><i>number</i>.toString( [<em>radix</em>] )</code>\n@param radix\nAn integer between 2 and 36 specifying the base to use for representing\nnumeric values.\n@name toString\n@methodOf Number#\n*/\n/**\nReturns the primitive value of a Number object.\n\n@name valueOf\n@methodOf Number#\n*/\n/**\nReturns the specified character from a string.\n\n<code><em>string</em>.charAt(<em>index</em>)</code>\n@param index An integer between 0 and 1 less than the length of the string.\n@name charAt\n@methodOf String#\n*/\n/**\nReturns the numeric Unicode value of the character at the given index (except\nfor unicode codepoints > 0x10000).\n\n\n@param index An integer greater than 0 and less than the length of the string;\nif it is not a number, it defaults to 0.\n@name charCodeAt\n@methodOf String#\n*/\n/**\nCombines the text of two or more strings and returns a new string.\n\n<code><em>string</em>.concat(<em>string2</em>, <em>string3</em>[, ..., <em>stringN</em>])</code>\n@param string2...stringN Strings to concatenate to this string.\n@name concat\n@methodOf String#\n*/\n/**\nReturns the index within the calling String object of the first occurrence of\nthe specified value, starting the search at fromIndex,\nreturns -1 if the value is not found.\n\n<code><em>string</em>.indexOf(<em>searchValue</em>[, <em>fromIndex</em>]</code>\n@param searchValue A string representing the value to search for.\n@param fromIndex The location within the calling string to start the search\nfrom. It can be any integer between 0 and the length of the string. The default\nvalue is 0.\n@name indexOf\n@methodOf String#\n*/\n/**\nReturns the index within the calling String object of the last occurrence of the\nspecified value, or -1 if not found. The calling string is searched backward,\nstarting at fromIndex.\n\n<code><em>string</em>.lastIndexOf(<em>searchValue</em>[, <em>fromIndex</em>])</code>\n@param searchValue A string representing the value to search for.\n@param fromIndex The location within the calling string to start the search\nfrom, indexed from left to right. It can be any integer between 0 and the length\nof the string. The default value is the length of the string.\n@name lastIndexOf\n@methodOf String#\n*/\n/**\nReturns a number indicating whether a reference string comes before or after or\nis the same as the given string in sort order.\n\n<code> localeCompare(compareString) </code>\n\n@name localeCompare\n@methodOf String#\n*/\n/**\nUsed to retrieve the matches when matching a string against a regular\nexpression.\n\n<code><em>string</em>.match(<em>regexp</em>)</code>\n@param regexp A regular expression object. If a non-RegExp object obj is passed,\nit is implicitly converted to a RegExp by using new RegExp(obj).\n@name match\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name quote\n@methodOf String#\n*/\n/**\nReturns a new string with some or all matches of a pattern replaced by a\nreplacement. The pattern can be a string or a RegExp, and the replacement can\nbe a string or a function to be called for each match.\n\n<code><em>str</em>.replace(<em>regexp|substr</em>, <em>newSubStr|function[</em>, </code><code><em>flags]</em>);</code>\n@param regexp A RegExp object. The match is replaced by the return value of\nparameter #2.\n@param substr A String that is to be replaced by newSubStr.\n@param newSubStr The String that replaces the substring received from parameter\n#1. A number of special replacement patterns are supported; see the \"Specifying\na string as a parameter\" section below.\n@param function A function to be invoked to create the new substring (to put in\nplace of the substring received from parameter #1). The arguments supplied to\nthis function are described in the \"Specifying a function as a parameter\"\nsection below.\n@param flags gimy \n\nNon-standardThe use of the flags parameter in the String.replace method is\nnon-standard. For cross-browser compatibility, use a RegExp object with\ncorresponding flags.A string containing any combination of the RegExp flags: g\nglobal match i ignore case m match over multiple lines y Non-standard \nsticky global matchignore casematch over multiple linesNon-standard sticky\n@name replace\n@methodOf String#\n*/\n/**\nExecutes the search for a match between a regular expression and this String\nobject.\n\n<code><em>string</em>.search(<em>regexp</em>)</code>\n@param regexp A regular expression object. If a non-RegExp object obj is\npassed, it is implicitly converted to a RegExp by using new RegExp(obj).\n@name search\n@methodOf String#\n*/\n/**\nExtracts a section of a string and returns a new string.\n\n<code><em>string</em>.slice(<em>beginslice</em>[, <em>endSlice</em>])</code>\n@param beginSlice The zero-based index at which to begin extraction.\n@param endSlice The zero-based index at which to end extraction. If omitted,\nslice extracts to the end of the string.\n@name slice\n@methodOf String#\n*/\n/**\nSplits a String object into an array of strings by separating the string into\nsubstrings.\n\n<code><em>string</em>.split([<em>separator</em>][, <em>limit</em>])</code>\n@param separator Specifies the character to use for separating the string. The\nseparator is treated as a string or a regular expression. If separator is\nomitted, the array returned contains one element consisting of the entire\nstring.\n@param limit Integer specifying a limit on the number of splits to be found.\n@name split\n@methodOf String#\n*/\n/**\nReturns the characters in a string beginning at the specified location through\nthe specified number of characters.\n\n<code><em>string</em>.substr(<em>start</em>[, <em>length</em>])</code>\n@param start Location at which to begin extracting characters.\n@param length The number of characters to extract.\n@name substr\n@methodOf String#\n*/\n/**\nReturns a subset of a string between one index and another, or through the end\nof the string.\n\n<code><em>string</em>.substring(<em>indexA</em>[, <em>indexB</em>])</code>\n@param indexA An integer between 0 and one less than the length of the string.\n@param indexB (optional) An integer between 0 and the length of the string.\n@name substring\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to lower case, according to any\nlocale-specific case mappings.\n\n<code> toLocaleLowerCase() </code>\n\n@name toLocaleLowerCase\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to upper case, according to any\nlocale-specific case mappings.\n\n<code> toLocaleUpperCase() </code>\n\n@name toLocaleUpperCase\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to lowercase.\n\n<code><em>string</em>.toLowerCase()</code>\n\n@name toLowerCase\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf String#\n*/\n/**\nReturns a string representing the specified object.\n\n<code><em>string</em>.toString()</code>\n\n@name toString\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to uppercase.\n\n<code><em>string</em>.toUpperCase()</code>\n\n@name toUpperCase\n@methodOf String#\n*/\n/**\nRemoves whitespace from both ends of the string.\n\n<code><em>string</em>.trim()</code>\n\n@name trim\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name trimLeft\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name trimRight\n@methodOf String#\n*/\n/**\nReturns the primitive value of a String object.\n\n<code><em>string</em>.valueOf()</code>\n\n@name valueOf\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name anchor\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name big\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code>BLINK</code>\n\n@name blink\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name bold\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name fixed\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code><FONT COLOR=\"<i>color</i>\"></code>\n\n@name fontcolor\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code><FONT SIZE=\"<i>size</i>\"></code>\n\n@name fontsize\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name italics\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name link\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name small\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name strike\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name sub\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name sup\n@methodOf String#\n*/\n/**\nRemoves the last element from an array and returns that element.\n\n<code>\n<i>array</i>.pop()\n</code>\n\n@name pop\n@methodOf Array#\n*/\n/**\nMutates an array by appending the given elements and returning the new length of\nthe array.\n\n<code><em>array</em>.push(<em>element1</em>, ..., <em>elementN</em>)</code>\n@param element1, ..., elementN The elements to add to the end of the array.\n@name push\n@methodOf Array#\n*/\n/**\nReverses an array in place. The first array element becomes the last and the\nlast becomes the first.\n\n<code><em>array</em>.reverse()</code>\n\n@name reverse\n@methodOf Array#\n*/\n/**\nRemoves the first element from an array and returns that element. This method\nchanges the length of the array.\n\n<code><em>array</em>.shift()</code>\n\n@name shift\n@methodOf Array#\n*/\n/**\nSorts the elements of an array in place.\n\n<code><em>array</em>.sort([<em>compareFunction</em>])</code>\n@param compareFunction Specifies a function that defines the sort order. If\nomitted, the array is sorted lexicographically (in dictionary order) according\nto the string conversion of each element.\n@name sort\n@methodOf Array#\n*/\n/**\nChanges the content of an array, adding new elements while removing old\nelements.\n\n<code><em>array</em>.splice(<em>index</em>, <em>howMany</em>[, <em>element1</em>[, ...[, <em>elementN</em>]]])</code>\n@param index Index at which to start changing the array. If negative, will\nbegin that many elements from the end.\n@param howMany An integer indicating the number of old array elements to\nremove. If howMany is 0, no elements are removed. In this case, you should\nspecify at least one new element. If no howMany parameter is specified (second\nsyntax above, which is a SpiderMonkey extension), all elements after index are\nremoved.\n@param element1, ..., elementN The elements to add to the array. If you don't\nspecify any elements, splice simply removes elements from the array.\n@name splice\n@methodOf Array#\n*/\n/**\nAdds one or more elements to the beginning of an array and returns the new\nlength of the array.\n\n<code><em>arrayName</em>.unshift(<em>element1</em>, ..., <em>elementN</em>) </code>\n@param element1, ..., elementN The elements to add to the front of the array.\n@name unshift\n@methodOf Array#\n*/\n/**\nReturns a new array comprised of this array joined with other array(s) and/or\nvalue(s).\n\n<code><em>array</em>.concat(<em>value1</em>, <em>value2</em>, ..., <em>valueN</em>)</code>\n@param valueN Arrays and/or values to concatenate to the resulting array.\n@name concat\n@methodOf Array#\n*/\n/**\nJoins all elements of an array into a string.\n\n<code><em>array</em>.join(<em>separator</em>)</code>\n@param separator Specifies a string to separate each element of the array. The\nseparator is converted to a string if necessary. If omitted, the array elements\nare separated with a comma.\n@name join\n@methodOf Array#\n*/\n/**\nReturns a one-level deep copy of a portion of an array.\n\n<code><em>array</em>.slice(<em>begin</em>[, <em>end</em>])</code>\n@param begin Zero-based index at which to begin extraction.As a negative index,\nstart indicates an offset from the end of the sequence. slice(-2) extracts the\nsecond-to-last element and the last element in the sequence.\n@param end Zero-based index at which to end extraction. slice extracts up to\nbut not including end.slice(1,4) extracts the second element through the fourth\nelement (elements indexed 1, 2, and 3).As a negative index, end indicates an\noffset from the end of the sequence. slice(2,-1) extracts the third element\nthrough the second-to-last element in the sequence.If end is omitted, slice\nextracts to the end of the sequence.\n@name slice\n@methodOf Array#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Array#\n*/\n/**\nReturns a string representing the specified array and its elements.\n\n<code><em>array</em>.toString()</code>\n\n@name toString\n@methodOf Array#\n*/\n/**\nReturns the first index at which a given element can be found in the array, or\n-1 if it is not present.\n\n<code><em>array</em>.indexOf(<em>searchElement</em>[, <em>fromIndex</em>])</code>\n@param searchElement fromIndex Element to locate in the array.The index at\nwhich to begin the search. Defaults to 0, i.e. the whole array will be searched.\nIf the index is greater than or equal to the length of the array, -1 is\nreturned, i.e. the array will not be searched. If negative, it is taken as the\noffset from the end of the array. Note that even when the index is negative, the\narray is still searched from front to back. If the calculated index is less than\n0, the whole array will be searched.\n@name indexOf\n@methodOf Array#\n*/\n/**\nReturns the last index at which a given element can be found in the array, or -1\nif it is not present. The array is searched backwards, starting at fromIndex.\n\n<code><em>array</em>.lastIndexOf(<em>searchElement</em>[, <em>fromIndex</em>])</code>\n@param searchElement fromIndex Element to locate in the array.The index at\nwhich to start searching backwards. Defaults to the array's length, i.e. the\nwhole array will be searched. If the index is greater than or equal to the\nlength of the array, the whole array will be searched. If negative, it is taken\nas the offset from the end of the array. Note that even when the index is\nnegative, the array is still searched from back to front. If the calculated\nindex is less than 0, -1 is returned, i.e. the array will not be searched.\n@name lastIndexOf\n@methodOf Array#\n*/\n/**\nCreates a new array with all elements that pass the test implemented by the\nprovided function.\n\n<code><em>array</em>.filter(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to test each element of the array.Object to\nuse as this when executing callback.\n@name filter\n@methodOf Array#\n*/\n/**\nExecutes a provided function once per array element.\n\n<code><em>array</em>.forEach(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to execute for each element.Object to use\nas this when executing callback.\n@name forEach\n@methodOf Array#\n*/\n/**\nTests whether all elements in the array pass the test implemented by the\nprovided function.\n\n<code><em>array</em>.every(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callbackthisObject Function to test for each element.Object to use as\nthis when executing callback.\n@name every\n@methodOf Array#\n*/\n/**\nCreates a new array with the results of calling a provided function on every\nelement in this array.\n\n<code><em>array</em>.map(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callbackthisObject Function that produces an element of the new Array\nfrom an element of the current one.Object to use as this when executing\ncallback.\n@name map\n@methodOf Array#\n*/\n/**\nTests whether some element in the array passes the test implemented by the\nprovided function.\n\n<code><em>array</em>.some(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to test for each element.Object to use as\nthis when executing callback.\n@name some\n@methodOf Array#\n*/\n/**\nApply a function against an accumulator and each value of the array (from\nleft-to-right) as to reduce it to a single value.\n\n<code><em>array</em>.reduce(<em>callback</em>[, <em>initialValue</em>])</code>\n@param callbackinitialValue Function to execute on each value in the\narray.Object to use as the first argument to the first call of the callback.\n@name reduce\n@methodOf Array#\n*/\n/**\nApply a function simultaneously against two values of the array (from\nright-to-left) as to reduce it to a single value.\n\n<code><em>array</em>.reduceRight(<em>callback</em>[, <em>initialValue</em>])</code>\n@param callback initialValue Function to execute on each value in the\narray.Object to use as the first argument to the first call of the callback.\n@name reduceRight\n@methodOf Array#\n*/\n/**\nReturns a boolean indicating whether the object has the specified property.\n\n<code><em>obj</em>.hasOwnProperty(<em>prop</em>)</code>\n@param prop The name of the property to test.\n@name hasOwnProperty\n@methodOf Object#\n*/\n/**\nCalls a function with a given this value and arguments provided as an array.\n\n<code><em>fun</em>.apply(<em>thisArg</em>[, <em>argsArray</em>])</code>\n@param thisArg Determines the value of this inside fun. If thisArg is null or\nundefined, this will be the global object. Otherwise, this will be equal to\nObject(thisArg) (which is thisArg if thisArg is already an object, or a String,\nBoolean, or Number if thisArg is a primitive value of the corresponding type).\nTherefore, it is always true that typeof this == \"object\" when the function\nexecutes.\n@param argsArray An argument array for the object, specifying the arguments\nwith which fun should be called, or null or undefined if no arguments should be\nprovided to the function.\n@name apply\n@methodOf Function#\n*/\n/**\nCreates a new function that, when called, itself calls this function in the\ncontext of the provided this value, with a given sequence of arguments preceding\nany provided when the new function was called.\n\n<code><em>fun</em>.bind(<em>thisArg</em>[, <em>arg1</em>[, <em>arg2</em>[, ...]]])</code>\n@param thisValuearg1, arg2, ... The value to be passed as the this parameter to\nthe target function when the bound function is called. The value is ignored if\nthe bound function is constructed using the new operator.Arguments to prepend to\narguments provided to the bound function when invoking the target function.\n@name bind\n@methodOf Function#\n*/\n/**\nCalls a function with a given this value and arguments provided individually.\n\n<code><em>fun</em>.call(<em>thisArg</em>[, <em>arg1</em>[, <em>arg2</em>[, ...]]])</code>\n@param thisArg Determines the value of this inside fun. If thisArg is null or\nundefined, this will be the global object. Otherwise, this will be equal to\nObject(thisArg) (which is thisArg if thisArg is already an object, or a String,\nBoolean, or Number if thisArg is a primitive value of the corresponding type).\nTherefore, it is always true that typeof this == \"object\" when the function\nexecutes.\n@param arg1, arg2, ... Arguments for the object.\n@name call\n@methodOf Function#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Function#\n*/\n/**\nReturns a string representing the source code of the function.\n\n<code><em>function</em>.toString(<em>indentation</em>)</code>\n@param indentation Non-standard The amount of spaces to indent the string\nrepresentation of the source code. If indentation is less than or equal to -1,\nmost unnecessary spaces are removed.\n@name toString\n@methodOf Function#\n*/\n/**\nExecutes a search for a match in a specified string. Returns a result array, or\nnull.\n\n\n@param regexp The name of the regular expression. It can be a variable name or\na literal.\n@param str The string against which to match the regular expression.\n@name exec\n@methodOf RegExp#\n*/\n/**\nExecutes the search for a match between a regular expression and a specified\nstring. Returns true or false.\n\n<code> <em>regexp</em>.test([<em>str</em>]) </code>\n@param regexp The name of the regular expression. It can be a variable name or\na literal.\n@param str The string against which to match the regular expression.\n@name test\n@methodOf RegExp#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf RegExp#\n*/\n/**\nReturns a string representing the specified object.\n\n<code><i>regexp</i>.toString()</code>\n\n@name toString\n@methodOf RegExp#\n*/\n/**\nReturns a reference to the Date function that created the instance's prototype.\nNote that the value of this property is a reference to the function itself, not\na string containing the function's name.\n\n\n\n@name constructor\n@methodOf Date#\n*/\n/**\nReturns the day of the month for the specified date according to local time.\n\n<code>\ngetDate()\n</code>\n\n@name getDate\n@methodOf Date#\n*/\n/**\nReturns the day of the week for the specified date according to local time.\n\n<code>\ngetDay()\n</code>\n\n@name getDay\n@methodOf Date#\n*/\n/**\nReturns the year of the specified date according to local time.\n\n<code>\ngetFullYear()\n</code>\n\n@name getFullYear\n@methodOf Date#\n*/\n/**\nReturns the hour for the specified date according to local time.\n\n<code>\ngetHours()\n</code>\n\n@name getHours\n@methodOf Date#\n*/\n/**\nReturns the milliseconds in the specified date according to local time.\n\n<code>\ngetMilliseconds()\n</code>\n\n@name getMilliseconds\n@methodOf Date#\n*/\n/**\nReturns the minutes in the specified date according to local time.\n\n<code>\ngetMinutes()\n</code>\n\n@name getMinutes\n@methodOf Date#\n*/\n/**\nReturns the month in the specified date according to local time.\n\n<code>\ngetMonth()\n</code>\n\n@name getMonth\n@methodOf Date#\n*/\n/**\nReturns the seconds in the specified date according to local time.\n\n<code>\ngetSeconds()\n</code>\n\n@name getSeconds\n@methodOf Date#\n*/\n/**\nReturns the numeric value corresponding to the time for the specified date\naccording to universal time.\n\n<code> getTime() </code>\n\n@name getTime\n@methodOf Date#\n*/\n/**\nReturns the time-zone offset from UTC, in minutes, for the current locale.\n\n<code> getTimezoneOffset() </code>\n\n@name getTimezoneOffset\n@methodOf Date#\n*/\n/**\nReturns the day (date) of the month in the specified date according to universal\ntime.\n\n<code>\ngetUTCDate()\n</code>\n\n@name getUTCDate\n@methodOf Date#\n*/\n/**\nReturns the day of the week in the specified date according to universal time.\n\n<code>\ngetUTCDay()\n</code>\n\n@name getUTCDay\n@methodOf Date#\n*/\n/**\nReturns the year in the specified date according to universal time.\n\n<code>\ngetUTCFullYear()\n</code>\n\n@name getUTCFullYear\n@methodOf Date#\n*/\n/**\nReturns the hours in the specified date according to universal time.\n\n<code>\ngetUTCHours\n</code>\n\n@name getUTCHours\n@methodOf Date#\n*/\n/**\nReturns the milliseconds in the specified date according to universal time.\n\n<code>\ngetUTCMilliseconds()\n</code>\n\n@name getUTCMilliseconds\n@methodOf Date#\n*/\n/**\nReturns the minutes in the specified date according to universal time.\n\n<code>\ngetUTCMinutes()\n</code>\n\n@name getUTCMinutes\n@methodOf Date#\n*/\n/**\nReturns the month of the specified date according to universal time.\n\n<code>\ngetUTCMonth()\n</code>\n\n@name getUTCMonth\n@methodOf Date#\n*/\n/**\nReturns the seconds in the specified date according to universal time.\n\n<code>\ngetUTCSeconds()\n</code>\n\n@name getUTCSeconds\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name getYear\n@methodOf Date#\n*/\n/**\nSets the day of the month for a specified date according to local time.\n\n<code> setDate(<em>dayValue</em>) </code>\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setDate\n@methodOf Date#\n*/\n/**\nSets the full year for a specified date according to local time.\n\n<code>\nsetFullYear(<i>yearValue</i>[, <i>monthValue</i>[, <em>dayValue</em>]])\n</code>\n@param yearValue An integer specifying the numeric value of the year, for\nexample, 1995.\n@param monthValue An integer between 0 and 11 representing the months January\nthrough December.\n@param dayValue An integer between 1 and 31 representing the day of the\nmonth. If you specify the dayValue parameter, you must also specify the\nmonthValue.\n@name setFullYear\n@methodOf Date#\n*/\n/**\nSets the hours for a specified date according to local time.\n\n<code>\nsetHours(<i>hoursValue</i>[, <i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]]])\n</code>\n@param hoursValue An integer between 0 and 23, representing the hour. \n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setHours\n@methodOf Date#\n*/\n/**\nSets the milliseconds for a specified date according to local time.\n\n<code>\nsetMilliseconds(<i>millisecondsValue</i>)\n</code>\n@param millisecondsValue A number between 0 and 999, representing the\nmilliseconds.\n@name setMilliseconds\n@methodOf Date#\n*/\n/**\nSets the minutes for a specified date according to local time.\n\n<code>\nsetMinutes(<i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]])\n</code>\n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setMinutes\n@methodOf Date#\n*/\n/**\nSet the month for a specified date according to local time.\n\n<code>\nsetMonth(<i>monthValue</i>[, <em>dayValue</em>])\n</code>\n@param monthValue An integer between 0 and 11 (representing the months\nJanuary through December).\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setMonth\n@methodOf Date#\n*/\n/**\nSets the seconds for a specified date according to local time.\n\n<code>\nsetSeconds(<i>secondsValue</i>[, <em>msValue</em>])\n</code>\n@param secondsValue An integer between 0 and 59. \n@param msValue A number between 0 and 999, representing the milliseconds.\n@name setSeconds\n@methodOf Date#\n*/\n/**\nSets the Date object to the time represented by a number of milliseconds since\nJanuary 1, 1970, 00:00:00 UTC.\n\n<code>\nsetTime(<i>timeValue</i>)\n</code>\n@param timeValue An integer representing the number of milliseconds since 1\nJanuary 1970, 00:00:00 UTC.\n@name setTime\n@methodOf Date#\n*/\n/**\nSets the day of the month for a specified date according to universal time.\n\n<code>\nsetUTCDate(<i>dayValue</i>)\n</code>\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setUTCDate\n@methodOf Date#\n*/\n/**\nSets the full year for a specified date according to universal time.\n\n<code>\nsetUTCFullYear(<i>yearValue</i>[, <i>monthValue</i>[, <em>dayValue</em>]])\n</code>\n@param yearValue An integer specifying the numeric value of the year, for\nexample, 1995.\n@param monthValue An integer between 0 and 11 representing the months January\nthrough December.\n@param dayValue An integer between 1 and 31 representing the day of the\nmonth. If you specify the dayValue parameter, you must also specify the\nmonthValue.\n@name setUTCFullYear\n@methodOf Date#\n*/\n/**\nSets the hour for a specified date according to universal time.\n\n<code>\nsetUTCHours(<i>hoursValue</i>[, <i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]]])\n</code>\n@param hoursValue An integer between 0 and 23, representing the hour. \n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setUTCHours\n@methodOf Date#\n*/\n/**\nSets the milliseconds for a specified date according to universal time.\n\n<code>\nsetUTCMilliseconds(<i>millisecondsValue</i>)\n</code>\n@param millisecondsValue A number between 0 and 999, representing the\nmilliseconds.\n@name setUTCMilliseconds\n@methodOf Date#\n*/\n/**\nSets the minutes for a specified date according to universal time.\n\n<code>\nsetUTCMinutes(<i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]])\n</code>\n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setUTCMinutes\n@methodOf Date#\n*/\n/**\nSets the month for a specified date according to universal time.\n\n<code>\nsetUTCMonth(<i>monthValue</i>[, <em>dayValue</em>])\n</code>\n@param monthValue An integer between 0 and 11, representing the months\nJanuary through December.\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setUTCMonth\n@methodOf Date#\n*/\n/**\nSets the seconds for a specified date according to universal time.\n\n<code>\nsetUTCSeconds(<i>secondsValue</i>[, <em>msValue</em>])\n</code>\n@param secondsValue An integer between 0 and 59. \n@param msValue A number between 0 and 999, representing the milliseconds.\n@name setUTCSeconds\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name setYear\n@methodOf Date#\n*/\n/**\nReturns the date portion of a Date object in human readable form in American\nEnglish.\n\n<code><em>date</em>.toDateString()</code>\n\n@name toDateString\n@methodOf Date#\n*/\n/**\nReturns a JSON representation of the Date object.\n\n<code><em>date</em>.prototype.toJSON()</code>\n\n@name toJSON\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name toGMTString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, returning the \"date\" portion using the operating\nsystem's locale's conventions.\n\n<code>\ntoLocaleDateString()\n</code>\n\n@name toLocaleDateString\n@methodOf Date#\n*/\n/**\nNon-standard\n\n\n\n@name toLocaleFormat\n@methodOf Date#\n*/\n/**\nConverts a date to a string, using the operating system's locale's conventions.\n\n<code>\ntoLocaleString()\n</code>\n\n@name toLocaleString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, returning the \"time\" portion using the current\nlocale's conventions.\n\n<code> toLocaleTimeString() </code>\n\n@name toLocaleTimeString\n@methodOf Date#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Date#\n*/\n/**\nReturns a string representing the specified Date object.\n\n<code> toString() </code>\n\n@name toString\n@methodOf Date#\n*/\n/**\nReturns the time portion of a Date object in human readable form in American\nEnglish.\n\n<code><em>date</em>.toTimeString()</code>\n\n@name toTimeString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, using the universal time convention.\n\n<code> toUTCString() </code>\n\n@name toUTCString\n@methodOf Date#\n*/\n/**\nReturns the primitive value of a Date object.\n\n<code>\nvalueOf()\n</code>\n\n@name valueOf\n@methodOf Date#\n*/;\n/*!\nMath.uuid.js (v1.4)\nhttp://www.broofa.com\nmailto:robert@broofa.com\n\nCopyright (c) 2010 Robert Kieffer\nDual licensed under the MIT and GPL licenses.\n*/\n\n/**\nGenerate a random uuid.\n\n<code><pre>\n // No arguments - returns RFC4122, version 4 ID\n Math.uuid()\n=> \"92329D39-6F5C-4520-ABFC-AAB64544E172\"\n\n // One argument - returns ID of the specified length\n Math.uuid(15) // 15 character ID (default base=62)\n=> \"VcydxgltxrVZSTV\"\n\n // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)\n Math.uuid(8, 2) // 8 character ID (base=2)\n=> \"01001010\"\n\n Math.uuid(8, 10) // 8 character ID (base=10)\n=> \"47473046\"\n\n Math.uuid(8, 16) // 8 character ID (base=16)\n=> \"098F4D35\"\n</pre></code>\n\n@name uuid\n@methodOf Math\n@param length The desired number of characters\n@param radix The number of allowable values for each character.\n */\n(function() {\n // Private array of chars to use\n var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); \n\n Math.uuid = function (len, radix) {\n var chars = CHARS, uuid = [];\n radix = radix || chars.length;\n\n if (len) {\n // Compact form\n for (var i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];\n } else {\n // rfc4122, version 4 form\n var r;\n\n // rfc4122 requires these characters\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\n uuid[14] = '4';\n\n // Fill in random data. At i==19 set the high bits of clock sequence as\n // per rfc4122, sec. 4.1.5\n for (var i = 0; i < 36; i++) {\n if (!uuid[i]) {\n r = 0 | Math.random()*16;\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\n }\n }\n }\n\n return uuid.join('');\n };\n\n // A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance\n // by minimizing calls to random()\n Math.uuidFast = function() {\n var chars = CHARS, uuid = new Array(36), rnd=0, r;\n for (var i = 0; i < 36; i++) {\n if (i==8 || i==13 || i==18 || i==23) {\n uuid[i] = '-';\n } else if (i==14) {\n uuid[i] = '4';\n } else {\n if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;\n r = rnd & 0xf;\n rnd = rnd >> 4;\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\n }\n }\n return uuid.join('');\n };\n\n // A more compact, but less performant, RFC4122v4 solution:\n Math.uuidCompact = function() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n }).toUpperCase();\n };\n})();;\n;\n;\n/**\nThe Bounded module is used to provide basic data about the\nlocation and dimensions of the including object. This module is included\nby default in <code>GameObject</code>.\n\n<code><pre>\nplayer = Core\n x: 10\n y: 50\n width: 20\n height: 20\n other: \"stuff\"\n more: \"properties\"\n\nplayer.position()\n# => Uncaught TypeError: Object has no method 'position'\n\nplayer.include(Bounded)\n\n# now player has all the methods provided by this module\nplayer.position()\n# => {x: 10, y: 50}\n</pre></code>\n\n@see GameObject\n\nBounded module\n@name Bounded\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Bounded;\nBounded = function(I, self) {\n if (I == null) {\n I = {};\n }\n Object.reverseMerge(I, {\n x: 0,\n y: 0,\n width: 8,\n height: 8,\n collisionMargin: Point(0, 0)\n });\n return {\n /**\n The position of this game object. By default it is the top left point.\n Redefining the center method will change the relative position.\n\n <code><pre>\n player = Core\n x: 50\n y: 40\n\n player.include(Bounded) \n\n player.position()\n # => {x: 50, y: 40}\n </pre></code>\n\n @name position\n @methodOf Bounded#\n @returns {Point} The position of this object\n */\n position: function(newPosition) {\n if (newPosition != null) {\n I.x = newPosition.x;\n return I.y = newPosition.y;\n } else {\n return Point(I.x, I.y);\n }\n },\n changePosition: function(delta) {\n I.x += delta.x;\n I.y += delta.y;\n return self;\n },\n /**\n Does a check to see if this object is overlapping\n with the bounds passed in.\n\n <code><pre>\n player = Core\n x: 4\n y: 6\n width: 20\n height: 20\n\n player.include(Bounded) \n\n player.collides({x: 5, y: 7, width: 20, height: 20})\n # => true\n </pre></code>\n\n @name collides\n @methodOf Bounded#\n @returns {Point} The position of this object\n */\n collides: function(bounds) {\n return Collision.rectangular(I, bounds);\n },\n /**\n This returns a modified bounds based on the collision margin.\n The area of the bounds is reduced if collision margin is positive\n and increased if collision margin is negative.\n\n <code><pre>\n player = Core\n collisionMargin: \n x: -2\n y: -4\n x: 50\n y: 50\n width: 20\n height: 20\n\n player.include(Bounded)\n\n player.collisionBounds()\n # => {x: 38, y: 36, height: 28, width: 24}\n\n player.collisionBounds(10, 10)\n # => {x: 48, y: 46, height: 28, width: 24}\n </pre></code>\n\n @name collisionBounds\n @methodOf Bounded#\n @param {Number} xOffset the amount to shift the x position \n @param {Number} yOffset the amount to shift the y position\n @returns {Object} The collision bounds\n */\n collisionBounds: function(xOffset, yOffset) {\n var bounds;\n bounds = self.bounds(xOffset, yOffset);\n bounds.x += I.collisionMargin.x;\n bounds.y += I.collisionMargin.y;\n bounds.width -= 2 * I.collisionMargin.x;\n bounds.height -= 2 * I.collisionMargin.y;\n return bounds;\n },\n /**\n The bounds method returns infomation about the location \n of the object and its dimensions with optional offsets.\n\n <code><pre>\n player = Core\n x: 3\n y: 6\n width: 2\n height: 2\n\n player.include(Bounded)\n\n player.bounds()\n # => {x: 3, y: 6, width: 2, height: 2}\n\n player.bounds(7, 4)\n # => {x: 10, y: 10, width: 2, height: 2} \n </pre></code>\n\n @name bounds\n @methodOf Bounded#\n @param {Number} xOffset the amount to shift the x position \n @param {Number} yOffset the amount to shift the y position\n */\n bounds: function(xOffset, yOffset) {\n var center;\n center = self.center();\n return {\n x: center.x - I.width / 2 + (xOffset || 0),\n y: center.y - I.height / 2 + (yOffset || 0),\n width: I.width,\n height: I.height\n };\n },\n /**\n The centeredBounds method returns infomation about the center\n of the object along with the midpoint of the width and height.\n\n <code><pre>\n player = Core\n x: 3\n y: 6\n width: 2\n height: 2\n\n player.include(Bounded)\n\n player.centeredBounds()\n # => {x: 4, y: 7, xw: 1, yw: 1}\n </pre></code>\n\n @name centeredBounds\n @methodOf Bounded#\n */\n centeredBounds: function() {\n var center;\n center = self.center();\n return {\n x: center.x,\n y: center.y,\n xw: I.width / 2,\n yw: I.height / 2\n };\n },\n /**\n The center method returns the {@link Point} that is\n the center of the object.\n\n <code><pre>\n player = Core\n x: 50\n y: 40\n width: 10\n height: 30\n\n player.include(Bounded) \n\n player.center()\n # => {x: 30, y: 35}\n </pre></code>\n\n @name center\n @methodOf Bounded#\n @returns {Point} The middle of the calling object\n */\n center: function(newCenter) {\n return self.position(newCenter);\n },\n /**\n Return the circular bounds of the object. The circle is\n centered at the midpoint of the object.\n\n <code><pre>\n player = Core\n radius: 5\n x: 50\n y: 50\n other: \"stuff\"\n\n player.include(Bounded)\n\n player.circle()\n # => {radius: 5, x: 50, y: 50}\n </pre></code>\n\n @name circle\n @methodOf Bounded#\n @returns {Object} An object with a position and a radius\n */\n circle: function() {\n var circle;\n circle = self.center();\n circle.radius = I.radius || I.width / 2 || I.height / 2;\n return circle;\n }\n };\n};;\n(function() {\n /**\n Use this to handle generic rectangular collisions among game object a-la Flixel.\n\n @name Collidable\n @module\n @constructor\n */ var ANY, CEILING, Collidable, DOWN, FLOOR, LEFT, NONE, RIGHT, UP, WALL, _ref, _ref2;\n Collidable = function(I, self) {\n Object.reverseMerge(I, {\n allowCollisions: ANY,\n immovable: false,\n touching: NONE,\n velocity: Point(0, 0),\n mass: 1,\n elasticity: 0\n });\n self.attrAccessor(\"immovable\", \"velocity\", \"mass\", \"elasticity\");\n return {\n solid: function(newSolid) {\n if (newSolid != null) {\n if (newSolid) {\n return I.allowCollisions = ANY;\n } else {\n return I.allowCollisions = NONE;\n }\n } else {\n return I.allowCollisions;\n }\n }\n };\n };\n (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Collidable\"] = Collidable;\n /**\n\n */\n _ref = Object.extend(Collidable, {\n NONE: 0x0000,\n LEFT: 0x0001,\n RIGHT: 0x0010,\n UP: 0x0100,\n DOWN: 0x1000\n }), NONE = _ref.NONE, LEFT = _ref.LEFT, RIGHT = _ref.RIGHT, UP = _ref.UP, DOWN = _ref.DOWN;\n _ref2 = Object.extend(Collidable, {\n FLOOR: DOWN,\n WALL: LEFT | RIGHT,\n CEILING: UP,\n ANY: LEFT | RIGHT | UP | DOWN\n }), ANY = _ref2.ANY, FLOOR = _ref2.FLOOR, WALL = _ref2.WALL, CEILING = _ref2.CEILING;\n return Object.extend(Collidable, {\n separate: function(a, b) {\n var aBounds, aMass, aVelocity, average, bBounds, bMass, bVelocity, deltaVelocity, normal, overlap, pushA, pushB, relativeVelocity, totalMass;\n if (a.immovable() && b.immovable()) {\n return;\n }\n aBounds = a.bounds();\n bBounds = b.bounds();\n aVelocity = a.velocity();\n bVelocity = b.velocity();\n deltaVelocity = aVelocity.subtract(bVelocity);\n overlap = Point(0, 0);\n if (Collision.rectangular(aBounds, bBounds)) {\n if (deltaVelocity.x > 0) {\n overlap.x = aBounds.x + aBounds.width - bBounds.x;\n if (!(a.I.allowCollisions & RIGHT) || !(b.I.allowCollisions & LEFT)) {\n overlap.x = 0;\n } else {\n a.I.touching |= RIGHT;\n b.I.touching |= LEFT;\n }\n } else if (deltaVelocity.x < 0) {\n overlap.x = aBounds.x - bBounds.width - bBounds.x;\n if (!(a.I.allowCollisions & LEFT) || !(b.I.allowCollisions & RIGHT)) {\n overlap.x = 0;\n } else {\n a.I.touching |= LEFT;\n b.I.touching |= RIGHT;\n }\n }\n if (deltaVelocity.y > 0) {\n overlap.y = aBounds.y + aBounds.height - bBounds.y;\n if (!(a.I.allowCollisions & DOWN) || !(b.I.allowCollisions & UP)) {\n overlap.y = 0;\n } else {\n a.I.touching |= DOWN;\n b.I.touching |= UP;\n }\n } else if (deltaVelocity.y < 0) {\n overlap.y = aBounds.y - bBounds.height - bBounds.y;\n if (!(a.I.allowCollisions & UP) || !(b.I.allowCollisions & DOWN)) {\n overlap.y = 0;\n } else {\n a.I.touching |= UP;\n b.I.touching |= DOWN;\n }\n }\n }\n if (!overlap.equal(Point.ZERO)) {\n if (!a.immovable() && !b.immovable()) {\n a.changePosition(overlap.scale(-0.5));\n b.changePosition(overlap.scale(+0.5));\n relativeVelocity = aVelocity.subtract(bVelocity);\n aMass = a.mass();\n bMass = b.mass();\n totalMass = bMass + aMass;\n normal = overlap.norm();\n pushA = normal.scale(-2 * (relativeVelocity.dot(normal) * (bMass / totalMass)));\n pushB = normal.scale(+2 * (relativeVelocity.dot(normal) * (aMass / totalMass)));\n average = pushA.add(pushB).scale(0.5);\n pushA.subtract$(average).scale(a.elasticity());\n pushB.subtract$(average).scale(b.elasticity());\n a.I.velocity = average.add(pushA);\n b.I.velocity = average.add(pushB);\n } else if (!a.immovable()) {\n a.changePosition(overlap.scale(-1));\n a.I.velocity = bVelocity.subtract(aVelocity.scale(a.elasticity()));\n } else if (!b.immovable()) {\n b.changePosition(overlap);\n b.I.velocity = aVelocity.subtract(bVelocity.scale(b.elasticity()));\n }\n return true;\n }\n }\n });\n})();;\n(function() {\n var Collision, collides;\n collides = function(a, b) {\n return Collision.rectangular(a.bounds(), b.bounds());\n };\n /**\n Collision holds many useful class methods for checking geometric overlap of various objects.\n\n @name Collision\n @namespace\n */\n Collision = {\n /**\n Collision holds many useful class methods for checking geometric overlap of various objects.\n\n <code><pre>\n player = engine.add\n class: \"Player\"\n x: 0\n y: 0\n width: 10\n height: 10\n\n enemy = engine.add\n class: \"Enemy\"\n x: 5\n y: 5\n width: 10\n height: 10\n\n enemy2 = engine.add\n class: \"Enemy\"\n x: -5\n y: -5\n width: 10\n height: 10\n\n Collision.collide(player, enemy, (p, e) -> ...)\n # => callback is called once\n\n Collision.collide(player, [enemy, enemy2], (p, e) -> ...)\n # => callback is called twice\n\n Collision.collide(\"Player\", \"Enemy\", (p, e) -> ...)\n # => callback is also called twice\n </pre></code>\n\n @name collide\n @methodOf Collision\n @param {Object|Array|String} groupA An object or set of objects to check collisions with\n @param {Object|Array|String} groupB An objcet or set of objects to check collisions with\n @param {Function} callback The callback to call when an object of groupA collides\n with an object of groupB: (a, b) ->\n @param {Function} [detectionMethod] An optional detection method to determine when two \n objects are colliding.\n */\n collide: function(groupA, groupB, callback, detectionMethod) {\n if (detectionMethod == null) {\n detectionMethod = collides;\n }\n if (Object.isString(groupA)) {\n groupA = engine.find(groupA);\n } else {\n groupA = [].concat(groupA);\n }\n if (Object.isString(groupB)) {\n groupB = engine.find(groupB);\n } else {\n groupB = [].concat(groupB);\n }\n return groupA.each(function(a) {\n return groupB.each(function(b) {\n if (detectionMethod(a, b)) {\n return callback(a, b);\n }\n });\n });\n },\n /**\n Takes two bounds objects and returns true if they collide (overlap), false otherwise.\n Bounds objects have x, y, width and height properties.\n\n <code><pre>\n player = GameObject\n x: 0\n y: 0\n width: 10\n height: 10\n\n enemy = GameObject\n x: 5\n y: 5\n width: 10\n height: 10\n\n Collision.rectangular(player, enemy)\n # => true\n\n Collision.rectangular(player, {x: 50, y: 40, width: 30, height: 30})\n # => false\n </pre></code>\n\n @name rectangular\n @methodOf Collision\n @param {Object} a The first rectangle\n @param {Object} b The second rectangle\n @returns {Boolean} true if the rectangles overlap, false otherwise\n */\n rectangular: function(a, b) {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n },\n /**\n Takes two circle objects and returns true if they collide (overlap), false otherwise.\n Circle objects have x, y, and radius.\n\n <code><pre>\n player = GameObject\n x: 5\n y: 5\n radius: 10\n\n enemy = GameObject\n x: 10\n y: 10\n radius: 10\n\n farEnemy = GameObject\n x: 500\n y: 500\n radius: 30\n\n Collision.circular(player, enemy)\n # => true\n\n Collision.circular(player, farEnemy)\n # => false\n </pre></code>\n\n @name circular\n @methodOf Collision\n @param {Object} a The first circle\n @param {Object} b The second circle\n @returns {Boolean} true is the circles overlap, false otherwise\n */\n circular: function(a, b) {\n var dx, dy, r;\n r = a.radius + b.radius;\n dx = b.x - a.x;\n dy = b.y - a.y;\n return r * r >= dx * dx + dy * dy;\n },\n /**\n Detects whether a line intersects a circle.\n\n <code><pre>\n circle = engine.add\n class: \"circle\"\n x: 50\n y: 50\n radius: 10\n\n Collision.rayCircle(Point(0, 0), Point(1, 0), circle)\n # => true\n </pre></code>\n\n @name rayCircle\n @methodOf Collision\n @param {Point} source The starting position\n @param {Point} direction A vector from the point\n @param {Object} target The circle \n @returns {Boolean} true if the line intersects the circle, false otherwise\n */\n rayCircle: function(source, direction, target) {\n var dt, hit, intersection, intersectionToTarget, intersectionToTargetLength, laserToTarget, projection, projectionLength, radius;\n radius = target.radius();\n target = target.position();\n laserToTarget = target.subtract(source);\n projectionLength = direction.dot(laserToTarget);\n if (projectionLength < 0) {\n return false;\n }\n projection = direction.scale(projectionLength);\n intersection = source.add(projection);\n intersectionToTarget = target.subtract(intersection);\n intersectionToTargetLength = intersectionToTarget.length();\n if (intersectionToTargetLength < radius) {\n hit = true;\n }\n if (hit) {\n dt = Math.sqrt(radius * radius - intersectionToTargetLength * intersectionToTargetLength);\n return hit = direction.scale(projectionLength - dt).add(source);\n }\n },\n /**\n Detects whether a line intersects a rectangle.\n\n <code><pre>\n rect = engine.add\n class: \"circle\"\n x: 50\n y: 50\n width: 20\n height: 20\n\n Collision.rayRectangle(Point(0, 0), Point(1, 0), rect)\n # => true\n </pre></code>\n\n @name rayRectangle\n @methodOf Collision\n @param {Point} source The starting position\n @param {Point} direction A vector from the point\n @param {Object} target The rectangle\n @returns {Boolean} true if the line intersects the rectangle, false otherwise\n */\n rayRectangle: function(source, direction, target) {\n var areaPQ0, areaPQ1, hit, p0, p1, t, tX, tY, xval, xw, yval, yw, _ref, _ref2;\n xw = target.xw;\n yw = target.yw;\n if (source.x < target.x) {\n xval = target.x - xw;\n } else {\n xval = target.x + xw;\n }\n if (source.y < target.y) {\n yval = target.y - yw;\n } else {\n yval = target.y + yw;\n }\n if (direction.x === 0) {\n p0 = Point(target.x - xw, yval);\n p1 = Point(target.x + xw, yval);\n t = (yval - source.y) / direction.y;\n } else if (direction.y === 0) {\n p0 = Point(xval, target.y - yw);\n p1 = Point(xval, target.y + yw);\n t = (xval - source.x) / direction.x;\n } else {\n tX = (xval - source.x) / direction.x;\n tY = (yval - source.y) / direction.y;\n if ((tX < tY || ((-xw < (_ref = source.x - target.x) && _ref < xw))) && !((-yw < (_ref2 = source.y - target.y) && _ref2 < yw))) {\n p0 = Point(target.x - xw, yval);\n p1 = Point(target.x + xw, yval);\n t = tY;\n } else {\n p0 = Point(xval, target.y - yw);\n p1 = Point(xval, target.y + yw);\n t = tX;\n }\n }\n if (t > 0) {\n areaPQ0 = direction.cross(p0.subtract(source));\n areaPQ1 = direction.cross(p1.subtract(source));\n if (areaPQ0 * areaPQ1 < 0) {\n return hit = direction.scale(t).add(source);\n }\n }\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Collision\"] = Collision;\n})();;\nvar __slice = Array.prototype.slice;\n(function() {\n var Color, channelize, hslParser, hslToRgb, hsvToRgb, lookup, names, normalizeKey, parseHSL, parseHex, parseRGB, rgbParser;\n rgbParser = /^rgba?\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),?\\s*(\\d?\\.?\\d*)?\\)$/;\n hslParser = /^hsla?\\((\\d{1,3}),\\s*(\\d?\\.?\\d*),\\s*(\\d?\\.?\\d*),?\\s*(\\d?\\.?\\d*)?\\)$/;\n parseRGB = function(colorString) {\n var channel, channels, parsedColor;\n if (!(channels = rgbParser.exec(colorString))) {\n return;\n }\n parsedColor = (function() {\n var _i, _len, _ref, _results;\n _ref = channels.slice(1, 5);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })();\n if (isNaN(parsedColor[3])) {\n parsedColor[3] = 1;\n }\n return parsedColor;\n };\n parseHex = function(hexString) {\n var alpha, i, rgb;\n hexString = hexString.replace(/#/, '');\n switch (hexString.length) {\n case 3:\n case 4:\n if (hexString.length === 4) {\n alpha = (parseInt(hexString.substr(3, 1), 16) * 0x11) / 255;\n } else {\n alpha = 1;\n }\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(i, 1), 16) * 0x11);\n }\n return _results;\n })();\n rgb.push(alpha);\n return rgb;\n case 6:\n case 8:\n if (hexString.length === 8) {\n alpha = parseInt(hexString.substr(6, 2), 16) / 255;\n } else {\n alpha = 1;\n }\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(2 * i, 2), 16));\n }\n return _results;\n })();\n rgb.push(alpha);\n return rgb;\n }\n };\n parseHSL = function(colorString) {\n var channel, channels, parsedColor;\n if (!(channels = hslParser.exec(colorString))) {\n return;\n }\n parsedColor = (function() {\n var _i, _len, _ref, _results;\n _ref = channels.slice(1, 5);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })();\n if (isNaN(parsedColor[3])) {\n parsedColor[3] = 1;\n }\n return hslToRgb(parsedColor);\n };\n hsvToRgb = function(hsv) {\n var a, b, f, g, h, i, p, q, r, rgb, s, t, v;\n r = g = b = null;\n h = hsv[0], s = hsv[1], v = hsv[2], a = hsv[3];\n if (a == null) {\n a = 1;\n }\n i = (h / 60).floor();\n f = h / 60 - i;\n p = v * (1 - s);\n q = v * (1 - f * s);\n t = v * (1 - (1 - f) * s);\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n }\n rgb = [(r * 255).round(), (g * 255).round(), (b * 255).round()];\n return rgb.concat(a);\n };\n hslToRgb = function(hsl) {\n var a, b, channel, g, h, hueToRgb, l, p, q, r, rgbMap, s;\n h = hsl[0], s = hsl[1], l = hsl[2], a = hsl[3];\n h = h % 360;\n if (a == null) {\n a = 1;\n }\n r = g = b = null;\n hueToRgb = function(p, q, hue) {\n hue = hue.mod(360);\n if (hue < 60) {\n return p + (q - p) * (hue / 60);\n }\n if (hue < 180) {\n return q;\n }\n if (hue < 240) {\n return p + (q - p) * ((240 - hue) / 60);\n }\n return p;\n };\n if (s === 0) {\n r = g = b = l;\n } else {\n q = (l < 0.5 ? l * (1 + s) : l + s - l * s);\n p = 2 * l - q;\n r = hueToRgb(p, q, h + 120);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 120);\n }\n rgbMap = (function() {\n var _i, _len, _ref, _results;\n _ref = [r, g, b];\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push((channel * 255).round());\n }\n return _results;\n })();\n return rgbMap.concat(a);\n };\n normalizeKey = function(key) {\n return key.toString().toLowerCase().split(' ').join('');\n };\n channelize = function(color, alpha) {\n var channel, result;\n if (color.channels != null) {\n return color.channels();\n }\n if (Object.isArray(color)) {\n if (alpha != null) {\n alpha = parseFloat(alpha);\n } else if (color[3] != null) {\n alpha = parseFloat(color[3]);\n } else {\n alpha = 1;\n }\n result = ((function() {\n var _i, _len, _ref, _results;\n _ref = color.slice(0, 3);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })()).concat(alpha);\n } else {\n result = lookup[normalizeKey(color)] || parseHex(color) || parseRGB(color) || parseHSL(color);\n if (alpha != null) {\n result[3] = parseFloat(alpha);\n }\n }\n return result;\n };\n /**\n Create a new color. The constructor is very flexible. It accepts individual r, g, b, a values,\n arrays of r, g, b values, hex strings, rgb strings, hsl strings, other Color objects, \n and even the named colors from the xkcd survey: http://blog.xkcd.com/2010/05/03/color-survey-results/. \n If no arguments are given, defaults to transparent.\n\n <code class=\"run\"><pre>\n individualRgb = Color(23, 56, 49, 0.4)\n\n arrayRgb = Color([59, 100, 230])\n\n hex = Color('#ff0000')\n\n rgb = Color('rgb(0, 255, 0)')\n\n hsl = Color('hsl(180, 1, 0.5)')\n\n anotherColor = Color('blue')\n\n Color(anotherColor)\n # => a new color with the same r, g, b, and alpha values as `anotherColor`\n\n # You have access to all sorts of weird colors.\n # We give you all the named colors the browser recognizes\n # and the ones from this survey \n # http://blog.xkcd.com/2010/05/03/color-survey-results/\n namedBrown = Color('Fuzzy Wuzzy Brown')\n\n # Uutput color in Hex format \n namedBrown.toHex()\n # => '#c45655'\n\n # Default behavior\n transparent = Color()\n\n transparent.toString()\n # => 'rgba(0, 0, 0, 0)' \n\n # let's print out the colors on a canvas to see what they look like\n canvas.font('14px Helvetica')\n for color, index in ['individualRgb', 'arrayRgb', 'hex', 'rgb', 'hsl', 'anotherColor', 'namedBrown']\n canvas.centerText\n color: eval(color)\n text: color\n y: 20 * (index + 1) \n </pre></code>\n\n @name Color\n @param {Array|Number|String|Color} args... An Array, r, g, b values, \n a sequence of numbers defining r, g, b values, a hex or hsl string, another Color object, or a named color\n @constructor\n */\n Color = function() {\n var args, parsedColor;\n args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n parsedColor = (function() {\n switch (args.length) {\n case 0:\n return [0, 0, 0, 0];\n case 1:\n return channelize(args.first());\n case 2:\n return channelize(args.first(), args.last());\n default:\n return channelize(args);\n }\n })();\n if (!parsedColor) {\n throw \"\" + (args.join(',')) + \" is an unknown color\";\n }\n return {\n __proto__: Color.prototype,\n r: parsedColor[0].round(),\n g: parsedColor[1].round(),\n b: parsedColor[2].round(),\n a: parsedColor[3]\n };\n };\n Color.prototype = {\n /**\n Returns the rgba color channels in an array.\n\n <code><pre>\n transparent = Color()\n\n transparent.channels()\n # => [0, 0, 0, 0]\n\n red = Color(\"#FF0000\")\n\n red.channels()\n # => [255, 0, 0, 1]\n\n rgb = Color(200, 34, 2)\n\n rgb.channels()\n # => [200, 34, 2, 1]\n </pre></code>\n\n @name channels\n @methodOf Color#\n\n @returns {Array} Array of r, g, b, and alpha values of the color\n */\n channels: function() {\n return [this.r, this.g, this.b, this.a];\n },\n /**\n A copy of the calling color that is its complementary color on the color wheel.\n\n <code class=\"run\"><pre>\n red = Color(255, 0, 0)\n\n cyan = red.complement()\n\n # to see what they look like\n for color, index in [red, cyan]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name complement\n @methodOf Color#\n\n @returns {Color} new color that is a copy of the calling color with its hue shifted by 180 degrees on the color wheel\n */\n complement: function() {\n return this.copy().complement$();\n },\n /**\n Modifies the calling color to make it the complement of its previous value.\n\n <code><pre>\n red = Color(255, 0, 0)\n\n # modifies red in place to make it into cyan\n red.complement$()\n\n red.toString()\n # => 'rgba(0, 255, 255, 1)'\n </pre></code>\n\n @name complement$\n @methodOf Color#\n\n @returns {Color} the color hue shifted by 180 degrees on the color wheel. Modifies the existing color.\n */\n complement$: function() {\n return this.shiftHue$(180);\n },\n /**\n A copy of the calling color.\n\n <code><pre>\n color = Color(0, 100, 200)\n\n copy = color.copy()\n\n color == copy\n # => false\n\n color.equal(copy)\n # => true\n </pre></code>\n\n @name copy\n @methodOf Color#\n\n @returns {Color} A new color. A copy of the calling color\n */\n copy: function() {\n return Color(this.r, this.g, this.b, this.a);\n },\n /**\n Returns a copy of the calling color darkened by `amount` (Lightness of the color ranges from 0 to 1).\n\n <code class=\"run\"><pre>\n green = Color(0, 255, 0)\n\n darkGreen = green.darken(0.3)\n\n # to see what they look like\n for color, index in [green, darkGreen]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name darken\n @methodOf Color#\n @param {Number} amount Amount to darken color by (between 0 - 1)\n\n @returns {Color} A new color. The lightness value is reduced by `amount` from the original.\n */\n darken: function(amount) {\n return this.copy().darken$(amount);\n },\n /**\n Modifies the color so that it is darkened by `amount` (Lightness of the color ranges from 0 to 1).\n\n <code><pre>\n green = Color(0, 255, 0)\n\n # Modifies green to be darkGreen\n green.darken$(0.3)\n\n green.toString()\n # => 'rgba(0, 102, 0, 1)'\n </pre></code>\n\n @name darken$\n @methodOf Color#\n @param {Number} amount Amount to darken color by (between 0 - 1)\n\n @returns {Color} the color with the lightness value reduced by `amount`\n */\n darken$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[2] -= amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n /**\n A copy of the calling color with its saturation reduced by `amount`.\n\n <code class=\"run\"><pre>\n blue = Color(0, 0, 255)\n\n desaturatedBlue = blue.desaturate(0.4)\n\n # to see what they look like\n for color, index in [blue, desaturatedBlue]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name desaturate\n @methodOf Color#\n @param {Number} amount Amount to reduce color saturation by (between 0 and 1)\n\n @returns {Color} A copy of the color with the saturation value reduced by `amount`\n */\n desaturate: function(amount) {\n return this.copy().desaturate$(amount);\n },\n /**\n The modified color with its saturation reduced by `amount`.\n\n <code><pre>\n blue = Color(0, 0, 255)\n\n # modifies blue to be desaturatedBlue\n blue.desaturate$(0.4)\n\n blue.toString()\n # => 'rgba(38, 38, 217, 1)'\n </pre></code>\n\n @name desaturate$\n @methodOf Color#\n @param {Number} amount Amount to reduce color saturation by (between 0 and 1)\n\n @returns {Color} the color with the saturation value reduced by `amount`\n */\n desaturate$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[1] -= amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n /**\n Determine whether two colors are equal. Compares their r, g, b, and alpha values.\n\n <code><pre>\n hex = Color('#ffff00')\n rgb = Color(255, 255, 0)\n\n hex == rgb\n # => false\n\n hex.equal(rgb)\n # => true\n </pre></code>\n\n @name equal\n @methodOf Color#\n @param {Color} other the color to compare to the calling color\n\n @returns {Boolean} true if the r, g, b, a values of the colors agree, false otherwise\n */\n equal: function(other) {\n return other.r === this.r && other.g === this.g && other.b === this.b && other.a === this.a;\n },\n /**\n A copy of the calling color converted to grayscale.\n\n <code class=\"run\"><pre>\n yellow = Color(255, 255, 0)\n\n gray = yellow.grayscale()\n\n # to see what they look like\n for color, index in [yellow, gray]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code> \n\n @name grayscale\n @methodOf Color#\n\n @returns {Color} A copy of the calling color converted to grayscale.\n */\n grayscale: function() {\n return this.copy().grayscale$();\n },\n /**\n The calling color converted to grayscale.\n\n <code><pre>\n color = Color(255, 255, 0)\n\n # modifies color into gray\n color.grayscale$()\n\n color.toString()\n # => 'rgba(128, 128, 128, 1)'\n </pre></code> \n\n @name grayscale$\n @methodOf Color#\n\n @returns {Color} The calling color converted to grayscale.\n */\n grayscale$: function() {\n var g, hsl;\n hsl = this.toHsl();\n g = (hsl[2] * 255).round();\n this.r = this.g = this.b = g;\n return this;\n },\n /**\n A getter / setter for the hue value of the color. Passing no argument returns the \n current hue value. Passing a value will set the hue to that value and return the color.\n\n <code class=\"run\"><pre>\n magenta = Color(255, 0, 255)\n\n magenta.hue()\n # => 300\n\n # modifies the color to be yellow\n magenta.hue(60)\n\n # to see what it looks like\n canvas.drawRect\n color: magenta\n x: 50 \n y: 30 \n width: 80\n height: 80 \n </pre></code> \n\n @name hue\n @methodOf Color#\n @param {Number} [newVal] the new hue value\n\n @returns {Color|Number} returns the color object if you pass a new hue value and returns the hue otherwise \n */\n hue: function(newVal) {\n var hsl, _ref;\n hsl = this.toHsl();\n if (newVal != null) {\n hsl[0] = newVal;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n } else {\n return hsl[0];\n }\n },\n /**\n A getter / setter for the lightness value of the color. Passing no argument returns the \n current lightness value. Passing a value will set the lightness to that value and return the color.\n\n <code class=\"run\"><pre>\n magenta = Color(255, 0, 255)\n\n magenta.lightness()\n # => 0.9\n\n # modifies magenta in place to be lighter\n magenta.lightness(0.75)\n\n # to see what it looks like\n canvas.drawRect\n color: magenta\n x: 50 \n y: 30 \n width: 80\n height: 80 \n </pre></code> \n\n @name lightness\n @methodOf Color#\n @param {Number} [newVal] the new lightness value\n\n @returns {Color|Number} returns the color object if you pass a new lightness value and returns the lightness otherwise \n */\n lightness: function(newVal) {\n var hsl, _ref;\n hsl = this.toHsl();\n if (newVal != null) {\n hsl[2] = newVal;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n } else {\n return hsl[2];\n }\n },\n value: function(newVal) {\n var hsv, _ref;\n hsv = this.toHsv();\n if (newVal != null) {\n hsv[2] = newVal;\n _ref = hsvToRgb(hsv), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n } else {\n return hsv[2];\n }\n },\n /**\n A copy of the calling color with its hue shifted by `degrees`. This differs from the hue setter in that it adds to the existing hue value and will wrap around 0 and 360.\n\n <code class=\"run\"><pre>\n magenta = Color(255, 0, 255)\n\n magenta.hue()\n # => 300\n\n yellow = magenta.shiftHue(120)\n\n # since magenta's hue is 300 we have wrapped\n # around 360 to end up at 60\n yellow.hue()\n # => 60\n\n # to see what they look like\n for color, index in [magenta, yellow]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name shiftHue\n @methodOf Color#\n @param {Number} degrees number of degrees to shift the hue on the color wheel.\n\n @returns {Color} A copy of the color with its hue shifted by `degrees`\n */\n shiftHue: function(degrees) {\n return this.copy().shiftHue$(degrees);\n },\n /**\n The calling color with its hue shifted by `degrees`. This differs from the hue setter in that it adds to the existing hue value and will wrap around 0 and 360.\n\n <code><pre>\n magenta = Color(255, 0, 255)\n\n magenta.hue()\n # => 300\n\n magenta.shiftHue$(120)\n\n # since magenta's hue is 300 we have wrapped\n # around 360 to end up at 60. Also we have \n # modified magenta in place to become yellow\n magenta.hue()\n # => 60\n\n magenta.toString()\n # => 'rgba(255, 255, 0, 1)'\n </pre></code>\n\n @name shiftHue$\n @methodOf Color#\n @param {Number} degrees number of degrees to shift the hue on the color wheel.\n\n @returns {Color} The color with its hue shifted by `degrees`\n */\n shiftHue$: function(degrees) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[0] = (hsl[0] + degrees.round()).mod(360);\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n /**\n Returns a copy of the calling color lightened by `amount` (Lightness of the color ranges from 0 to 1).\n\n <code class=\"run\"><pre>\n green = Color(0, 255, 0)\n\n lightGreen = green.lighten(0.3)\n\n # to see what they look like\n for color, index in [green, lightGreen]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name lighten\n @methodOf Color#\n @param {Number} amount Amount to lighten color by (between 0 to 1)\n\n @returns {Color} A new color. The lightness value is increased by `amount` from the original.\n */\n lighten: function(amount) {\n return this.copy().lighten$(amount);\n },\n /**\n The calling color lightened by `amount` (Lightness of the color ranges from 0 to 1).\n\n <code><pre>\n green = Color(0, 255, 0)\n\n green.lighten$(0.2)\n\n # we have modified green in place\n # to become lightGreen\n green.toString()\n # => 'rgba(102, 255, 102, 1)'\n </pre></code>\n\n @name lighten$\n @methodOf Color#\n @param {Number} amount Amount to lighten color by (between 0 - 1)\n\n @returns {Color} The calling color with its lightness value increased by `amount`.\n */\n lighten$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[2] += amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n /**\n A copy of the calling color mixed with `other` using `amount` as the \n mixing ratio. If amount is not passed, then the colors are mixed evenly.\n\n <code class=\"run\"><pre>\n red = Color(255, 0, 0)\n yellow = Color(255, 255, 0)\n\n # With no amount argument the colors are mixed evenly\n orange = red.mixWith(yellow)\n\n # With an amount of 0.3 we are mixing the color 30% red and 70% yellow\n somethingCloseToOrange = red.mixWith(yellow, 0.3)\n\n # to see what they look like\n for color, index in [red, yellow, orange, somethingCloseToOrange]\n canvas.drawRect\n color: color\n x: 20 + (60 * (index % 2))\n y: 20 + (60 * (if index > 1 then 1 else 0))\n width: 60\n height: 60 \n </pre></code>\n\n @name mixWith\n @methodOf Color#\n @param {Color} other the other color to mix\n @param {Number} [amount] the mixing ratio of the calling color to `other`\n\n @returns {Color} A new color that is a mix of the calling color and `other`\n */\n mixWith: function(other, amount) {\n return this.copy().mixWith$(other, amount);\n },\n /**\n A copy of the calling color mixed with `other` using `amount` as the \n mixing ratio. If amount is not passed, then the colors are mixed evenly.\n\n <code><pre>\n red = Color(255, 0, 0)\n yellow = Color(255, 255, 0)\n anotherRed = Color(255, 0, 0)\n\n # With no amount argument the colors are mixed evenly\n red.mixWith$(yellow)\n\n # We have modified red in place to be orange \n red.toString()\n # => 'rgba(255, 128, 0, 1)' \n\n # With an amount of 0.3 we are mixing the color 30% red and 70% yellow\n anotherRed.mixWith$(yellow, 0.3)\n\n # We have modified `anotherRed` in place to be somethingCloseToOrange \n anotherRed.toString()\n # => rgba(255, 179, 0, 1)\n </pre></code>\n\n @name mixWith$\n @methodOf Color#\n @param {Color} other the other color to mix\n @param {Number} [amount] the mixing ratio of the calling color to `other`\n\n @returns {Color} The modified calling color after mixing it with `other`\n */\n mixWith$: function(other, amount) {\n var _ref, _ref2;\n amount || (amount = 0.5);\n _ref = [this.r, this.g, this.b, this.a].zip([other.r, other.g, other.b, other.a]).map(function(array) {\n return (array[0] * amount) + (array[1] * (1 - amount));\n }), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n _ref2 = [this.r, this.g, this.b].map(function(color) {\n return color.round();\n }), this.r = _ref2[0], this.g = _ref2[1], this.b = _ref2[2];\n return this;\n },\n /**\n A copy of the calling color with its saturation increased by `amount`.\n\n <code class=\"run\"><pre>\n color = Color(50, 50, 200)\n\n color.saturation()\n # => 0.6\n\n saturatedColor = color.saturate(0.2)\n\n saturatedColor.saturation()\n # => 0.8\n\n # to see what they look like\n for color, index in [color, saturatedColor]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name saturate\n @methodOf Color#\n @param {Number} amount the amount to increase saturation by\n\n @returns {Color} A copy of the calling color with its saturation increased by `amount`\n */\n saturate: function(amount) {\n return this.copy().saturate$(amount);\n },\n /**\n The calling color with its saturation increased by `amount`.\n\n <code><pre>\n color = Color(50, 50, 200)\n\n color.saturation()\n # => 0.6\n\n color.saturate$(0.2)\n\n # We have modified color in place and increased its saturation to 0.8\n color.saturation()\n # => 0.8\n\n color.toString()\n # => rgba(25, 25, 225, 1)\n </pre></code>\n\n @name saturate$\n @methodOf Color#\n @param {Number} amount the amount to increase saturation by\n\n @returns {Color} The calling color with its saturation increased by `amount`\n */\n saturate$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[1] += amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n /**\n A getter / setter for the saturation value of the color. Passing no argument returns the \n current saturation value. Passing a value will set the saturation to that value and return the color.\n\n <code class=\"run\"><pre>\n yellow = Color('hsl(60, 0.5, 0.5)')\n\n yellow.saturation()\n # => 0.5\n\n yellow.saturation(0.8)\n\n # to see what it looks like\n canvas.drawRect\n color: yellow\n x: 50 \n y: 30 \n width: 80\n height: 80 \n </pre></code>\n\n @name saturation\n @methodOf Color#\n @param {Number} [newVal] the new saturation value\n\n @returns {Color|Number} returns the color object if you pass a new saturation value and returns the saturation otherwise \n */\n saturation: function(newVal, mode) {\n var hsl, hsv, _ref, _ref2;\n if (mode === 'hsv') {\n hsv = this.toHsv();\n if (newVal != null) {\n hsv[1] = newVal;\n _ref = hsvToRgb(hsv), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n } else {\n return hsv[1];\n }\n } else {\n hsl = this.toHsl();\n if (newVal != null) {\n hsl[1] = newVal;\n _ref2 = hslToRgb(hsl), this.r = _ref2[0], this.g = _ref2[1], this.b = _ref2[2], this.a = _ref2[3];\n return this;\n } else {\n return hsl[1];\n }\n }\n },\n /**\n returns the Hex representation of the color. Exclude the leading `#` by passing false. \n\n <code><pre>\n color = Color('hsl(60, 1, 0.5)')\n\n # passing nothing will leave the `#` intact\n color.toHex()\n # => '#ffff00'\n\n # passing false will remove the `#`\n color.toHex(false)\n # => 'ffff00'\n </pre></code>\n\n @name toHex\n @methodOf Color#\n @param {Boolean} [leadingHash] if passed as false excludes the leading `#` from the string\n\n @returns {String} returns the Hex representation of the color \n */\n toHex: function(leadingHash) {\n var hexFromNumber, padString;\n padString = function(hexString) {\n var pad;\n if (hexString.length === 1) {\n pad = \"0\";\n } else {\n pad = \"\";\n }\n return pad + hexString;\n };\n hexFromNumber = function(number) {\n return padString(number.toString(16));\n };\n if (leadingHash === false) {\n return \"\" + (hexFromNumber(this.r)) + (hexFromNumber(this.g)) + (hexFromNumber(this.b));\n } else {\n return \"#\" + (hexFromNumber(this.r)) + (hexFromNumber(this.g)) + (hexFromNumber(this.b));\n }\n },\n /**\n returns an array of the hue, saturation, lightness, and alpha values of the color. \n\n <code><pre>\n magenta = Color(255, 0, 255)\n\n magenta.toHsl()\n # => [300, 1, 0.5, 1]\n </pre></code> \n\n @name toHsl\n @methodOf Color#\n\n @returns {Array} An array of the hue, saturation, lightness, and alpha values of the color. \n */\n toHsl: function() {\n var b, channel, chroma, g, hue, lightness, max, min, r, saturation, _ref, _ref2;\n _ref = (function() {\n var _i, _len, _ref, _results;\n _ref = [this.r, this.g, this.b];\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(channel / 255);\n }\n return _results;\n }).call(this), r = _ref[0], g = _ref[1], b = _ref[2];\n _ref2 = [r, g, b].extremes(), min = _ref2.min, max = _ref2.max;\n hue = saturation = lightness = (max + min) / 2;\n chroma = max - min;\n if (chroma.abs() < 0.00001) {\n hue = saturation = 0;\n } else {\n saturation = lightness > 0.5 ? chroma / (1 - lightness) : chroma / lightness;\n saturation /= 2;\n switch (max) {\n case r:\n hue = ((g - b) / chroma) + 0;\n break;\n case g:\n hue = ((b - r) / chroma) + 2;\n break;\n case b:\n hue = ((r - g) / chroma) + 4;\n }\n hue = (hue * 60).mod(360);\n }\n return [hue, saturation, lightness, this.a];\n },\n toHsv: function() {\n var b, d, g, h, max, min, r, s, v, _ref;\n r = this.r / 255;\n g = this.g / 255;\n b = this.b / 255;\n _ref = [r, g, b].extremes(), min = _ref.min, max = _ref.max;\n h = s = v = max;\n d = max - min;\n s = (max === 0 ? 0 : d / max);\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n }\n h *= 60;\n }\n return [h, s, v];\n },\n /**\n returns string rgba representation of the color. \n\n <code><pre>\n red = Color('#ff0000')\n\n red.toString()\n # => 'rgba(255, 0, 0, 1)'\n </pre></code>\n\n @name toString\n @methodOf Color#\n\n @returns {String} The rgba string representation of the color \n */\n toString: function() {\n return \"rgba(\" + this.r + \", \" + this.g + \", \" + this.b + \", \" + this.a + \")\";\n },\n /**\n A copy of the calling color with its alpha reduced by `amount`.\n\n <code class=\"run\"><pre>\n color = Color(0, 0, 0, 1)\n\n color.a\n # => 1\n\n transparentColor = color.transparentize(0.5)\n\n transparentColor.a\n # => 0.5\n\n # to see what they look like\n for color, index in [color, transparentColor]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name transparentize\n @methodOf Color#\n\n @returns {Color} A copy of the calling color with its alpha reduced by `amount` \n */\n transparentize: function(amount) {\n return this.copy().transparentize$(amount);\n },\n /**\n The calling color with its alpha reduced by `amount`.\n\n <code><pre>\n color = Color(0, 0, 0, 1)\n\n color.a\n # => 1\n\n # We modify color in place\n color.transparentize$(0.5)\n\n color.a\n # => 0.5\n </pre></code>\n\n @name transparentize$\n @methodOf Color#\n\n @returns {Color} The calling color with its alpha reduced by `amount` \n */\n transparentize$: function(amount) {\n this.a = (this.a - amount).clamp(0, 1);\n return this;\n },\n /**\n A copy of the calling color with its alpha increased by `amount`.\n\n <code class=\"run\"><pre>\n color = Color(0, 0, 0, 0.25)\n\n color.a\n # => 0.25\n\n opaqueColor = color.opacify(0.5)\n\n opaqueColor.a\n # => 0.75\n\n # to see what they look like\n for color, index in [color, opaqueColor]\n canvas.drawRect\n color: color\n x: 20 + (60 * index)\n y: 20 + (60 * index)\n width: 60\n height: 60 \n </pre></code>\n\n @name opacify\n @methodOf Color#\n\n @returns {Color} A copy of the calling color with its alpha increased by `amount` \n */\n opacify: function(amount) {\n return this.copy().opacify$(amount);\n },\n /**\n The calling color with its alpha increased by `amount`.\n\n <code><pre>\n color = Color(0, 0, 0, 0)\n\n color.a\n # => 0\n\n # We modify color in place\n color.opacify$(0.25)\n\n color.a\n # => 0.25\n </pre></code>\n\n @name opacify$\n @methodOf Color#\n\n @returns {Color} The calling color with its alpha increased by `amount` \n */\n opacify$: function(amount) {\n this.a = (this.a + amount).clamp(0, 1);\n return this;\n }\n };\n lookup = {};\n names = [[\"000000\", \"Black\"], [\"000080\", \"Navy Blue\"], [\"0000C8\", \"Dark Blue\"], [\"0000FF\", \"Blue\"], [\"000741\", \"Stratos\"], [\"001B1C\", \"Swamp\"], [\"002387\", \"Resolution Blue\"], [\"002900\", \"Deep Fir\"], [\"002E20\", \"Burnham\"], [\"002FA7\", \"International Klein Blue\"], [\"003153\", \"Prussian Blue\"], [\"003366\", \"Midnight Blue\"], [\"003399\", \"Smalt\"], [\"003532\", \"Deep Teal\"], [\"003E40\", \"Cyprus\"], [\"004620\", \"Kaitoke Green\"], [\"0047AB\", \"Cobalt\"], [\"004816\", \"Crusoe\"], [\"004950\", \"Sherpa Blue\"], [\"0056A7\", \"Endeavour\"], [\"00581A\", \"Camarone\"], [\"0066CC\", \"Science Blue\"], [\"0066FF\", \"Blue Ribbon\"], [\"00755E\", \"Tropical Rain Forest\"], [\"0076A3\", \"Allports\"], [\"007BA7\", \"Deep Cerulean\"], [\"007EC7\", \"Lochmara\"], [\"007FFF\", \"Azure Radiance\"], [\"008080\", \"Teal\"], [\"0095B6\", \"Bondi Blue\"], [\"009DC4\", \"Pacific Blue\"], [\"00A693\", \"Persian Green\"], [\"00A86B\", \"Jade\"], [\"00CC99\", \"Caribbean Green\"], [\"00CCCC\", \"Robin's Egg Blue\"], [\"00FF00\", \"Green\"], [\"00FF7F\", \"Spring Green\"], [\"00FFFF\", \"Cyan / Aqua\"], [\"010D1A\", \"Blue Charcoal\"], [\"011635\", \"Midnight\"], [\"011D13\", \"Holly\"], [\"012731\", \"Daintree\"], [\"01361C\", \"Cardin Green\"], [\"01371A\", \"County Green\"], [\"013E62\", \"Astronaut Blue\"], [\"013F6A\", \"Regal Blue\"], [\"014B43\", \"Aqua Deep\"], [\"015E85\", \"Orient\"], [\"016162\", \"Blue Stone\"], [\"016D39\", \"Fun Green\"], [\"01796F\", \"Pine Green\"], [\"017987\", \"Blue Lagoon\"], [\"01826B\", \"Deep Sea\"], [\"01A368\", \"Green Haze\"], [\"022D15\", \"English Holly\"], [\"02402C\", \"Sherwood Green\"], [\"02478E\", \"Congress Blue\"], [\"024E46\", \"Evening Sea\"], [\"026395\", \"Bahama Blue\"], [\"02866F\", \"Observatory\"], [\"02A4D3\", \"Cerulean\"], [\"03163C\", \"Tangaroa\"], [\"032B52\", \"Green Vogue\"], [\"036A6E\", \"Mosque\"], [\"041004\", \"Midnight Moss\"], [\"041322\", \"Black Pearl\"], [\"042E4C\", \"Blue Whale\"], [\"044022\", \"Zuccini\"], [\"044259\", \"Teal Blue\"], [\"051040\", \"Deep Cove\"], [\"051657\", \"Gulf Blue\"], [\"055989\", \"Venice Blue\"], [\"056F57\", \"Watercourse\"], [\"062A78\", \"Catalina Blue\"], [\"063537\", \"Tiber\"], [\"069B81\", \"Gossamer\"], [\"06A189\", \"Niagara\"], [\"073A50\", \"Tarawera\"], [\"080110\", \"Jaguar\"], [\"081910\", \"Black Bean\"], [\"082567\", \"Deep Sapphire\"], [\"088370\", \"Elf Green\"], [\"08E8DE\", \"Bright Turquoise\"], [\"092256\", \"Downriver\"], [\"09230F\", \"Palm Green\"], [\"09255D\", \"Madison\"], [\"093624\", \"Bottle Green\"], [\"095859\", \"Deep Sea Green\"], [\"097F4B\", \"Salem\"], [\"0A001C\", \"Black Russian\"], [\"0A480D\", \"Dark Fern\"], [\"0A6906\", \"Japanese Laurel\"], [\"0A6F75\", \"Atoll\"], [\"0B0B0B\", \"Cod Gray\"], [\"0B0F08\", \"Marshland\"], [\"0B1107\", \"Gordons Green\"], [\"0B1304\", \"Black Forest\"], [\"0B6207\", \"San Felix\"], [\"0BDA51\", \"Malachite\"], [\"0C0B1D\", \"Ebony\"], [\"0C0D0F\", \"Woodsmoke\"], [\"0C1911\", \"Racing Green\"], [\"0C7A79\", \"Surfie Green\"], [\"0C8990\", \"Blue Chill\"], [\"0D0332\", \"Black Rock\"], [\"0D1117\", \"Bunker\"], [\"0D1C19\", \"Aztec\"], [\"0D2E1C\", \"Bush\"], [\"0E0E18\", \"Cinder\"], [\"0E2A30\", \"Firefly\"], [\"0F2D9E\", \"Torea Bay\"], [\"10121D\", \"Vulcan\"], [\"101405\", \"Green Waterloo\"], [\"105852\", \"Eden\"], [\"110C6C\", \"Arapawa\"], [\"120A8F\", \"Ultramarine\"], [\"123447\", \"Elephant\"], [\"126B40\", \"Jewel\"], [\"130000\", \"Diesel\"], [\"130A06\", \"Asphalt\"], [\"13264D\", \"Blue Zodiac\"], [\"134F19\", \"Parsley\"], [\"140600\", \"Nero\"], [\"1450AA\", \"Tory Blue\"], [\"151F4C\", \"Bunting\"], [\"1560BD\", \"Denim\"], [\"15736B\", \"Genoa\"], [\"161928\", \"Mirage\"], [\"161D10\", \"Hunter Green\"], [\"162A40\", \"Big Stone\"], [\"163222\", \"Celtic\"], [\"16322C\", \"Timber Green\"], [\"163531\", \"Gable Green\"], [\"171F04\", \"Pine Tree\"], [\"175579\", \"Chathams Blue\"], [\"182D09\", \"Deep Forest Green\"], [\"18587A\", \"Blumine\"], [\"19330E\", \"Palm Leaf\"], [\"193751\", \"Nile Blue\"], [\"1959A8\", \"Fun Blue\"], [\"1A1A68\", \"Lucky Point\"], [\"1AB385\", \"Mountain Meadow\"], [\"1B0245\", \"Tolopea\"], [\"1B1035\", \"Haiti\"], [\"1B127B\", \"Deep Koamaru\"], [\"1B1404\", \"Acadia\"], [\"1B2F11\", \"Seaweed\"], [\"1B3162\", \"Biscay\"], [\"1B659D\", \"Matisse\"], [\"1C1208\", \"Crowshead\"], [\"1C1E13\", \"Rangoon Green\"], [\"1C39BB\", \"Persian Blue\"], [\"1C402E\", \"Everglade\"], [\"1C7C7D\", \"Elm\"], [\"1D6142\", \"Green Pea\"], [\"1E0F04\", \"Creole\"], [\"1E1609\", \"Karaka\"], [\"1E1708\", \"El Paso\"], [\"1E385B\", \"Cello\"], [\"1E433C\", \"Te Papa Green\"], [\"1E90FF\", \"Dodger Blue\"], [\"1E9AB0\", \"Eastern Blue\"], [\"1F120F\", \"Night Rider\"], [\"1FC2C2\", \"Java\"], [\"20208D\", \"Jacksons Purple\"], [\"202E54\", \"Cloud Burst\"], [\"204852\", \"Blue Dianne\"], [\"211A0E\", \"Eternity\"], [\"220878\", \"Deep Blue\"], [\"228B22\", \"Forest Green\"], [\"233418\", \"Mallard\"], [\"240A40\", \"Violet\"], [\"240C02\", \"Kilamanjaro\"], [\"242A1D\", \"Log Cabin\"], [\"242E16\", \"Black Olive\"], [\"24500F\", \"Green House\"], [\"251607\", \"Graphite\"], [\"251706\", \"Cannon Black\"], [\"251F4F\", \"Port Gore\"], [\"25272C\", \"Shark\"], [\"25311C\", \"Green Kelp\"], [\"2596D1\", \"Curious Blue\"], [\"260368\", \"Paua\"], [\"26056A\", \"Paris M\"], [\"261105\", \"Wood Bark\"], [\"261414\", \"Gondola\"], [\"262335\", \"Steel Gray\"], [\"26283B\", \"Ebony Clay\"], [\"273A81\", \"Bay of Many\"], [\"27504B\", \"Plantation\"], [\"278A5B\", \"Eucalyptus\"], [\"281E15\", \"Oil\"], [\"283A77\", \"Astronaut\"], [\"286ACD\", \"Mariner\"], [\"290C5E\", \"Violent Violet\"], [\"292130\", \"Bastille\"], [\"292319\", \"Zeus\"], [\"292937\", \"Charade\"], [\"297B9A\", \"Jelly Bean\"], [\"29AB87\", \"Jungle Green\"], [\"2A0359\", \"Cherry Pie\"], [\"2A140E\", \"Coffee Bean\"], [\"2A2630\", \"Baltic Sea\"], [\"2A380B\", \"Turtle Green\"], [\"2A52BE\", \"Cerulean Blue\"], [\"2B0202\", \"Sepia Black\"], [\"2B194F\", \"Valhalla\"], [\"2B3228\", \"Heavy Metal\"], [\"2C0E8C\", \"Blue Gem\"], [\"2C1632\", \"Revolver\"], [\"2C2133\", \"Bleached Cedar\"], [\"2C8C84\", \"Lochinvar\"], [\"2D2510\", \"Mikado\"], [\"2D383A\", \"Outer Space\"], [\"2D569B\", \"St Tropaz\"], [\"2E0329\", \"Jacaranda\"], [\"2E1905\", \"Jacko Bean\"], [\"2E3222\", \"Rangitoto\"], [\"2E3F62\", \"Rhino\"], [\"2E8B57\", \"Sea Green\"], [\"2EBFD4\", \"Scooter\"], [\"2F270E\", \"Onion\"], [\"2F3CB3\", \"Governor Bay\"], [\"2F519E\", \"Sapphire\"], [\"2F5A57\", \"Spectra\"], [\"2F6168\", \"Casal\"], [\"300529\", \"Melanzane\"], [\"301F1E\", \"Cocoa Brown\"], [\"302A0F\", \"Woodrush\"], [\"304B6A\", \"San Juan\"], [\"30D5C8\", \"Turquoise\"], [\"311C17\", \"Eclipse\"], [\"314459\", \"Pickled Bluewood\"], [\"315BA1\", \"Azure\"], [\"31728D\", \"Calypso\"], [\"317D82\", \"Paradiso\"], [\"32127A\", \"Persian Indigo\"], [\"32293A\", \"Blackcurrant\"], [\"323232\", \"Mine Shaft\"], [\"325D52\", \"Stromboli\"], [\"327C14\", \"Bilbao\"], [\"327DA0\", \"Astral\"], [\"33036B\", \"Christalle\"], [\"33292F\", \"Thunder\"], [\"33CC99\", \"Shamrock\"], [\"341515\", \"Tamarind\"], [\"350036\", \"Mardi Gras\"], [\"350E42\", \"Valentino\"], [\"350E57\", \"Jagger\"], [\"353542\", \"Tuna\"], [\"354E8C\", \"Chambray\"], [\"363050\", \"Martinique\"], [\"363534\", \"Tuatara\"], [\"363C0D\", \"Waiouru\"], [\"36747D\", \"Ming\"], [\"368716\", \"La Palma\"], [\"370202\", \"Chocolate\"], [\"371D09\", \"Clinker\"], [\"37290E\", \"Brown Tumbleweed\"], [\"373021\", \"Birch\"], [\"377475\", \"Oracle\"], [\"380474\", \"Blue Diamond\"], [\"381A51\", \"Grape\"], [\"383533\", \"Dune\"], [\"384555\", \"Oxford Blue\"], [\"384910\", \"Clover\"], [\"394851\", \"Limed Spruce\"], [\"396413\", \"Dell\"], [\"3A0020\", \"Toledo\"], [\"3A2010\", \"Sambuca\"], [\"3A2A6A\", \"Jacarta\"], [\"3A686C\", \"William\"], [\"3A6A47\", \"Killarney\"], [\"3AB09E\", \"Keppel\"], [\"3B000B\", \"Temptress\"], [\"3B0910\", \"Aubergine\"], [\"3B1F1F\", \"Jon\"], [\"3B2820\", \"Treehouse\"], [\"3B7A57\", \"Amazon\"], [\"3B91B4\", \"Boston Blue\"], [\"3C0878\", \"Windsor\"], [\"3C1206\", \"Rebel\"], [\"3C1F76\", \"Meteorite\"], [\"3C2005\", \"Dark Ebony\"], [\"3C3910\", \"Camouflage\"], [\"3C4151\", \"Bright Gray\"], [\"3C4443\", \"Cape Cod\"], [\"3C493A\", \"Lunar Green\"], [\"3D0C02\", \"Bean \"], [\"3D2B1F\", \"Bistre\"], [\"3D7D52\", \"Goblin\"], [\"3E0480\", \"Kingfisher Daisy\"], [\"3E1C14\", \"Cedar\"], [\"3E2B23\", \"English Walnut\"], [\"3E2C1C\", \"Black Marlin\"], [\"3E3A44\", \"Ship Gray\"], [\"3EABBF\", \"Pelorous\"], [\"3F2109\", \"Bronze\"], [\"3F2500\", \"Cola\"], [\"3F3002\", \"Madras\"], [\"3F307F\", \"Minsk\"], [\"3F4C3A\", \"Cabbage Pont\"], [\"3F583B\", \"Tom Thumb\"], [\"3F5D53\", \"Mineral Green\"], [\"3FC1AA\", \"Puerto Rico\"], [\"3FFF00\", \"Harlequin\"], [\"401801\", \"Brown Pod\"], [\"40291D\", \"Cork\"], [\"403B38\", \"Masala\"], [\"403D19\", \"Thatch Green\"], [\"405169\", \"Fiord\"], [\"40826D\", \"Viridian\"], [\"40A860\", \"Chateau Green\"], [\"410056\", \"Ripe Plum\"], [\"411F10\", \"Paco\"], [\"412010\", \"Deep Oak\"], [\"413C37\", \"Merlin\"], [\"414257\", \"Gun Powder\"], [\"414C7D\", \"East Bay\"], [\"4169E1\", \"Royal Blue\"], [\"41AA78\", \"Ocean Green\"], [\"420303\", \"Burnt Maroon\"], [\"423921\", \"Lisbon Brown\"], [\"427977\", \"Faded Jade\"], [\"431560\", \"Scarlet Gum\"], [\"433120\", \"Iroko\"], [\"433E37\", \"Armadillo\"], [\"434C59\", \"River Bed\"], [\"436A0D\", \"Green Leaf\"], [\"44012D\", \"Barossa\"], [\"441D00\", \"Morocco Brown\"], [\"444954\", \"Mako\"], [\"454936\", \"Kelp\"], [\"456CAC\", \"San Marino\"], [\"45B1E8\", \"Picton Blue\"], [\"460B41\", \"Loulou\"], [\"462425\", \"Crater Brown\"], [\"465945\", \"Gray Asparagus\"], [\"4682B4\", \"Steel Blue\"], [\"480404\", \"Rustic Red\"], [\"480607\", \"Bulgarian Rose\"], [\"480656\", \"Clairvoyant\"], [\"481C1C\", \"Cocoa Bean\"], [\"483131\", \"Woody Brown\"], [\"483C32\", \"Taupe\"], [\"49170C\", \"Van Cleef\"], [\"492615\", \"Brown Derby\"], [\"49371B\", \"Metallic Bronze\"], [\"495400\", \"Verdun Green\"], [\"496679\", \"Blue Bayoux\"], [\"497183\", \"Bismark\"], [\"4A2A04\", \"Bracken\"], [\"4A3004\", \"Deep Bronze\"], [\"4A3C30\", \"Mondo\"], [\"4A4244\", \"Tundora\"], [\"4A444B\", \"Gravel\"], [\"4A4E5A\", \"Trout\"], [\"4B0082\", \"Pigment Indigo\"], [\"4B5D52\", \"Nandor\"], [\"4C3024\", \"Saddle\"], [\"4C4F56\", \"Abbey\"], [\"4D0135\", \"Blackberry\"], [\"4D0A18\", \"Cab Sav\"], [\"4D1E01\", \"Indian Tan\"], [\"4D282D\", \"Cowboy\"], [\"4D282E\", \"Livid Brown\"], [\"4D3833\", \"Rock\"], [\"4D3D14\", \"Punga\"], [\"4D400F\", \"Bronzetone\"], [\"4D5328\", \"Woodland\"], [\"4E0606\", \"Mahogany\"], [\"4E2A5A\", \"Bossanova\"], [\"4E3B41\", \"Matterhorn\"], [\"4E420C\", \"Bronze Olive\"], [\"4E4562\", \"Mulled Wine\"], [\"4E6649\", \"Axolotl\"], [\"4E7F9E\", \"Wedgewood\"], [\"4EABD1\", \"Shakespeare\"], [\"4F1C70\", \"Honey Flower\"], [\"4F2398\", \"Daisy Bush\"], [\"4F69C6\", \"Indigo\"], [\"4F7942\", \"Fern Green\"], [\"4F9D5D\", \"Fruit Salad\"], [\"4FA83D\", \"Apple\"], [\"504351\", \"Mortar\"], [\"507096\", \"Kashmir Blue\"], [\"507672\", \"Cutty Sark\"], [\"50C878\", \"Emerald\"], [\"514649\", \"Emperor\"], [\"516E3D\", \"Chalet Green\"], [\"517C66\", \"Como\"], [\"51808F\", \"Smalt Blue\"], [\"52001F\", \"Castro\"], [\"520C17\", \"Maroon Oak\"], [\"523C94\", \"Gigas\"], [\"533455\", \"Voodoo\"], [\"534491\", \"Victoria\"], [\"53824B\", \"Hippie Green\"], [\"541012\", \"Heath\"], [\"544333\", \"Judge Gray\"], [\"54534D\", \"Fuscous Gray\"], [\"549019\", \"Vida Loca\"], [\"55280C\", \"Cioccolato\"], [\"555B10\", \"Saratoga\"], [\"556D56\", \"Finlandia\"], [\"5590D9\", \"Havelock Blue\"], [\"56B4BE\", \"Fountain Blue\"], [\"578363\", \"Spring Leaves\"], [\"583401\", \"Saddle Brown\"], [\"585562\", \"Scarpa Flow\"], [\"587156\", \"Cactus\"], [\"589AAF\", \"Hippie Blue\"], [\"591D35\", \"Wine Berry\"], [\"592804\", \"Brown Bramble\"], [\"593737\", \"Congo Brown\"], [\"594433\", \"Millbrook\"], [\"5A6E9C\", \"Waikawa Gray\"], [\"5A87A0\", \"Horizon\"], [\"5B3013\", \"Jambalaya\"], [\"5C0120\", \"Bordeaux\"], [\"5C0536\", \"Mulberry Wood\"], [\"5C2E01\", \"Carnaby Tan\"], [\"5C5D75\", \"Comet\"], [\"5D1E0F\", \"Redwood\"], [\"5D4C51\", \"Don Juan\"], [\"5D5C58\", \"Chicago\"], [\"5D5E37\", \"Verdigris\"], [\"5D7747\", \"Dingley\"], [\"5DA19F\", \"Breaker Bay\"], [\"5E483E\", \"Kabul\"], [\"5E5D3B\", \"Hemlock\"], [\"5F3D26\", \"Irish Coffee\"], [\"5F5F6E\", \"Mid Gray\"], [\"5F6672\", \"Shuttle Gray\"], [\"5FA777\", \"Aqua Forest\"], [\"5FB3AC\", \"Tradewind\"], [\"604913\", \"Horses Neck\"], [\"605B73\", \"Smoky\"], [\"606E68\", \"Corduroy\"], [\"6093D1\", \"Danube\"], [\"612718\", \"Espresso\"], [\"614051\", \"Eggplant\"], [\"615D30\", \"Costa Del Sol\"], [\"61845F\", \"Glade Green\"], [\"622F30\", \"Buccaneer\"], [\"623F2D\", \"Quincy\"], [\"624E9A\", \"Butterfly Bush\"], [\"625119\", \"West Coast\"], [\"626649\", \"Finch\"], [\"639A8F\", \"Patina\"], [\"63B76C\", \"Fern\"], [\"6456B7\", \"Blue Violet\"], [\"646077\", \"Dolphin\"], [\"646463\", \"Storm Dust\"], [\"646A54\", \"Siam\"], [\"646E75\", \"Nevada\"], [\"6495ED\", \"Cornflower Blue\"], [\"64CCDB\", \"Viking\"], [\"65000B\", \"Rosewood\"], [\"651A14\", \"Cherrywood\"], [\"652DC1\", \"Purple Heart\"], [\"657220\", \"Fern Frond\"], [\"65745D\", \"Willow Grove\"], [\"65869F\", \"Hoki\"], [\"660045\", \"Pompadour\"], [\"660099\", \"Purple\"], [\"66023C\", \"Tyrian Purple\"], [\"661010\", \"Dark Tan\"], [\"66B58F\", \"Silver Tree\"], [\"66FF00\", \"Bright Green\"], [\"66FF66\", \"Screamin' Green\"], [\"67032D\", \"Black Rose\"], [\"675FA6\", \"Scampi\"], [\"676662\", \"Ironside Gray\"], [\"678975\", \"Viridian Green\"], [\"67A712\", \"Christi\"], [\"683600\", \"Nutmeg Wood Finish\"], [\"685558\", \"Zambezi\"], [\"685E6E\", \"Salt Box\"], [\"692545\", \"Tawny Port\"], [\"692D54\", \"Finn\"], [\"695F62\", \"Scorpion\"], [\"697E9A\", \"Lynch\"], [\"6A442E\", \"Spice\"], [\"6A5D1B\", \"Himalaya\"], [\"6A6051\", \"Soya Bean\"], [\"6B2A14\", \"Hairy Heath\"], [\"6B3FA0\", \"Royal Purple\"], [\"6B4E31\", \"Shingle Fawn\"], [\"6B5755\", \"Dorado\"], [\"6B8BA2\", \"Bermuda Gray\"], [\"6B8E23\", \"Olive Drab\"], [\"6C3082\", \"Eminence\"], [\"6CDAE7\", \"Turquoise Blue\"], [\"6D0101\", \"Lonestar\"], [\"6D5E54\", \"Pine Cone\"], [\"6D6C6C\", \"Dove Gray\"], [\"6D9292\", \"Juniper\"], [\"6D92A1\", \"Gothic\"], [\"6E0902\", \"Red Oxide\"], [\"6E1D14\", \"Moccaccino\"], [\"6E4826\", \"Pickled Bean\"], [\"6E4B26\", \"Dallas\"], [\"6E6D57\", \"Kokoda\"], [\"6E7783\", \"Pale Sky\"], [\"6F440C\", \"Cafe Royale\"], [\"6F6A61\", \"Flint\"], [\"6F8E63\", \"Highland\"], [\"6F9D02\", \"Limeade\"], [\"6FD0C5\", \"Downy\"], [\"701C1C\", \"Persian Plum\"], [\"704214\", \"Sepia\"], [\"704A07\", \"Antique Bronze\"], [\"704F50\", \"Ferra\"], [\"706555\", \"Coffee\"], [\"708090\", \"Slate Gray\"], [\"711A00\", \"Cedar Wood Finish\"], [\"71291D\", \"Metallic Copper\"], [\"714693\", \"Affair\"], [\"714AB2\", \"Studio\"], [\"715D47\", \"Tobacco Brown\"], [\"716338\", \"Yellow Metal\"], [\"716B56\", \"Peat\"], [\"716E10\", \"Olivetone\"], [\"717486\", \"Storm Gray\"], [\"718080\", \"Sirocco\"], [\"71D9E2\", \"Aquamarine Blue\"], [\"72010F\", \"Venetian Red\"], [\"724A2F\", \"Old Copper\"], [\"726D4E\", \"Go Ben\"], [\"727B89\", \"Raven\"], [\"731E8F\", \"Seance\"], [\"734A12\", \"Raw Umber\"], [\"736C9F\", \"Kimberly\"], [\"736D58\", \"Crocodile\"], [\"737829\", \"Crete\"], [\"738678\", \"Xanadu\"], [\"74640D\", \"Spicy Mustard\"], [\"747D63\", \"Limed Ash\"], [\"747D83\", \"Rolling Stone\"], [\"748881\", \"Blue Smoke\"], [\"749378\", \"Laurel\"], [\"74C365\", \"Mantis\"], [\"755A57\", \"Russett\"], [\"7563A8\", \"Deluge\"], [\"76395D\", \"Cosmic\"], [\"7666C6\", \"Blue Marguerite\"], [\"76BD17\", \"Lima\"], [\"76D7EA\", \"Sky Blue\"], [\"770F05\", \"Dark Burgundy\"], [\"771F1F\", \"Crown of Thorns\"], [\"773F1A\", \"Walnut\"], [\"776F61\", \"Pablo\"], [\"778120\", \"Pacifika\"], [\"779E86\", \"Oxley\"], [\"77DD77\", \"Pastel Green\"], [\"780109\", \"Japanese Maple\"], [\"782D19\", \"Mocha\"], [\"782F16\", \"Peanut\"], [\"78866B\", \"Camouflage Green\"], [\"788A25\", \"Wasabi\"], [\"788BBA\", \"Ship Cove\"], [\"78A39C\", \"Sea Nymph\"], [\"795D4C\", \"Roman Coffee\"], [\"796878\", \"Old Lavender\"], [\"796989\", \"Rum\"], [\"796A78\", \"Fedora\"], [\"796D62\", \"Sandstone\"], [\"79DEEC\", \"Spray\"], [\"7A013A\", \"Siren\"], [\"7A58C1\", \"Fuchsia Blue\"], [\"7A7A7A\", \"Boulder\"], [\"7A89B8\", \"Wild Blue Yonder\"], [\"7AC488\", \"De York\"], [\"7B3801\", \"Red Beech\"], [\"7B3F00\", \"Cinnamon\"], [\"7B6608\", \"Yukon Gold\"], [\"7B7874\", \"Tapa\"], [\"7B7C94\", \"Waterloo \"], [\"7B8265\", \"Flax Smoke\"], [\"7B9F80\", \"Amulet\"], [\"7BA05B\", \"Asparagus\"], [\"7C1C05\", \"Kenyan Copper\"], [\"7C7631\", \"Pesto\"], [\"7C778A\", \"Topaz\"], [\"7C7B7A\", \"Concord\"], [\"7C7B82\", \"Jumbo\"], [\"7C881A\", \"Trendy Green\"], [\"7CA1A6\", \"Gumbo\"], [\"7CB0A1\", \"Acapulco\"], [\"7CB7BB\", \"Neptune\"], [\"7D2C14\", \"Pueblo\"], [\"7DA98D\", \"Bay Leaf\"], [\"7DC8F7\", \"Malibu\"], [\"7DD8C6\", \"Bermuda\"], [\"7E3A15\", \"Copper Canyon\"], [\"7F1734\", \"Claret\"], [\"7F3A02\", \"Peru Tan\"], [\"7F626D\", \"Falcon\"], [\"7F7589\", \"Mobster\"], [\"7F76D3\", \"Moody Blue\"], [\"7FFF00\", \"Chartreuse\"], [\"7FFFD4\", \"Aquamarine\"], [\"800000\", \"Maroon\"], [\"800B47\", \"Rose Bud Cherry\"], [\"801818\", \"Falu Red\"], [\"80341F\", \"Red Robin\"], [\"803790\", \"Vivid Violet\"], [\"80461B\", \"Russet\"], [\"807E79\", \"Friar Gray\"], [\"808000\", \"Olive\"], [\"808080\", \"Gray\"], [\"80B3AE\", \"Gulf Stream\"], [\"80B3C4\", \"Glacier\"], [\"80CCEA\", \"Seagull\"], [\"81422C\", \"Nutmeg\"], [\"816E71\", \"Spicy Pink\"], [\"817377\", \"Empress\"], [\"819885\", \"Spanish Green\"], [\"826F65\", \"Sand Dune\"], [\"828685\", \"Gunsmoke\"], [\"828F72\", \"Battleship Gray\"], [\"831923\", \"Merlot\"], [\"837050\", \"Shadow\"], [\"83AA5D\", \"Chelsea Cucumber\"], [\"83D0C6\", \"Monte Carlo\"], [\"843179\", \"Plum\"], [\"84A0A0\", \"Granny Smith\"], [\"8581D9\", \"Chetwode Blue\"], [\"858470\", \"Bandicoot\"], [\"859FAF\", \"Bali Hai\"], [\"85C4CC\", \"Half Baked\"], [\"860111\", \"Red Devil\"], [\"863C3C\", \"Lotus\"], [\"86483C\", \"Ironstone\"], [\"864D1E\", \"Bull Shot\"], [\"86560A\", \"Rusty Nail\"], [\"868974\", \"Bitter\"], [\"86949F\", \"Regent Gray\"], [\"871550\", \"Disco\"], [\"87756E\", \"Americano\"], [\"877C7B\", \"Hurricane\"], [\"878D91\", \"Oslo Gray\"], [\"87AB39\", \"Sushi\"], [\"885342\", \"Spicy Mix\"], [\"886221\", \"Kumera\"], [\"888387\", \"Suva Gray\"], [\"888D65\", \"Avocado\"], [\"893456\", \"Camelot\"], [\"893843\", \"Solid Pink\"], [\"894367\", \"Cannon Pink\"], [\"897D6D\", \"Makara\"], [\"8A3324\", \"Burnt Umber\"], [\"8A73D6\", \"True V\"], [\"8A8360\", \"Clay Creek\"], [\"8A8389\", \"Monsoon\"], [\"8A8F8A\", \"Stack\"], [\"8AB9F1\", \"Jordy Blue\"], [\"8B00FF\", \"Electric Violet\"], [\"8B0723\", \"Monarch\"], [\"8B6B0B\", \"Corn Harvest\"], [\"8B8470\", \"Olive Haze\"], [\"8B847E\", \"Schooner\"], [\"8B8680\", \"Natural Gray\"], [\"8B9C90\", \"Mantle\"], [\"8B9FEE\", \"Portage\"], [\"8BA690\", \"Envy\"], [\"8BA9A5\", \"Cascade\"], [\"8BE6D8\", \"Riptide\"], [\"8C055E\", \"Cardinal Pink\"], [\"8C472F\", \"Mule Fawn\"], [\"8C5738\", \"Potters Clay\"], [\"8C6495\", \"Trendy Pink\"], [\"8D0226\", \"Paprika\"], [\"8D3D38\", \"Sanguine Brown\"], [\"8D3F3F\", \"Tosca\"], [\"8D7662\", \"Cement\"], [\"8D8974\", \"Granite Green\"], [\"8D90A1\", \"Manatee\"], [\"8DA8CC\", \"Polo Blue\"], [\"8E0000\", \"Red Berry\"], [\"8E4D1E\", \"Rope\"], [\"8E6F70\", \"Opium\"], [\"8E775E\", \"Domino\"], [\"8E8190\", \"Mamba\"], [\"8EABC1\", \"Nepal\"], [\"8F021C\", \"Pohutukawa\"], [\"8F3E33\", \"El Salva\"], [\"8F4B0E\", \"Korma\"], [\"8F8176\", \"Squirrel\"], [\"8FD6B4\", \"Vista Blue\"], [\"900020\", \"Burgundy\"], [\"901E1E\", \"Old Brick\"], [\"907874\", \"Hemp\"], [\"907B71\", \"Almond Frost\"], [\"908D39\", \"Sycamore\"], [\"92000A\", \"Sangria\"], [\"924321\", \"Cumin\"], [\"926F5B\", \"Beaver\"], [\"928573\", \"Stonewall\"], [\"928590\", \"Venus\"], [\"9370DB\", \"Medium Purple\"], [\"93CCEA\", \"Cornflower\"], [\"93DFB8\", \"Algae Green\"], [\"944747\", \"Copper Rust\"], [\"948771\", \"Arrowtown\"], [\"950015\", \"Scarlett\"], [\"956387\", \"Strikemaster\"], [\"959396\", \"Mountain Mist\"], [\"960018\", \"Carmine\"], [\"964B00\", \"Brown\"], [\"967059\", \"Leather\"], [\"9678B6\", \"Purple Mountain's Majesty\"], [\"967BB6\", \"Lavender Purple\"], [\"96A8A1\", \"Pewter\"], [\"96BBAB\", \"Summer Green\"], [\"97605D\", \"Au Chico\"], [\"9771B5\", \"Wisteria\"], [\"97CD2D\", \"Atlantis\"], [\"983D61\", \"Vin Rouge\"], [\"9874D3\", \"Lilac Bush\"], [\"98777B\", \"Bazaar\"], [\"98811B\", \"Hacienda\"], [\"988D77\", \"Pale Oyster\"], [\"98FF98\", \"Mint Green\"], [\"990066\", \"Fresh Eggplant\"], [\"991199\", \"Violet Eggplant\"], [\"991613\", \"Tamarillo\"], [\"991B07\", \"Totem Pole\"], [\"996666\", \"Copper Rose\"], [\"9966CC\", \"Amethyst\"], [\"997A8D\", \"Mountbatten Pink\"], [\"9999CC\", \"Blue Bell\"], [\"9A3820\", \"Prairie Sand\"], [\"9A6E61\", \"Toast\"], [\"9A9577\", \"Gurkha\"], [\"9AB973\", \"Olivine\"], [\"9AC2B8\", \"Shadow Green\"], [\"9B4703\", \"Oregon\"], [\"9B9E8F\", \"Lemon Grass\"], [\"9C3336\", \"Stiletto\"], [\"9D5616\", \"Hawaiian Tan\"], [\"9DACB7\", \"Gull Gray\"], [\"9DC209\", \"Pistachio\"], [\"9DE093\", \"Granny Smith Apple\"], [\"9DE5FF\", \"Anakiwa\"], [\"9E5302\", \"Chelsea Gem\"], [\"9E5B40\", \"Sepia Skin\"], [\"9EA587\", \"Sage\"], [\"9EA91F\", \"Citron\"], [\"9EB1CD\", \"Rock Blue\"], [\"9EDEE0\", \"Morning Glory\"], [\"9F381D\", \"Cognac\"], [\"9F821C\", \"Reef Gold\"], [\"9F9F9C\", \"Star Dust\"], [\"9FA0B1\", \"Santas Gray\"], [\"9FD7D3\", \"Sinbad\"], [\"9FDD8C\", \"Feijoa\"], [\"A02712\", \"Tabasco\"], [\"A1750D\", \"Buttered Rum\"], [\"A1ADB5\", \"Hit Gray\"], [\"A1C50A\", \"Citrus\"], [\"A1DAD7\", \"Aqua Island\"], [\"A1E9DE\", \"Water Leaf\"], [\"A2006D\", \"Flirt\"], [\"A23B6C\", \"Rouge\"], [\"A26645\", \"Cape Palliser\"], [\"A2AAB3\", \"Gray Chateau\"], [\"A2AEAB\", \"Edward\"], [\"A3807B\", \"Pharlap\"], [\"A397B4\", \"Amethyst Smoke\"], [\"A3E3ED\", \"Blizzard Blue\"], [\"A4A49D\", \"Delta\"], [\"A4A6D3\", \"Wistful\"], [\"A4AF6E\", \"Green Smoke\"], [\"A50B5E\", \"Jazzberry Jam\"], [\"A59B91\", \"Zorba\"], [\"A5CB0C\", \"Bahia\"], [\"A62F20\", \"Roof Terracotta\"], [\"A65529\", \"Paarl\"], [\"A68B5B\", \"Barley Corn\"], [\"A69279\", \"Donkey Brown\"], [\"A6A29A\", \"Dawn\"], [\"A72525\", \"Mexican Red\"], [\"A7882C\", \"Luxor Gold\"], [\"A85307\", \"Rich Gold\"], [\"A86515\", \"Reno Sand\"], [\"A86B6B\", \"Coral Tree\"], [\"A8989B\", \"Dusty Gray\"], [\"A899E6\", \"Dull Lavender\"], [\"A8A589\", \"Tallow\"], [\"A8AE9C\", \"Bud\"], [\"A8AF8E\", \"Locust\"], [\"A8BD9F\", \"Norway\"], [\"A8E3BD\", \"Chinook\"], [\"A9A491\", \"Gray Olive\"], [\"A9ACB6\", \"Aluminium\"], [\"A9B2C3\", \"Cadet Blue\"], [\"A9B497\", \"Schist\"], [\"A9BDBF\", \"Tower Gray\"], [\"A9BEF2\", \"Perano\"], [\"A9C6C2\", \"Opal\"], [\"AA375A\", \"Night Shadz\"], [\"AA4203\", \"Fire\"], [\"AA8B5B\", \"Muesli\"], [\"AA8D6F\", \"Sandal\"], [\"AAA5A9\", \"Shady Lady\"], [\"AAA9CD\", \"Logan\"], [\"AAABB7\", \"Spun Pearl\"], [\"AAD6E6\", \"Regent St Blue\"], [\"AAF0D1\", \"Magic Mint\"], [\"AB0563\", \"Lipstick\"], [\"AB3472\", \"Royal Heath\"], [\"AB917A\", \"Sandrift\"], [\"ABA0D9\", \"Cold Purple\"], [\"ABA196\", \"Bronco\"], [\"AC8A56\", \"Limed Oak\"], [\"AC91CE\", \"East Side\"], [\"AC9E22\", \"Lemon Ginger\"], [\"ACA494\", \"Napa\"], [\"ACA586\", \"Hillary\"], [\"ACA59F\", \"Cloudy\"], [\"ACACAC\", \"Silver Chalice\"], [\"ACB78E\", \"Swamp Green\"], [\"ACCBB1\", \"Spring Rain\"], [\"ACDD4D\", \"Conifer\"], [\"ACE1AF\", \"Celadon\"], [\"AD781B\", \"Mandalay\"], [\"ADBED1\", \"Casper\"], [\"ADDFAD\", \"Moss Green\"], [\"ADE6C4\", \"Padua\"], [\"ADFF2F\", \"Green Yellow\"], [\"AE4560\", \"Hippie Pink\"], [\"AE6020\", \"Desert\"], [\"AE809E\", \"Bouquet\"], [\"AF4035\", \"Medium Carmine\"], [\"AF4D43\", \"Apple Blossom\"], [\"AF593E\", \"Brown Rust\"], [\"AF8751\", \"Driftwood\"], [\"AF8F2C\", \"Alpine\"], [\"AF9F1C\", \"Lucky\"], [\"AFA09E\", \"Martini\"], [\"AFB1B8\", \"Bombay\"], [\"AFBDD9\", \"Pigeon Post\"], [\"B04C6A\", \"Cadillac\"], [\"B05D54\", \"Matrix\"], [\"B05E81\", \"Tapestry\"], [\"B06608\", \"Mai Tai\"], [\"B09A95\", \"Del Rio\"], [\"B0E0E6\", \"Powder Blue\"], [\"B0E313\", \"Inch Worm\"], [\"B10000\", \"Bright Red\"], [\"B14A0B\", \"Vesuvius\"], [\"B1610B\", \"Pumpkin Skin\"], [\"B16D52\", \"Santa Fe\"], [\"B19461\", \"Teak\"], [\"B1E2C1\", \"Fringy Flower\"], [\"B1F4E7\", \"Ice Cold\"], [\"B20931\", \"Shiraz\"], [\"B2A1EA\", \"Biloba Flower\"], [\"B32D29\", \"Tall Poppy\"], [\"B35213\", \"Fiery Orange\"], [\"B38007\", \"Hot Toddy\"], [\"B3AF95\", \"Taupe Gray\"], [\"B3C110\", \"La Rioja\"], [\"B43332\", \"Well Read\"], [\"B44668\", \"Blush\"], [\"B4CFD3\", \"Jungle Mist\"], [\"B57281\", \"Turkish Rose\"], [\"B57EDC\", \"Lavender\"], [\"B5A27F\", \"Mongoose\"], [\"B5B35C\", \"Olive Green\"], [\"B5D2CE\", \"Jet Stream\"], [\"B5ECDF\", \"Cruise\"], [\"B6316C\", \"Hibiscus\"], [\"B69D98\", \"Thatch\"], [\"B6B095\", \"Heathered Gray\"], [\"B6BAA4\", \"Eagle\"], [\"B6D1EA\", \"Spindle\"], [\"B6D3BF\", \"Gum Leaf\"], [\"B7410E\", \"Rust\"], [\"B78E5C\", \"Muddy Waters\"], [\"B7A214\", \"Sahara\"], [\"B7A458\", \"Husk\"], [\"B7B1B1\", \"Nobel\"], [\"B7C3D0\", \"Heather\"], [\"B7F0BE\", \"Madang\"], [\"B81104\", \"Milano Red\"], [\"B87333\", \"Copper\"], [\"B8B56A\", \"Gimblet\"], [\"B8C1B1\", \"Green Spring\"], [\"B8C25D\", \"Celery\"], [\"B8E0F9\", \"Sail\"], [\"B94E48\", \"Chestnut\"], [\"B95140\", \"Crail\"], [\"B98D28\", \"Marigold\"], [\"B9C46A\", \"Wild Willow\"], [\"B9C8AC\", \"Rainee\"], [\"BA0101\", \"Guardsman Red\"], [\"BA450C\", \"Rock Spray\"], [\"BA6F1E\", \"Bourbon\"], [\"BA7F03\", \"Pirate Gold\"], [\"BAB1A2\", \"Nomad\"], [\"BAC7C9\", \"Submarine\"], [\"BAEEF9\", \"Charlotte\"], [\"BB3385\", \"Medium Red Violet\"], [\"BB8983\", \"Brandy Rose\"], [\"BBD009\", \"Rio Grande\"], [\"BBD7C1\", \"Surf\"], [\"BCC9C2\", \"Powder Ash\"], [\"BD5E2E\", \"Tuscany\"], [\"BD978E\", \"Quicksand\"], [\"BDB1A8\", \"Silk\"], [\"BDB2A1\", \"Malta\"], [\"BDB3C7\", \"Chatelle\"], [\"BDBBD7\", \"Lavender Gray\"], [\"BDBDC6\", \"French Gray\"], [\"BDC8B3\", \"Clay Ash\"], [\"BDC9CE\", \"Loblolly\"], [\"BDEDFD\", \"French Pass\"], [\"BEA6C3\", \"London Hue\"], [\"BEB5B7\", \"Pink Swan\"], [\"BEDE0D\", \"Fuego\"], [\"BF5500\", \"Rose of Sharon\"], [\"BFB8B0\", \"Tide\"], [\"BFBED8\", \"Blue Haze\"], [\"BFC1C2\", \"Silver Sand\"], [\"BFC921\", \"Key Lime Pie\"], [\"BFDBE2\", \"Ziggurat\"], [\"BFFF00\", \"Lime\"], [\"C02B18\", \"Thunderbird\"], [\"C04737\", \"Mojo\"], [\"C08081\", \"Old Rose\"], [\"C0C0C0\", \"Silver\"], [\"C0D3B9\", \"Pale Leaf\"], [\"C0D8B6\", \"Pixie Green\"], [\"C1440E\", \"Tia Maria\"], [\"C154C1\", \"Fuchsia Pink\"], [\"C1A004\", \"Buddha Gold\"], [\"C1B7A4\", \"Bison Hide\"], [\"C1BAB0\", \"Tea\"], [\"C1BECD\", \"Gray Suit\"], [\"C1D7B0\", \"Sprout\"], [\"C1F07C\", \"Sulu\"], [\"C26B03\", \"Indochine\"], [\"C2955D\", \"Twine\"], [\"C2BDB6\", \"Cotton Seed\"], [\"C2CAC4\", \"Pumice\"], [\"C2E8E5\", \"Jagged Ice\"], [\"C32148\", \"Maroon Flush\"], [\"C3B091\", \"Indian Khaki\"], [\"C3BFC1\", \"Pale Slate\"], [\"C3C3BD\", \"Gray Nickel\"], [\"C3CDE6\", \"Periwinkle Gray\"], [\"C3D1D1\", \"Tiara\"], [\"C3DDF9\", \"Tropical Blue\"], [\"C41E3A\", \"Cardinal\"], [\"C45655\", \"Fuzzy Wuzzy Brown\"], [\"C45719\", \"Orange Roughy\"], [\"C4C4BC\", \"Mist Gray\"], [\"C4D0B0\", \"Coriander\"], [\"C4F4EB\", \"Mint Tulip\"], [\"C54B8C\", \"Mulberry\"], [\"C59922\", \"Nugget\"], [\"C5994B\", \"Tussock\"], [\"C5DBCA\", \"Sea Mist\"], [\"C5E17A\", \"Yellow Green\"], [\"C62D42\", \"Brick Red\"], [\"C6726B\", \"Contessa\"], [\"C69191\", \"Oriental Pink\"], [\"C6A84B\", \"Roti\"], [\"C6C3B5\", \"Ash\"], [\"C6C8BD\", \"Kangaroo\"], [\"C6E610\", \"Las Palmas\"], [\"C7031E\", \"Monza\"], [\"C71585\", \"Red Violet\"], [\"C7BCA2\", \"Coral Reef\"], [\"C7C1FF\", \"Melrose\"], [\"C7C4BF\", \"Cloud\"], [\"C7C9D5\", \"Ghost\"], [\"C7CD90\", \"Pine Glade\"], [\"C7DDE5\", \"Botticelli\"], [\"C88A65\", \"Antique Brass\"], [\"C8A2C8\", \"Lilac\"], [\"C8A528\", \"Hokey Pokey\"], [\"C8AABF\", \"Lily\"], [\"C8B568\", \"Laser\"], [\"C8E3D7\", \"Edgewater\"], [\"C96323\", \"Piper\"], [\"C99415\", \"Pizza\"], [\"C9A0DC\", \"Light Wisteria\"], [\"C9B29B\", \"Rodeo Dust\"], [\"C9B35B\", \"Sundance\"], [\"C9B93B\", \"Earls Green\"], [\"C9C0BB\", \"Silver Rust\"], [\"C9D9D2\", \"Conch\"], [\"C9FFA2\", \"Reef\"], [\"C9FFE5\", \"Aero Blue\"], [\"CA3435\", \"Flush Mahogany\"], [\"CABB48\", \"Turmeric\"], [\"CADCD4\", \"Paris White\"], [\"CAE00D\", \"Bitter Lemon\"], [\"CAE6DA\", \"Skeptic\"], [\"CB8FA9\", \"Viola\"], [\"CBCAB6\", \"Foggy Gray\"], [\"CBD3B0\", \"Green Mist\"], [\"CBDBD6\", \"Nebula\"], [\"CC3333\", \"Persian Red\"], [\"CC5500\", \"Burnt Orange\"], [\"CC7722\", \"Ochre\"], [\"CC8899\", \"Puce\"], [\"CCCAA8\", \"Thistle Green\"], [\"CCCCFF\", \"Periwinkle\"], [\"CCFF00\", \"Electric Lime\"], [\"CD5700\", \"Tenn\"], [\"CD5C5C\", \"Chestnut Rose\"], [\"CD8429\", \"Brandy Punch\"], [\"CDF4FF\", \"Onahau\"], [\"CEB98F\", \"Sorrell Brown\"], [\"CEBABA\", \"Cold Turkey\"], [\"CEC291\", \"Yuma\"], [\"CEC7A7\", \"Chino\"], [\"CFA39D\", \"Eunry\"], [\"CFB53B\", \"Old Gold\"], [\"CFDCCF\", \"Tasman\"], [\"CFE5D2\", \"Surf Crest\"], [\"CFF9F3\", \"Humming Bird\"], [\"CFFAF4\", \"Scandal\"], [\"D05F04\", \"Red Stage\"], [\"D06DA1\", \"Hopbush\"], [\"D07D12\", \"Meteor\"], [\"D0BEF8\", \"Perfume\"], [\"D0C0E5\", \"Prelude\"], [\"D0F0C0\", \"Tea Green\"], [\"D18F1B\", \"Geebung\"], [\"D1BEA8\", \"Vanilla\"], [\"D1C6B4\", \"Soft Amber\"], [\"D1D2CA\", \"Celeste\"], [\"D1D2DD\", \"Mischka\"], [\"D1E231\", \"Pear\"], [\"D2691E\", \"Hot Cinnamon\"], [\"D27D46\", \"Raw Sienna\"], [\"D29EAA\", \"Careys Pink\"], [\"D2B48C\", \"Tan\"], [\"D2DA97\", \"Deco\"], [\"D2F6DE\", \"Blue Romance\"], [\"D2F8B0\", \"Gossip\"], [\"D3CBBA\", \"Sisal\"], [\"D3CDC5\", \"Swirl\"], [\"D47494\", \"Charm\"], [\"D4B6AF\", \"Clam Shell\"], [\"D4BF8D\", \"Straw\"], [\"D4C4A8\", \"Akaroa\"], [\"D4CD16\", \"Bird Flower\"], [\"D4D7D9\", \"Iron\"], [\"D4DFE2\", \"Geyser\"], [\"D4E2FC\", \"Hawkes Blue\"], [\"D54600\", \"Grenadier\"], [\"D591A4\", \"Can Can\"], [\"D59A6F\", \"Whiskey\"], [\"D5D195\", \"Winter Hazel\"], [\"D5F6E3\", \"Granny Apple\"], [\"D69188\", \"My Pink\"], [\"D6C562\", \"Tacha\"], [\"D6CEF6\", \"Moon Raker\"], [\"D6D6D1\", \"Quill Gray\"], [\"D6FFDB\", \"Snowy Mint\"], [\"D7837F\", \"New York Pink\"], [\"D7C498\", \"Pavlova\"], [\"D7D0FF\", \"Fog\"], [\"D84437\", \"Valencia\"], [\"D87C63\", \"Japonica\"], [\"D8BFD8\", \"Thistle\"], [\"D8C2D5\", \"Maverick\"], [\"D8FCFA\", \"Foam\"], [\"D94972\", \"Cabaret\"], [\"D99376\", \"Burning Sand\"], [\"D9B99B\", \"Cameo\"], [\"D9D6CF\", \"Timberwolf\"], [\"D9DCC1\", \"Tana\"], [\"D9E4F5\", \"Link Water\"], [\"D9F7FF\", \"Mabel\"], [\"DA3287\", \"Cerise\"], [\"DA5B38\", \"Flame Pea\"], [\"DA6304\", \"Bamboo\"], [\"DA6A41\", \"Red Damask\"], [\"DA70D6\", \"Orchid\"], [\"DA8A67\", \"Copperfield\"], [\"DAA520\", \"Golden Grass\"], [\"DAECD6\", \"Zanah\"], [\"DAF4F0\", \"Iceberg\"], [\"DAFAFF\", \"Oyster Bay\"], [\"DB5079\", \"Cranberry\"], [\"DB9690\", \"Petite Orchid\"], [\"DB995E\", \"Di Serria\"], [\"DBDBDB\", \"Alto\"], [\"DBFFF8\", \"Frosted Mint\"], [\"DC143C\", \"Crimson\"], [\"DC4333\", \"Punch\"], [\"DCB20C\", \"Galliano\"], [\"DCB4BC\", \"Blossom\"], [\"DCD747\", \"Wattle\"], [\"DCD9D2\", \"Westar\"], [\"DCDDCC\", \"Moon Mist\"], [\"DCEDB4\", \"Caper\"], [\"DCF0EA\", \"Swans Down\"], [\"DDD6D5\", \"Swiss Coffee\"], [\"DDF9F1\", \"White Ice\"], [\"DE3163\", \"Cerise Red\"], [\"DE6360\", \"Roman\"], [\"DEA681\", \"Tumbleweed\"], [\"DEBA13\", \"Gold Tips\"], [\"DEC196\", \"Brandy\"], [\"DECBC6\", \"Wafer\"], [\"DED4A4\", \"Sapling\"], [\"DED717\", \"Barberry\"], [\"DEE5C0\", \"Beryl Green\"], [\"DEF5FF\", \"Pattens Blue\"], [\"DF73FF\", \"Heliotrope\"], [\"DFBE6F\", \"Apache\"], [\"DFCD6F\", \"Chenin\"], [\"DFCFDB\", \"Lola\"], [\"DFECDA\", \"Willow Brook\"], [\"DFFF00\", \"Chartreuse Yellow\"], [\"E0B0FF\", \"Mauve\"], [\"E0B646\", \"Anzac\"], [\"E0B974\", \"Harvest Gold\"], [\"E0C095\", \"Calico\"], [\"E0FFFF\", \"Baby Blue\"], [\"E16865\", \"Sunglo\"], [\"E1BC64\", \"Equator\"], [\"E1C0C8\", \"Pink Flare\"], [\"E1E6D6\", \"Periglacial Blue\"], [\"E1EAD4\", \"Kidnapper\"], [\"E1F6E8\", \"Tara\"], [\"E25465\", \"Mandy\"], [\"E2725B\", \"Terracotta\"], [\"E28913\", \"Golden Bell\"], [\"E292C0\", \"Shocking\"], [\"E29418\", \"Dixie\"], [\"E29CD2\", \"Light Orchid\"], [\"E2D8ED\", \"Snuff\"], [\"E2EBED\", \"Mystic\"], [\"E2F3EC\", \"Apple Green\"], [\"E30B5C\", \"Razzmatazz\"], [\"E32636\", \"Alizarin Crimson\"], [\"E34234\", \"Cinnabar\"], [\"E3BEBE\", \"Cavern Pink\"], [\"E3F5E1\", \"Peppermint\"], [\"E3F988\", \"Mindaro\"], [\"E47698\", \"Deep Blush\"], [\"E49B0F\", \"Gamboge\"], [\"E4C2D5\", \"Melanie\"], [\"E4CFDE\", \"Twilight\"], [\"E4D1C0\", \"Bone\"], [\"E4D422\", \"Sunflower\"], [\"E4D5B7\", \"Grain Brown\"], [\"E4D69B\", \"Zombie\"], [\"E4F6E7\", \"Frostee\"], [\"E4FFD1\", \"Snow Flurry\"], [\"E52B50\", \"Amaranth\"], [\"E5841B\", \"Zest\"], [\"E5CCC9\", \"Dust Storm\"], [\"E5D7BD\", \"Stark White\"], [\"E5D8AF\", \"Hampton\"], [\"E5E0E1\", \"Bon Jour\"], [\"E5E5E5\", \"Mercury\"], [\"E5F9F6\", \"Polar\"], [\"E64E03\", \"Trinidad\"], [\"E6BE8A\", \"Gold Sand\"], [\"E6BEA5\", \"Cashmere\"], [\"E6D7B9\", \"Double Spanish White\"], [\"E6E4D4\", \"Satin Linen\"], [\"E6F2EA\", \"Harp\"], [\"E6F8F3\", \"Off Green\"], [\"E6FFE9\", \"Hint of Green\"], [\"E6FFFF\", \"Tranquil\"], [\"E77200\", \"Mango Tango\"], [\"E7730A\", \"Christine\"], [\"E79F8C\", \"Tonys Pink\"], [\"E79FC4\", \"Kobi\"], [\"E7BCB4\", \"Rose Fog\"], [\"E7BF05\", \"Corn\"], [\"E7CD8C\", \"Putty\"], [\"E7ECE6\", \"Gray Nurse\"], [\"E7F8FF\", \"Lily White\"], [\"E7FEFF\", \"Bubbles\"], [\"E89928\", \"Fire Bush\"], [\"E8B9B3\", \"Shilo\"], [\"E8E0D5\", \"Pearl Bush\"], [\"E8EBE0\", \"Green White\"], [\"E8F1D4\", \"Chrome White\"], [\"E8F2EB\", \"Gin\"], [\"E8F5F2\", \"Aqua Squeeze\"], [\"E96E00\", \"Clementine\"], [\"E97451\", \"Burnt Sienna\"], [\"E97C07\", \"Tahiti Gold\"], [\"E9CECD\", \"Oyster Pink\"], [\"E9D75A\", \"Confetti\"], [\"E9E3E3\", \"Ebb\"], [\"E9F8ED\", \"Ottoman\"], [\"E9FFFD\", \"Clear Day\"], [\"EA88A8\", \"Carissma\"], [\"EAAE69\", \"Porsche\"], [\"EAB33B\", \"Tulip Tree\"], [\"EAC674\", \"Rob Roy\"], [\"EADAB8\", \"Raffia\"], [\"EAE8D4\", \"White Rock\"], [\"EAF6EE\", \"Panache\"], [\"EAF6FF\", \"Solitude\"], [\"EAF9F5\", \"Aqua Spring\"], [\"EAFFFE\", \"Dew\"], [\"EB9373\", \"Apricot\"], [\"EBC2AF\", \"Zinnwaldite\"], [\"ECA927\", \"Fuel Yellow\"], [\"ECC54E\", \"Ronchi\"], [\"ECC7EE\", \"French Lilac\"], [\"ECCDB9\", \"Just Right\"], [\"ECE090\", \"Wild Rice\"], [\"ECEBBD\", \"Fall Green\"], [\"ECEBCE\", \"Aths Special\"], [\"ECF245\", \"Starship\"], [\"ED0A3F\", \"Red Ribbon\"], [\"ED7A1C\", \"Tango\"], [\"ED9121\", \"Carrot Orange\"], [\"ED989E\", \"Sea Pink\"], [\"EDB381\", \"Tacao\"], [\"EDC9AF\", \"Desert Sand\"], [\"EDCDAB\", \"Pancho\"], [\"EDDCB1\", \"Chamois\"], [\"EDEA99\", \"Primrose\"], [\"EDF5DD\", \"Frost\"], [\"EDF5F5\", \"Aqua Haze\"], [\"EDF6FF\", \"Zumthor\"], [\"EDF9F1\", \"Narvik\"], [\"EDFC84\", \"Honeysuckle\"], [\"EE82EE\", \"Lavender Magenta\"], [\"EEC1BE\", \"Beauty Bush\"], [\"EED794\", \"Chalky\"], [\"EED9C4\", \"Almond\"], [\"EEDC82\", \"Flax\"], [\"EEDEDA\", \"Bizarre\"], [\"EEE3AD\", \"Double Colonial White\"], [\"EEEEE8\", \"Cararra\"], [\"EEEF78\", \"Manz\"], [\"EEF0C8\", \"Tahuna Sands\"], [\"EEF0F3\", \"Athens Gray\"], [\"EEF3C3\", \"Tusk\"], [\"EEF4DE\", \"Loafer\"], [\"EEF6F7\", \"Catskill White\"], [\"EEFDFF\", \"Twilight Blue\"], [\"EEFF9A\", \"Jonquil\"], [\"EEFFE2\", \"Rice Flower\"], [\"EF863F\", \"Jaffa\"], [\"EFEFEF\", \"Gallery\"], [\"EFF2F3\", \"Porcelain\"], [\"F091A9\", \"Mauvelous\"], [\"F0D52D\", \"Golden Dream\"], [\"F0DB7D\", \"Golden Sand\"], [\"F0DC82\", \"Buff\"], [\"F0E2EC\", \"Prim\"], [\"F0E68C\", \"Khaki\"], [\"F0EEFD\", \"Selago\"], [\"F0EEFF\", \"Titan White\"], [\"F0F8FF\", \"Alice Blue\"], [\"F0FCEA\", \"Feta\"], [\"F18200\", \"Gold Drop\"], [\"F19BAB\", \"Wewak\"], [\"F1E788\", \"Sahara Sand\"], [\"F1E9D2\", \"Parchment\"], [\"F1E9FF\", \"Blue Chalk\"], [\"F1EEC1\", \"Mint Julep\"], [\"F1F1F1\", \"Seashell\"], [\"F1F7F2\", \"Saltpan\"], [\"F1FFAD\", \"Tidal\"], [\"F1FFC8\", \"Chiffon\"], [\"F2552A\", \"Flamingo\"], [\"F28500\", \"Tangerine\"], [\"F2C3B2\", \"Mandys Pink\"], [\"F2F2F2\", \"Concrete\"], [\"F2FAFA\", \"Black Squeeze\"], [\"F34723\", \"Pomegranate\"], [\"F3AD16\", \"Buttercup\"], [\"F3D69D\", \"New Orleans\"], [\"F3D9DF\", \"Vanilla Ice\"], [\"F3E7BB\", \"Sidecar\"], [\"F3E9E5\", \"Dawn Pink\"], [\"F3EDCF\", \"Wheatfield\"], [\"F3FB62\", \"Canary\"], [\"F3FBD4\", \"Orinoco\"], [\"F3FFD8\", \"Carla\"], [\"F400A1\", \"Hollywood Cerise\"], [\"F4A460\", \"Sandy brown\"], [\"F4C430\", \"Saffron\"], [\"F4D81C\", \"Ripe Lemon\"], [\"F4EBD3\", \"Janna\"], [\"F4F2EE\", \"Pampas\"], [\"F4F4F4\", \"Wild Sand\"], [\"F4F8FF\", \"Zircon\"], [\"F57584\", \"Froly\"], [\"F5C85C\", \"Cream Can\"], [\"F5C999\", \"Manhattan\"], [\"F5D5A0\", \"Maize\"], [\"F5DEB3\", \"Wheat\"], [\"F5E7A2\", \"Sandwisp\"], [\"F5E7E2\", \"Pot Pourri\"], [\"F5E9D3\", \"Albescent White\"], [\"F5EDEF\", \"Soft Peach\"], [\"F5F3E5\", \"Ecru White\"], [\"F5F5DC\", \"Beige\"], [\"F5FB3D\", \"Golden Fizz\"], [\"F5FFBE\", \"Australian Mint\"], [\"F64A8A\", \"French Rose\"], [\"F653A6\", \"Brilliant Rose\"], [\"F6A4C9\", \"Illusion\"], [\"F6F0E6\", \"Merino\"], [\"F6F7F7\", \"Black Haze\"], [\"F6FFDC\", \"Spring Sun\"], [\"F7468A\", \"Violet Red\"], [\"F77703\", \"Chilean Fire\"], [\"F77FBE\", \"Persian Pink\"], [\"F7B668\", \"Rajah\"], [\"F7C8DA\", \"Azalea\"], [\"F7DBE6\", \"We Peep\"], [\"F7F2E1\", \"Quarter Spanish White\"], [\"F7F5FA\", \"Whisper\"], [\"F7FAF7\", \"Snow Drift\"], [\"F8B853\", \"Casablanca\"], [\"F8C3DF\", \"Chantilly\"], [\"F8D9E9\", \"Cherub\"], [\"F8DB9D\", \"Marzipan\"], [\"F8DD5C\", \"Energy Yellow\"], [\"F8E4BF\", \"Givry\"], [\"F8F0E8\", \"White Linen\"], [\"F8F4FF\", \"Magnolia\"], [\"F8F6F1\", \"Spring Wood\"], [\"F8F7DC\", \"Coconut Cream\"], [\"F8F7FC\", \"White Lilac\"], [\"F8F8F7\", \"Desert Storm\"], [\"F8F99C\", \"Texas\"], [\"F8FACD\", \"Corn Field\"], [\"F8FDD3\", \"Mimosa\"], [\"F95A61\", \"Carnation\"], [\"F9BF58\", \"Saffron Mango\"], [\"F9E0ED\", \"Carousel Pink\"], [\"F9E4BC\", \"Dairy Cream\"], [\"F9E663\", \"Portica\"], [\"F9E6F4\", \"Underage Pink\"], [\"F9EAF3\", \"Amour\"], [\"F9F8E4\", \"Rum Swizzle\"], [\"F9FF8B\", \"Dolly\"], [\"F9FFF6\", \"Sugar Cane\"], [\"FA7814\", \"Ecstasy\"], [\"FA9D5A\", \"Tan Hide\"], [\"FAD3A2\", \"Corvette\"], [\"FADFAD\", \"Peach Yellow\"], [\"FAE600\", \"Turbo\"], [\"FAEAB9\", \"Astra\"], [\"FAECCC\", \"Champagne\"], [\"FAF0E6\", \"Linen\"], [\"FAF3F0\", \"Fantasy\"], [\"FAF7D6\", \"Citrine White\"], [\"FAFAFA\", \"Alabaster\"], [\"FAFDE4\", \"Hint of Yellow\"], [\"FAFFA4\", \"Milan\"], [\"FB607F\", \"Brink Pink\"], [\"FB8989\", \"Geraldine\"], [\"FBA0E3\", \"Lavender Rose\"], [\"FBA129\", \"Sea Buckthorn\"], [\"FBAC13\", \"Sun\"], [\"FBAED2\", \"Lavender Pink\"], [\"FBB2A3\", \"Rose Bud\"], [\"FBBEDA\", \"Cupid\"], [\"FBCCE7\", \"Classic Rose\"], [\"FBCEB1\", \"Apricot Peach\"], [\"FBE7B2\", \"Banana Mania\"], [\"FBE870\", \"Marigold Yellow\"], [\"FBE96C\", \"Festival\"], [\"FBEA8C\", \"Sweet Corn\"], [\"FBEC5D\", \"Candy Corn\"], [\"FBF9F9\", \"Hint of Red\"], [\"FBFFBA\", \"Shalimar\"], [\"FC0FC0\", \"Shocking Pink\"], [\"FC80A5\", \"Tickle Me Pink\"], [\"FC9C1D\", \"Tree Poppy\"], [\"FCC01E\", \"Lightning Yellow\"], [\"FCD667\", \"Goldenrod\"], [\"FCD917\", \"Candlelight\"], [\"FCDA98\", \"Cherokee\"], [\"FCF4D0\", \"Double Pearl Lusta\"], [\"FCF4DC\", \"Pearl Lusta\"], [\"FCF8F7\", \"Vista White\"], [\"FCFBF3\", \"Bianca\"], [\"FCFEDA\", \"Moon Glow\"], [\"FCFFE7\", \"China Ivory\"], [\"FCFFF9\", \"Ceramic\"], [\"FD0E35\", \"Torch Red\"], [\"FD5B78\", \"Wild Watermelon\"], [\"FD7B33\", \"Crusta\"], [\"FD7C07\", \"Sorbus\"], [\"FD9FA2\", \"Sweet Pink\"], [\"FDD5B1\", \"Light Apricot\"], [\"FDD7E4\", \"Pig Pink\"], [\"FDE1DC\", \"Cinderella\"], [\"FDE295\", \"Golden Glow\"], [\"FDE910\", \"Lemon\"], [\"FDF5E6\", \"Old Lace\"], [\"FDF6D3\", \"Half Colonial White\"], [\"FDF7AD\", \"Drover\"], [\"FDFEB8\", \"Pale Prim\"], [\"FDFFD5\", \"Cumulus\"], [\"FE28A2\", \"Persian Rose\"], [\"FE4C40\", \"Sunset Orange\"], [\"FE6F5E\", \"Bittersweet\"], [\"FE9D04\", \"California\"], [\"FEA904\", \"Yellow Sea\"], [\"FEBAAD\", \"Melon\"], [\"FED33C\", \"Bright Sun\"], [\"FED85D\", \"Dandelion\"], [\"FEDB8D\", \"Salomie\"], [\"FEE5AC\", \"Cape Honey\"], [\"FEEBF3\", \"Remy\"], [\"FEEFCE\", \"Oasis\"], [\"FEF0EC\", \"Bridesmaid\"], [\"FEF2C7\", \"Beeswax\"], [\"FEF3D8\", \"Bleach White\"], [\"FEF4CC\", \"Pipi\"], [\"FEF4DB\", \"Half Spanish White\"], [\"FEF4F8\", \"Wisp Pink\"], [\"FEF5F1\", \"Provincial Pink\"], [\"FEF7DE\", \"Half Dutch White\"], [\"FEF8E2\", \"Solitaire\"], [\"FEF8FF\", \"White Pointer\"], [\"FEF9E3\", \"Off Yellow\"], [\"FEFCED\", \"Orange White\"], [\"FF0000\", \"Red\"], [\"FF007F\", \"Rose\"], [\"FF00CC\", \"Purple Pizzazz\"], [\"FF00FF\", \"Magenta / Fuchsia\"], [\"FF2400\", \"Scarlet\"], [\"FF3399\", \"Wild Strawberry\"], [\"FF33CC\", \"Razzle Dazzle Rose\"], [\"FF355E\", \"Radical Red\"], [\"FF3F34\", \"Red Orange\"], [\"FF4040\", \"Coral Red\"], [\"FF4D00\", \"Vermilion\"], [\"FF4F00\", \"International Orange\"], [\"FF6037\", \"Outrageous Orange\"], [\"FF6600\", \"Blaze Orange\"], [\"FF66FF\", \"Pink Flamingo\"], [\"FF681F\", \"Orange\"], [\"FF69B4\", \"Hot Pink\"], [\"FF6B53\", \"Persimmon\"], [\"FF6FFF\", \"Blush Pink\"], [\"FF7034\", \"Burning Orange\"], [\"FF7518\", \"Pumpkin\"], [\"FF7D07\", \"Flamenco\"], [\"FF7F00\", \"Flush Orange\"], [\"FF7F50\", \"Coral\"], [\"FF8C69\", \"Salmon\"], [\"FF9000\", \"Pizazz\"], [\"FF910F\", \"West Side\"], [\"FF91A4\", \"Pink Salmon\"], [\"FF9933\", \"Neon Carrot\"], [\"FF9966\", \"Atomic Tangerine\"], [\"FF9980\", \"Vivid Tangerine\"], [\"FF9E2C\", \"Sunshade\"], [\"FFA000\", \"Orange Peel\"], [\"FFA194\", \"Mona Lisa\"], [\"FFA500\", \"Web Orange\"], [\"FFA6C9\", \"Carnation Pink\"], [\"FFAB81\", \"Hit Pink\"], [\"FFAE42\", \"Yellow Orange\"], [\"FFB0AC\", \"Cornflower Lilac\"], [\"FFB1B3\", \"Sundown\"], [\"FFB31F\", \"My Sin\"], [\"FFB555\", \"Texas Rose\"], [\"FFB7D5\", \"Cotton Candy\"], [\"FFB97B\", \"Macaroni and Cheese\"], [\"FFBA00\", \"Selective Yellow\"], [\"FFBD5F\", \"Koromiko\"], [\"FFBF00\", \"Amber\"], [\"FFC0A8\", \"Wax Flower\"], [\"FFC0CB\", \"Pink\"], [\"FFC3C0\", \"Your Pink\"], [\"FFC901\", \"Supernova\"], [\"FFCBA4\", \"Flesh\"], [\"FFCC33\", \"Sunglow\"], [\"FFCC5C\", \"Golden Tainoi\"], [\"FFCC99\", \"Peach Orange\"], [\"FFCD8C\", \"Chardonnay\"], [\"FFD1DC\", \"Pastel Pink\"], [\"FFD2B7\", \"Romantic\"], [\"FFD38C\", \"Grandis\"], [\"FFD700\", \"Gold\"], [\"FFD800\", \"School bus Yellow\"], [\"FFD8D9\", \"Cosmos\"], [\"FFDB58\", \"Mustard\"], [\"FFDCD6\", \"Peach Schnapps\"], [\"FFDDAF\", \"Caramel\"], [\"FFDDCD\", \"Tuft Bush\"], [\"FFDDCF\", \"Watusi\"], [\"FFDDF4\", \"Pink Lace\"], [\"FFDEAD\", \"Navajo White\"], [\"FFDEB3\", \"Frangipani\"], [\"FFE1DF\", \"Pippin\"], [\"FFE1F2\", \"Pale Rose\"], [\"FFE2C5\", \"Negroni\"], [\"FFE5A0\", \"Cream Brulee\"], [\"FFE5B4\", \"Peach\"], [\"FFE6C7\", \"Tequila\"], [\"FFE772\", \"Kournikova\"], [\"FFEAC8\", \"Sandy Beach\"], [\"FFEAD4\", \"Karry\"], [\"FFEC13\", \"Broom\"], [\"FFEDBC\", \"Colonial White\"], [\"FFEED8\", \"Derby\"], [\"FFEFA1\", \"Vis Vis\"], [\"FFEFC1\", \"Egg White\"], [\"FFEFD5\", \"Papaya Whip\"], [\"FFEFEC\", \"Fair Pink\"], [\"FFF0DB\", \"Peach Cream\"], [\"FFF0F5\", \"Lavender blush\"], [\"FFF14F\", \"Gorse\"], [\"FFF1B5\", \"Buttermilk\"], [\"FFF1D8\", \"Pink Lady\"], [\"FFF1EE\", \"Forget Me Not\"], [\"FFF1F9\", \"Tutu\"], [\"FFF39D\", \"Picasso\"], [\"FFF3F1\", \"Chardon\"], [\"FFF46E\", \"Paris Daisy\"], [\"FFF4CE\", \"Barley White\"], [\"FFF4DD\", \"Egg Sour\"], [\"FFF4E0\", \"Sazerac\"], [\"FFF4E8\", \"Serenade\"], [\"FFF4F3\", \"Chablis\"], [\"FFF5EE\", \"Seashell Peach\"], [\"FFF5F3\", \"Sauvignon\"], [\"FFF6D4\", \"Milk Punch\"], [\"FFF6DF\", \"Varden\"], [\"FFF6F5\", \"Rose White\"], [\"FFF8D1\", \"Baja White\"], [\"FFF9E2\", \"Gin Fizz\"], [\"FFF9E6\", \"Early Dawn\"], [\"FFFACD\", \"Lemon Chiffon\"], [\"FFFAF4\", \"Bridal Heath\"], [\"FFFBDC\", \"Scotch Mist\"], [\"FFFBF9\", \"Soapstone\"], [\"FFFC99\", \"Witch Haze\"], [\"FFFCEA\", \"Buttery White\"], [\"FFFCEE\", \"Island Spice\"], [\"FFFDD0\", \"Cream\"], [\"FFFDE6\", \"Chilean Heath\"], [\"FFFDE8\", \"Travertine\"], [\"FFFDF3\", \"Orchid White\"], [\"FFFDF4\", \"Quarter Pearl Lusta\"], [\"FFFEE1\", \"Half and Half\"], [\"FFFEEC\", \"Apricot White\"], [\"FFFEF0\", \"Rice Cake\"], [\"FFFEF6\", \"Black White\"], [\"FFFEFD\", \"Romance\"], [\"FFFF00\", \"Yellow\"], [\"FFFF66\", \"Laser Lemon\"], [\"FFFF99\", \"Pale Canary\"], [\"FFFFB4\", \"Portafino\"], [\"FFFFF0\", \"Ivory\"], [\"FFFFFF\", \"White\"], [\"acc2d9\", \"cloudy blue\"], [\"56ae57\", \"dark pastel green\"], [\"b2996e\", \"dust\"], [\"a8ff04\", \"electric lime\"], [\"69d84f\", \"fresh green\"], [\"894585\", \"light eggplant\"], [\"70b23f\", \"nasty green\"], [\"d4ffff\", \"really light blue\"], [\"65ab7c\", \"tea\"], [\"952e8f\", \"warm purple\"], [\"fcfc81\", \"yellowish tan\"], [\"a5a391\", \"cement\"], [\"388004\", \"dark grass green\"], [\"4c9085\", \"dusty teal\"], [\"5e9b8a\", \"grey teal\"], [\"efb435\", \"macaroni and cheese\"], [\"d99b82\", \"pinkish tan\"], [\"0a5f38\", \"spruce\"], [\"0c06f7\", \"strong blue\"], [\"61de2a\", \"toxic green\"], [\"3778bf\", \"windows blue\"], [\"2242c7\", \"blue blue\"], [\"533cc6\", \"blue with a hint of purple\"], [\"9bb53c\", \"booger\"], [\"05ffa6\", \"bright sea green\"], [\"1f6357\", \"dark green blue\"], [\"017374\", \"deep turquoise\"], [\"0cb577\", \"green teal\"], [\"ff0789\", \"strong pink\"], [\"afa88b\", \"bland\"], [\"08787f\", \"deep aqua\"], [\"dd85d7\", \"lavender pink\"], [\"a6c875\", \"light moss green\"], [\"a7ffb5\", \"light seafoam green\"], [\"c2b709\", \"olive yellow\"], [\"e78ea5\", \"pig pink\"], [\"966ebd\", \"deep lilac\"], [\"ccad60\", \"desert\"], [\"ac86a8\", \"dusty lavender\"], [\"947e94\", \"purpley grey\"], [\"983fb2\", \"purply\"], [\"ff63e9\", \"candy pink\"], [\"b2fba5\", \"light pastel green\"], [\"63b365\", \"boring green\"], [\"8ee53f\", \"kiwi green\"], [\"b7e1a1\", \"light grey green\"], [\"ff6f52\", \"orange pink\"], [\"bdf8a3\", \"tea green\"], [\"d3b683\", \"very light brown\"], [\"fffcc4\", \"egg shell\"], [\"430541\", \"eggplant purple\"], [\"ffb2d0\", \"powder pink\"], [\"997570\", \"reddish grey\"], [\"ad900d\", \"baby shit brown\"], [\"c48efd\", \"liliac\"], [\"507b9c\", \"stormy blue\"], [\"7d7103\", \"ugly brown\"], [\"fffd78\", \"custard\"], [\"da467d\", \"darkish pink\"], [\"410200\", \"deep brown\"], [\"c9d179\", \"greenish beige\"], [\"fffa86\", \"manilla\"], [\"5684ae\", \"off blue\"], [\"6b7c85\", \"battleship grey\"], [\"6f6c0a\", \"browny green\"], [\"7e4071\", \"bruise\"], [\"009337\", \"kelley green\"], [\"d0e429\", \"sickly yellow\"], [\"fff917\", \"sunny yellow\"], [\"1d5dec\", \"azul\"], [\"054907\", \"darkgreen\"], [\"b5ce08\", \"green/yellow\"], [\"8fb67b\", \"lichen\"], [\"c8ffb0\", \"light light green\"], [\"fdde6c\", \"pale gold\"], [\"ffdf22\", \"sun yellow\"], [\"a9be70\", \"tan green\"], [\"6832e3\", \"burple\"], [\"fdb147\", \"butterscotch\"], [\"c7ac7d\", \"toupe\"], [\"fff39a\", \"dark cream\"], [\"850e04\", \"indian red\"], [\"efc0fe\", \"light lavendar\"], [\"40fd14\", \"poison green\"], [\"b6c406\", \"baby puke green\"], [\"9dff00\", \"bright yellow green\"], [\"3c4142\", \"charcoal grey\"], [\"f2ab15\", \"squash\"], [\"ac4f06\", \"cinnamon\"], [\"c4fe82\", \"light pea green\"], [\"2cfa1f\", \"radioactive green\"], [\"9a6200\", \"raw sienna\"], [\"ca9bf7\", \"baby purple\"], [\"875f42\", \"cocoa\"], [\"3a2efe\", \"light royal blue\"], [\"fd8d49\", \"orangeish\"], [\"8b3103\", \"rust brown\"], [\"cba560\", \"sand brown\"], [\"698339\", \"swamp\"], [\"0cdc73\", \"tealish green\"], [\"b75203\", \"burnt siena\"], [\"7f8f4e\", \"camo\"], [\"26538d\", \"dusk blue\"], [\"63a950\", \"fern\"], [\"c87f89\", \"old rose\"], [\"b1fc99\", \"pale light green\"], [\"ff9a8a\", \"peachy pink\"], [\"f6688e\", \"rosy pink\"], [\"76fda8\", \"light bluish green\"], [\"53fe5c\", \"light bright green\"], [\"4efd54\", \"light neon green\"], [\"a0febf\", \"light seafoam\"], [\"7bf2da\", \"tiffany blue\"], [\"bcf5a6\", \"washed out green\"], [\"ca6b02\", \"browny orange\"], [\"107ab0\", \"nice blue\"], [\"2138ab\", \"sapphire\"], [\"719f91\", \"greyish teal\"], [\"fdb915\", \"orangey yellow\"], [\"fefcaf\", \"parchment\"], [\"fcf679\", \"straw\"], [\"1d0200\", \"very dark brown\"], [\"cb6843\", \"terracota\"], [\"31668a\", \"ugly blue\"], [\"247afd\", \"clear blue\"], [\"ffffb6\", \"creme\"], [\"90fda9\", \"foam green\"], [\"86a17d\", \"grey/green\"], [\"fddc5c\", \"light gold\"], [\"78d1b6\", \"seafoam blue\"], [\"13bbaf\", \"topaz\"], [\"fb5ffc\", \"violet pink\"], [\"20f986\", \"wintergreen\"], [\"ffe36e\", \"yellow tan\"], [\"9d0759\", \"dark fuchsia\"], [\"3a18b1\", \"indigo blue\"], [\"c2ff89\", \"light yellowish green\"], [\"d767ad\", \"pale magenta\"], [\"720058\", \"rich purple\"], [\"ffda03\", \"sunflower yellow\"], [\"01c08d\", \"green/blue\"], [\"ac7434\", \"leather\"], [\"014600\", \"racing green\"], [\"9900fa\", \"vivid purple\"], [\"02066f\", \"dark royal blue\"], [\"8e7618\", \"hazel\"], [\"d1768f\", \"muted pink\"], [\"96b403\", \"booger green\"], [\"fdff63\", \"canary\"], [\"95a3a6\", \"cool grey\"], [\"7f684e\", \"dark taupe\"], [\"751973\", \"darkish purple\"], [\"089404\", \"true green\"], [\"ff6163\", \"coral pink\"], [\"598556\", \"dark sage\"], [\"214761\", \"dark slate blue\"], [\"3c73a8\", \"flat blue\"], [\"ba9e88\", \"mushroom\"], [\"021bf9\", \"rich blue\"], [\"734a65\", \"dirty purple\"], [\"23c48b\", \"greenblue\"], [\"8fae22\", \"icky green\"], [\"e6f2a2\", \"light khaki\"], [\"4b57db\", \"warm blue\"], [\"d90166\", \"dark hot pink\"], [\"015482\", \"deep sea blue\"], [\"9d0216\", \"carmine\"], [\"728f02\", \"dark yellow green\"], [\"ffe5ad\", \"pale peach\"], [\"4e0550\", \"plum purple\"], [\"f9bc08\", \"golden rod\"], [\"ff073a\", \"neon red\"], [\"c77986\", \"old pink\"], [\"d6fffe\", \"very pale blue\"], [\"fe4b03\", \"blood orange\"], [\"fd5956\", \"grapefruit\"], [\"fce166\", \"sand yellow\"], [\"b2713d\", \"clay brown\"], [\"1f3b4d\", \"dark blue grey\"], [\"699d4c\", \"flat green\"], [\"56fca2\", \"light green blue\"], [\"fb5581\", \"warm pink\"], [\"3e82fc\", \"dodger blue\"], [\"a0bf16\", \"gross green\"], [\"d6fffa\", \"ice\"], [\"4f738e\", \"metallic blue\"], [\"ffb19a\", \"pale salmon\"], [\"5c8b15\", \"sap green\"], [\"54ac68\", \"algae\"], [\"89a0b0\", \"bluey grey\"], [\"7ea07a\", \"greeny grey\"], [\"1bfc06\", \"highlighter green\"], [\"cafffb\", \"light light blue\"], [\"b6ffbb\", \"light mint\"], [\"a75e09\", \"raw umber\"], [\"152eff\", \"vivid blue\"], [\"8d5eb7\", \"deep lavender\"], [\"5f9e8f\", \"dull teal\"], [\"63f7b4\", \"light greenish blue\"], [\"606602\", \"mud green\"], [\"fc86aa\", \"pinky\"], [\"8c0034\", \"red wine\"], [\"758000\", \"shit green\"], [\"ab7e4c\", \"tan brown\"], [\"030764\", \"darkblue\"], [\"fe86a4\", \"rosa\"], [\"d5174e\", \"lipstick\"], [\"fed0fc\", \"pale mauve\"], [\"680018\", \"claret\"], [\"fedf08\", \"dandelion\"], [\"fe420f\", \"orangered\"], [\"6f7c00\", \"poop green\"], [\"ca0147\", \"ruby\"], [\"1b2431\", \"dark\"], [\"00fbb0\", \"greenish turquoise\"], [\"db5856\", \"pastel red\"], [\"ddd618\", \"piss yellow\"], [\"41fdfe\", \"bright cyan\"], [\"cf524e\", \"dark coral\"], [\"21c36f\", \"algae green\"], [\"a90308\", \"darkish red\"], [\"6e1005\", \"reddy brown\"], [\"fe828c\", \"blush pink\"], [\"4b6113\", \"camouflage green\"], [\"4da409\", \"lawn green\"], [\"beae8a\", \"putty\"], [\"0339f8\", \"vibrant blue\"], [\"a88f59\", \"dark sand\"], [\"5d21d0\", \"purple/blue\"], [\"feb209\", \"saffron\"], [\"4e518b\", \"twilight\"], [\"964e02\", \"warm brown\"], [\"85a3b2\", \"bluegrey\"], [\"ff69af\", \"bubble gum pink\"], [\"c3fbf4\", \"duck egg blue\"], [\"2afeb7\", \"greenish cyan\"], [\"005f6a\", \"petrol\"], [\"0c1793\", \"royal\"], [\"ffff81\", \"butter\"], [\"f0833a\", \"dusty orange\"], [\"f1f33f\", \"off yellow\"], [\"b1d27b\", \"pale olive green\"], [\"fc824a\", \"orangish\"], [\"71aa34\", \"leaf\"], [\"b7c9e2\", \"light blue grey\"], [\"4b0101\", \"dried blood\"], [\"a552e6\", \"lightish purple\"], [\"af2f0d\", \"rusty red\"], [\"8b88f8\", \"lavender blue\"], [\"9af764\", \"light grass green\"], [\"a6fbb2\", \"light mint green\"], [\"ffc512\", \"sunflower\"], [\"750851\", \"velvet\"], [\"c14a09\", \"brick orange\"], [\"fe2f4a\", \"lightish red\"], [\"0203e2\", \"pure blue\"], [\"0a437a\", \"twilight blue\"], [\"a50055\", \"violet red\"], [\"ae8b0c\", \"yellowy brown\"], [\"fd798f\", \"carnation\"], [\"bfac05\", \"muddy yellow\"], [\"3eaf76\", \"dark seafoam green\"], [\"c74767\", \"deep rose\"], [\"b9484e\", \"dusty red\"], [\"647d8e\", \"grey/blue\"], [\"bffe28\", \"lemon lime\"], [\"d725de\", \"purple/pink\"], [\"b29705\", \"brown yellow\"], [\"673a3f\", \"purple brown\"], [\"a87dc2\", \"wisteria\"], [\"fafe4b\", \"banana yellow\"], [\"c0022f\", \"lipstick red\"], [\"0e87cc\", \"water blue\"], [\"8d8468\", \"brown grey\"], [\"ad03de\", \"vibrant purple\"], [\"8cff9e\", \"baby green\"], [\"94ac02\", \"barf green\"], [\"c4fff7\", \"eggshell blue\"], [\"fdee73\", \"sandy yellow\"], [\"33b864\", \"cool green\"], [\"fff9d0\", \"pale\"], [\"758da3\", \"blue/grey\"], [\"f504c9\", \"hot magenta\"], [\"77a1b5\", \"greyblue\"], [\"8756e4\", \"purpley\"], [\"889717\", \"baby shit green\"], [\"c27e79\", \"brownish pink\"], [\"017371\", \"dark aquamarine\"], [\"9f8303\", \"diarrhea\"], [\"f7d560\", \"light mustard\"], [\"bdf6fe\", \"pale sky blue\"], [\"75b84f\", \"turtle green\"], [\"9cbb04\", \"bright olive\"], [\"29465b\", \"dark grey blue\"], [\"696006\", \"greeny brown\"], [\"adf802\", \"lemon green\"], [\"c1c6fc\", \"light periwinkle\"], [\"35ad6b\", \"seaweed green\"], [\"fffd37\", \"sunshine yellow\"], [\"a442a0\", \"ugly purple\"], [\"f36196\", \"medium pink\"], [\"947706\", \"puke brown\"], [\"fff4f2\", \"very light pink\"], [\"1e9167\", \"viridian\"], [\"b5c306\", \"bile\"], [\"feff7f\", \"faded yellow\"], [\"cffdbc\", \"very pale green\"], [\"0add08\", \"vibrant green\"], [\"87fd05\", \"bright lime\"], [\"1ef876\", \"spearmint\"], [\"7bfdc7\", \"light aquamarine\"], [\"bcecac\", \"light sage\"], [\"bbf90f\", \"yellowgreen\"], [\"ab9004\", \"baby poo\"], [\"1fb57a\", \"dark seafoam\"], [\"00555a\", \"deep teal\"], [\"a484ac\", \"heather\"], [\"c45508\", \"rust orange\"], [\"3f829d\", \"dirty blue\"], [\"548d44\", \"fern green\"], [\"c95efb\", \"bright lilac\"], [\"3ae57f\", \"weird green\"], [\"016795\", \"peacock blue\"], [\"87a922\", \"avocado green\"], [\"f0944d\", \"faded orange\"], [\"5d1451\", \"grape purple\"], [\"25ff29\", \"hot green\"], [\"d0fe1d\", \"lime yellow\"], [\"ffa62b\", \"mango\"], [\"01b44c\", \"shamrock\"], [\"ff6cb5\", \"bubblegum\"], [\"6b4247\", \"purplish brown\"], [\"c7c10c\", \"vomit yellow\"], [\"b7fffa\", \"pale cyan\"], [\"aeff6e\", \"key lime\"], [\"ec2d01\", \"tomato red\"], [\"76ff7b\", \"lightgreen\"], [\"730039\", \"merlot\"], [\"040348\", \"night blue\"], [\"df4ec8\", \"purpleish pink\"], [\"6ecb3c\", \"apple\"], [\"8f9805\", \"baby poop green\"], [\"5edc1f\", \"green apple\"], [\"d94ff5\", \"heliotrope\"], [\"c8fd3d\", \"yellow/green\"], [\"070d0d\", \"almost black\"], [\"4984b8\", \"cool blue\"], [\"51b73b\", \"leafy green\"], [\"ac7e04\", \"mustard brown\"], [\"4e5481\", \"dusk\"], [\"876e4b\", \"dull brown\"], [\"58bc08\", \"frog green\"], [\"2fef10\", \"vivid green\"], [\"2dfe54\", \"bright light green\"], [\"0aff02\", \"fluro green\"], [\"9cef43\", \"kiwi\"], [\"18d17b\", \"seaweed\"], [\"35530a\", \"navy green\"], [\"1805db\", \"ultramarine blue\"], [\"6258c4\", \"iris\"], [\"ff964f\", \"pastel orange\"], [\"ffab0f\", \"yellowish orange\"], [\"8f8ce7\", \"perrywinkle\"], [\"24bca8\", \"tealish\"], [\"3f012c\", \"dark plum\"], [\"cbf85f\", \"pear\"], [\"ff724c\", \"pinkish orange\"], [\"280137\", \"midnight purple\"], [\"b36ff6\", \"light urple\"], [\"48c072\", \"dark mint\"], [\"bccb7a\", \"greenish tan\"], [\"a8415b\", \"light burgundy\"], [\"06b1c4\", \"turquoise blue\"], [\"cd7584\", \"ugly pink\"], [\"f1da7a\", \"sandy\"], [\"ff0490\", \"electric pink\"], [\"805b87\", \"muted purple\"], [\"50a747\", \"mid green\"], [\"a8a495\", \"greyish\"], [\"cfff04\", \"neon yellow\"], [\"ffff7e\", \"banana\"], [\"ff7fa7\", \"carnation pink\"], [\"ef4026\", \"tomato\"], [\"3c9992\", \"sea\"], [\"886806\", \"muddy brown\"], [\"04f489\", \"turquoise green\"], [\"fef69e\", \"buff\"], [\"cfaf7b\", \"fawn\"], [\"3b719f\", \"muted blue\"], [\"fdc1c5\", \"pale rose\"], [\"20c073\", \"dark mint green\"], [\"9b5fc0\", \"amethyst\"], [\"0f9b8e\", \"blue/green\"], [\"742802\", \"chestnut\"], [\"9db92c\", \"sick green\"], [\"a4bf20\", \"pea\"], [\"cd5909\", \"rusty orange\"], [\"ada587\", \"stone\"], [\"be013c\", \"rose red\"], [\"b8ffeb\", \"pale aqua\"], [\"dc4d01\", \"deep orange\"], [\"a2653e\", \"earth\"], [\"638b27\", \"mossy green\"], [\"419c03\", \"grassy green\"], [\"b1ff65\", \"pale lime green\"], [\"9dbcd4\", \"light grey blue\"], [\"fdfdfe\", \"pale grey\"], [\"77ab56\", \"asparagus\"], [\"464196\", \"blueberry\"], [\"990147\", \"purple red\"], [\"befd73\", \"pale lime\"], [\"32bf84\", \"greenish teal\"], [\"af6f09\", \"caramel\"], [\"a0025c\", \"deep magenta\"], [\"ffd8b1\", \"light peach\"], [\"7f4e1e\", \"milk chocolate\"], [\"bf9b0c\", \"ocher\"], [\"6ba353\", \"off green\"], [\"f075e6\", \"purply pink\"], [\"7bc8f6\", \"lightblue\"], [\"475f94\", \"dusky blue\"], [\"f5bf03\", \"golden\"], [\"fffeb6\", \"light beige\"], [\"fffd74\", \"butter yellow\"], [\"895b7b\", \"dusky purple\"], [\"436bad\", \"french blue\"], [\"d0c101\", \"ugly yellow\"], [\"c6f808\", \"greeny yellow\"], [\"f43605\", \"orangish red\"], [\"02c14d\", \"shamrock green\"], [\"b25f03\", \"orangish brown\"], [\"2a7e19\", \"tree green\"], [\"490648\", \"deep violet\"], [\"536267\", \"gunmetal\"], [\"5a06ef\", \"blue/purple\"], [\"cf0234\", \"cherry\"], [\"c4a661\", \"sandy brown\"], [\"978a84\", \"warm grey\"], [\"1f0954\", \"dark indigo\"], [\"03012d\", \"midnight\"], [\"2bb179\", \"bluey green\"], [\"c3909b\", \"grey pink\"], [\"a66fb5\", \"soft purple\"], [\"770001\", \"blood\"], [\"922b05\", \"brown red\"], [\"7d7f7c\", \"medium grey\"], [\"990f4b\", \"berry\"], [\"8f7303\", \"poo\"], [\"c83cb9\", \"purpley pink\"], [\"fea993\", \"light salmon\"], [\"acbb0d\", \"snot\"], [\"c071fe\", \"easter purple\"], [\"ccfd7f\", \"light yellow green\"], [\"00022e\", \"dark navy blue\"], [\"828344\", \"drab\"], [\"ffc5cb\", \"light rose\"], [\"ab1239\", \"rouge\"], [\"b0054b\", \"purplish red\"], [\"99cc04\", \"slime green\"], [\"937c00\", \"baby poop\"], [\"019529\", \"irish green\"], [\"ef1de7\", \"pink/purple\"], [\"000435\", \"dark navy\"], [\"42b395\", \"greeny blue\"], [\"9d5783\", \"light plum\"], [\"c8aca9\", \"pinkish grey\"], [\"c87606\", \"dirty orange\"], [\"aa2704\", \"rust red\"], [\"e4cbff\", \"pale lilac\"], [\"fa4224\", \"orangey red\"], [\"0804f9\", \"primary blue\"], [\"5cb200\", \"kermit green\"], [\"76424e\", \"brownish purple\"], [\"6c7a0e\", \"murky green\"], [\"fbdd7e\", \"wheat\"], [\"2a0134\", \"very dark purple\"], [\"044a05\", \"bottle green\"], [\"fd4659\", \"watermelon\"], [\"0d75f8\", \"deep sky blue\"], [\"fe0002\", \"fire engine red\"], [\"cb9d06\", \"yellow ochre\"], [\"fb7d07\", \"pumpkin orange\"], [\"b9cc81\", \"pale olive\"], [\"edc8ff\", \"light lilac\"], [\"61e160\", \"lightish green\"], [\"8ab8fe\", \"carolina blue\"], [\"920a4e\", \"mulberry\"], [\"fe02a2\", \"shocking pink\"], [\"9a3001\", \"auburn\"], [\"65fe08\", \"bright lime green\"], [\"befdb7\", \"celadon\"], [\"b17261\", \"pinkish brown\"], [\"885f01\", \"poo brown\"], [\"02ccfe\", \"bright sky blue\"], [\"c1fd95\", \"celery\"], [\"836539\", \"dirt brown\"], [\"fb2943\", \"strawberry\"], [\"84b701\", \"dark lime\"], [\"b66325\", \"copper\"], [\"7f5112\", \"medium brown\"], [\"5fa052\", \"muted green\"], [\"6dedfd\", \"robin's egg\"], [\"0bf9ea\", \"bright aqua\"], [\"c760ff\", \"bright lavender\"], [\"ffffcb\", \"ivory\"], [\"f6cefc\", \"very light purple\"], [\"155084\", \"light navy\"], [\"f5054f\", \"pink red\"], [\"645403\", \"olive brown\"], [\"7a5901\", \"poop brown\"], [\"a8b504\", \"mustard green\"], [\"3d9973\", \"ocean green\"], [\"000133\", \"very dark blue\"], [\"76a973\", \"dusty green\"], [\"2e5a88\", \"light navy blue\"], [\"0bf77d\", \"minty green\"], [\"bd6c48\", \"adobe\"], [\"ac1db8\", \"barney\"], [\"2baf6a\", \"jade green\"], [\"26f7fd\", \"bright light blue\"], [\"aefd6c\", \"light lime\"], [\"9b8f55\", \"dark khaki\"], [\"ffad01\", \"orange yellow\"], [\"c69c04\", \"ocre\"], [\"f4d054\", \"maize\"], [\"de9dac\", \"faded pink\"], [\"05480d\", \"british racing green\"], [\"c9ae74\", \"sandstone\"], [\"60460f\", \"mud brown\"], [\"98f6b0\", \"light sea green\"], [\"8af1fe\", \"robin egg blue\"], [\"2ee8bb\", \"aqua marine\"], [\"11875d\", \"dark sea green\"], [\"fdb0c0\", \"soft pink\"], [\"b16002\", \"orangey brown\"], [\"f7022a\", \"cherry red\"], [\"d5ab09\", \"burnt yellow\"], [\"86775f\", \"brownish grey\"], [\"c69f59\", \"camel\"], [\"7a687f\", \"purplish grey\"], [\"042e60\", \"marine\"], [\"c88d94\", \"greyish pink\"], [\"a5fbd5\", \"pale turquoise\"], [\"fffe71\", \"pastel yellow\"], [\"6241c7\", \"bluey purple\"], [\"fffe40\", \"canary yellow\"], [\"d3494e\", \"faded red\"], [\"985e2b\", \"sepia\"], [\"a6814c\", \"coffee\"], [\"ff08e8\", \"bright magenta\"], [\"9d7651\", \"mocha\"], [\"feffca\", \"ecru\"], [\"98568d\", \"purpleish\"], [\"9e003a\", \"cranberry\"], [\"287c37\", \"darkish green\"], [\"b96902\", \"brown orange\"], [\"ba6873\", \"dusky rose\"], [\"ff7855\", \"melon\"], [\"94b21c\", \"sickly green\"], [\"c5c9c7\", \"silver\"], [\"661aee\", \"purply blue\"], [\"6140ef\", \"purpleish blue\"], [\"9be5aa\", \"hospital green\"], [\"7b5804\", \"shit brown\"], [\"276ab3\", \"mid blue\"], [\"feb308\", \"amber\"], [\"8cfd7e\", \"easter green\"], [\"6488ea\", \"soft blue\"], [\"056eee\", \"cerulean blue\"], [\"b27a01\", \"golden brown\"], [\"0ffef9\", \"bright turquoise\"], [\"fa2a55\", \"red pink\"], [\"820747\", \"red purple\"], [\"7a6a4f\", \"greyish brown\"], [\"f4320c\", \"vermillion\"], [\"a13905\", \"russet\"], [\"6f828a\", \"steel grey\"], [\"a55af4\", \"lighter purple\"], [\"ad0afd\", \"bright violet\"], [\"004577\", \"prussian blue\"], [\"658d6d\", \"slate green\"], [\"ca7b80\", \"dirty pink\"], [\"005249\", \"dark blue green\"], [\"2b5d34\", \"pine\"], [\"bff128\", \"yellowy green\"], [\"b59410\", \"dark gold\"], [\"2976bb\", \"bluish\"], [\"014182\", \"darkish blue\"], [\"bb3f3f\", \"dull red\"], [\"fc2647\", \"pinky red\"], [\"a87900\", \"bronze\"], [\"82cbb2\", \"pale teal\"], [\"667c3e\", \"military green\"], [\"fe46a5\", \"barbie pink\"], [\"fe83cc\", \"bubblegum pink\"], [\"94a617\", \"pea soup green\"], [\"a88905\", \"dark mustard\"], [\"7f5f00\", \"shit\"], [\"9e43a2\", \"medium purple\"], [\"062e03\", \"very dark green\"], [\"8a6e45\", \"dirt\"], [\"cc7a8b\", \"dusky pink\"], [\"9e0168\", \"red violet\"], [\"fdff38\", \"lemon yellow\"], [\"c0fa8b\", \"pistachio\"], [\"eedc5b\", \"dull yellow\"], [\"7ebd01\", \"dark lime green\"], [\"3b5b92\", \"denim blue\"], [\"01889f\", \"teal blue\"], [\"3d7afd\", \"lightish blue\"], [\"5f34e7\", \"purpley blue\"], [\"6d5acf\", \"light indigo\"], [\"748500\", \"swamp green\"], [\"706c11\", \"brown green\"], [\"3c0008\", \"dark maroon\"], [\"cb00f5\", \"hot purple\"], [\"002d04\", \"dark forest green\"], [\"658cbb\", \"faded blue\"], [\"749551\", \"drab green\"], [\"b9ff66\", \"light lime green\"], [\"9dc100\", \"snot green\"], [\"faee66\", \"yellowish\"], [\"7efbb3\", \"light blue green\"], [\"7b002c\", \"bordeaux\"], [\"c292a1\", \"light mauve\"], [\"017b92\", \"ocean\"], [\"fcc006\", \"marigold\"], [\"657432\", \"muddy green\"], [\"d8863b\", \"dull orange\"], [\"738595\", \"steel\"], [\"aa23ff\", \"electric purple\"], [\"08ff08\", \"fluorescent green\"], [\"9b7a01\", \"yellowish brown\"], [\"f29e8e\", \"blush\"], [\"6fc276\", \"soft green\"], [\"ff5b00\", \"bright orange\"], [\"fdff52\", \"lemon\"], [\"866f85\", \"purple grey\"], [\"8ffe09\", \"acid green\"], [\"eecffe\", \"pale lavender\"], [\"510ac9\", \"violet blue\"], [\"4f9153\", \"light forest green\"], [\"9f2305\", \"burnt red\"], [\"728639\", \"khaki green\"], [\"de0c62\", \"cerise\"], [\"916e99\", \"faded purple\"], [\"ffb16d\", \"apricot\"], [\"3c4d03\", \"dark olive green\"], [\"7f7053\", \"grey brown\"], [\"77926f\", \"green grey\"], [\"010fcc\", \"true blue\"], [\"ceaefa\", \"pale violet\"], [\"8f99fb\", \"periwinkle blue\"], [\"c6fcff\", \"light sky blue\"], [\"5539cc\", \"blurple\"], [\"544e03\", \"green brown\"], [\"017a79\", \"bluegreen\"], [\"01f9c6\", \"bright teal\"], [\"c9b003\", \"brownish yellow\"], [\"929901\", \"pea soup\"], [\"0b5509\", \"forest\"], [\"a00498\", \"barney purple\"], [\"2000b1\", \"ultramarine\"], [\"94568c\", \"purplish\"], [\"c2be0e\", \"puke yellow\"], [\"748b97\", \"bluish grey\"], [\"665fd1\", \"dark periwinkle\"], [\"9c6da5\", \"dark lilac\"], [\"c44240\", \"reddish\"], [\"a24857\", \"light maroon\"], [\"825f87\", \"dusty purple\"], [\"c9643b\", \"terra cotta\"], [\"90b134\", \"avocado\"], [\"01386a\", \"marine blue\"], [\"25a36f\", \"teal green\"], [\"59656d\", \"slate grey\"], [\"75fd63\", \"lighter green\"], [\"21fc0d\", \"electric green\"], [\"5a86ad\", \"dusty blue\"], [\"fec615\", \"golden yellow\"], [\"fffd01\", \"bright yellow\"], [\"dfc5fe\", \"light lavender\"], [\"b26400\", \"umber\"], [\"7f5e00\", \"poop\"], [\"de7e5d\", \"dark peach\"], [\"048243\", \"jungle green\"], [\"ffffd4\", \"eggshell\"], [\"3b638c\", \"denim\"], [\"b79400\", \"yellow brown\"], [\"84597e\", \"dull purple\"], [\"411900\", \"chocolate brown\"], [\"7b0323\", \"wine red\"], [\"04d9ff\", \"neon blue\"], [\"667e2c\", \"dirty green\"], [\"fbeeac\", \"light tan\"], [\"d7fffe\", \"ice blue\"], [\"4e7496\", \"cadet blue\"], [\"874c62\", \"dark mauve\"], [\"d5ffff\", \"very light blue\"], [\"826d8c\", \"grey purple\"], [\"ffbacd\", \"pastel pink\"], [\"d1ffbd\", \"very light green\"], [\"448ee4\", \"dark sky blue\"], [\"05472a\", \"evergreen\"], [\"d5869d\", \"dull pink\"], [\"3d0734\", \"aubergine\"], [\"4a0100\", \"mahogany\"], [\"f8481c\", \"reddish orange\"], [\"02590f\", \"deep green\"], [\"89a203\", \"vomit green\"], [\"e03fd8\", \"purple pink\"], [\"d58a94\", \"dusty pink\"], [\"7bb274\", \"faded green\"], [\"526525\", \"camo green\"], [\"c94cbe\", \"pinky purple\"], [\"db4bda\", \"pink purple\"], [\"9e3623\", \"brownish red\"], [\"b5485d\", \"dark rose\"], [\"735c12\", \"mud\"], [\"9c6d57\", \"brownish\"], [\"028f1e\", \"emerald green\"], [\"b1916e\", \"pale brown\"], [\"49759c\", \"dull blue\"], [\"a0450e\", \"burnt umber\"], [\"39ad48\", \"medium green\"], [\"b66a50\", \"clay\"], [\"8cffdb\", \"light aqua\"], [\"a4be5c\", \"light olive green\"], [\"cb7723\", \"brownish orange\"], [\"05696b\", \"dark aqua\"], [\"ce5dae\", \"purplish pink\"], [\"c85a53\", \"dark salmon\"], [\"96ae8d\", \"greenish grey\"], [\"1fa774\", \"jade\"], [\"7a9703\", \"ugly green\"], [\"ac9362\", \"dark beige\"], [\"01a049\", \"emerald\"], [\"d9544d\", \"pale red\"], [\"fa5ff7\", \"light magenta\"], [\"82cafc\", \"sky\"], [\"acfffc\", \"light cyan\"], [\"fcb001\", \"yellow orange\"], [\"910951\", \"reddish purple\"], [\"fe2c54\", \"reddish pink\"], [\"c875c4\", \"orchid\"], [\"cdc50a\", \"dirty yellow\"], [\"fd411e\", \"orange red\"], [\"9a0200\", \"deep red\"], [\"be6400\", \"orange brown\"], [\"030aa7\", \"cobalt blue\"], [\"fe019a\", \"neon pink\"], [\"f7879a\", \"rose pink\"], [\"887191\", \"greyish purple\"], [\"b00149\", \"raspberry\"], [\"12e193\", \"aqua green\"], [\"fe7b7c\", \"salmon pink\"], [\"ff9408\", \"tangerine\"], [\"6a6e09\", \"brownish green\"], [\"8b2e16\", \"red brown\"], [\"696112\", \"greenish brown\"], [\"e17701\", \"pumpkin\"], [\"0a481e\", \"pine green\"], [\"343837\", \"charcoal\"], [\"ffb7ce\", \"baby pink\"], [\"6a79f7\", \"cornflower\"], [\"5d06e9\", \"blue violet\"], [\"3d1c02\", \"chocolate\"], [\"82a67d\", \"greyish green\"], [\"be0119\", \"scarlet\"], [\"c9ff27\", \"green yellow\"], [\"373e02\", \"dark olive\"], [\"a9561e\", \"sienna\"], [\"caa0ff\", \"pastel purple\"], [\"ca6641\", \"terracotta\"], [\"02d8e9\", \"aqua blue\"], [\"88b378\", \"sage green\"], [\"980002\", \"blood red\"], [\"cb0162\", \"deep pink\"], [\"5cac2d\", \"grass\"], [\"769958\", \"moss\"], [\"a2bffe\", \"pastel blue\"], [\"10a674\", \"bluish green\"], [\"06b48b\", \"green blue\"], [\"af884a\", \"dark tan\"], [\"0b8b87\", \"greenish blue\"], [\"ffa756\", \"pale orange\"], [\"a2a415\", \"vomit\"], [\"154406\", \"forrest green\"], [\"856798\", \"dark lavender\"], [\"34013f\", \"dark violet\"], [\"632de9\", \"purple blue\"], [\"0a888a\", \"dark cyan\"], [\"6f7632\", \"olive drab\"], [\"d46a7e\", \"pinkish\"], [\"1e488f\", \"cobalt\"], [\"bc13fe\", \"neon purple\"], [\"7ef4cc\", \"light turquoise\"], [\"76cd26\", \"apple green\"], [\"74a662\", \"dull green\"], [\"80013f\", \"wine\"], [\"b1d1fc\", \"powder blue\"], [\"ffffe4\", \"off white\"], [\"0652ff\", \"electric blue\"], [\"045c5a\", \"dark turquoise\"], [\"5729ce\", \"blue purple\"], [\"069af3\", \"azure\"], [\"ff000d\", \"bright red\"], [\"f10c45\", \"pinkish red\"], [\"5170d7\", \"cornflower blue\"], [\"acbf69\", \"light olive\"], [\"6c3461\", \"grape\"], [\"5e819d\", \"greyish blue\"], [\"601ef9\", \"purplish blue\"], [\"b0dd16\", \"yellowish green\"], [\"cdfd02\", \"greenish yellow\"], [\"2c6fbb\", \"medium blue\"], [\"c0737a\", \"dusty rose\"], [\"d6b4fc\", \"light violet\"], [\"020035\", \"midnight blue\"], [\"703be7\", \"bluish purple\"], [\"fd3c06\", \"red orange\"], [\"960056\", \"dark magenta\"], [\"40a368\", \"greenish\"], [\"03719c\", \"ocean blue\"], [\"fc5a50\", \"coral\"], [\"ffffc2\", \"cream\"], [\"7f2b0a\", \"reddish brown\"], [\"b04e0f\", \"burnt sienna\"], [\"a03623\", \"brick\"], [\"87ae73\", \"sage\"], [\"789b73\", \"grey green\"], [\"ffffff\", \"white\"], [\"98eff9\", \"robin's egg blue\"], [\"658b38\", \"moss green\"], [\"5a7d9a\", \"steel blue\"], [\"380835\", \"eggplant\"], [\"fffe7a\", \"light yellow\"], [\"5ca904\", \"leaf green\"], [\"d8dcd6\", \"light grey\"], [\"a5a502\", \"puke\"], [\"d648d7\", \"pinkish purple\"], [\"047495\", \"sea blue\"], [\"b790d4\", \"pale purple\"], [\"5b7c99\", \"slate blue\"], [\"607c8e\", \"blue grey\"], [\"0b4008\", \"hunter green\"], [\"ed0dd9\", \"fuchsia\"], [\"8c000f\", \"crimson\"], [\"ffff84\", \"pale yellow\"], [\"bf9005\", \"ochre\"], [\"d2bd0a\", \"mustard yellow\"], [\"ff474c\", \"light red\"], [\"0485d1\", \"cerulean\"], [\"ffcfdc\", \"pale pink\"], [\"040273\", \"deep blue\"], [\"a83c09\", \"rust\"], [\"90e4c1\", \"light teal\"], [\"516572\", \"slate\"], [\"fac205\", \"goldenrod\"], [\"d5b60a\", \"dark yellow\"], [\"363737\", \"dark grey\"], [\"4b5d16\", \"army green\"], [\"6b8ba4\", \"grey blue\"], [\"80f9ad\", \"seafoam\"], [\"a57e52\", \"puce\"], [\"a9f971\", \"spring green\"], [\"c65102\", \"dark orange\"], [\"e2ca76\", \"sand\"], [\"b0ff9d\", \"pastel green\"], [\"9ffeb0\", \"mint\"], [\"fdaa48\", \"light orange\"], [\"fe01b1\", \"bright pink\"], [\"c1f80a\", \"chartreuse\"], [\"36013f\", \"deep purple\"], [\"341c02\", \"dark brown\"], [\"b9a281\", \"taupe\"], [\"8eab12\", \"pea green\"], [\"9aae07\", \"puke green\"], [\"02ab2e\", \"kelly green\"], [\"7af9ab\", \"seafoam green\"], [\"137e6d\", \"blue green\"], [\"aaa662\", \"khaki\"], [\"610023\", \"burgundy\"], [\"014d4e\", \"dark teal\"], [\"8f1402\", \"brick red\"], [\"4b006e\", \"royal purple\"], [\"580f41\", \"plum\"], [\"8fff9f\", \"mint green\"], [\"dbb40c\", \"gold\"], [\"a2cffe\", \"baby blue\"], [\"c0fb2d\", \"yellow green\"], [\"be03fd\", \"bright purple\"], [\"840000\", \"dark red\"], [\"d0fefe\", \"pale blue\"], [\"3f9b0b\", \"grass green\"], [\"01153e\", \"navy\"], [\"04d8b2\", \"aquamarine\"], [\"c04e01\", \"burnt orange\"], [\"0cff0c\", \"neon green\"], [\"0165fc\", \"bright blue\"], [\"cf6275\", \"rose\"], [\"ffd1df\", \"light pink\"], [\"ceb301\", \"mustard\"], [\"380282\", \"indigo\"], [\"aaff32\", \"lime\"], [\"53fca1\", \"sea green\"], [\"8e82fe\", \"periwinkle\"], [\"cb416b\", \"dark pink\"], [\"677a04\", \"olive green\"], [\"ffb07c\", \"peach\"], [\"c7fdb5\", \"pale green\"], [\"ad8150\", \"light brown\"], [\"ff028d\", \"hot pink\"], [\"000000\", \"black\"], [\"cea2fd\", \"lilac\"], [\"001146\", \"navy blue\"], [\"0504aa\", \"royal blue\"], [\"e6daa6\", \"beige\"], [\"ff796c\", \"salmon\"], [\"6e750e\", \"olive\"], [\"650021\", \"maroon\"], [\"01ff07\", \"bright green\"], [\"35063e\", \"dark purple\"], [\"ae7181\", \"mauve\"], [\"06470c\", \"forest green\"], [\"13eac9\", \"aqua\"], [\"00ffff\", \"cyan\"], [\"d1b26f\", \"tan\"], [\"00035b\", \"dark blue\"], [\"c79fef\", \"lavender\"], [\"06c2ac\", \"turquoise\"], [\"033500\", \"dark green\"], [\"9a0eea\", \"violet\"], [\"bf77f6\", \"light purple\"], [\"89fe05\", \"lime green\"], [\"929591\", \"grey\"], [\"75bbfd\", \"sky blue\"], [\"ffff14\", \"yellow\"], [\"c20078\", \"magenta\"], [\"96f97b\", \"light green\"], [\"f97306\", \"orange\"], [\"029386\", \"teal\"], [\"95d0fc\", \"light blue\"], [\"e50000\", \"red\"], [\"653700\", \"brown\"], [\"ff81c0\", \"pink\"], [\"0343df\", \"blue\"], [\"15b01a\", \"green\"], [\"7e1e9c\", \"purple\"], [\"FF5E99\", \"paul irish pink\"], [\"00000000\", \"transparent\"]];\n names.each(function(element) {\n return lookup[normalizeKey(element[1])] = parseHex(element[0]);\n });\n /**\n returns a random color.\n\n <code><pre>\n Color.random().toString()\n # => 'rgba(213, 144, 202, 1)'\n\n Color.random().toString()\n # => 'rgba(1, 211, 24, 1)'\n </pre></code>\n\n @name random\n @methodOf Color\n\n @returns {Color} A random color. \n */\n Color.random = function() {\n return Color(rand(256), rand(256), rand(256));\n };\n /**\n Mix two colors. Behaves just like `#mixWith` except that you are passing two colors.\n\n <code><pre>\n red = Color(255, 0, 0)\n yellow = Color(255, 255, 0)\n\n # With no amount argument the colors are mixed evenly\n orange = Color.mix(red, yellow)\n\n orange.toString()\n # => 'rgba(255, 128, 0, 1)' \n\n # With an amount of 0.3 we are mixing the color 30% red and 70% yellow\n somethingCloseToOrange = Color.mix(red, yellow, 0.3)\n\n somethingCloseToOrange.toString()\n # => rgba(255, 179, 0, 1)\n </pre></code>\n\n @name mix\n @methodOf Color\n @see Color#mixWith\n @param {Color} color1 the first color to mix\n @param {Color} color2 the second color to mix\n @param {Number} amount the ratio to mix the colors \n\n @returns {Color} A new color that is the two colors mixed at the ratio defined by `amount` \n */\n Color.mix = function(color1, color2, amount) {\n var newColors;\n amount || (amount = 0.5);\n newColors = [color1.r, color1.g, color1.b, color1.a].zip([color2.r, color2.g, color2.b, color2.a]).map(function(array) {\n return (array[0] * amount) + (array[1] * (1 - amount));\n });\n return Color(newColors);\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Color\"] = Color;\n})();;\n/**\nThe Drawable module is used to provide a simple draw method to the including\nobject.\n\nBinds a default draw listener to draw a rectangle or a sprite, if one exists.\n\nBinds a step listener to update the transform of the object.\n\nAutoloads the sprite specified in I.spriteName, if any.\n\n<code><pre>\nplayer = Core\n x: 15\n y: 30\n width: 5\n height: 5\n sprite: \"my_cool_sprite\"\n\nengine.bind 'draw', (canvas) ->\n player.draw(canvas) \n# => Uncaught TypeError: Object has no method 'draw'\n\nplayer.include(Drawable)\n\nengine.bind 'draw', (canvas) ->\n player.draw(canvas)\n# => if you have a sprite named \"my_cool_sprite\" in your images folder\n# then it will be drawn. Otherwise, a rectangle positioned at x: 15 and\n# y: 30 with width and height 5 will be drawn.\n</pre></code>\n\n@name Drawable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/\n/**\nTriggered every time the object should be drawn. A canvas is passed as\nthe first argument. \n\n<code><pre>\nplayer = Core\n x: 0\n y: 10\n width: 5\n height: 5\n\nplayer.bind \"draw\", (canvas) ->\n # Text will be drawn positioned relatively to the object.\n canvas.drawText\n text: \"Hey, drawing stuff is pretty easy.\"\n color: \"white\"\n x: 5\n y: 5\n</pre></code>\n\n@name draw\n@methodOf Drawable#\n@event\n@param {PowerCanvas} canvas A reference to the canvas to draw on.\n*/\n/**\nTriggered before the object should be drawn. A canvas is passed as\nthe first argument. This does not apply the current transform.\n\n@name beforeTransform\n@methodOf Drawable#\n@event\n@param {PowerCanvas} canvas A reference to the canvas to draw on.\n*/\n/**\nTriggered after the object should be drawn. A canvas is passed as\nthe first argument. This applies the current transform.\n\n@name afterTransform\n@methodOf Drawable#\n@event\n@param {PowerCanvas} canvas A reference to the canvas to draw on.\n*/var Drawable;\nDrawable = function(I, self) {\n var _ref;\n I || (I = {});\n Object.reverseMerge(I, {\n color: \"#196\",\n hflip: false,\n vflip: false,\n spriteName: null,\n zIndex: 0\n });\n if ((_ref = I.sprite) != null ? typeof _ref.isString === \"function\" ? _ref.isString() : void 0 : void 0) {\n I.sprite = Sprite.loadByName(I.sprite, function(sprite) {\n I.width = sprite.width;\n return I.height = sprite.height;\n });\n } else if (I.spriteName) {\n I.sprite = Sprite.loadByName(I.spriteName, function(sprite) {\n I.width = sprite.width;\n return I.height = sprite.height;\n });\n }\n self.bind('draw', function(canvas) {\n var sprite;\n if (sprite = I.sprite) {\n if (sprite.draw != null) {\n return sprite.draw(canvas, -sprite.width / 2, -sprite.height / 2);\n } else {\n return typeof warn === \"function\" ? warn(\"Sprite has no draw method!\") : void 0;\n }\n } else {\n if (I.radius != null) {\n return canvas.drawCircle({\n x: 0,\n y: 0,\n radius: I.radius,\n color: I.color\n });\n } else {\n return canvas.drawRect({\n x: -I.width / 2,\n y: -I.height / 2,\n width: I.width,\n height: I.height,\n color: I.color\n });\n }\n }\n });\n return {\n /**\n Draw does not actually do any drawing itself, instead it triggers all of the draw events.\n Listeners on the events do the actual drawing.\n\n @name draw\n @methodOf Drawable#\n @returns self\n */\n draw: function(canvas) {\n self.trigger('beforeTransform', canvas);\n canvas.withTransform(self.transform(), function(canvas) {\n return self.trigger('draw', canvas);\n });\n self.trigger('afterTransform', canvas);\n return self;\n },\n /**\n Returns the current transform, with translation, rotation, and flipping applied.\n\n @name transform\n @methodOf Drawable#\n @returns {Matrix} The current transform\n */\n transform: function() {\n var center, transform;\n center = self.center();\n transform = Matrix.translation(center.x, center.y);\n if (I.rotation) {\n transform = transform.concat(Matrix.rotation(I.rotation));\n }\n if (I.hflip) {\n transform = transform.concat(Matrix.HORIZONTAL_FLIP);\n }\n if (I.vflip) {\n transform = transform.concat(Matrix.VERTICAL_FLIP);\n }\n if (I.spriteOffset) {\n transform = transform.concat(Matrix.translation(I.spriteOffset.x, I.spriteOffset.y));\n }\n return transform;\n }\n };\n};;\n/**\nThe Durable module deactives a <code>GameObject</code> after a specified duration.\nIf a duration is specified the object will update that many times. If -1 is\nspecified the object will have an unlimited duration.\n\n<code><pre>\nenemy = GameObject\n x: 50\n y: 30\n duration: 5\n\nenemy.include(Durable)\n\nenemy.I.active\n# => true\n\n5.times ->\n enemy.update()\n\nenemy.I.active\n# => false\n</pre></code>\n\n@name Durable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Durable;\nDurable = function(I) {\n Object.reverseMerge(I, {\n duration: -1\n });\n return {\n before: {\n update: function() {\n if (I.duration !== -1 && I.age >= I.duration) {\n return I.active = false;\n }\n }\n }\n };\n};;\nvar Emitter;\nEmitter = function(I) {\n var self;\n self = GameObject(I);\n return self.include(Emitterable);\n};;\nvar Emitterable;\nEmitterable = function(I, self) {\n var n, particles;\n I || (I = {});\n Object.reverseMerge(I, {\n batchSize: 1,\n emissionRate: 1,\n color: \"blue\",\n width: 0,\n height: 0,\n generator: {},\n particleCount: Infinity,\n particleData: {\n acceleration: Point(0, 0.1),\n age: 0,\n color: \"blue\",\n duration: 30,\n includedModules: [\"Movable\"],\n height: 2,\n maxSpeed: 2,\n offset: Point(0, 0),\n sprite: false,\n spriteName: false,\n velocity: Point(-0.25, 1),\n width: 2\n }\n });\n particles = [];\n n = 0;\n return {\n before: {\n draw: function(canvas) {\n return particles.invoke(\"draw\", canvas);\n },\n update: function() {\n I.batchSize.times(function() {\n var center, key, particleProperties, value, _ref;\n if (n < I.particleCount && rand() < I.emissionRate) {\n center = self.center();\n particleProperties = Object.reverseMerge({\n x: center.x,\n y: center.y\n }, I.particleData);\n _ref = I.generator;\n for (key in _ref) {\n value = _ref[key];\n if (I.generator[key].call) {\n particleProperties[key] = I.generator[key](n, I);\n } else {\n particleProperties[key] = I.generator[key];\n }\n }\n particleProperties.x += particleProperties.offset.x;\n particleProperties.y += particleProperties.offset.y;\n particles.push(GameObject(particleProperties));\n return n += 1;\n }\n });\n particles = particles.select(function(particle) {\n return particle.update();\n });\n if (n === I.particleCount && !particles.length) {\n return I.active = false;\n }\n }\n }\n };\n};;\n(function() {\n var Engine, defaults;\n defaults = {\n FPS: 30,\n age: 0,\n ambientLight: 1,\n backgroundColor: \"#00010D\",\n cameraTransform: Matrix.IDENTITY,\n clear: false,\n excludedModules: [],\n includedModules: [],\n paused: false,\n showFPS: false,\n zSort: false\n };\n /**\n The Engine controls the game world and manages game state. Once you \n set it up and let it run it pretty much takes care of itself.\n\n You can use the engine to add or remove objects from the game world.\n\n There are several modules that can include to add additional capabilities \n to the engine.\n\n The engine fires events that you may bind listeners to. Event listeners \n may be bound with <code>engine.bind(eventName, callback)</code>\n\n @name Engine\n @constructor\n @param {Object} I Instance variables of the engine \n */\n /**\n Observe or modify the \n entity data before it is added to the engine.\n @name beforeAdd\n @methodOf Engine#\n @event\n @param {Object} entityData\n */\n /**\n Observe or configure a <code>gameObject</code> that has been added \n to the engine.\n @name afterAdd\n @methodOf Engine#\n @event\n @param {GameObject} object The object that has just been added to the\n engine.\n */\n /**\n Called when the engine updates all the game objects.\n\n @name update\n @methodOf Engine#\n @event\n */\n /**\n Called after the engine completes an update. Here it is \n safe to modify the game objects array.\n\n @name afterUpdate\n @methodOf Engine#\n @event\n */\n /**\n Called before the engine draws the game objects on the canvas. The current camera transform is applied.\n\n @name beforeDraw\n @methodOf Engine#\n @event\n @params {PixieCanvas} canvas A reference to the canvas to draw on.\n */\n /**\n Called after the engine draws on the canvas. The current camera transform is applied.\n\n <code><pre>\n engine.bind \"draw\", (canvas) ->\n # print some directions for the player\n canvas.drawText\n text: \"Go this way =>\"\n x: 200\n y: 200 \n </pre></code>\n\n @name draw\n @methodOf Engine#\n @event\n @params {PixieCanvas} canvas A reference to the canvas to draw on.\n */\n /**\n Called after the engine draws.\n\n The current camera transform is not applied. This is great for\n adding overlays.\n\n <code><pre>\n engine.bind \"overlay\", (canvas) ->\n # print the player's health. This will be\n # positioned absolutely according to the viewport.\n canvas.drawText\n text: \"HEALTH:\"\n position: Point(20, 20)\n\n canvas.drawText\n text: player.health()\n position: Point(50, 20)\n </pre></code>\n\n @name overlay\n @methodOf Engine#\n @event\n @params {PixieCanvas} canvas A reference to the canvas to draw on. \n */\n Engine = function(I) {\n var animLoop, defaultModules, draw, frameAdvance, lastStepTime, modules, queuedObjects, running, self, startTime, step, update;\n I || (I = {});\n Object.reverseMerge(I, {\n objects: []\n }, defaults);\n frameAdvance = false;\n queuedObjects = [];\n running = false;\n startTime = +new Date();\n lastStepTime = -Infinity;\n animLoop = function(timestamp) {\n var delta, msPerFrame, remainder;\n timestamp || (timestamp = +new Date());\n msPerFrame = 1000 / I.FPS;\n delta = timestamp - lastStepTime;\n remainder = delta - msPerFrame;\n if (remainder > 0) {\n lastStepTime = timestamp - Math.min(remainder, msPerFrame);\n step();\n }\n if (running) {\n return window.requestAnimationFrame(animLoop);\n }\n };\n update = function() {\n var toRemove, _ref;\n if (typeof updateKeys === \"function\") {\n updateKeys();\n }\n self.trigger(\"update\");\n _ref = I.objects.partition(function(object) {\n return object.update();\n }), I.objects = _ref[0], toRemove = _ref[1];\n toRemove.invoke(\"trigger\", \"remove\");\n I.objects = I.objects.concat(queuedObjects);\n queuedObjects = [];\n return self.trigger(\"afterUpdate\");\n };\n draw = function() {\n if (!I.canvas) {\n return;\n }\n if (I.clear) {\n I.canvas.clear();\n } else if (I.backgroundColor) {\n I.canvas.fill(I.backgroundColor);\n }\n I.canvas.withTransform(I.cameraTransform, function(canvas) {\n var drawObjects;\n self.trigger(\"beforeDraw\", canvas);\n if (I.zSort) {\n drawObjects = I.objects.copy().sort(function(a, b) {\n return a.I.zIndex - b.I.zIndex;\n });\n } else {\n drawObjects = I.objects;\n }\n drawObjects.invoke(\"draw\", canvas);\n return self.trigger(\"draw\", I.canvas);\n });\n return self.trigger(\"overlay\", I.canvas);\n };\n step = function() {\n if (!I.paused || frameAdvance) {\n update();\n I.age += 1;\n }\n return draw();\n };\n self = Core(I).extend({\n /**\n The add method creates and adds an object to the game world. Two\n other events are triggered around this one: beforeAdd and afterAdd.\n\n <code><pre>\n # you can add arbitrary entityData and\n # the engine will make it into a GameObject\n engine.add \n x: 50\n y: 30\n color: \"red\"\n\n player = engine.add\n class: \"Player\"\n </pre></code>\n\n @name add\n @methodOf Engine#\n @param {Object} entityData The data used to create the game object.\n @returns {GameObject}\n */\n add: function(entityData) {\n var object;\n self.trigger(\"beforeAdd\", entityData);\n object = GameObject.construct(entityData);\n object.create();\n self.trigger(\"afterAdd\", object);\n if (running && !I.paused) {\n queuedObjects.push(object);\n } else {\n I.objects.push(object);\n }\n return object;\n },\n objectAt: function(x, y) {\n var bounds, targetObject;\n targetObject = null;\n bounds = {\n x: x,\n y: y,\n width: 1,\n height: 1\n };\n self.eachObject(function(object) {\n if (object.collides(bounds)) {\n return targetObject = object;\n }\n });\n return targetObject;\n },\n eachObject: function(iterator) {\n return I.objects.each(iterator);\n },\n /**\n Start the game simulation.\n\n <code><pre>\n engine.start()\n </pre></code>\n\n @methodOf Engine#\n @name start\n */\n start: function() {\n if (!running) {\n running = true;\n return window.requestAnimationFrame(animLoop);\n }\n },\n /**\n Stop the simulation.\n\n <code><pre>\n engine.stop()\n </pre></code>\n\n @methodOf Engine#\n @name stop\n */\n stop: function() {\n return running = false;\n },\n /**\n Pause the game and step through 1 update of the engine.\n\n <code><pre>\n engine.frameAdvance()\n </pre></code>\n\n @methodOf Engine#\n @name frameAdvance\n */\n frameAdvance: function() {\n I.paused = true;\n frameAdvance = true;\n step();\n return frameAdvance = false;\n },\n /**\n Resume the game.\n\n <code><pre>\n engine.play()\n </pre></code>\n\n @methodOf Engine#\n @name play\n */\n play: function() {\n return I.paused = false;\n },\n /**\n Toggle the paused state of the simulation.\n\n <code><pre>\n engine.pause()\n </pre></code>\n\n @methodOf Engine#\n @name pause\n @param {Boolean} [setTo] Force to pause by passing true or unpause by passing false.\n */\n pause: function(setTo) {\n if (setTo != null) {\n return I.paused = setTo;\n } else {\n return I.paused = !I.paused;\n }\n },\n /**\n Query the engine to see if it is paused.\n\n <code><pre>\n engine.pause()\n\n engine.paused()\n => true\n\n engine.play()\n\n engine.paused()\n => false\n </pre></code>\n\n @methodOf Engine#\n @name paused\n */\n paused: function() {\n return I.paused;\n },\n /**\n Change the framerate of the game. The default framerate is 30 fps.\n\n <code><pre>\n engine.setFramerate(60)\n </pre></code>\n\n @methodOf Engine#\n @name setFramerate\n */\n setFramerate: function(newFPS) {\n I.FPS = newFPS;\n self.stop();\n return self.start();\n },\n update: update,\n draw: draw\n });\n self.attrAccessor(\"ambientLight\", \"backgroundColor\", \"cameraTransform\", \"clear\");\n self.include(Bindable);\n defaultModules = [\"Delay\", \"SaveState\", \"Selector\", \"Collision\"];\n modules = defaultModules.concat(I.includedModules);\n modules = modules.without([].concat(I.excludedModules));\n modules.each(function(moduleName) {\n if (!Engine[moduleName]) {\n throw \"#Engine.\" + moduleName + \" is not a valid engine module\";\n }\n return self.include(Engine[moduleName]);\n });\n self.trigger(\"init\");\n return self;\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Engine\"] = Engine;\n})();;\nEngine.Camera = function(I, self) {\n var currentObject, currentOptions, currentType, followTypes;\n currentType = \"centered\";\n currentOptions = {};\n currentObject = null;\n followTypes = {\n centered: function(object, options) {\n return Matrix.translation(App.width / 2 - object.I.x, App.height / 2 - object.I.y);\n }\n };\n self.bind(\"afterUpdate\", function() {\n if (currentObject) {\n return I.cameraTransform = followTypes[currentType](currentObject, currentOptions);\n }\n });\n return {\n follow: function(object, type, options) {\n currentObject = object;\n currentType = type;\n return currentOptions = options;\n }\n };\n};;\n/**\nThe <code>Collision</code> module provides some simple collision detection methods to engine.\n\n@name Collision\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Collision = function(I, self) {\n return {\n /**\n Detects collisions between a bounds and the game objects.\n\n @name collides\n @methodOf Engine#\n @param bounds The bounds to check collisions with.\n @param [sourceObject] An object to exclude from the results.\n @returns {Boolean} true if the bounds object collides with any of the game objects, false otherwise.\n */\n collides: function(bounds, sourceObject) {\n return I.objects.inject(false, function(collided, object) {\n return collided || (object.solid() && (object !== sourceObject) && object.collides(bounds));\n });\n },\n /**\n Detects collisions between a bounds and the game objects. \n Returns an array of objects colliding with the bounds provided.\n\n @name collidesWith\n @methodOf Engine#\n @param bounds The bounds to check collisions with.\n @param [sourceObject] An object to exclude from the results.\n @returns {Array} An array of objects that collide with the given bounds.\n */\n collidesWith: function(bounds, sourceObject) {\n var collided;\n collided = [];\n I.objects.each(function(object) {\n if (!object.solid()) {\n return;\n }\n if (object !== sourceObject && object.collides(bounds)) {\n return collided.push(object);\n }\n });\n if (collided.length) {\n return collided;\n }\n },\n /**\n Detects collisions between a ray and the game objects.\n\n @name rayCollides\n @methodOf Engine#\n @param source The origin point\n @param direction A point representing the direction of the ray\n @param [sourceObject] An object to exclude from the results.\n */\n rayCollides: function(source, direction, sourceObject) {\n var hits, nearestDistance, nearestHit;\n hits = I.objects.map(function(object) {\n var hit;\n hit = object.solid() && (object !== sourceObject) && Collision.rayRectangle(source, direction, object.centeredBounds());\n if (hit) {\n hit.object = object;\n }\n return hit;\n });\n nearestDistance = Infinity;\n nearestHit = null;\n hits.each(function(hit) {\n var d;\n if (hit && (d = hit.distance(source)) < nearestDistance) {\n nearestDistance = d;\n return nearestHit = hit;\n }\n });\n return nearestHit;\n }\n };\n};;\n/**\nThe <code>Delay</code> module provides methods to trigger events after a number of steps have passed.\n\n@name Delay\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Delay = function(I, self) {\n var delayedEvents;\n delayedEvents = [];\n self.bind('afterUpdate', function() {\n var firingEvents, _ref;\n _ref = delayedEvents.partition(function(event) {\n return (event.delay -= 1) >= 0;\n }), delayedEvents = _ref[0], firingEvents = _ref[1];\n firingEvents.each(function(event) {\n return event.callback();\n });\n });\n return {\n /**\n Execute a callback after a number of steps have passed.\n\n <code><pre>\n engine.delay 5, ->\n engine.add\n class: \"Ghost\"\n </pre></code>\n\n @name delay\n @methodOf Engine#\n @param {Number} steps The number of steps to wait before executing the callback\n @param {Function} callback The callback to be executed.\n\n @returns {Engine} self\n */\n delay: function(steps, callback) {\n delayedEvents.push({\n delay: steps,\n callback: callback\n });\n return self;\n }\n };\n};;\n/**\nThe <code>SaveState</code> module provides methods to save and restore the current engine state.\n\n@name SaveState\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.SaveState = function(I, self) {\n var savedState;\n savedState = null;\n return {\n rewind: function() {},\n /**\n Save the current game state and returns a JSON object representing that state.\n\n <code><pre>\n engine.bind 'update', ->\n if justPressed.s\n engine.saveState()\n </pre></code>\n\n @name saveState\n @methodOf Engine#\n @returns {Array} An array of the instance data of all objects in the game\n */\n saveState: function() {\n return savedState = I.objects.map(function(object) {\n return Object.extend({}, object.I);\n });\n },\n /**\n Loads the game state passed in, or the last saved state, if any.\n\n <code><pre>\n engine.bind 'update', ->\n if justPressed.l\n # loads the last saved state\n engine.loadState()\n\n if justPressed.o\n # removes all game objects, then reinstantiates \n # them with the entityData passed in\n engine.loadState([{x: 40, y: 50, class: \"Player\"}, {x: 0, y: 0, class: \"Enemy\"}, {x: 500, y: 400, class: \"Boss\"}])\n </pre></code>\n\n @name loadState\n @methodOf Engine#\n @param [newState] The game state to load.\n */\n loadState: function(newState) {\n if (newState || (newState = savedState)) {\n I.objects.invoke(\"trigger\", \"remove\");\n I.objects = [];\n return newState.each(function(objectData) {\n return self.add(Object.extend({}, objectData));\n });\n }\n },\n /**\n Reloads the current engine state, useful for hotswapping code.\n\n <code><pre>\n engine.I.objects.each (object) ->\n # bring all objects to (0, 0) for some reason\n object.I.x = 0\n object.I.y = 0\n\n # reload all objects to make sure\n # they are at (0, 0) \n engine.reload()\n </pre></code>\n\n @name reload\n @methodOf Engine#\n */\n reload: function() {\n var oldObjects;\n oldObjects = I.objects;\n I.objects = [];\n return oldObjects.each(function(object) {\n object.trigger(\"remove\");\n return self.add(object.I);\n });\n }\n };\n};;\n/**\nThe <code>Selector</code> module provides methods to query the engine to find game objects.\n\n@name Selector\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Selector = function(I, self) {\n var instanceMethods;\n instanceMethods = {\n set: function(attr, value) {\n return this.each(function(item) {\n return item.I[attr] = value;\n });\n }\n };\n return {\n /**\n Get a selection of GameObjects that match the specified selector criteria. The selector language\n can select objects by id, class, or attributes. Note that this method always returns an Array,\n so if you are trying to find only one object you will need something like <code>engine.find(\"Enemy\").first()</code>.\n\n <code><pre>\n player = engine.add\n class: \"Player\"\n\n enemy = engine.add\n class: \"Enemy\"\n speed: 5\n x: 0\n\n distantEnemy = engine.add\n class \"Enemy\"\n x: 500\n\n boss = engine.add\n class: \"Enemy\"\n id: \"Boss\"\n x: 0\n\n # to select an object by id use \"#anId\"\n engine.find \"#Boss\"\n # => [boss]\n\n # to select an object by class use \"MyClass\"\n engine.find \"Enemy\"\n # => [enemy, distantEnemy, boss]\n\n # to select an object by properties use \".someProperty\" or \".someProperty=someValue\"\n engine.find \".speed=5\"\n # => [enemy]\n\n # You may mix and match selectors.\n engine.find \"Enemy.x=0\"\n # => [enemy, boss] # doesn't return distantEnemy\n </pre></code>\n\n @name find\n @methodOf Engine#\n @param {String} selector\n @returns {Array} An array of the objects found\n */\n find: function(selector) {\n var matcher, results;\n results = [];\n matcher = Engine.Selector.generate(selector);\n I.objects.each(function(object) {\n if (matcher.match(object)) {\n return results.push(object);\n }\n });\n return Object.extend(results, instanceMethods);\n }\n };\n};\nObject.extend(Engine.Selector, {\n parse: function(selector) {\n return selector.split(\",\").invoke(\"trim\");\n },\n process: function(item) {\n var result;\n result = /^(\\w+)?#?([\\w\\-]+)?\\.?([\\w\\-]+)?=?([\\w\\-]+)?/.exec(item);\n if (result) {\n if (result[4]) {\n result[4] = result[4].parse();\n }\n return result.splice(1);\n } else {\n return [];\n }\n },\n generate: function(selector) {\n var ATTR, ATTR_VALUE, ID, TYPE, components;\n components = Engine.Selector.parse(selector).map(function(piece) {\n return Engine.Selector.process(piece);\n });\n TYPE = 0;\n ID = 1;\n ATTR = 2;\n ATTR_VALUE = 3;\n return {\n match: function(object) {\n var attr, attrMatch, component, idMatch, typeMatch, value, _i, _len;\n for (_i = 0, _len = components.length; _i < _len; _i++) {\n component = components[_i];\n idMatch = (component[ID] === object.I.id) || !component[ID];\n typeMatch = (component[TYPE] === object.I[\"class\"]) || !component[TYPE];\n if (attr = component[ATTR]) {\n if ((value = component[ATTR_VALUE]) != null) {\n attrMatch = object.I[attr] === value;\n } else {\n attrMatch = object.I[attr];\n }\n } else {\n attrMatch = true;\n }\n if (idMatch && typeMatch && attrMatch) {\n return true;\n }\n }\n return false;\n }\n };\n }\n});;\n/**\nThe <code>Stats</code> module provides methods to query the engine to find game objects.\n\n@name Stats\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Stats = function(I, self) {\n return {\n measure: function(objects, field, frequency) {\n if (frequency == null) {\n frequency = 30;\n }\n },\n gatherData: function() {\n return self.find();\n }\n };\n};;\n/**\nThe default base class for all objects you can add to the engine.\n\nGameObjects fire events that you may bind listeners to. Event listeners \nmay be bound with <code>object.bind(eventName, callback)</code>\n\n@name GameObject\n@extends Core\n@constructor\n@instanceVariables age, active, created, destroyed, solid, includedModules, excludedModules\n*/\n/**\nTriggered when the object is created.\n\n<code><pre>\nenemyCount = 0\n\nenemy = engine.add\n class: \"Enemy\"\n\nenemy.bind 'create', ->\n enemyCount++\n</pre></code>\n\n@name create\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered when object is destroyed. Use \nthe destroy event to add particle effects, play sounds, etc.\n\n<code><pre>\nbomb = GameObject()\n\nbomb.bind 'destroy', ->\n bomb.explode()\n Sound.play \"Kaboom\"\n</pre></code>\n\n@name destroy\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered during every update step.\n\n<code><pre>\nplayer = GameObject()\n\nplayer.bind 'step', ->\n # check to see if keys are being pressed and \n # change the player's velocity\n if keydown.left\n player.velocity(Point(-1, 0))\n else if keydown.right\n player.velocity(Point(1, 0))\n else\n player.velocity(Point(0, 0))\n</pre></code>\n\n@name step\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered every update after the <code>step</code> event is triggered.\n\n<code><pre>\nplayer = GameObject()\n\n# we can really use the update and \n# step events almost interchangebly\nplayer.bind 'update', ->\n # check to see if keys are being pressed and \n # change the player's velocity\n if keydown.left\n player.velocity(Point(-1, 0))\n else if keydown.right\n player.velocity(Point(1, 0))\n else\n player.velocity(Point(0, 0))\n</pre></code>\n\n@name update\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered when the object is removed from\nthe engine. Use the remove event to handle any clean up.\n\n<code><pre>\nboss = GameObject()\n\nboss.bind 'remove', ->\n unlockDoorToLevel2()\n</pre></code>\n\n@name remove\n@methodOf GameObject#\n@event\n*/var GameObject;\nGameObject = function(I) {\n var autobindEvents, defaultModules, modules, self;\n I || (I = {});\n /**\n @name {Object} I Instance variables \n @memberOf GameObject#\n */\n Object.reverseMerge(I, {\n age: 0,\n active: true,\n created: false,\n destroyed: false,\n solid: false,\n includedModules: [],\n excludedModules: []\n });\n self = Core(I).extend({\n /**\n Update the game object. This is generally called by the engine.\n\n @name update\n @methodOf GameObject#\n */\n update: function() {\n if (I.active) {\n self.trigger('step');\n self.trigger('update');\n I.age += 1;\n }\n return I.active;\n },\n /**\n Triggers the create event if the object has not already been created.\n\n @name create\n @methodOf GameObject#\n */\n create: function() {\n if (!I.created) {\n self.trigger('create');\n }\n return I.created = true;\n },\n /**\n Destroys the object and triggers the destroyed event.\n\n @name destroy\n @methodOf GameObject#\n */\n destroy: function() {\n if (!I.destroyed) {\n self.trigger('destroy');\n }\n I.destroyed = true;\n return I.active = false;\n }\n });\n defaultModules = [Bindable, Bounded, Drawable, Durable];\n modules = defaultModules.concat(I.includedModules.invoke('constantize'));\n modules = modules.without(I.excludedModules.invoke('constantize'));\n modules.each(function(Module) {\n return self.include(Module);\n });\n self.attrAccessor(\"solid\");\n autobindEvents = ['create', 'destroy', 'step'];\n autobindEvents.each(function(eventName) {\n var event;\n if (event = I[eventName]) {\n if (typeof event === \"function\") {\n return self.bind(eventName, event);\n } else {\n return self.bind(eventName, eval(\"(function() {\" + event + \"})\"));\n }\n }\n });\n return self;\n};\n/**\nConstruct an object instance from the given entity data.\n@name construct\n@memberOf GameObject\n@param {Object} entityData\n*/\nGameObject.construct = function(entityData) {\n if (entityData[\"class\"]) {\n return entityData[\"class\"].constantize()(entityData);\n } else {\n return GameObject(entityData);\n }\n};;\n/**\nThe Movable module automatically updates the position and velocity of\nGameObjects based on the velocity and acceleration. It does not check\ncollisions so is probably best suited to particle effect like things.\n\n<code><pre>\nplayer = GameObject\n x: 0\n y: 0\n velocity: Point(0, 0)\n acceleration: Point(1, 0)\n maxSpeed: 2\n\nplayer.include(Movable)\n\n# => `velocity is {x: 0, y: 0} and position is {x: 0, y: 0}`\n\nplayer.update()\n# => `velocity is {x: 1, y: 0} and position is {x: 1, y: 0}` \n\nplayer.update()\n# => `velocity is {x: 2, y: 0} and position is {x: 3, y: 0}` \n\n# we've hit our maxSpeed so our velocity won't increase\nplayer.update()\n# => `velocity is {x: 2, y: 0} and position is {x: 5, y: 0}`\n</pre></code>\n\n@name Movable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Movable;\nMovable = function(I) {\n Object.reverseMerge(I, {\n acceleration: Point(0, 0),\n velocity: Point(0, 0)\n });\n I.acceleration = Point(I.acceleration.x, I.acceleration.y);\n I.velocity = Point(I.velocity.x, I.velocity.y);\n return {\n before: {\n update: function() {\n var currentSpeed;\n I.velocity = I.velocity.add(I.acceleration);\n if (I.maxSpeed != null) {\n currentSpeed = I.velocity.magnitude();\n if (currentSpeed > I.maxSpeed) {\n I.velocity = I.velocity.scale(I.maxSpeed / currentSpeed);\n }\n }\n I.x += I.velocity.x;\n return I.y += I.velocity.y;\n }\n }\n };\n};;\n/**\n@name ResourceLoader\n@namespace\n\nHelps access the assets in your game.\n*/(function() {\n var ResourceLoader, typeTable;\n typeTable = {\n images: \"png\"\n };\n ResourceLoader = {\n /**\n Return the url for a particular asset.\n\n <code><pre>\n ResourceLoader.urlFor(\"images\", \"player\")\n # => This returns the url for the file \"player.png\" in your images directory.\n </pre></code>\n\n @name urlFor\n @methodOf ResourceLoader#\n @param {String} directory The directory your file is in.\n @param {String} name The name of the file.\n @returns {String} The full url of your asset\n\n */\n urlFor: function(directory, name) {\n var type, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref[directory] : void 0 : void 0) || directory;\n type = typeTable[directory];\n return \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".\" + type + \"?\" + MTIME;\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"ResourceLoader\"] = ResourceLoader;\n})();;\n/**\nThe Rotatable module rotates the object\nbased on its rotational velocity.\n\n<code><pre>\nplayer = GameObject\n x: 0\n y: 0\n rotationalVelocity: Math.PI / 64\n\nplayer.include(Rotatable)\n\nplayer.I.rotation\n# => 0\n\nplayer.update()\n\nplayer.I.rotation\n# => 0.04908738521234052 # Math.PI / 64\n\nplayer.update()\n\nplayer.I.rotation\n# => 0.09817477042468103 # 2 * (Math.PI / 64)\n</pre></code>\n\n@name Rotatable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Rotatable;\nRotatable = function(I) {\n I || (I = {});\n Object.reverseMerge(I, {\n rotation: 0,\n rotationalVelocity: 0\n });\n return {\n before: {\n update: function() {\n return I.rotation += I.rotationalVelocity;\n }\n }\n };\n};;\n/**\nThe Sprite class provides a way to load images for use in games.\n\nBy default, images are loaded asynchronously. A proxy object is \nreturned immediately. Even though it has a draw method it will not\ndraw anything to the screen until the image has been loaded.\n\n@name Sprite\n@constructor\n*/(function() {\n var LoaderProxy, Sprite;\n LoaderProxy = function() {\n return {\n draw: function() {},\n fill: function() {},\n frame: function() {},\n update: function() {},\n width: null,\n height: null\n };\n };\n Sprite = function(image, sourceX, sourceY, width, height) {\n sourceX || (sourceX = 0);\n sourceY || (sourceY = 0);\n width || (width = image.width);\n height || (height = image.height);\n return {\n /**\n Draw this sprite on the given canvas at the given position.\n\n @name draw\n @methodOf Sprite#\n @param {PowerCanvas} canvas Reference to the canvas to draw the sprite on\n @param {Number} x Position on the x axis to draw the sprite\n @param {Number} y Position on the y axis to draw the sprite\n */\n draw: function(canvas, x, y) {\n return canvas.drawImage(image, sourceX, sourceY, width, height, x, y, width, height);\n },\n fill: function(canvas, x, y, width, height, repeat) {\n var pattern;\n if (repeat == null) {\n repeat = \"repeat\";\n }\n pattern = canvas.createPattern(image, repeat);\n return canvas.drawRect({\n x: x,\n y: y,\n width: width,\n height: height,\n color: pattern\n });\n },\n width: width,\n height: height\n };\n };\n /**\n Loads all sprites from a sprite sheet found in\n your images directory, specified by the name passed in.\n\n @name loadSheet\n @methodOf Sprite\n @param {String} name Name of the spriteSheet image in your images directory\n @param {Number} tileWidth Width of each sprite in the sheet\n @param {Number} tileHeight Height of each sprite in the sheet\n @returns {Array} An array of sprite objects\n */\n Sprite.loadSheet = function(name, tileWidth, tileHeight) {\n var image, sprites, url;\n url = ResourceLoader.urlFor(\"images\", name);\n sprites = [];\n image = new Image();\n image.onload = function() {\n var imgElement;\n imgElement = this;\n return (image.height / tileHeight).times(function(row) {\n return (image.width / tileWidth).times(function(col) {\n return sprites.push(Sprite(imgElement, col * tileWidth, row * tileHeight, tileWidth, tileHeight));\n });\n });\n };\n image.src = url;\n return sprites;\n };\n /**\n Loads a sprite from a given url.\n\n @name load\n @methodOf Sprite\n @param {String} url\n @param {Function} [loadedCallback]\n @returns {Sprite} A sprite object\n */\n Sprite.load = function(url, loadedCallback) {\n var img, proxy;\n img = new Image();\n proxy = LoaderProxy();\n img.onload = function() {\n var tile;\n tile = Sprite(this);\n Object.extend(proxy, tile);\n if (loadedCallback) {\n return loadedCallback(proxy);\n }\n };\n img.src = url;\n return proxy;\n };\n /**\n Loads a sprite with the given pixie id.\n\n @name fromPixieId\n @methodOf Sprite\n @param {Number} id Pixie Id of the sprite to load\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.fromPixieId = function(id, callback) {\n return Sprite.load(\"http://pixieengine.com/s3/sprites/\" + id + \"/original.png\", callback);\n };\n /**\n A sprite that draws nothing.\n\n @name EMPTY\n @fieldOf Sprite\n @constant\n @returns {Sprite}\n */\n /**\n A sprite that draws nothing.\n\n @name NONE\n @fieldOf Sprite\n @constant\n @returns {Sprite}\n */\n Sprite.EMPTY = Sprite.NONE = LoaderProxy();\n /**\n Loads a sprite from a given url.\n\n @name fromURL\n @methodOf Sprite\n @param {String} url The url where the image to load is located\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.fromURL = Sprite.load;\n /**\n Loads a sprite with the given name.\n\n @name loadByName\n @methodOf Sprite\n @param {String} name The name of the image in your images directory\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.loadByName = function(name, callback) {\n return Sprite.load(ResourceLoader.urlFor(\"images\", name), callback);\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Sprite\"] = Sprite;\n})();;\n;\n","size":252170,"mtime":1320340625},{"path":"README","type":"blob","contents":"Platform Tutorial 1\n===================\n\nThis game is tutorial to teach keyboard input.\n\nThe source has been annotated to teach you the basics of using PixieEngine.\n\nDirectory Overview\n------------------\nlib - Compiled libraries that the game includes. You won't need to touch these.\nsrc - The code for all the objects in the game\nDocumentation - Detailed explanation of methods provided by the libraries. Contains tons of code samples. \nREADME - This file\npixie - Configuration file to specify library source location and application size.\n\nArchitecture Overview\n---------------------\nEngine - Manages all the game objects and running the update and draw steps.\nGameObject - Represents something in the game. In our case this represents that red square.\nSquare - The guy we are learning to control.\n\nThis main file sets up the engine and configures all the initial objects.\n\n","size":919,"mtime":1316726790},{"path":"game.js","type":"blob","contents":"var App;\nApp = {\n \"directories\": {\n \"animations\": \"animations\",\n \"data\": \"data\",\n \"entities\": \"entities\",\n \"images\": \"images\",\n \"lib\": \"lib\",\n \"sounds\": \"sounds\",\n \"source\": \"src\",\n \"test\": \"test\",\n \"tilemaps\": \"tilemaps\"\n },\n \"width\": 320,\n \"height\": 240,\n \"library\": false,\n \"main\": \"main\",\n \"wrapMain\": true,\n \"hotSwap\": true,\n \"name\": \"Move Tutorial\",\n \"author\": \"STRd6\",\n \"libs\": {\n \"00_gamelib.js\": \"https://github.com/STRd6/gamelib/raw/pixie/gamelib.js\",\n \"browserlib.js\": \"https://github.com/STRd6/browserlib/raw/pixie/browserlib.js\",\n \"extralib.js\": \"https://github.com/STRd6/extralib/raw/pixie/extralib.js\"\n }\n};;\n;\n;\n;\n/**\nReturns a copy of the array without null and undefined values.\n\n<code><pre>\n[null, undefined, 3, 3, undefined, 5].compact()\n# => [3, 3, 5]\n</pre></code>\n\n@name compact\n@methodOf Array#\n@returns {Array} A new array that contains only the non-null values.\n*/var __slice = Array.prototype.slice;\nArray.prototype.compact = function() {\n return this.select(function(element) {\n return element != null;\n });\n};\n/**\nCreates and returns a copy of the array. The copy contains\nthe same objects.\n\n<code><pre>\na = [\"a\", \"b\", \"c\"]\nb = a.copy()\n\n# their elements are equal\na[0] == b[0] && a[1] == b[1] && a[2] == b[2]\n# => true\n\n# but they aren't the same object in memory\na === b\n# => false\n</pre></code>\n\n@name copy\n@methodOf Array#\n@returns {Array} A new array that is a copy of the array\n*/\nArray.prototype.copy = function() {\n return this.concat();\n};\n/**\nEmpties the array of its contents. It is modified in place.\n\n<code><pre>\nfullArray = [1, 2, 3]\nfullArray.clear()\nfullArray\n# => []\n</pre></code>\n\n@name clear\n@methodOf Array#\n@returns {Array} this, now emptied.\n*/\nArray.prototype.clear = function() {\n this.length = 0;\n return this;\n};\n/**\nFlatten out an array of arrays into a single array of elements.\n\n<code><pre>\n[[1, 2], [3, 4], 5].flatten()\n# => [1, 2, 3, 4, 5]\n\n# won't flatten twice nested arrays. call\n# flatten twice if that is what you want\n[[1, 2], [3, [4, 5]], 6].flatten()\n# => [1, 2, 3, [4, 5], 6]\n</pre></code>\n\n@name flatten\n@methodOf Array#\n@returns {Array} A new array with all the sub-arrays flattened to the top.\n*/\nArray.prototype.flatten = function() {\n return this.inject([], function(a, b) {\n return a.concat(b);\n });\n};\n/**\nInvoke the named method on each element in the array\nand return a new array containing the results of the invocation.\n\n<code><pre>\n[1.1, 2.2, 3.3, 4.4].invoke(\"floor\")\n# => [1, 2, 3, 4]\n\n['hello', 'world', 'cool!'].invoke('substring', 0, 3)\n# => ['hel', 'wor', 'coo']\n</pre></code>\n\n@param {String} method The name of the method to invoke.\n@param [arg...] Optional arguments to pass to the method being invoked.\n@name invoke\n@methodOf Array#\n@returns {Array} A new array containing the results of invoking the named method on each element.\n*/\nArray.prototype.invoke = function() {\n var args, method;\n method = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n return this.map(function(element) {\n return element[method].apply(element, args);\n });\n};\n/**\nRandomly select an element from the array.\n\n<code><pre>\n[1, 2, 3].rand()\n# => 2\n</pre></code>\n\n@name rand\n@methodOf Array#\n@returns {Object} A random element from an array\n*/\nArray.prototype.rand = function() {\n return this[rand(this.length)];\n};\n/**\nRemove the first occurrence of the given object from the array if it is\npresent. The array is modified in place.\n\n<code><pre>\na = [1, 1, \"a\", \"b\"]\na.remove(1)\n# => 1\n\na\n# => [1, \"a\", \"b\"]\n</pre></code>\n\n@name remove\n@methodOf Array#\n@param {Object} object The object to remove from the array if present.\n@returns {Object} The removed object if present otherwise undefined.\n*/\nArray.prototype.remove = function(object) {\n var index;\n index = this.indexOf(object);\n if (index >= 0) {\n return this.splice(index, 1)[0];\n } else {\n return;\n }\n};\n/**\nReturns true if the element is present in the array.\n\n<code><pre>\n[\"a\", \"b\", \"c\"].include(\"c\")\n# => true\n\n[40, \"a\"].include(700)\n# => false\n</pre></code>\n\n@name include\n@methodOf Array#\n@param {Object} element The element to check if present.\n@returns {Boolean} true if the element is in the array, false otherwise.\n*/\nArray.prototype.include = function(element) {\n return this.indexOf(element) !== -1;\n};\n/**\nCall the given iterator once for each element in the array,\npassing in the element as the first argument, the index of \nthe element as the second argument, and <code>this</code> array as the\nthird argument.\n\n<code><pre>\nword = \"\"\nindices = []\n[\"r\", \"a\", \"d\"].each (letter, index) ->\n word += letter\n indices.push(index)\n\n# => [\"r\", \"a\", \"d\"]\n\nword\n# => \"rad\"\n\nindices\n# => [0, 1, 2]\n</pre></code>\n\n@name each\n@methodOf Array#\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this to enable method chaining.\n*/\nArray.prototype.each = function(iterator, context) {\n var element, i, _len;\n if (this.forEach) {\n this.forEach(iterator, context);\n } else {\n for (i = 0, _len = this.length; i < _len; i++) {\n element = this[i];\n iterator.call(context, element, i, this);\n }\n }\n return this;\n};\n/**\nCall the given iterator once for each element in the array, \npassing in the element as the first argument, the index of \nthe element as the second argument, and `this` array as the\nthird argument.\n\n<code><pre>\n[1, 2, 3].map (number) ->\n number * number\n# => [1, 4, 9]\n</pre></code>\n\n@name map\n@methodOf Array#\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array of the results of the iterator function being called on the original array elements.\n*/\nArray.prototype.map || (Array.prototype.map = function(iterator, context) {\n var element, i, results, _len;\n results = [];\n for (i = 0, _len = this.length; i < _len; i++) {\n element = this[i];\n results.push(iterator.call(context, element, i, this));\n }\n return results;\n});\n/**\nCall the given iterator once for each pair of objects in the array.\n\n<code><pre>\n[1, 2, 3, 4].eachPair (a, b) ->\n # 1, 2\n # 1, 3\n # 1, 4\n # 2, 3\n # 2, 4\n # 3, 4\n</pre></code>\n\n@name eachPair\n@methodOf Array#\n@param {Function} iterator Function to be called once for each pair of elements in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n*/\nArray.prototype.eachPair = function(iterator, context) {\n var a, b, i, j, length, _results;\n length = this.length;\n i = 0;\n _results = [];\n while (i < length) {\n a = this[i];\n j = i + 1;\n i += 1;\n _results.push((function() {\n var _results2;\n _results2 = [];\n while (j < length) {\n b = this[j];\n j += 1;\n _results2.push(iterator.call(context, a, b));\n }\n return _results2;\n }).call(this));\n }\n return _results;\n};\n/**\nCall the given iterator once for each element in the array,\npassing in the element as the first argument and the given object\nas the second argument. Additional arguments are passed similar to\n<code>each</code>.\n\n@see Array#each\n@name eachWithObject\n@methodOf Array#\n@param {Object} object The object to pass to the iterator on each visit.\n@param {Function} iterator Function to be called once for each element in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this\n*/\nArray.prototype.eachWithObject = function(object, iterator, context) {\n this.each(function(element, i, self) {\n return iterator.call(context, element, object, i, self);\n });\n return object;\n};\n/**\nCall the given iterator once for each group of elements in the array,\npassing in the elements in groups of n. Additional argumens are\npassed as in each.\n\n<code><pre>\nresults = []\n[1, 2, 3, 4].eachSlice 2, (slice) ->\n results.push(slice)\n# => [1, 2, 3, 4]\n\nresults\n# => [[1, 2], [3, 4]]\n</pre></code>\n\n@see Array#each\n@name eachSlice\n@methodOf Array#\n@param {Number} n The number of elements in each group.\n@param {Function} iterator Function to be called once for each group of elements in the array.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} this\n*/\nArray.prototype.eachSlice = function(n, iterator, context) {\n var i, len;\n if (n > 0) {\n len = (this.length / n).floor();\n i = -1;\n while (++i < len) {\n iterator.call(context, this.slice(i * n, (i + 1) * n), i * n, this);\n }\n }\n return this;\n};\n/**\nReturns a new array with the elements all shuffled up.\n\n<code><pre>\na = [1, 2, 3]\n\na.shuffle()\n# => [2, 3, 1]\n\na # => [1, 2, 3]\n</pre></code>\n\n@name shuffle\n@methodOf Array#\n@returns {Array} A new array that is randomly shuffled.\n*/\nArray.prototype.shuffle = function() {\n var shuffledArray;\n shuffledArray = [];\n this.each(function(element) {\n return shuffledArray.splice(rand(shuffledArray.length + 1), 0, element);\n });\n return shuffledArray;\n};\n/**\nReturns the first element of the array, undefined if the array is empty.\n\n<code><pre>\n[\"first\", \"second\", \"third\"].first()\n# => \"first\"\n</pre></code>\n\n@name first\n@methodOf Array#\n@returns {Object} The first element, or undefined if the array is empty.\n*/\nArray.prototype.first = function() {\n return this[0];\n};\n/**\nReturns the last element of the array, undefined if the array is empty.\n\n<code><pre>\n[\"first\", \"second\", \"third\"].last()\n# => \"third\"\n</pre></code>\n\n@name last\n@methodOf Array#\n@returns {Object} The last element, or undefined if the array is empty.\n*/\nArray.prototype.last = function() {\n return this[this.length - 1];\n};\n/**\nReturns an object containing the extremes of this array.\n\n<code><pre>\n[-1, 3, 0].extremes()\n# => {min: -1, max: 3}\n</pre></code>\n\n@name extremes\n@methodOf Array#\n@param {Function} [fn] An optional funtion used to evaluate each element to calculate its value for determining extremes.\n@returns {Object} {min: minElement, max: maxElement}\n*/\nArray.prototype.extremes = function(fn) {\n var max, maxResult, min, minResult;\n fn || (fn = function(n) {\n return n;\n });\n min = max = void 0;\n minResult = maxResult = void 0;\n this.each(function(object) {\n var result;\n result = fn(object);\n if (min != null) {\n if (result < minResult) {\n min = object;\n minResult = result;\n }\n } else {\n min = object;\n minResult = result;\n }\n if (max != null) {\n if (result > maxResult) {\n max = object;\n return maxResult = result;\n }\n } else {\n max = object;\n return maxResult = result;\n }\n });\n return {\n min: min,\n max: max\n };\n};\n/**\nPretend the array is a circle and grab a new array containing length elements. \nIf length is not given return the element at start, again assuming the array \nis a circle.\n\n<code><pre>\n[1, 2, 3].wrap(-1)\n# => 3\n\n[1, 2, 3].wrap(6)\n# => 1\n\n[\"l\", \"o\", \"o\", \"p\"].wrap(0, 16)\n# => [\"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\", \"l\", \"o\", \"o\", \"p\"]\n</pre></code>\n\n@name wrap\n@methodOf Array#\n@param {Number} start The index to start wrapping at, or the index of the sole element to return if no length is given.\n@param {Number} [length] Optional length determines how long result array should be.\n@returns {Object} or {Array} The element at start mod array.length, or an array of length elements, starting from start and wrapping.\n*/\nArray.prototype.wrap = function(start, length) {\n var end, i, result;\n if (length != null) {\n end = start + length;\n i = start;\n result = [];\n while (i++ < end) {\n result.push(this[i.mod(this.length)]);\n }\n return result;\n } else {\n return this[start.mod(this.length)];\n }\n};\n/**\nPartitions the elements into two groups: those for which the iterator returns\ntrue, and those for which it returns false.\n\n@name partition\n@methodOf Array#\n@param {Function} iterator\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array in the form of [trueCollection, falseCollection]\n*/\nArray.prototype.partition = function(iterator, context) {\n var falseCollection, trueCollection;\n trueCollection = [];\n falseCollection = [];\n this.each(function(element) {\n if (iterator.call(context, element)) {\n return trueCollection.push(element);\n } else {\n return falseCollection.push(element);\n }\n });\n return [trueCollection, falseCollection];\n};\n/**\nReturn the group of elements for which the return value of the iterator is true.\n\n@name select\n@methodOf Array#\n@param {Function} iterator The iterator receives each element in turn as the first agument.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array containing the elements for which the iterator returned true.\n*/\nArray.prototype.select = function(iterator, context) {\n return this.partition(iterator, context)[0];\n};\n/**\nReturn the group of elements that are not in the passed in set.\n\n@name without\n@methodOf Array#\n@param {Array} values List of elements to exclude.\n@returns {Array} An array containing the elements that are not passed in.\n*/\nArray.prototype.without = function(values) {\n return this.reject(function(element) {\n return values.include(element);\n });\n};\n/**\nReturn the group of elements for which the return value of the iterator is false.\n\n@name reject\n@methodOf Array#\n@param {Function} iterator The iterator receives each element in turn as the first agument.\n@param {Object} [context] Optional context parameter to be used as `this` when calling the iterator function.\n@returns {Array} An array containing the elements for which the iterator returned false.\n*/\nArray.prototype.reject = function(iterator, context) {\n return this.partition(iterator, context)[1];\n};\n/**\nCombines all elements of the array by applying a binary operation.\nfor each element in the arra the iterator is passed an accumulator \nvalue (memo) and the element.\n\n@name inject\n@methodOf Array#\n@returns {Object} The result of a\n*/\nArray.prototype.inject = function(initial, iterator) {\n this.each(function(element) {\n return initial = iterator(initial, element);\n });\n return initial;\n};\n/**\nAdd all the elements in the array.\n\n<code><pre>\n[1, 2, 3, 4].sum()\n# => 10\n</pre></code>\n\n@name sum\n@methodOf Array#\n@returns {Number} The sum of the elements in the array.\n*/\nArray.prototype.sum = function() {\n return this.inject(0, function(sum, n) {\n return sum + n;\n });\n};\n/**\nMultiply all the elements in the array.\n\n<code><pre>\n[1, 2, 3, 4].product()\n# => 24\n</pre></code>\n\n@name product\n@methodOf Array#\n@returns {Number} The product of the elements in the array.\n*/\nArray.prototype.product = function() {\n return this.inject(1, function(product, n) {\n return product * n;\n });\n};\n/**\nMerges together the values of each of the arrays with the values at the corresponding position.\n\n<code><pre>\n['a', 'b', 'c'].zip([1, 2, 3])\n# => [['a', 1], ['b', 2], ['c', 3]]\n</pre></code>\n\n@name zip\n@methodOf Array#\n@returns {Array} Array groupings whose values are arranged by their positions in the original input arrays.\n*/\nArray.prototype.zip = function() {\n var args;\n args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return this.map(function(element, index) {\n var output;\n output = args.map(function(arr) {\n return arr[index];\n });\n output.unshift(element);\n return output;\n });\n};;\n/**\nBindable module.\n\n<code><pre>\nplayer = Core\n x: 5\n y: 10\n\nplayer.bind \"update\", ->\n updatePlayer()\n# => Uncaught TypeError: Object has no method 'bind'\n\nplayer.include(Bindable)\n\nplayer.bind \"update\", ->\n updatePlayer()\n# => this will call updatePlayer each time through the main loop\n</pre></code>\n\n@name Bindable\n@module\n@constructor\n*/var Bindable;\nvar __slice = Array.prototype.slice;\nBindable = function() {\n var eventCallbacks;\n eventCallbacks = {};\n return {\n /**\n The bind method adds a function as an event listener.\n\n <code><pre>\n # this will call coolEventHandler after\n # yourObject.trigger \"someCustomEvent\" is called.\n yourObject.bind \"someCustomEvent\", coolEventHandler\n\n #or\n yourObject.bind \"anotherCustomEvent\", ->\n doSomething()\n </pre></code>\n\n @name bind\n @methodOf Bindable#\n @param {String} event The event to listen to.\n @param {Function} callback The function to be called when the specified event\n is triggered.\n */\n bind: function(event, callback) {\n eventCallbacks[event] = eventCallbacks[event] || [];\n return eventCallbacks[event].push(callback);\n },\n /**\n The unbind method removes a specific event listener, or all event listeners if\n no specific listener is given.\n\n <code><pre>\n # removes the handler coolEventHandler from the event\n # \"someCustomEvent\" while leaving the other events intact.\n yourObject.unbind \"someCustomEvent\", coolEventHandler\n\n # removes all handlers attached to \"anotherCustomEvent\" \n yourObject.unbind \"anotherCustomEvent\"\n </pre></code>\n\n @name unbind\n @methodOf Bindable#\n @param {String} event The event to remove the listener from.\n @param {Function} [callback] The listener to remove.\n */\n unbind: function(event, callback) {\n eventCallbacks[event] = eventCallbacks[event] || [];\n if (callback) {\n return eventCallbacks[event].remove(callback);\n } else {\n return eventCallbacks[event] = [];\n }\n },\n /**\n The trigger method calls all listeners attached to the specified event.\n\n <code><pre>\n # calls each event handler bound to \"someCustomEvent\"\n yourObject.trigger \"someCustomEvent\"\n </pre></code>\n\n @name trigger\n @methodOf Bindable#\n @param {String} event The event to trigger.\n @param {Array} [parameters] Additional parameters to pass to the event listener.\n */\n trigger: function() {\n var callbacks, event, parameters, self;\n event = arguments[0], parameters = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n callbacks = eventCallbacks[event];\n if (callbacks && callbacks.length) {\n self = this;\n return callbacks.each(function(callback) {\n return callback.apply(self, parameters);\n });\n }\n }\n };\n};\n(typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Bindable\"] = Bindable;;\nvar CommandStack;\nCommandStack = function() {\n var index, stack;\n stack = [];\n index = 0;\n return {\n execute: function(command) {\n stack[index] = command;\n command.execute();\n return index += 1;\n },\n undo: function() {\n var command;\n if (this.canUndo()) {\n index -= 1;\n command = stack[index];\n command.undo();\n return command;\n }\n },\n redo: function() {\n var command;\n if (this.canRedo()) {\n command = stack[index];\n command.execute();\n index += 1;\n return command;\n }\n },\n canUndo: function() {\n return index > 0;\n },\n canRedo: function() {\n return stack[index] != null;\n }\n };\n};;\n/**\nThe Core class is used to add extended functionality to objects without\nextending the object class directly. Inherit from Core to gain its utility\nmethods.\n\n@name Core\n@constructor\n\n@param {Object} I Instance variables\n*/var Core;\nvar __slice = Array.prototype.slice;\nCore = function(I) {\n var self;\n I || (I = {});\n return self = {\n /**\n External access to instance variables. Use of this property should be avoided\n in general, but can come in handy from time to time.\n\n <code><pre>\n I =\n r: 255\n g: 0\n b: 100\n\n myObject = Core(I)\n\n # a bad idea most of the time, but it's \n # pretty convenient to have available.\n myObject.I.r\n # => 255\n\n myObject.I.g\n # => 0\n\n myObject.I.b\n # => 100\n </pre></code>\n\n @name I\n @fieldOf Core#\n */\n I: I,\n /**\n Generates a public jQuery style getter / setter method for each \n String argument.\n\n <code><pre>\n myObject = Core\n r: 255\n g: 0\n b: 100\n\n myObject.attrAccessor \"r\", \"g\", \"b\"\n\n myObject.r(254)\n myObject.r()\n\n => 254\n </pre></code>\n\n @name attrAccessor\n @methodOf Core#\n */\n attrAccessor: function() {\n var attrNames;\n attrNames = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrNames.each(function(attrName) {\n return self[attrName] = function(newValue) {\n if (newValue != null) {\n I[attrName] = newValue;\n return self;\n } else {\n return I[attrName];\n }\n };\n });\n },\n /**\n Generates a public jQuery style getter method for each String argument.\n\n <code><pre>\n myObject = Core\n r: 255\n g: 0\n b: 100\n\n myObject.attrReader \"r\", \"g\", \"b\"\n\n myObject.r()\n => 255\n\n myObject.g()\n => 0\n\n myObject.b()\n => 100\n </pre></code>\n\n @name attrReader\n @methodOf Core#\n */\n attrReader: function() {\n var attrNames;\n attrNames = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n return attrNames.each(function(attrName) {\n return self[attrName] = function() {\n return I[attrName];\n };\n });\n },\n /**\n Extends this object with methods from the passed in object. `before` and \n `after` are special option names that glue functionality before or after \n existing methods.\n\n <code><pre>\n I =\n x: 30\n y: 40\n maxSpeed: 5\n\n # we are using extend to give player\n # additional methods that Core doesn't have\n player = Core(I).extend\n increaseSpeed: ->\n I.maxSpeed += 1\n\n # this will execute before the update method\n beforeUpdate: ->\n checkPowerupStatus()\n\n player.I.maxSpeed\n => 5\n\n player.increaseSpeed()\n\n player.I.maxSpeed\n => 6\n </pre></code>\n\n @name extend\n @methodOf Core#\n */\n extend: function(options) {\n var afterMethods, beforeMethods, fn, name;\n afterMethods = options.after;\n beforeMethods = options.before;\n delete options.after;\n delete options.before;\n Object.extend(self, options);\n if (beforeMethods) {\n for (name in beforeMethods) {\n fn = beforeMethods[name];\n self[name] = self[name].withBefore(fn);\n }\n }\n if (afterMethods) {\n for (name in afterMethods) {\n fn = afterMethods[name];\n self[name] = self[name].withAfter(fn);\n }\n }\n return self;\n },\n /** \n Includes a module in this object.\n\n <code><pre>\n myObject = Core()\n myObject.include(Bindable)\n\n # now you can bind handlers to functions\n myObject.bind \"someEvent\", ->\n alert(\"wow. that was easy.\")\n </pre></code>\n\n @name include\n @methodOf Core#\n @param {Module} Module the module to include. A module is a constructor that takes two parameters, I and self, and returns an object containing the public methods to extend the including object with.\n */\n include: function(Module) {\n return self.extend(Module(I, self));\n }\n };\n};;\nFunction.prototype.withBefore = function(interception) {\n var method;\n method = this;\n return function() {\n interception.apply(this, arguments);\n return method.apply(this, arguments);\n };\n};\nFunction.prototype.withAfter = function(interception) {\n var method;\n method = this;\n return function() {\n var result;\n result = method.apply(this, arguments);\n interception.apply(this, arguments);\n return result;\n };\n};;\n/**\n@name Logging\n@namespace\n\nGives you some convenience methods for outputting data while developing. \n\n<code><pre>\n log \"Testing123\"\n info \"Hey, this is happening\"\n warn \"Be careful, this might be a problem\"\n error \"Kaboom!\"\n</pre></code>\n*/[\"log\", \"info\", \"warn\", \"error\"].each(function(name) {\n if (typeof console !== \"undefined\") {\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[name] = function(message) {\n if (console[name]) {\n return console[name](message);\n }\n };\n } else {\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[name] = function() {};\n }\n});;\n/**\n* Matrix.js v1.3.0pre\n* \n* Copyright (c) 2010 STRd6\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in\n* all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n* THE SOFTWARE.\n*\n* Loosely based on flash:\n* http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html\n*/(function() {\n /**\n <pre>\n _ _\n | a c tx |\n | b d ty |\n |_0 0 1 _|\n </pre>\n Creates a matrix for 2d affine transformations.\n\n concat, inverse, rotate, scale and translate return new matrices with the\n transformations applied. The matrix is not modified in place.\n\n Returns the identity matrix when called with no arguments.\n\n @name Matrix\n @param {Number} [a]\n @param {Number} [b]\n @param {Number} [c]\n @param {Number} [d]\n @param {Number} [tx]\n @param {Number} [ty]\n @constructor\n */ var Matrix;\n Matrix = function(a, b, c, d, tx, ty) {\n return {\n __proto__: Matrix.prototype,\n /**\n @name a\n @fieldOf Matrix#\n */\n a: a != null ? a : 1,\n /**\n @name b\n @fieldOf Matrix#\n */\n b: b || 0,\n /**\n @name c\n @fieldOf Matrix#\n */\n c: c || 0,\n /**\n @name d\n @fieldOf Matrix#\n */\n d: d != null ? d : 1,\n /**\n @name tx\n @fieldOf Matrix#\n */\n tx: tx || 0,\n /**\n @name ty\n @fieldOf Matrix#\n */\n ty: ty || 0\n };\n };\n Matrix.prototype = {\n /**\n Returns the result of this matrix multiplied by another matrix\n combining the geometric effects of the two. In mathematical terms, \n concatenating two matrixes is the same as combining them using matrix multiplication.\n If this matrix is A and the matrix passed in is B, the resulting matrix is A x B\n http://mathworld.wolfram.com/MatrixMultiplication.html\n @name concat\n @methodOf Matrix#\n @param {Matrix} matrix The matrix to multiply this matrix by.\n @returns {Matrix} The result of the matrix multiplication, a new matrix.\n */\n concat: function(matrix) {\n return Matrix(this.a * matrix.a + this.c * matrix.b, this.b * matrix.a + this.d * matrix.b, this.a * matrix.c + this.c * matrix.d, this.b * matrix.c + this.d * matrix.d, this.a * matrix.tx + this.c * matrix.ty + this.tx, this.b * matrix.tx + this.d * matrix.ty + this.ty);\n },\n /**\n Given a point in the pretransform coordinate space, returns the coordinates of \n that point after the transformation occurs. Unlike the standard transformation \n applied using the transformPoint() method, the deltaTransformPoint() method \n does not consider the translation parameters tx and ty.\n @name deltaTransformPoint\n @methodOf Matrix#\n @see #transformPoint\n @return {Point} A new point transformed by this matrix ignoring tx and ty.\n */\n deltaTransformPoint: function(point) {\n return Point(this.a * point.x + this.c * point.y, this.b * point.x + this.d * point.y);\n },\n /**\n Returns the inverse of the matrix.\n http://mathworld.wolfram.com/MatrixInverse.html\n @name inverse\n @methodOf Matrix#\n @returns {Matrix} A new matrix that is the inverse of this matrix.\n */\n inverse: function() {\n var determinant;\n determinant = this.a * this.d - this.b * this.c;\n return Matrix(this.d / determinant, -this.b / determinant, -this.c / determinant, this.a / determinant, (this.c * this.ty - this.d * this.tx) / determinant, (this.b * this.tx - this.a * this.ty) / determinant);\n },\n /**\n Returns a new matrix that corresponds this matrix multiplied by a\n a rotation matrix.\n @name rotate\n @methodOf Matrix#\n @see Matrix.rotation\n @param {Number} theta Amount to rotate in radians.\n @param {Point} [aboutPoint] The point about which this rotation occurs. Defaults to (0,0).\n @returns {Matrix} A new matrix, rotated by the specified amount.\n */\n rotate: function(theta, aboutPoint) {\n return this.concat(Matrix.rotation(theta, aboutPoint));\n },\n /**\n Returns a new matrix that corresponds this matrix multiplied by a\n a scaling matrix.\n @name scale\n @methodOf Matrix#\n @see Matrix.scale\n @param {Number} sx\n @param {Number} [sy]\n @param {Point} [aboutPoint] The point that remains fixed during the scaling\n @returns {Matrix} A new Matrix. The original multiplied by a scaling matrix.\n */\n scale: function(sx, sy, aboutPoint) {\n return this.concat(Matrix.scale(sx, sy, aboutPoint));\n },\n /**\n Returns the result of applying the geometric transformation represented by the \n Matrix object to the specified point.\n @name transformPoint\n @methodOf Matrix#\n @see #deltaTransformPoint\n @returns {Point} A new point with the transformation applied.\n */\n transformPoint: function(point) {\n return Point(this.a * point.x + this.c * point.y + this.tx, this.b * point.x + this.d * point.y + this.ty);\n },\n /**\n Translates the matrix along the x and y axes, as specified by the tx and ty parameters.\n @name translate\n @methodOf Matrix#\n @see Matrix.translation\n @param {Number} tx The translation along the x axis.\n @param {Number} ty The translation along the y axis.\n @returns {Matrix} A new matrix with the translation applied.\n */\n translate: function(tx, ty) {\n return this.concat(Matrix.translation(tx, ty));\n }\n /**\n Creates a matrix transformation that corresponds to the given rotation,\n around (0,0) or the specified point.\n @see Matrix#rotate\n @param {Number} theta Rotation in radians.\n @param {Point} [aboutPoint] The point about which this rotation occurs. Defaults to (0,0).\n @returns {Matrix} A new matrix rotated by the given amount.\n */\n };\n Matrix.rotate = Matrix.rotation = function(theta, aboutPoint) {\n var rotationMatrix;\n rotationMatrix = Matrix(Math.cos(theta), Math.sin(theta), -Math.sin(theta), Math.cos(theta));\n if (aboutPoint != null) {\n rotationMatrix = Matrix.translation(aboutPoint.x, aboutPoint.y).concat(rotationMatrix).concat(Matrix.translation(-aboutPoint.x, -aboutPoint.y));\n }\n return rotationMatrix;\n };\n /**\n Returns a matrix that corresponds to scaling by factors of sx, sy along\n the x and y axis respectively.\n If only one parameter is given the matrix is scaled uniformly along both axis.\n If the optional aboutPoint parameter is given the scaling takes place\n about the given point.\n @see Matrix#scale\n @param {Number} sx The amount to scale by along the x axis or uniformly if no sy is given.\n @param {Number} [sy] The amount to scale by along the y axis.\n @param {Point} [aboutPoint] The point about which the scaling occurs. Defaults to (0,0).\n @returns {Matrix} A matrix transformation representing scaling by sx and sy.\n */\n Matrix.scale = function(sx, sy, aboutPoint) {\n var scaleMatrix;\n sy = sy || sx;\n scaleMatrix = Matrix(sx, 0, 0, sy);\n if (aboutPoint) {\n scaleMatrix = Matrix.translation(aboutPoint.x, aboutPoint.y).concat(scaleMatrix).concat(Matrix.translation(-aboutPoint.x, -aboutPoint.y));\n }\n return scaleMatrix;\n };\n /**\n Returns a matrix that corresponds to a translation of tx, ty.\n @see Matrix#translate\n @param {Number} tx The amount to translate in the x direction.\n @param {Number} ty The amount to translate in the y direction.\n @return {Matrix} A matrix transformation representing a translation by tx and ty.\n */\n Matrix.translate = Matrix.translation = function(tx, ty) {\n return Matrix(1, 0, 0, 1, tx, ty);\n };\n /**\n A constant representing the identity matrix.\n @name IDENTITY\n @fieldOf Matrix\n */\n Matrix.IDENTITY = Matrix();\n /**\n A constant representing the horizontal flip transformation matrix.\n @name HORIZONTAL_FLIP\n @fieldOf Matrix\n */\n Matrix.HORIZONTAL_FLIP = Matrix(-1, 0, 0, 1);\n /**\n A constant representing the vertical flip transformation matrix.\n @name VERTICAL_FLIP\n @fieldOf Matrix\n */\n Matrix.VERTICAL_FLIP = Matrix(1, 0, 0, -1);\n if (Object.freeze) {\n Object.freeze(Matrix.IDENTITY);\n Object.freeze(Matrix.HORIZONTAL_FLIP);\n Object.freeze(Matrix.VERTICAL_FLIP);\n }\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Matrix\"] = Matrix;\n})();;\n/** \nReturns the absolute value of this number.\n\n<code><pre>\n(-4).abs()\n# => 4\n</pre></code>\n\n@name abs\n@methodOf Number#\n@returns {Number} The absolute value of the number.\n*/Number.prototype.abs = function() {\n return Math.abs(this);\n};\n/**\nReturns the mathematical ceiling of this number.\n\n<code><pre>\n4.9.ceil() \n# => 5\n\n4.2.ceil()\n# => 5\n\n(-1.2).ceil()\n# => -1\n</pre></code>\n\n@name ceil\n@methodOf Number#\n@returns {Number} The number truncated to the nearest integer of greater than or equal value.\n*/\nNumber.prototype.ceil = function() {\n return Math.ceil(this);\n};\n/**\nReturns the mathematical floor of this number.\n\n<code><pre>\n4.9.floor()\n# => 4\n\n4.2.floor()\n# => 4\n\n(-1.2).floor()\n# => -2\n</pre></code>\n\n@name floor\n@methodOf Number#\n@returns {Number} The number truncated to the nearest integer of less than or equal value.\n*/\nNumber.prototype.floor = function() {\n return Math.floor(this);\n};\n/**\nReturns this number rounded to the nearest integer.\n\n<code><pre>\n4.5.round()\n# => 5\n\n4.4.round()\n# => 4\n</pre></code>\n\n@name round\n@methodOf Number#\n@returns {Number} The number rounded to the nearest integer.\n*/\nNumber.prototype.round = function() {\n return Math.round(this);\n};\n/**\nReturns a number whose value is limited to the given range.\n\n<code><pre>\n# limit the output of this computation to between 0 and 255\n(2 * 255).clamp(0, 255)\n# => 255\n</pre></code>\n\n@name clamp\n@methodOf Number#\n@param {Number} min The lower boundary of the output range\n@param {Number} max The upper boundary of the output range\n@returns {Number} A number in the range [min, max]\n*/\nNumber.prototype.clamp = function(min, max) {\n return Math.min(Math.max(this, min), max);\n};\n/**\nA mod method useful for array wrapping. The range of the function is\nconstrained to remain in bounds of array indices.\n\n<code><pre>\n(-1).mod(5)\n# => 4\n</pre></code>\n\n@name mod\n@methodOf Number#\n@param {Number} base\n@returns {Number} An integer between 0 and (base - 1) if base is positive.\n*/\nNumber.prototype.mod = function(base) {\n var result;\n result = this % base;\n if (result < 0 && base > 0) {\n result += base;\n }\n return result;\n};\n/**\nGet the sign of this number as an integer (1, -1, or 0).\n\n<code><pre>\n(-5).sign()\n# => -1\n\n0.sign()\n# => 0\n\n5.sign()\n# => 1\n</pre></code>\n\n@name sign\n@methodOf Number#\n@returns {Number} The sign of this number, 0 if the number is 0.\n*/\nNumber.prototype.sign = function() {\n if (this > 0) {\n return 1;\n } else if (this < 0) {\n return -1;\n } else {\n return 0;\n }\n};\n/**\nReturns true if this number is even (evenly divisible by 2).\n\n<code><pre>\n2.even()\n# => true\n\n3.even()\n# => false\n\n0.even()\n# => true \n</pre></code>\n\n@name even\n@methodOf Number#\n@returns {Boolean} true if this number is an even integer, false otherwise.\n*/\nNumber.prototype.even = function() {\n return this % 2 === 0;\n};\n/**\nReturns true if this number is odd (has remainder of 1 when divided by 2).\n\n<code><pre>\n2.odd()\n# => false\n\n3.odd()\n# => true\n\n0.odd()\n# => false \n</pre></code>\n\n@name odd\n@methodOf Number#\n@returns {Boolean} true if this number is an odd integer, false otherwise.\n*/\nNumber.prototype.odd = function() {\n if (this > 0) {\n return this % 2 === 1;\n } else {\n return this % 2 === -1;\n }\n};\n/**\nCalls iterator the specified number of times, passing in the number of the \ncurrent iteration as a parameter: 0 on first call, 1 on the second call, etc. \n\n<code><pre>\noutput = []\n\n5.times (n) ->\n output.push(n)\n\noutput\n# => [0, 1, 2, 3, 4]\n</pre></code>\n\n@name times\n@methodOf Number#\n@param {Function} iterator The iterator takes a single parameter, the number of the current iteration.\n@param {Object} [context] The optional context parameter specifies an object to treat as <code>this</code> in the iterator block.\n@returns {Number} The number of times the iterator was called.\n*/\nNumber.prototype.times = function(iterator, context) {\n var i;\n i = -1;\n while (++i < this) {\n iterator.call(context, i);\n }\n return i;\n};\n/**\nReturns the the nearest grid resolution less than or equal to the number. \n\n<code><pre>\n7.snap(8) \n# => 0\n\n4.snap(8) \n# => 0\n\n12.snap(8) \n# => 8\n</pre></code>\n\n@name snap\n@methodOf Number#\n@param {Number} resolution The grid resolution to snap to.\n@returns {Number} The nearest multiple of resolution lower than the number.\n*/\nNumber.prototype.snap = function(resolution) {\n var n;\n n = this / resolution;\n 1 / 1;\n return n.floor() * resolution;\n};\n/**\nIn number theory, integer factorization or prime factorization is the\nbreaking down of a composite number into smaller non-trivial divisors,\nwhich when multiplied together equal the original integer.\n\nFloors the number for purposes of factorization.\n\n<code><pre>\n60.primeFactors()\n# => [2, 2, 3, 5]\n\n37.primeFactors()\n# => [37]\n</pre></code>\n\n@name primeFactors\n@methodOf Number#\n@returns {Array} An array containing the factorization of this number.\n*/\nNumber.prototype.primeFactors = function() {\n var factors, i, iSquared, n;\n factors = [];\n n = Math.floor(this);\n if (n === 0) {\n return;\n }\n if (n < 0) {\n factors.push(-1);\n n /= -1;\n }\n i = 2;\n iSquared = i * i;\n while (iSquared < n) {\n while ((n % i) === 0) {\n factors.push(i);\n n /= i;\n }\n i += 1;\n iSquared = i * i;\n }\n if (n !== 1) {\n factors.push(n);\n }\n return factors;\n};\n/**\nReturns the two character hexidecimal \nrepresentation of numbers 0 through 255.\n\n<code><pre>\n255.toColorPart()\n# => \"ff\"\n\n0.toColorPart()\n# => \"00\"\n\n200.toColorPart()\n# => \"c8\"\n</pre></code>\n\n@name toColorPart\n@methodOf Number#\n@returns {String} Hexidecimal representation of the number\n*/\nNumber.prototype.toColorPart = function() {\n var s;\n s = parseInt(this.clamp(0, 255), 10).toString(16);\n if (s.length === 1) {\n s = '0' + s;\n }\n return s;\n};\n/**\nReturns a number that is maxDelta closer to target.\n\n<code><pre>\n255.approach(0, 5)\n# => 250\n\n5.approach(0, 10)\n# => 0\n</pre></code>\n\n@name approach\n@methodOf Number#\n@returns {Number} A number maxDelta toward target\n*/\nNumber.prototype.approach = function(target, maxDelta) {\n return (target - this).clamp(-maxDelta, maxDelta) + this;\n};\n/**\nReturns a number that is closer to the target by the ratio.\n\n<code><pre>\n255.approachByRatio(0, 0.1)\n# => 229.5\n</pre></code>\n\n@name approachByRatio\n@methodOf Number#\n@returns {Number} A number toward target by the ratio\n*/\nNumber.prototype.approachByRatio = function(target, ratio) {\n return this.approach(target, this * ratio);\n};\n/**\nReturns a number that is closer to the target angle by the delta.\n\n<code><pre>\nMath.PI.approachRotation(0, Math.PI/4)\n# => 2.356194490192345 # this is (3/4) * Math.PI, which is (1/4) * Math.PI closer to 0 from Math.PI\n</pre></code>\n\n@name approachRotation\n@methodOf Number#\n@returns {Number} A number toward the target angle by maxDelta\n*/\nNumber.prototype.approachRotation = function(target, maxDelta) {\n while (target > this + Math.PI) {\n target -= Math.TAU;\n }\n while (target < this - Math.PI) {\n target += Math.TAU;\n }\n return (target - this).clamp(-maxDelta, maxDelta) + this;\n};\n/**\nConstrains a rotation to between -PI and PI.\n\n<code><pre>\n(9/4 * Math.PI).constrainRotation() \n# => 0.7853981633974483 # this is (1/4) * Math.PI\n</pre></code>\n\n@name constrainRotation\n@methodOf Number#\n@returns {Number} This number constrained between -PI and PI.\n*/\nNumber.prototype.constrainRotation = function() {\n var target;\n target = this;\n while (target > Math.PI) {\n target -= Math.TAU;\n }\n while (target < -Math.PI) {\n target += Math.TAU;\n }\n return target;\n};\n/**\nThe mathematical d operator. Useful for simulating dice rolls.\n\n@name d\n@methodOf Number#\n@returns {Number} The sum of rolling <code>this</code> many <code>sides</code>-sided dice\n*/\nNumber.prototype.d = function(sides) {\n var sum;\n sum = 0;\n this.times(function() {\n return sum += rand(sides) + 1;\n });\n return sum;\n};\n/** \nThe mathematical circle constant of 1 turn.\n\n@name TAU\n@fieldOf Math\n*/\nMath.TAU = 2 * Math.PI;;\n/**\nChecks whether an object is an array.\n\n<code><pre>\nObject.isArray([1, 2, 4])\n# => true\n\nObject.isArray({key: \"value\"})\n# => false\n</pre></code>\n\n@name isArray\n@methodOf Object\n@param {Object} object The object to check for array-ness.\n@returns {Boolean} A boolean expressing whether the object is an instance of Array \n*/var __slice = Array.prototype.slice;\nObject.isArray = function(object) {\n return Object.prototype.toString.call(object) === '[object Array]';\n};\n/**\nMerges properties from objects into target without overiding.\nFirst come, first served.\n\n<code><pre>\n I =\n a: 1\n b: 2\n c: 3\n\n Object.reverseMerge I,\n c: 6\n d: 4 \n\n I # => {a: 1, b:2, c:3, d: 4}\n</pre></code>\n\n@name reverseMerge\n@methodOf Object\n@param {Object} target The object to merge the properties into.\n@returns {Object} target\n*/\nObject.reverseMerge = function() {\n var name, object, objects, target, _i, _len;\n target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = objects.length; _i < _len; _i++) {\n object = objects[_i];\n for (name in object) {\n if (!target.hasOwnProperty(name)) {\n target[name] = object[name];\n }\n }\n }\n return target;\n};\n/**\nMerges properties from sources into target with overiding.\nLast in covers earlier properties.\n\n<code><pre>\n I =\n a: 1\n b: 2\n c: 3\n\n Object.extend I,\n c: 6\n d: 4\n\n I # => {a: 1, b:2, c:6, d: 4}\n</pre></code>\n\n@name extend\n@methodOf Object\n@param {Object} target The object to merge the properties into.\n@returns {Object} target\n*/\nObject.extend = function() {\n var name, source, sources, target, _i, _len;\n target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = sources.length; _i < _len; _i++) {\n source = sources[_i];\n for (name in source) {\n target[name] = source[name];\n }\n }\n return target;\n};\n/**\nHelper method that tells you if something is an object.\n\n<code><pre>\nobject = {a: 1}\n\nObject.isObject(object)\n# => true\n</pre></code>\n\n@name isObject\n@methodOf Object\n@param {Object} object Maybe this guy is an object.\n@returns {Boolean} true if this guy is an object.\n*/\nObject.isObject = function(object) {\n return Object.prototype.toString.call(object) === '[object Object]';\n};;\n(function() {\n /**\n Create a new point with given x and y coordinates. If no arguments are given\n defaults to (0, 0).\n\n <code><pre>\n point = Point()\n\n p.x\n # => 0\n\n p.y\n # => 0\n\n point = Point(-2, 5)\n\n p.x\n # => -2\n\n p.y\n # => 5\n </pre></code>\n\n @name Point\n @param {Number} [x]\n @param {Number} [y]\n @constructor\n */ var Point;\n Point = function(x, y) {\n return {\n __proto__: Point.prototype,\n /**\n The x coordinate of this point.\n @name x\n @fieldOf Point#\n */\n x: x || 0,\n /**\n The y coordinate of this point.\n @name y\n @fieldOf Point#\n */\n y: y || 0\n };\n };\n Point.prototype = {\n /**\n Creates a copy of this point.\n\n @name copy\n @methodOf Point#\n @returns {Point} A new point with the same x and y value as this point.\n\n <code><pre>\n point = Point(1, 1)\n pointCopy = point.copy()\n\n point.equal(pointCopy)\n # => true\n\n point == pointCopy\n # => false \n </pre></code>\n */\n copy: function() {\n return Point(this.x, this.y);\n },\n /**\n Adds a point to this one and returns the new point. You may\n also use a two argument call like <code>point.add(x, y)</code>\n to add x and y values without a second point object.\n\n <code><pre>\n point = Point(2, 3).add(Point(3, 4))\n\n point.x\n # => 5\n\n point.y\n # => 7\n\n anotherPoint = Point(2, 3).add(3, 4)\n\n anotherPoint.x\n # => 5\n\n anotherPoint.y\n # => 7\n </pre></code>\n\n @name add\n @methodOf Point#\n @param {Point} other The point to add this point to.\n @returns {Point} A new point, the sum of both.\n */\n add: function(first, second) {\n return this.copy().add$(first, second);\n },\n /**\n Adds a point to this one, returning a modified point. You may\n also use a two argument call like <code>point.add(x, y)</code>\n to add x and y values without a second point object.\n\n <code><pre>\n point = Point(2, 3)\n\n point.x\n # => 2\n\n point.y\n # => 3\n\n point.add$(Point(3, 4))\n\n point.x\n # => 5\n\n point.y\n # => 7\n\n anotherPoint = Point(2, 3)\n anotherPoint.add$(3, 4)\n\n anotherPoint.x\n # => 5\n\n anotherPoint.y\n # => 7\n </pre></code>\n\n @name add$\n @methodOf Point#\n @param {Point} other The point to add this point to.\n @returns {Point} The sum of both points.\n */\n add$: function(first, second) {\n if (second != null) {\n this.x += first;\n this.y += second;\n } else {\n this.x += first.x;\n this.y += first.y;\n }\n return this;\n },\n /**\n Subtracts a point to this one and returns the new point.\n\n <code><pre>\n point = Point(1, 2).subtract(Point(2, 0))\n\n point.x\n # => -1\n\n point.y\n # => 2\n\n anotherPoint = Point(1, 2).subtract(2, 0)\n\n anotherPoint.x\n # => -1\n\n anotherPoint.y\n # => 2\n </pre></code>\n\n @name subtract\n @methodOf Point#\n @param {Point} other The point to subtract from this point.\n @returns {Point} A new point, this - other.\n */\n subtract: function(first, second) {\n return this.copy().subtract$(first, second);\n },\n /**\n Subtracts a point to this one and returns the new point.\n\n <code><pre>\n point = Point(1, 2)\n\n point.x\n # => 1\n\n point.y\n # => 2\n\n point.subtract$(Point(2, 0))\n\n point.x\n # => -1\n\n point.y\n # => 2\n\n anotherPoint = Point(1, 2)\n anotherPoint.subtract$(2, 0)\n\n anotherPoint.x\n # => -1\n\n anotherPoint.y\n # => 2\n </pre></code>\n\n @name subtract$\n @methodOf Point#\n @param {Point} other The point to subtract from this point.\n @returns {Point} The difference of the two points.\n */\n subtract$: function(first, second) {\n if (second != null) {\n this.x -= first;\n this.y -= second;\n } else {\n this.x -= first.x;\n this.y -= first.y;\n }\n return this;\n },\n /**\n Scale this Point (Vector) by a constant amount.\n\n <code><pre>\n point = Point(5, 6).scale(2)\n\n point.x\n # => 10\n\n point.y\n # => 12\n </pre></code>\n\n @name scale\n @methodOf Point#\n @param {Number} scalar The amount to scale this point by.\n @returns {Point} A new point, this * scalar.\n */\n scale: function(scalar) {\n return this.copy().scale$(scalar);\n },\n /**\n Scale this Point (Vector) by a constant amount. Modifies the point in place.\n\n <code><pre>\n point = Point(5, 6)\n\n point.x\n # => 5\n\n point.y\n # => 6\n\n point.scale$(2)\n\n point.x\n # => 10\n\n point.y\n # => 12\n </pre></code>\n\n @name scale$\n @methodOf Point#\n @param {Number} scalar The amount to scale this point by.\n @returns {Point} this * scalar.\n */\n scale$: function(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n /**\n The norm of a vector is the unit vector pointing in the same direction. This method\n treats the point as though it is a vector from the origin to (x, y).\n\n <code><pre>\n point = Point(2, 3).norm()\n\n point.x\n # => 0.5547001962252291\n\n point.y \n # => 0.8320502943378437\n\n anotherPoint = Point(2, 3).norm(2)\n\n anotherPoint.x\n # => 1.1094003924504583\n\n anotherPoint.y \n # => 1.6641005886756874 \n </pre></code>\n\n @name norm\n @methodOf Point#\n @returns {Point} The unit vector pointing in the same direction as this vector.\n */\n norm: function(length) {\n if (length == null) {\n length = 1.0;\n }\n return this.copy().norm$(length);\n },\n /**\n The norm of a vector is the unit vector pointing in the same direction. This method\n treats the point as though it is a vector from the origin to (x, y). Modifies the point in place.\n\n <code><pre>\n point = Point(2, 3).norm$()\n\n point.x\n # => 0.5547001962252291\n\n point.y \n # => 0.8320502943378437\n\n anotherPoint = Point(2, 3).norm$(2)\n\n anotherPoint.x\n # => 1.1094003924504583\n\n anotherPoint.y \n # => 1.6641005886756874 \n </pre></code>\n\n @name norm$\n @methodOf Point#\n @returns {Point} The unit vector pointing in the same direction as this vector.\n */\n norm$: function(length) {\n var m;\n if (length == null) {\n length = 1.0;\n }\n if (m = this.length()) {\n return this.scale$(length / m);\n } else {\n return this;\n }\n },\n /**\n Floor the x and y values, returning a new point.\n\n <code><pre>\n point = Point(3.4, 5.8).floor()\n\n point.x\n # => 3\n\n point.y\n # => 5\n </pre></code>\n\n @name floor\n @methodOf Point#\n @returns {Point} A new point, with x and y values each floored to the largest previous integer.\n */\n floor: function() {\n return this.copy().floor$();\n },\n /**\n Floor the x and y values, returning a modified point.\n\n <code><pre>\n point = Point(3.4, 5.8)\n point.floor$()\n\n point.x\n # => 3\n\n point.y\n # => 5\n </pre></code>\n\n @name floor$\n @methodOf Point#\n @returns {Point} A modified point, with x and y values each floored to the largest previous integer.\n */\n floor$: function() {\n this.x = this.x.floor();\n this.y = this.y.floor();\n return this;\n },\n /**\n Determine whether this point is equal to another point.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(2, 3)\n pointC = Point(4, 5)\n\n pointA.equal(pointB)\n # => true\n\n pointA.equal(pointC)\n # => false\n </pre></code>\n\n @name equal\n @methodOf Point#\n @param {Point} other The point to check for equality.\n @returns {Boolean} true if the other point has the same x, y coordinates, false otherwise.\n */\n equal: function(other) {\n return this.x === other.x && this.y === other.y;\n },\n /**\n Computed the length of this point as though it were a vector from (0,0) to (x,y).\n\n <code><pre>\n point = Point(5, 7)\n\n point.length()\n # => 8.602325267042627\n </pre></code>\n\n @name length\n @methodOf Point#\n @returns {Number} The length of the vector from the origin to this point.\n */\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n /**\n Calculate the magnitude of this Point (Vector).\n\n <code><pre>\n point = Point(5, 7)\n\n point.magnitude()\n # => 8.602325267042627\n </pre></code>\n\n @name magnitude\n @methodOf Point#\n @returns {Number} The magnitude of this point as if it were a vector from (0, 0) -> (x, y).\n */\n magnitude: function() {\n return this.length();\n },\n /**\n Returns the direction in radians of this point from the origin.\n\n <code><pre>\n point = Point(0, 1)\n\n point.direction()\n # => 1.5707963267948966 # Math.PI / 2\n </pre></code>\n\n @name direction\n @methodOf Point#\n @returns {Number} The direction in radians of this point from the origin\n */\n direction: function() {\n return Math.atan2(this.y, this.x);\n },\n /**\n Calculate the dot product of this point and another point (Vector).\n @name dot\n @methodOf Point#\n @param {Point} other The point to dot with this point.\n @returns {Number} The dot product of this point dot other as a scalar value.\n */\n dot: function(other) {\n return this.x * other.x + this.y * other.y;\n },\n /**\n Calculate the cross product of this point and another point (Vector). \n Usually cross products are thought of as only applying to three dimensional vectors,\n but z can be treated as zero. The result of this method is interpreted as the magnitude \n of the vector result of the cross product between [x1, y1, 0] x [x2, y2, 0]\n perpendicular to the xy plane.\n\n @name cross\n @methodOf Point#\n @param {Point} other The point to cross with this point.\n @returns {Number} The cross product of this point with the other point as scalar value.\n */\n cross: function(other) {\n return this.x * other.y - other.x * this.y;\n },\n /**\n Compute the Euclidean distance between this point and another point.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(9, 2)\n\n pointA.distance(pointB)\n # => 7.0710678118654755 # Math.sqrt(50)\n </pre></code>\n\n @name distance\n @methodOf Point#\n @param {Point} other The point to compute the distance to.\n @returns {Number} The distance between this point and another point.\n */\n distance: function(other) {\n return Point.distance(this, other);\n }\n /**\n Compute the Euclidean distance between two points.\n\n <code><pre>\n pointA = Point(2, 3)\n pointB = Point(9, 2)\n\n Point.distance(pointA, pointB)\n # => 7.0710678118654755 # Math.sqrt(50)\n </pre></code>\n\n @name distance\n @fieldOf Point\n @param {Point} p1\n @param {Point} p2\n @returns {Number} The Euclidean distance between two points.\n */\n };\n Point.distance = function(p1, p2) {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n };\n /**\n Construct a point on the unit circle for the given angle.\n\n <code><pre>\n point = Point.fromAngle(Math.PI / 2)\n\n point.x\n # => 0\n\n point.y\n # => 1\n </pre></code>\n\n @name fromAngle\n @fieldOf Point\n @param {Number} angle The angle in radians\n @returns {Point} The point on the unit circle.\n */\n Point.fromAngle = function(angle) {\n return Point(Math.cos(angle), Math.sin(angle));\n };\n /**\n If you have two dudes, one standing at point p1, and the other\n standing at point p2, then this method will return the direction\n that the dude standing at p1 will need to face to look at p2.\n\n <code><pre>\n p1 = Point(0, 0)\n p2 = Point(7, 3)\n\n Point.direction(p1, p2)\n # => 0.40489178628508343\n </pre></code>\n\n @name direction\n @fieldOf Point\n @param {Point} p1 The starting point.\n @param {Point} p2 The ending point.\n @returns {Number} The direction from p1 to p2 in radians.\n */\n Point.direction = function(p1, p2) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n };\n /**\n @name ZERO\n @fieldOf Point\n @returns {Point} The point (0, 0)\n */\n Point.ZERO = Point();\n if (Object.freeze) {\n Object.freeze(Point.ZERO);\n }\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Point\"] = Point;\n})();;\n(function() {\n /**\n @name Random\n @namespace Some useful methods for generating random things.\n */ (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Random\"] = {\n /**\n Returns a random angle, uniformly distributed, between 0 and 2pi.\n\n @name angle\n @methodOf Random\n @returns {Number} A random angle between 0 and 2pi\n */\n angle: function() {\n return rand() * Math.TAU;\n },\n /**\n Returns a random color.\n\n @name color\n @methodOf Random\n @returns {Color} A random color\n */\n color: function() {\n return Color.random();\n },\n /**\n Happens often.\n\n @name often\n @methodOf Random\n */\n often: function() {\n return rand(3);\n },\n /**\n Happens sometimes.\n\n @name sometimes\n @methodOf Random\n */\n sometimes: function() {\n return !rand(3);\n }\n /**\n Returns random integers from [0, n) if n is given.\n Otherwise returns random float between 0 and 1.\n\n @name rand\n @methodOf window\n @param {Number} n\n @returns {Number} A random integer from 0 to n - 1 if n is given. If n is not given, a random float between 0 and 1. \n */\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"rand\"] = function(n) {\n if (n) {\n return Math.floor(n * Math.random());\n } else {\n return Math.random();\n }\n };\n})();;\n/**\nReturns true if this string only contains whitespace characters.\n\n<code><pre>\n\"\".blank()\n# => true\n\n\"hello\".blank()\n# => false\n\n\" \".blank()\n# => true\n</pre></code>\n\n@name blank\n@methodOf String#\n@returns {Boolean} Whether or not this string is blank.\n*/String.prototype.blank = function() {\n return /^\\s*$/.test(this);\n};\n/**\nReturns a new string that is a camelCase version.\n\n<code><pre>\n\"camel_case\".camelize()\n\"camel-case\".camelize()\n\"camel case\".camelize()\n\n# => \"camelCase\"\n</pre></code>\n\n@name camelize\n@methodOf String#\n@returns {String} A new string. camelCase version of `this`. \n*/\nString.prototype.camelize = function() {\n return this.trim().replace(/(\\-|_|\\s)+(.)?/g, function(match, separator, chr) {\n if (chr) {\n return chr.toUpperCase();\n } else {\n return '';\n }\n });\n};\n/**\nReturns a new string with the first letter capitalized and the rest lower cased.\n\n<code><pre>\n\"capital\".capitalize()\n\"cAPITAL\".capitalize()\n\"cApItAl\".capitalize()\n\"CAPITAL\".capitalize()\n\n# => \"Capital\"\n</pre></code>\n\n@name capitalize\n@methodOf String#\n@returns {String} A new string. Capitalized version of `this`\n*/\nString.prototype.capitalize = function() {\n return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\n};\n/**\nReturn the class or constant named in this string.\n\n<code><pre>\n\n\"Constant\".constantize()\n# => Constant\n# notice this isn't a string. Useful for calling methods on class with the same name as `this`.\n</pre></code>\n\n@name constantize\n@methodOf String#\n@returns {Object} The class or constant named in this string.\n*/\nString.prototype.constantize = function() {\n if (this.match(/[A-Z][A-Za-z0-9]*/)) {\n eval(\"var that = \" + this);\n return that;\n } else {\n throw \"String#constantize: '\" + this + \"' is not a valid constant name.\";\n }\n};\n/**\nReturns a new string that is a more human readable version.\n\n<code><pre>\n\"player_id\".humanize()\n# => \"Player\"\n\n\"player_ammo\".humanize()\n# => \"Player ammo\"\n</pre></code>\n\n@name humanize\n@methodOf String#\n@returns {String} A new string. Replaces _id and _ with \"\" and capitalizes the word.\n*/\nString.prototype.humanize = function() {\n return this.replace(/_id$/, \"\").replace(/_/g, \" \").capitalize();\n};\n/**\nReturns true.\n\n@name isString\n@methodOf String#\n@returns {Boolean} true\n*/\nString.prototype.isString = function() {\n return true;\n};\n/**\nParse this string as though it is JSON and return the object it represents. If it\nis not valid JSON returns the string itself.\n\n<code><pre>\n# this is valid json, so an object is returned\n'{\"a\": 3}'.parse()\n# => {a: 3}\n\n# double quoting instead isn't valid JSON so a string is returned\n\"{'a': 3}\".parse()\n# => \"{'a': 3}\"\n\n</pre></code>\n\n@name parse\n@methodOf String#\n@returns {Object} Returns an object from the JSON this string contains. If it is not valid JSON returns the string itself.\n*/\nString.prototype.parse = function() {\n try {\n return JSON.parse(this.toString());\n } catch (e) {\n return this.toString();\n }\n};\n/**\nReturns a new string in Title Case.\n\n<code><pre>\n\"title-case\".titleize()\n# => \"Title Case\"\n\n\"title case\".titleize()\n# => \"Title Case\"\n</pre></code>\n\n@name titleize\n@methodOf String#\n@returns {String} A new string. Title Cased.\n*/\nString.prototype.titleize = function() {\n return this.split(/[- ]/).map(function(word) {\n return word.capitalize();\n }).join(' ');\n};\n/**\nUnderscore a word, changing camelCased with under_scored.\n\n<code><pre>\n\"UNDERScore\".underscore()\n# => \"under_score\"\n\n\"UNDER-SCORE\".underscore()\n# => \"under_score\"\n\n\"UnDEr-SCorE\".underscore()\n# => \"un_d_er_s_cor_e\"\n</pre></code>\n\n@name underscore\n@methodOf String#\n@returns {String} A new string. Separated by _.\n*/\nString.prototype.underscore = function() {\n return this.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase();\n};\n/**\nAssumes the string is something like a file name and returns the \ncontents of the string without the extension.\n\n<code><pre>\n\"neat.png\".witouthExtension() \n# => \"neat\"\n</pre></code>\n\n@name withoutExtension\n@methodOf String#\n@returns {String} A new string without the extension name.\n*/\nString.prototype.withoutExtension = function() {\n return this.replace(/\\.[^\\.]*$/, '');\n};;\n/**\nNon-standard\n\n@name toSource\n@methodOf Boolean#\n*/\n/**\nReturns a string representing the specified Boolean object.\n\n<code><em>bool</em>.toString()</code>\n\n@name toString\n@methodOf Boolean#\n*/\n/**\nReturns the primitive value of a Boolean object.\n\n<code><em>bool</em>.valueOf()</code>\n\n@name valueOf\n@methodOf Boolean#\n*/\n/**\nReturns a string representing the Number object in exponential notation\n\n<code><i>number</i>.toExponential( [<em>fractionDigits</em>] )</code>\n@param fractionDigits\nAn integer specifying the number of digits after the decimal point. Defaults\nto as many digits as necessary to specify the number.\n@name toExponential\n@methodOf Number#\n*/\n/**\nFormats a number using fixed-point notation\n\n<code><i>number</i>.toFixed( [<em>digits</em>] )</code>\n@param digits The number of digits to appear after the decimal point; this\nmay be a value between 0 and 20, inclusive, and implementations may optionally\nsupport a larger range of values. If this argument is omitted, it is treated as\n0.\n@name toFixed\n@methodOf Number#\n*/\n/**\nnumber.toLocaleString();\n\n@name toLocaleString\n@methodOf Number#\n*/\n/**\nReturns a string representing the Number object to the specified precision. \n\n<code><em>number</em>.toPrecision( [ <em>precision</em> ] )</code>\n@param precision An integer specifying the number of significant digits.\n@name toPrecision\n@methodOf Number#\n*/\n/**\nNon-standard\n\n@name toSource\n@methodOf Number#\n*/\n/**\nReturns a string representing the specified Number object\n\n<code><i>number</i>.toString( [<em>radix</em>] )</code>\n@param radix\nAn integer between 2 and 36 specifying the base to use for representing\nnumeric values.\n@name toString\n@methodOf Number#\n*/\n/**\nReturns the primitive value of a Number object.\n\n@name valueOf\n@methodOf Number#\n*/\n/**\nReturns the specified character from a string.\n\n<code><em>string</em>.charAt(<em>index</em>)</code>\n@param index An integer between 0 and 1 less than the length of the string.\n@name charAt\n@methodOf String#\n*/\n/**\nReturns the numeric Unicode value of the character at the given index (except\nfor unicode codepoints > 0x10000).\n\n\n@param index An integer greater than 0 and less than the length of the string;\nif it is not a number, it defaults to 0.\n@name charCodeAt\n@methodOf String#\n*/\n/**\nCombines the text of two or more strings and returns a new string.\n\n<code><em>string</em>.concat(<em>string2</em>, <em>string3</em>[, ..., <em>stringN</em>])</code>\n@param string2...stringN Strings to concatenate to this string.\n@name concat\n@methodOf String#\n*/\n/**\nReturns the index within the calling String object of the first occurrence of\nthe specified value, starting the search at fromIndex,\nreturns -1 if the value is not found.\n\n<code><em>string</em>.indexOf(<em>searchValue</em>[, <em>fromIndex</em>]</code>\n@param searchValue A string representing the value to search for.\n@param fromIndex The location within the calling string to start the search\nfrom. It can be any integer between 0 and the length of the string. The default\nvalue is 0.\n@name indexOf\n@methodOf String#\n*/\n/**\nReturns the index within the calling String object of the last occurrence of the\nspecified value, or -1 if not found. The calling string is searched backward,\nstarting at fromIndex.\n\n<code><em>string</em>.lastIndexOf(<em>searchValue</em>[, <em>fromIndex</em>])</code>\n@param searchValue A string representing the value to search for.\n@param fromIndex The location within the calling string to start the search\nfrom, indexed from left to right. It can be any integer between 0 and the length\nof the string. The default value is the length of the string.\n@name lastIndexOf\n@methodOf String#\n*/\n/**\nReturns a number indicating whether a reference string comes before or after or\nis the same as the given string in sort order.\n\n<code> localeCompare(compareString) </code>\n\n@name localeCompare\n@methodOf String#\n*/\n/**\nUsed to retrieve the matches when matching a string against a regular\nexpression.\n\n<code><em>string</em>.match(<em>regexp</em>)</code>\n@param regexp A regular expression object. If a non-RegExp object obj is passed,\nit is implicitly converted to a RegExp by using new RegExp(obj).\n@name match\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name quote\n@methodOf String#\n*/\n/**\nReturns a new string with some or all matches of a pattern replaced by a\nreplacement. The pattern can be a string or a RegExp, and the replacement can\nbe a string or a function to be called for each match.\n\n<code><em>str</em>.replace(<em>regexp|substr</em>, <em>newSubStr|function[</em>, </code><code><em>flags]</em>);</code>\n@param regexp A RegExp object. The match is replaced by the return value of\nparameter #2.\n@param substr A String that is to be replaced by newSubStr.\n@param newSubStr The String that replaces the substring received from parameter\n#1. A number of special replacement patterns are supported; see the \"Specifying\na string as a parameter\" section below.\n@param function A function to be invoked to create the new substring (to put in\nplace of the substring received from parameter #1). The arguments supplied to\nthis function are described in the \"Specifying a function as a parameter\"\nsection below.\n@param flags gimy \n\nNon-standardThe use of the flags parameter in the String.replace method is\nnon-standard. For cross-browser compatibility, use a RegExp object with\ncorresponding flags.A string containing any combination of the RegExp flags: g\nglobal match i ignore case m match over multiple lines y Non-standard \nsticky global matchignore casematch over multiple linesNon-standard sticky\n@name replace\n@methodOf String#\n*/\n/**\nExecutes the search for a match between a regular expression and this String\nobject.\n\n<code><em>string</em>.search(<em>regexp</em>)</code>\n@param regexp A regular expression object. If a non-RegExp object obj is\npassed, it is implicitly converted to a RegExp by using new RegExp(obj).\n@name search\n@methodOf String#\n*/\n/**\nExtracts a section of a string and returns a new string.\n\n<code><em>string</em>.slice(<em>beginslice</em>[, <em>endSlice</em>])</code>\n@param beginSlice The zero-based index at which to begin extraction.\n@param endSlice The zero-based index at which to end extraction. If omitted,\nslice extracts to the end of the string.\n@name slice\n@methodOf String#\n*/\n/**\nSplits a String object into an array of strings by separating the string into\nsubstrings.\n\n<code><em>string</em>.split([<em>separator</em>][, <em>limit</em>])</code>\n@param separator Specifies the character to use for separating the string. The\nseparator is treated as a string or a regular expression. If separator is\nomitted, the array returned contains one element consisting of the entire\nstring.\n@param limit Integer specifying a limit on the number of splits to be found.\n@name split\n@methodOf String#\n*/\n/**\nReturns the characters in a string beginning at the specified location through\nthe specified number of characters.\n\n<code><em>string</em>.substr(<em>start</em>[, <em>length</em>])</code>\n@param start Location at which to begin extracting characters.\n@param length The number of characters to extract.\n@name substr\n@methodOf String#\n*/\n/**\nReturns a subset of a string between one index and another, or through the end\nof the string.\n\n<code><em>string</em>.substring(<em>indexA</em>[, <em>indexB</em>])</code>\n@param indexA An integer between 0 and one less than the length of the string.\n@param indexB (optional) An integer between 0 and the length of the string.\n@name substring\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to lower case, according to any\nlocale-specific case mappings.\n\n<code> toLocaleLowerCase() </code>\n\n@name toLocaleLowerCase\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to upper case, according to any\nlocale-specific case mappings.\n\n<code> toLocaleUpperCase() </code>\n\n@name toLocaleUpperCase\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to lowercase.\n\n<code><em>string</em>.toLowerCase()</code>\n\n@name toLowerCase\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf String#\n*/\n/**\nReturns a string representing the specified object.\n\n<code><em>string</em>.toString()</code>\n\n@name toString\n@methodOf String#\n*/\n/**\nReturns the calling string value converted to uppercase.\n\n<code><em>string</em>.toUpperCase()</code>\n\n@name toUpperCase\n@methodOf String#\n*/\n/**\nRemoves whitespace from both ends of the string.\n\n<code><em>string</em>.trim()</code>\n\n@name trim\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name trimLeft\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name trimRight\n@methodOf String#\n*/\n/**\nReturns the primitive value of a String object.\n\n<code><em>string</em>.valueOf()</code>\n\n@name valueOf\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name anchor\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name big\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code>BLINK</code>\n\n@name blink\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name bold\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name fixed\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code><FONT COLOR=\"<i>color</i>\"></code>\n\n@name fontcolor\n@methodOf String#\n*/\n/**\nNon-standard\n\n<code><FONT SIZE=\"<i>size</i>\"></code>\n\n@name fontsize\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name italics\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name link\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name small\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name strike\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name sub\n@methodOf String#\n*/\n/**\nNon-standard\n\n\n\n@name sup\n@methodOf String#\n*/\n/**\nRemoves the last element from an array and returns that element.\n\n<code>\n<i>array</i>.pop()\n</code>\n\n@name pop\n@methodOf Array#\n*/\n/**\nMutates an array by appending the given elements and returning the new length of\nthe array.\n\n<code><em>array</em>.push(<em>element1</em>, ..., <em>elementN</em>)</code>\n@param element1, ..., elementN The elements to add to the end of the array.\n@name push\n@methodOf Array#\n*/\n/**\nReverses an array in place. The first array element becomes the last and the\nlast becomes the first.\n\n<code><em>array</em>.reverse()</code>\n\n@name reverse\n@methodOf Array#\n*/\n/**\nRemoves the first element from an array and returns that element. This method\nchanges the length of the array.\n\n<code><em>array</em>.shift()</code>\n\n@name shift\n@methodOf Array#\n*/\n/**\nSorts the elements of an array in place.\n\n<code><em>array</em>.sort([<em>compareFunction</em>])</code>\n@param compareFunction Specifies a function that defines the sort order. If\nomitted, the array is sorted lexicographically (in dictionary order) according\nto the string conversion of each element.\n@name sort\n@methodOf Array#\n*/\n/**\nChanges the content of an array, adding new elements while removing old\nelements.\n\n<code><em>array</em>.splice(<em>index</em>, <em>howMany</em>[, <em>element1</em>[, ...[, <em>elementN</em>]]])</code>\n@param index Index at which to start changing the array. If negative, will\nbegin that many elements from the end.\n@param howMany An integer indicating the number of old array elements to\nremove. If howMany is 0, no elements are removed. In this case, you should\nspecify at least one new element. If no howMany parameter is specified (second\nsyntax above, which is a SpiderMonkey extension), all elements after index are\nremoved.\n@param element1, ..., elementN The elements to add to the array. If you don't\nspecify any elements, splice simply removes elements from the array.\n@name splice\n@methodOf Array#\n*/\n/**\nAdds one or more elements to the beginning of an array and returns the new\nlength of the array.\n\n<code><em>arrayName</em>.unshift(<em>element1</em>, ..., <em>elementN</em>) </code>\n@param element1, ..., elementN The elements to add to the front of the array.\n@name unshift\n@methodOf Array#\n*/\n/**\nReturns a new array comprised of this array joined with other array(s) and/or\nvalue(s).\n\n<code><em>array</em>.concat(<em>value1</em>, <em>value2</em>, ..., <em>valueN</em>)</code>\n@param valueN Arrays and/or values to concatenate to the resulting array.\n@name concat\n@methodOf Array#\n*/\n/**\nJoins all elements of an array into a string.\n\n<code><em>array</em>.join(<em>separator</em>)</code>\n@param separator Specifies a string to separate each element of the array. The\nseparator is converted to a string if necessary. If omitted, the array elements\nare separated with a comma.\n@name join\n@methodOf Array#\n*/\n/**\nReturns a one-level deep copy of a portion of an array.\n\n<code><em>array</em>.slice(<em>begin</em>[, <em>end</em>])</code>\n@param begin Zero-based index at which to begin extraction.As a negative index,\nstart indicates an offset from the end of the sequence. slice(-2) extracts the\nsecond-to-last element and the last element in the sequence.\n@param end Zero-based index at which to end extraction. slice extracts up to\nbut not including end.slice(1,4) extracts the second element through the fourth\nelement (elements indexed 1, 2, and 3).As a negative index, end indicates an\noffset from the end of the sequence. slice(2,-1) extracts the third element\nthrough the second-to-last element in the sequence.If end is omitted, slice\nextracts to the end of the sequence.\n@name slice\n@methodOf Array#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Array#\n*/\n/**\nReturns a string representing the specified array and its elements.\n\n<code><em>array</em>.toString()</code>\n\n@name toString\n@methodOf Array#\n*/\n/**\nReturns the first index at which a given element can be found in the array, or\n-1 if it is not present.\n\n<code><em>array</em>.indexOf(<em>searchElement</em>[, <em>fromIndex</em>])</code>\n@param searchElement fromIndex Element to locate in the array.The index at\nwhich to begin the search. Defaults to 0, i.e. the whole array will be searched.\nIf the index is greater than or equal to the length of the array, -1 is\nreturned, i.e. the array will not be searched. If negative, it is taken as the\noffset from the end of the array. Note that even when the index is negative, the\narray is still searched from front to back. If the calculated index is less than\n0, the whole array will be searched.\n@name indexOf\n@methodOf Array#\n*/\n/**\nReturns the last index at which a given element can be found in the array, or -1\nif it is not present. The array is searched backwards, starting at fromIndex.\n\n<code><em>array</em>.lastIndexOf(<em>searchElement</em>[, <em>fromIndex</em>])</code>\n@param searchElement fromIndex Element to locate in the array.The index at\nwhich to start searching backwards. Defaults to the array's length, i.e. the\nwhole array will be searched. If the index is greater than or equal to the\nlength of the array, the whole array will be searched. If negative, it is taken\nas the offset from the end of the array. Note that even when the index is\nnegative, the array is still searched from back to front. If the calculated\nindex is less than 0, -1 is returned, i.e. the array will not be searched.\n@name lastIndexOf\n@methodOf Array#\n*/\n/**\nCreates a new array with all elements that pass the test implemented by the\nprovided function.\n\n<code><em>array</em>.filter(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to test each element of the array.Object to\nuse as this when executing callback.\n@name filter\n@methodOf Array#\n*/\n/**\nExecutes a provided function once per array element.\n\n<code><em>array</em>.forEach(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to execute for each element.Object to use\nas this when executing callback.\n@name forEach\n@methodOf Array#\n*/\n/**\nTests whether all elements in the array pass the test implemented by the\nprovided function.\n\n<code><em>array</em>.every(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callbackthisObject Function to test for each element.Object to use as\nthis when executing callback.\n@name every\n@methodOf Array#\n*/\n/**\nCreates a new array with the results of calling a provided function on every\nelement in this array.\n\n<code><em>array</em>.map(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callbackthisObject Function that produces an element of the new Array\nfrom an element of the current one.Object to use as this when executing\ncallback.\n@name map\n@methodOf Array#\n*/\n/**\nTests whether some element in the array passes the test implemented by the\nprovided function.\n\n<code><em>array</em>.some(<em>callback</em>[, <em>thisObject</em>])</code>\n@param callback thisObject Function to test for each element.Object to use as\nthis when executing callback.\n@name some\n@methodOf Array#\n*/\n/**\nApply a function against an accumulator and each value of the array (from\nleft-to-right) as to reduce it to a single value.\n\n<code><em>array</em>.reduce(<em>callback</em>[, <em>initialValue</em>])</code>\n@param callbackinitialValue Function to execute on each value in the\narray.Object to use as the first argument to the first call of the callback.\n@name reduce\n@methodOf Array#\n*/\n/**\nApply a function simultaneously against two values of the array (from\nright-to-left) as to reduce it to a single value.\n\n<code><em>array</em>.reduceRight(<em>callback</em>[, <em>initialValue</em>])</code>\n@param callback initialValue Function to execute on each value in the\narray.Object to use as the first argument to the first call of the callback.\n@name reduceRight\n@methodOf Array#\n*/\n/**\nReturns a boolean indicating whether the object has the specified property.\n\n<code><em>obj</em>.hasOwnProperty(<em>prop</em>)</code>\n@param prop The name of the property to test.\n@name hasOwnProperty\n@methodOf Object#\n*/\n/**\nCalls a function with a given this value and arguments provided as an array.\n\n<code><em>fun</em>.apply(<em>thisArg</em>[, <em>argsArray</em>])</code>\n@param thisArg Determines the value of this inside fun. If thisArg is null or\nundefined, this will be the global object. Otherwise, this will be equal to\nObject(thisArg) (which is thisArg if thisArg is already an object, or a String,\nBoolean, or Number if thisArg is a primitive value of the corresponding type).\nTherefore, it is always true that typeof this == \"object\" when the function\nexecutes.\n@param argsArray An argument array for the object, specifying the arguments\nwith which fun should be called, or null or undefined if no arguments should be\nprovided to the function.\n@name apply\n@methodOf Function#\n*/\n/**\nCreates a new function that, when called, itself calls this function in the\ncontext of the provided this value, with a given sequence of arguments preceding\nany provided when the new function was called.\n\n<code><em>fun</em>.bind(<em>thisArg</em>[, <em>arg1</em>[, <em>arg2</em>[, ...]]])</code>\n@param thisValuearg1, arg2, ... The value to be passed as the this parameter to\nthe target function when the bound function is called. The value is ignored if\nthe bound function is constructed using the new operator.Arguments to prepend to\narguments provided to the bound function when invoking the target function.\n@name bind\n@methodOf Function#\n*/\n/**\nCalls a function with a given this value and arguments provided individually.\n\n<code><em>fun</em>.call(<em>thisArg</em>[, <em>arg1</em>[, <em>arg2</em>[, ...]]])</code>\n@param thisArg Determines the value of this inside fun. If thisArg is null or\nundefined, this will be the global object. Otherwise, this will be equal to\nObject(thisArg) (which is thisArg if thisArg is already an object, or a String,\nBoolean, or Number if thisArg is a primitive value of the corresponding type).\nTherefore, it is always true that typeof this == \"object\" when the function\nexecutes.\n@param arg1, arg2, ... Arguments for the object.\n@name call\n@methodOf Function#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Function#\n*/\n/**\nReturns a string representing the source code of the function.\n\n<code><em>function</em>.toString(<em>indentation</em>)</code>\n@param indentation Non-standard The amount of spaces to indent the string\nrepresentation of the source code. If indentation is less than or equal to -1,\nmost unnecessary spaces are removed.\n@name toString\n@methodOf Function#\n*/\n/**\nExecutes a search for a match in a specified string. Returns a result array, or\nnull.\n\n\n@param regexp The name of the regular expression. It can be a variable name or\na literal.\n@param str The string against which to match the regular expression.\n@name exec\n@methodOf RegExp#\n*/\n/**\nExecutes the search for a match between a regular expression and a specified\nstring. Returns true or false.\n\n<code> <em>regexp</em>.test([<em>str</em>]) </code>\n@param regexp The name of the regular expression. It can be a variable name or\na literal.\n@param str The string against which to match the regular expression.\n@name test\n@methodOf RegExp#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf RegExp#\n*/\n/**\nReturns a string representing the specified object.\n\n<code><i>regexp</i>.toString()</code>\n\n@name toString\n@methodOf RegExp#\n*/\n/**\nReturns a reference to the Date function that created the instance's prototype.\nNote that the value of this property is a reference to the function itself, not\na string containing the function's name.\n\n\n\n@name constructor\n@methodOf Date#\n*/\n/**\nReturns the day of the month for the specified date according to local time.\n\n<code>\ngetDate()\n</code>\n\n@name getDate\n@methodOf Date#\n*/\n/**\nReturns the day of the week for the specified date according to local time.\n\n<code>\ngetDay()\n</code>\n\n@name getDay\n@methodOf Date#\n*/\n/**\nReturns the year of the specified date according to local time.\n\n<code>\ngetFullYear()\n</code>\n\n@name getFullYear\n@methodOf Date#\n*/\n/**\nReturns the hour for the specified date according to local time.\n\n<code>\ngetHours()\n</code>\n\n@name getHours\n@methodOf Date#\n*/\n/**\nReturns the milliseconds in the specified date according to local time.\n\n<code>\ngetMilliseconds()\n</code>\n\n@name getMilliseconds\n@methodOf Date#\n*/\n/**\nReturns the minutes in the specified date according to local time.\n\n<code>\ngetMinutes()\n</code>\n\n@name getMinutes\n@methodOf Date#\n*/\n/**\nReturns the month in the specified date according to local time.\n\n<code>\ngetMonth()\n</code>\n\n@name getMonth\n@methodOf Date#\n*/\n/**\nReturns the seconds in the specified date according to local time.\n\n<code>\ngetSeconds()\n</code>\n\n@name getSeconds\n@methodOf Date#\n*/\n/**\nReturns the numeric value corresponding to the time for the specified date\naccording to universal time.\n\n<code> getTime() </code>\n\n@name getTime\n@methodOf Date#\n*/\n/**\nReturns the time-zone offset from UTC, in minutes, for the current locale.\n\n<code> getTimezoneOffset() </code>\n\n@name getTimezoneOffset\n@methodOf Date#\n*/\n/**\nReturns the day (date) of the month in the specified date according to universal\ntime.\n\n<code>\ngetUTCDate()\n</code>\n\n@name getUTCDate\n@methodOf Date#\n*/\n/**\nReturns the day of the week in the specified date according to universal time.\n\n<code>\ngetUTCDay()\n</code>\n\n@name getUTCDay\n@methodOf Date#\n*/\n/**\nReturns the year in the specified date according to universal time.\n\n<code>\ngetUTCFullYear()\n</code>\n\n@name getUTCFullYear\n@methodOf Date#\n*/\n/**\nReturns the hours in the specified date according to universal time.\n\n<code>\ngetUTCHours\n</code>\n\n@name getUTCHours\n@methodOf Date#\n*/\n/**\nReturns the milliseconds in the specified date according to universal time.\n\n<code>\ngetUTCMilliseconds()\n</code>\n\n@name getUTCMilliseconds\n@methodOf Date#\n*/\n/**\nReturns the minutes in the specified date according to universal time.\n\n<code>\ngetUTCMinutes()\n</code>\n\n@name getUTCMinutes\n@methodOf Date#\n*/\n/**\nReturns the month of the specified date according to universal time.\n\n<code>\ngetUTCMonth()\n</code>\n\n@name getUTCMonth\n@methodOf Date#\n*/\n/**\nReturns the seconds in the specified date according to universal time.\n\n<code>\ngetUTCSeconds()\n</code>\n\n@name getUTCSeconds\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name getYear\n@methodOf Date#\n*/\n/**\nSets the day of the month for a specified date according to local time.\n\n<code> setDate(<em>dayValue</em>) </code>\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setDate\n@methodOf Date#\n*/\n/**\nSets the full year for a specified date according to local time.\n\n<code>\nsetFullYear(<i>yearValue</i>[, <i>monthValue</i>[, <em>dayValue</em>]])\n</code>\n@param yearValue An integer specifying the numeric value of the year, for\nexample, 1995.\n@param monthValue An integer between 0 and 11 representing the months January\nthrough December.\n@param dayValue An integer between 1 and 31 representing the day of the\nmonth. If you specify the dayValue parameter, you must also specify the\nmonthValue.\n@name setFullYear\n@methodOf Date#\n*/\n/**\nSets the hours for a specified date according to local time.\n\n<code>\nsetHours(<i>hoursValue</i>[, <i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]]])\n</code>\n@param hoursValue An integer between 0 and 23, representing the hour. \n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setHours\n@methodOf Date#\n*/\n/**\nSets the milliseconds for a specified date according to local time.\n\n<code>\nsetMilliseconds(<i>millisecondsValue</i>)\n</code>\n@param millisecondsValue A number between 0 and 999, representing the\nmilliseconds.\n@name setMilliseconds\n@methodOf Date#\n*/\n/**\nSets the minutes for a specified date according to local time.\n\n<code>\nsetMinutes(<i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]])\n</code>\n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setMinutes\n@methodOf Date#\n*/\n/**\nSet the month for a specified date according to local time.\n\n<code>\nsetMonth(<i>monthValue</i>[, <em>dayValue</em>])\n</code>\n@param monthValue An integer between 0 and 11 (representing the months\nJanuary through December).\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setMonth\n@methodOf Date#\n*/\n/**\nSets the seconds for a specified date according to local time.\n\n<code>\nsetSeconds(<i>secondsValue</i>[, <em>msValue</em>])\n</code>\n@param secondsValue An integer between 0 and 59. \n@param msValue A number between 0 and 999, representing the milliseconds.\n@name setSeconds\n@methodOf Date#\n*/\n/**\nSets the Date object to the time represented by a number of milliseconds since\nJanuary 1, 1970, 00:00:00 UTC.\n\n<code>\nsetTime(<i>timeValue</i>)\n</code>\n@param timeValue An integer representing the number of milliseconds since 1\nJanuary 1970, 00:00:00 UTC.\n@name setTime\n@methodOf Date#\n*/\n/**\nSets the day of the month for a specified date according to universal time.\n\n<code>\nsetUTCDate(<i>dayValue</i>)\n</code>\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setUTCDate\n@methodOf Date#\n*/\n/**\nSets the full year for a specified date according to universal time.\n\n<code>\nsetUTCFullYear(<i>yearValue</i>[, <i>monthValue</i>[, <em>dayValue</em>]])\n</code>\n@param yearValue An integer specifying the numeric value of the year, for\nexample, 1995.\n@param monthValue An integer between 0 and 11 representing the months January\nthrough December.\n@param dayValue An integer between 1 and 31 representing the day of the\nmonth. If you specify the dayValue parameter, you must also specify the\nmonthValue.\n@name setUTCFullYear\n@methodOf Date#\n*/\n/**\nSets the hour for a specified date according to universal time.\n\n<code>\nsetUTCHours(<i>hoursValue</i>[, <i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]]])\n</code>\n@param hoursValue An integer between 0 and 23, representing the hour. \n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setUTCHours\n@methodOf Date#\n*/\n/**\nSets the milliseconds for a specified date according to universal time.\n\n<code>\nsetUTCMilliseconds(<i>millisecondsValue</i>)\n</code>\n@param millisecondsValue A number between 0 and 999, representing the\nmilliseconds.\n@name setUTCMilliseconds\n@methodOf Date#\n*/\n/**\nSets the minutes for a specified date according to universal time.\n\n<code>\nsetUTCMinutes(<i>minutesValue</i>[, <i>secondsValue</i>[, <em>msValue</em>]])\n</code>\n@param minutesValue An integer between 0 and 59, representing the minutes. \n@param secondsValue An integer between 0 and 59, representing the seconds. If\nyou specify the secondsValue parameter, you must also specify the minutesValue.\n@param msValue A number between 0 and 999, representing the milliseconds. If\nyou specify the msValue parameter, you must also specify the minutesValue and\nsecondsValue.\n@name setUTCMinutes\n@methodOf Date#\n*/\n/**\nSets the month for a specified date according to universal time.\n\n<code>\nsetUTCMonth(<i>monthValue</i>[, <em>dayValue</em>])\n</code>\n@param monthValue An integer between 0 and 11, representing the months\nJanuary through December.\n@param dayValue An integer from 1 to 31, representing the day of the month.\n@name setUTCMonth\n@methodOf Date#\n*/\n/**\nSets the seconds for a specified date according to universal time.\n\n<code>\nsetUTCSeconds(<i>secondsValue</i>[, <em>msValue</em>])\n</code>\n@param secondsValue An integer between 0 and 59. \n@param msValue A number between 0 and 999, representing the milliseconds.\n@name setUTCSeconds\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name setYear\n@methodOf Date#\n*/\n/**\nReturns the date portion of a Date object in human readable form in American\nEnglish.\n\n<code><em>date</em>.toDateString()</code>\n\n@name toDateString\n@methodOf Date#\n*/\n/**\nReturns a JSON representation of the Date object.\n\n<code><em>date</em>.prototype.toJSON()</code>\n\n@name toJSON\n@methodOf Date#\n*/\n/**\nDeprecated\n\n\n\n@name toGMTString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, returning the \"date\" portion using the operating\nsystem's locale's conventions.\n\n<code>\ntoLocaleDateString()\n</code>\n\n@name toLocaleDateString\n@methodOf Date#\n*/\n/**\nNon-standard\n\n\n\n@name toLocaleFormat\n@methodOf Date#\n*/\n/**\nConverts a date to a string, using the operating system's locale's conventions.\n\n<code>\ntoLocaleString()\n</code>\n\n@name toLocaleString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, returning the \"time\" portion using the current\nlocale's conventions.\n\n<code> toLocaleTimeString() </code>\n\n@name toLocaleTimeString\n@methodOf Date#\n*/\n/**\nNon-standard\n\n\n\n@name toSource\n@methodOf Date#\n*/\n/**\nReturns a string representing the specified Date object.\n\n<code> toString() </code>\n\n@name toString\n@methodOf Date#\n*/\n/**\nReturns the time portion of a Date object in human readable form in American\nEnglish.\n\n<code><em>date</em>.toTimeString()</code>\n\n@name toTimeString\n@methodOf Date#\n*/\n/**\nConverts a date to a string, using the universal time convention.\n\n<code> toUTCString() </code>\n\n@name toUTCString\n@methodOf Date#\n*/\n/**\nReturns the primitive value of a Date object.\n\n<code>\nvalueOf()\n</code>\n\n@name valueOf\n@methodOf Date#\n*/;\n/*!\nMath.uuid.js (v1.4)\nhttp://www.broofa.com\nmailto:robert@broofa.com\n\nCopyright (c) 2010 Robert Kieffer\nDual licensed under the MIT and GPL licenses.\n*/\n\n/**\nGenerate a random uuid.\n\n<code><pre>\n // No arguments - returns RFC4122, version 4 ID\n Math.uuid()\n=> \"92329D39-6F5C-4520-ABFC-AAB64544E172\"\n\n // One argument - returns ID of the specified length\n Math.uuid(15) // 15 character ID (default base=62)\n=> \"VcydxgltxrVZSTV\"\n\n // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)\n Math.uuid(8, 2) // 8 character ID (base=2)\n=> \"01001010\"\n\n Math.uuid(8, 10) // 8 character ID (base=10)\n=> \"47473046\"\n\n Math.uuid(8, 16) // 8 character ID (base=16)\n=> \"098F4D35\"\n</pre></code>\n\n@name uuid\n@methodOf Math\n@param length The desired number of characters\n@param radix The number of allowable values for each character.\n */\n(function() {\n // Private array of chars to use\n var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); \n\n Math.uuid = function (len, radix) {\n var chars = CHARS, uuid = [];\n radix = radix || chars.length;\n\n if (len) {\n // Compact form\n for (var i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];\n } else {\n // rfc4122, version 4 form\n var r;\n\n // rfc4122 requires these characters\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\n uuid[14] = '4';\n\n // Fill in random data. At i==19 set the high bits of clock sequence as\n // per rfc4122, sec. 4.1.5\n for (var i = 0; i < 36; i++) {\n if (!uuid[i]) {\n r = 0 | Math.random()*16;\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\n }\n }\n }\n\n return uuid.join('');\n };\n\n // A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance\n // by minimizing calls to random()\n Math.uuidFast = function() {\n var chars = CHARS, uuid = new Array(36), rnd=0, r;\n for (var i = 0; i < 36; i++) {\n if (i==8 || i==13 || i==18 || i==23) {\n uuid[i] = '-';\n } else if (i==14) {\n uuid[i] = '4';\n } else {\n if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;\n r = rnd & 0xf;\n rnd = rnd >> 4;\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\n }\n }\n return uuid.join('');\n };\n\n // A more compact, but less performant, RFC4122v4 solution:\n Math.uuidCompact = function() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n }).toUpperCase();\n };\n})();;\n;\n;\n/**\nThe Bounded module is used to provide basic data about the\nlocation and dimensions of the including object. This module is included\nby default in <code>GameObject</code>.\n\n<code><pre>\nplayer = Core\n x: 10\n y: 50\n width: 20\n height: 20\n other: \"stuff\"\n more: \"properties\"\n\nplayer.position()\n# => Uncaught TypeError: Object has no method 'position'\n\nplayer.include(Bounded)\n\n# now player has all the methods provided by this module\nplayer.position()\n# => {x: 10, y: 50}\n</pre></code>\n\n@see GameObject\n\nBounded module\n@name Bounded\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Bounded;\nBounded = function(I, self) {\n I || (I = {});\n Object.reverseMerge(I, {\n x: 0,\n y: 0,\n width: 8,\n height: 8,\n collisionMargin: Point(0, 0)\n });\n return {\n /**\n The position of this game object. By default it is the top left point.\n Redefining the center method will change the relative position.\n\n <code><pre>\n player = Core\n x: 50\n y: 40\n\n player.include(Bounded) \n\n player.position()\n # => {x: 50, y: 40}\n </pre></code>\n\n @name position\n @methodOf Bounded#\n @returns {Point} The position of this object\n */\n position: function() {\n return Point(I.x, I.y);\n },\n /**\n Does a check to see if this object is overlapping\n with the bounds passed in.\n\n <code><pre>\n player = Core\n x: 4\n y: 6\n width: 20\n height: 20\n\n player.include(Bounded) \n\n player.collides({x: 5, y: 7, width: 20, height: 20})\n # => true\n </pre></code>\n\n @name collides\n @methodOf Bounded#\n @returns {Point} The position of this object\n */\n collides: function(bounds) {\n return Collision.rectangular(I, bounds);\n },\n /**\n This returns a modified bounds based on the collision margin.\n The area of the bounds is reduced if collision margin is positive\n and increased if collision margin is negative.\n\n <code><pre>\n player = Core\n collisionMargin: \n x: -2\n y: -4\n x: 50\n y: 50\n width: 20\n height: 20\n\n player.include(Bounded)\n\n player.collisionBounds()\n # => {x: 38, y: 36, height: 28, width: 24}\n\n player.collisionBounds(10, 10)\n # => {x: 48, y: 46, height: 28, width: 24}\n </pre></code>\n\n @name collisionBounds\n @methodOf Bounded#\n @param {Number} xOffset the amount to shift the x position \n @param {Number} yOffset the amount to shift the y position\n @returns {Object} The collision bounds\n */\n collisionBounds: function(xOffset, yOffset) {\n var bounds;\n bounds = self.bounds(xOffset, yOffset);\n bounds.x += I.collisionMargin.x;\n bounds.y += I.collisionMargin.y;\n bounds.width -= 2 * I.collisionMargin.x;\n bounds.height -= 2 * I.collisionMargin.y;\n return bounds;\n },\n /**\n The bounds method returns infomation about the location \n of the object and its dimensions with optional offsets.\n\n <code><pre>\n player = Core\n x: 3\n y: 6\n width: 2\n height: 2\n\n player.include(Bounded)\n\n player.bounds()\n # => {x: 3, y: 6, width: 2, height: 2}\n\n player.bounds(7, 4)\n # => {x: 10, y: 10, width: 2, height: 2} \n </pre></code>\n\n @name bounds\n @methodOf Bounded#\n @param {Number} xOffset the amount to shift the x position \n @param {Number} yOffset the amount to shift the y position\n */\n bounds: function(xOffset, yOffset) {\n var center;\n center = self.center();\n return {\n x: center.x - I.width / 2 + (xOffset || 0),\n y: center.y - I.height / 2 + (yOffset || 0),\n width: I.width,\n height: I.height\n };\n },\n /**\n The centeredBounds method returns infomation about the center\n of the object along with the midpoint of the width and height.\n\n <code><pre>\n player = Core\n x: 3\n y: 6\n width: 2\n height: 2\n\n player.include(Bounded)\n\n player.centeredBounds()\n # => {x: 4, y: 7, xw: 1, yw: 1}\n </pre></code>\n\n @name centeredBounds\n @methodOf Bounded#\n */\n centeredBounds: function() {\n var center;\n center = self.center();\n return {\n x: center.x,\n y: center.y,\n xw: I.width / 2,\n yw: I.height / 2\n };\n },\n /**\n The center method returns the {@link Point} that is\n the center of the object.\n\n <code><pre>\n player = Core\n x: 50\n y: 40\n width: 10\n height: 30\n\n player.include(Bounded) \n\n player.center()\n # => {x: 30, y: 35}\n </pre></code>\n\n @name center\n @methodOf Bounded#\n @returns {Point} The middle of the calling object\n */\n center: function() {\n return self.position();\n },\n /**\n Return the circular bounds of the object. The circle is\n centered at the midpoint of the object.\n\n <code><pre>\n player = Core\n radius: 5\n x: 50\n y: 50\n other: \"stuff\"\n\n player.include(Bounded)\n\n player.circle()\n # => {radius: 5, x: 50, y: 50}\n </pre></code>\n\n @name circle\n @methodOf Bounded#\n @returns {Object} An object with a position and a radius\n */\n circle: function() {\n var circle;\n circle = self.center();\n circle.radius = I.radius || I.width / 2 || I.height / 2;\n return circle;\n }\n };\n};;\n/**\nCollision holds many useful class methods for checking geometric overlap of various objects.\n\n@name Collision\n@namespace\n*/var Collision;\nCollision = {\n /**\n Takes two bounds objects and returns true if they collide (overlap), false otherwise.\n Bounds objects have x, y, width and height properties.\n\n <code><pre>\n player = GameObject\n x: 0\n y: 0\n width: 10\n height: 10\n\n enemy = GameObject\n x: 5\n y: 5\n width: 10\n height: 10\n\n Collision.rectangular(player, enemy)\n # => true\n\n Collision.rectangular(player, {x: 50, y: 40, width: 30, height: 30})\n # => false\n </pre></code>\n\n @name rectangular\n @methodOf Collision\n @param {Object} a The first rectangle\n @param {Object} b The second rectangle\n @returns {Boolean} true if the rectangles overlap, false otherwise\n */\n rectangular: function(a, b) {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n },\n /**\n Takes two circle objects and returns true if they collide (overlap), false otherwise.\n Circle objects have x, y, and radius.\n\n <code><pre>\n player = GameObject\n x: 5\n y: 5\n radius: 10\n\n enemy = GameObject\n x: 10\n y: 10\n radius: 10\n\n farEnemy = GameObject\n x: 500\n y: 500\n radius: 30\n\n Collision.circular(player, enemy)\n # => true\n\n Collision.circular(player, farEnemy)\n # => false\n </pre></code>\n\n @name circular\n @methodOf Collision\n @param {Object} a The first circle\n @param {Object} b The second circle\n @returns {Boolean} true is the circles overlap, false otherwise\n */\n circular: function(a, b) {\n var dx, dy, r;\n r = a.radius + b.radius;\n dx = b.x - a.x;\n dy = b.y - a.y;\n return r * r >= dx * dx + dy * dy;\n },\n /**\n Detects whether a line intersects a circle.\n\n <code><pre>\n circle = engine.add\n class: \"circle\"\n x: 50\n y: 50\n radius: 10\n\n Collision.rayCircle(Point(0, 0), Point(1, 0), circle)\n # => true\n </pre></code>\n\n @name rayCircle\n @methodOf Collision\n @param {Point} source The starting position\n @param {Point} direction A vector from the point\n @param {Object} target The circle \n @returns {Boolean} true if the line intersects the circle, false otherwise\n */\n rayCircle: function(source, direction, target) {\n var dt, hit, intersection, intersectionToTarget, intersectionToTargetLength, laserToTarget, projection, projectionLength, radius;\n radius = target.radius();\n target = target.position();\n laserToTarget = target.subtract(source);\n projectionLength = direction.dot(laserToTarget);\n if (projectionLength < 0) {\n return false;\n }\n projection = direction.scale(projectionLength);\n intersection = source.add(projection);\n intersectionToTarget = target.subtract(intersection);\n intersectionToTargetLength = intersectionToTarget.length();\n if (intersectionToTargetLength < radius) {\n hit = true;\n }\n if (hit) {\n dt = Math.sqrt(radius * radius - intersectionToTargetLength * intersectionToTargetLength);\n return hit = direction.scale(projectionLength - dt).add(source);\n }\n },\n /**\n Detects whether a line intersects a rectangle.\n\n <code><pre>\n rect = engine.add\n class: \"circle\"\n x: 50\n y: 50\n width: 20\n height: 20\n\n Collision.rayRectangle(Point(0, 0), Point(1, 0), rect)\n # => true\n </pre></code>\n\n @name rayRectangle\n @methodOf Collision\n @param {Point} source The starting position\n @param {Point} direction A vector from the point\n @param {Object} target The rectangle\n @returns {Boolean} true if the line intersects the rectangle, false otherwise\n */\n rayRectangle: function(source, direction, target) {\n var areaPQ0, areaPQ1, hit, p0, p1, t, tX, tY, xval, xw, yval, yw, _ref, _ref2;\n xw = target.xw;\n yw = target.yw;\n if (source.x < target.x) {\n xval = target.x - xw;\n } else {\n xval = target.x + xw;\n }\n if (source.y < target.y) {\n yval = target.y - yw;\n } else {\n yval = target.y + yw;\n }\n if (direction.x === 0) {\n p0 = Point(target.x - xw, yval);\n p1 = Point(target.x + xw, yval);\n t = (yval - source.y) / direction.y;\n } else if (direction.y === 0) {\n p0 = Point(xval, target.y - yw);\n p1 = Point(xval, target.y + yw);\n t = (xval - source.x) / direction.x;\n } else {\n tX = (xval - source.x) / direction.x;\n tY = (yval - source.y) / direction.y;\n if ((tX < tY || ((-xw < (_ref = source.x - target.x) && _ref < xw))) && !((-yw < (_ref2 = source.y - target.y) && _ref2 < yw))) {\n p0 = Point(target.x - xw, yval);\n p1 = Point(target.x + xw, yval);\n t = tY;\n } else {\n p0 = Point(xval, target.y - yw);\n p1 = Point(xval, target.y + yw);\n t = tX;\n }\n }\n if (t > 0) {\n areaPQ0 = direction.cross(p0.subtract(source));\n areaPQ1 = direction.cross(p1.subtract(source));\n if (areaPQ0 * areaPQ1 < 0) {\n return hit = direction.scale(t).add(source);\n }\n }\n }\n};;\nvar __slice = Array.prototype.slice;\n(function() {\n var Color, channelize, hslParser, hslToRgb, lookup, names, normalizeKey, parseHSL, parseHex, parseRGB, rgbParser;\n rgbParser = /^rgba?\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),?\\s*(\\d?\\.?\\d*)?\\)$/;\n hslParser = /^hsla?\\((\\d{1,3}),\\s*(\\d?\\.?\\d*),\\s*(\\d?\\.?\\d*),?\\s*(\\d?\\.?\\d*)?\\)$/;\n parseRGB = function(colorString) {\n var channel, channels, parsedColor;\n if (!(channels = rgbParser.exec(colorString))) {\n return;\n }\n parsedColor = (function() {\n var _i, _len, _ref, _results;\n _ref = channels.slice(1, 4);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })();\n parsedColor[3] || (parsedColor[3] = 1);\n return parsedColor;\n };\n parseHex = function(hexString) {\n var alpha, i, rgb;\n hexString = hexString.replace(/#/, '');\n switch (hexString.length) {\n case 3:\n case 4:\n if (hexString.length === 4) {\n alpha = (parseInt(hexString.substr(3, 1), 16) * 0x11) / 255;\n } else {\n alpha = 1;\n }\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(i, 1), 16) * 0x11);\n }\n return _results;\n })();\n rgb.push(alpha);\n return rgb;\n case 6:\n case 8:\n if (hexString.length === 8) {\n alpha = parseInt(hexString.substr(6, 2), 16) / 255;\n } else {\n alpha = 1;\n }\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(2 * i, 2), 16));\n }\n return _results;\n })();\n rgb.push(alpha);\n return rgb;\n }\n };\n parseHSL = function(colorString) {\n var channel, channels, parsedColor;\n if (!(channels = hslParser.exec(colorString))) {\n return;\n }\n parsedColor = (function() {\n var _i, _len, _ref, _results;\n _ref = channels.slice(1, 4);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })();\n parsedColor[0] = parsedColor[0];\n parsedColor[3] || (parsedColor[3] = 1);\n return hslToRgb(parsedColor);\n };\n hslToRgb = function(hsl) {\n var a, b, channel, g, h, hueToRgb, l, p, q, r, rgbMap, s, _ref;\n _ref = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = hsl.length; _i < _len; _i++) {\n channel = hsl[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })(), h = _ref[0], s = _ref[1], l = _ref[2], a = _ref[3];\n h /= 360;\n a || (a = 1);\n r = g = b = null;\n hueToRgb = function(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n };\n if (s === 0) {\n r = g = b = l;\n } else {\n q = (l < 0.5 ? l * (1 + s) : l + s - l * s);\n p = 2 * l - q;\n r = hueToRgb(p, q, h + 1 / 3);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 1 / 3);\n rgbMap = (function() {\n var _i, _len, _ref2, _results;\n _ref2 = [r, g, b];\n _results = [];\n for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n channel = _ref2[_i];\n _results.push((channel * 0xFF).round());\n }\n return _results;\n })();\n }\n return rgbMap.concat(a);\n };\n normalizeKey = function(key) {\n return key.toString().toLowerCase().split(' ').join('');\n };\n channelize = function(color, alpha) {\n var channel, result;\n if (Object.isArray(color)) {\n if (alpha != null) {\n alpha = parseFloat(alpha);\n } else if (color[3] != null) {\n alpha = parseFloat(color[3]);\n } else {\n alpha = 1;\n }\n result = ((function() {\n var _i, _len, _ref, _results;\n _ref = color.slice(0, 3);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(parseFloat(channel));\n }\n return _results;\n })()).concat(alpha);\n } else {\n result = lookup[normalizeKey(color)] || parseHex(color) || parseRGB(color) || parseHSL(color);\n if (alpha != null) {\n result[3] = parseFloat(alpha);\n }\n }\n return result;\n };\n Color = function() {\n var args, parsedColor;\n args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n parsedColor = (function() {\n switch (args.length) {\n case 0:\n return [0, 0, 0, 1];\n case 1:\n return channelize(args.first());\n case 2:\n return channelize(args.first(), args.last());\n default:\n return channelize(args);\n }\n })();\n if (!parsedColor) {\n throw \"\" + (args.join(',')) + \" is an unknown color\";\n }\n return {\n __proto__: Color.prototype,\n r: parsedColor[0].round(),\n g: parsedColor[1].round(),\n b: parsedColor[2].round(),\n a: parsedColor[3]\n };\n };\n Color.prototype = {\n complement: function() {\n return this.copy().complement$();\n },\n complement$: function() {\n return this.hue$(180);\n },\n copy: function() {\n return Color(this.r, this.g, this.b, this.a);\n },\n darken: function(amount) {\n return this.copy().darken$(amount);\n },\n darken$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[2] -= amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n desaturate: function(amount) {\n return this.copy().desaturate$(amount);\n },\n desaturate$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[1] -= amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n equal: function(other) {\n return other.r === this.r && other.g === this.g && other.b === this.b && other.a === this.a;\n },\n grayscale: function() {\n return this.copy().grayscale$();\n },\n grayscale$: function() {\n var g, hsl;\n hsl = this.toHsl();\n g = (hsl[2] * 255).round();\n this.r = this.g = this.b = g;\n return this;\n },\n hue: function(degrees) {\n return this.copy().hue$(degrees);\n },\n hue$: function(degrees) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[0] = (hsl[0] + degrees).mod(360);\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n lighten: function(amount) {\n return this.copy().lighten$(amount);\n },\n lighten$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[2] += amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n mixWith: function(other, amount) {\n return this.copy().mixWith$(other, amount);\n },\n mixWith$: function(other, amount) {\n var _ref, _ref2;\n amount || (amount = 0.5);\n _ref = [this.r, this.g, this.b, this.a].zip([other.r, other.g, other.b, other.a]).map(function(array) {\n return (array[0] * amount) + (array[1] * (1 - amount));\n }), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n _ref2 = [this.r, this.g, this.b].map(function(color) {\n return color.round();\n }), this.r = _ref2[0], this.g = _ref2[1], this.b = _ref2[2];\n return this;\n },\n saturate: function(amount) {\n return this.copy().saturate$(amount);\n },\n saturate$: function(amount) {\n var hsl, _ref;\n hsl = this.toHsl();\n hsl[1] += amount;\n _ref = hslToRgb(hsl), this.r = _ref[0], this.g = _ref[1], this.b = _ref[2], this.a = _ref[3];\n return this;\n },\n toHex: function() {\n var hexFromNumber, padString;\n padString = function(hexString) {\n var pad;\n if (hexString.length === 1) {\n pad = \"0\";\n } else {\n pad = \"\";\n }\n return pad + hexString;\n };\n hexFromNumber = function(number) {\n return padString(number.toString(16));\n };\n return \"#\" + (hexFromNumber(this.r)) + (hexFromNumber(this.g)) + (hexFromNumber(this.b));\n },\n toHsl: function() {\n var b, channel, chroma, g, hue, lightness, max, min, r, saturation, _ref, _ref2;\n _ref = (function() {\n var _i, _len, _ref, _results;\n _ref = [this.r, this.g, this.b];\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(channel / 255);\n }\n return _results;\n }).call(this), r = _ref[0], g = _ref[1], b = _ref[2];\n _ref2 = [r, g, b].extremes(), min = _ref2.min, max = _ref2.max;\n hue = saturation = lightness = (max + min) / 2;\n if (max === min) {\n hue = saturation = 0;\n } else {\n chroma = max - min;\n saturation = lightness > 0.5 ? chroma / (1 - lightness) : chroma / lightness;\n saturation /= 2;\n switch (max) {\n case r:\n hue = ((g - b) / chroma) + 0;\n break;\n case g:\n hue = ((b - r) / chroma) + 2;\n break;\n case b:\n hue = ((r - g) / chroma) + 4;\n }\n hue *= 60;\n }\n return [hue, saturation, lightness, this.a];\n },\n toString: function() {\n return \"rgba(\" + this.r + \", \" + this.g + \", \" + this.b + \", \" + this.a + \")\";\n }\n };\n lookup = {};\n names = [[\"000000\", \"Black\"], [\"000080\", \"Navy Blue\"], [\"0000C8\", \"Dark Blue\"], [\"0000FF\", \"Blue\"], [\"000741\", \"Stratos\"], [\"001B1C\", \"Swamp\"], [\"002387\", \"Resolution Blue\"], [\"002900\", \"Deep Fir\"], [\"002E20\", \"Burnham\"], [\"002FA7\", \"International Klein Blue\"], [\"003153\", \"Prussian Blue\"], [\"003366\", \"Midnight Blue\"], [\"003399\", \"Smalt\"], [\"003532\", \"Deep Teal\"], [\"003E40\", \"Cyprus\"], [\"004620\", \"Kaitoke Green\"], [\"0047AB\", \"Cobalt\"], [\"004816\", \"Crusoe\"], [\"004950\", \"Sherpa Blue\"], [\"0056A7\", \"Endeavour\"], [\"00581A\", \"Camarone\"], [\"0066CC\", \"Science Blue\"], [\"0066FF\", \"Blue Ribbon\"], [\"00755E\", \"Tropical Rain Forest\"], [\"0076A3\", \"Allports\"], [\"007BA7\", \"Deep Cerulean\"], [\"007EC7\", \"Lochmara\"], [\"007FFF\", \"Azure Radiance\"], [\"008080\", \"Teal\"], [\"0095B6\", \"Bondi Blue\"], [\"009DC4\", \"Pacific Blue\"], [\"00A693\", \"Persian Green\"], [\"00A86B\", \"Jade\"], [\"00CC99\", \"Caribbean Green\"], [\"00CCCC\", \"Robin's Egg Blue\"], [\"00FF00\", \"Green\"], [\"00FF7F\", \"Spring Green\"], [\"00FFFF\", \"Cyan / Aqua\"], [\"010D1A\", \"Blue Charcoal\"], [\"011635\", \"Midnight\"], [\"011D13\", \"Holly\"], [\"012731\", \"Daintree\"], [\"01361C\", \"Cardin Green\"], [\"01371A\", \"County Green\"], [\"013E62\", \"Astronaut Blue\"], [\"013F6A\", \"Regal Blue\"], [\"014B43\", \"Aqua Deep\"], [\"015E85\", \"Orient\"], [\"016162\", \"Blue Stone\"], [\"016D39\", \"Fun Green\"], [\"01796F\", \"Pine Green\"], [\"017987\", \"Blue Lagoon\"], [\"01826B\", \"Deep Sea\"], [\"01A368\", \"Green Haze\"], [\"022D15\", \"English Holly\"], [\"02402C\", \"Sherwood Green\"], [\"02478E\", \"Congress Blue\"], [\"024E46\", \"Evening Sea\"], [\"026395\", \"Bahama Blue\"], [\"02866F\", \"Observatory\"], [\"02A4D3\", \"Cerulean\"], [\"03163C\", \"Tangaroa\"], [\"032B52\", \"Green Vogue\"], [\"036A6E\", \"Mosque\"], [\"041004\", \"Midnight Moss\"], [\"041322\", \"Black Pearl\"], [\"042E4C\", \"Blue Whale\"], [\"044022\", \"Zuccini\"], [\"044259\", \"Teal Blue\"], [\"051040\", \"Deep Cove\"], [\"051657\", \"Gulf Blue\"], [\"055989\", \"Venice Blue\"], [\"056F57\", \"Watercourse\"], [\"062A78\", \"Catalina Blue\"], [\"063537\", \"Tiber\"], [\"069B81\", \"Gossamer\"], [\"06A189\", \"Niagara\"], [\"073A50\", \"Tarawera\"], [\"080110\", \"Jaguar\"], [\"081910\", \"Black Bean\"], [\"082567\", \"Deep Sapphire\"], [\"088370\", \"Elf Green\"], [\"08E8DE\", \"Bright Turquoise\"], [\"092256\", \"Downriver\"], [\"09230F\", \"Palm Green\"], [\"09255D\", \"Madison\"], [\"093624\", \"Bottle Green\"], [\"095859\", \"Deep Sea Green\"], [\"097F4B\", \"Salem\"], [\"0A001C\", \"Black Russian\"], [\"0A480D\", \"Dark Fern\"], [\"0A6906\", \"Japanese Laurel\"], [\"0A6F75\", \"Atoll\"], [\"0B0B0B\", \"Cod Gray\"], [\"0B0F08\", \"Marshland\"], [\"0B1107\", \"Gordons Green\"], [\"0B1304\", \"Black Forest\"], [\"0B6207\", \"San Felix\"], [\"0BDA51\", \"Malachite\"], [\"0C0B1D\", \"Ebony\"], [\"0C0D0F\", \"Woodsmoke\"], [\"0C1911\", \"Racing Green\"], [\"0C7A79\", \"Surfie Green\"], [\"0C8990\", \"Blue Chill\"], [\"0D0332\", \"Black Rock\"], [\"0D1117\", \"Bunker\"], [\"0D1C19\", \"Aztec\"], [\"0D2E1C\", \"Bush\"], [\"0E0E18\", \"Cinder\"], [\"0E2A30\", \"Firefly\"], [\"0F2D9E\", \"Torea Bay\"], [\"10121D\", \"Vulcan\"], [\"101405\", \"Green Waterloo\"], [\"105852\", \"Eden\"], [\"110C6C\", \"Arapawa\"], [\"120A8F\", \"Ultramarine\"], [\"123447\", \"Elephant\"], [\"126B40\", \"Jewel\"], [\"130000\", \"Diesel\"], [\"130A06\", \"Asphalt\"], [\"13264D\", \"Blue Zodiac\"], [\"134F19\", \"Parsley\"], [\"140600\", \"Nero\"], [\"1450AA\", \"Tory Blue\"], [\"151F4C\", \"Bunting\"], [\"1560BD\", \"Denim\"], [\"15736B\", \"Genoa\"], [\"161928\", \"Mirage\"], [\"161D10\", \"Hunter Green\"], [\"162A40\", \"Big Stone\"], [\"163222\", \"Celtic\"], [\"16322C\", \"Timber Green\"], [\"163531\", \"Gable Green\"], [\"171F04\", \"Pine Tree\"], [\"175579\", \"Chathams Blue\"], [\"182D09\", \"Deep Forest Green\"], [\"18587A\", \"Blumine\"], [\"19330E\", \"Palm Leaf\"], [\"193751\", \"Nile Blue\"], [\"1959A8\", \"Fun Blue\"], [\"1A1A68\", \"Lucky Point\"], [\"1AB385\", \"Mountain Meadow\"], [\"1B0245\", \"Tolopea\"], [\"1B1035\", \"Haiti\"], [\"1B127B\", \"Deep Koamaru\"], [\"1B1404\", \"Acadia\"], [\"1B2F11\", \"Seaweed\"], [\"1B3162\", \"Biscay\"], [\"1B659D\", \"Matisse\"], [\"1C1208\", \"Crowshead\"], [\"1C1E13\", \"Rangoon Green\"], [\"1C39BB\", \"Persian Blue\"], [\"1C402E\", \"Everglade\"], [\"1C7C7D\", \"Elm\"], [\"1D6142\", \"Green Pea\"], [\"1E0F04\", \"Creole\"], [\"1E1609\", \"Karaka\"], [\"1E1708\", \"El Paso\"], [\"1E385B\", \"Cello\"], [\"1E433C\", \"Te Papa Green\"], [\"1E90FF\", \"Dodger Blue\"], [\"1E9AB0\", \"Eastern Blue\"], [\"1F120F\", \"Night Rider\"], [\"1FC2C2\", \"Java\"], [\"20208D\", \"Jacksons Purple\"], [\"202E54\", \"Cloud Burst\"], [\"204852\", \"Blue Dianne\"], [\"211A0E\", \"Eternity\"], [\"220878\", \"Deep Blue\"], [\"228B22\", \"Forest Green\"], [\"233418\", \"Mallard\"], [\"240A40\", \"Violet\"], [\"240C02\", \"Kilamanjaro\"], [\"242A1D\", \"Log Cabin\"], [\"242E16\", \"Black Olive\"], [\"24500F\", \"Green House\"], [\"251607\", \"Graphite\"], [\"251706\", \"Cannon Black\"], [\"251F4F\", \"Port Gore\"], [\"25272C\", \"Shark\"], [\"25311C\", \"Green Kelp\"], [\"2596D1\", \"Curious Blue\"], [\"260368\", \"Paua\"], [\"26056A\", \"Paris M\"], [\"261105\", \"Wood Bark\"], [\"261414\", \"Gondola\"], [\"262335\", \"Steel Gray\"], [\"26283B\", \"Ebony Clay\"], [\"273A81\", \"Bay of Many\"], [\"27504B\", \"Plantation\"], [\"278A5B\", \"Eucalyptus\"], [\"281E15\", \"Oil\"], [\"283A77\", \"Astronaut\"], [\"286ACD\", \"Mariner\"], [\"290C5E\", \"Violent Violet\"], [\"292130\", \"Bastille\"], [\"292319\", \"Zeus\"], [\"292937\", \"Charade\"], [\"297B9A\", \"Jelly Bean\"], [\"29AB87\", \"Jungle Green\"], [\"2A0359\", \"Cherry Pie\"], [\"2A140E\", \"Coffee Bean\"], [\"2A2630\", \"Baltic Sea\"], [\"2A380B\", \"Turtle Green\"], [\"2A52BE\", \"Cerulean Blue\"], [\"2B0202\", \"Sepia Black\"], [\"2B194F\", \"Valhalla\"], [\"2B3228\", \"Heavy Metal\"], [\"2C0E8C\", \"Blue Gem\"], [\"2C1632\", \"Revolver\"], [\"2C2133\", \"Bleached Cedar\"], [\"2C8C84\", \"Lochinvar\"], [\"2D2510\", \"Mikado\"], [\"2D383A\", \"Outer Space\"], [\"2D569B\", \"St Tropaz\"], [\"2E0329\", \"Jacaranda\"], [\"2E1905\", \"Jacko Bean\"], [\"2E3222\", \"Rangitoto\"], [\"2E3F62\", \"Rhino\"], [\"2E8B57\", \"Sea Green\"], [\"2EBFD4\", \"Scooter\"], [\"2F270E\", \"Onion\"], [\"2F3CB3\", \"Governor Bay\"], [\"2F519E\", \"Sapphire\"], [\"2F5A57\", \"Spectra\"], [\"2F6168\", \"Casal\"], [\"300529\", \"Melanzane\"], [\"301F1E\", \"Cocoa Brown\"], [\"302A0F\", \"Woodrush\"], [\"304B6A\", \"San Juan\"], [\"30D5C8\", \"Turquoise\"], [\"311C17\", \"Eclipse\"], [\"314459\", \"Pickled Bluewood\"], [\"315BA1\", \"Azure\"], [\"31728D\", \"Calypso\"], [\"317D82\", \"Paradiso\"], [\"32127A\", \"Persian Indigo\"], [\"32293A\", \"Blackcurrant\"], [\"323232\", \"Mine Shaft\"], [\"325D52\", \"Stromboli\"], [\"327C14\", \"Bilbao\"], [\"327DA0\", \"Astral\"], [\"33036B\", \"Christalle\"], [\"33292F\", \"Thunder\"], [\"33CC99\", \"Shamrock\"], [\"341515\", \"Tamarind\"], [\"350036\", \"Mardi Gras\"], [\"350E42\", \"Valentino\"], [\"350E57\", \"Jagger\"], [\"353542\", \"Tuna\"], [\"354E8C\", \"Chambray\"], [\"363050\", \"Martinique\"], [\"363534\", \"Tuatara\"], [\"363C0D\", \"Waiouru\"], [\"36747D\", \"Ming\"], [\"368716\", \"La Palma\"], [\"370202\", \"Chocolate\"], [\"371D09\", \"Clinker\"], [\"37290E\", \"Brown Tumbleweed\"], [\"373021\", \"Birch\"], [\"377475\", \"Oracle\"], [\"380474\", \"Blue Diamond\"], [\"381A51\", \"Grape\"], [\"383533\", \"Dune\"], [\"384555\", \"Oxford Blue\"], [\"384910\", \"Clover\"], [\"394851\", \"Limed Spruce\"], [\"396413\", \"Dell\"], [\"3A0020\", \"Toledo\"], [\"3A2010\", \"Sambuca\"], [\"3A2A6A\", \"Jacarta\"], [\"3A686C\", \"William\"], [\"3A6A47\", \"Killarney\"], [\"3AB09E\", \"Keppel\"], [\"3B000B\", \"Temptress\"], [\"3B0910\", \"Aubergine\"], [\"3B1F1F\", \"Jon\"], [\"3B2820\", \"Treehouse\"], [\"3B7A57\", \"Amazon\"], [\"3B91B4\", \"Boston Blue\"], [\"3C0878\", \"Windsor\"], [\"3C1206\", \"Rebel\"], [\"3C1F76\", \"Meteorite\"], [\"3C2005\", \"Dark Ebony\"], [\"3C3910\", \"Camouflage\"], [\"3C4151\", \"Bright Gray\"], [\"3C4443\", \"Cape Cod\"], [\"3C493A\", \"Lunar Green\"], [\"3D0C02\", \"Bean \"], [\"3D2B1F\", \"Bistre\"], [\"3D7D52\", \"Goblin\"], [\"3E0480\", \"Kingfisher Daisy\"], [\"3E1C14\", \"Cedar\"], [\"3E2B23\", \"English Walnut\"], [\"3E2C1C\", \"Black Marlin\"], [\"3E3A44\", \"Ship Gray\"], [\"3EABBF\", \"Pelorous\"], [\"3F2109\", \"Bronze\"], [\"3F2500\", \"Cola\"], [\"3F3002\", \"Madras\"], [\"3F307F\", \"Minsk\"], [\"3F4C3A\", \"Cabbage Pont\"], [\"3F583B\", \"Tom Thumb\"], [\"3F5D53\", \"Mineral Green\"], [\"3FC1AA\", \"Puerto Rico\"], [\"3FFF00\", \"Harlequin\"], [\"401801\", \"Brown Pod\"], [\"40291D\", \"Cork\"], [\"403B38\", \"Masala\"], [\"403D19\", \"Thatch Green\"], [\"405169\", \"Fiord\"], [\"40826D\", \"Viridian\"], [\"40A860\", \"Chateau Green\"], [\"410056\", \"Ripe Plum\"], [\"411F10\", \"Paco\"], [\"412010\", \"Deep Oak\"], [\"413C37\", \"Merlin\"], [\"414257\", \"Gun Powder\"], [\"414C7D\", \"East Bay\"], [\"4169E1\", \"Royal Blue\"], [\"41AA78\", \"Ocean Green\"], [\"420303\", \"Burnt Maroon\"], [\"423921\", \"Lisbon Brown\"], [\"427977\", \"Faded Jade\"], [\"431560\", \"Scarlet Gum\"], [\"433120\", \"Iroko\"], [\"433E37\", \"Armadillo\"], [\"434C59\", \"River Bed\"], [\"436A0D\", \"Green Leaf\"], [\"44012D\", \"Barossa\"], [\"441D00\", \"Morocco Brown\"], [\"444954\", \"Mako\"], [\"454936\", \"Kelp\"], [\"456CAC\", \"San Marino\"], [\"45B1E8\", \"Picton Blue\"], [\"460B41\", \"Loulou\"], [\"462425\", \"Crater Brown\"], [\"465945\", \"Gray Asparagus\"], [\"4682B4\", \"Steel Blue\"], [\"480404\", \"Rustic Red\"], [\"480607\", \"Bulgarian Rose\"], [\"480656\", \"Clairvoyant\"], [\"481C1C\", \"Cocoa Bean\"], [\"483131\", \"Woody Brown\"], [\"483C32\", \"Taupe\"], [\"49170C\", \"Van Cleef\"], [\"492615\", \"Brown Derby\"], [\"49371B\", \"Metallic Bronze\"], [\"495400\", \"Verdun Green\"], [\"496679\", \"Blue Bayoux\"], [\"497183\", \"Bismark\"], [\"4A2A04\", \"Bracken\"], [\"4A3004\", \"Deep Bronze\"], [\"4A3C30\", \"Mondo\"], [\"4A4244\", \"Tundora\"], [\"4A444B\", \"Gravel\"], [\"4A4E5A\", \"Trout\"], [\"4B0082\", \"Pigment Indigo\"], [\"4B5D52\", \"Nandor\"], [\"4C3024\", \"Saddle\"], [\"4C4F56\", \"Abbey\"], [\"4D0135\", \"Blackberry\"], [\"4D0A18\", \"Cab Sav\"], [\"4D1E01\", \"Indian Tan\"], [\"4D282D\", \"Cowboy\"], [\"4D282E\", \"Livid Brown\"], [\"4D3833\", \"Rock\"], [\"4D3D14\", \"Punga\"], [\"4D400F\", \"Bronzetone\"], [\"4D5328\", \"Woodland\"], [\"4E0606\", \"Mahogany\"], [\"4E2A5A\", \"Bossanova\"], [\"4E3B41\", \"Matterhorn\"], [\"4E420C\", \"Bronze Olive\"], [\"4E4562\", \"Mulled Wine\"], [\"4E6649\", \"Axolotl\"], [\"4E7F9E\", \"Wedgewood\"], [\"4EABD1\", \"Shakespeare\"], [\"4F1C70\", \"Honey Flower\"], [\"4F2398\", \"Daisy Bush\"], [\"4F69C6\", \"Indigo\"], [\"4F7942\", \"Fern Green\"], [\"4F9D5D\", \"Fruit Salad\"], [\"4FA83D\", \"Apple\"], [\"504351\", \"Mortar\"], [\"507096\", \"Kashmir Blue\"], [\"507672\", \"Cutty Sark\"], [\"50C878\", \"Emerald\"], [\"514649\", \"Emperor\"], [\"516E3D\", \"Chalet Green\"], [\"517C66\", \"Como\"], [\"51808F\", \"Smalt Blue\"], [\"52001F\", \"Castro\"], [\"520C17\", \"Maroon Oak\"], [\"523C94\", \"Gigas\"], [\"533455\", \"Voodoo\"], [\"534491\", \"Victoria\"], [\"53824B\", \"Hippie Green\"], [\"541012\", \"Heath\"], [\"544333\", \"Judge Gray\"], [\"54534D\", \"Fuscous Gray\"], [\"549019\", \"Vida Loca\"], [\"55280C\", \"Cioccolato\"], [\"555B10\", \"Saratoga\"], [\"556D56\", \"Finlandia\"], [\"5590D9\", \"Havelock Blue\"], [\"56B4BE\", \"Fountain Blue\"], [\"578363\", \"Spring Leaves\"], [\"583401\", \"Saddle Brown\"], [\"585562\", \"Scarpa Flow\"], [\"587156\", \"Cactus\"], [\"589AAF\", \"Hippie Blue\"], [\"591D35\", \"Wine Berry\"], [\"592804\", \"Brown Bramble\"], [\"593737\", \"Congo Brown\"], [\"594433\", \"Millbrook\"], [\"5A6E9C\", \"Waikawa Gray\"], [\"5A87A0\", \"Horizon\"], [\"5B3013\", \"Jambalaya\"], [\"5C0120\", \"Bordeaux\"], [\"5C0536\", \"Mulberry Wood\"], [\"5C2E01\", \"Carnaby Tan\"], [\"5C5D75\", \"Comet\"], [\"5D1E0F\", \"Redwood\"], [\"5D4C51\", \"Don Juan\"], [\"5D5C58\", \"Chicago\"], [\"5D5E37\", \"Verdigris\"], [\"5D7747\", \"Dingley\"], [\"5DA19F\", \"Breaker Bay\"], [\"5E483E\", \"Kabul\"], [\"5E5D3B\", \"Hemlock\"], [\"5F3D26\", \"Irish Coffee\"], [\"5F5F6E\", \"Mid Gray\"], [\"5F6672\", \"Shuttle Gray\"], [\"5FA777\", \"Aqua Forest\"], [\"5FB3AC\", \"Tradewind\"], [\"604913\", \"Horses Neck\"], [\"605B73\", \"Smoky\"], [\"606E68\", \"Corduroy\"], [\"6093D1\", \"Danube\"], [\"612718\", \"Espresso\"], [\"614051\", \"Eggplant\"], [\"615D30\", \"Costa Del Sol\"], [\"61845F\", \"Glade Green\"], [\"622F30\", \"Buccaneer\"], [\"623F2D\", \"Quincy\"], [\"624E9A\", \"Butterfly Bush\"], [\"625119\", \"West Coast\"], [\"626649\", \"Finch\"], [\"639A8F\", \"Patina\"], [\"63B76C\", \"Fern\"], [\"6456B7\", \"Blue Violet\"], [\"646077\", \"Dolphin\"], [\"646463\", \"Storm Dust\"], [\"646A54\", \"Siam\"], [\"646E75\", \"Nevada\"], [\"6495ED\", \"Cornflower Blue\"], [\"64CCDB\", \"Viking\"], [\"65000B\", \"Rosewood\"], [\"651A14\", \"Cherrywood\"], [\"652DC1\", \"Purple Heart\"], [\"657220\", \"Fern Frond\"], [\"65745D\", \"Willow Grove\"], [\"65869F\", \"Hoki\"], [\"660045\", \"Pompadour\"], [\"660099\", \"Purple\"], [\"66023C\", \"Tyrian Purple\"], [\"661010\", \"Dark Tan\"], [\"66B58F\", \"Silver Tree\"], [\"66FF00\", \"Bright Green\"], [\"66FF66\", \"Screamin' Green\"], [\"67032D\", \"Black Rose\"], [\"675FA6\", \"Scampi\"], [\"676662\", \"Ironside Gray\"], [\"678975\", \"Viridian Green\"], [\"67A712\", \"Christi\"], [\"683600\", \"Nutmeg Wood Finish\"], [\"685558\", \"Zambezi\"], [\"685E6E\", \"Salt Box\"], [\"692545\", \"Tawny Port\"], [\"692D54\", \"Finn\"], [\"695F62\", \"Scorpion\"], [\"697E9A\", \"Lynch\"], [\"6A442E\", \"Spice\"], [\"6A5D1B\", \"Himalaya\"], [\"6A6051\", \"Soya Bean\"], [\"6B2A14\", \"Hairy Heath\"], [\"6B3FA0\", \"Royal Purple\"], [\"6B4E31\", \"Shingle Fawn\"], [\"6B5755\", \"Dorado\"], [\"6B8BA2\", \"Bermuda Gray\"], [\"6B8E23\", \"Olive Drab\"], [\"6C3082\", \"Eminence\"], [\"6CDAE7\", \"Turquoise Blue\"], [\"6D0101\", \"Lonestar\"], [\"6D5E54\", \"Pine Cone\"], [\"6D6C6C\", \"Dove Gray\"], [\"6D9292\", \"Juniper\"], [\"6D92A1\", \"Gothic\"], [\"6E0902\", \"Red Oxide\"], [\"6E1D14\", \"Moccaccino\"], [\"6E4826\", \"Pickled Bean\"], [\"6E4B26\", \"Dallas\"], [\"6E6D57\", \"Kokoda\"], [\"6E7783\", \"Pale Sky\"], [\"6F440C\", \"Cafe Royale\"], [\"6F6A61\", \"Flint\"], [\"6F8E63\", \"Highland\"], [\"6F9D02\", \"Limeade\"], [\"6FD0C5\", \"Downy\"], [\"701C1C\", \"Persian Plum\"], [\"704214\", \"Sepia\"], [\"704A07\", \"Antique Bronze\"], [\"704F50\", \"Ferra\"], [\"706555\", \"Coffee\"], [\"708090\", \"Slate Gray\"], [\"711A00\", \"Cedar Wood Finish\"], [\"71291D\", \"Metallic Copper\"], [\"714693\", \"Affair\"], [\"714AB2\", \"Studio\"], [\"715D47\", \"Tobacco Brown\"], [\"716338\", \"Yellow Metal\"], [\"716B56\", \"Peat\"], [\"716E10\", \"Olivetone\"], [\"717486\", \"Storm Gray\"], [\"718080\", \"Sirocco\"], [\"71D9E2\", \"Aquamarine Blue\"], [\"72010F\", \"Venetian Red\"], [\"724A2F\", \"Old Copper\"], [\"726D4E\", \"Go Ben\"], [\"727B89\", \"Raven\"], [\"731E8F\", \"Seance\"], [\"734A12\", \"Raw Umber\"], [\"736C9F\", \"Kimberly\"], [\"736D58\", \"Crocodile\"], [\"737829\", \"Crete\"], [\"738678\", \"Xanadu\"], [\"74640D\", \"Spicy Mustard\"], [\"747D63\", \"Limed Ash\"], [\"747D83\", \"Rolling Stone\"], [\"748881\", \"Blue Smoke\"], [\"749378\", \"Laurel\"], [\"74C365\", \"Mantis\"], [\"755A57\", \"Russett\"], [\"7563A8\", \"Deluge\"], [\"76395D\", \"Cosmic\"], [\"7666C6\", \"Blue Marguerite\"], [\"76BD17\", \"Lima\"], [\"76D7EA\", \"Sky Blue\"], [\"770F05\", \"Dark Burgundy\"], [\"771F1F\", \"Crown of Thorns\"], [\"773F1A\", \"Walnut\"], [\"776F61\", \"Pablo\"], [\"778120\", \"Pacifika\"], [\"779E86\", \"Oxley\"], [\"77DD77\", \"Pastel Green\"], [\"780109\", \"Japanese Maple\"], [\"782D19\", \"Mocha\"], [\"782F16\", \"Peanut\"], [\"78866B\", \"Camouflage Green\"], [\"788A25\", \"Wasabi\"], [\"788BBA\", \"Ship Cove\"], [\"78A39C\", \"Sea Nymph\"], [\"795D4C\", \"Roman Coffee\"], [\"796878\", \"Old Lavender\"], [\"796989\", \"Rum\"], [\"796A78\", \"Fedora\"], [\"796D62\", \"Sandstone\"], [\"79DEEC\", \"Spray\"], [\"7A013A\", \"Siren\"], [\"7A58C1\", \"Fuchsia Blue\"], [\"7A7A7A\", \"Boulder\"], [\"7A89B8\", \"Wild Blue Yonder\"], [\"7AC488\", \"De York\"], [\"7B3801\", \"Red Beech\"], [\"7B3F00\", \"Cinnamon\"], [\"7B6608\", \"Yukon Gold\"], [\"7B7874\", \"Tapa\"], [\"7B7C94\", \"Waterloo \"], [\"7B8265\", \"Flax Smoke\"], [\"7B9F80\", \"Amulet\"], [\"7BA05B\", \"Asparagus\"], [\"7C1C05\", \"Kenyan Copper\"], [\"7C7631\", \"Pesto\"], [\"7C778A\", \"Topaz\"], [\"7C7B7A\", \"Concord\"], [\"7C7B82\", \"Jumbo\"], [\"7C881A\", \"Trendy Green\"], [\"7CA1A6\", \"Gumbo\"], [\"7CB0A1\", \"Acapulco\"], [\"7CB7BB\", \"Neptune\"], [\"7D2C14\", \"Pueblo\"], [\"7DA98D\", \"Bay Leaf\"], [\"7DC8F7\", \"Malibu\"], [\"7DD8C6\", \"Bermuda\"], [\"7E3A15\", \"Copper Canyon\"], [\"7F1734\", \"Claret\"], [\"7F3A02\", \"Peru Tan\"], [\"7F626D\", \"Falcon\"], [\"7F7589\", \"Mobster\"], [\"7F76D3\", \"Moody Blue\"], [\"7FFF00\", \"Chartreuse\"], [\"7FFFD4\", \"Aquamarine\"], [\"800000\", \"Maroon\"], [\"800B47\", \"Rose Bud Cherry\"], [\"801818\", \"Falu Red\"], [\"80341F\", \"Red Robin\"], [\"803790\", \"Vivid Violet\"], [\"80461B\", \"Russet\"], [\"807E79\", \"Friar Gray\"], [\"808000\", \"Olive\"], [\"808080\", \"Gray\"], [\"80B3AE\", \"Gulf Stream\"], [\"80B3C4\", \"Glacier\"], [\"80CCEA\", \"Seagull\"], [\"81422C\", \"Nutmeg\"], [\"816E71\", \"Spicy Pink\"], [\"817377\", \"Empress\"], [\"819885\", \"Spanish Green\"], [\"826F65\", \"Sand Dune\"], [\"828685\", \"Gunsmoke\"], [\"828F72\", \"Battleship Gray\"], [\"831923\", \"Merlot\"], [\"837050\", \"Shadow\"], [\"83AA5D\", \"Chelsea Cucumber\"], [\"83D0C6\", \"Monte Carlo\"], [\"843179\", \"Plum\"], [\"84A0A0\", \"Granny Smith\"], [\"8581D9\", \"Chetwode Blue\"], [\"858470\", \"Bandicoot\"], [\"859FAF\", \"Bali Hai\"], [\"85C4CC\", \"Half Baked\"], [\"860111\", \"Red Devil\"], [\"863C3C\", \"Lotus\"], [\"86483C\", \"Ironstone\"], [\"864D1E\", \"Bull Shot\"], [\"86560A\", \"Rusty Nail\"], [\"868974\", \"Bitter\"], [\"86949F\", \"Regent Gray\"], [\"871550\", \"Disco\"], [\"87756E\", \"Americano\"], [\"877C7B\", \"Hurricane\"], [\"878D91\", \"Oslo Gray\"], [\"87AB39\", \"Sushi\"], [\"885342\", \"Spicy Mix\"], [\"886221\", \"Kumera\"], [\"888387\", \"Suva Gray\"], [\"888D65\", \"Avocado\"], [\"893456\", \"Camelot\"], [\"893843\", \"Solid Pink\"], [\"894367\", \"Cannon Pink\"], [\"897D6D\", \"Makara\"], [\"8A3324\", \"Burnt Umber\"], [\"8A73D6\", \"True V\"], [\"8A8360\", \"Clay Creek\"], [\"8A8389\", \"Monsoon\"], [\"8A8F8A\", \"Stack\"], [\"8AB9F1\", \"Jordy Blue\"], [\"8B00FF\", \"Electric Violet\"], [\"8B0723\", \"Monarch\"], [\"8B6B0B\", \"Corn Harvest\"], [\"8B8470\", \"Olive Haze\"], [\"8B847E\", \"Schooner\"], [\"8B8680\", \"Natural Gray\"], [\"8B9C90\", \"Mantle\"], [\"8B9FEE\", \"Portage\"], [\"8BA690\", \"Envy\"], [\"8BA9A5\", \"Cascade\"], [\"8BE6D8\", \"Riptide\"], [\"8C055E\", \"Cardinal Pink\"], [\"8C472F\", \"Mule Fawn\"], [\"8C5738\", \"Potters Clay\"], [\"8C6495\", \"Trendy Pink\"], [\"8D0226\", \"Paprika\"], [\"8D3D38\", \"Sanguine Brown\"], [\"8D3F3F\", \"Tosca\"], [\"8D7662\", \"Cement\"], [\"8D8974\", \"Granite Green\"], [\"8D90A1\", \"Manatee\"], [\"8DA8CC\", \"Polo Blue\"], [\"8E0000\", \"Red Berry\"], [\"8E4D1E\", \"Rope\"], [\"8E6F70\", \"Opium\"], [\"8E775E\", \"Domino\"], [\"8E8190\", \"Mamba\"], [\"8EABC1\", \"Nepal\"], [\"8F021C\", \"Pohutukawa\"], [\"8F3E33\", \"El Salva\"], [\"8F4B0E\", \"Korma\"], [\"8F8176\", \"Squirrel\"], [\"8FD6B4\", \"Vista Blue\"], [\"900020\", \"Burgundy\"], [\"901E1E\", \"Old Brick\"], [\"907874\", \"Hemp\"], [\"907B71\", \"Almond Frost\"], [\"908D39\", \"Sycamore\"], [\"92000A\", \"Sangria\"], [\"924321\", \"Cumin\"], [\"926F5B\", \"Beaver\"], [\"928573\", \"Stonewall\"], [\"928590\", \"Venus\"], [\"9370DB\", \"Medium Purple\"], [\"93CCEA\", \"Cornflower\"], [\"93DFB8\", \"Algae Green\"], [\"944747\", \"Copper Rust\"], [\"948771\", \"Arrowtown\"], [\"950015\", \"Scarlett\"], [\"956387\", \"Strikemaster\"], [\"959396\", \"Mountain Mist\"], [\"960018\", \"Carmine\"], [\"964B00\", \"Brown\"], [\"967059\", \"Leather\"], [\"9678B6\", \"Purple Mountain's Majesty\"], [\"967BB6\", \"Lavender Purple\"], [\"96A8A1\", \"Pewter\"], [\"96BBAB\", \"Summer Green\"], [\"97605D\", \"Au Chico\"], [\"9771B5\", \"Wisteria\"], [\"97CD2D\", \"Atlantis\"], [\"983D61\", \"Vin Rouge\"], [\"9874D3\", \"Lilac Bush\"], [\"98777B\", \"Bazaar\"], [\"98811B\", \"Hacienda\"], [\"988D77\", \"Pale Oyster\"], [\"98FF98\", \"Mint Green\"], [\"990066\", \"Fresh Eggplant\"], [\"991199\", \"Violet Eggplant\"], [\"991613\", \"Tamarillo\"], [\"991B07\", \"Totem Pole\"], [\"996666\", \"Copper Rose\"], [\"9966CC\", \"Amethyst\"], [\"997A8D\", \"Mountbatten Pink\"], [\"9999CC\", \"Blue Bell\"], [\"9A3820\", \"Prairie Sand\"], [\"9A6E61\", \"Toast\"], [\"9A9577\", \"Gurkha\"], [\"9AB973\", \"Olivine\"], [\"9AC2B8\", \"Shadow Green\"], [\"9B4703\", \"Oregon\"], [\"9B9E8F\", \"Lemon Grass\"], [\"9C3336\", \"Stiletto\"], [\"9D5616\", \"Hawaiian Tan\"], [\"9DACB7\", \"Gull Gray\"], [\"9DC209\", \"Pistachio\"], [\"9DE093\", \"Granny Smith Apple\"], [\"9DE5FF\", \"Anakiwa\"], [\"9E5302\", \"Chelsea Gem\"], [\"9E5B40\", \"Sepia Skin\"], [\"9EA587\", \"Sage\"], [\"9EA91F\", \"Citron\"], [\"9EB1CD\", \"Rock Blue\"], [\"9EDEE0\", \"Morning Glory\"], [\"9F381D\", \"Cognac\"], [\"9F821C\", \"Reef Gold\"], [\"9F9F9C\", \"Star Dust\"], [\"9FA0B1\", \"Santas Gray\"], [\"9FD7D3\", \"Sinbad\"], [\"9FDD8C\", \"Feijoa\"], [\"A02712\", \"Tabasco\"], [\"A1750D\", \"Buttered Rum\"], [\"A1ADB5\", \"Hit Gray\"], [\"A1C50A\", \"Citrus\"], [\"A1DAD7\", \"Aqua Island\"], [\"A1E9DE\", \"Water Leaf\"], [\"A2006D\", \"Flirt\"], [\"A23B6C\", \"Rouge\"], [\"A26645\", \"Cape Palliser\"], [\"A2AAB3\", \"Gray Chateau\"], [\"A2AEAB\", \"Edward\"], [\"A3807B\", \"Pharlap\"], [\"A397B4\", \"Amethyst Smoke\"], [\"A3E3ED\", \"Blizzard Blue\"], [\"A4A49D\", \"Delta\"], [\"A4A6D3\", \"Wistful\"], [\"A4AF6E\", \"Green Smoke\"], [\"A50B5E\", \"Jazzberry Jam\"], [\"A59B91\", \"Zorba\"], [\"A5CB0C\", \"Bahia\"], [\"A62F20\", \"Roof Terracotta\"], [\"A65529\", \"Paarl\"], [\"A68B5B\", \"Barley Corn\"], [\"A69279\", \"Donkey Brown\"], [\"A6A29A\", \"Dawn\"], [\"A72525\", \"Mexican Red\"], [\"A7882C\", \"Luxor Gold\"], [\"A85307\", \"Rich Gold\"], [\"A86515\", \"Reno Sand\"], [\"A86B6B\", \"Coral Tree\"], [\"A8989B\", \"Dusty Gray\"], [\"A899E6\", \"Dull Lavender\"], [\"A8A589\", \"Tallow\"], [\"A8AE9C\", \"Bud\"], [\"A8AF8E\", \"Locust\"], [\"A8BD9F\", \"Norway\"], [\"A8E3BD\", \"Chinook\"], [\"A9A491\", \"Gray Olive\"], [\"A9ACB6\", \"Aluminium\"], [\"A9B2C3\", \"Cadet Blue\"], [\"A9B497\", \"Schist\"], [\"A9BDBF\", \"Tower Gray\"], [\"A9BEF2\", \"Perano\"], [\"A9C6C2\", \"Opal\"], [\"AA375A\", \"Night Shadz\"], [\"AA4203\", \"Fire\"], [\"AA8B5B\", \"Muesli\"], [\"AA8D6F\", \"Sandal\"], [\"AAA5A9\", \"Shady Lady\"], [\"AAA9CD\", \"Logan\"], [\"AAABB7\", \"Spun Pearl\"], [\"AAD6E6\", \"Regent St Blue\"], [\"AAF0D1\", \"Magic Mint\"], [\"AB0563\", \"Lipstick\"], [\"AB3472\", \"Royal Heath\"], [\"AB917A\", \"Sandrift\"], [\"ABA0D9\", \"Cold Purple\"], [\"ABA196\", \"Bronco\"], [\"AC8A56\", \"Limed Oak\"], [\"AC91CE\", \"East Side\"], [\"AC9E22\", \"Lemon Ginger\"], [\"ACA494\", \"Napa\"], [\"ACA586\", \"Hillary\"], [\"ACA59F\", \"Cloudy\"], [\"ACACAC\", \"Silver Chalice\"], [\"ACB78E\", \"Swamp Green\"], [\"ACCBB1\", \"Spring Rain\"], [\"ACDD4D\", \"Conifer\"], [\"ACE1AF\", \"Celadon\"], [\"AD781B\", \"Mandalay\"], [\"ADBED1\", \"Casper\"], [\"ADDFAD\", \"Moss Green\"], [\"ADE6C4\", \"Padua\"], [\"ADFF2F\", \"Green Yellow\"], [\"AE4560\", \"Hippie Pink\"], [\"AE6020\", \"Desert\"], [\"AE809E\", \"Bouquet\"], [\"AF4035\", \"Medium Carmine\"], [\"AF4D43\", \"Apple Blossom\"], [\"AF593E\", \"Brown Rust\"], [\"AF8751\", \"Driftwood\"], [\"AF8F2C\", \"Alpine\"], [\"AF9F1C\", \"Lucky\"], [\"AFA09E\", \"Martini\"], [\"AFB1B8\", \"Bombay\"], [\"AFBDD9\", \"Pigeon Post\"], [\"B04C6A\", \"Cadillac\"], [\"B05D54\", \"Matrix\"], [\"B05E81\", \"Tapestry\"], [\"B06608\", \"Mai Tai\"], [\"B09A95\", \"Del Rio\"], [\"B0E0E6\", \"Powder Blue\"], [\"B0E313\", \"Inch Worm\"], [\"B10000\", \"Bright Red\"], [\"B14A0B\", \"Vesuvius\"], [\"B1610B\", \"Pumpkin Skin\"], [\"B16D52\", \"Santa Fe\"], [\"B19461\", \"Teak\"], [\"B1E2C1\", \"Fringy Flower\"], [\"B1F4E7\", \"Ice Cold\"], [\"B20931\", \"Shiraz\"], [\"B2A1EA\", \"Biloba Flower\"], [\"B32D29\", \"Tall Poppy\"], [\"B35213\", \"Fiery Orange\"], [\"B38007\", \"Hot Toddy\"], [\"B3AF95\", \"Taupe Gray\"], [\"B3C110\", \"La Rioja\"], [\"B43332\", \"Well Read\"], [\"B44668\", \"Blush\"], [\"B4CFD3\", \"Jungle Mist\"], [\"B57281\", \"Turkish Rose\"], [\"B57EDC\", \"Lavender\"], [\"B5A27F\", \"Mongoose\"], [\"B5B35C\", \"Olive Green\"], [\"B5D2CE\", \"Jet Stream\"], [\"B5ECDF\", \"Cruise\"], [\"B6316C\", \"Hibiscus\"], [\"B69D98\", \"Thatch\"], [\"B6B095\", \"Heathered Gray\"], [\"B6BAA4\", \"Eagle\"], [\"B6D1EA\", \"Spindle\"], [\"B6D3BF\", \"Gum Leaf\"], [\"B7410E\", \"Rust\"], [\"B78E5C\", \"Muddy Waters\"], [\"B7A214\", \"Sahara\"], [\"B7A458\", \"Husk\"], [\"B7B1B1\", \"Nobel\"], [\"B7C3D0\", \"Heather\"], [\"B7F0BE\", \"Madang\"], [\"B81104\", \"Milano Red\"], [\"B87333\", \"Copper\"], [\"B8B56A\", \"Gimblet\"], [\"B8C1B1\", \"Green Spring\"], [\"B8C25D\", \"Celery\"], [\"B8E0F9\", \"Sail\"], [\"B94E48\", \"Chestnut\"], [\"B95140\", \"Crail\"], [\"B98D28\", \"Marigold\"], [\"B9C46A\", \"Wild Willow\"], [\"B9C8AC\", \"Rainee\"], [\"BA0101\", \"Guardsman Red\"], [\"BA450C\", \"Rock Spray\"], [\"BA6F1E\", \"Bourbon\"], [\"BA7F03\", \"Pirate Gold\"], [\"BAB1A2\", \"Nomad\"], [\"BAC7C9\", \"Submarine\"], [\"BAEEF9\", \"Charlotte\"], [\"BB3385\", \"Medium Red Violet\"], [\"BB8983\", \"Brandy Rose\"], [\"BBD009\", \"Rio Grande\"], [\"BBD7C1\", \"Surf\"], [\"BCC9C2\", \"Powder Ash\"], [\"BD5E2E\", \"Tuscany\"], [\"BD978E\", \"Quicksand\"], [\"BDB1A8\", \"Silk\"], [\"BDB2A1\", \"Malta\"], [\"BDB3C7\", \"Chatelle\"], [\"BDBBD7\", \"Lavender Gray\"], [\"BDBDC6\", \"French Gray\"], [\"BDC8B3\", \"Clay Ash\"], [\"BDC9CE\", \"Loblolly\"], [\"BDEDFD\", \"French Pass\"], [\"BEA6C3\", \"London Hue\"], [\"BEB5B7\", \"Pink Swan\"], [\"BEDE0D\", \"Fuego\"], [\"BF5500\", \"Rose of Sharon\"], [\"BFB8B0\", \"Tide\"], [\"BFBED8\", \"Blue Haze\"], [\"BFC1C2\", \"Silver Sand\"], [\"BFC921\", \"Key Lime Pie\"], [\"BFDBE2\", \"Ziggurat\"], [\"BFFF00\", \"Lime\"], [\"C02B18\", \"Thunderbird\"], [\"C04737\", \"Mojo\"], [\"C08081\", \"Old Rose\"], [\"C0C0C0\", \"Silver\"], [\"C0D3B9\", \"Pale Leaf\"], [\"C0D8B6\", \"Pixie Green\"], [\"C1440E\", \"Tia Maria\"], [\"C154C1\", \"Fuchsia Pink\"], [\"C1A004\", \"Buddha Gold\"], [\"C1B7A4\", \"Bison Hide\"], [\"C1BAB0\", \"Tea\"], [\"C1BECD\", \"Gray Suit\"], [\"C1D7B0\", \"Sprout\"], [\"C1F07C\", \"Sulu\"], [\"C26B03\", \"Indochine\"], [\"C2955D\", \"Twine\"], [\"C2BDB6\", \"Cotton Seed\"], [\"C2CAC4\", \"Pumice\"], [\"C2E8E5\", \"Jagged Ice\"], [\"C32148\", \"Maroon Flush\"], [\"C3B091\", \"Indian Khaki\"], [\"C3BFC1\", \"Pale Slate\"], [\"C3C3BD\", \"Gray Nickel\"], [\"C3CDE6\", \"Periwinkle Gray\"], [\"C3D1D1\", \"Tiara\"], [\"C3DDF9\", \"Tropical Blue\"], [\"C41E3A\", \"Cardinal\"], [\"C45655\", \"Fuzzy Wuzzy Brown\"], [\"C45719\", \"Orange Roughy\"], [\"C4C4BC\", \"Mist Gray\"], [\"C4D0B0\", \"Coriander\"], [\"C4F4EB\", \"Mint Tulip\"], [\"C54B8C\", \"Mulberry\"], [\"C59922\", \"Nugget\"], [\"C5994B\", \"Tussock\"], [\"C5DBCA\", \"Sea Mist\"], [\"C5E17A\", \"Yellow Green\"], [\"C62D42\", \"Brick Red\"], [\"C6726B\", \"Contessa\"], [\"C69191\", \"Oriental Pink\"], [\"C6A84B\", \"Roti\"], [\"C6C3B5\", \"Ash\"], [\"C6C8BD\", \"Kangaroo\"], [\"C6E610\", \"Las Palmas\"], [\"C7031E\", \"Monza\"], [\"C71585\", \"Red Violet\"], [\"C7BCA2\", \"Coral Reef\"], [\"C7C1FF\", \"Melrose\"], [\"C7C4BF\", \"Cloud\"], [\"C7C9D5\", \"Ghost\"], [\"C7CD90\", \"Pine Glade\"], [\"C7DDE5\", \"Botticelli\"], [\"C88A65\", \"Antique Brass\"], [\"C8A2C8\", \"Lilac\"], [\"C8A528\", \"Hokey Pokey\"], [\"C8AABF\", \"Lily\"], [\"C8B568\", \"Laser\"], [\"C8E3D7\", \"Edgewater\"], [\"C96323\", \"Piper\"], [\"C99415\", \"Pizza\"], [\"C9A0DC\", \"Light Wisteria\"], [\"C9B29B\", \"Rodeo Dust\"], [\"C9B35B\", \"Sundance\"], [\"C9B93B\", \"Earls Green\"], [\"C9C0BB\", \"Silver Rust\"], [\"C9D9D2\", \"Conch\"], [\"C9FFA2\", \"Reef\"], [\"C9FFE5\", \"Aero Blue\"], [\"CA3435\", \"Flush Mahogany\"], [\"CABB48\", \"Turmeric\"], [\"CADCD4\", \"Paris White\"], [\"CAE00D\", \"Bitter Lemon\"], [\"CAE6DA\", \"Skeptic\"], [\"CB8FA9\", \"Viola\"], [\"CBCAB6\", \"Foggy Gray\"], [\"CBD3B0\", \"Green Mist\"], [\"CBDBD6\", \"Nebula\"], [\"CC3333\", \"Persian Red\"], [\"CC5500\", \"Burnt Orange\"], [\"CC7722\", \"Ochre\"], [\"CC8899\", \"Puce\"], [\"CCCAA8\", \"Thistle Green\"], [\"CCCCFF\", \"Periwinkle\"], [\"CCFF00\", \"Electric Lime\"], [\"CD5700\", \"Tenn\"], [\"CD5C5C\", \"Chestnut Rose\"], [\"CD8429\", \"Brandy Punch\"], [\"CDF4FF\", \"Onahau\"], [\"CEB98F\", \"Sorrell Brown\"], [\"CEBABA\", \"Cold Turkey\"], [\"CEC291\", \"Yuma\"], [\"CEC7A7\", \"Chino\"], [\"CFA39D\", \"Eunry\"], [\"CFB53B\", \"Old Gold\"], [\"CFDCCF\", \"Tasman\"], [\"CFE5D2\", \"Surf Crest\"], [\"CFF9F3\", \"Humming Bird\"], [\"CFFAF4\", \"Scandal\"], [\"D05F04\", \"Red Stage\"], [\"D06DA1\", \"Hopbush\"], [\"D07D12\", \"Meteor\"], [\"D0BEF8\", \"Perfume\"], [\"D0C0E5\", \"Prelude\"], [\"D0F0C0\", \"Tea Green\"], [\"D18F1B\", \"Geebung\"], [\"D1BEA8\", \"Vanilla\"], [\"D1C6B4\", \"Soft Amber\"], [\"D1D2CA\", \"Celeste\"], [\"D1D2DD\", \"Mischka\"], [\"D1E231\", \"Pear\"], [\"D2691E\", \"Hot Cinnamon\"], [\"D27D46\", \"Raw Sienna\"], [\"D29EAA\", \"Careys Pink\"], [\"D2B48C\", \"Tan\"], [\"D2DA97\", \"Deco\"], [\"D2F6DE\", \"Blue Romance\"], [\"D2F8B0\", \"Gossip\"], [\"D3CBBA\", \"Sisal\"], [\"D3CDC5\", \"Swirl\"], [\"D47494\", \"Charm\"], [\"D4B6AF\", \"Clam Shell\"], [\"D4BF8D\", \"Straw\"], [\"D4C4A8\", \"Akaroa\"], [\"D4CD16\", \"Bird Flower\"], [\"D4D7D9\", \"Iron\"], [\"D4DFE2\", \"Geyser\"], [\"D4E2FC\", \"Hawkes Blue\"], [\"D54600\", \"Grenadier\"], [\"D591A4\", \"Can Can\"], [\"D59A6F\", \"Whiskey\"], [\"D5D195\", \"Winter Hazel\"], [\"D5F6E3\", \"Granny Apple\"], [\"D69188\", \"My Pink\"], [\"D6C562\", \"Tacha\"], [\"D6CEF6\", \"Moon Raker\"], [\"D6D6D1\", \"Quill Gray\"], [\"D6FFDB\", \"Snowy Mint\"], [\"D7837F\", \"New York Pink\"], [\"D7C498\", \"Pavlova\"], [\"D7D0FF\", \"Fog\"], [\"D84437\", \"Valencia\"], [\"D87C63\", \"Japonica\"], [\"D8BFD8\", \"Thistle\"], [\"D8C2D5\", \"Maverick\"], [\"D8FCFA\", \"Foam\"], [\"D94972\", \"Cabaret\"], [\"D99376\", \"Burning Sand\"], [\"D9B99B\", \"Cameo\"], [\"D9D6CF\", \"Timberwolf\"], [\"D9DCC1\", \"Tana\"], [\"D9E4F5\", \"Link Water\"], [\"D9F7FF\", \"Mabel\"], [\"DA3287\", \"Cerise\"], [\"DA5B38\", \"Flame Pea\"], [\"DA6304\", \"Bamboo\"], [\"DA6A41\", \"Red Damask\"], [\"DA70D6\", \"Orchid\"], [\"DA8A67\", \"Copperfield\"], [\"DAA520\", \"Golden Grass\"], [\"DAECD6\", \"Zanah\"], [\"DAF4F0\", \"Iceberg\"], [\"DAFAFF\", \"Oyster Bay\"], [\"DB5079\", \"Cranberry\"], [\"DB9690\", \"Petite Orchid\"], [\"DB995E\", \"Di Serria\"], [\"DBDBDB\", \"Alto\"], [\"DBFFF8\", \"Frosted Mint\"], [\"DC143C\", \"Crimson\"], [\"DC4333\", \"Punch\"], [\"DCB20C\", \"Galliano\"], [\"DCB4BC\", \"Blossom\"], [\"DCD747\", \"Wattle\"], [\"DCD9D2\", \"Westar\"], [\"DCDDCC\", \"Moon Mist\"], [\"DCEDB4\", \"Caper\"], [\"DCF0EA\", \"Swans Down\"], [\"DDD6D5\", \"Swiss Coffee\"], [\"DDF9F1\", \"White Ice\"], [\"DE3163\", \"Cerise Red\"], [\"DE6360\", \"Roman\"], [\"DEA681\", \"Tumbleweed\"], [\"DEBA13\", \"Gold Tips\"], [\"DEC196\", \"Brandy\"], [\"DECBC6\", \"Wafer\"], [\"DED4A4\", \"Sapling\"], [\"DED717\", \"Barberry\"], [\"DEE5C0\", \"Beryl Green\"], [\"DEF5FF\", \"Pattens Blue\"], [\"DF73FF\", \"Heliotrope\"], [\"DFBE6F\", \"Apache\"], [\"DFCD6F\", \"Chenin\"], [\"DFCFDB\", \"Lola\"], [\"DFECDA\", \"Willow Brook\"], [\"DFFF00\", \"Chartreuse Yellow\"], [\"E0B0FF\", \"Mauve\"], [\"E0B646\", \"Anzac\"], [\"E0B974\", \"Harvest Gold\"], [\"E0C095\", \"Calico\"], [\"E0FFFF\", \"Baby Blue\"], [\"E16865\", \"Sunglo\"], [\"E1BC64\", \"Equator\"], [\"E1C0C8\", \"Pink Flare\"], [\"E1E6D6\", \"Periglacial Blue\"], [\"E1EAD4\", \"Kidnapper\"], [\"E1F6E8\", \"Tara\"], [\"E25465\", \"Mandy\"], [\"E2725B\", \"Terracotta\"], [\"E28913\", \"Golden Bell\"], [\"E292C0\", \"Shocking\"], [\"E29418\", \"Dixie\"], [\"E29CD2\", \"Light Orchid\"], [\"E2D8ED\", \"Snuff\"], [\"E2EBED\", \"Mystic\"], [\"E2F3EC\", \"Apple Green\"], [\"E30B5C\", \"Razzmatazz\"], [\"E32636\", \"Alizarin Crimson\"], [\"E34234\", \"Cinnabar\"], [\"E3BEBE\", \"Cavern Pink\"], [\"E3F5E1\", \"Peppermint\"], [\"E3F988\", \"Mindaro\"], [\"E47698\", \"Deep Blush\"], [\"E49B0F\", \"Gamboge\"], [\"E4C2D5\", \"Melanie\"], [\"E4CFDE\", \"Twilight\"], [\"E4D1C0\", \"Bone\"], [\"E4D422\", \"Sunflower\"], [\"E4D5B7\", \"Grain Brown\"], [\"E4D69B\", \"Zombie\"], [\"E4F6E7\", \"Frostee\"], [\"E4FFD1\", \"Snow Flurry\"], [\"E52B50\", \"Amaranth\"], [\"E5841B\", \"Zest\"], [\"E5CCC9\", \"Dust Storm\"], [\"E5D7BD\", \"Stark White\"], [\"E5D8AF\", \"Hampton\"], [\"E5E0E1\", \"Bon Jour\"], [\"E5E5E5\", \"Mercury\"], [\"E5F9F6\", \"Polar\"], [\"E64E03\", \"Trinidad\"], [\"E6BE8A\", \"Gold Sand\"], [\"E6BEA5\", \"Cashmere\"], [\"E6D7B9\", \"Double Spanish White\"], [\"E6E4D4\", \"Satin Linen\"], [\"E6F2EA\", \"Harp\"], [\"E6F8F3\", \"Off Green\"], [\"E6FFE9\", \"Hint of Green\"], [\"E6FFFF\", \"Tranquil\"], [\"E77200\", \"Mango Tango\"], [\"E7730A\", \"Christine\"], [\"E79F8C\", \"Tonys Pink\"], [\"E79FC4\", \"Kobi\"], [\"E7BCB4\", \"Rose Fog\"], [\"E7BF05\", \"Corn\"], [\"E7CD8C\", \"Putty\"], [\"E7ECE6\", \"Gray Nurse\"], [\"E7F8FF\", \"Lily White\"], [\"E7FEFF\", \"Bubbles\"], [\"E89928\", \"Fire Bush\"], [\"E8B9B3\", \"Shilo\"], [\"E8E0D5\", \"Pearl Bush\"], [\"E8EBE0\", \"Green White\"], [\"E8F1D4\", \"Chrome White\"], [\"E8F2EB\", \"Gin\"], [\"E8F5F2\", \"Aqua Squeeze\"], [\"E96E00\", \"Clementine\"], [\"E97451\", \"Burnt Sienna\"], [\"E97C07\", \"Tahiti Gold\"], [\"E9CECD\", \"Oyster Pink\"], [\"E9D75A\", \"Confetti\"], [\"E9E3E3\", \"Ebb\"], [\"E9F8ED\", \"Ottoman\"], [\"E9FFFD\", \"Clear Day\"], [\"EA88A8\", \"Carissma\"], [\"EAAE69\", \"Porsche\"], [\"EAB33B\", \"Tulip Tree\"], [\"EAC674\", \"Rob Roy\"], [\"EADAB8\", \"Raffia\"], [\"EAE8D4\", \"White Rock\"], [\"EAF6EE\", \"Panache\"], [\"EAF6FF\", \"Solitude\"], [\"EAF9F5\", \"Aqua Spring\"], [\"EAFFFE\", \"Dew\"], [\"EB9373\", \"Apricot\"], [\"EBC2AF\", \"Zinnwaldite\"], [\"ECA927\", \"Fuel Yellow\"], [\"ECC54E\", \"Ronchi\"], [\"ECC7EE\", \"French Lilac\"], [\"ECCDB9\", \"Just Right\"], [\"ECE090\", \"Wild Rice\"], [\"ECEBBD\", \"Fall Green\"], [\"ECEBCE\", \"Aths Special\"], [\"ECF245\", \"Starship\"], [\"ED0A3F\", \"Red Ribbon\"], [\"ED7A1C\", \"Tango\"], [\"ED9121\", \"Carrot Orange\"], [\"ED989E\", \"Sea Pink\"], [\"EDB381\", \"Tacao\"], [\"EDC9AF\", \"Desert Sand\"], [\"EDCDAB\", \"Pancho\"], [\"EDDCB1\", \"Chamois\"], [\"EDEA99\", \"Primrose\"], [\"EDF5DD\", \"Frost\"], [\"EDF5F5\", \"Aqua Haze\"], [\"EDF6FF\", \"Zumthor\"], [\"EDF9F1\", \"Narvik\"], [\"EDFC84\", \"Honeysuckle\"], [\"EE82EE\", \"Lavender Magenta\"], [\"EEC1BE\", \"Beauty Bush\"], [\"EED794\", \"Chalky\"], [\"EED9C4\", \"Almond\"], [\"EEDC82\", \"Flax\"], [\"EEDEDA\", \"Bizarre\"], [\"EEE3AD\", \"Double Colonial White\"], [\"EEEEE8\", \"Cararra\"], [\"EEEF78\", \"Manz\"], [\"EEF0C8\", \"Tahuna Sands\"], [\"EEF0F3\", \"Athens Gray\"], [\"EEF3C3\", \"Tusk\"], [\"EEF4DE\", \"Loafer\"], [\"EEF6F7\", \"Catskill White\"], [\"EEFDFF\", \"Twilight Blue\"], [\"EEFF9A\", \"Jonquil\"], [\"EEFFE2\", \"Rice Flower\"], [\"EF863F\", \"Jaffa\"], [\"EFEFEF\", \"Gallery\"], [\"EFF2F3\", \"Porcelain\"], [\"F091A9\", \"Mauvelous\"], [\"F0D52D\", \"Golden Dream\"], [\"F0DB7D\", \"Golden Sand\"], [\"F0DC82\", \"Buff\"], [\"F0E2EC\", \"Prim\"], [\"F0E68C\", \"Khaki\"], [\"F0EEFD\", \"Selago\"], [\"F0EEFF\", \"Titan White\"], [\"F0F8FF\", \"Alice Blue\"], [\"F0FCEA\", \"Feta\"], [\"F18200\", \"Gold Drop\"], [\"F19BAB\", \"Wewak\"], [\"F1E788\", \"Sahara Sand\"], [\"F1E9D2\", \"Parchment\"], [\"F1E9FF\", \"Blue Chalk\"], [\"F1EEC1\", \"Mint Julep\"], [\"F1F1F1\", \"Seashell\"], [\"F1F7F2\", \"Saltpan\"], [\"F1FFAD\", \"Tidal\"], [\"F1FFC8\", \"Chiffon\"], [\"F2552A\", \"Flamingo\"], [\"F28500\", \"Tangerine\"], [\"F2C3B2\", \"Mandys Pink\"], [\"F2F2F2\", \"Concrete\"], [\"F2FAFA\", \"Black Squeeze\"], [\"F34723\", \"Pomegranate\"], [\"F3AD16\", \"Buttercup\"], [\"F3D69D\", \"New Orleans\"], [\"F3D9DF\", \"Vanilla Ice\"], [\"F3E7BB\", \"Sidecar\"], [\"F3E9E5\", \"Dawn Pink\"], [\"F3EDCF\", \"Wheatfield\"], [\"F3FB62\", \"Canary\"], [\"F3FBD4\", \"Orinoco\"], [\"F3FFD8\", \"Carla\"], [\"F400A1\", \"Hollywood Cerise\"], [\"F4A460\", \"Sandy brown\"], [\"F4C430\", \"Saffron\"], [\"F4D81C\", \"Ripe Lemon\"], [\"F4EBD3\", \"Janna\"], [\"F4F2EE\", \"Pampas\"], [\"F4F4F4\", \"Wild Sand\"], [\"F4F8FF\", \"Zircon\"], [\"F57584\", \"Froly\"], [\"F5C85C\", \"Cream Can\"], [\"F5C999\", \"Manhattan\"], [\"F5D5A0\", \"Maize\"], [\"F5DEB3\", \"Wheat\"], [\"F5E7A2\", \"Sandwisp\"], [\"F5E7E2\", \"Pot Pourri\"], [\"F5E9D3\", \"Albescent White\"], [\"F5EDEF\", \"Soft Peach\"], [\"F5F3E5\", \"Ecru White\"], [\"F5F5DC\", \"Beige\"], [\"F5FB3D\", \"Golden Fizz\"], [\"F5FFBE\", \"Australian Mint\"], [\"F64A8A\", \"French Rose\"], [\"F653A6\", \"Brilliant Rose\"], [\"F6A4C9\", \"Illusion\"], [\"F6F0E6\", \"Merino\"], [\"F6F7F7\", \"Black Haze\"], [\"F6FFDC\", \"Spring Sun\"], [\"F7468A\", \"Violet Red\"], [\"F77703\", \"Chilean Fire\"], [\"F77FBE\", \"Persian Pink\"], [\"F7B668\", \"Rajah\"], [\"F7C8DA\", \"Azalea\"], [\"F7DBE6\", \"We Peep\"], [\"F7F2E1\", \"Quarter Spanish White\"], [\"F7F5FA\", \"Whisper\"], [\"F7FAF7\", \"Snow Drift\"], [\"F8B853\", \"Casablanca\"], [\"F8C3DF\", \"Chantilly\"], [\"F8D9E9\", \"Cherub\"], [\"F8DB9D\", \"Marzipan\"], [\"F8DD5C\", \"Energy Yellow\"], [\"F8E4BF\", \"Givry\"], [\"F8F0E8\", \"White Linen\"], [\"F8F4FF\", \"Magnolia\"], [\"F8F6F1\", \"Spring Wood\"], [\"F8F7DC\", \"Coconut Cream\"], [\"F8F7FC\", \"White Lilac\"], [\"F8F8F7\", \"Desert Storm\"], [\"F8F99C\", \"Texas\"], [\"F8FACD\", \"Corn Field\"], [\"F8FDD3\", \"Mimosa\"], [\"F95A61\", \"Carnation\"], [\"F9BF58\", \"Saffron Mango\"], [\"F9E0ED\", \"Carousel Pink\"], [\"F9E4BC\", \"Dairy Cream\"], [\"F9E663\", \"Portica\"], [\"F9E6F4\", \"Underage Pink\"], [\"F9EAF3\", \"Amour\"], [\"F9F8E4\", \"Rum Swizzle\"], [\"F9FF8B\", \"Dolly\"], [\"F9FFF6\", \"Sugar Cane\"], [\"FA7814\", \"Ecstasy\"], [\"FA9D5A\", \"Tan Hide\"], [\"FAD3A2\", \"Corvette\"], [\"FADFAD\", \"Peach Yellow\"], [\"FAE600\", \"Turbo\"], [\"FAEAB9\", \"Astra\"], [\"FAECCC\", \"Champagne\"], [\"FAF0E6\", \"Linen\"], [\"FAF3F0\", \"Fantasy\"], [\"FAF7D6\", \"Citrine White\"], [\"FAFAFA\", \"Alabaster\"], [\"FAFDE4\", \"Hint of Yellow\"], [\"FAFFA4\", \"Milan\"], [\"FB607F\", \"Brink Pink\"], [\"FB8989\", \"Geraldine\"], [\"FBA0E3\", \"Lavender Rose\"], [\"FBA129\", \"Sea Buckthorn\"], [\"FBAC13\", \"Sun\"], [\"FBAED2\", \"Lavender Pink\"], [\"FBB2A3\", \"Rose Bud\"], [\"FBBEDA\", \"Cupid\"], [\"FBCCE7\", \"Classic Rose\"], [\"FBCEB1\", \"Apricot Peach\"], [\"FBE7B2\", \"Banana Mania\"], [\"FBE870\", \"Marigold Yellow\"], [\"FBE96C\", \"Festival\"], [\"FBEA8C\", \"Sweet Corn\"], [\"FBEC5D\", \"Candy Corn\"], [\"FBF9F9\", \"Hint of Red\"], [\"FBFFBA\", \"Shalimar\"], [\"FC0FC0\", \"Shocking Pink\"], [\"FC80A5\", \"Tickle Me Pink\"], [\"FC9C1D\", \"Tree Poppy\"], [\"FCC01E\", \"Lightning Yellow\"], [\"FCD667\", \"Goldenrod\"], [\"FCD917\", \"Candlelight\"], [\"FCDA98\", \"Cherokee\"], [\"FCF4D0\", \"Double Pearl Lusta\"], [\"FCF4DC\", \"Pearl Lusta\"], [\"FCF8F7\", \"Vista White\"], [\"FCFBF3\", \"Bianca\"], [\"FCFEDA\", \"Moon Glow\"], [\"FCFFE7\", \"China Ivory\"], [\"FCFFF9\", \"Ceramic\"], [\"FD0E35\", \"Torch Red\"], [\"FD5B78\", \"Wild Watermelon\"], [\"FD7B33\", \"Crusta\"], [\"FD7C07\", \"Sorbus\"], [\"FD9FA2\", \"Sweet Pink\"], [\"FDD5B1\", \"Light Apricot\"], [\"FDD7E4\", \"Pig Pink\"], [\"FDE1DC\", \"Cinderella\"], [\"FDE295\", \"Golden Glow\"], [\"FDE910\", \"Lemon\"], [\"FDF5E6\", \"Old Lace\"], [\"FDF6D3\", \"Half Colonial White\"], [\"FDF7AD\", \"Drover\"], [\"FDFEB8\", \"Pale Prim\"], [\"FDFFD5\", \"Cumulus\"], [\"FE28A2\", \"Persian Rose\"], [\"FE4C40\", \"Sunset Orange\"], [\"FE6F5E\", \"Bittersweet\"], [\"FE9D04\", \"California\"], [\"FEA904\", \"Yellow Sea\"], [\"FEBAAD\", \"Melon\"], [\"FED33C\", \"Bright Sun\"], [\"FED85D\", \"Dandelion\"], [\"FEDB8D\", \"Salomie\"], [\"FEE5AC\", \"Cape Honey\"], [\"FEEBF3\", \"Remy\"], [\"FEEFCE\", \"Oasis\"], [\"FEF0EC\", \"Bridesmaid\"], [\"FEF2C7\", \"Beeswax\"], [\"FEF3D8\", \"Bleach White\"], [\"FEF4CC\", \"Pipi\"], [\"FEF4DB\", \"Half Spanish White\"], [\"FEF4F8\", \"Wisp Pink\"], [\"FEF5F1\", \"Provincial Pink\"], [\"FEF7DE\", \"Half Dutch White\"], [\"FEF8E2\", \"Solitaire\"], [\"FEF8FF\", \"White Pointer\"], [\"FEF9E3\", \"Off Yellow\"], [\"FEFCED\", \"Orange White\"], [\"FF0000\", \"Red\"], [\"FF007F\", \"Rose\"], [\"FF00CC\", \"Purple Pizzazz\"], [\"FF00FF\", \"Magenta / Fuchsia\"], [\"FF2400\", \"Scarlet\"], [\"FF3399\", \"Wild Strawberry\"], [\"FF33CC\", \"Razzle Dazzle Rose\"], [\"FF355E\", \"Radical Red\"], [\"FF3F34\", \"Red Orange\"], [\"FF4040\", \"Coral Red\"], [\"FF4D00\", \"Vermilion\"], [\"FF4F00\", \"International Orange\"], [\"FF6037\", \"Outrageous Orange\"], [\"FF6600\", \"Blaze Orange\"], [\"FF66FF\", \"Pink Flamingo\"], [\"FF681F\", \"Orange\"], [\"FF69B4\", \"Hot Pink\"], [\"FF6B53\", \"Persimmon\"], [\"FF6FFF\", \"Blush Pink\"], [\"FF7034\", \"Burning Orange\"], [\"FF7518\", \"Pumpkin\"], [\"FF7D07\", \"Flamenco\"], [\"FF7F00\", \"Flush Orange\"], [\"FF7F50\", \"Coral\"], [\"FF8C69\", \"Salmon\"], [\"FF9000\", \"Pizazz\"], [\"FF910F\", \"West Side\"], [\"FF91A4\", \"Pink Salmon\"], [\"FF9933\", \"Neon Carrot\"], [\"FF9966\", \"Atomic Tangerine\"], [\"FF9980\", \"Vivid Tangerine\"], [\"FF9E2C\", \"Sunshade\"], [\"FFA000\", \"Orange Peel\"], [\"FFA194\", \"Mona Lisa\"], [\"FFA500\", \"Web Orange\"], [\"FFA6C9\", \"Carnation Pink\"], [\"FFAB81\", \"Hit Pink\"], [\"FFAE42\", \"Yellow Orange\"], [\"FFB0AC\", \"Cornflower Lilac\"], [\"FFB1B3\", \"Sundown\"], [\"FFB31F\", \"My Sin\"], [\"FFB555\", \"Texas Rose\"], [\"FFB7D5\", \"Cotton Candy\"], [\"FFB97B\", \"Macaroni and Cheese\"], [\"FFBA00\", \"Selective Yellow\"], [\"FFBD5F\", \"Koromiko\"], [\"FFBF00\", \"Amber\"], [\"FFC0A8\", \"Wax Flower\"], [\"FFC0CB\", \"Pink\"], [\"FFC3C0\", \"Your Pink\"], [\"FFC901\", \"Supernova\"], [\"FFCBA4\", \"Flesh\"], [\"FFCC33\", \"Sunglow\"], [\"FFCC5C\", \"Golden Tainoi\"], [\"FFCC99\", \"Peach Orange\"], [\"FFCD8C\", \"Chardonnay\"], [\"FFD1DC\", \"Pastel Pink\"], [\"FFD2B7\", \"Romantic\"], [\"FFD38C\", \"Grandis\"], [\"FFD700\", \"Gold\"], [\"FFD800\", \"School bus Yellow\"], [\"FFD8D9\", \"Cosmos\"], [\"FFDB58\", \"Mustard\"], [\"FFDCD6\", \"Peach Schnapps\"], [\"FFDDAF\", \"Caramel\"], [\"FFDDCD\", \"Tuft Bush\"], [\"FFDDCF\", \"Watusi\"], [\"FFDDF4\", \"Pink Lace\"], [\"FFDEAD\", \"Navajo White\"], [\"FFDEB3\", \"Frangipani\"], [\"FFE1DF\", \"Pippin\"], [\"FFE1F2\", \"Pale Rose\"], [\"FFE2C5\", \"Negroni\"], [\"FFE5A0\", \"Cream Brulee\"], [\"FFE5B4\", \"Peach\"], [\"FFE6C7\", \"Tequila\"], [\"FFE772\", \"Kournikova\"], [\"FFEAC8\", \"Sandy Beach\"], [\"FFEAD4\", \"Karry\"], [\"FFEC13\", \"Broom\"], [\"FFEDBC\", \"Colonial White\"], [\"FFEED8\", \"Derby\"], [\"FFEFA1\", \"Vis Vis\"], [\"FFEFC1\", \"Egg White\"], [\"FFEFD5\", \"Papaya Whip\"], [\"FFEFEC\", \"Fair Pink\"], [\"FFF0DB\", \"Peach Cream\"], [\"FFF0F5\", \"Lavender blush\"], [\"FFF14F\", \"Gorse\"], [\"FFF1B5\", \"Buttermilk\"], [\"FFF1D8\", \"Pink Lady\"], [\"FFF1EE\", \"Forget Me Not\"], [\"FFF1F9\", \"Tutu\"], [\"FFF39D\", \"Picasso\"], [\"FFF3F1\", \"Chardon\"], [\"FFF46E\", \"Paris Daisy\"], [\"FFF4CE\", \"Barley White\"], [\"FFF4DD\", \"Egg Sour\"], [\"FFF4E0\", \"Sazerac\"], [\"FFF4E8\", \"Serenade\"], [\"FFF4F3\", \"Chablis\"], [\"FFF5EE\", \"Seashell Peach\"], [\"FFF5F3\", \"Sauvignon\"], [\"FFF6D4\", \"Milk Punch\"], [\"FFF6DF\", \"Varden\"], [\"FFF6F5\", \"Rose White\"], [\"FFF8D1\", \"Baja White\"], [\"FFF9E2\", \"Gin Fizz\"], [\"FFF9E6\", \"Early Dawn\"], [\"FFFACD\", \"Lemon Chiffon\"], [\"FFFAF4\", \"Bridal Heath\"], [\"FFFBDC\", \"Scotch Mist\"], [\"FFFBF9\", \"Soapstone\"], [\"FFFC99\", \"Witch Haze\"], [\"FFFCEA\", \"Buttery White\"], [\"FFFCEE\", \"Island Spice\"], [\"FFFDD0\", \"Cream\"], [\"FFFDE6\", \"Chilean Heath\"], [\"FFFDE8\", \"Travertine\"], [\"FFFDF3\", \"Orchid White\"], [\"FFFDF4\", \"Quarter Pearl Lusta\"], [\"FFFEE1\", \"Half and Half\"], [\"FFFEEC\", \"Apricot White\"], [\"FFFEF0\", \"Rice Cake\"], [\"FFFEF6\", \"Black White\"], [\"FFFEFD\", \"Romance\"], [\"FFFF00\", \"Yellow\"], [\"FFFF66\", \"Laser Lemon\"], [\"FFFF99\", \"Pale Canary\"], [\"FFFFB4\", \"Portafino\"], [\"FFFFF0\", \"Ivory\"], [\"FFFFFF\", \"White\"], [\"acc2d9\", \"cloudy blue\"], [\"56ae57\", \"dark pastel green\"], [\"b2996e\", \"dust\"], [\"a8ff04\", \"electric lime\"], [\"69d84f\", \"fresh green\"], [\"894585\", \"light eggplant\"], [\"70b23f\", \"nasty green\"], [\"d4ffff\", \"really light blue\"], [\"65ab7c\", \"tea\"], [\"952e8f\", \"warm purple\"], [\"fcfc81\", \"yellowish tan\"], [\"a5a391\", \"cement\"], [\"388004\", \"dark grass green\"], [\"4c9085\", \"dusty teal\"], [\"5e9b8a\", \"grey teal\"], [\"efb435\", \"macaroni and cheese\"], [\"d99b82\", \"pinkish tan\"], [\"0a5f38\", \"spruce\"], [\"0c06f7\", \"strong blue\"], [\"61de2a\", \"toxic green\"], [\"3778bf\", \"windows blue\"], [\"2242c7\", \"blue blue\"], [\"533cc6\", \"blue with a hint of purple\"], [\"9bb53c\", \"booger\"], [\"05ffa6\", \"bright sea green\"], [\"1f6357\", \"dark green blue\"], [\"017374\", \"deep turquoise\"], [\"0cb577\", \"green teal\"], [\"ff0789\", \"strong pink\"], [\"afa88b\", \"bland\"], [\"08787f\", \"deep aqua\"], [\"dd85d7\", \"lavender pink\"], [\"a6c875\", \"light moss green\"], [\"a7ffb5\", \"light seafoam green\"], [\"c2b709\", \"olive yellow\"], [\"e78ea5\", \"pig pink\"], [\"966ebd\", \"deep lilac\"], [\"ccad60\", \"desert\"], [\"ac86a8\", \"dusty lavender\"], [\"947e94\", \"purpley grey\"], [\"983fb2\", \"purply\"], [\"ff63e9\", \"candy pink\"], [\"b2fba5\", \"light pastel green\"], [\"63b365\", \"boring green\"], [\"8ee53f\", \"kiwi green\"], [\"b7e1a1\", \"light grey green\"], [\"ff6f52\", \"orange pink\"], [\"bdf8a3\", \"tea green\"], [\"d3b683\", \"very light brown\"], [\"fffcc4\", \"egg shell\"], [\"430541\", \"eggplant purple\"], [\"ffb2d0\", \"powder pink\"], [\"997570\", \"reddish grey\"], [\"ad900d\", \"baby shit brown\"], [\"c48efd\", \"liliac\"], [\"507b9c\", \"stormy blue\"], [\"7d7103\", \"ugly brown\"], [\"fffd78\", \"custard\"], [\"da467d\", \"darkish pink\"], [\"410200\", \"deep brown\"], [\"c9d179\", \"greenish beige\"], [\"fffa86\", \"manilla\"], [\"5684ae\", \"off blue\"], [\"6b7c85\", \"battleship grey\"], [\"6f6c0a\", \"browny green\"], [\"7e4071\", \"bruise\"], [\"009337\", \"kelley green\"], [\"d0e429\", \"sickly yellow\"], [\"fff917\", \"sunny yellow\"], [\"1d5dec\", \"azul\"], [\"054907\", \"darkgreen\"], [\"b5ce08\", \"green/yellow\"], [\"8fb67b\", \"lichen\"], [\"c8ffb0\", \"light light green\"], [\"fdde6c\", \"pale gold\"], [\"ffdf22\", \"sun yellow\"], [\"a9be70\", \"tan green\"], [\"6832e3\", \"burple\"], [\"fdb147\", \"butterscotch\"], [\"c7ac7d\", \"toupe\"], [\"fff39a\", \"dark cream\"], [\"850e04\", \"indian red\"], [\"efc0fe\", \"light lavendar\"], [\"40fd14\", \"poison green\"], [\"b6c406\", \"baby puke green\"], [\"9dff00\", \"bright yellow green\"], [\"3c4142\", \"charcoal grey\"], [\"f2ab15\", \"squash\"], [\"ac4f06\", \"cinnamon\"], [\"c4fe82\", \"light pea green\"], [\"2cfa1f\", \"radioactive green\"], [\"9a6200\", \"raw sienna\"], [\"ca9bf7\", \"baby purple\"], [\"875f42\", \"cocoa\"], [\"3a2efe\", \"light royal blue\"], [\"fd8d49\", \"orangeish\"], [\"8b3103\", \"rust brown\"], [\"cba560\", \"sand brown\"], [\"698339\", \"swamp\"], [\"0cdc73\", \"tealish green\"], [\"b75203\", \"burnt siena\"], [\"7f8f4e\", \"camo\"], [\"26538d\", \"dusk blue\"], [\"63a950\", \"fern\"], [\"c87f89\", \"old rose\"], [\"b1fc99\", \"pale light green\"], [\"ff9a8a\", \"peachy pink\"], [\"f6688e\", \"rosy pink\"], [\"76fda8\", \"light bluish green\"], [\"53fe5c\", \"light bright green\"], [\"4efd54\", \"light neon green\"], [\"a0febf\", \"light seafoam\"], [\"7bf2da\", \"tiffany blue\"], [\"bcf5a6\", \"washed out green\"], [\"ca6b02\", \"browny orange\"], [\"107ab0\", \"nice blue\"], [\"2138ab\", \"sapphire\"], [\"719f91\", \"greyish teal\"], [\"fdb915\", \"orangey yellow\"], [\"fefcaf\", \"parchment\"], [\"fcf679\", \"straw\"], [\"1d0200\", \"very dark brown\"], [\"cb6843\", \"terracota\"], [\"31668a\", \"ugly blue\"], [\"247afd\", \"clear blue\"], [\"ffffb6\", \"creme\"], [\"90fda9\", \"foam green\"], [\"86a17d\", \"grey/green\"], [\"fddc5c\", \"light gold\"], [\"78d1b6\", \"seafoam blue\"], [\"13bbaf\", \"topaz\"], [\"fb5ffc\", \"violet pink\"], [\"20f986\", \"wintergreen\"], [\"ffe36e\", \"yellow tan\"], [\"9d0759\", \"dark fuchsia\"], [\"3a18b1\", \"indigo blue\"], [\"c2ff89\", \"light yellowish green\"], [\"d767ad\", \"pale magenta\"], [\"720058\", \"rich purple\"], [\"ffda03\", \"sunflower yellow\"], [\"01c08d\", \"green/blue\"], [\"ac7434\", \"leather\"], [\"014600\", \"racing green\"], [\"9900fa\", \"vivid purple\"], [\"02066f\", \"dark royal blue\"], [\"8e7618\", \"hazel\"], [\"d1768f\", \"muted pink\"], [\"96b403\", \"booger green\"], [\"fdff63\", \"canary\"], [\"95a3a6\", \"cool grey\"], [\"7f684e\", \"dark taupe\"], [\"751973\", \"darkish purple\"], [\"089404\", \"true green\"], [\"ff6163\", \"coral pink\"], [\"598556\", \"dark sage\"], [\"214761\", \"dark slate blue\"], [\"3c73a8\", \"flat blue\"], [\"ba9e88\", \"mushroom\"], [\"021bf9\", \"rich blue\"], [\"734a65\", \"dirty purple\"], [\"23c48b\", \"greenblue\"], [\"8fae22\", \"icky green\"], [\"e6f2a2\", \"light khaki\"], [\"4b57db\", \"warm blue\"], [\"d90166\", \"dark hot pink\"], [\"015482\", \"deep sea blue\"], [\"9d0216\", \"carmine\"], [\"728f02\", \"dark yellow green\"], [\"ffe5ad\", \"pale peach\"], [\"4e0550\", \"plum purple\"], [\"f9bc08\", \"golden rod\"], [\"ff073a\", \"neon red\"], [\"c77986\", \"old pink\"], [\"d6fffe\", \"very pale blue\"], [\"fe4b03\", \"blood orange\"], [\"fd5956\", \"grapefruit\"], [\"fce166\", \"sand yellow\"], [\"b2713d\", \"clay brown\"], [\"1f3b4d\", \"dark blue grey\"], [\"699d4c\", \"flat green\"], [\"56fca2\", \"light green blue\"], [\"fb5581\", \"warm pink\"], [\"3e82fc\", \"dodger blue\"], [\"a0bf16\", \"gross green\"], [\"d6fffa\", \"ice\"], [\"4f738e\", \"metallic blue\"], [\"ffb19a\", \"pale salmon\"], [\"5c8b15\", \"sap green\"], [\"54ac68\", \"algae\"], [\"89a0b0\", \"bluey grey\"], [\"7ea07a\", \"greeny grey\"], [\"1bfc06\", \"highlighter green\"], [\"cafffb\", \"light light blue\"], [\"b6ffbb\", \"light mint\"], [\"a75e09\", \"raw umber\"], [\"152eff\", \"vivid blue\"], [\"8d5eb7\", \"deep lavender\"], [\"5f9e8f\", \"dull teal\"], [\"63f7b4\", \"light greenish blue\"], [\"606602\", \"mud green\"], [\"fc86aa\", \"pinky\"], [\"8c0034\", \"red wine\"], [\"758000\", \"shit green\"], [\"ab7e4c\", \"tan brown\"], [\"030764\", \"darkblue\"], [\"fe86a4\", \"rosa\"], [\"d5174e\", \"lipstick\"], [\"fed0fc\", \"pale mauve\"], [\"680018\", \"claret\"], [\"fedf08\", \"dandelion\"], [\"fe420f\", \"orangered\"], [\"6f7c00\", \"poop green\"], [\"ca0147\", \"ruby\"], [\"1b2431\", \"dark\"], [\"00fbb0\", \"greenish turquoise\"], [\"db5856\", \"pastel red\"], [\"ddd618\", \"piss yellow\"], [\"41fdfe\", \"bright cyan\"], [\"cf524e\", \"dark coral\"], [\"21c36f\", \"algae green\"], [\"a90308\", \"darkish red\"], [\"6e1005\", \"reddy brown\"], [\"fe828c\", \"blush pink\"], [\"4b6113\", \"camouflage green\"], [\"4da409\", \"lawn green\"], [\"beae8a\", \"putty\"], [\"0339f8\", \"vibrant blue\"], [\"a88f59\", \"dark sand\"], [\"5d21d0\", \"purple/blue\"], [\"feb209\", \"saffron\"], [\"4e518b\", \"twilight\"], [\"964e02\", \"warm brown\"], [\"85a3b2\", \"bluegrey\"], [\"ff69af\", \"bubble gum pink\"], [\"c3fbf4\", \"duck egg blue\"], [\"2afeb7\", \"greenish cyan\"], [\"005f6a\", \"petrol\"], [\"0c1793\", \"royal\"], [\"ffff81\", \"butter\"], [\"f0833a\", \"dusty orange\"], [\"f1f33f\", \"off yellow\"], [\"b1d27b\", \"pale olive green\"], [\"fc824a\", \"orangish\"], [\"71aa34\", \"leaf\"], [\"b7c9e2\", \"light blue grey\"], [\"4b0101\", \"dried blood\"], [\"a552e6\", \"lightish purple\"], [\"af2f0d\", \"rusty red\"], [\"8b88f8\", \"lavender blue\"], [\"9af764\", \"light grass green\"], [\"a6fbb2\", \"light mint green\"], [\"ffc512\", \"sunflower\"], [\"750851\", \"velvet\"], [\"c14a09\", \"brick orange\"], [\"fe2f4a\", \"lightish red\"], [\"0203e2\", \"pure blue\"], [\"0a437a\", \"twilight blue\"], [\"a50055\", \"violet red\"], [\"ae8b0c\", \"yellowy brown\"], [\"fd798f\", \"carnation\"], [\"bfac05\", \"muddy yellow\"], [\"3eaf76\", \"dark seafoam green\"], [\"c74767\", \"deep rose\"], [\"b9484e\", \"dusty red\"], [\"647d8e\", \"grey/blue\"], [\"bffe28\", \"lemon lime\"], [\"d725de\", \"purple/pink\"], [\"b29705\", \"brown yellow\"], [\"673a3f\", \"purple brown\"], [\"a87dc2\", \"wisteria\"], [\"fafe4b\", \"banana yellow\"], [\"c0022f\", \"lipstick red\"], [\"0e87cc\", \"water blue\"], [\"8d8468\", \"brown grey\"], [\"ad03de\", \"vibrant purple\"], [\"8cff9e\", \"baby green\"], [\"94ac02\", \"barf green\"], [\"c4fff7\", \"eggshell blue\"], [\"fdee73\", \"sandy yellow\"], [\"33b864\", \"cool green\"], [\"fff9d0\", \"pale\"], [\"758da3\", \"blue/grey\"], [\"f504c9\", \"hot magenta\"], [\"77a1b5\", \"greyblue\"], [\"8756e4\", \"purpley\"], [\"889717\", \"baby shit green\"], [\"c27e79\", \"brownish pink\"], [\"017371\", \"dark aquamarine\"], [\"9f8303\", \"diarrhea\"], [\"f7d560\", \"light mustard\"], [\"bdf6fe\", \"pale sky blue\"], [\"75b84f\", \"turtle green\"], [\"9cbb04\", \"bright olive\"], [\"29465b\", \"dark grey blue\"], [\"696006\", \"greeny brown\"], [\"adf802\", \"lemon green\"], [\"c1c6fc\", \"light periwinkle\"], [\"35ad6b\", \"seaweed green\"], [\"fffd37\", \"sunshine yellow\"], [\"a442a0\", \"ugly purple\"], [\"f36196\", \"medium pink\"], [\"947706\", \"puke brown\"], [\"fff4f2\", \"very light pink\"], [\"1e9167\", \"viridian\"], [\"b5c306\", \"bile\"], [\"feff7f\", \"faded yellow\"], [\"cffdbc\", \"very pale green\"], [\"0add08\", \"vibrant green\"], [\"87fd05\", \"bright lime\"], [\"1ef876\", \"spearmint\"], [\"7bfdc7\", \"light aquamarine\"], [\"bcecac\", \"light sage\"], [\"bbf90f\", \"yellowgreen\"], [\"ab9004\", \"baby poo\"], [\"1fb57a\", \"dark seafoam\"], [\"00555a\", \"deep teal\"], [\"a484ac\", \"heather\"], [\"c45508\", \"rust orange\"], [\"3f829d\", \"dirty blue\"], [\"548d44\", \"fern green\"], [\"c95efb\", \"bright lilac\"], [\"3ae57f\", \"weird green\"], [\"016795\", \"peacock blue\"], [\"87a922\", \"avocado green\"], [\"f0944d\", \"faded orange\"], [\"5d1451\", \"grape purple\"], [\"25ff29\", \"hot green\"], [\"d0fe1d\", \"lime yellow\"], [\"ffa62b\", \"mango\"], [\"01b44c\", \"shamrock\"], [\"ff6cb5\", \"bubblegum\"], [\"6b4247\", \"purplish brown\"], [\"c7c10c\", \"vomit yellow\"], [\"b7fffa\", \"pale cyan\"], [\"aeff6e\", \"key lime\"], [\"ec2d01\", \"tomato red\"], [\"76ff7b\", \"lightgreen\"], [\"730039\", \"merlot\"], [\"040348\", \"night blue\"], [\"df4ec8\", \"purpleish pink\"], [\"6ecb3c\", \"apple\"], [\"8f9805\", \"baby poop green\"], [\"5edc1f\", \"green apple\"], [\"d94ff5\", \"heliotrope\"], [\"c8fd3d\", \"yellow/green\"], [\"070d0d\", \"almost black\"], [\"4984b8\", \"cool blue\"], [\"51b73b\", \"leafy green\"], [\"ac7e04\", \"mustard brown\"], [\"4e5481\", \"dusk\"], [\"876e4b\", \"dull brown\"], [\"58bc08\", \"frog green\"], [\"2fef10\", \"vivid green\"], [\"2dfe54\", \"bright light green\"], [\"0aff02\", \"fluro green\"], [\"9cef43\", \"kiwi\"], [\"18d17b\", \"seaweed\"], [\"35530a\", \"navy green\"], [\"1805db\", \"ultramarine blue\"], [\"6258c4\", \"iris\"], [\"ff964f\", \"pastel orange\"], [\"ffab0f\", \"yellowish orange\"], [\"8f8ce7\", \"perrywinkle\"], [\"24bca8\", \"tealish\"], [\"3f012c\", \"dark plum\"], [\"cbf85f\", \"pear\"], [\"ff724c\", \"pinkish orange\"], [\"280137\", \"midnight purple\"], [\"b36ff6\", \"light urple\"], [\"48c072\", \"dark mint\"], [\"bccb7a\", \"greenish tan\"], [\"a8415b\", \"light burgundy\"], [\"06b1c4\", \"turquoise blue\"], [\"cd7584\", \"ugly pink\"], [\"f1da7a\", \"sandy\"], [\"ff0490\", \"electric pink\"], [\"805b87\", \"muted purple\"], [\"50a747\", \"mid green\"], [\"a8a495\", \"greyish\"], [\"cfff04\", \"neon yellow\"], [\"ffff7e\", \"banana\"], [\"ff7fa7\", \"carnation pink\"], [\"ef4026\", \"tomato\"], [\"3c9992\", \"sea\"], [\"886806\", \"muddy brown\"], [\"04f489\", \"turquoise green\"], [\"fef69e\", \"buff\"], [\"cfaf7b\", \"fawn\"], [\"3b719f\", \"muted blue\"], [\"fdc1c5\", \"pale rose\"], [\"20c073\", \"dark mint green\"], [\"9b5fc0\", \"amethyst\"], [\"0f9b8e\", \"blue/green\"], [\"742802\", \"chestnut\"], [\"9db92c\", \"sick green\"], [\"a4bf20\", \"pea\"], [\"cd5909\", \"rusty orange\"], [\"ada587\", \"stone\"], [\"be013c\", \"rose red\"], [\"b8ffeb\", \"pale aqua\"], [\"dc4d01\", \"deep orange\"], [\"a2653e\", \"earth\"], [\"638b27\", \"mossy green\"], [\"419c03\", \"grassy green\"], [\"b1ff65\", \"pale lime green\"], [\"9dbcd4\", \"light grey blue\"], [\"fdfdfe\", \"pale grey\"], [\"77ab56\", \"asparagus\"], [\"464196\", \"blueberry\"], [\"990147\", \"purple red\"], [\"befd73\", \"pale lime\"], [\"32bf84\", \"greenish teal\"], [\"af6f09\", \"caramel\"], [\"a0025c\", \"deep magenta\"], [\"ffd8b1\", \"light peach\"], [\"7f4e1e\", \"milk chocolate\"], [\"bf9b0c\", \"ocher\"], [\"6ba353\", \"off green\"], [\"f075e6\", \"purply pink\"], [\"7bc8f6\", \"lightblue\"], [\"475f94\", \"dusky blue\"], [\"f5bf03\", \"golden\"], [\"fffeb6\", \"light beige\"], [\"fffd74\", \"butter yellow\"], [\"895b7b\", \"dusky purple\"], [\"436bad\", \"french blue\"], [\"d0c101\", \"ugly yellow\"], [\"c6f808\", \"greeny yellow\"], [\"f43605\", \"orangish red\"], [\"02c14d\", \"shamrock green\"], [\"b25f03\", \"orangish brown\"], [\"2a7e19\", \"tree green\"], [\"490648\", \"deep violet\"], [\"536267\", \"gunmetal\"], [\"5a06ef\", \"blue/purple\"], [\"cf0234\", \"cherry\"], [\"c4a661\", \"sandy brown\"], [\"978a84\", \"warm grey\"], [\"1f0954\", \"dark indigo\"], [\"03012d\", \"midnight\"], [\"2bb179\", \"bluey green\"], [\"c3909b\", \"grey pink\"], [\"a66fb5\", \"soft purple\"], [\"770001\", \"blood\"], [\"922b05\", \"brown red\"], [\"7d7f7c\", \"medium grey\"], [\"990f4b\", \"berry\"], [\"8f7303\", \"poo\"], [\"c83cb9\", \"purpley pink\"], [\"fea993\", \"light salmon\"], [\"acbb0d\", \"snot\"], [\"c071fe\", \"easter purple\"], [\"ccfd7f\", \"light yellow green\"], [\"00022e\", \"dark navy blue\"], [\"828344\", \"drab\"], [\"ffc5cb\", \"light rose\"], [\"ab1239\", \"rouge\"], [\"b0054b\", \"purplish red\"], [\"99cc04\", \"slime green\"], [\"937c00\", \"baby poop\"], [\"019529\", \"irish green\"], [\"ef1de7\", \"pink/purple\"], [\"000435\", \"dark navy\"], [\"42b395\", \"greeny blue\"], [\"9d5783\", \"light plum\"], [\"c8aca9\", \"pinkish grey\"], [\"c87606\", \"dirty orange\"], [\"aa2704\", \"rust red\"], [\"e4cbff\", \"pale lilac\"], [\"fa4224\", \"orangey red\"], [\"0804f9\", \"primary blue\"], [\"5cb200\", \"kermit green\"], [\"76424e\", \"brownish purple\"], [\"6c7a0e\", \"murky green\"], [\"fbdd7e\", \"wheat\"], [\"2a0134\", \"very dark purple\"], [\"044a05\", \"bottle green\"], [\"fd4659\", \"watermelon\"], [\"0d75f8\", \"deep sky blue\"], [\"fe0002\", \"fire engine red\"], [\"cb9d06\", \"yellow ochre\"], [\"fb7d07\", \"pumpkin orange\"], [\"b9cc81\", \"pale olive\"], [\"edc8ff\", \"light lilac\"], [\"61e160\", \"lightish green\"], [\"8ab8fe\", \"carolina blue\"], [\"920a4e\", \"mulberry\"], [\"fe02a2\", \"shocking pink\"], [\"9a3001\", \"auburn\"], [\"65fe08\", \"bright lime green\"], [\"befdb7\", \"celadon\"], [\"b17261\", \"pinkish brown\"], [\"885f01\", \"poo brown\"], [\"02ccfe\", \"bright sky blue\"], [\"c1fd95\", \"celery\"], [\"836539\", \"dirt brown\"], [\"fb2943\", \"strawberry\"], [\"84b701\", \"dark lime\"], [\"b66325\", \"copper\"], [\"7f5112\", \"medium brown\"], [\"5fa052\", \"muted green\"], [\"6dedfd\", \"robin's egg\"], [\"0bf9ea\", \"bright aqua\"], [\"c760ff\", \"bright lavender\"], [\"ffffcb\", \"ivory\"], [\"f6cefc\", \"very light purple\"], [\"155084\", \"light navy\"], [\"f5054f\", \"pink red\"], [\"645403\", \"olive brown\"], [\"7a5901\", \"poop brown\"], [\"a8b504\", \"mustard green\"], [\"3d9973\", \"ocean green\"], [\"000133\", \"very dark blue\"], [\"76a973\", \"dusty green\"], [\"2e5a88\", \"light navy blue\"], [\"0bf77d\", \"minty green\"], [\"bd6c48\", \"adobe\"], [\"ac1db8\", \"barney\"], [\"2baf6a\", \"jade green\"], [\"26f7fd\", \"bright light blue\"], [\"aefd6c\", \"light lime\"], [\"9b8f55\", \"dark khaki\"], [\"ffad01\", \"orange yellow\"], [\"c69c04\", \"ocre\"], [\"f4d054\", \"maize\"], [\"de9dac\", \"faded pink\"], [\"05480d\", \"british racing green\"], [\"c9ae74\", \"sandstone\"], [\"60460f\", \"mud brown\"], [\"98f6b0\", \"light sea green\"], [\"8af1fe\", \"robin egg blue\"], [\"2ee8bb\", \"aqua marine\"], [\"11875d\", \"dark sea green\"], [\"fdb0c0\", \"soft pink\"], [\"b16002\", \"orangey brown\"], [\"f7022a\", \"cherry red\"], [\"d5ab09\", \"burnt yellow\"], [\"86775f\", \"brownish grey\"], [\"c69f59\", \"camel\"], [\"7a687f\", \"purplish grey\"], [\"042e60\", \"marine\"], [\"c88d94\", \"greyish pink\"], [\"a5fbd5\", \"pale turquoise\"], [\"fffe71\", \"pastel yellow\"], [\"6241c7\", \"bluey purple\"], [\"fffe40\", \"canary yellow\"], [\"d3494e\", \"faded red\"], [\"985e2b\", \"sepia\"], [\"a6814c\", \"coffee\"], [\"ff08e8\", \"bright magenta\"], [\"9d7651\", \"mocha\"], [\"feffca\", \"ecru\"], [\"98568d\", \"purpleish\"], [\"9e003a\", \"cranberry\"], [\"287c37\", \"darkish green\"], [\"b96902\", \"brown orange\"], [\"ba6873\", \"dusky rose\"], [\"ff7855\", \"melon\"], [\"94b21c\", \"sickly green\"], [\"c5c9c7\", \"silver\"], [\"661aee\", \"purply blue\"], [\"6140ef\", \"purpleish blue\"], [\"9be5aa\", \"hospital green\"], [\"7b5804\", \"shit brown\"], [\"276ab3\", \"mid blue\"], [\"feb308\", \"amber\"], [\"8cfd7e\", \"easter green\"], [\"6488ea\", \"soft blue\"], [\"056eee\", \"cerulean blue\"], [\"b27a01\", \"golden brown\"], [\"0ffef9\", \"bright turquoise\"], [\"fa2a55\", \"red pink\"], [\"820747\", \"red purple\"], [\"7a6a4f\", \"greyish brown\"], [\"f4320c\", \"vermillion\"], [\"a13905\", \"russet\"], [\"6f828a\", \"steel grey\"], [\"a55af4\", \"lighter purple\"], [\"ad0afd\", \"bright violet\"], [\"004577\", \"prussian blue\"], [\"658d6d\", \"slate green\"], [\"ca7b80\", \"dirty pink\"], [\"005249\", \"dark blue green\"], [\"2b5d34\", \"pine\"], [\"bff128\", \"yellowy green\"], [\"b59410\", \"dark gold\"], [\"2976bb\", \"bluish\"], [\"014182\", \"darkish blue\"], [\"bb3f3f\", \"dull red\"], [\"fc2647\", \"pinky red\"], [\"a87900\", \"bronze\"], [\"82cbb2\", \"pale teal\"], [\"667c3e\", \"military green\"], [\"fe46a5\", \"barbie pink\"], [\"fe83cc\", \"bubblegum pink\"], [\"94a617\", \"pea soup green\"], [\"a88905\", \"dark mustard\"], [\"7f5f00\", \"shit\"], [\"9e43a2\", \"medium purple\"], [\"062e03\", \"very dark green\"], [\"8a6e45\", \"dirt\"], [\"cc7a8b\", \"dusky pink\"], [\"9e0168\", \"red violet\"], [\"fdff38\", \"lemon yellow\"], [\"c0fa8b\", \"pistachio\"], [\"eedc5b\", \"dull yellow\"], [\"7ebd01\", \"dark lime green\"], [\"3b5b92\", \"denim blue\"], [\"01889f\", \"teal blue\"], [\"3d7afd\", \"lightish blue\"], [\"5f34e7\", \"purpley blue\"], [\"6d5acf\", \"light indigo\"], [\"748500\", \"swamp green\"], [\"706c11\", \"brown green\"], [\"3c0008\", \"dark maroon\"], [\"cb00f5\", \"hot purple\"], [\"002d04\", \"dark forest green\"], [\"658cbb\", \"faded blue\"], [\"749551\", \"drab green\"], [\"b9ff66\", \"light lime green\"], [\"9dc100\", \"snot green\"], [\"faee66\", \"yellowish\"], [\"7efbb3\", \"light blue green\"], [\"7b002c\", \"bordeaux\"], [\"c292a1\", \"light mauve\"], [\"017b92\", \"ocean\"], [\"fcc006\", \"marigold\"], [\"657432\", \"muddy green\"], [\"d8863b\", \"dull orange\"], [\"738595\", \"steel\"], [\"aa23ff\", \"electric purple\"], [\"08ff08\", \"fluorescent green\"], [\"9b7a01\", \"yellowish brown\"], [\"f29e8e\", \"blush\"], [\"6fc276\", \"soft green\"], [\"ff5b00\", \"bright orange\"], [\"fdff52\", \"lemon\"], [\"866f85\", \"purple grey\"], [\"8ffe09\", \"acid green\"], [\"eecffe\", \"pale lavender\"], [\"510ac9\", \"violet blue\"], [\"4f9153\", \"light forest green\"], [\"9f2305\", \"burnt red\"], [\"728639\", \"khaki green\"], [\"de0c62\", \"cerise\"], [\"916e99\", \"faded purple\"], [\"ffb16d\", \"apricot\"], [\"3c4d03\", \"dark olive green\"], [\"7f7053\", \"grey brown\"], [\"77926f\", \"green grey\"], [\"010fcc\", \"true blue\"], [\"ceaefa\", \"pale violet\"], [\"8f99fb\", \"periwinkle blue\"], [\"c6fcff\", \"light sky blue\"], [\"5539cc\", \"blurple\"], [\"544e03\", \"green brown\"], [\"017a79\", \"bluegreen\"], [\"01f9c6\", \"bright teal\"], [\"c9b003\", \"brownish yellow\"], [\"929901\", \"pea soup\"], [\"0b5509\", \"forest\"], [\"a00498\", \"barney purple\"], [\"2000b1\", \"ultramarine\"], [\"94568c\", \"purplish\"], [\"c2be0e\", \"puke yellow\"], [\"748b97\", \"bluish grey\"], [\"665fd1\", \"dark periwinkle\"], [\"9c6da5\", \"dark lilac\"], [\"c44240\", \"reddish\"], [\"a24857\", \"light maroon\"], [\"825f87\", \"dusty purple\"], [\"c9643b\", \"terra cotta\"], [\"90b134\", \"avocado\"], [\"01386a\", \"marine blue\"], [\"25a36f\", \"teal green\"], [\"59656d\", \"slate grey\"], [\"75fd63\", \"lighter green\"], [\"21fc0d\", \"electric green\"], [\"5a86ad\", \"dusty blue\"], [\"fec615\", \"golden yellow\"], [\"fffd01\", \"bright yellow\"], [\"dfc5fe\", \"light lavender\"], [\"b26400\", \"umber\"], [\"7f5e00\", \"poop\"], [\"de7e5d\", \"dark peach\"], [\"048243\", \"jungle green\"], [\"ffffd4\", \"eggshell\"], [\"3b638c\", \"denim\"], [\"b79400\", \"yellow brown\"], [\"84597e\", \"dull purple\"], [\"411900\", \"chocolate brown\"], [\"7b0323\", \"wine red\"], [\"04d9ff\", \"neon blue\"], [\"667e2c\", \"dirty green\"], [\"fbeeac\", \"light tan\"], [\"d7fffe\", \"ice blue\"], [\"4e7496\", \"cadet blue\"], [\"874c62\", \"dark mauve\"], [\"d5ffff\", \"very light blue\"], [\"826d8c\", \"grey purple\"], [\"ffbacd\", \"pastel pink\"], [\"d1ffbd\", \"very light green\"], [\"448ee4\", \"dark sky blue\"], [\"05472a\", \"evergreen\"], [\"d5869d\", \"dull pink\"], [\"3d0734\", \"aubergine\"], [\"4a0100\", \"mahogany\"], [\"f8481c\", \"reddish orange\"], [\"02590f\", \"deep green\"], [\"89a203\", \"vomit green\"], [\"e03fd8\", \"purple pink\"], [\"d58a94\", \"dusty pink\"], [\"7bb274\", \"faded green\"], [\"526525\", \"camo green\"], [\"c94cbe\", \"pinky purple\"], [\"db4bda\", \"pink purple\"], [\"9e3623\", \"brownish red\"], [\"b5485d\", \"dark rose\"], [\"735c12\", \"mud\"], [\"9c6d57\", \"brownish\"], [\"028f1e\", \"emerald green\"], [\"b1916e\", \"pale brown\"], [\"49759c\", \"dull blue\"], [\"a0450e\", \"burnt umber\"], [\"39ad48\", \"medium green\"], [\"b66a50\", \"clay\"], [\"8cffdb\", \"light aqua\"], [\"a4be5c\", \"light olive green\"], [\"cb7723\", \"brownish orange\"], [\"05696b\", \"dark aqua\"], [\"ce5dae\", \"purplish pink\"], [\"c85a53\", \"dark salmon\"], [\"96ae8d\", \"greenish grey\"], [\"1fa774\", \"jade\"], [\"7a9703\", \"ugly green\"], [\"ac9362\", \"dark beige\"], [\"01a049\", \"emerald\"], [\"d9544d\", \"pale red\"], [\"fa5ff7\", \"light magenta\"], [\"82cafc\", \"sky\"], [\"acfffc\", \"light cyan\"], [\"fcb001\", \"yellow orange\"], [\"910951\", \"reddish purple\"], [\"fe2c54\", \"reddish pink\"], [\"c875c4\", \"orchid\"], [\"cdc50a\", \"dirty yellow\"], [\"fd411e\", \"orange red\"], [\"9a0200\", \"deep red\"], [\"be6400\", \"orange brown\"], [\"030aa7\", \"cobalt blue\"], [\"fe019a\", \"neon pink\"], [\"f7879a\", \"rose pink\"], [\"887191\", \"greyish purple\"], [\"b00149\", \"raspberry\"], [\"12e193\", \"aqua green\"], [\"fe7b7c\", \"salmon pink\"], [\"ff9408\", \"tangerine\"], [\"6a6e09\", \"brownish green\"], [\"8b2e16\", \"red brown\"], [\"696112\", \"greenish brown\"], [\"e17701\", \"pumpkin\"], [\"0a481e\", \"pine green\"], [\"343837\", \"charcoal\"], [\"ffb7ce\", \"baby pink\"], [\"6a79f7\", \"cornflower\"], [\"5d06e9\", \"blue violet\"], [\"3d1c02\", \"chocolate\"], [\"82a67d\", \"greyish green\"], [\"be0119\", \"scarlet\"], [\"c9ff27\", \"green yellow\"], [\"373e02\", \"dark olive\"], [\"a9561e\", \"sienna\"], [\"caa0ff\", \"pastel purple\"], [\"ca6641\", \"terracotta\"], [\"02d8e9\", \"aqua blue\"], [\"88b378\", \"sage green\"], [\"980002\", \"blood red\"], [\"cb0162\", \"deep pink\"], [\"5cac2d\", \"grass\"], [\"769958\", \"moss\"], [\"a2bffe\", \"pastel blue\"], [\"10a674\", \"bluish green\"], [\"06b48b\", \"green blue\"], [\"af884a\", \"dark tan\"], [\"0b8b87\", \"greenish blue\"], [\"ffa756\", \"pale orange\"], [\"a2a415\", \"vomit\"], [\"154406\", \"forrest green\"], [\"856798\", \"dark lavender\"], [\"34013f\", \"dark violet\"], [\"632de9\", \"purple blue\"], [\"0a888a\", \"dark cyan\"], [\"6f7632\", \"olive drab\"], [\"d46a7e\", \"pinkish\"], [\"1e488f\", \"cobalt\"], [\"bc13fe\", \"neon purple\"], [\"7ef4cc\", \"light turquoise\"], [\"76cd26\", \"apple green\"], [\"74a662\", \"dull green\"], [\"80013f\", \"wine\"], [\"b1d1fc\", \"powder blue\"], [\"ffffe4\", \"off white\"], [\"0652ff\", \"electric blue\"], [\"045c5a\", \"dark turquoise\"], [\"5729ce\", \"blue purple\"], [\"069af3\", \"azure\"], [\"ff000d\", \"bright red\"], [\"f10c45\", \"pinkish red\"], [\"5170d7\", \"cornflower blue\"], [\"acbf69\", \"light olive\"], [\"6c3461\", \"grape\"], [\"5e819d\", \"greyish blue\"], [\"601ef9\", \"purplish blue\"], [\"b0dd16\", \"yellowish green\"], [\"cdfd02\", \"greenish yellow\"], [\"2c6fbb\", \"medium blue\"], [\"c0737a\", \"dusty rose\"], [\"d6b4fc\", \"light violet\"], [\"020035\", \"midnight blue\"], [\"703be7\", \"bluish purple\"], [\"fd3c06\", \"red orange\"], [\"960056\", \"dark magenta\"], [\"40a368\", \"greenish\"], [\"03719c\", \"ocean blue\"], [\"fc5a50\", \"coral\"], [\"ffffc2\", \"cream\"], [\"7f2b0a\", \"reddish brown\"], [\"b04e0f\", \"burnt sienna\"], [\"a03623\", \"brick\"], [\"87ae73\", \"sage\"], [\"789b73\", \"grey green\"], [\"ffffff\", \"white\"], [\"98eff9\", \"robin's egg blue\"], [\"658b38\", \"moss green\"], [\"5a7d9a\", \"steel blue\"], [\"380835\", \"eggplant\"], [\"fffe7a\", \"light yellow\"], [\"5ca904\", \"leaf green\"], [\"d8dcd6\", \"light grey\"], [\"a5a502\", \"puke\"], [\"d648d7\", \"pinkish purple\"], [\"047495\", \"sea blue\"], [\"b790d4\", \"pale purple\"], [\"5b7c99\", \"slate blue\"], [\"607c8e\", \"blue grey\"], [\"0b4008\", \"hunter green\"], [\"ed0dd9\", \"fuchsia\"], [\"8c000f\", \"crimson\"], [\"ffff84\", \"pale yellow\"], [\"bf9005\", \"ochre\"], [\"d2bd0a\", \"mustard yellow\"], [\"ff474c\", \"light red\"], [\"0485d1\", \"cerulean\"], [\"ffcfdc\", \"pale pink\"], [\"040273\", \"deep blue\"], [\"a83c09\", \"rust\"], [\"90e4c1\", \"light teal\"], [\"516572\", \"slate\"], [\"fac205\", \"goldenrod\"], [\"d5b60a\", \"dark yellow\"], [\"363737\", \"dark grey\"], [\"4b5d16\", \"army green\"], [\"6b8ba4\", \"grey blue\"], [\"80f9ad\", \"seafoam\"], [\"a57e52\", \"puce\"], [\"a9f971\", \"spring green\"], [\"c65102\", \"dark orange\"], [\"e2ca76\", \"sand\"], [\"b0ff9d\", \"pastel green\"], [\"9ffeb0\", \"mint\"], [\"fdaa48\", \"light orange\"], [\"fe01b1\", \"bright pink\"], [\"c1f80a\", \"chartreuse\"], [\"36013f\", \"deep purple\"], [\"341c02\", \"dark brown\"], [\"b9a281\", \"taupe\"], [\"8eab12\", \"pea green\"], [\"9aae07\", \"puke green\"], [\"02ab2e\", \"kelly green\"], [\"7af9ab\", \"seafoam green\"], [\"137e6d\", \"blue green\"], [\"aaa662\", \"khaki\"], [\"610023\", \"burgundy\"], [\"014d4e\", \"dark teal\"], [\"8f1402\", \"brick red\"], [\"4b006e\", \"royal purple\"], [\"580f41\", \"plum\"], [\"8fff9f\", \"mint green\"], [\"dbb40c\", \"gold\"], [\"a2cffe\", \"baby blue\"], [\"c0fb2d\", \"yellow green\"], [\"be03fd\", \"bright purple\"], [\"840000\", \"dark red\"], [\"d0fefe\", \"pale blue\"], [\"3f9b0b\", \"grass green\"], [\"01153e\", \"navy\"], [\"04d8b2\", \"aquamarine\"], [\"c04e01\", \"burnt orange\"], [\"0cff0c\", \"neon green\"], [\"0165fc\", \"bright blue\"], [\"cf6275\", \"rose\"], [\"ffd1df\", \"light pink\"], [\"ceb301\", \"mustard\"], [\"380282\", \"indigo\"], [\"aaff32\", \"lime\"], [\"53fca1\", \"sea green\"], [\"8e82fe\", \"periwinkle\"], [\"cb416b\", \"dark pink\"], [\"677a04\", \"olive green\"], [\"ffb07c\", \"peach\"], [\"c7fdb5\", \"pale green\"], [\"ad8150\", \"light brown\"], [\"ff028d\", \"hot pink\"], [\"000000\", \"black\"], [\"cea2fd\", \"lilac\"], [\"001146\", \"navy blue\"], [\"0504aa\", \"royal blue\"], [\"e6daa6\", \"beige\"], [\"ff796c\", \"salmon\"], [\"6e750e\", \"olive\"], [\"650021\", \"maroon\"], [\"01ff07\", \"bright green\"], [\"35063e\", \"dark purple\"], [\"ae7181\", \"mauve\"], [\"06470c\", \"forest green\"], [\"13eac9\", \"aqua\"], [\"00ffff\", \"cyan\"], [\"d1b26f\", \"tan\"], [\"00035b\", \"dark blue\"], [\"c79fef\", \"lavender\"], [\"06c2ac\", \"turquoise\"], [\"033500\", \"dark green\"], [\"9a0eea\", \"violet\"], [\"bf77f6\", \"light purple\"], [\"89fe05\", \"lime green\"], [\"929591\", \"grey\"], [\"75bbfd\", \"sky blue\"], [\"ffff14\", \"yellow\"], [\"c20078\", \"magenta\"], [\"96f97b\", \"light green\"], [\"f97306\", \"orange\"], [\"029386\", \"teal\"], [\"95d0fc\", \"light blue\"], [\"e50000\", \"red\"], [\"653700\", \"brown\"], [\"ff81c0\", \"pink\"], [\"0343df\", \"blue\"], [\"15b01a\", \"green\"], [\"7e1e9c\", \"purple\"], [\"FF5E99\", \"paul irish pink\"], [\"00000000\", \"transparent\"]];\n names.each(function(element) {\n return lookup[normalizeKey(element[1])] = parseHex(element[0]);\n });\n Color.random = function() {\n return Color(rand(256), rand(256), rand(256));\n };\n Color.mix = function(color1, color2, amount) {\n var new_colors;\n amount || (amount = 0.5);\n new_colors = [color1.r, color1.g, color1.b, color1.a].zip([color2.r, color2.g, color2.b, color2.a]).map(function(array) {\n return (array[0] * amount) + (array[1] * (1 - amount));\n });\n return Color(new_colors);\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Color\"] = Color;\n})();;\n/**\nThe Drawable module is used to provide a simple draw method to the including\nobject.\n\nBinds a default draw listener to draw a rectangle or a sprite, if one exists.\n\nBinds a step listener to update the transform of the object.\n\nAutoloads the sprite specified in I.spriteName, if any.\n\n<code><pre>\nplayer = Core\n x: 15\n y: 30\n width: 5\n height: 5\n sprite: \"my_cool_sprite\"\n\nengine.bind 'draw', (canvas) ->\n player.draw(canvas) \n# => Uncaught TypeError: Object has no method 'draw'\n\nplayer.include(Drawable)\n\nengine.bind 'draw', (canvas) ->\n player.draw(canvas)\n# => if you have a sprite named \"my_cool_sprite\" in your images folder\n# then it will be drawn. Otherwise, a rectangle positioned at x: 15 and\n# y: 30 with width and height 5 will be drawn.\n</pre></code>\n\n@name Drawable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/\n/**\nTriggered every time the object should be drawn. A canvas is passed as\nthe first argument. \n\n<code><pre>\nplayer = Core\n x: 0\n y: 10\n width: 5\n height: 5\n\nplayer.bind \"draw\", (canvas) ->\n canvas.fillColor(\"white\")\n\n # Text will be drawn positioned relatively to the object.\n canvas.fillText(\"Hey, drawing stuff is pretty easy.\", 5, 5)\n</pre></code>\n\n@name draw\n@methodOf Drawable#\n@event\n@param {PowerCanvas} canvas A reference to the canvas to draw on.\n*/var Drawable;\nDrawable = function(I, self) {\n var _ref;\n I || (I = {});\n Object.reverseMerge(I, {\n color: \"#196\",\n hflip: false,\n vflip: false,\n spriteName: null,\n zIndex: 0\n });\n if ((_ref = I.sprite) != null ? typeof _ref.isString === \"function\" ? _ref.isString() : void 0 : void 0) {\n I.sprite = Sprite.loadByName(I.sprite, function(sprite) {\n I.width = sprite.width;\n return I.height = sprite.height;\n });\n } else if (I.spriteName) {\n I.sprite = Sprite.loadByName(I.spriteName, function(sprite) {\n I.width = sprite.width;\n return I.height = sprite.height;\n });\n }\n self.bind('draw', function(canvas) {\n if (I.sprite) {\n if (I.sprite.draw != null) {\n return I.sprite.draw(canvas, 0, 0);\n } else {\n return typeof warn === \"function\" ? warn(\"Sprite has no draw method!\") : void 0;\n }\n } else {\n canvas.fillColor(I.color);\n return canvas.fillRect(0, 0, I.width, I.height);\n }\n });\n return {\n /**\n Draw does not actually do any drawing itself, instead it triggers all of the draw events.\n Listeners on the events do the actual drawing.\n\n @name draw\n @methodOf Drawable#\n @returns self\n */\n draw: function(canvas) {\n self.trigger('beforeTransform', canvas);\n canvas.withTransform(self.transform(), function(canvas) {\n return self.trigger('draw', canvas);\n });\n self.trigger('afterTransform', canvas);\n return self;\n },\n /**\n Returns the current transform, with translation, rotation, and flipping applied.\n\n @name transform\n @methodOf Drawable#\n @returns {Matrix} The current transform\n */\n transform: function() {\n var center, transform;\n center = self.center();\n transform = Matrix.translation(center.x, center.y);\n if (I.rotation) {\n transform = transform.concat(Matrix.rotation(I.rotation));\n }\n if (I.hflip) {\n transform = transform.concat(Matrix.HORIZONTAL_FLIP);\n }\n if (I.vflip) {\n transform = transform.concat(Matrix.VERTICAL_FLIP);\n }\n transform = transform.concat(Matrix.translation(-I.width / 2, -I.height / 2));\n if (I.spriteOffset) {\n transform = transform.concat(Matrix.translation(I.spriteOffset.x, I.spriteOffset.y));\n }\n return transform;\n }\n };\n};;\n/**\nThe Durable module deactives a <code>GameObject</code> after a specified duration.\nIf a duration is specified the object will update that many times. If -1 is\nspecified the object will have an unlimited duration.\n\n<code><pre>\nenemy = GameObject\n x: 50\n y: 30\n duration: 5\n\nenemy.include(Durable)\n\nenemy.I.active\n# => true\n\n5.times ->\n enemy.update()\n\nenemy.I.active\n# => false\n</pre></code>\n\n@name Durable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Durable;\nDurable = function(I) {\n Object.reverseMerge(I, {\n duration: -1\n });\n return {\n before: {\n update: function() {\n if (I.duration !== -1 && I.age >= I.duration) {\n return I.active = false;\n }\n }\n }\n };\n};;\nvar Emitter;\nEmitter = function(I) {\n var self;\n self = GameObject(I);\n return self.include(Emitterable);\n};;\nvar Emitterable;\nEmitterable = function(I, self) {\n var n, particles;\n I || (I = {});\n Object.reverseMerge(I, {\n batchSize: 1,\n emissionRate: 1,\n color: \"blue\",\n width: 0,\n height: 0,\n generator: {},\n particleCount: Infinity,\n particleData: {\n acceleration: Point(0, 0.1),\n age: 0,\n color: \"blue\",\n duration: 30,\n includedModules: [\"Movable\"],\n height: 2,\n maxSpeed: 2,\n offset: Point(0, 0),\n sprite: false,\n spriteName: false,\n velocity: Point(-0.25, 1),\n width: 2\n }\n });\n particles = [];\n n = 0;\n return {\n before: {\n draw: function(canvas) {\n return particles.invoke(\"draw\", canvas);\n },\n update: function() {\n I.batchSize.times(function() {\n var center, key, particleProperties, value, _ref;\n if (n < I.particleCount && rand() < I.emissionRate) {\n center = self.center();\n particleProperties = Object.reverseMerge({\n x: center.x,\n y: center.y\n }, I.particleData);\n _ref = I.generator;\n for (key in _ref) {\n value = _ref[key];\n if (I.generator[key].call) {\n particleProperties[key] = I.generator[key](n, I);\n } else {\n particleProperties[key] = I.generator[key];\n }\n }\n particleProperties.x += particleProperties.offset.x;\n particleProperties.y += particleProperties.offset.y;\n particles.push(GameObject(particleProperties));\n return n += 1;\n }\n });\n particles = particles.select(function(particle) {\n return particle.update();\n });\n if (n === I.particleCount && !particles.length) {\n return I.active = false;\n }\n }\n }\n };\n};;\n(function() {\n var Engine, defaults;\n defaults = {\n FPS: 30,\n age: 0,\n ambientLight: 1,\n backgroundColor: \"#00010D\",\n cameraTransform: Matrix.IDENTITY,\n clear: false,\n excludedModules: [],\n includedModules: [],\n paused: false,\n showFPS: false,\n zSort: false\n };\n /**\n The Engine controls the game world and manages game state. Once you \n set it up and let it run it pretty much takes care of itself.\n\n You can use the engine to add or remove objects from the game world.\n\n There are several modules that can include to add additional capabilities \n to the engine.\n\n The engine fires events that you may bind listeners to. Event listeners \n may be bound with <code>engine.bind(eventName, callback)</code>\n\n @name Engine\n @constructor\n @param {Object} I Instance variables of the engine \n */\n /**\n Observe or modify the \n entity data before it is added to the engine.\n @name beforeAdd\n @methodOf Engine#\n @event\n @param {Object} entityData\n */\n /**\n Observe or configure a <code>gameObject</code> that has been added \n to the engine.\n @name afterAdd\n @methodOf Engine#\n @event\n @param {GameObject} object The object that has just been added to the\n engine.\n */\n /**\n Called when the engine updates all the game objects.\n\n @name update\n @methodOf Engine#\n @event\n */\n /**\n Called after the engine completes an update. Here it is \n safe to modify the game objects array.\n\n @name afterUpdate\n @methodOf Engine#\n @event\n */\n /**\n Called before the engine draws the game objects on the canvas. The current camera transform is applied.\n\n @name beforeDraw\n @methodOf Engine#\n @event\n @params {PowerCanvas} canvas A reference to the canvas to draw on.\n */\n /**\n Called after the engine draws on the canvas. The current camera transform is applied.\n\n <code><pre>\n engine.bind \"draw\", (canvas) ->\n # print some directions for the player\n canvas.fillText(\"Go this way =>\", 200, 200) \n </pre></code>\n\n @name draw\n @methodOf Engine#\n @event\n @params {PowerCanvas} canvas A reference to the canvas to draw on.\n */\n /**\n Called after the engine draws.\n\n The current camera transform is not applied. This is great for\n adding overlays.\n\n <code><pre>\n engine.bind \"overlay\", (canvas) ->\n # print the player's health. This will be\n # positioned absolutely according to the viewport.\n canvas.fillText(\"HEALTH:\", 20, 20)\n canvas.fillText(player.health(), 50, 20)\n </pre></code>\n\n @name overlay\n @methodOf Engine#\n @event\n @params {PowerCanvas} canvas A reference to the canvas to draw on. \n */\n Engine = function(I) {\n var animLoop, defaultModules, draw, frameAdvance, lastStepTime, modules, queuedObjects, running, self, startTime, step, update;\n I || (I = {});\n Object.reverseMerge(I, {\n objects: []\n }, defaults);\n frameAdvance = false;\n queuedObjects = [];\n running = false;\n startTime = +new Date();\n lastStepTime = -Infinity;\n animLoop = function(timestamp) {\n var delta, msPerFrame, remainder;\n timestamp || (timestamp = +new Date());\n msPerFrame = 1000 / I.FPS;\n delta = timestamp - lastStepTime;\n remainder = delta - msPerFrame;\n if (remainder > 0) {\n lastStepTime = timestamp - Math.min(remainder, msPerFrame);\n step();\n }\n if (running) {\n return window.requestAnimationFrame(animLoop);\n }\n };\n update = function() {\n var toRemove, _ref;\n if (typeof updateKeys === \"function\") {\n updateKeys();\n }\n self.trigger(\"update\");\n _ref = I.objects.partition(function(object) {\n return object.update();\n }), I.objects = _ref[0], toRemove = _ref[1];\n toRemove.invoke(\"trigger\", \"remove\");\n I.objects = I.objects.concat(queuedObjects);\n queuedObjects = [];\n return self.trigger(\"afterUpdate\");\n };\n draw = function() {\n if (I.clear) {\n I.canvas.clear();\n } else if (I.backgroundColor) {\n I.canvas.fill(I.backgroundColor);\n }\n I.canvas.withTransform(I.cameraTransform, function(canvas) {\n var drawObjects;\n self.trigger(\"beforeDraw\", canvas);\n if (I.zSort) {\n drawObjects = I.objects.copy().sort(function(a, b) {\n return a.I.zIndex - b.I.zIndex;\n });\n } else {\n drawObjects = I.objects;\n }\n drawObjects.invoke(\"draw\", canvas);\n return self.trigger(\"draw\", I.canvas);\n });\n return self.trigger(\"overlay\", I.canvas);\n };\n step = function() {\n if (!I.paused || frameAdvance) {\n update();\n I.age += 1;\n }\n return draw();\n };\n self = Core(I).extend({\n /**\n The add method creates and adds an object to the game world. Two\n other events are triggered around this one: beforeAdd and afterAdd.\n\n <code><pre>\n # you can add arbitrary entityData and\n # the engine will make it into a GameObject\n engine.add \n x: 50\n y: 30\n color: \"red\"\n\n player = engine.add\n class: \"Player\"\n </pre></code>\n\n @name add\n @methodOf Engine#\n @param {Object} entityData The data used to create the game object.\n @returns {GameObject}\n */\n add: function(entityData) {\n var obj;\n self.trigger(\"beforeAdd\", entityData);\n obj = GameObject.construct(entityData);\n self.trigger(\"afterAdd\", obj);\n if (running && !I.paused) {\n queuedObjects.push(obj);\n } else {\n I.objects.push(obj);\n }\n return obj;\n },\n objectAt: function(x, y) {\n var bounds, targetObject;\n targetObject = null;\n bounds = {\n x: x,\n y: y,\n width: 1,\n height: 1\n };\n self.eachObject(function(object) {\n if (object.collides(bounds)) {\n return targetObject = object;\n }\n });\n return targetObject;\n },\n eachObject: function(iterator) {\n return I.objects.each(iterator);\n },\n /**\n Start the game simulation.\n\n <code><pre>\n engine.start()\n </pre></code>\n\n @methodOf Engine#\n @name start\n */\n start: function() {\n if (!running) {\n running = true;\n return window.requestAnimationFrame(animLoop);\n }\n },\n /**\n Stop the simulation.\n\n <code><pre>\n engine.stop()\n </pre></code>\n\n @methodOf Engine#\n @name stop\n */\n stop: function() {\n return running = false;\n },\n /**\n Pause the game and step through 1 update of the engine.\n\n <code><pre>\n engine.frameAdvance()\n </pre></code>\n\n @methodOf Engine#\n @name frameAdvance\n */\n frameAdvance: function() {\n I.paused = true;\n frameAdvance = true;\n step();\n return frameAdvance = false;\n },\n /**\n Resume the game.\n\n <code><pre>\n engine.play()\n </pre></code>\n\n @methodOf Engine#\n @name play\n */\n play: function() {\n return I.paused = false;\n },\n /**\n Pause the simulation.\n\n <code><pre>\n engine.pause()\n </pre></code>\n\n @methodOf Engine#\n @name pause\n */\n pause: function() {\n return I.paused = true;\n },\n /**\n Query the engine to see if it is paused.\n\n <code><pre>\n engine.pause()\n\n engine.paused()\n => true\n\n engine.play()\n\n engine.paused()\n => false\n </pre></code>\n\n @methodOf Engine#\n @name paused\n */\n paused: function() {\n return I.paused;\n },\n /**\n Change the framerate of the game. The default framerate is 30 fps.\n\n <code><pre>\n engine.setFramerate(60)\n </pre></code>\n\n @methodOf Engine#\n @name setFramerate\n */\n setFramerate: function(newFPS) {\n I.FPS = newFPS;\n self.stop();\n return self.start();\n },\n update: update,\n draw: draw\n });\n self.attrAccessor(\"ambientLight\", \"backgroundColor\", \"cameraTransform\", \"clear\");\n self.include(Bindable);\n defaultModules = [\"SaveState\", \"Selector\", \"Collision\"];\n modules = defaultModules.concat(I.includedModules);\n modules = modules.without([].concat(I.excludedModules));\n modules.each(function(moduleName) {\n if (!Engine[moduleName]) {\n throw \"#Engine.\" + moduleName + \" is not a valid engine module\";\n }\n return self.include(Engine[moduleName]);\n });\n self.trigger(\"init\");\n return self;\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Engine\"] = Engine;\n})();;\n/**\nThe <code>Collision</code> module provides some simple collision detection methods to engine.\n\n@name Collision\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Collision = function(I, self) {\n return {\n /**\n Detects collisions between a bounds and the game objects.\n\n @name collides\n @methodOf Engine#\n @param bounds The bounds to check collisions with.\n @param [sourceObject] An object to exclude from the results.\n @returns {Boolean} true if the bounds object collides with any of the game objects, false otherwise.\n */\n collides: function(bounds, sourceObject) {\n return I.objects.inject(false, function(collided, object) {\n return collided || (object.solid() && (object !== sourceObject) && object.collides(bounds));\n });\n },\n /**\n Detects collisions between a bounds and the game objects. \n Returns an array of objects colliding with the bounds provided.\n\n @name collidesWith\n @methodOf Engine#\n @param bounds The bounds to check collisions with.\n @param [sourceObject] An object to exclude from the results.\n @returns {Array} An array of objects that collide with the given bounds.\n */\n collidesWith: function(bounds, sourceObject) {\n var collided;\n collided = [];\n I.objects.each(function(object) {\n if (!object.solid()) {\n return;\n }\n if (object !== sourceObject && object.collides(bounds)) {\n return collided.push(object);\n }\n });\n if (collided.length) {\n return collided;\n }\n },\n /**\n Detects collisions between a ray and the game objects.\n\n @name rayCollides\n @methodOf Engine#\n @param source The origin point\n @param direction A point representing the direction of the ray\n @param [sourceObject] An object to exclude from the results.\n */\n rayCollides: function(source, direction, sourceObject) {\n var hits, nearestDistance, nearestHit;\n hits = I.objects.map(function(object) {\n var hit;\n hit = object.solid() && (object !== sourceObject) && Collision.rayRectangle(source, direction, object.centeredBounds());\n if (hit) {\n hit.object = object;\n }\n return hit;\n });\n nearestDistance = Infinity;\n nearestHit = null;\n hits.each(function(hit) {\n var d;\n if (hit && (d = hit.distance(source)) < nearestDistance) {\n nearestDistance = d;\n return nearestHit = hit;\n }\n });\n return nearestHit;\n }\n };\n};;\n/**\nThe <code>SaveState</code> module provides methods to save and restore the current engine state.\n\n@name SaveState\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.SaveState = function(I, self) {\n var savedState;\n savedState = null;\n return {\n rewind: function() {},\n /**\n Save the current game state and returns a JSON object representing that state.\n\n <code><pre>\n engine.bind 'step', ->\n if justPressed.s\n engine.saveState()\n </pre></code>\n\n @name saveState\n @methodOf Engine#\n @returns {Array} An array of the instance data of all objects in the game\n */\n saveState: function() {\n return savedState = I.objects.map(function(object) {\n return Object.extend({}, object.I);\n });\n },\n /**\n Loads the game state passed in, or the last saved state, if any.\n\n <code><pre>\n engine.bind 'step', ->\n if justPressed.l\n # loads the last saved state\n engine.loadState()\n\n if justPressed.o\n # removes all game objects, then reinstantiates \n # them with the entityData passed in\n engine.loadState([{x: 40, y: 50, class: \"Player\"}, {x: 0, y: 0, class: \"Enemy\"}, {x: 500, y: 400, class: \"Boss\"}])\n </pre></code>\n\n @name loadState\n @methodOf Engine#\n @param [newState] The game state to load.\n */\n loadState: function(newState) {\n if (newState || (newState = savedState)) {\n I.objects.invoke(\"trigger\", \"remove\");\n I.objects = [];\n return newState.each(function(objectData) {\n return self.add(Object.extend({}, objectData));\n });\n }\n },\n /**\n Reloads the current engine state, useful for hotswapping code.\n\n <code><pre>\n engine.I.objects.each (object) ->\n # bring all objects to (0, 0) for some reason\n object.I.x = 0\n object.I.y = 0\n\n # reload all objects to make sure\n # they are at (0, 0) \n engine.reload()\n </pre></code>\n\n @name reload\n @methodOf Engine#\n */\n reload: function() {\n var oldObjects;\n oldObjects = I.objects;\n I.objects = [];\n return oldObjects.each(function(object) {\n object.trigger(\"remove\");\n return self.add(object.I);\n });\n }\n };\n};;\n/**\nThe <code>Selector</code> module provides methods to query the engine to find game objects.\n\n@name Selector\n@fieldOf Engine\n@module\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Selector = function(I, self) {\n var instanceMethods;\n instanceMethods = {\n set: function(attr, value) {\n return this.each(function(item) {\n return item.I[attr] = value;\n });\n }\n };\n return {\n /**\n Get a selection of GameObjects that match the specified selector criteria. The selector language\n can select objects by id, class, or attributes. Note that this method always returns an Array,\n so if you are trying to find only one object you will need something like <code>engine.find(\"Enemy\").first()</code>.\n\n <code><pre>\n player = engine.add\n class: \"Player\"\n\n enemy = engine.add\n class: \"Enemy\"\n speed: 5\n x: 0\n\n distantEnemy = engine.add\n class \"Enemy\"\n x: 500\n\n boss = engine.add\n class: \"Enemy\"\n id: \"Boss\"\n x: 0\n\n # to select an object by id use \"#anId\"\n engine.find \"#Boss\"\n # => [boss]\n\n # to select an object by class use \"MyClass\"\n engine.find \"Enemy\"\n # => [enemy, distantEnemy, boss]\n\n # to select an object by properties use \".someProperty\" or \".someProperty=someValue\"\n engine.find \".speed=5\"\n # => [enemy]\n\n # You may mix and match selectors.\n engine.find \"Enemy.x=0\"\n # => [enemy, boss] # doesn't return distantEnemy\n </pre></code>\n\n @name find\n @methodOf Engine#\n @param {String} selector\n @returns {Array} An array of the objects found\n */\n find: function(selector) {\n var matcher, results;\n results = [];\n matcher = Engine.Selector.generate(selector);\n I.objects.each(function(object) {\n if (matcher.match(object)) {\n return results.push(object);\n }\n });\n return Object.extend(results, instanceMethods);\n }\n };\n};\nObject.extend(Engine.Selector, {\n parse: function(selector) {\n return selector.split(\",\").invoke(\"trim\");\n },\n process: function(item) {\n var result;\n result = /^(\\w+)?#?([\\w\\-]+)?\\.?([\\w\\-]+)?=?([\\w\\-]+)?/.exec(item);\n if (result) {\n if (result[4]) {\n result[4] = result[4].parse();\n }\n return result.splice(1);\n } else {\n return [];\n }\n },\n generate: function(selector) {\n var ATTR, ATTR_VALUE, ID, TYPE, components;\n components = Engine.Selector.parse(selector).map(function(piece) {\n return Engine.Selector.process(piece);\n });\n TYPE = 0;\n ID = 1;\n ATTR = 2;\n ATTR_VALUE = 3;\n return {\n match: function(object) {\n var attr, attrMatch, component, idMatch, typeMatch, value, _i, _len;\n for (_i = 0, _len = components.length; _i < _len; _i++) {\n component = components[_i];\n idMatch = (component[ID] === object.I.id) || !component[ID];\n typeMatch = (component[TYPE] === object.I[\"class\"]) || !component[TYPE];\n if (attr = component[ATTR]) {\n if ((value = component[ATTR_VALUE]) != null) {\n attrMatch = object.I[attr] === value;\n } else {\n attrMatch = object.I[attr];\n }\n } else {\n attrMatch = true;\n }\n if (idMatch && typeMatch && attrMatch) {\n return true;\n }\n }\n return false;\n }\n };\n }\n});;\n/**\nThe default base class for all objects you can add to the engine.\n\nGameObjects fire events that you may bind listeners to. Event listeners \nmay be bound with <code>object.bind(eventName, callback)</code>\n\n@name GameObject\n@extends Core\n@constructor\n@instanceVariables age, active, created, destroyed, solid, includedModules, excludedModules\n*/\n/**\nTriggered when the object is created.\n\n<code><pre>\nenemyCount = 0\n\nenemy = engine.add\n class: \"Enemy\"\n\nenemy.bind 'create', ->\n enemyCount++\n</pre></code>\n\n@name create\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered when object is destroyed. Use \nthe destroy event to add particle effects, play sounds, etc.\n\n<code><pre>\nbomb = GameObject()\n\nbomb.bind 'destroy', ->\n bomb.explode()\n Sound.play \"Kaboom\"\n</pre></code>\n\n@name destroy\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered during every update step.\n\n<code><pre>\nplayer = GameObject()\n\nplayer.bind 'step', ->\n # check to see if keys are being pressed and \n # change the player's velocity\n if keydown.left\n player.velocity(Point(-1, 0))\n else if keydown.right\n player.velocity(Point(1, 0))\n else\n player.velocity(Point(0, 0))\n</pre></code>\n\n@name step\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered every update after the <code>step</code> event is triggered.\n\n<code><pre>\nplayer = GameObject()\n\n# we can really use the update and \n# step events almost interchangebly\nplayer.bind 'update', ->\n # check to see if keys are being pressed and \n # change the player's velocity\n if keydown.left\n player.velocity(Point(-1, 0))\n else if keydown.right\n player.velocity(Point(1, 0))\n else\n player.velocity(Point(0, 0))\n</pre></code>\n\n@name update\n@methodOf GameObject#\n@event\n*/\n/**\nTriggered when the object is removed from\nthe engine. Use the remove event to handle any clean up.\n\n<code><pre>\nboss = GameObject()\n\nboss.bind 'remove', ->\n unlockDoorToLevel2()\n</pre></code>\n\n@name remove\n@methodOf GameObject#\n@event\n*/var GameObject;\nGameObject = function(I) {\n var autobindEvents, defaultModules, modules, self;\n I || (I = {});\n /**\n @name {Object} I Instance variables \n @memberOf GameObject#\n */\n Object.reverseMerge(I, {\n age: 0,\n active: true,\n created: false,\n destroyed: false,\n solid: false,\n includedModules: [],\n excludedModules: []\n });\n self = Core(I).extend({\n /**\n Update the game object. This is generally called by the engine.\n\n @name update\n @methodOf GameObject#\n */\n update: function() {\n if (I.active) {\n self.trigger('step');\n self.trigger('update');\n I.age += 1;\n }\n return I.active;\n },\n /**\n Destroys the object and triggers the destroyed event.\n\n @name destroy\n @methodOf GameObject#\n */\n destroy: function() {\n if (!I.destroyed) {\n self.trigger('destroy');\n }\n I.destroyed = true;\n return I.active = false;\n }\n });\n defaultModules = [Bindable, Bounded, Drawable, Durable];\n modules = defaultModules.concat(I.includedModules.invoke('constantize'));\n modules = modules.without(I.excludedModules.invoke('constantize'));\n modules.each(function(Module) {\n return self.include(Module);\n });\n self.attrAccessor(\"solid\");\n autobindEvents = ['create', 'destroy', 'step'];\n autobindEvents.each(function(eventName) {\n var event;\n if (event = I[eventName]) {\n if (typeof event === \"function\") {\n return self.bind(eventName, event);\n } else {\n return self.bind(eventName, eval(\"(function() {\" + event + \"})\"));\n }\n }\n });\n if (!I.created) {\n self.trigger('create');\n }\n I.created = true;\n return self;\n};\n/**\nConstruct an object instance from the given entity data.\n@name construct\n@memberOf GameObject\n@param {Object} entityData\n*/\nGameObject.construct = function(entityData) {\n if (entityData[\"class\"]) {\n return entityData[\"class\"].constantize()(entityData);\n } else {\n return GameObject(entityData);\n }\n};;\n/**\nThe Movable module automatically updates the position and velocity of\nGameObjects based on the velocity and acceleration. It does not check\ncollisions so is probably best suited to particle effect like things.\n\n<code><pre>\nplayer = GameObject\n x: 0\n y: 0\n velocity: Point(0, 0)\n acceleration: Point(1, 0)\n maxSpeed: 2\n\nplayer.include(Movable)\n\n# => `velocity is {x: 0, y: 0} and position is {x: 0, y: 0}`\n\nplayer.update()\n# => `velocity is {x: 1, y: 0} and position is {x: 1, y: 0}` \n\nplayer.update()\n# => `velocity is {x: 2, y: 0} and position is {x: 3, y: 0}` \n\n# we've hit our maxSpeed so our velocity won't increase\nplayer.update()\n# => `velocity is {x: 2, y: 0} and position is {x: 5, y: 0}`\n</pre></code>\n\n@name Movable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Movable;\nMovable = function(I) {\n Object.reverseMerge(I, {\n acceleration: Point(0, 0),\n velocity: Point(0, 0)\n });\n I.acceleration = Point(I.acceleration.x, I.acceleration.y);\n I.velocity = Point(I.velocity.x, I.velocity.y);\n return {\n before: {\n update: function() {\n var currentSpeed;\n I.velocity = I.velocity.add(I.acceleration);\n if (I.maxSpeed != null) {\n currentSpeed = I.velocity.magnitude();\n if (currentSpeed > I.maxSpeed) {\n I.velocity = I.velocity.scale(I.maxSpeed / currentSpeed);\n }\n }\n I.x += I.velocity.x;\n return I.y += I.velocity.y;\n }\n }\n };\n};;\n/**\n@name ResourceLoader\n@namespace\n\nHelps access the assets in your game.\n*/(function() {\n var ResourceLoader, typeTable;\n typeTable = {\n images: \"png\"\n };\n ResourceLoader = {\n /**\n Return the url for a particular asset.\n\n <code><pre>\n ResourceLoader.urlFor(\"images\", \"player\")\n # => This returns the url for the file \"player.png\" in your images directory.\n </pre></code>\n\n @name urlFor\n @methodOf ResourceLoader#\n @param {String} directory The directory your file is in.\n @param {String} name The name of the file.\n @returns {String} The full url of your asset\n\n */\n urlFor: function(directory, name) {\n var type, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref[directory] : void 0 : void 0) || directory;\n type = typeTable[directory];\n return \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".\" + type + \"?\" + MTIME;\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"ResourceLoader\"] = ResourceLoader;\n})();;\n/**\nThe Rotatable module rotates the object\nbased on its rotational velocity.\n\n<code><pre>\nplayer = GameObject\n x: 0\n y: 0\n rotationalVelocity: Math.PI / 64\n\nplayer.include(Rotatable)\n\nplayer.I.rotation\n# => 0\n\nplayer.update()\n\nplayer.I.rotation\n# => 0.04908738521234052 # Math.PI / 64\n\nplayer.update()\n\nplayer.I.rotation\n# => 0.09817477042468103 # 2 * (Math.PI / 64)\n</pre></code>\n\n@name Rotatable\n@module\n@constructor\n@param {Object} I Instance variables\n@param {Core} self Reference to including object\n*/var Rotatable;\nRotatable = function(I) {\n I || (I = {});\n Object.reverseMerge(I, {\n rotation: 0,\n rotationalVelocity: 0\n });\n return {\n before: {\n update: function() {\n return I.rotation += I.rotationalVelocity;\n }\n }\n };\n};;\n/**\nThe Sprite class provides a way to load images for use in games.\n\nBy default, images are loaded asynchronously. A proxy object is \nreturned immediately. Even though it has a draw method it will not\ndraw anything to the screen until the image has been loaded.\n\n@name Sprite\n@constructor\n*/(function() {\n var LoaderProxy, Sprite;\n LoaderProxy = function() {\n return {\n draw: function() {},\n fill: function() {},\n frame: function() {},\n update: function() {},\n width: null,\n height: null\n };\n };\n Sprite = function(image, sourceX, sourceY, width, height) {\n sourceX || (sourceX = 0);\n sourceY || (sourceY = 0);\n width || (width = image.width);\n height || (height = image.height);\n return {\n /**\n Draw this sprite on the given canvas at the given position.\n\n @name draw\n @methodOf Sprite#\n @param {PowerCanvas} canvas Reference to the canvas to draw the sprite on\n @param {Number} x Position on the x axis to draw the sprite\n @param {Number} y Position on the y axis to draw the sprite\n */\n draw: function(canvas, x, y) {\n return canvas.drawImage(image, sourceX, sourceY, width, height, x, y, width, height);\n },\n fill: function(canvas, x, y, width, height, repeat) {\n var pattern;\n if (repeat == null) {\n repeat = \"repeat\";\n }\n pattern = canvas.createPattern(image, repeat);\n canvas.fillColor(pattern);\n return canvas.fillRect(x, y, width, height);\n },\n width: width,\n height: height\n };\n };\n /**\n Loads all sprites from a sprite sheet found in\n your images directory, specified by the name passed in.\n\n @name loadSheet\n @methodOf Sprite\n @param {String} name Name of the spriteSheet image in your images directory\n @param {Number} tileWidth Width of each sprite in the sheet\n @param {Number} tileHeight Height of each sprite in the sheet\n @returns {Array} An array of sprite objects\n */\n Sprite.loadSheet = function(name, tileWidth, tileHeight) {\n var image, sprites, url;\n url = ResourceLoader.urlFor(\"images\", name);\n sprites = [];\n image = new Image();\n image.onload = function() {\n var imgElement;\n imgElement = this;\n return (image.height / tileHeight).times(function(row) {\n return (image.width / tileWidth).times(function(col) {\n return sprites.push(Sprite(imgElement, col * tileWidth, row * tileHeight, tileWidth, tileHeight));\n });\n });\n };\n image.src = url;\n return sprites;\n };\n /**\n Loads a sprite from a given url.\n\n @name load\n @methodOf Sprite\n @param {String} url\n @param {Function} [loadedCallback]\n @returns {Sprite} A sprite object\n */\n Sprite.load = function(url, loadedCallback) {\n var img, proxy;\n img = new Image();\n proxy = LoaderProxy();\n img.onload = function() {\n var tile;\n tile = Sprite(this);\n Object.extend(proxy, tile);\n if (loadedCallback) {\n return loadedCallback(proxy);\n }\n };\n img.src = url;\n return proxy;\n };\n /**\n Loads a sprite with the given pixie id.\n\n @name fromPixieId\n @methodOf Sprite\n @param {Number} id Pixie Id of the sprite to load\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.fromPixieId = function(id, callback) {\n return Sprite.load(\"http://pixieengine.com/s3/sprites/\" + id + \"/original.png\", callback);\n };\n /**\n A sprite that draws nothing.\n\n @name EMPTY\n @fieldOf Sprite\n @constant\n @returns {Sprite}\n */\n /**\n A sprite that draws nothing.\n\n @name NONE\n @fieldOf Sprite\n @constant\n @returns {Sprite}\n */\n Sprite.EMPTY = Sprite.NONE = LoaderProxy();\n /**\n Loads a sprite from a given url.\n\n @name fromURL\n @methodOf Sprite\n @param {String} url The url where the image to load is located\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.fromURL = Sprite.load;\n /**\n Loads a sprite with the given name.\n\n @name loadByName\n @methodOf Sprite\n @param {String} name The name of the image in your images directory\n @param {Function} [callback] Function to execute once the image is loaded. The sprite proxy data is passed to this as a parameter.\n @returns {Sprite}\n */\n Sprite.loadByName = function(name, callback) {\n return Sprite.load(ResourceLoader.urlFor(\"images\", name), callback);\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Sprite\"] = Sprite;\n})();;\n;\n;\n;\n;\ndocument.oncontextmenu = function() {\n return false;\n};\n$(document).bind(\"keydown\", function(event) {\n if (!$(event.target).is(\"input\")) {\n return event.preventDefault();\n }\n});;\nvar Joysticks;\nvar __slice = Array.prototype.slice;\nJoysticks = (function() {\n var AXIS_MAX, Controller, DEAD_ZONE, MAX_BUFFER, TRIP_HIGH, TRIP_LOW, axisMappingDefault, axisMappingOSX, buttonMappingDefault, buttonMappingOSX, controllers, displayInstallPrompt, joysticks, plugin, previousJoysticks, type;\n type = \"application/x-boomstickjavascriptjoysticksupport\";\n plugin = null;\n MAX_BUFFER = 2000;\n AXIS_MAX = 32767 - MAX_BUFFER;\n DEAD_ZONE = AXIS_MAX * 0.2;\n TRIP_HIGH = AXIS_MAX * 0.75;\n TRIP_LOW = AXIS_MAX * 0.5;\n previousJoysticks = [];\n joysticks = [];\n controllers = [];\n buttonMappingDefault = {\n \"A\": 1,\n \"B\": 2,\n \"C\": 4,\n \"D\": 8,\n \"X\": 4,\n \"Y\": 8,\n \"R\": 32,\n \"RB\": 32,\n \"R1\": 32,\n \"L\": 16,\n \"LB\": 16,\n \"L1\": 16,\n \"SELECT\": 64,\n \"BACK\": 64,\n \"START\": 128,\n \"HOME\": 256,\n \"GUIDE\": 256,\n \"TL\": 512,\n \"TR\": 1024,\n \"ANY\": 0xFFFFFF\n };\n buttonMappingOSX = {\n \"A\": 2048,\n \"B\": 4096,\n \"C\": 8192,\n \"D\": 16384,\n \"X\": 8192,\n \"Y\": 16384,\n \"R\": 512,\n \"L\": 256,\n \"SELECT\": 32,\n \"BACK\": 32,\n \"START\": 16,\n \"HOME\": 1024,\n \"LT\": 64,\n \"TR\": 128,\n \"ANY\": 0xFFFFFF0\n };\n axisMappingDefault = {\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5\n };\n axisMappingOSX = {\n 0: 2,\n 1: 3,\n 2: 4,\n 3: 5,\n 4: 0,\n 5: 1\n };\n displayInstallPrompt = function(text, url) {\n return $(\"<a />\", {\n css: {\n backgroundColor: \"yellow\",\n boxSizing: \"border-box\",\n color: \"#000\",\n display: \"block\",\n fontWeight: \"bold\",\n left: 0,\n padding: \"1em\",\n position: \"absolute\",\n textDecoration: \"none\",\n top: 0,\n width: \"100%\",\n zIndex: 2000\n },\n href: url,\n target: \"_blank\",\n text: text\n }).appendTo(\"body\");\n };\n Controller = function(i, remapOSX) {\n var axisMapping, axisTrips, buttonMapping, currentState, previousState, self;\n if (remapOSX === void 0) {\n remapOSX = navigator.platform.match(/^Mac/);\n }\n if (remapOSX) {\n buttonMapping = buttonMappingOSX;\n axisMapping = axisMappingOSX;\n } else {\n buttonMapping = buttonMappingDefault;\n axisMapping = axisMappingDefault;\n }\n currentState = function() {\n return joysticks[i];\n };\n previousState = function() {\n return previousJoysticks[i];\n };\n axisTrips = [];\n return self = Core().include(Bindable).extend({\n actionDown: function() {\n var buttons, state;\n buttons = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n if (state = currentState()) {\n return buttons.inject(false, function(down, button) {\n return down || state.buttons & buttonMapping[button];\n });\n } else {\n return false;\n }\n },\n buttonPressed: function(button) {\n var buttonId;\n buttonId = buttonMapping[button];\n return (self.buttons() & buttonId) && !(previousState().buttons & buttonId);\n },\n position: function(stick) {\n var magnitude, p, ratio, state;\n if (stick == null) {\n stick = 0;\n }\n if (state = currentState()) {\n p = Point(self.axis(2 * stick), self.axis(2 * stick + 1));\n magnitude = p.magnitude();\n if (magnitude > AXIS_MAX) {\n return p.norm();\n } else if (magnitude < DEAD_ZONE) {\n return Point(0, 0);\n } else {\n ratio = magnitude / AXIS_MAX;\n return p.scale(ratio / AXIS_MAX);\n }\n } else {\n return Point(0, 0);\n }\n },\n axis: function(n) {\n n = axisMapping[n];\n return self.axes()[n] || 0;\n },\n axes: function() {\n var state;\n if (state = currentState()) {\n return state.axes;\n } else {\n return [];\n }\n },\n buttons: function() {\n var state;\n if (state = currentState()) {\n return state.buttons;\n }\n },\n processEvents: function() {\n var x, y, _ref;\n _ref = [0, 1].map(function(n) {\n if (!axisTrips[n] && self.axis(n).abs() > TRIP_HIGH) {\n axisTrips[n] = true;\n return self.axis(n).sign();\n }\n if (axisTrips[n] && self.axis(n).abs() < TRIP_LOW) {\n axisTrips[n] = false;\n }\n return 0;\n }), x = _ref[0], y = _ref[1];\n if (!x || !y) {\n return self.trigger(\"tap\", Point(x, y));\n }\n },\n drawDebug: function(canvas) {\n var axis, i, lineHeight, _len, _ref;\n lineHeight = 18;\n canvas.fillColor(\"#FFF\");\n _ref = self.axes();\n for (i = 0, _len = _ref.length; i < _len; i++) {\n axis = _ref[i];\n canvas.fillText(axis, 0, i * lineHeight);\n }\n return canvas.fillText(self.buttons(), 0, i * lineHeight);\n }\n });\n };\n return {\n getController: function(i) {\n return controllers[i] || (controllers[i] = Controller(i));\n },\n init: function() {\n if (!plugin) {\n plugin = document.createElement(\"object\");\n plugin.type = type;\n plugin.width = 0;\n plugin.height = 0;\n $(\"body\").append(plugin);\n plugin.maxAxes = 6;\n if (!plugin.status) {\n return displayInstallPrompt(\"Your browser does not yet handle joysticks, please click here to install the Boomstick plugin!\", \"https://github.com/STRd6/Boomstick/wiki\");\n }\n }\n },\n status: function() {\n return plugin != null ? plugin.status : void 0;\n },\n update: function() {\n var controller, _i, _len, _results;\n if (plugin.joysticksJSON) {\n previousJoysticks = joysticks;\n joysticks = JSON.parse(plugin.joysticksJSON());\n }\n _results = [];\n for (_i = 0, _len = controllers.length; _i < _len; _i++) {\n controller = controllers[_i];\n _results.push(controller != null ? controller.processEvents() : void 0);\n }\n return _results;\n },\n joysticks: function() {\n return joysticks;\n }\n };\n})();;\n/**\njQuery Hotkeys Plugin\nCopyright 2010, John Resig\nDual licensed under the MIT or GPL Version 2 licenses.\n\nBased upon the plugin by Tzury Bar Yochay:\nhttp://github.com/tzuryby/hotkeys\n\nOriginal idea by:\nBinny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/\n*/(function(jQuery) {\n var keyHandler;\n jQuery.hotkeys = {\n version: \"0.8\",\n specialKeys: {\n 8: \"backspace\",\n 9: \"tab\",\n 13: \"return\",\n 16: \"shift\",\n 17: \"ctrl\",\n 18: \"alt\",\n 19: \"pause\",\n 20: \"capslock\",\n 27: \"esc\",\n 32: \"space\",\n 33: \"pageup\",\n 34: \"pagedown\",\n 35: \"end\",\n 36: \"home\",\n 37: \"left\",\n 38: \"up\",\n 39: \"right\",\n 40: \"down\",\n 45: \"insert\",\n 46: \"del\",\n 96: \"0\",\n 97: \"1\",\n 98: \"2\",\n 99: \"3\",\n 100: \"4\",\n 101: \"5\",\n 102: \"6\",\n 103: \"7\",\n 104: \"8\",\n 105: \"9\",\n 106: \"*\",\n 107: \"+\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 112: \"f1\",\n 113: \"f2\",\n 114: \"f3\",\n 115: \"f4\",\n 116: \"f5\",\n 117: \"f6\",\n 118: \"f7\",\n 119: \"f8\",\n 120: \"f9\",\n 121: \"f10\",\n 122: \"f11\",\n 123: \"f12\",\n 144: \"numlock\",\n 145: \"scroll\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 224: \"meta\"\n },\n shiftNums: {\n \"`\": \"~\",\n \"1\": \"!\",\n \"2\": \"@\",\n \"3\": \"#\",\n \"4\": \"$\",\n \"5\": \"%\",\n \"6\": \"^\",\n \"7\": \"&\",\n \"8\": \"*\",\n \"9\": \"(\",\n \"0\": \")\",\n \"-\": \"_\",\n \"=\": \"+\",\n \";\": \":\",\n \"'\": \"\\\"\",\n \",\": \"<\",\n \".\": \">\",\n \"/\": \"?\",\n \"\\\\\": \"|\"\n }\n };\n keyHandler = function(handleObj) {\n var keys, origHandler;\n if (typeof handleObj.data !== \"string\") {\n return;\n }\n origHandler = handleObj.handler;\n keys = handleObj.data.toLowerCase().split(\" \");\n return handleObj.handler = function(event) {\n var character, key, modif, possible, special, _i, _len;\n if (this !== event.target && (/textarea|select/i.test(event.target.nodeName) || event.target.type === \"text\" || event.target.type === \"password\")) {\n return;\n }\n special = event.type !== \"keypress\" && jQuery.hotkeys.specialKeys[event.which];\n character = String.fromCharCode(event.which).toLowerCase();\n modif = \"\";\n possible = {};\n if (event.altKey && special !== \"alt\") {\n modif += \"alt+\";\n }\n if (event.ctrlKey && special !== \"ctrl\") {\n modif += \"ctrl+\";\n }\n if (event.metaKey && !event.ctrlKey && special !== \"meta\") {\n modif += \"meta+\";\n }\n if (event.shiftKey && special !== \"shift\") {\n modif += \"shift+\";\n }\n if (special) {\n possible[modif + special] = true;\n } else {\n possible[modif + character] = true;\n possible[modif + jQuery.hotkeys.shiftNums[character]] = true;\n if (modif === \"shift+\") {\n possible[jQuery.hotkeys.shiftNums[character]] = true;\n }\n }\n for (_i = 0, _len = keys.length; _i < _len; _i++) {\n key = keys[_i];\n if (possible[key]) {\n return origHandler.apply(this, arguments);\n }\n }\n };\n };\n return jQuery.each([\"keydown\", \"keyup\", \"keypress\"], function() {\n return jQuery.event.special[this] = {\n add: keyHandler\n };\n });\n})(jQuery);;\n/**\nMerges properties from objects into target without overiding.\nFirst come, first served.\n\n@return target\n*/var __slice = Array.prototype.slice;\njQuery.extend({\n reverseMerge: function() {\n var name, object, objects, target, _i, _len;\n target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n for (_i = 0, _len = objects.length; _i < _len; _i++) {\n object = objects[_i];\n for (name in object) {\n if (!target.hasOwnProperty(name)) {\n target[name] = object[name];\n }\n }\n }\n return target;\n }\n});;\n$(function() {\n /**\n The global keydown property lets your query the status of keys.\n\n <pre>\n # Examples:\n\n if keydown.left\n moveLeft()\n\n if keydown.a or keydown.space\n attack()\n\n if keydown.return\n confirm()\n\n if keydown.esc\n cancel()\n\n </pre>\n\n @name keydown\n @namespace\n */ var keyName, prevKeysDown;\n window.keydown = {};\n window.justPressed = {};\n prevKeysDown = {};\n keyName = function(event) {\n return jQuery.hotkeys.specialKeys[event.which] || String.fromCharCode(event.which).toLowerCase();\n };\n $(document).bind(\"keydown\", function(event) {\n var key;\n key = keyName(event);\n return keydown[key] = true;\n });\n $(document).bind(\"keyup\", function(event) {\n var key;\n key = keyName(event);\n return keydown[key] = false;\n });\n return window.updateKeys = function() {\n var key, value, _results;\n window.justPressed = {};\n for (key in keydown) {\n value = keydown[key];\n if (!prevKeysDown[key]) {\n justPressed[key] = value;\n }\n }\n prevKeysDown = {};\n _results = [];\n for (key in keydown) {\n value = keydown[key];\n _results.push(prevKeysDown[key] = value);\n }\n return _results;\n };\n});;\nvar Music;\nMusic = (function() {\n var track;\n track = $(\"<audio />\", {\n loop: \"loop\"\n }).appendTo('body').get(0);\n track.volume = 1;\n return {\n play: function(name) {\n track.src = \"\" + BASE_URL + \"/sounds/\" + name + \".mp3\";\n return track.play();\n }\n };\n})();;\nvar __slice = Array.prototype.slice;\n(function($) {\n return $.fn.powerCanvas = function(options) {\n var $canvas, canvas, context;\n options || (options = {});\n canvas = this.get(0);\n context = void 0;\n /**\n * PowerCanvas provides a convenient wrapper for working with Context2d.\n * @name PowerCanvas\n * @constructor\n */\n $canvas = $(canvas).extend((function() {\n /**\n * Passes this canvas to the block with the given matrix transformation\n * applied. All drawing methods called within the block will draw\n * into the canvas with the transformation applied. The transformation\n * is removed at the end of the block, even if the block throws an error.\n *\n * @name withTransform\n * @methodOf PowerCanvas#\n *\n * @param {Matrix} matrix\n * @param {Function} block\n * @returns this\n */\n })(), {\n withTransform: function(matrix, block) {\n context.save();\n context.transform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n try {\n block(this);\n } finally {\n context.restore();\n }\n return this;\n },\n clear: function() {\n context.clearRect(0, 0, canvas.width, canvas.height);\n return this;\n },\n clearRect: function(x, y, width, height) {\n context.clearRect(x, y, width, height);\n return this;\n },\n context: function() {\n return context;\n },\n element: function() {\n return canvas;\n },\n globalAlpha: function(newVal) {\n if (newVal != null) {\n context.globalAlpha = newVal;\n return this;\n } else {\n return context.globalAlpha;\n }\n },\n compositeOperation: function(newVal) {\n if (newVal != null) {\n context.globalCompositeOperation = newVal;\n return this;\n } else {\n return context.globalCompositeOperation;\n }\n },\n createLinearGradient: function(x0, y0, x1, y1) {\n return context.createLinearGradient(x0, y0, x1, y1);\n },\n createRadialGradient: function(x0, y0, r0, x1, y1, r1) {\n return context.createRadialGradient(x0, y0, r0, x1, y1, r1);\n },\n buildRadialGradient: function(c1, c2, stops) {\n var color, gradient, position;\n gradient = context.createRadialGradient(c1.x, c1.y, c1.radius, c2.x, c2.y, c2.radius);\n for (position in stops) {\n color = stops[position];\n gradient.addColorStop(position, color);\n }\n return gradient;\n },\n createPattern: function(image, repitition) {\n return context.createPattern(image, repitition);\n },\n drawImage: function(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) {\n context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n return this;\n },\n drawLine: function(x1, y1, x2, y2, width) {\n if (arguments.length === 3) {\n width = x2;\n x2 = y1.x;\n y2 = y1.y;\n y1 = x1.y;\n x1 = x1.x;\n }\n width || (width = 3);\n context.lineWidth = width;\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.closePath();\n context.stroke();\n return this;\n },\n fill: function(color) {\n $canvas.fillColor(color);\n context.fillRect(0, 0, canvas.width, canvas.height);\n return this;\n }\n }, (function() {\n /**\n * Fills a circle at the specified position with the specified\n * radius and color.\n *\n * @name fillCircle\n * @methodOf PowerCanvas#\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} radius\n * @param {Number} color\n * @see PowerCanvas#fillColor \n * @returns this\n */\n })(), {\n fillCircle: function(x, y, radius, color) {\n $canvas.fillColor(color);\n context.beginPath();\n context.arc(x, y, radius, 0, Math.TAU, true);\n context.closePath();\n context.fill();\n return this;\n }\n }, (function() {\n /**\n * Fills a rectangle with the current fillColor\n * at the specified position with the specified\n * width and height \n\n * @name fillRect\n * @methodOf PowerCanvas#\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n * @see PowerCanvas#fillColor \n * @returns this\n */\n })(), {\n fillRect: function(x, y, width, height) {\n context.fillRect(x, y, width, height);\n return this;\n },\n fillShape: function() {\n var points;\n points = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n context.beginPath();\n points.each(function(point, i) {\n if (i === 0) {\n return context.moveTo(point.x, point.y);\n } else {\n return context.lineTo(point.x, point.y);\n }\n });\n context.lineTo(points[0].x, points[0].y);\n return context.fill();\n }\n }, (function() {\n /**\n * Adapted from http://js-bits.blogspot.com/2010/07/canvas-rounded-corner-rectangles.html\n */\n })(), {\n fillRoundRect: function(x, y, width, height, radius, strokeWidth) {\n radius || (radius = 5);\n context.beginPath();\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n context.closePath();\n if (strokeWidth) {\n context.lineWidth = strokeWidth;\n context.stroke();\n }\n context.fill();\n return this;\n },\n fillText: function(text, x, y) {\n context.fillText(text, x, y);\n return this;\n },\n centerText: function(text, y) {\n var textWidth;\n textWidth = $canvas.measureText(text);\n return $canvas.fillText(text, (canvas.width - textWidth) / 2, y);\n },\n fillWrappedText: function(text, x, y, width) {\n var lineHeight, tokens, tokens2;\n tokens = text.split(\" \");\n tokens2 = text.split(\" \");\n lineHeight = 16;\n if ($canvas.measureText(text) > width) {\n if (tokens.length % 2 === 0) {\n tokens2 = tokens.splice(tokens.length / 2, tokens.length / 2, \"\");\n } else {\n tokens2 = tokens.splice(tokens.length / 2 + 1, (tokens.length / 2) + 1, \"\");\n }\n context.fillText(tokens.join(\" \"), x, y);\n return context.fillText(tokens2.join(\" \"), x, y + lineHeight);\n } else {\n return context.fillText(tokens.join(\" \"), x, y + lineHeight);\n }\n },\n fillColor: function(color) {\n if (color) {\n if (color.channels) {\n context.fillStyle = color.toString();\n } else {\n context.fillStyle = color;\n }\n return this;\n } else {\n return context.fillStyle;\n }\n },\n font: function(font) {\n if (font != null) {\n context.font = font;\n return this;\n } else {\n return context.font;\n }\n },\n measureText: function(text) {\n return context.measureText(text).width;\n },\n putImageData: function(imageData, x, y) {\n context.putImageData(imageData, x, y);\n return this;\n },\n strokeColor: function(color) {\n if (color) {\n if (color.channels) {\n context.strokeStyle = color.toString();\n } else {\n context.strokeStyle = color;\n }\n return this;\n } else {\n return context.strokeStyle;\n }\n },\n strokeCircle: function(x, y, radius, color) {\n $canvas.strokeColor(color);\n context.beginPath();\n context.arc(x, y, radius, 0, Math.TAU, true);\n context.closePath();\n context.stroke();\n return this;\n },\n strokeRect: function(x, y, width, height) {\n context.strokeRect(x, y, width, height);\n return this;\n },\n textAlign: function(textAlign) {\n context.textAlign = textAlign;\n return this;\n },\n height: function() {\n return canvas.height;\n },\n width: function() {\n return canvas.width;\n }\n });\n if (canvas != null ? canvas.getContext : void 0) {\n context = canvas.getContext('2d');\n if (options.init) {\n options.init($canvas);\n }\n return $canvas;\n }\n };\n})(jQuery);;\nwindow.requestAnimationFrame || (window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {\n return window.setTimeout(function() {\n return callback(+new Date());\n }, 1000 / 60);\n});;\n(function($) {\n var Sound, directory, format, loadSoundChannel, sounds, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref.sounds : void 0 : void 0) || \"sounds\";\n format = \"wav\";\n sounds = {};\n loadSoundChannel = function(name) {\n var sound, url;\n url = \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".\" + format;\n return sound = $('<audio />', {\n autobuffer: true,\n preload: 'auto',\n src: url\n }).get(0);\n };\n Sound = function(id, maxChannels) {\n return {\n play: function() {\n return Sound.play(id, maxChannels);\n },\n stop: function() {\n return Sound.stop(id);\n }\n };\n };\n return Object.extend(Sound, {\n play: function(id, maxChannels) {\n var channel, channels, freeChannels, sound;\n maxChannels || (maxChannels = 4);\n if (!sounds[id]) {\n sounds[id] = [loadSoundChannel(id)];\n }\n channels = sounds[id];\n freeChannels = $.grep(channels, function(sound) {\n return sound.currentTime === sound.duration || sound.currentTime === 0;\n });\n if (channel = freeChannels.first()) {\n try {\n channel.currentTime = 0;\n } catch (_e) {}\n return channel.play();\n } else {\n if (!maxChannels || channels.length < maxChannels) {\n sound = loadSoundChannel(id);\n channels.push(sound);\n return sound.play();\n }\n }\n },\n playFromUrl: function(url) {\n var sound;\n sound = $('<audio />').get(0);\n sound.src = url;\n sound.play();\n return sound;\n },\n stop: function(id) {\n var _ref2;\n return (_ref2 = sounds[id]) != null ? _ref2.stop() : void 0;\n }\n }, (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Sound\"] = Sound);\n})(jQuery);;\n(function() {\n /**\n @name Local\n @namespace\n */\n /**\n Store an object in local storage.\n\n @name set\n @methodOf Local\n\n @param {String} key\n @param {Object} value\n @type Object\n @returns value\n */ var retrieve, store;\n store = function(key, value) {\n localStorage[key] = JSON.stringify(value);\n return value;\n };\n /**\n Retrieve an object from local storage.\n\n @name get\n @methodOf Local\n\n @param {String} key\n @type Object\n @returns The object that was stored or undefined if no object was stored.\n */\n retrieve = function(key) {\n var value;\n value = localStorage[key];\n if (value != null) {\n return JSON.parse(value);\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Local\"] = {\n get: retrieve,\n set: store,\n put: store,\n /**\n Access an instance of Local with a specified prefix.\n\n @name new\n @methodOf Local\n\n @param {String} prefix\n @type Local\n @returns An interface to local storage with the given prefix applied.\n */\n \"new\": function(prefix) {\n prefix || (prefix = \"\");\n return {\n get: function(key) {\n return retrieve(\"\" + prefix + \"_key\");\n },\n set: function(key, value) {\n return store(\"\" + prefix + \"_key\", value);\n },\n put: function(key, value) {\n return store(\"\" + prefix + \"_key\", value);\n }\n };\n }\n };\n})();;\n;\n;\n;\n;\n/**\nThe Animated module, when included in a GameObject, gives the object \nmethods to transition from one animation state to another\n\n@name Animated\n@module\n@constructor\n\n@param {Object} I Instance variables\n@param {Object} self Reference to including object\n*/var Animated;\nAnimated = function(I, self) {\n var advanceFrame, find, initializeState, loadByName, updateSprite, _name, _ref;\n I || (I = {});\n $.reverseMerge(I, {\n animationName: (_ref = I[\"class\"]) != null ? _ref.underscore() : void 0,\n data: {\n version: \"\",\n tileset: [\n {\n id: 0,\n src: \"\",\n title: \"\",\n circles: [\n {\n x: 0,\n y: 0,\n radius: 0\n }\n ]\n }\n ],\n animations: [\n {\n name: \"\",\n complete: \"\",\n interruptible: false,\n speed: \"\",\n transform: [\n {\n hflip: false,\n vflip: false\n }\n ],\n triggers: {\n \"0\": [\"a trigger\"]\n },\n frames: [0],\n transform: [void 0]\n }\n ]\n },\n activeAnimation: {\n name: \"\",\n complete: \"\",\n interruptible: false,\n speed: \"\",\n transform: [\n {\n hflip: false,\n vflip: false\n }\n ],\n triggers: {\n \"0\": [\"\"]\n },\n frames: [0]\n },\n currentFrameIndex: 0,\n debugAnimation: false,\n hflip: false,\n vflip: false,\n lastUpdate: new Date().getTime(),\n useTimer: false\n });\n loadByName = function(name, callback) {\n var url;\n url = \"\" + BASE_URL + \"/animations/\" + name + \".animation?\" + (new Date().getTime());\n $.getJSON(url, function(data) {\n I.data = data;\n return typeof callback === \"function\" ? callback(data) : void 0;\n });\n return I.data;\n };\n initializeState = function() {\n I.activeAnimation = I.data.animations.first();\n return I.spriteLookup = I.data.tileset.map(function(spriteData) {\n return Sprite.fromURL(spriteData.src);\n });\n };\n window[_name = \"\" + I.animationName + \"SpriteLookup\"] || (window[_name] = []);\n if (!window[\"\" + I.animationName + \"SpriteLookup\"].length) {\n window[\"\" + I.animationName + \"SpriteLookup\"] = I.data.tileset.map(function(spriteData) {\n return Sprite.fromURL(spriteData.src);\n });\n }\n I.spriteLookup = window[\"\" + I.animationName + \"SpriteLookup\"];\n if (I.data.animations.first().name !== \"\") {\n initializeState();\n } else if (I.animationName) {\n loadByName(I.animationName, function() {\n return initializeState();\n });\n } else {\n throw \"No animation data provided. Use animationName to specify an animation to load from the project or pass in raw JSON to the data key.\";\n }\n advanceFrame = function() {\n var frames, nextState, sprite;\n frames = I.activeAnimation.frames;\n if (I.currentFrameIndex === frames.indexOf(frames.last())) {\n self.trigger(\"Complete\");\n if (nextState = I.activeAnimation.complete) {\n I.activeAnimation = find(nextState) || I.activeAnimation;\n I.currentFrameIndex = 0;\n }\n } else {\n I.currentFrameIndex = (I.currentFrameIndex + 1) % frames.length;\n }\n sprite = I.spriteLookup[frames[I.currentFrameIndex]];\n return updateSprite(sprite);\n };\n find = function(name) {\n var nameLower, result;\n result = null;\n nameLower = name.toLowerCase();\n I.data.animations.each(function(animation) {\n if (animation.name.toLowerCase() === nameLower) {\n return result = animation;\n }\n });\n return result;\n };\n updateSprite = function(spriteData) {\n I.sprite = spriteData;\n I.width = spriteData.width;\n return I.height = spriteData.height;\n };\n return {\n /**\n Transitions to a new active animation. Will not transition if the new state\n has the same name as the current one or if the active animation is marked as locked.\n\n @param {String} newState The name of the target state you wish to transition to.\n */\n transition: function(newState, force) {\n var toNextState;\n if (newState === I.activeAnimation.name) {\n return;\n }\n toNextState = function(state) {\n var firstFrame, firstSprite, nextState;\n if (nextState = find(state)) {\n I.activeAnimation = nextState;\n firstFrame = I.activeAnimation.frames.first();\n firstSprite = I.spriteLookup[firstFrame];\n I.currentFrameIndex = 0;\n return updateSprite(firstSprite);\n } else {\n if (I.debugAnimation) {\n return warn(\"Could not find animation state '\" + newState + \"'. The current transition will be ignored\");\n }\n }\n };\n if (force) {\n return toNextState(newState);\n } else {\n if (!I.activeAnimation.interruptible) {\n if (I.debugAnimation) {\n warn(\"Cannot transition to '\" + newState + \"' because '\" + I.activeAnimation.name + \"' is locked\");\n }\n return;\n }\n return toNextState(newState);\n }\n },\n before: {\n update: function() {\n var time, triggers, updateFrame, _ref2, _ref3;\n if (I.useTimer) {\n time = new Date().getTime();\n if (updateFrame = (time - I.lastUpdate) >= I.activeAnimation.speed) {\n I.lastUpdate = time;\n if (triggers = (_ref2 = I.activeAnimation.triggers) != null ? _ref2[I.currentFrameIndex] : void 0) {\n triggers.each(function(event) {\n return self.trigger(event);\n });\n }\n return advanceFrame();\n }\n } else {\n if (triggers = (_ref3 = I.activeAnimation.triggers) != null ? _ref3[I.currentFrameIndex] : void 0) {\n triggers.each(function(event) {\n return self.trigger(event);\n });\n }\n return advanceFrame();\n }\n }\n }\n };\n};;\n(function() {\n var Animation, fromPixieId;\n Animation = function(data) {\n var activeAnimation, advanceFrame, currentSprite, spriteLookup;\n spriteLookup = {};\n activeAnimation = data.animations[0];\n currentSprite = data.animations[0].frames[0];\n advanceFrame = function(animation) {\n var frames;\n frames = animation.frames;\n return currentSprite = frames[(frames.indexOf(currentSprite) + 1) % frames.length];\n };\n data.tileset.each(function(spriteData, i) {\n return spriteLookup[i] = Sprite.fromURL(spriteData.src);\n });\n return $.extend(data, {\n currentSprite: function() {\n return currentSprite;\n },\n draw: function(canvas, x, y) {\n return canvas.withTransform(Matrix.translation(x, y), function() {\n return spriteLookup[currentSprite].draw(canvas, 0, 0);\n });\n },\n frames: function() {\n return activeAnimation.frames;\n },\n update: function() {\n return advanceFrame(activeAnimation);\n },\n active: function(name) {\n if (name !== void 0) {\n if (data.animations[name]) {\n return currentSprite = data.animations[name].frames[0];\n }\n } else {\n return activeAnimation;\n }\n }\n });\n };\n window.Animation = function(name, callback) {\n return fromPixieId(App.Animations[name], callback);\n };\n fromPixieId = function(id, callback) {\n var proxy, url;\n url = \"http://pixie.strd6.com/s3/animations/\" + id + \"/data.json\";\n proxy = {\n active: $.noop,\n draw: $.noop\n };\n $.getJSON(url, function(data) {\n $.extend(proxy, Animation(data));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n return window.Animation.fromPixieId = fromPixieId;\n})();;\nvar __slice = Array.prototype.slice;\n(function() {\n var Color, hslParser, hslToRgb, lookup, names, normalizeKey, parseHSL, parseHex, parseRGB, rgbParser, shiftLightness;\n rgbParser = /^rgba?\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),?\\s*(\\d?\\.?\\d*)?\\)$/;\n hslParser = /^hsla?\\((\\d{1,3}),\\s*(\\d?\\.?\\d*),\\s*(\\d?\\.?\\d*),?\\s*(\\d?\\.?\\d*)?\\)$/;\n parseHex = function(hexString) {\n var i, rgb;\n hexString = hexString.replace(/#/, '');\n switch (hexString.length) {\n case 3:\n case 4:\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(i, 1), 16) * 0x11);\n }\n return _results;\n })();\n return rgb.concat(hexString.substr(3, 1).length ? (parseInt(hexString.substr(3, 1), 16) * 0x11) / 255.0 : 1.0);\n case 6:\n case 8:\n rgb = (function() {\n var _results;\n _results = [];\n for (i = 0; i <= 2; i++) {\n _results.push(parseInt(hexString.substr(2 * i, 2), 16));\n }\n return _results;\n })();\n return rgb.concat(hexString.substr(6, 2).length ? parseInt(hexString.substr(6, 2), 16) / 255.0 : 1.0);\n }\n };\n parseRGB = function(colorString) {\n var bits, rgbMap;\n if (!(bits = rgbParser.exec(colorString))) {\n return;\n }\n rgbMap = bits.splice(1, 3).map(function(channel) {\n return parseFloat(channel);\n });\n return rgbMap.concat(bits[1] != null ? parseFloat(bits[1]) : 1.0);\n };\n parseHSL = function(colorString) {\n var bits, hslMap;\n if (!(bits = hslParser.exec(colorString))) {\n return;\n }\n hslMap = bits.splice(1, 3).map(function(channel) {\n return parseFloat(channel);\n });\n return hslToRgb(hslMap.concat(bits[1] != null ? parseFloat(bits[1]) : 1.0));\n };\n shiftLightness = function(amount, obj) {\n var hsl;\n hsl = obj.toHsl();\n hsl[2] = hsl[2] + amount;\n return Color(hslToRgb(hsl));\n };\n hslToRgb = function(hsl) {\n var a, b, g, h, hueToRgb, l, p, q, r, rgbMap, s;\n h = hsl[0] / 360.0;\n s = hsl[1];\n l = hsl[2];\n a = (hsl[3] ? parseFloat(hsl[3]) : 1.0);\n r = g = b = null;\n hueToRgb = function(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n };\n if (s === 0) {\n r = g = b = l;\n } else {\n q = (l < 0.5 ? l * (1 + s) : l + s - l * s);\n p = 2 * l - q;\n r = hueToRgb(p, q, h + 1 / 3);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 1 / 3);\n rgbMap = [r, g, b].map(function(channel) {\n return channel * 0xFF;\n });\n }\n return rgbMap.concat(a);\n };\n normalizeKey = function(key) {\n return key.toString().toLowerCase().split(' ').join('');\n };\n (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Color\"] = Color = function() {\n var alpha, args, arr, channels, color, parsedColor, rgbMap, self;\n args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n color = args.first();\n if (color != null ? color.channels : void 0) {\n return Color(color.channels());\n }\n parsedColor = null;\n if (args.length === 0) {\n parsedColor = [0, 0, 0, 1];\n } else if (args.length === 1 && Object.isArray(args.first())) {\n arr = args.first();\n rgbMap = arr.splice(0, 3).map(function(channel) {\n return parseFloat(channel);\n });\n alpha = arr[0] != null ? parseFloat(arr[0]) : 1.0;\n parsedColor = rgbMap.concat(alpha);\n } else if (args.length === 2) {\n color = args[0];\n alpha = args[1];\n if (Object.isArray(color)) {\n rgbMap = color.splice(0, 3).map(function(channel) {\n return parseFloat(channel);\n });\n parsedColor = rgbMap.concat(parseFloat(alpha));\n } else {\n parsedColor = lookup[normalizeKey(color)] || parseHex(color) || parseRGB(color) || parseHSL(color);\n parsedColor[3] = alpha;\n }\n } else if (args.length > 2) {\n rgbMap = args.splice(0, 3).map(function(channel) {\n return parseFloat(channel);\n });\n alpha = args.first() != null ? args.first() : 1.0;\n parsedColor = rgbMap.concat(parseFloat(alpha));\n } else {\n color = args.first().toString();\n parsedColor = lookup[normalizeKey(color)] || parseHex(color) || parseRGB(color) || parseHSL(color);\n }\n if (!parsedColor) {\n throw \"\" + (args.join(',')) + \" is an unknown color\";\n }\n rgbMap = parsedColor.splice(0, 3).map(function(channel) {\n return channel.round();\n });\n alpha = (parsedColor.first() != null ? parseFloat(parsedColor.first()) : 1.0);\n channels = rgbMap.concat(alpha);\n self = {\n channels: function() {\n return channels.copy();\n },\n r: function(val) {\n if (val != null) {\n channels[0] = val;\n return self;\n } else {\n return channels[0];\n }\n },\n g: function(val) {\n if (val != null) {\n channels[1] = val;\n return self;\n } else {\n return channels[1];\n }\n },\n b: function(val) {\n if (val != null) {\n channels[2] = val;\n return self;\n } else {\n return channels[2];\n }\n },\n a: function(val) {\n if (val != null) {\n channels[3] = val;\n return self;\n } else {\n return channels[3];\n }\n },\n equals: function(other) {\n return other.r() === self.r() && other.g() === self.g() && other.b() === self.b() && other.a() === self.a();\n },\n lighten: function(amount) {\n return shiftLightness(amount, self);\n },\n darken: function(amount) {\n return shiftLightness(-amount, self);\n },\n rgba: function() {\n return \"rgba(\" + (self.r()) + \", \" + (self.g()) + \", \" + (self.b()) + \", \" + (self.a()) + \")\";\n },\n desaturate: function(amount) {\n var hsl;\n hsl = self.toHsl();\n hsl[1] -= amount;\n return Color(hslToRgb(hsl));\n },\n saturate: function(amount) {\n var hsl;\n hsl = self.toHsl();\n hsl[1] += amount;\n return Color(hslToRgb(hsl));\n },\n grayscale: function() {\n var g, hsl;\n hsl = self.toHsl();\n g = hsl[2] * 255;\n return Color(g, g, g);\n },\n hue: function(degrees) {\n var hsl;\n hsl = self.toHsl();\n hsl[0] = (hsl[0] + degrees) % 360;\n return Color(hslToRgb(hsl));\n },\n complement: function() {\n var hsl;\n hsl = self.toHsl();\n return self.hue(180);\n },\n toHex: function() {\n var hexFromNumber, hexString, padString;\n hexString = function(number) {\n return number.toString(16);\n };\n padString = function(hexString) {\n var pad;\n if (hexString.length === 1) {\n pad = \"0\";\n }\n return (pad || \"\") + hexString;\n };\n hexFromNumber = function(number) {\n return padString(hexString(number));\n };\n return \"#\" + (hexFromNumber(channels[0])) + (hexFromNumber(channels[1])) + (hexFromNumber(channels[2]));\n },\n toHsl: function() {\n var b, delta, g, hue, lightness, max, min, r, saturation, _ref;\n _ref = channels.map(function(channel) {\n return channel / 255.0;\n }), r = _ref[0], g = _ref[1], b = _ref[2];\n min = Math.min(r, g, b);\n max = Math.max(r, g, b);\n hue = saturation = lightness = (max + min) / 2.0;\n if (max === min) {\n hue = saturation = 0;\n } else {\n delta = max - min;\n saturation = (lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min));\n switch (max) {\n case r:\n hue = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n hue = (b - r) / delta + 2;\n break;\n case b:\n hue = (r - g) / delta + 4;\n }\n hue *= 60;\n }\n return [hue, saturation, lightness, channels[3]];\n },\n toString: function() {\n return self.rgba();\n }\n };\n return self;\n };\n lookup = {};\n names = [[\"000000\", \"Black\"], [\"000080\", \"Navy Blue\"], [\"0000C8\", \"Dark Blue\"], [\"0000FF\", \"Blue\"], [\"000741\", \"Stratos\"], [\"001B1C\", \"Swamp\"], [\"002387\", \"Resolution Blue\"], [\"002900\", \"Deep Fir\"], [\"002E20\", \"Burnham\"], [\"002FA7\", \"International Klein Blue\"], [\"003153\", \"Prussian Blue\"], [\"003366\", \"Midnight Blue\"], [\"003399\", \"Smalt\"], [\"003532\", \"Deep Teal\"], [\"003E40\", \"Cyprus\"], [\"004620\", \"Kaitoke Green\"], [\"0047AB\", \"Cobalt\"], [\"004816\", \"Crusoe\"], [\"004950\", \"Sherpa Blue\"], [\"0056A7\", \"Endeavour\"], [\"00581A\", \"Camarone\"], [\"0066CC\", \"Science Blue\"], [\"0066FF\", \"Blue Ribbon\"], [\"00755E\", \"Tropical Rain Forest\"], [\"0076A3\", \"Allports\"], [\"007BA7\", \"Deep Cerulean\"], [\"007EC7\", \"Lochmara\"], [\"007FFF\", \"Azure Radiance\"], [\"008080\", \"Teal\"], [\"0095B6\", \"Bondi Blue\"], [\"009DC4\", \"Pacific Blue\"], [\"00A693\", \"Persian Green\"], [\"00A86B\", \"Jade\"], [\"00CC99\", \"Caribbean Green\"], [\"00CCCC\", \"Robin's Egg Blue\"], [\"00FF00\", \"Green\"], [\"00FF7F\", \"Spring Green\"], [\"00FFFF\", \"Cyan / Aqua\"], [\"010D1A\", \"Blue Charcoal\"], [\"011635\", \"Midnight\"], [\"011D13\", \"Holly\"], [\"012731\", \"Daintree\"], [\"01361C\", \"Cardin Green\"], [\"01371A\", \"County Green\"], [\"013E62\", \"Astronaut Blue\"], [\"013F6A\", \"Regal Blue\"], [\"014B43\", \"Aqua Deep\"], [\"015E85\", \"Orient\"], [\"016162\", \"Blue Stone\"], [\"016D39\", \"Fun Green\"], [\"01796F\", \"Pine Green\"], [\"017987\", \"Blue Lagoon\"], [\"01826B\", \"Deep Sea\"], [\"01A368\", \"Green Haze\"], [\"022D15\", \"English Holly\"], [\"02402C\", \"Sherwood Green\"], [\"02478E\", \"Congress Blue\"], [\"024E46\", \"Evening Sea\"], [\"026395\", \"Bahama Blue\"], [\"02866F\", \"Observatory\"], [\"02A4D3\", \"Cerulean\"], [\"03163C\", \"Tangaroa\"], [\"032B52\", \"Green Vogue\"], [\"036A6E\", \"Mosque\"], [\"041004\", \"Midnight Moss\"], [\"041322\", \"Black Pearl\"], [\"042E4C\", \"Blue Whale\"], [\"044022\", \"Zuccini\"], [\"044259\", \"Teal Blue\"], [\"051040\", \"Deep Cove\"], [\"051657\", \"Gulf Blue\"], [\"055989\", \"Venice Blue\"], [\"056F57\", \"Watercourse\"], [\"062A78\", \"Catalina Blue\"], [\"063537\", \"Tiber\"], [\"069B81\", \"Gossamer\"], [\"06A189\", \"Niagara\"], [\"073A50\", \"Tarawera\"], [\"080110\", \"Jaguar\"], [\"081910\", \"Black Bean\"], [\"082567\", \"Deep Sapphire\"], [\"088370\", \"Elf Green\"], [\"08E8DE\", \"Bright Turquoise\"], [\"092256\", \"Downriver\"], [\"09230F\", \"Palm Green\"], [\"09255D\", \"Madison\"], [\"093624\", \"Bottle Green\"], [\"095859\", \"Deep Sea Green\"], [\"097F4B\", \"Salem\"], [\"0A001C\", \"Black Russian\"], [\"0A480D\", \"Dark Fern\"], [\"0A6906\", \"Japanese Laurel\"], [\"0A6F75\", \"Atoll\"], [\"0B0B0B\", \"Cod Gray\"], [\"0B0F08\", \"Marshland\"], [\"0B1107\", \"Gordons Green\"], [\"0B1304\", \"Black Forest\"], [\"0B6207\", \"San Felix\"], [\"0BDA51\", \"Malachite\"], [\"0C0B1D\", \"Ebony\"], [\"0C0D0F\", \"Woodsmoke\"], [\"0C1911\", \"Racing Green\"], [\"0C7A79\", \"Surfie Green\"], [\"0C8990\", \"Blue Chill\"], [\"0D0332\", \"Black Rock\"], [\"0D1117\", \"Bunker\"], [\"0D1C19\", \"Aztec\"], [\"0D2E1C\", \"Bush\"], [\"0E0E18\", \"Cinder\"], [\"0E2A30\", \"Firefly\"], [\"0F2D9E\", \"Torea Bay\"], [\"10121D\", \"Vulcan\"], [\"101405\", \"Green Waterloo\"], [\"105852\", \"Eden\"], [\"110C6C\", \"Arapawa\"], [\"120A8F\", \"Ultramarine\"], [\"123447\", \"Elephant\"], [\"126B40\", \"Jewel\"], [\"130000\", \"Diesel\"], [\"130A06\", \"Asphalt\"], [\"13264D\", \"Blue Zodiac\"], [\"134F19\", \"Parsley\"], [\"140600\", \"Nero\"], [\"1450AA\", \"Tory Blue\"], [\"151F4C\", \"Bunting\"], [\"1560BD\", \"Denim\"], [\"15736B\", \"Genoa\"], [\"161928\", \"Mirage\"], [\"161D10\", \"Hunter Green\"], [\"162A40\", \"Big Stone\"], [\"163222\", \"Celtic\"], [\"16322C\", \"Timber Green\"], [\"163531\", \"Gable Green\"], [\"171F04\", \"Pine Tree\"], [\"175579\", \"Chathams Blue\"], [\"182D09\", \"Deep Forest Green\"], [\"18587A\", \"Blumine\"], [\"19330E\", \"Palm Leaf\"], [\"193751\", \"Nile Blue\"], [\"1959A8\", \"Fun Blue\"], [\"1A1A68\", \"Lucky Point\"], [\"1AB385\", \"Mountain Meadow\"], [\"1B0245\", \"Tolopea\"], [\"1B1035\", \"Haiti\"], [\"1B127B\", \"Deep Koamaru\"], [\"1B1404\", \"Acadia\"], [\"1B2F11\", \"Seaweed\"], [\"1B3162\", \"Biscay\"], [\"1B659D\", \"Matisse\"], [\"1C1208\", \"Crowshead\"], [\"1C1E13\", \"Rangoon Green\"], [\"1C39BB\", \"Persian Blue\"], [\"1C402E\", \"Everglade\"], [\"1C7C7D\", \"Elm\"], [\"1D6142\", \"Green Pea\"], [\"1E0F04\", \"Creole\"], [\"1E1609\", \"Karaka\"], [\"1E1708\", \"El Paso\"], [\"1E385B\", \"Cello\"], [\"1E433C\", \"Te Papa Green\"], [\"1E90FF\", \"Dodger Blue\"], [\"1E9AB0\", \"Eastern Blue\"], [\"1F120F\", \"Night Rider\"], [\"1FC2C2\", \"Java\"], [\"20208D\", \"Jacksons Purple\"], [\"202E54\", \"Cloud Burst\"], [\"204852\", \"Blue Dianne\"], [\"211A0E\", \"Eternity\"], [\"220878\", \"Deep Blue\"], [\"228B22\", \"Forest Green\"], [\"233418\", \"Mallard\"], [\"240A40\", \"Violet\"], [\"240C02\", \"Kilamanjaro\"], [\"242A1D\", \"Log Cabin\"], [\"242E16\", \"Black Olive\"], [\"24500F\", \"Green House\"], [\"251607\", \"Graphite\"], [\"251706\", \"Cannon Black\"], [\"251F4F\", \"Port Gore\"], [\"25272C\", \"Shark\"], [\"25311C\", \"Green Kelp\"], [\"2596D1\", \"Curious Blue\"], [\"260368\", \"Paua\"], [\"26056A\", \"Paris M\"], [\"261105\", \"Wood Bark\"], [\"261414\", \"Gondola\"], [\"262335\", \"Steel Gray\"], [\"26283B\", \"Ebony Clay\"], [\"273A81\", \"Bay of Many\"], [\"27504B\", \"Plantation\"], [\"278A5B\", \"Eucalyptus\"], [\"281E15\", \"Oil\"], [\"283A77\", \"Astronaut\"], [\"286ACD\", \"Mariner\"], [\"290C5E\", \"Violent Violet\"], [\"292130\", \"Bastille\"], [\"292319\", \"Zeus\"], [\"292937\", \"Charade\"], [\"297B9A\", \"Jelly Bean\"], [\"29AB87\", \"Jungle Green\"], [\"2A0359\", \"Cherry Pie\"], [\"2A140E\", \"Coffee Bean\"], [\"2A2630\", \"Baltic Sea\"], [\"2A380B\", \"Turtle Green\"], [\"2A52BE\", \"Cerulean Blue\"], [\"2B0202\", \"Sepia Black\"], [\"2B194F\", \"Valhalla\"], [\"2B3228\", \"Heavy Metal\"], [\"2C0E8C\", \"Blue Gem\"], [\"2C1632\", \"Revolver\"], [\"2C2133\", \"Bleached Cedar\"], [\"2C8C84\", \"Lochinvar\"], [\"2D2510\", \"Mikado\"], [\"2D383A\", \"Outer Space\"], [\"2D569B\", \"St Tropaz\"], [\"2E0329\", \"Jacaranda\"], [\"2E1905\", \"Jacko Bean\"], [\"2E3222\", \"Rangitoto\"], [\"2E3F62\", \"Rhino\"], [\"2E8B57\", \"Sea Green\"], [\"2EBFD4\", \"Scooter\"], [\"2F270E\", \"Onion\"], [\"2F3CB3\", \"Governor Bay\"], [\"2F519E\", \"Sapphire\"], [\"2F5A57\", \"Spectra\"], [\"2F6168\", \"Casal\"], [\"300529\", \"Melanzane\"], [\"301F1E\", \"Cocoa Brown\"], [\"302A0F\", \"Woodrush\"], [\"304B6A\", \"San Juan\"], [\"30D5C8\", \"Turquoise\"], [\"311C17\", \"Eclipse\"], [\"314459\", \"Pickled Bluewood\"], [\"315BA1\", \"Azure\"], [\"31728D\", \"Calypso\"], [\"317D82\", \"Paradiso\"], [\"32127A\", \"Persian Indigo\"], [\"32293A\", \"Blackcurrant\"], [\"323232\", \"Mine Shaft\"], [\"325D52\", \"Stromboli\"], [\"327C14\", \"Bilbao\"], [\"327DA0\", \"Astral\"], [\"33036B\", \"Christalle\"], [\"33292F\", \"Thunder\"], [\"33CC99\", \"Shamrock\"], [\"341515\", \"Tamarind\"], [\"350036\", \"Mardi Gras\"], [\"350E42\", \"Valentino\"], [\"350E57\", \"Jagger\"], [\"353542\", \"Tuna\"], [\"354E8C\", \"Chambray\"], [\"363050\", \"Martinique\"], [\"363534\", \"Tuatara\"], [\"363C0D\", \"Waiouru\"], [\"36747D\", \"Ming\"], [\"368716\", \"La Palma\"], [\"370202\", \"Chocolate\"], [\"371D09\", \"Clinker\"], [\"37290E\", \"Brown Tumbleweed\"], [\"373021\", \"Birch\"], [\"377475\", \"Oracle\"], [\"380474\", \"Blue Diamond\"], [\"381A51\", \"Grape\"], [\"383533\", \"Dune\"], [\"384555\", \"Oxford Blue\"], [\"384910\", \"Clover\"], [\"394851\", \"Limed Spruce\"], [\"396413\", \"Dell\"], [\"3A0020\", \"Toledo\"], [\"3A2010\", \"Sambuca\"], [\"3A2A6A\", \"Jacarta\"], [\"3A686C\", \"William\"], [\"3A6A47\", \"Killarney\"], [\"3AB09E\", \"Keppel\"], [\"3B000B\", \"Temptress\"], [\"3B0910\", \"Aubergine\"], [\"3B1F1F\", \"Jon\"], [\"3B2820\", \"Treehouse\"], [\"3B7A57\", \"Amazon\"], [\"3B91B4\", \"Boston Blue\"], [\"3C0878\", \"Windsor\"], [\"3C1206\", \"Rebel\"], [\"3C1F76\", \"Meteorite\"], [\"3C2005\", \"Dark Ebony\"], [\"3C3910\", \"Camouflage\"], [\"3C4151\", \"Bright Gray\"], [\"3C4443\", \"Cape Cod\"], [\"3C493A\", \"Lunar Green\"], [\"3D0C02\", \"Bean \"], [\"3D2B1F\", \"Bistre\"], [\"3D7D52\", \"Goblin\"], [\"3E0480\", \"Kingfisher Daisy\"], [\"3E1C14\", \"Cedar\"], [\"3E2B23\", \"English Walnut\"], [\"3E2C1C\", \"Black Marlin\"], [\"3E3A44\", \"Ship Gray\"], [\"3EABBF\", \"Pelorous\"], [\"3F2109\", \"Bronze\"], [\"3F2500\", \"Cola\"], [\"3F3002\", \"Madras\"], [\"3F307F\", \"Minsk\"], [\"3F4C3A\", \"Cabbage Pont\"], [\"3F583B\", \"Tom Thumb\"], [\"3F5D53\", \"Mineral Green\"], [\"3FC1AA\", \"Puerto Rico\"], [\"3FFF00\", \"Harlequin\"], [\"401801\", \"Brown Pod\"], [\"40291D\", \"Cork\"], [\"403B38\", \"Masala\"], [\"403D19\", \"Thatch Green\"], [\"405169\", \"Fiord\"], [\"40826D\", \"Viridian\"], [\"40A860\", \"Chateau Green\"], [\"410056\", \"Ripe Plum\"], [\"411F10\", \"Paco\"], [\"412010\", \"Deep Oak\"], [\"413C37\", \"Merlin\"], [\"414257\", \"Gun Powder\"], [\"414C7D\", \"East Bay\"], [\"4169E1\", \"Royal Blue\"], [\"41AA78\", \"Ocean Green\"], [\"420303\", \"Burnt Maroon\"], [\"423921\", \"Lisbon Brown\"], [\"427977\", \"Faded Jade\"], [\"431560\", \"Scarlet Gum\"], [\"433120\", \"Iroko\"], [\"433E37\", \"Armadillo\"], [\"434C59\", \"River Bed\"], [\"436A0D\", \"Green Leaf\"], [\"44012D\", \"Barossa\"], [\"441D00\", \"Morocco Brown\"], [\"444954\", \"Mako\"], [\"454936\", \"Kelp\"], [\"456CAC\", \"San Marino\"], [\"45B1E8\", \"Picton Blue\"], [\"460B41\", \"Loulou\"], [\"462425\", \"Crater Brown\"], [\"465945\", \"Gray Asparagus\"], [\"4682B4\", \"Steel Blue\"], [\"480404\", \"Rustic Red\"], [\"480607\", \"Bulgarian Rose\"], [\"480656\", \"Clairvoyant\"], [\"481C1C\", \"Cocoa Bean\"], [\"483131\", \"Woody Brown\"], [\"483C32\", \"Taupe\"], [\"49170C\", \"Van Cleef\"], [\"492615\", \"Brown Derby\"], [\"49371B\", \"Metallic Bronze\"], [\"495400\", \"Verdun Green\"], [\"496679\", \"Blue Bayoux\"], [\"497183\", \"Bismark\"], [\"4A2A04\", \"Bracken\"], [\"4A3004\", \"Deep Bronze\"], [\"4A3C30\", \"Mondo\"], [\"4A4244\", \"Tundora\"], [\"4A444B\", \"Gravel\"], [\"4A4E5A\", \"Trout\"], [\"4B0082\", \"Pigment Indigo\"], [\"4B5D52\", \"Nandor\"], [\"4C3024\", \"Saddle\"], [\"4C4F56\", \"Abbey\"], [\"4D0135\", \"Blackberry\"], [\"4D0A18\", \"Cab Sav\"], [\"4D1E01\", \"Indian Tan\"], [\"4D282D\", \"Cowboy\"], [\"4D282E\", \"Livid Brown\"], [\"4D3833\", \"Rock\"], [\"4D3D14\", \"Punga\"], [\"4D400F\", \"Bronzetone\"], [\"4D5328\", \"Woodland\"], [\"4E0606\", \"Mahogany\"], [\"4E2A5A\", \"Bossanova\"], [\"4E3B41\", \"Matterhorn\"], [\"4E420C\", \"Bronze Olive\"], [\"4E4562\", \"Mulled Wine\"], [\"4E6649\", \"Axolotl\"], [\"4E7F9E\", \"Wedgewood\"], [\"4EABD1\", \"Shakespeare\"], [\"4F1C70\", \"Honey Flower\"], [\"4F2398\", \"Daisy Bush\"], [\"4F69C6\", \"Indigo\"], [\"4F7942\", \"Fern Green\"], [\"4F9D5D\", \"Fruit Salad\"], [\"4FA83D\", \"Apple\"], [\"504351\", \"Mortar\"], [\"507096\", \"Kashmir Blue\"], [\"507672\", \"Cutty Sark\"], [\"50C878\", \"Emerald\"], [\"514649\", \"Emperor\"], [\"516E3D\", \"Chalet Green\"], [\"517C66\", \"Como\"], [\"51808F\", \"Smalt Blue\"], [\"52001F\", \"Castro\"], [\"520C17\", \"Maroon Oak\"], [\"523C94\", \"Gigas\"], [\"533455\", \"Voodoo\"], [\"534491\", \"Victoria\"], [\"53824B\", \"Hippie Green\"], [\"541012\", \"Heath\"], [\"544333\", \"Judge Gray\"], [\"54534D\", \"Fuscous Gray\"], [\"549019\", \"Vida Loca\"], [\"55280C\", \"Cioccolato\"], [\"555B10\", \"Saratoga\"], [\"556D56\", \"Finlandia\"], [\"5590D9\", \"Havelock Blue\"], [\"56B4BE\", \"Fountain Blue\"], [\"578363\", \"Spring Leaves\"], [\"583401\", \"Saddle Brown\"], [\"585562\", \"Scarpa Flow\"], [\"587156\", \"Cactus\"], [\"589AAF\", \"Hippie Blue\"], [\"591D35\", \"Wine Berry\"], [\"592804\", \"Brown Bramble\"], [\"593737\", \"Congo Brown\"], [\"594433\", \"Millbrook\"], [\"5A6E9C\", \"Waikawa Gray\"], [\"5A87A0\", \"Horizon\"], [\"5B3013\", \"Jambalaya\"], [\"5C0120\", \"Bordeaux\"], [\"5C0536\", \"Mulberry Wood\"], [\"5C2E01\", \"Carnaby Tan\"], [\"5C5D75\", \"Comet\"], [\"5D1E0F\", \"Redwood\"], [\"5D4C51\", \"Don Juan\"], [\"5D5C58\", \"Chicago\"], [\"5D5E37\", \"Verdigris\"], [\"5D7747\", \"Dingley\"], [\"5DA19F\", \"Breaker Bay\"], [\"5E483E\", \"Kabul\"], [\"5E5D3B\", \"Hemlock\"], [\"5F3D26\", \"Irish Coffee\"], [\"5F5F6E\", \"Mid Gray\"], [\"5F6672\", \"Shuttle Gray\"], [\"5FA777\", \"Aqua Forest\"], [\"5FB3AC\", \"Tradewind\"], [\"604913\", \"Horses Neck\"], [\"605B73\", \"Smoky\"], [\"606E68\", \"Corduroy\"], [\"6093D1\", \"Danube\"], [\"612718\", \"Espresso\"], [\"614051\", \"Eggplant\"], [\"615D30\", \"Costa Del Sol\"], [\"61845F\", \"Glade Green\"], [\"622F30\", \"Buccaneer\"], [\"623F2D\", \"Quincy\"], [\"624E9A\", \"Butterfly Bush\"], [\"625119\", \"West Coast\"], [\"626649\", \"Finch\"], [\"639A8F\", \"Patina\"], [\"63B76C\", \"Fern\"], [\"6456B7\", \"Blue Violet\"], [\"646077\", \"Dolphin\"], [\"646463\", \"Storm Dust\"], [\"646A54\", \"Siam\"], [\"646E75\", \"Nevada\"], [\"6495ED\", \"Cornflower Blue\"], [\"64CCDB\", \"Viking\"], [\"65000B\", \"Rosewood\"], [\"651A14\", \"Cherrywood\"], [\"652DC1\", \"Purple Heart\"], [\"657220\", \"Fern Frond\"], [\"65745D\", \"Willow Grove\"], [\"65869F\", \"Hoki\"], [\"660045\", \"Pompadour\"], [\"660099\", \"Purple\"], [\"66023C\", \"Tyrian Purple\"], [\"661010\", \"Dark Tan\"], [\"66B58F\", \"Silver Tree\"], [\"66FF00\", \"Bright Green\"], [\"66FF66\", \"Screamin' Green\"], [\"67032D\", \"Black Rose\"], [\"675FA6\", \"Scampi\"], [\"676662\", \"Ironside Gray\"], [\"678975\", \"Viridian Green\"], [\"67A712\", \"Christi\"], [\"683600\", \"Nutmeg Wood Finish\"], [\"685558\", \"Zambezi\"], [\"685E6E\", \"Salt Box\"], [\"692545\", \"Tawny Port\"], [\"692D54\", \"Finn\"], [\"695F62\", \"Scorpion\"], [\"697E9A\", \"Lynch\"], [\"6A442E\", \"Spice\"], [\"6A5D1B\", \"Himalaya\"], [\"6A6051\", \"Soya Bean\"], [\"6B2A14\", \"Hairy Heath\"], [\"6B3FA0\", \"Royal Purple\"], [\"6B4E31\", \"Shingle Fawn\"], [\"6B5755\", \"Dorado\"], [\"6B8BA2\", \"Bermuda Gray\"], [\"6B8E23\", \"Olive Drab\"], [\"6C3082\", \"Eminence\"], [\"6CDAE7\", \"Turquoise Blue\"], [\"6D0101\", \"Lonestar\"], [\"6D5E54\", \"Pine Cone\"], [\"6D6C6C\", \"Dove Gray\"], [\"6D9292\", \"Juniper\"], [\"6D92A1\", \"Gothic\"], [\"6E0902\", \"Red Oxide\"], [\"6E1D14\", \"Moccaccino\"], [\"6E4826\", \"Pickled Bean\"], [\"6E4B26\", \"Dallas\"], [\"6E6D57\", \"Kokoda\"], [\"6E7783\", \"Pale Sky\"], [\"6F440C\", \"Cafe Royale\"], [\"6F6A61\", \"Flint\"], [\"6F8E63\", \"Highland\"], [\"6F9D02\", \"Limeade\"], [\"6FD0C5\", \"Downy\"], [\"701C1C\", \"Persian Plum\"], [\"704214\", \"Sepia\"], [\"704A07\", \"Antique Bronze\"], [\"704F50\", \"Ferra\"], [\"706555\", \"Coffee\"], [\"708090\", \"Slate Gray\"], [\"711A00\", \"Cedar Wood Finish\"], [\"71291D\", \"Metallic Copper\"], [\"714693\", \"Affair\"], [\"714AB2\", \"Studio\"], [\"715D47\", \"Tobacco Brown\"], [\"716338\", \"Yellow Metal\"], [\"716B56\", \"Peat\"], [\"716E10\", \"Olivetone\"], [\"717486\", \"Storm Gray\"], [\"718080\", \"Sirocco\"], [\"71D9E2\", \"Aquamarine Blue\"], [\"72010F\", \"Venetian Red\"], [\"724A2F\", \"Old Copper\"], [\"726D4E\", \"Go Ben\"], [\"727B89\", \"Raven\"], [\"731E8F\", \"Seance\"], [\"734A12\", \"Raw Umber\"], [\"736C9F\", \"Kimberly\"], [\"736D58\", \"Crocodile\"], [\"737829\", \"Crete\"], [\"738678\", \"Xanadu\"], [\"74640D\", \"Spicy Mustard\"], [\"747D63\", \"Limed Ash\"], [\"747D83\", \"Rolling Stone\"], [\"748881\", \"Blue Smoke\"], [\"749378\", \"Laurel\"], [\"74C365\", \"Mantis\"], [\"755A57\", \"Russett\"], [\"7563A8\", \"Deluge\"], [\"76395D\", \"Cosmic\"], [\"7666C6\", \"Blue Marguerite\"], [\"76BD17\", \"Lima\"], [\"76D7EA\", \"Sky Blue\"], [\"770F05\", \"Dark Burgundy\"], [\"771F1F\", \"Crown of Thorns\"], [\"773F1A\", \"Walnut\"], [\"776F61\", \"Pablo\"], [\"778120\", \"Pacifika\"], [\"779E86\", \"Oxley\"], [\"77DD77\", \"Pastel Green\"], [\"780109\", \"Japanese Maple\"], [\"782D19\", \"Mocha\"], [\"782F16\", \"Peanut\"], [\"78866B\", \"Camouflage Green\"], [\"788A25\", \"Wasabi\"], [\"788BBA\", \"Ship Cove\"], [\"78A39C\", \"Sea Nymph\"], [\"795D4C\", \"Roman Coffee\"], [\"796878\", \"Old Lavender\"], [\"796989\", \"Rum\"], [\"796A78\", \"Fedora\"], [\"796D62\", \"Sandstone\"], [\"79DEEC\", \"Spray\"], [\"7A013A\", \"Siren\"], [\"7A58C1\", \"Fuchsia Blue\"], [\"7A7A7A\", \"Boulder\"], [\"7A89B8\", \"Wild Blue Yonder\"], [\"7AC488\", \"De York\"], [\"7B3801\", \"Red Beech\"], [\"7B3F00\", \"Cinnamon\"], [\"7B6608\", \"Yukon Gold\"], [\"7B7874\", \"Tapa\"], [\"7B7C94\", \"Waterloo \"], [\"7B8265\", \"Flax Smoke\"], [\"7B9F80\", \"Amulet\"], [\"7BA05B\", \"Asparagus\"], [\"7C1C05\", \"Kenyan Copper\"], [\"7C7631\", \"Pesto\"], [\"7C778A\", \"Topaz\"], [\"7C7B7A\", \"Concord\"], [\"7C7B82\", \"Jumbo\"], [\"7C881A\", \"Trendy Green\"], [\"7CA1A6\", \"Gumbo\"], [\"7CB0A1\", \"Acapulco\"], [\"7CB7BB\", \"Neptune\"], [\"7D2C14\", \"Pueblo\"], [\"7DA98D\", \"Bay Leaf\"], [\"7DC8F7\", \"Malibu\"], [\"7DD8C6\", \"Bermuda\"], [\"7E3A15\", \"Copper Canyon\"], [\"7F1734\", \"Claret\"], [\"7F3A02\", \"Peru Tan\"], [\"7F626D\", \"Falcon\"], [\"7F7589\", \"Mobster\"], [\"7F76D3\", \"Moody Blue\"], [\"7FFF00\", \"Chartreuse\"], [\"7FFFD4\", \"Aquamarine\"], [\"800000\", \"Maroon\"], [\"800B47\", \"Rose Bud Cherry\"], [\"801818\", \"Falu Red\"], [\"80341F\", \"Red Robin\"], [\"803790\", \"Vivid Violet\"], [\"80461B\", \"Russet\"], [\"807E79\", \"Friar Gray\"], [\"808000\", \"Olive\"], [\"808080\", \"Gray\"], [\"80B3AE\", \"Gulf Stream\"], [\"80B3C4\", \"Glacier\"], [\"80CCEA\", \"Seagull\"], [\"81422C\", \"Nutmeg\"], [\"816E71\", \"Spicy Pink\"], [\"817377\", \"Empress\"], [\"819885\", \"Spanish Green\"], [\"826F65\", \"Sand Dune\"], [\"828685\", \"Gunsmoke\"], [\"828F72\", \"Battleship Gray\"], [\"831923\", \"Merlot\"], [\"837050\", \"Shadow\"], [\"83AA5D\", \"Chelsea Cucumber\"], [\"83D0C6\", \"Monte Carlo\"], [\"843179\", \"Plum\"], [\"84A0A0\", \"Granny Smith\"], [\"8581D9\", \"Chetwode Blue\"], [\"858470\", \"Bandicoot\"], [\"859FAF\", \"Bali Hai\"], [\"85C4CC\", \"Half Baked\"], [\"860111\", \"Red Devil\"], [\"863C3C\", \"Lotus\"], [\"86483C\", \"Ironstone\"], [\"864D1E\", \"Bull Shot\"], [\"86560A\", \"Rusty Nail\"], [\"868974\", \"Bitter\"], [\"86949F\", \"Regent Gray\"], [\"871550\", \"Disco\"], [\"87756E\", \"Americano\"], [\"877C7B\", \"Hurricane\"], [\"878D91\", \"Oslo Gray\"], [\"87AB39\", \"Sushi\"], [\"885342\", \"Spicy Mix\"], [\"886221\", \"Kumera\"], [\"888387\", \"Suva Gray\"], [\"888D65\", \"Avocado\"], [\"893456\", \"Camelot\"], [\"893843\", \"Solid Pink\"], [\"894367\", \"Cannon Pink\"], [\"897D6D\", \"Makara\"], [\"8A3324\", \"Burnt Umber\"], [\"8A73D6\", \"True V\"], [\"8A8360\", \"Clay Creek\"], [\"8A8389\", \"Monsoon\"], [\"8A8F8A\", \"Stack\"], [\"8AB9F1\", \"Jordy Blue\"], [\"8B00FF\", \"Electric Violet\"], [\"8B0723\", \"Monarch\"], [\"8B6B0B\", \"Corn Harvest\"], [\"8B8470\", \"Olive Haze\"], [\"8B847E\", \"Schooner\"], [\"8B8680\", \"Natural Gray\"], [\"8B9C90\", \"Mantle\"], [\"8B9FEE\", \"Portage\"], [\"8BA690\", \"Envy\"], [\"8BA9A5\", \"Cascade\"], [\"8BE6D8\", \"Riptide\"], [\"8C055E\", \"Cardinal Pink\"], [\"8C472F\", \"Mule Fawn\"], [\"8C5738\", \"Potters Clay\"], [\"8C6495\", \"Trendy Pink\"], [\"8D0226\", \"Paprika\"], [\"8D3D38\", \"Sanguine Brown\"], [\"8D3F3F\", \"Tosca\"], [\"8D7662\", \"Cement\"], [\"8D8974\", \"Granite Green\"], [\"8D90A1\", \"Manatee\"], [\"8DA8CC\", \"Polo Blue\"], [\"8E0000\", \"Red Berry\"], [\"8E4D1E\", \"Rope\"], [\"8E6F70\", \"Opium\"], [\"8E775E\", \"Domino\"], [\"8E8190\", \"Mamba\"], [\"8EABC1\", \"Nepal\"], [\"8F021C\", \"Pohutukawa\"], [\"8F3E33\", \"El Salva\"], [\"8F4B0E\", \"Korma\"], [\"8F8176\", \"Squirrel\"], [\"8FD6B4\", \"Vista Blue\"], [\"900020\", \"Burgundy\"], [\"901E1E\", \"Old Brick\"], [\"907874\", \"Hemp\"], [\"907B71\", \"Almond Frost\"], [\"908D39\", \"Sycamore\"], [\"92000A\", \"Sangria\"], [\"924321\", \"Cumin\"], [\"926F5B\", \"Beaver\"], [\"928573\", \"Stonewall\"], [\"928590\", \"Venus\"], [\"9370DB\", \"Medium Purple\"], [\"93CCEA\", \"Cornflower\"], [\"93DFB8\", \"Algae Green\"], [\"944747\", \"Copper Rust\"], [\"948771\", \"Arrowtown\"], [\"950015\", \"Scarlett\"], [\"956387\", \"Strikemaster\"], [\"959396\", \"Mountain Mist\"], [\"960018\", \"Carmine\"], [\"964B00\", \"Brown\"], [\"967059\", \"Leather\"], [\"9678B6\", \"Purple Mountain's Majesty\"], [\"967BB6\", \"Lavender Purple\"], [\"96A8A1\", \"Pewter\"], [\"96BBAB\", \"Summer Green\"], [\"97605D\", \"Au Chico\"], [\"9771B5\", \"Wisteria\"], [\"97CD2D\", \"Atlantis\"], [\"983D61\", \"Vin Rouge\"], [\"9874D3\", \"Lilac Bush\"], [\"98777B\", \"Bazaar\"], [\"98811B\", \"Hacienda\"], [\"988D77\", \"Pale Oyster\"], [\"98FF98\", \"Mint Green\"], [\"990066\", \"Fresh Eggplant\"], [\"991199\", \"Violet Eggplant\"], [\"991613\", \"Tamarillo\"], [\"991B07\", \"Totem Pole\"], [\"996666\", \"Copper Rose\"], [\"9966CC\", \"Amethyst\"], [\"997A8D\", \"Mountbatten Pink\"], [\"9999CC\", \"Blue Bell\"], [\"9A3820\", \"Prairie Sand\"], [\"9A6E61\", \"Toast\"], [\"9A9577\", \"Gurkha\"], [\"9AB973\", \"Olivine\"], [\"9AC2B8\", \"Shadow Green\"], [\"9B4703\", \"Oregon\"], [\"9B9E8F\", \"Lemon Grass\"], [\"9C3336\", \"Stiletto\"], [\"9D5616\", \"Hawaiian Tan\"], [\"9DACB7\", \"Gull Gray\"], [\"9DC209\", \"Pistachio\"], [\"9DE093\", \"Granny Smith Apple\"], [\"9DE5FF\", \"Anakiwa\"], [\"9E5302\", \"Chelsea Gem\"], [\"9E5B40\", \"Sepia Skin\"], [\"9EA587\", \"Sage\"], [\"9EA91F\", \"Citron\"], [\"9EB1CD\", \"Rock Blue\"], [\"9EDEE0\", \"Morning Glory\"], [\"9F381D\", \"Cognac\"], [\"9F821C\", \"Reef Gold\"], [\"9F9F9C\", \"Star Dust\"], [\"9FA0B1\", \"Santas Gray\"], [\"9FD7D3\", \"Sinbad\"], [\"9FDD8C\", \"Feijoa\"], [\"A02712\", \"Tabasco\"], [\"A1750D\", \"Buttered Rum\"], [\"A1ADB5\", \"Hit Gray\"], [\"A1C50A\", \"Citrus\"], [\"A1DAD7\", \"Aqua Island\"], [\"A1E9DE\", \"Water Leaf\"], [\"A2006D\", \"Flirt\"], [\"A23B6C\", \"Rouge\"], [\"A26645\", \"Cape Palliser\"], [\"A2AAB3\", \"Gray Chateau\"], [\"A2AEAB\", \"Edward\"], [\"A3807B\", \"Pharlap\"], [\"A397B4\", \"Amethyst Smoke\"], [\"A3E3ED\", \"Blizzard Blue\"], [\"A4A49D\", \"Delta\"], [\"A4A6D3\", \"Wistful\"], [\"A4AF6E\", \"Green Smoke\"], [\"A50B5E\", \"Jazzberry Jam\"], [\"A59B91\", \"Zorba\"], [\"A5CB0C\", \"Bahia\"], [\"A62F20\", \"Roof Terracotta\"], [\"A65529\", \"Paarl\"], [\"A68B5B\", \"Barley Corn\"], [\"A69279\", \"Donkey Brown\"], [\"A6A29A\", \"Dawn\"], [\"A72525\", \"Mexican Red\"], [\"A7882C\", \"Luxor Gold\"], [\"A85307\", \"Rich Gold\"], [\"A86515\", \"Reno Sand\"], [\"A86B6B\", \"Coral Tree\"], [\"A8989B\", \"Dusty Gray\"], [\"A899E6\", \"Dull Lavender\"], [\"A8A589\", \"Tallow\"], [\"A8AE9C\", \"Bud\"], [\"A8AF8E\", \"Locust\"], [\"A8BD9F\", \"Norway\"], [\"A8E3BD\", \"Chinook\"], [\"A9A491\", \"Gray Olive\"], [\"A9ACB6\", \"Aluminium\"], [\"A9B2C3\", \"Cadet Blue\"], [\"A9B497\", \"Schist\"], [\"A9BDBF\", \"Tower Gray\"], [\"A9BEF2\", \"Perano\"], [\"A9C6C2\", \"Opal\"], [\"AA375A\", \"Night Shadz\"], [\"AA4203\", \"Fire\"], [\"AA8B5B\", \"Muesli\"], [\"AA8D6F\", \"Sandal\"], [\"AAA5A9\", \"Shady Lady\"], [\"AAA9CD\", \"Logan\"], [\"AAABB7\", \"Spun Pearl\"], [\"AAD6E6\", \"Regent St Blue\"], [\"AAF0D1\", \"Magic Mint\"], [\"AB0563\", \"Lipstick\"], [\"AB3472\", \"Royal Heath\"], [\"AB917A\", \"Sandrift\"], [\"ABA0D9\", \"Cold Purple\"], [\"ABA196\", \"Bronco\"], [\"AC8A56\", \"Limed Oak\"], [\"AC91CE\", \"East Side\"], [\"AC9E22\", \"Lemon Ginger\"], [\"ACA494\", \"Napa\"], [\"ACA586\", \"Hillary\"], [\"ACA59F\", \"Cloudy\"], [\"ACACAC\", \"Silver Chalice\"], [\"ACB78E\", \"Swamp Green\"], [\"ACCBB1\", \"Spring Rain\"], [\"ACDD4D\", \"Conifer\"], [\"ACE1AF\", \"Celadon\"], [\"AD781B\", \"Mandalay\"], [\"ADBED1\", \"Casper\"], [\"ADDFAD\", \"Moss Green\"], [\"ADE6C4\", \"Padua\"], [\"ADFF2F\", \"Green Yellow\"], [\"AE4560\", \"Hippie Pink\"], [\"AE6020\", \"Desert\"], [\"AE809E\", \"Bouquet\"], [\"AF4035\", \"Medium Carmine\"], [\"AF4D43\", \"Apple Blossom\"], [\"AF593E\", \"Brown Rust\"], [\"AF8751\", \"Driftwood\"], [\"AF8F2C\", \"Alpine\"], [\"AF9F1C\", \"Lucky\"], [\"AFA09E\", \"Martini\"], [\"AFB1B8\", \"Bombay\"], [\"AFBDD9\", \"Pigeon Post\"], [\"B04C6A\", \"Cadillac\"], [\"B05D54\", \"Matrix\"], [\"B05E81\", \"Tapestry\"], [\"B06608\", \"Mai Tai\"], [\"B09A95\", \"Del Rio\"], [\"B0E0E6\", \"Powder Blue\"], [\"B0E313\", \"Inch Worm\"], [\"B10000\", \"Bright Red\"], [\"B14A0B\", \"Vesuvius\"], [\"B1610B\", \"Pumpkin Skin\"], [\"B16D52\", \"Santa Fe\"], [\"B19461\", \"Teak\"], [\"B1E2C1\", \"Fringy Flower\"], [\"B1F4E7\", \"Ice Cold\"], [\"B20931\", \"Shiraz\"], [\"B2A1EA\", \"Biloba Flower\"], [\"B32D29\", \"Tall Poppy\"], [\"B35213\", \"Fiery Orange\"], [\"B38007\", \"Hot Toddy\"], [\"B3AF95\", \"Taupe Gray\"], [\"B3C110\", \"La Rioja\"], [\"B43332\", \"Well Read\"], [\"B44668\", \"Blush\"], [\"B4CFD3\", \"Jungle Mist\"], [\"B57281\", \"Turkish Rose\"], [\"B57EDC\", \"Lavender\"], [\"B5A27F\", \"Mongoose\"], [\"B5B35C\", \"Olive Green\"], [\"B5D2CE\", \"Jet Stream\"], [\"B5ECDF\", \"Cruise\"], [\"B6316C\", \"Hibiscus\"], [\"B69D98\", \"Thatch\"], [\"B6B095\", \"Heathered Gray\"], [\"B6BAA4\", \"Eagle\"], [\"B6D1EA\", \"Spindle\"], [\"B6D3BF\", \"Gum Leaf\"], [\"B7410E\", \"Rust\"], [\"B78E5C\", \"Muddy Waters\"], [\"B7A214\", \"Sahara\"], [\"B7A458\", \"Husk\"], [\"B7B1B1\", \"Nobel\"], [\"B7C3D0\", \"Heather\"], [\"B7F0BE\", \"Madang\"], [\"B81104\", \"Milano Red\"], [\"B87333\", \"Copper\"], [\"B8B56A\", \"Gimblet\"], [\"B8C1B1\", \"Green Spring\"], [\"B8C25D\", \"Celery\"], [\"B8E0F9\", \"Sail\"], [\"B94E48\", \"Chestnut\"], [\"B95140\", \"Crail\"], [\"B98D28\", \"Marigold\"], [\"B9C46A\", \"Wild Willow\"], [\"B9C8AC\", \"Rainee\"], [\"BA0101\", \"Guardsman Red\"], [\"BA450C\", \"Rock Spray\"], [\"BA6F1E\", \"Bourbon\"], [\"BA7F03\", \"Pirate Gold\"], [\"BAB1A2\", \"Nomad\"], [\"BAC7C9\", \"Submarine\"], [\"BAEEF9\", \"Charlotte\"], [\"BB3385\", \"Medium Red Violet\"], [\"BB8983\", \"Brandy Rose\"], [\"BBD009\", \"Rio Grande\"], [\"BBD7C1\", \"Surf\"], [\"BCC9C2\", \"Powder Ash\"], [\"BD5E2E\", \"Tuscany\"], [\"BD978E\", \"Quicksand\"], [\"BDB1A8\", \"Silk\"], [\"BDB2A1\", \"Malta\"], [\"BDB3C7\", \"Chatelle\"], [\"BDBBD7\", \"Lavender Gray\"], [\"BDBDC6\", \"French Gray\"], [\"BDC8B3\", \"Clay Ash\"], [\"BDC9CE\", \"Loblolly\"], [\"BDEDFD\", \"French Pass\"], [\"BEA6C3\", \"London Hue\"], [\"BEB5B7\", \"Pink Swan\"], [\"BEDE0D\", \"Fuego\"], [\"BF5500\", \"Rose of Sharon\"], [\"BFB8B0\", \"Tide\"], [\"BFBED8\", \"Blue Haze\"], [\"BFC1C2\", \"Silver Sand\"], [\"BFC921\", \"Key Lime Pie\"], [\"BFDBE2\", \"Ziggurat\"], [\"BFFF00\", \"Lime\"], [\"C02B18\", \"Thunderbird\"], [\"C04737\", \"Mojo\"], [\"C08081\", \"Old Rose\"], [\"C0C0C0\", \"Silver\"], [\"C0D3B9\", \"Pale Leaf\"], [\"C0D8B6\", \"Pixie Green\"], [\"C1440E\", \"Tia Maria\"], [\"C154C1\", \"Fuchsia Pink\"], [\"C1A004\", \"Buddha Gold\"], [\"C1B7A4\", \"Bison Hide\"], [\"C1BAB0\", \"Tea\"], [\"C1BECD\", \"Gray Suit\"], [\"C1D7B0\", \"Sprout\"], [\"C1F07C\", \"Sulu\"], [\"C26B03\", \"Indochine\"], [\"C2955D\", \"Twine\"], [\"C2BDB6\", \"Cotton Seed\"], [\"C2CAC4\", \"Pumice\"], [\"C2E8E5\", \"Jagged Ice\"], [\"C32148\", \"Maroon Flush\"], [\"C3B091\", \"Indian Khaki\"], [\"C3BFC1\", \"Pale Slate\"], [\"C3C3BD\", \"Gray Nickel\"], [\"C3CDE6\", \"Periwinkle Gray\"], [\"C3D1D1\", \"Tiara\"], [\"C3DDF9\", \"Tropical Blue\"], [\"C41E3A\", \"Cardinal\"], [\"C45655\", \"Fuzzy Wuzzy Brown\"], [\"C45719\", \"Orange Roughy\"], [\"C4C4BC\", \"Mist Gray\"], [\"C4D0B0\", \"Coriander\"], [\"C4F4EB\", \"Mint Tulip\"], [\"C54B8C\", \"Mulberry\"], [\"C59922\", \"Nugget\"], [\"C5994B\", \"Tussock\"], [\"C5DBCA\", \"Sea Mist\"], [\"C5E17A\", \"Yellow Green\"], [\"C62D42\", \"Brick Red\"], [\"C6726B\", \"Contessa\"], [\"C69191\", \"Oriental Pink\"], [\"C6A84B\", \"Roti\"], [\"C6C3B5\", \"Ash\"], [\"C6C8BD\", \"Kangaroo\"], [\"C6E610\", \"Las Palmas\"], [\"C7031E\", \"Monza\"], [\"C71585\", \"Red Violet\"], [\"C7BCA2\", \"Coral Reef\"], [\"C7C1FF\", \"Melrose\"], [\"C7C4BF\", \"Cloud\"], [\"C7C9D5\", \"Ghost\"], [\"C7CD90\", \"Pine Glade\"], [\"C7DDE5\", \"Botticelli\"], [\"C88A65\", \"Antique Brass\"], [\"C8A2C8\", \"Lilac\"], [\"C8A528\", \"Hokey Pokey\"], [\"C8AABF\", \"Lily\"], [\"C8B568\", \"Laser\"], [\"C8E3D7\", \"Edgewater\"], [\"C96323\", \"Piper\"], [\"C99415\", \"Pizza\"], [\"C9A0DC\", \"Light Wisteria\"], [\"C9B29B\", \"Rodeo Dust\"], [\"C9B35B\", \"Sundance\"], [\"C9B93B\", \"Earls Green\"], [\"C9C0BB\", \"Silver Rust\"], [\"C9D9D2\", \"Conch\"], [\"C9FFA2\", \"Reef\"], [\"C9FFE5\", \"Aero Blue\"], [\"CA3435\", \"Flush Mahogany\"], [\"CABB48\", \"Turmeric\"], [\"CADCD4\", \"Paris White\"], [\"CAE00D\", \"Bitter Lemon\"], [\"CAE6DA\", \"Skeptic\"], [\"CB8FA9\", \"Viola\"], [\"CBCAB6\", \"Foggy Gray\"], [\"CBD3B0\", \"Green Mist\"], [\"CBDBD6\", \"Nebula\"], [\"CC3333\", \"Persian Red\"], [\"CC5500\", \"Burnt Orange\"], [\"CC7722\", \"Ochre\"], [\"CC8899\", \"Puce\"], [\"CCCAA8\", \"Thistle Green\"], [\"CCCCFF\", \"Periwinkle\"], [\"CCFF00\", \"Electric Lime\"], [\"CD5700\", \"Tenn\"], [\"CD5C5C\", \"Chestnut Rose\"], [\"CD8429\", \"Brandy Punch\"], [\"CDF4FF\", \"Onahau\"], [\"CEB98F\", \"Sorrell Brown\"], [\"CEBABA\", \"Cold Turkey\"], [\"CEC291\", \"Yuma\"], [\"CEC7A7\", \"Chino\"], [\"CFA39D\", \"Eunry\"], [\"CFB53B\", \"Old Gold\"], [\"CFDCCF\", \"Tasman\"], [\"CFE5D2\", \"Surf Crest\"], [\"CFF9F3\", \"Humming Bird\"], [\"CFFAF4\", \"Scandal\"], [\"D05F04\", \"Red Stage\"], [\"D06DA1\", \"Hopbush\"], [\"D07D12\", \"Meteor\"], [\"D0BEF8\", \"Perfume\"], [\"D0C0E5\", \"Prelude\"], [\"D0F0C0\", \"Tea Green\"], [\"D18F1B\", \"Geebung\"], [\"D1BEA8\", \"Vanilla\"], [\"D1C6B4\", \"Soft Amber\"], [\"D1D2CA\", \"Celeste\"], [\"D1D2DD\", \"Mischka\"], [\"D1E231\", \"Pear\"], [\"D2691E\", \"Hot Cinnamon\"], [\"D27D46\", \"Raw Sienna\"], [\"D29EAA\", \"Careys Pink\"], [\"D2B48C\", \"Tan\"], [\"D2DA97\", \"Deco\"], [\"D2F6DE\", \"Blue Romance\"], [\"D2F8B0\", \"Gossip\"], [\"D3CBBA\", \"Sisal\"], [\"D3CDC5\", \"Swirl\"], [\"D47494\", \"Charm\"], [\"D4B6AF\", \"Clam Shell\"], [\"D4BF8D\", \"Straw\"], [\"D4C4A8\", \"Akaroa\"], [\"D4CD16\", \"Bird Flower\"], [\"D4D7D9\", \"Iron\"], [\"D4DFE2\", \"Geyser\"], [\"D4E2FC\", \"Hawkes Blue\"], [\"D54600\", \"Grenadier\"], [\"D591A4\", \"Can Can\"], [\"D59A6F\", \"Whiskey\"], [\"D5D195\", \"Winter Hazel\"], [\"D5F6E3\", \"Granny Apple\"], [\"D69188\", \"My Pink\"], [\"D6C562\", \"Tacha\"], [\"D6CEF6\", \"Moon Raker\"], [\"D6D6D1\", \"Quill Gray\"], [\"D6FFDB\", \"Snowy Mint\"], [\"D7837F\", \"New York Pink\"], [\"D7C498\", \"Pavlova\"], [\"D7D0FF\", \"Fog\"], [\"D84437\", \"Valencia\"], [\"D87C63\", \"Japonica\"], [\"D8BFD8\", \"Thistle\"], [\"D8C2D5\", \"Maverick\"], [\"D8FCFA\", \"Foam\"], [\"D94972\", \"Cabaret\"], [\"D99376\", \"Burning Sand\"], [\"D9B99B\", \"Cameo\"], [\"D9D6CF\", \"Timberwolf\"], [\"D9DCC1\", \"Tana\"], [\"D9E4F5\", \"Link Water\"], [\"D9F7FF\", \"Mabel\"], [\"DA3287\", \"Cerise\"], [\"DA5B38\", \"Flame Pea\"], [\"DA6304\", \"Bamboo\"], [\"DA6A41\", \"Red Damask\"], [\"DA70D6\", \"Orchid\"], [\"DA8A67\", \"Copperfield\"], [\"DAA520\", \"Golden Grass\"], [\"DAECD6\", \"Zanah\"], [\"DAF4F0\", \"Iceberg\"], [\"DAFAFF\", \"Oyster Bay\"], [\"DB5079\", \"Cranberry\"], [\"DB9690\", \"Petite Orchid\"], [\"DB995E\", \"Di Serria\"], [\"DBDBDB\", \"Alto\"], [\"DBFFF8\", \"Frosted Mint\"], [\"DC143C\", \"Crimson\"], [\"DC4333\", \"Punch\"], [\"DCB20C\", \"Galliano\"], [\"DCB4BC\", \"Blossom\"], [\"DCD747\", \"Wattle\"], [\"DCD9D2\", \"Westar\"], [\"DCDDCC\", \"Moon Mist\"], [\"DCEDB4\", \"Caper\"], [\"DCF0EA\", \"Swans Down\"], [\"DDD6D5\", \"Swiss Coffee\"], [\"DDF9F1\", \"White Ice\"], [\"DE3163\", \"Cerise Red\"], [\"DE6360\", \"Roman\"], [\"DEA681\", \"Tumbleweed\"], [\"DEBA13\", \"Gold Tips\"], [\"DEC196\", \"Brandy\"], [\"DECBC6\", \"Wafer\"], [\"DED4A4\", \"Sapling\"], [\"DED717\", \"Barberry\"], [\"DEE5C0\", \"Beryl Green\"], [\"DEF5FF\", \"Pattens Blue\"], [\"DF73FF\", \"Heliotrope\"], [\"DFBE6F\", \"Apache\"], [\"DFCD6F\", \"Chenin\"], [\"DFCFDB\", \"Lola\"], [\"DFECDA\", \"Willow Brook\"], [\"DFFF00\", \"Chartreuse Yellow\"], [\"E0B0FF\", \"Mauve\"], [\"E0B646\", \"Anzac\"], [\"E0B974\", \"Harvest Gold\"], [\"E0C095\", \"Calico\"], [\"E0FFFF\", \"Baby Blue\"], [\"E16865\", \"Sunglo\"], [\"E1BC64\", \"Equator\"], [\"E1C0C8\", \"Pink Flare\"], [\"E1E6D6\", \"Periglacial Blue\"], [\"E1EAD4\", \"Kidnapper\"], [\"E1F6E8\", \"Tara\"], [\"E25465\", \"Mandy\"], [\"E2725B\", \"Terracotta\"], [\"E28913\", \"Golden Bell\"], [\"E292C0\", \"Shocking\"], [\"E29418\", \"Dixie\"], [\"E29CD2\", \"Light Orchid\"], [\"E2D8ED\", \"Snuff\"], [\"E2EBED\", \"Mystic\"], [\"E2F3EC\", \"Apple Green\"], [\"E30B5C\", \"Razzmatazz\"], [\"E32636\", \"Alizarin Crimson\"], [\"E34234\", \"Cinnabar\"], [\"E3BEBE\", \"Cavern Pink\"], [\"E3F5E1\", \"Peppermint\"], [\"E3F988\", \"Mindaro\"], [\"E47698\", \"Deep Blush\"], [\"E49B0F\", \"Gamboge\"], [\"E4C2D5\", \"Melanie\"], [\"E4CFDE\", \"Twilight\"], [\"E4D1C0\", \"Bone\"], [\"E4D422\", \"Sunflower\"], [\"E4D5B7\", \"Grain Brown\"], [\"E4D69B\", \"Zombie\"], [\"E4F6E7\", \"Frostee\"], [\"E4FFD1\", \"Snow Flurry\"], [\"E52B50\", \"Amaranth\"], [\"E5841B\", \"Zest\"], [\"E5CCC9\", \"Dust Storm\"], [\"E5D7BD\", \"Stark White\"], [\"E5D8AF\", \"Hampton\"], [\"E5E0E1\", \"Bon Jour\"], [\"E5E5E5\", \"Mercury\"], [\"E5F9F6\", \"Polar\"], [\"E64E03\", \"Trinidad\"], [\"E6BE8A\", \"Gold Sand\"], [\"E6BEA5\", \"Cashmere\"], [\"E6D7B9\", \"Double Spanish White\"], [\"E6E4D4\", \"Satin Linen\"], [\"E6F2EA\", \"Harp\"], [\"E6F8F3\", \"Off Green\"], [\"E6FFE9\", \"Hint of Green\"], [\"E6FFFF\", \"Tranquil\"], [\"E77200\", \"Mango Tango\"], [\"E7730A\", \"Christine\"], [\"E79F8C\", \"Tonys Pink\"], [\"E79FC4\", \"Kobi\"], [\"E7BCB4\", \"Rose Fog\"], [\"E7BF05\", \"Corn\"], [\"E7CD8C\", \"Putty\"], [\"E7ECE6\", \"Gray Nurse\"], [\"E7F8FF\", \"Lily White\"], [\"E7FEFF\", \"Bubbles\"], [\"E89928\", \"Fire Bush\"], [\"E8B9B3\", \"Shilo\"], [\"E8E0D5\", \"Pearl Bush\"], [\"E8EBE0\", \"Green White\"], [\"E8F1D4\", \"Chrome White\"], [\"E8F2EB\", \"Gin\"], [\"E8F5F2\", \"Aqua Squeeze\"], [\"E96E00\", \"Clementine\"], [\"E97451\", \"Burnt Sienna\"], [\"E97C07\", \"Tahiti Gold\"], [\"E9CECD\", \"Oyster Pink\"], [\"E9D75A\", \"Confetti\"], [\"E9E3E3\", \"Ebb\"], [\"E9F8ED\", \"Ottoman\"], [\"E9FFFD\", \"Clear Day\"], [\"EA88A8\", \"Carissma\"], [\"EAAE69\", \"Porsche\"], [\"EAB33B\", \"Tulip Tree\"], [\"EAC674\", \"Rob Roy\"], [\"EADAB8\", \"Raffia\"], [\"EAE8D4\", \"White Rock\"], [\"EAF6EE\", \"Panache\"], [\"EAF6FF\", \"Solitude\"], [\"EAF9F5\", \"Aqua Spring\"], [\"EAFFFE\", \"Dew\"], [\"EB9373\", \"Apricot\"], [\"EBC2AF\", \"Zinnwaldite\"], [\"ECA927\", \"Fuel Yellow\"], [\"ECC54E\", \"Ronchi\"], [\"ECC7EE\", \"French Lilac\"], [\"ECCDB9\", \"Just Right\"], [\"ECE090\", \"Wild Rice\"], [\"ECEBBD\", \"Fall Green\"], [\"ECEBCE\", \"Aths Special\"], [\"ECF245\", \"Starship\"], [\"ED0A3F\", \"Red Ribbon\"], [\"ED7A1C\", \"Tango\"], [\"ED9121\", \"Carrot Orange\"], [\"ED989E\", \"Sea Pink\"], [\"EDB381\", \"Tacao\"], [\"EDC9AF\", \"Desert Sand\"], [\"EDCDAB\", \"Pancho\"], [\"EDDCB1\", \"Chamois\"], [\"EDEA99\", \"Primrose\"], [\"EDF5DD\", \"Frost\"], [\"EDF5F5\", \"Aqua Haze\"], [\"EDF6FF\", \"Zumthor\"], [\"EDF9F1\", \"Narvik\"], [\"EDFC84\", \"Honeysuckle\"], [\"EE82EE\", \"Lavender Magenta\"], [\"EEC1BE\", \"Beauty Bush\"], [\"EED794\", \"Chalky\"], [\"EED9C4\", \"Almond\"], [\"EEDC82\", \"Flax\"], [\"EEDEDA\", \"Bizarre\"], [\"EEE3AD\", \"Double Colonial White\"], [\"EEEEE8\", \"Cararra\"], [\"EEEF78\", \"Manz\"], [\"EEF0C8\", \"Tahuna Sands\"], [\"EEF0F3\", \"Athens Gray\"], [\"EEF3C3\", \"Tusk\"], [\"EEF4DE\", \"Loafer\"], [\"EEF6F7\", \"Catskill White\"], [\"EEFDFF\", \"Twilight Blue\"], [\"EEFF9A\", \"Jonquil\"], [\"EEFFE2\", \"Rice Flower\"], [\"EF863F\", \"Jaffa\"], [\"EFEFEF\", \"Gallery\"], [\"EFF2F3\", \"Porcelain\"], [\"F091A9\", \"Mauvelous\"], [\"F0D52D\", \"Golden Dream\"], [\"F0DB7D\", \"Golden Sand\"], [\"F0DC82\", \"Buff\"], [\"F0E2EC\", \"Prim\"], [\"F0E68C\", \"Khaki\"], [\"F0EEFD\", \"Selago\"], [\"F0EEFF\", \"Titan White\"], [\"F0F8FF\", \"Alice Blue\"], [\"F0FCEA\", \"Feta\"], [\"F18200\", \"Gold Drop\"], [\"F19BAB\", \"Wewak\"], [\"F1E788\", \"Sahara Sand\"], [\"F1E9D2\", \"Parchment\"], [\"F1E9FF\", \"Blue Chalk\"], [\"F1EEC1\", \"Mint Julep\"], [\"F1F1F1\", \"Seashell\"], [\"F1F7F2\", \"Saltpan\"], [\"F1FFAD\", \"Tidal\"], [\"F1FFC8\", \"Chiffon\"], [\"F2552A\", \"Flamingo\"], [\"F28500\", \"Tangerine\"], [\"F2C3B2\", \"Mandys Pink\"], [\"F2F2F2\", \"Concrete\"], [\"F2FAFA\", \"Black Squeeze\"], [\"F34723\", \"Pomegranate\"], [\"F3AD16\", \"Buttercup\"], [\"F3D69D\", \"New Orleans\"], [\"F3D9DF\", \"Vanilla Ice\"], [\"F3E7BB\", \"Sidecar\"], [\"F3E9E5\", \"Dawn Pink\"], [\"F3EDCF\", \"Wheatfield\"], [\"F3FB62\", \"Canary\"], [\"F3FBD4\", \"Orinoco\"], [\"F3FFD8\", \"Carla\"], [\"F400A1\", \"Hollywood Cerise\"], [\"F4A460\", \"Sandy brown\"], [\"F4C430\", \"Saffron\"], [\"F4D81C\", \"Ripe Lemon\"], [\"F4EBD3\", \"Janna\"], [\"F4F2EE\", \"Pampas\"], [\"F4F4F4\", \"Wild Sand\"], [\"F4F8FF\", \"Zircon\"], [\"F57584\", \"Froly\"], [\"F5C85C\", \"Cream Can\"], [\"F5C999\", \"Manhattan\"], [\"F5D5A0\", \"Maize\"], [\"F5DEB3\", \"Wheat\"], [\"F5E7A2\", \"Sandwisp\"], [\"F5E7E2\", \"Pot Pourri\"], [\"F5E9D3\", \"Albescent White\"], [\"F5EDEF\", \"Soft Peach\"], [\"F5F3E5\", \"Ecru White\"], [\"F5F5DC\", \"Beige\"], [\"F5FB3D\", \"Golden Fizz\"], [\"F5FFBE\", \"Australian Mint\"], [\"F64A8A\", \"French Rose\"], [\"F653A6\", \"Brilliant Rose\"], [\"F6A4C9\", \"Illusion\"], [\"F6F0E6\", \"Merino\"], [\"F6F7F7\", \"Black Haze\"], [\"F6FFDC\", \"Spring Sun\"], [\"F7468A\", \"Violet Red\"], [\"F77703\", \"Chilean Fire\"], [\"F77FBE\", \"Persian Pink\"], [\"F7B668\", \"Rajah\"], [\"F7C8DA\", \"Azalea\"], [\"F7DBE6\", \"We Peep\"], [\"F7F2E1\", \"Quarter Spanish White\"], [\"F7F5FA\", \"Whisper\"], [\"F7FAF7\", \"Snow Drift\"], [\"F8B853\", \"Casablanca\"], [\"F8C3DF\", \"Chantilly\"], [\"F8D9E9\", \"Cherub\"], [\"F8DB9D\", \"Marzipan\"], [\"F8DD5C\", \"Energy Yellow\"], [\"F8E4BF\", \"Givry\"], [\"F8F0E8\", \"White Linen\"], [\"F8F4FF\", \"Magnolia\"], [\"F8F6F1\", \"Spring Wood\"], [\"F8F7DC\", \"Coconut Cream\"], [\"F8F7FC\", \"White Lilac\"], [\"F8F8F7\", \"Desert Storm\"], [\"F8F99C\", \"Texas\"], [\"F8FACD\", \"Corn Field\"], [\"F8FDD3\", \"Mimosa\"], [\"F95A61\", \"Carnation\"], [\"F9BF58\", \"Saffron Mango\"], [\"F9E0ED\", \"Carousel Pink\"], [\"F9E4BC\", \"Dairy Cream\"], [\"F9E663\", \"Portica\"], [\"F9E6F4\", \"Underage Pink\"], [\"F9EAF3\", \"Amour\"], [\"F9F8E4\", \"Rum Swizzle\"], [\"F9FF8B\", \"Dolly\"], [\"F9FFF6\", \"Sugar Cane\"], [\"FA7814\", \"Ecstasy\"], [\"FA9D5A\", \"Tan Hide\"], [\"FAD3A2\", \"Corvette\"], [\"FADFAD\", \"Peach Yellow\"], [\"FAE600\", \"Turbo\"], [\"FAEAB9\", \"Astra\"], [\"FAECCC\", \"Champagne\"], [\"FAF0E6\", \"Linen\"], [\"FAF3F0\", \"Fantasy\"], [\"FAF7D6\", \"Citrine White\"], [\"FAFAFA\", \"Alabaster\"], [\"FAFDE4\", \"Hint of Yellow\"], [\"FAFFA4\", \"Milan\"], [\"FB607F\", \"Brink Pink\"], [\"FB8989\", \"Geraldine\"], [\"FBA0E3\", \"Lavender Rose\"], [\"FBA129\", \"Sea Buckthorn\"], [\"FBAC13\", \"Sun\"], [\"FBAED2\", \"Lavender Pink\"], [\"FBB2A3\", \"Rose Bud\"], [\"FBBEDA\", \"Cupid\"], [\"FBCCE7\", \"Classic Rose\"], [\"FBCEB1\", \"Apricot Peach\"], [\"FBE7B2\", \"Banana Mania\"], [\"FBE870\", \"Marigold Yellow\"], [\"FBE96C\", \"Festival\"], [\"FBEA8C\", \"Sweet Corn\"], [\"FBEC5D\", \"Candy Corn\"], [\"FBF9F9\", \"Hint of Red\"], [\"FBFFBA\", \"Shalimar\"], [\"FC0FC0\", \"Shocking Pink\"], [\"FC80A5\", \"Tickle Me Pink\"], [\"FC9C1D\", \"Tree Poppy\"], [\"FCC01E\", \"Lightning Yellow\"], [\"FCD667\", \"Goldenrod\"], [\"FCD917\", \"Candlelight\"], [\"FCDA98\", \"Cherokee\"], [\"FCF4D0\", \"Double Pearl Lusta\"], [\"FCF4DC\", \"Pearl Lusta\"], [\"FCF8F7\", \"Vista White\"], [\"FCFBF3\", \"Bianca\"], [\"FCFEDA\", \"Moon Glow\"], [\"FCFFE7\", \"China Ivory\"], [\"FCFFF9\", \"Ceramic\"], [\"FD0E35\", \"Torch Red\"], [\"FD5B78\", \"Wild Watermelon\"], [\"FD7B33\", \"Crusta\"], [\"FD7C07\", \"Sorbus\"], [\"FD9FA2\", \"Sweet Pink\"], [\"FDD5B1\", \"Light Apricot\"], [\"FDD7E4\", \"Pig Pink\"], [\"FDE1DC\", \"Cinderella\"], [\"FDE295\", \"Golden Glow\"], [\"FDE910\", \"Lemon\"], [\"FDF5E6\", \"Old Lace\"], [\"FDF6D3\", \"Half Colonial White\"], [\"FDF7AD\", \"Drover\"], [\"FDFEB8\", \"Pale Prim\"], [\"FDFFD5\", \"Cumulus\"], [\"FE28A2\", \"Persian Rose\"], [\"FE4C40\", \"Sunset Orange\"], [\"FE6F5E\", \"Bittersweet\"], [\"FE9D04\", \"California\"], [\"FEA904\", \"Yellow Sea\"], [\"FEBAAD\", \"Melon\"], [\"FED33C\", \"Bright Sun\"], [\"FED85D\", \"Dandelion\"], [\"FEDB8D\", \"Salomie\"], [\"FEE5AC\", \"Cape Honey\"], [\"FEEBF3\", \"Remy\"], [\"FEEFCE\", \"Oasis\"], [\"FEF0EC\", \"Bridesmaid\"], [\"FEF2C7\", \"Beeswax\"], [\"FEF3D8\", \"Bleach White\"], [\"FEF4CC\", \"Pipi\"], [\"FEF4DB\", \"Half Spanish White\"], [\"FEF4F8\", \"Wisp Pink\"], [\"FEF5F1\", \"Provincial Pink\"], [\"FEF7DE\", \"Half Dutch White\"], [\"FEF8E2\", \"Solitaire\"], [\"FEF8FF\", \"White Pointer\"], [\"FEF9E3\", \"Off Yellow\"], [\"FEFCED\", \"Orange White\"], [\"FF0000\", \"Red\"], [\"FF007F\", \"Rose\"], [\"FF00CC\", \"Purple Pizzazz\"], [\"FF00FF\", \"Magenta / Fuchsia\"], [\"FF2400\", \"Scarlet\"], [\"FF3399\", \"Wild Strawberry\"], [\"FF33CC\", \"Razzle Dazzle Rose\"], [\"FF355E\", \"Radical Red\"], [\"FF3F34\", \"Red Orange\"], [\"FF4040\", \"Coral Red\"], [\"FF4D00\", \"Vermilion\"], [\"FF4F00\", \"International Orange\"], [\"FF6037\", \"Outrageous Orange\"], [\"FF6600\", \"Blaze Orange\"], [\"FF66FF\", \"Pink Flamingo\"], [\"FF681F\", \"Orange\"], [\"FF69B4\", \"Hot Pink\"], [\"FF6B53\", \"Persimmon\"], [\"FF6FFF\", \"Blush Pink\"], [\"FF7034\", \"Burning Orange\"], [\"FF7518\", \"Pumpkin\"], [\"FF7D07\", \"Flamenco\"], [\"FF7F00\", \"Flush Orange\"], [\"FF7F50\", \"Coral\"], [\"FF8C69\", \"Salmon\"], [\"FF9000\", \"Pizazz\"], [\"FF910F\", \"West Side\"], [\"FF91A4\", \"Pink Salmon\"], [\"FF9933\", \"Neon Carrot\"], [\"FF9966\", \"Atomic Tangerine\"], [\"FF9980\", \"Vivid Tangerine\"], [\"FF9E2C\", \"Sunshade\"], [\"FFA000\", \"Orange Peel\"], [\"FFA194\", \"Mona Lisa\"], [\"FFA500\", \"Web Orange\"], [\"FFA6C9\", \"Carnation Pink\"], [\"FFAB81\", \"Hit Pink\"], [\"FFAE42\", \"Yellow Orange\"], [\"FFB0AC\", \"Cornflower Lilac\"], [\"FFB1B3\", \"Sundown\"], [\"FFB31F\", \"My Sin\"], [\"FFB555\", \"Texas Rose\"], [\"FFB7D5\", \"Cotton Candy\"], [\"FFB97B\", \"Macaroni and Cheese\"], [\"FFBA00\", \"Selective Yellow\"], [\"FFBD5F\", \"Koromiko\"], [\"FFBF00\", \"Amber\"], [\"FFC0A8\", \"Wax Flower\"], [\"FFC0CB\", \"Pink\"], [\"FFC3C0\", \"Your Pink\"], [\"FFC901\", \"Supernova\"], [\"FFCBA4\", \"Flesh\"], [\"FFCC33\", \"Sunglow\"], [\"FFCC5C\", \"Golden Tainoi\"], [\"FFCC99\", \"Peach Orange\"], [\"FFCD8C\", \"Chardonnay\"], [\"FFD1DC\", \"Pastel Pink\"], [\"FFD2B7\", \"Romantic\"], [\"FFD38C\", \"Grandis\"], [\"FFD700\", \"Gold\"], [\"FFD800\", \"School bus Yellow\"], [\"FFD8D9\", \"Cosmos\"], [\"FFDB58\", \"Mustard\"], [\"FFDCD6\", \"Peach Schnapps\"], [\"FFDDAF\", \"Caramel\"], [\"FFDDCD\", \"Tuft Bush\"], [\"FFDDCF\", \"Watusi\"], [\"FFDDF4\", \"Pink Lace\"], [\"FFDEAD\", \"Navajo White\"], [\"FFDEB3\", \"Frangipani\"], [\"FFE1DF\", \"Pippin\"], [\"FFE1F2\", \"Pale Rose\"], [\"FFE2C5\", \"Negroni\"], [\"FFE5A0\", \"Cream Brulee\"], [\"FFE5B4\", \"Peach\"], [\"FFE6C7\", \"Tequila\"], [\"FFE772\", \"Kournikova\"], [\"FFEAC8\", \"Sandy Beach\"], [\"FFEAD4\", \"Karry\"], [\"FFEC13\", \"Broom\"], [\"FFEDBC\", \"Colonial White\"], [\"FFEED8\", \"Derby\"], [\"FFEFA1\", \"Vis Vis\"], [\"FFEFC1\", \"Egg White\"], [\"FFEFD5\", \"Papaya Whip\"], [\"FFEFEC\", \"Fair Pink\"], [\"FFF0DB\", \"Peach Cream\"], [\"FFF0F5\", \"Lavender blush\"], [\"FFF14F\", \"Gorse\"], [\"FFF1B5\", \"Buttermilk\"], [\"FFF1D8\", \"Pink Lady\"], [\"FFF1EE\", \"Forget Me Not\"], [\"FFF1F9\", \"Tutu\"], [\"FFF39D\", \"Picasso\"], [\"FFF3F1\", \"Chardon\"], [\"FFF46E\", \"Paris Daisy\"], [\"FFF4CE\", \"Barley White\"], [\"FFF4DD\", \"Egg Sour\"], [\"FFF4E0\", \"Sazerac\"], [\"FFF4E8\", \"Serenade\"], [\"FFF4F3\", \"Chablis\"], [\"FFF5EE\", \"Seashell Peach\"], [\"FFF5F3\", \"Sauvignon\"], [\"FFF6D4\", \"Milk Punch\"], [\"FFF6DF\", \"Varden\"], [\"FFF6F5\", \"Rose White\"], [\"FFF8D1\", \"Baja White\"], [\"FFF9E2\", \"Gin Fizz\"], [\"FFF9E6\", \"Early Dawn\"], [\"FFFACD\", \"Lemon Chiffon\"], [\"FFFAF4\", \"Bridal Heath\"], [\"FFFBDC\", \"Scotch Mist\"], [\"FFFBF9\", \"Soapstone\"], [\"FFFC99\", \"Witch Haze\"], [\"FFFCEA\", \"Buttery White\"], [\"FFFCEE\", \"Island Spice\"], [\"FFFDD0\", \"Cream\"], [\"FFFDE6\", \"Chilean Heath\"], [\"FFFDE8\", \"Travertine\"], [\"FFFDF3\", \"Orchid White\"], [\"FFFDF4\", \"Quarter Pearl Lusta\"], [\"FFFEE1\", \"Half and Half\"], [\"FFFEEC\", \"Apricot White\"], [\"FFFEF0\", \"Rice Cake\"], [\"FFFEF6\", \"Black White\"], [\"FFFEFD\", \"Romance\"], [\"FFFF00\", \"Yellow\"], [\"FFFF66\", \"Laser Lemon\"], [\"FFFF99\", \"Pale Canary\"], [\"FFFFB4\", \"Portafino\"], [\"FFFFF0\", \"Ivory\"], [\"FFFFFF\", \"White\"], [\"acc2d9\", \"cloudy blue\"], [\"56ae57\", \"dark pastel green\"], [\"b2996e\", \"dust\"], [\"a8ff04\", \"electric lime\"], [\"69d84f\", \"fresh green\"], [\"894585\", \"light eggplant\"], [\"70b23f\", \"nasty green\"], [\"d4ffff\", \"really light blue\"], [\"65ab7c\", \"tea\"], [\"952e8f\", \"warm purple\"], [\"fcfc81\", \"yellowish tan\"], [\"a5a391\", \"cement\"], [\"388004\", \"dark grass green\"], [\"4c9085\", \"dusty teal\"], [\"5e9b8a\", \"grey teal\"], [\"efb435\", \"macaroni and cheese\"], [\"d99b82\", \"pinkish tan\"], [\"0a5f38\", \"spruce\"], [\"0c06f7\", \"strong blue\"], [\"61de2a\", \"toxic green\"], [\"3778bf\", \"windows blue\"], [\"2242c7\", \"blue blue\"], [\"533cc6\", \"blue with a hint of purple\"], [\"9bb53c\", \"booger\"], [\"05ffa6\", \"bright sea green\"], [\"1f6357\", \"dark green blue\"], [\"017374\", \"deep turquoise\"], [\"0cb577\", \"green teal\"], [\"ff0789\", \"strong pink\"], [\"afa88b\", \"bland\"], [\"08787f\", \"deep aqua\"], [\"dd85d7\", \"lavender pink\"], [\"a6c875\", \"light moss green\"], [\"a7ffb5\", \"light seafoam green\"], [\"c2b709\", \"olive yellow\"], [\"e78ea5\", \"pig pink\"], [\"966ebd\", \"deep lilac\"], [\"ccad60\", \"desert\"], [\"ac86a8\", \"dusty lavender\"], [\"947e94\", \"purpley grey\"], [\"983fb2\", \"purply\"], [\"ff63e9\", \"candy pink\"], [\"b2fba5\", \"light pastel green\"], [\"63b365\", \"boring green\"], [\"8ee53f\", \"kiwi green\"], [\"b7e1a1\", \"light grey green\"], [\"ff6f52\", \"orange pink\"], [\"bdf8a3\", \"tea green\"], [\"d3b683\", \"very light brown\"], [\"fffcc4\", \"egg shell\"], [\"430541\", \"eggplant purple\"], [\"ffb2d0\", \"powder pink\"], [\"997570\", \"reddish grey\"], [\"ad900d\", \"baby shit brown\"], [\"c48efd\", \"liliac\"], [\"507b9c\", \"stormy blue\"], [\"7d7103\", \"ugly brown\"], [\"fffd78\", \"custard\"], [\"da467d\", \"darkish pink\"], [\"410200\", \"deep brown\"], [\"c9d179\", \"greenish beige\"], [\"fffa86\", \"manilla\"], [\"5684ae\", \"off blue\"], [\"6b7c85\", \"battleship grey\"], [\"6f6c0a\", \"browny green\"], [\"7e4071\", \"bruise\"], [\"009337\", \"kelley green\"], [\"d0e429\", \"sickly yellow\"], [\"fff917\", \"sunny yellow\"], [\"1d5dec\", \"azul\"], [\"054907\", \"darkgreen\"], [\"b5ce08\", \"green/yellow\"], [\"8fb67b\", \"lichen\"], [\"c8ffb0\", \"light light green\"], [\"fdde6c\", \"pale gold\"], [\"ffdf22\", \"sun yellow\"], [\"a9be70\", \"tan green\"], [\"6832e3\", \"burple\"], [\"fdb147\", \"butterscotch\"], [\"c7ac7d\", \"toupe\"], [\"fff39a\", \"dark cream\"], [\"850e04\", \"indian red\"], [\"efc0fe\", \"light lavendar\"], [\"40fd14\", \"poison green\"], [\"b6c406\", \"baby puke green\"], [\"9dff00\", \"bright yellow green\"], [\"3c4142\", \"charcoal grey\"], [\"f2ab15\", \"squash\"], [\"ac4f06\", \"cinnamon\"], [\"c4fe82\", \"light pea green\"], [\"2cfa1f\", \"radioactive green\"], [\"9a6200\", \"raw sienna\"], [\"ca9bf7\", \"baby purple\"], [\"875f42\", \"cocoa\"], [\"3a2efe\", \"light royal blue\"], [\"fd8d49\", \"orangeish\"], [\"8b3103\", \"rust brown\"], [\"cba560\", \"sand brown\"], [\"698339\", \"swamp\"], [\"0cdc73\", \"tealish green\"], [\"b75203\", \"burnt siena\"], [\"7f8f4e\", \"camo\"], [\"26538d\", \"dusk blue\"], [\"63a950\", \"fern\"], [\"c87f89\", \"old rose\"], [\"b1fc99\", \"pale light green\"], [\"ff9a8a\", \"peachy pink\"], [\"f6688e\", \"rosy pink\"], [\"76fda8\", \"light bluish green\"], [\"53fe5c\", \"light bright green\"], [\"4efd54\", \"light neon green\"], [\"a0febf\", \"light seafoam\"], [\"7bf2da\", \"tiffany blue\"], [\"bcf5a6\", \"washed out green\"], [\"ca6b02\", \"browny orange\"], [\"107ab0\", \"nice blue\"], [\"2138ab\", \"sapphire\"], [\"719f91\", \"greyish teal\"], [\"fdb915\", \"orangey yellow\"], [\"fefcaf\", \"parchment\"], [\"fcf679\", \"straw\"], [\"1d0200\", \"very dark brown\"], [\"cb6843\", \"terracota\"], [\"31668a\", \"ugly blue\"], [\"247afd\", \"clear blue\"], [\"ffffb6\", \"creme\"], [\"90fda9\", \"foam green\"], [\"86a17d\", \"grey/green\"], [\"fddc5c\", \"light gold\"], [\"78d1b6\", \"seafoam blue\"], [\"13bbaf\", \"topaz\"], [\"fb5ffc\", \"violet pink\"], [\"20f986\", \"wintergreen\"], [\"ffe36e\", \"yellow tan\"], [\"9d0759\", \"dark fuchsia\"], [\"3a18b1\", \"indigo blue\"], [\"c2ff89\", \"light yellowish green\"], [\"d767ad\", \"pale magenta\"], [\"720058\", \"rich purple\"], [\"ffda03\", \"sunflower yellow\"], [\"01c08d\", \"green/blue\"], [\"ac7434\", \"leather\"], [\"014600\", \"racing green\"], [\"9900fa\", \"vivid purple\"], [\"02066f\", \"dark royal blue\"], [\"8e7618\", \"hazel\"], [\"d1768f\", \"muted pink\"], [\"96b403\", \"booger green\"], [\"fdff63\", \"canary\"], [\"95a3a6\", \"cool grey\"], [\"7f684e\", \"dark taupe\"], [\"751973\", \"darkish purple\"], [\"089404\", \"true green\"], [\"ff6163\", \"coral pink\"], [\"598556\", \"dark sage\"], [\"214761\", \"dark slate blue\"], [\"3c73a8\", \"flat blue\"], [\"ba9e88\", \"mushroom\"], [\"021bf9\", \"rich blue\"], [\"734a65\", \"dirty purple\"], [\"23c48b\", \"greenblue\"], [\"8fae22\", \"icky green\"], [\"e6f2a2\", \"light khaki\"], [\"4b57db\", \"warm blue\"], [\"d90166\", \"dark hot pink\"], [\"015482\", \"deep sea blue\"], [\"9d0216\", \"carmine\"], [\"728f02\", \"dark yellow green\"], [\"ffe5ad\", \"pale peach\"], [\"4e0550\", \"plum purple\"], [\"f9bc08\", \"golden rod\"], [\"ff073a\", \"neon red\"], [\"c77986\", \"old pink\"], [\"d6fffe\", \"very pale blue\"], [\"fe4b03\", \"blood orange\"], [\"fd5956\", \"grapefruit\"], [\"fce166\", \"sand yellow\"], [\"b2713d\", \"clay brown\"], [\"1f3b4d\", \"dark blue grey\"], [\"699d4c\", \"flat green\"], [\"56fca2\", \"light green blue\"], [\"fb5581\", \"warm pink\"], [\"3e82fc\", \"dodger blue\"], [\"a0bf16\", \"gross green\"], [\"d6fffa\", \"ice\"], [\"4f738e\", \"metallic blue\"], [\"ffb19a\", \"pale salmon\"], [\"5c8b15\", \"sap green\"], [\"54ac68\", \"algae\"], [\"89a0b0\", \"bluey grey\"], [\"7ea07a\", \"greeny grey\"], [\"1bfc06\", \"highlighter green\"], [\"cafffb\", \"light light blue\"], [\"b6ffbb\", \"light mint\"], [\"a75e09\", \"raw umber\"], [\"152eff\", \"vivid blue\"], [\"8d5eb7\", \"deep lavender\"], [\"5f9e8f\", \"dull teal\"], [\"63f7b4\", \"light greenish blue\"], [\"606602\", \"mud green\"], [\"fc86aa\", \"pinky\"], [\"8c0034\", \"red wine\"], [\"758000\", \"shit green\"], [\"ab7e4c\", \"tan brown\"], [\"030764\", \"darkblue\"], [\"fe86a4\", \"rosa\"], [\"d5174e\", \"lipstick\"], [\"fed0fc\", \"pale mauve\"], [\"680018\", \"claret\"], [\"fedf08\", \"dandelion\"], [\"fe420f\", \"orangered\"], [\"6f7c00\", \"poop green\"], [\"ca0147\", \"ruby\"], [\"1b2431\", \"dark\"], [\"00fbb0\", \"greenish turquoise\"], [\"db5856\", \"pastel red\"], [\"ddd618\", \"piss yellow\"], [\"41fdfe\", \"bright cyan\"], [\"cf524e\", \"dark coral\"], [\"21c36f\", \"algae green\"], [\"a90308\", \"darkish red\"], [\"6e1005\", \"reddy brown\"], [\"fe828c\", \"blush pink\"], [\"4b6113\", \"camouflage green\"], [\"4da409\", \"lawn green\"], [\"beae8a\", \"putty\"], [\"0339f8\", \"vibrant blue\"], [\"a88f59\", \"dark sand\"], [\"5d21d0\", \"purple/blue\"], [\"feb209\", \"saffron\"], [\"4e518b\", \"twilight\"], [\"964e02\", \"warm brown\"], [\"85a3b2\", \"bluegrey\"], [\"ff69af\", \"bubble gum pink\"], [\"c3fbf4\", \"duck egg blue\"], [\"2afeb7\", \"greenish cyan\"], [\"005f6a\", \"petrol\"], [\"0c1793\", \"royal\"], [\"ffff81\", \"butter\"], [\"f0833a\", \"dusty orange\"], [\"f1f33f\", \"off yellow\"], [\"b1d27b\", \"pale olive green\"], [\"fc824a\", \"orangish\"], [\"71aa34\", \"leaf\"], [\"b7c9e2\", \"light blue grey\"], [\"4b0101\", \"dried blood\"], [\"a552e6\", \"lightish purple\"], [\"af2f0d\", \"rusty red\"], [\"8b88f8\", \"lavender blue\"], [\"9af764\", \"light grass green\"], [\"a6fbb2\", \"light mint green\"], [\"ffc512\", \"sunflower\"], [\"750851\", \"velvet\"], [\"c14a09\", \"brick orange\"], [\"fe2f4a\", \"lightish red\"], [\"0203e2\", \"pure blue\"], [\"0a437a\", \"twilight blue\"], [\"a50055\", \"violet red\"], [\"ae8b0c\", \"yellowy brown\"], [\"fd798f\", \"carnation\"], [\"bfac05\", \"muddy yellow\"], [\"3eaf76\", \"dark seafoam green\"], [\"c74767\", \"deep rose\"], [\"b9484e\", \"dusty red\"], [\"647d8e\", \"grey/blue\"], [\"bffe28\", \"lemon lime\"], [\"d725de\", \"purple/pink\"], [\"b29705\", \"brown yellow\"], [\"673a3f\", \"purple brown\"], [\"a87dc2\", \"wisteria\"], [\"fafe4b\", \"banana yellow\"], [\"c0022f\", \"lipstick red\"], [\"0e87cc\", \"water blue\"], [\"8d8468\", \"brown grey\"], [\"ad03de\", \"vibrant purple\"], [\"8cff9e\", \"baby green\"], [\"94ac02\", \"barf green\"], [\"c4fff7\", \"eggshell blue\"], [\"fdee73\", \"sandy yellow\"], [\"33b864\", \"cool green\"], [\"fff9d0\", \"pale\"], [\"758da3\", \"blue/grey\"], [\"f504c9\", \"hot magenta\"], [\"77a1b5\", \"greyblue\"], [\"8756e4\", \"purpley\"], [\"889717\", \"baby shit green\"], [\"c27e79\", \"brownish pink\"], [\"017371\", \"dark aquamarine\"], [\"9f8303\", \"diarrhea\"], [\"f7d560\", \"light mustard\"], [\"bdf6fe\", \"pale sky blue\"], [\"75b84f\", \"turtle green\"], [\"9cbb04\", \"bright olive\"], [\"29465b\", \"dark grey blue\"], [\"696006\", \"greeny brown\"], [\"adf802\", \"lemon green\"], [\"c1c6fc\", \"light periwinkle\"], [\"35ad6b\", \"seaweed green\"], [\"fffd37\", \"sunshine yellow\"], [\"a442a0\", \"ugly purple\"], [\"f36196\", \"medium pink\"], [\"947706\", \"puke brown\"], [\"fff4f2\", \"very light pink\"], [\"1e9167\", \"viridian\"], [\"b5c306\", \"bile\"], [\"feff7f\", \"faded yellow\"], [\"cffdbc\", \"very pale green\"], [\"0add08\", \"vibrant green\"], [\"87fd05\", \"bright lime\"], [\"1ef876\", \"spearmint\"], [\"7bfdc7\", \"light aquamarine\"], [\"bcecac\", \"light sage\"], [\"bbf90f\", \"yellowgreen\"], [\"ab9004\", \"baby poo\"], [\"1fb57a\", \"dark seafoam\"], [\"00555a\", \"deep teal\"], [\"a484ac\", \"heather\"], [\"c45508\", \"rust orange\"], [\"3f829d\", \"dirty blue\"], [\"548d44\", \"fern green\"], [\"c95efb\", \"bright lilac\"], [\"3ae57f\", \"weird green\"], [\"016795\", \"peacock blue\"], [\"87a922\", \"avocado green\"], [\"f0944d\", \"faded orange\"], [\"5d1451\", \"grape purple\"], [\"25ff29\", \"hot green\"], [\"d0fe1d\", \"lime yellow\"], [\"ffa62b\", \"mango\"], [\"01b44c\", \"shamrock\"], [\"ff6cb5\", \"bubblegum\"], [\"6b4247\", \"purplish brown\"], [\"c7c10c\", \"vomit yellow\"], [\"b7fffa\", \"pale cyan\"], [\"aeff6e\", \"key lime\"], [\"ec2d01\", \"tomato red\"], [\"76ff7b\", \"lightgreen\"], [\"730039\", \"merlot\"], [\"040348\", \"night blue\"], [\"df4ec8\", \"purpleish pink\"], [\"6ecb3c\", \"apple\"], [\"8f9805\", \"baby poop green\"], [\"5edc1f\", \"green apple\"], [\"d94ff5\", \"heliotrope\"], [\"c8fd3d\", \"yellow/green\"], [\"070d0d\", \"almost black\"], [\"4984b8\", \"cool blue\"], [\"51b73b\", \"leafy green\"], [\"ac7e04\", \"mustard brown\"], [\"4e5481\", \"dusk\"], [\"876e4b\", \"dull brown\"], [\"58bc08\", \"frog green\"], [\"2fef10\", \"vivid green\"], [\"2dfe54\", \"bright light green\"], [\"0aff02\", \"fluro green\"], [\"9cef43\", \"kiwi\"], [\"18d17b\", \"seaweed\"], [\"35530a\", \"navy green\"], [\"1805db\", \"ultramarine blue\"], [\"6258c4\", \"iris\"], [\"ff964f\", \"pastel orange\"], [\"ffab0f\", \"yellowish orange\"], [\"8f8ce7\", \"perrywinkle\"], [\"24bca8\", \"tealish\"], [\"3f012c\", \"dark plum\"], [\"cbf85f\", \"pear\"], [\"ff724c\", \"pinkish orange\"], [\"280137\", \"midnight purple\"], [\"b36ff6\", \"light urple\"], [\"48c072\", \"dark mint\"], [\"bccb7a\", \"greenish tan\"], [\"a8415b\", \"light burgundy\"], [\"06b1c4\", \"turquoise blue\"], [\"cd7584\", \"ugly pink\"], [\"f1da7a\", \"sandy\"], [\"ff0490\", \"electric pink\"], [\"805b87\", \"muted purple\"], [\"50a747\", \"mid green\"], [\"a8a495\", \"greyish\"], [\"cfff04\", \"neon yellow\"], [\"ffff7e\", \"banana\"], [\"ff7fa7\", \"carnation pink\"], [\"ef4026\", \"tomato\"], [\"3c9992\", \"sea\"], [\"886806\", \"muddy brown\"], [\"04f489\", \"turquoise green\"], [\"fef69e\", \"buff\"], [\"cfaf7b\", \"fawn\"], [\"3b719f\", \"muted blue\"], [\"fdc1c5\", \"pale rose\"], [\"20c073\", \"dark mint green\"], [\"9b5fc0\", \"amethyst\"], [\"0f9b8e\", \"blue/green\"], [\"742802\", \"chestnut\"], [\"9db92c\", \"sick green\"], [\"a4bf20\", \"pea\"], [\"cd5909\", \"rusty orange\"], [\"ada587\", \"stone\"], [\"be013c\", \"rose red\"], [\"b8ffeb\", \"pale aqua\"], [\"dc4d01\", \"deep orange\"], [\"a2653e\", \"earth\"], [\"638b27\", \"mossy green\"], [\"419c03\", \"grassy green\"], [\"b1ff65\", \"pale lime green\"], [\"9dbcd4\", \"light grey blue\"], [\"fdfdfe\", \"pale grey\"], [\"77ab56\", \"asparagus\"], [\"464196\", \"blueberry\"], [\"990147\", \"purple red\"], [\"befd73\", \"pale lime\"], [\"32bf84\", \"greenish teal\"], [\"af6f09\", \"caramel\"], [\"a0025c\", \"deep magenta\"], [\"ffd8b1\", \"light peach\"], [\"7f4e1e\", \"milk chocolate\"], [\"bf9b0c\", \"ocher\"], [\"6ba353\", \"off green\"], [\"f075e6\", \"purply pink\"], [\"7bc8f6\", \"lightblue\"], [\"475f94\", \"dusky blue\"], [\"f5bf03\", \"golden\"], [\"fffeb6\", \"light beige\"], [\"fffd74\", \"butter yellow\"], [\"895b7b\", \"dusky purple\"], [\"436bad\", \"french blue\"], [\"d0c101\", \"ugly yellow\"], [\"c6f808\", \"greeny yellow\"], [\"f43605\", \"orangish red\"], [\"02c14d\", \"shamrock green\"], [\"b25f03\", \"orangish brown\"], [\"2a7e19\", \"tree green\"], [\"490648\", \"deep violet\"], [\"536267\", \"gunmetal\"], [\"5a06ef\", \"blue/purple\"], [\"cf0234\", \"cherry\"], [\"c4a661\", \"sandy brown\"], [\"978a84\", \"warm grey\"], [\"1f0954\", \"dark indigo\"], [\"03012d\", \"midnight\"], [\"2bb179\", \"bluey green\"], [\"c3909b\", \"grey pink\"], [\"a66fb5\", \"soft purple\"], [\"770001\", \"blood\"], [\"922b05\", \"brown red\"], [\"7d7f7c\", \"medium grey\"], [\"990f4b\", \"berry\"], [\"8f7303\", \"poo\"], [\"c83cb9\", \"purpley pink\"], [\"fea993\", \"light salmon\"], [\"acbb0d\", \"snot\"], [\"c071fe\", \"easter purple\"], [\"ccfd7f\", \"light yellow green\"], [\"00022e\", \"dark navy blue\"], [\"828344\", \"drab\"], [\"ffc5cb\", \"light rose\"], [\"ab1239\", \"rouge\"], [\"b0054b\", \"purplish red\"], [\"99cc04\", \"slime green\"], [\"937c00\", \"baby poop\"], [\"019529\", \"irish green\"], [\"ef1de7\", \"pink/purple\"], [\"000435\", \"dark navy\"], [\"42b395\", \"greeny blue\"], [\"9d5783\", \"light plum\"], [\"c8aca9\", \"pinkish grey\"], [\"c87606\", \"dirty orange\"], [\"aa2704\", \"rust red\"], [\"e4cbff\", \"pale lilac\"], [\"fa4224\", \"orangey red\"], [\"0804f9\", \"primary blue\"], [\"5cb200\", \"kermit green\"], [\"76424e\", \"brownish purple\"], [\"6c7a0e\", \"murky green\"], [\"fbdd7e\", \"wheat\"], [\"2a0134\", \"very dark purple\"], [\"044a05\", \"bottle green\"], [\"fd4659\", \"watermelon\"], [\"0d75f8\", \"deep sky blue\"], [\"fe0002\", \"fire engine red\"], [\"cb9d06\", \"yellow ochre\"], [\"fb7d07\", \"pumpkin orange\"], [\"b9cc81\", \"pale olive\"], [\"edc8ff\", \"light lilac\"], [\"61e160\", \"lightish green\"], [\"8ab8fe\", \"carolina blue\"], [\"920a4e\", \"mulberry\"], [\"fe02a2\", \"shocking pink\"], [\"9a3001\", \"auburn\"], [\"65fe08\", \"bright lime green\"], [\"befdb7\", \"celadon\"], [\"b17261\", \"pinkish brown\"], [\"885f01\", \"poo brown\"], [\"02ccfe\", \"bright sky blue\"], [\"c1fd95\", \"celery\"], [\"836539\", \"dirt brown\"], [\"fb2943\", \"strawberry\"], [\"84b701\", \"dark lime\"], [\"b66325\", \"copper\"], [\"7f5112\", \"medium brown\"], [\"5fa052\", \"muted green\"], [\"6dedfd\", \"robin's egg\"], [\"0bf9ea\", \"bright aqua\"], [\"c760ff\", \"bright lavender\"], [\"ffffcb\", \"ivory\"], [\"f6cefc\", \"very light purple\"], [\"155084\", \"light navy\"], [\"f5054f\", \"pink red\"], [\"645403\", \"olive brown\"], [\"7a5901\", \"poop brown\"], [\"a8b504\", \"mustard green\"], [\"3d9973\", \"ocean green\"], [\"000133\", \"very dark blue\"], [\"76a973\", \"dusty green\"], [\"2e5a88\", \"light navy blue\"], [\"0bf77d\", \"minty green\"], [\"bd6c48\", \"adobe\"], [\"ac1db8\", \"barney\"], [\"2baf6a\", \"jade green\"], [\"26f7fd\", \"bright light blue\"], [\"aefd6c\", \"light lime\"], [\"9b8f55\", \"dark khaki\"], [\"ffad01\", \"orange yellow\"], [\"c69c04\", \"ocre\"], [\"f4d054\", \"maize\"], [\"de9dac\", \"faded pink\"], [\"05480d\", \"british racing green\"], [\"c9ae74\", \"sandstone\"], [\"60460f\", \"mud brown\"], [\"98f6b0\", \"light sea green\"], [\"8af1fe\", \"robin egg blue\"], [\"2ee8bb\", \"aqua marine\"], [\"11875d\", \"dark sea green\"], [\"fdb0c0\", \"soft pink\"], [\"b16002\", \"orangey brown\"], [\"f7022a\", \"cherry red\"], [\"d5ab09\", \"burnt yellow\"], [\"86775f\", \"brownish grey\"], [\"c69f59\", \"camel\"], [\"7a687f\", \"purplish grey\"], [\"042e60\", \"marine\"], [\"c88d94\", \"greyish pink\"], [\"a5fbd5\", \"pale turquoise\"], [\"fffe71\", \"pastel yellow\"], [\"6241c7\", \"bluey purple\"], [\"fffe40\", \"canary yellow\"], [\"d3494e\", \"faded red\"], [\"985e2b\", \"sepia\"], [\"a6814c\", \"coffee\"], [\"ff08e8\", \"bright magenta\"], [\"9d7651\", \"mocha\"], [\"feffca\", \"ecru\"], [\"98568d\", \"purpleish\"], [\"9e003a\", \"cranberry\"], [\"287c37\", \"darkish green\"], [\"b96902\", \"brown orange\"], [\"ba6873\", \"dusky rose\"], [\"ff7855\", \"melon\"], [\"94b21c\", \"sickly green\"], [\"c5c9c7\", \"silver\"], [\"661aee\", \"purply blue\"], [\"6140ef\", \"purpleish blue\"], [\"9be5aa\", \"hospital green\"], [\"7b5804\", \"shit brown\"], [\"276ab3\", \"mid blue\"], [\"feb308\", \"amber\"], [\"8cfd7e\", \"easter green\"], [\"6488ea\", \"soft blue\"], [\"056eee\", \"cerulean blue\"], [\"b27a01\", \"golden brown\"], [\"0ffef9\", \"bright turquoise\"], [\"fa2a55\", \"red pink\"], [\"820747\", \"red purple\"], [\"7a6a4f\", \"greyish brown\"], [\"f4320c\", \"vermillion\"], [\"a13905\", \"russet\"], [\"6f828a\", \"steel grey\"], [\"a55af4\", \"lighter purple\"], [\"ad0afd\", \"bright violet\"], [\"004577\", \"prussian blue\"], [\"658d6d\", \"slate green\"], [\"ca7b80\", \"dirty pink\"], [\"005249\", \"dark blue green\"], [\"2b5d34\", \"pine\"], [\"bff128\", \"yellowy green\"], [\"b59410\", \"dark gold\"], [\"2976bb\", \"bluish\"], [\"014182\", \"darkish blue\"], [\"bb3f3f\", \"dull red\"], [\"fc2647\", \"pinky red\"], [\"a87900\", \"bronze\"], [\"82cbb2\", \"pale teal\"], [\"667c3e\", \"military green\"], [\"fe46a5\", \"barbie pink\"], [\"fe83cc\", \"bubblegum pink\"], [\"94a617\", \"pea soup green\"], [\"a88905\", \"dark mustard\"], [\"7f5f00\", \"shit\"], [\"9e43a2\", \"medium purple\"], [\"062e03\", \"very dark green\"], [\"8a6e45\", \"dirt\"], [\"cc7a8b\", \"dusky pink\"], [\"9e0168\", \"red violet\"], [\"fdff38\", \"lemon yellow\"], [\"c0fa8b\", \"pistachio\"], [\"eedc5b\", \"dull yellow\"], [\"7ebd01\", \"dark lime green\"], [\"3b5b92\", \"denim blue\"], [\"01889f\", \"teal blue\"], [\"3d7afd\", \"lightish blue\"], [\"5f34e7\", \"purpley blue\"], [\"6d5acf\", \"light indigo\"], [\"748500\", \"swamp green\"], [\"706c11\", \"brown green\"], [\"3c0008\", \"dark maroon\"], [\"cb00f5\", \"hot purple\"], [\"002d04\", \"dark forest green\"], [\"658cbb\", \"faded blue\"], [\"749551\", \"drab green\"], [\"b9ff66\", \"light lime green\"], [\"9dc100\", \"snot green\"], [\"faee66\", \"yellowish\"], [\"7efbb3\", \"light blue green\"], [\"7b002c\", \"bordeaux\"], [\"c292a1\", \"light mauve\"], [\"017b92\", \"ocean\"], [\"fcc006\", \"marigold\"], [\"657432\", \"muddy green\"], [\"d8863b\", \"dull orange\"], [\"738595\", \"steel\"], [\"aa23ff\", \"electric purple\"], [\"08ff08\", \"fluorescent green\"], [\"9b7a01\", \"yellowish brown\"], [\"f29e8e\", \"blush\"], [\"6fc276\", \"soft green\"], [\"ff5b00\", \"bright orange\"], [\"fdff52\", \"lemon\"], [\"866f85\", \"purple grey\"], [\"8ffe09\", \"acid green\"], [\"eecffe\", \"pale lavender\"], [\"510ac9\", \"violet blue\"], [\"4f9153\", \"light forest green\"], [\"9f2305\", \"burnt red\"], [\"728639\", \"khaki green\"], [\"de0c62\", \"cerise\"], [\"916e99\", \"faded purple\"], [\"ffb16d\", \"apricot\"], [\"3c4d03\", \"dark olive green\"], [\"7f7053\", \"grey brown\"], [\"77926f\", \"green grey\"], [\"010fcc\", \"true blue\"], [\"ceaefa\", \"pale violet\"], [\"8f99fb\", \"periwinkle blue\"], [\"c6fcff\", \"light sky blue\"], [\"5539cc\", \"blurple\"], [\"544e03\", \"green brown\"], [\"017a79\", \"bluegreen\"], [\"01f9c6\", \"bright teal\"], [\"c9b003\", \"brownish yellow\"], [\"929901\", \"pea soup\"], [\"0b5509\", \"forest\"], [\"a00498\", \"barney purple\"], [\"2000b1\", \"ultramarine\"], [\"94568c\", \"purplish\"], [\"c2be0e\", \"puke yellow\"], [\"748b97\", \"bluish grey\"], [\"665fd1\", \"dark periwinkle\"], [\"9c6da5\", \"dark lilac\"], [\"c44240\", \"reddish\"], [\"a24857\", \"light maroon\"], [\"825f87\", \"dusty purple\"], [\"c9643b\", \"terra cotta\"], [\"90b134\", \"avocado\"], [\"01386a\", \"marine blue\"], [\"25a36f\", \"teal green\"], [\"59656d\", \"slate grey\"], [\"75fd63\", \"lighter green\"], [\"21fc0d\", \"electric green\"], [\"5a86ad\", \"dusty blue\"], [\"fec615\", \"golden yellow\"], [\"fffd01\", \"bright yellow\"], [\"dfc5fe\", \"light lavender\"], [\"b26400\", \"umber\"], [\"7f5e00\", \"poop\"], [\"de7e5d\", \"dark peach\"], [\"048243\", \"jungle green\"], [\"ffffd4\", \"eggshell\"], [\"3b638c\", \"denim\"], [\"b79400\", \"yellow brown\"], [\"84597e\", \"dull purple\"], [\"411900\", \"chocolate brown\"], [\"7b0323\", \"wine red\"], [\"04d9ff\", \"neon blue\"], [\"667e2c\", \"dirty green\"], [\"fbeeac\", \"light tan\"], [\"d7fffe\", \"ice blue\"], [\"4e7496\", \"cadet blue\"], [\"874c62\", \"dark mauve\"], [\"d5ffff\", \"very light blue\"], [\"826d8c\", \"grey purple\"], [\"ffbacd\", \"pastel pink\"], [\"d1ffbd\", \"very light green\"], [\"448ee4\", \"dark sky blue\"], [\"05472a\", \"evergreen\"], [\"d5869d\", \"dull pink\"], [\"3d0734\", \"aubergine\"], [\"4a0100\", \"mahogany\"], [\"f8481c\", \"reddish orange\"], [\"02590f\", \"deep green\"], [\"89a203\", \"vomit green\"], [\"e03fd8\", \"purple pink\"], [\"d58a94\", \"dusty pink\"], [\"7bb274\", \"faded green\"], [\"526525\", \"camo green\"], [\"c94cbe\", \"pinky purple\"], [\"db4bda\", \"pink purple\"], [\"9e3623\", \"brownish red\"], [\"b5485d\", \"dark rose\"], [\"735c12\", \"mud\"], [\"9c6d57\", \"brownish\"], [\"028f1e\", \"emerald green\"], [\"b1916e\", \"pale brown\"], [\"49759c\", \"dull blue\"], [\"a0450e\", \"burnt umber\"], [\"39ad48\", \"medium green\"], [\"b66a50\", \"clay\"], [\"8cffdb\", \"light aqua\"], [\"a4be5c\", \"light olive green\"], [\"cb7723\", \"brownish orange\"], [\"05696b\", \"dark aqua\"], [\"ce5dae\", \"purplish pink\"], [\"c85a53\", \"dark salmon\"], [\"96ae8d\", \"greenish grey\"], [\"1fa774\", \"jade\"], [\"7a9703\", \"ugly green\"], [\"ac9362\", \"dark beige\"], [\"01a049\", \"emerald\"], [\"d9544d\", \"pale red\"], [\"fa5ff7\", \"light magenta\"], [\"82cafc\", \"sky\"], [\"acfffc\", \"light cyan\"], [\"fcb001\", \"yellow orange\"], [\"910951\", \"reddish purple\"], [\"fe2c54\", \"reddish pink\"], [\"c875c4\", \"orchid\"], [\"cdc50a\", \"dirty yellow\"], [\"fd411e\", \"orange red\"], [\"9a0200\", \"deep red\"], [\"be6400\", \"orange brown\"], [\"030aa7\", \"cobalt blue\"], [\"fe019a\", \"neon pink\"], [\"f7879a\", \"rose pink\"], [\"887191\", \"greyish purple\"], [\"b00149\", \"raspberry\"], [\"12e193\", \"aqua green\"], [\"fe7b7c\", \"salmon pink\"], [\"ff9408\", \"tangerine\"], [\"6a6e09\", \"brownish green\"], [\"8b2e16\", \"red brown\"], [\"696112\", \"greenish brown\"], [\"e17701\", \"pumpkin\"], [\"0a481e\", \"pine green\"], [\"343837\", \"charcoal\"], [\"ffb7ce\", \"baby pink\"], [\"6a79f7\", \"cornflower\"], [\"5d06e9\", \"blue violet\"], [\"3d1c02\", \"chocolate\"], [\"82a67d\", \"greyish green\"], [\"be0119\", \"scarlet\"], [\"c9ff27\", \"green yellow\"], [\"373e02\", \"dark olive\"], [\"a9561e\", \"sienna\"], [\"caa0ff\", \"pastel purple\"], [\"ca6641\", \"terracotta\"], [\"02d8e9\", \"aqua blue\"], [\"88b378\", \"sage green\"], [\"980002\", \"blood red\"], [\"cb0162\", \"deep pink\"], [\"5cac2d\", \"grass\"], [\"769958\", \"moss\"], [\"a2bffe\", \"pastel blue\"], [\"10a674\", \"bluish green\"], [\"06b48b\", \"green blue\"], [\"af884a\", \"dark tan\"], [\"0b8b87\", \"greenish blue\"], [\"ffa756\", \"pale orange\"], [\"a2a415\", \"vomit\"], [\"154406\", \"forrest green\"], [\"856798\", \"dark lavender\"], [\"34013f\", \"dark violet\"], [\"632de9\", \"purple blue\"], [\"0a888a\", \"dark cyan\"], [\"6f7632\", \"olive drab\"], [\"d46a7e\", \"pinkish\"], [\"1e488f\", \"cobalt\"], [\"bc13fe\", \"neon purple\"], [\"7ef4cc\", \"light turquoise\"], [\"76cd26\", \"apple green\"], [\"74a662\", \"dull green\"], [\"80013f\", \"wine\"], [\"b1d1fc\", \"powder blue\"], [\"ffffe4\", \"off white\"], [\"0652ff\", \"electric blue\"], [\"045c5a\", \"dark turquoise\"], [\"5729ce\", \"blue purple\"], [\"069af3\", \"azure\"], [\"ff000d\", \"bright red\"], [\"f10c45\", \"pinkish red\"], [\"5170d7\", \"cornflower blue\"], [\"acbf69\", \"light olive\"], [\"6c3461\", \"grape\"], [\"5e819d\", \"greyish blue\"], [\"601ef9\", \"purplish blue\"], [\"b0dd16\", \"yellowish green\"], [\"cdfd02\", \"greenish yellow\"], [\"2c6fbb\", \"medium blue\"], [\"c0737a\", \"dusty rose\"], [\"d6b4fc\", \"light violet\"], [\"020035\", \"midnight blue\"], [\"703be7\", \"bluish purple\"], [\"fd3c06\", \"red orange\"], [\"960056\", \"dark magenta\"], [\"40a368\", \"greenish\"], [\"03719c\", \"ocean blue\"], [\"fc5a50\", \"coral\"], [\"ffffc2\", \"cream\"], [\"7f2b0a\", \"reddish brown\"], [\"b04e0f\", \"burnt sienna\"], [\"a03623\", \"brick\"], [\"87ae73\", \"sage\"], [\"789b73\", \"grey green\"], [\"ffffff\", \"white\"], [\"98eff9\", \"robin's egg blue\"], [\"658b38\", \"moss green\"], [\"5a7d9a\", \"steel blue\"], [\"380835\", \"eggplant\"], [\"fffe7a\", \"light yellow\"], [\"5ca904\", \"leaf green\"], [\"d8dcd6\", \"light grey\"], [\"a5a502\", \"puke\"], [\"d648d7\", \"pinkish purple\"], [\"047495\", \"sea blue\"], [\"b790d4\", \"pale purple\"], [\"5b7c99\", \"slate blue\"], [\"607c8e\", \"blue grey\"], [\"0b4008\", \"hunter green\"], [\"ed0dd9\", \"fuchsia\"], [\"8c000f\", \"crimson\"], [\"ffff84\", \"pale yellow\"], [\"bf9005\", \"ochre\"], [\"d2bd0a\", \"mustard yellow\"], [\"ff474c\", \"light red\"], [\"0485d1\", \"cerulean\"], [\"ffcfdc\", \"pale pink\"], [\"040273\", \"deep blue\"], [\"a83c09\", \"rust\"], [\"90e4c1\", \"light teal\"], [\"516572\", \"slate\"], [\"fac205\", \"goldenrod\"], [\"d5b60a\", \"dark yellow\"], [\"363737\", \"dark grey\"], [\"4b5d16\", \"army green\"], [\"6b8ba4\", \"grey blue\"], [\"80f9ad\", \"seafoam\"], [\"a57e52\", \"puce\"], [\"a9f971\", \"spring green\"], [\"c65102\", \"dark orange\"], [\"e2ca76\", \"sand\"], [\"b0ff9d\", \"pastel green\"], [\"9ffeb0\", \"mint\"], [\"fdaa48\", \"light orange\"], [\"fe01b1\", \"bright pink\"], [\"c1f80a\", \"chartreuse\"], [\"36013f\", \"deep purple\"], [\"341c02\", \"dark brown\"], [\"b9a281\", \"taupe\"], [\"8eab12\", \"pea green\"], [\"9aae07\", \"puke green\"], [\"02ab2e\", \"kelly green\"], [\"7af9ab\", \"seafoam green\"], [\"137e6d\", \"blue green\"], [\"aaa662\", \"khaki\"], [\"610023\", \"burgundy\"], [\"014d4e\", \"dark teal\"], [\"8f1402\", \"brick red\"], [\"4b006e\", \"royal purple\"], [\"580f41\", \"plum\"], [\"8fff9f\", \"mint green\"], [\"dbb40c\", \"gold\"], [\"a2cffe\", \"baby blue\"], [\"c0fb2d\", \"yellow green\"], [\"be03fd\", \"bright purple\"], [\"840000\", \"dark red\"], [\"d0fefe\", \"pale blue\"], [\"3f9b0b\", \"grass green\"], [\"01153e\", \"navy\"], [\"04d8b2\", \"aquamarine\"], [\"c04e01\", \"burnt orange\"], [\"0cff0c\", \"neon green\"], [\"0165fc\", \"bright blue\"], [\"cf6275\", \"rose\"], [\"ffd1df\", \"light pink\"], [\"ceb301\", \"mustard\"], [\"380282\", \"indigo\"], [\"aaff32\", \"lime\"], [\"53fca1\", \"sea green\"], [\"8e82fe\", \"periwinkle\"], [\"cb416b\", \"dark pink\"], [\"677a04\", \"olive green\"], [\"ffb07c\", \"peach\"], [\"c7fdb5\", \"pale green\"], [\"ad8150\", \"light brown\"], [\"ff028d\", \"hot pink\"], [\"000000\", \"black\"], [\"cea2fd\", \"lilac\"], [\"001146\", \"navy blue\"], [\"0504aa\", \"royal blue\"], [\"e6daa6\", \"beige\"], [\"ff796c\", \"salmon\"], [\"6e750e\", \"olive\"], [\"650021\", \"maroon\"], [\"01ff07\", \"bright green\"], [\"35063e\", \"dark purple\"], [\"ae7181\", \"mauve\"], [\"06470c\", \"forest green\"], [\"13eac9\", \"aqua\"], [\"00ffff\", \"cyan\"], [\"d1b26f\", \"tan\"], [\"00035b\", \"dark blue\"], [\"c79fef\", \"lavender\"], [\"06c2ac\", \"turquoise\"], [\"033500\", \"dark green\"], [\"9a0eea\", \"violet\"], [\"bf77f6\", \"light purple\"], [\"89fe05\", \"lime green\"], [\"929591\", \"grey\"], [\"75bbfd\", \"sky blue\"], [\"ffff14\", \"yellow\"], [\"c20078\", \"magenta\"], [\"96f97b\", \"light green\"], [\"f97306\", \"orange\"], [\"029386\", \"teal\"], [\"95d0fc\", \"light blue\"], [\"e50000\", \"red\"], [\"653700\", \"brown\"], [\"ff81c0\", \"pink\"], [\"0343df\", \"blue\"], [\"15b01a\", \"green\"], [\"7e1e9c\", \"purple\"], [\"FF5E99\", \"paul irish pink\"], [\"00000000\", \"transparent\"]];\n names.each(function(element) {\n return lookup[normalizeKey(element[1])] = parseHex(element[0]);\n });\n Color.random = function() {\n return Color(rand(256), rand(256), rand(256), 1);\n };\n return Color.mix = function(color1, color2, amount) {\n var new_colors;\n amount || (amount = 0.5);\n new_colors = color1.channels().zip(color2.channels()).map(function(array) {\n return (array[0] * amount) + (array[1] * (1 - amount));\n });\n return Color(new_colors);\n };\n})();;\n(function($) {\n /**\n The <code>Developer</code> module provides a debug overlay and methods for debugging and live coding.\n\n @name Developer\n @fieldOf Engine\n @module\n\n @param {Object} I Instance variables\n @param {Object} self Reference to the engine\n */ var developerHotkeys, developerMode, developerModeMousedown, namespace, objectToUpdate;\n Engine.Developer = function(I, self) {\n var boxHeight, boxWidth, font, lineHeight, margin, screenHeight, screenWidth, textStart;\n screenWidth = (typeof App !== \"undefined\" && App !== null ? App.width : void 0) || 480;\n screenHeight = (typeof App !== \"undefined\" && App !== null ? App.height : void 0) || 320;\n margin = 10;\n boxWidth = 240;\n boxHeight = 60;\n textStart = screenWidth - boxWidth + margin;\n font = \"bold 9pt arial\";\n lineHeight = 16;\n self.bind(\"draw\", function(canvas) {\n if (I.paused) {\n canvas.withTransform(I.cameraTransform, function(canvas) {\n return I.objects.each(function(object) {\n canvas.fillColor('rgba(255, 0, 0, 0.5)');\n return canvas.fillRect(object.bounds().x, object.bounds().y, object.bounds().width, object.bounds().height);\n });\n });\n canvas.font(font);\n canvas.fillColor('rgba(0, 0, 0, 0.5)');\n canvas.fillRect(screenWidth - boxWidth, 0, boxWidth, boxHeight);\n canvas.fillColor('#fff');\n canvas.fillText(\"Developer Mode. Press Esc to resume\", textStart, margin + 5);\n canvas.fillText(\"Shift+Left click to add boxes\", textStart, margin + 5 + lineHeight);\n return canvas.fillText(\"Right click red boxes to edit properties\", textStart, margin + 5 + 2 * lineHeight);\n }\n });\n self.bind(\"init\", function() {\n var fn, key, _results;\n window.updateObjectProperties = function(newProperties) {\n if (objectToUpdate) {\n return Object.extend(objectToUpdate, GameObject.construct(newProperties));\n }\n };\n $(document).unbind(\".\" + namespace);\n $(document).bind(\"mousedown.\" + namespace, developerModeMousedown);\n _results = [];\n for (key in developerHotkeys) {\n fn = developerHotkeys[key];\n _results.push((function(key, fn) {\n return $(document).bind(\"keydown.\" + namespace, key, function(event) {\n event.preventDefault();\n return fn();\n });\n })(key, fn));\n }\n return _results;\n });\n return {};\n };\n namespace = \"engine_developer\";\n developerMode = false;\n objectToUpdate = null;\n developerModeMousedown = function(event) {\n var object;\n if (developerMode) {\n console.log(event.which);\n if (event.which === 3) {\n if (object = engine.objectAt(event.pageX, event.pageY)) {\n parent.editProperties(object.I);\n objectToUpdate = object;\n }\n return console.log(object);\n } else if (event.which === 2 || keydown.shift) {\n return typeof window.developerAddObject === \"function\" ? window.developerAddObject(event) : void 0;\n }\n }\n };\n return developerHotkeys = {\n esc: function() {\n developerMode = !developerMode;\n if (developerMode) {\n return engine.pause();\n } else {\n return engine.play();\n }\n },\n f3: function() {\n return Local.set(\"level\", engine.saveState());\n },\n f4: function() {\n return engine.loadState(Local.get(\"level\"));\n },\n f5: function() {\n return engine.reload();\n }\n };\n})(jQuery);;\n/**\nThe <code>HUD</code> module provides an extra canvas to draw to. GameObjects that respond to the\n<code>drawHUD</code> method will draw to the HUD canvas. The HUD canvas is not cleared each frame, it is\nthe responsibility of the objects drawing on it to manage that themselves.\n\n@name HUD\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.HUD = function(I, self) {\n var hudCanvas;\n hudCanvas = $(\"<canvas width=\" + App.width + \" height=\" + App.height + \" />\").powerCanvas();\n hudCanvas.font(\"bold 9pt consolas, 'Courier New', 'andale mono', 'lucida console', monospace\");\n self.bind(\"draw\", function(canvas) {\n var hud;\n I.objects.each(function(object) {\n return typeof object.drawHUD === \"function\" ? object.drawHUD(hudCanvas) : void 0;\n });\n hud = hudCanvas.element();\n return canvas.drawImage(hud, 0, 0, hud.width, hud.height, 0, 0, hud.width, hud.height);\n });\n return {};\n};;\n(function($) {\n /**\n The <code>Joysticks</code> module gives the engine access to joysticks.\n\n @name Joysticks\n @fieldOf Engine\n @module\n\n @param {Object} I Instance variables\n @param {Object} self Reference to the engine\n */ return Engine.Joysticks = function(I, self) {\n Joysticks.init();\n log(Joysticks.status());\n self.bind(\"update\", function() {\n Joysticks.init();\n return Joysticks.update();\n });\n return {\n /**\n Get a controller for a given joystick id.\n\n @name controller\n @methodOf Engine.Joysticks#\n\n @param {Number} i The joystick id to get the controller of.\n */\n controller: function(i) {\n return Joysticks.getController(i);\n }\n };\n };\n})();;\n/**\nThe <code>Shadows</code> module provides a lighting extension to the Engine. Objects that have\nan illuminate method will add light to the scene. Objects that have an true opaque attribute will cast\nshadows.\n\n@name Shadows\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Shadows = function(I, self) {\n var shadowCanvas;\n shadowCanvas = $(\"<canvas width=640 height=480 />\").powerCanvas();\n self.bind(\"draw\", function(canvas) {\n var shadows;\n if (I.ambientLight < 1) {\n shadowCanvas.compositeOperation(\"source-over\");\n shadowCanvas.clear();\n shadowCanvas.fill(\"rgba(0, 0, 0, \" + (1 - I.ambientLight) + \")\");\n shadowCanvas.compositeOperation(\"destination-out\");\n shadowCanvas.withTransform(I.cameraTransform, function(shadowCanvas) {\n return I.objects.each(function(object, i) {\n if (object.illuminate) {\n shadowCanvas.globalAlpha(1);\n return object.illuminate(shadowCanvas);\n }\n });\n });\n shadows = shadowCanvas.element();\n return canvas.drawImage(shadows, 0, 0, shadows.width, shadows.height, 0, 0, shadows.width, shadows.height);\n }\n });\n return {};\n};;\n/**\nThe <code>Tilemap</code> module provides a way to load tilemaps in the engine.\n\n@name Tilemap\n@fieldOf Engine\n@module\n\n@param {Object} I Instance variables\n@param {Object} self Reference to the engine\n*/Engine.Tilemap = function(I, self) {\n var clearObjects, map, updating;\n map = null;\n updating = false;\n clearObjects = false;\n self.bind(\"preDraw\", function(canvas) {\n return map != null ? map.draw(canvas) : void 0;\n });\n self.bind(\"update\", function() {\n return updating = true;\n });\n self.bind(\"afterUpdate\", function() {\n updating = false;\n if (clearObjects) {\n I.objects.clear();\n return clearObjects = false;\n }\n });\n return {\n /**\n Loads a new may and unloads any existing map or entities.\n\n @name loadMap\n @methodOf Engine#\n */\n loadMap: function(name, complete) {\n clearObjects = updating;\n return map = Tilemap.load({\n name: name,\n complete: complete,\n entity: self.add\n });\n }\n };\n};;\n(function() {\n var Map, Tilemap, fromPixieId, loadByName;\n Map = function(data, entityCallback) {\n var entity, loadEntities, spriteLookup, tileHeight, tileWidth, uuid, _ref;\n tileHeight = data.tileHeight;\n tileWidth = data.tileWidth;\n spriteLookup = {};\n _ref = App.entities;\n for (uuid in _ref) {\n entity = _ref[uuid];\n spriteLookup[uuid] = Sprite.fromURL(entity.tileSrc);\n }\n loadEntities = function() {\n if (!entityCallback) {\n return;\n }\n return data.layers.each(function(layer, layerIndex) {\n var entities, entity, entityData, x, y, _i, _len, _results;\n if (layer.name.match(/entities/i)) {\n if (entities = layer.entities) {\n _results = [];\n for (_i = 0, _len = entities.length; _i < _len; _i++) {\n entity = entities[_i];\n x = entity.x, y = entity.y, uuid = entity.uuid;\n entityData = Object.extend({\n layer: layerIndex,\n sprite: spriteLookup[uuid],\n x: x,\n y: y\n }, App.entities[uuid], entity.properties);\n _results.push(entityCallback(entityData));\n }\n return _results;\n }\n }\n });\n };\n loadEntities();\n return Object.extend(data, {\n draw: function(canvas, x, y) {\n return canvas.withTransform(Matrix.translation(x, y), function() {\n return data.layers.each(function(layer) {\n if (layer.name.match(/entities/i)) {\n return;\n }\n return layer.tiles.each(function(row, y) {\n return row.each(function(uuid, x) {\n var sprite;\n if (sprite = spriteLookup[uuid]) {\n return sprite.draw(canvas, x * tileWidth, y * tileHeight);\n }\n });\n });\n });\n });\n }\n });\n };\n Tilemap = function(name, callback, entityCallback) {\n return fromPixieId(App.Tilemaps[name], callback, entityCallback);\n };\n fromPixieId = function(id, callback, entityCallback) {\n var proxy, url;\n url = \"http://pixieengine.com/s3/tilemaps/\" + id + \"/data.json\";\n proxy = {\n draw: function() {}\n };\n $.getJSON(url, function(data) {\n Object.extend(proxy, Map(data, entityCallback));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n loadByName = function(name, callback, entityCallback) {\n var directory, proxy, url, _ref;\n directory = (typeof App !== \"undefined\" && App !== null ? (_ref = App.directories) != null ? _ref.tilemaps : void 0 : void 0) || \"data\";\n url = \"\" + BASE_URL + \"/\" + directory + \"/\" + name + \".tilemap?\" + (new Date().getTime());\n proxy = {\n draw: function() {}\n };\n $.getJSON(url, function(data) {\n Object.extend(proxy, Map(data, entityCallback));\n return typeof callback === \"function\" ? callback(proxy) : void 0;\n });\n return proxy;\n };\n Tilemap.fromPixieId = fromPixieId;\n Tilemap.load = function(options) {\n if (options.pixieId) {\n return fromPixieId(options.pixieId, options.complete, options.entity);\n } else if (options.name) {\n return loadByName(options.name, options.complete, options.entity);\n }\n };\n return (typeof exports !== \"undefined\" && exports !== null ? exports : this)[\"Tilemap\"] = Tilemap;\n})();;\n;\n;\nvar Square;\nSquare = function(I) {\n var self;\n I || (I = {});\n Object.reverseMerge(I, {\n color: \"red\",\n x: 100,\n y: 180,\n width: 30,\n height: 30,\n velocity: Point(2, 0)\n });\n self = GameObject(I);\n self.bind('step', function() {\n I.x += I.velocity.x;\n return I.y += I.velocity.y;\n });\n return self;\n};;\nApp.entities = {};;\n;$(function(){ window.engine = Engine({\n canvas: $(\"canvas\").powerCanvas()\n});\nengine.add({\n \"class\": \"Square\"\n});\nengine.start(); });","size":333929,"mtime":1319177583},{"path":"docs/symbols/Logging.html","type":"blob","contents":null,"size":4624,"mtime":1319177591},{"path":"docs/symbols/Rotatable.html","type":"blob","contents":null,"size":5566,"mtime":1319177591},{"path":"docs/symbols/src/_tmp_d20110408-25447-6x6d8t_PixieDemo.js.html","type":"blob","contents":null,"size":3928190,"mtime":1307588376},{"path":"docs/symbols/Point.html","type":"blob","contents":null,"size":46645,"mtime":1319177591},{"path":"docs/symbols/RegExp.html","type":"blob","contents":null,"size":8654,"mtime":1319177591},{"path":"docs/symbols/Number.html","type":"blob","contents":null,"size":41709,"mtime":1319177591},{"path":"docs/symbols/Bindable.html","type":"blob","contents":null,"size":11067,"mtime":1319177591},{"path":"docs/symbols/Engine.html","type":"blob","contents":null,"size":46754,"mtime":1319177591},{"path":"docs/symbols/Physical.html","type":"blob","contents":null,"size":5410,"mtime":1314320522},{"path":"docs/symbols/Bounded.html","type":"blob","contents":null,"size":18971,"mtime":1319177591},{"path":"docs/symbols/Object.html","type":"blob","contents":null,"size":13206,"mtime":1319177591},{"path":"docs/symbols/Collision.html","type":"blob","contents":null,"size":15629,"mtime":1319177591},{"path":"docs/symbols/Core.html","type":"blob","contents":null,"size":12712,"mtime":1319177591},{"path":"docs/symbols/Framerate.html","type":"blob","contents":null,"size":4439,"mtime":1314320522},{"path":"docs/symbols/Array.html","type":"blob","contents":null,"size":83306,"mtime":1319177590},{"path":"docs/symbols/Matrix.html","type":"blob","contents":null,"size":30701,"mtime":1319177591},{"path":"docs/symbols/PowerCanvas.html","type":"blob","contents":null,"size":12744,"mtime":1319177591},{"path":"docs/symbols/Boolean.html","type":"blob","contents":null,"size":6378,"mtime":1319177591},{"path":"docs/symbols/Drawable.html","type":"blob","contents":null,"size":11437,"mtime":1319177591},{"path":"docs/symbols/Animated.html","type":"blob","contents":null,"size":5365,"mtime":1319177590},{"path":"docs/symbols/Function.html","type":"blob","contents":null,"size":11988,"mtime":1319177591},{"path":"docs/symbols/Math.html","type":"blob","contents":null,"size":7317,"mtime":1319177591},{"path":"docs/symbols/_global_.html","type":"blob","contents":null,"size":3286,"mtime":1319177590},{"path":"docs/symbols/String.html","type":"blob","contents":null,"size":60848,"mtime":1319177591},{"path":"docs/symbols/GameObject.html","type":"blob","contents":null,"size":16490,"mtime":1319177591},{"path":"docs/symbols/Durable.html","type":"blob","contents":null,"size":5577,"mtime":1319177591},{"path":"docs/symbols/keydown.html","type":"blob","contents":null,"size":4715,"mtime":1319177591},{"path":"docs/symbols/ResourceLoader.html","type":"blob","contents":null,"size":7257,"mtime":1319177591},{"path":"docs/symbols/Sprite.html","type":"blob","contents":null,"size":21247,"mtime":1319177591},{"path":"docs/symbols/Local.html","type":"blob","contents":null,"size":10358,"mtime":1319177591},{"path":"docs/symbols/Movable.html","type":"blob","contents":null,"size":5939,"mtime":1319177591},{"path":"docs/symbols/Date.html","type":"blob","contents":null,"size":60804,"mtime":1319177591},{"path":"docs/symbols/Random.html","type":"blob","contents":null,"size":9369,"mtime":1319177591},{"path":"docs/css/default.css","type":"blob","contents":null,"size":6459,"mtime":1319177591},{"path":"docs/files.html","type":"blob","contents":null,"size":2893,"mtime":1319177591},{"path":"docs/index.html","type":"blob","contents":null,"size":7302,"mtime":1319177591},{"path":"pixie.json","type":"blob","contents":"{\"author\":\"STRd6\",\"name\":\"Move Tutorial\",\"libs\":{\"00_gamelib.js\":\"https://github.com/STRd6/gamelib/raw/pixie/gamelib.js\",\"browserlib.js\":\"https://github.com/STRd6/browserlib/raw/pixie/browserlib.js\",\"extralib.js\":\"https://github.com/STRd6/extralib/raw/pixie/extralib.js\"},\"directories\":{\"lib\":\"lib\",\"source\":\"src\",\"test\":\"test\"},\"width\":320,\"height\":240}","size":354,"mtime":1316544850}]
Next
Show me how!