diff --git a/.gitignore b/.gitignore index 78e1398..0fb836e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ node_modules/* hexmine +public/js/main.js + diff --git a/public/index.html b/public/index.html index 1987d8f..38d02f7 100644 --- a/public/index.html +++ b/public/index.html @@ -2,6 +2,7 @@ + Tessellate diff --git a/public/js/main.js b/public/js/main.js deleted file mode 100644 index 1d4656f..0000000 --- a/public/js/main.js +++ /dev/null @@ -1,788 +0,0 @@ -(function(e, a) { for(var i in a) e[i] = a[i]; }(this, /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _tessellate = __webpack_require__(1); - - var _tessellate2 = _interopRequireDefault(_tessellate); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var tessellate = new _tessellate2.default({ - element: '#container' - }); - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _utils = __webpack_require__(2); - - var _onTap = __webpack_require__(3); - - var _onTap2 = _interopRequireDefault(_onTap); - - var _point = __webpack_require__(4); - - var _point2 = _interopRequireDefault(_point); - - var _sketch = __webpack_require__(5); - - var _sketch2 = _interopRequireDefault(_sketch); - - var _tileCircle = __webpack_require__(6); - - var _tileCircle2 = _interopRequireDefault(_tileCircle); - - var _tileDiamond = __webpack_require__(8); - - var _tileDiamond2 = _interopRequireDefault(_tileDiamond); - - var _tileHex = __webpack_require__(9); - - var _tileHex2 = _interopRequireDefault(_tileHex); - - var _tileSquare = __webpack_require__(10); - - var _tileSquare2 = _interopRequireDefault(_tileSquare); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Tessellate = function () { - function Tessellate(settings) { - var _this = this; - - _classCallCheck(this, Tessellate); - - ['draw'].map(function (method) { - _this[method] = _this[method].bind(_this); - }); - - this.element = document.querySelector(settings.element); - - this.sketch = new _sketch2.default({ - element: this.element, - draw: this.draw - }); - - this.map = []; - - this.onTap = new _onTap2.default({ - element: this.element, - click: function click(event) { - var x = event.pageX; - var y = event.pageY; - var tiles = ['circle', 'diamond', 'hex', 'square']; - var styles = ['filled', 'outline']; - var scale = (0, _utils.random)(10, 50); - - _this.map.push({ - tile: tiles[(0, _utils.random)(tiles.length - 1)], - style: styles[(0, _utils.random)(styles.length - 1)], - x: x, - y: y, - scale: scale, - pointy: (0, _utils.random)(1) ? true : false, - color: 'rgba(' + (0, _utils.random)(255) + ', ' + (0, _utils.random)(255) + ', ' + (0, _utils.random)(255) + ', 0.5)' - }); - } - }); - - this.circle = new _tileCircle2.default({ context: this.sketch.getContext() }); - this.diamond = new _tileDiamond2.default({ context: this.sketch.getContext() }); - this.hex = new _tileHex2.default({ context: this.sketch.getContext() }); - this.square = new _tileSquare2.default({ context: this.sketch.getContext() }); - } - - _createClass(Tessellate, [{ - key: 'draw', - value: function draw(context, now, lastTime) { - var _this2 = this; - - var canvas = context.canvas; - var width = canvas.width; - var height = canvas.height; - - context.clearRect(0, 0, width, height); - - this.map.forEach(function (cell) { - return _this2[cell.tile][cell.style](cell); - }); - } - }]); - - return Tessellate; - }(); - - exports.default = Tessellate; - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.throttleEvent = throttleEvent; - exports.clone = clone; - exports.extend = extend; - exports.hypotenuse = hypotenuse; - exports.random = random; - function throttleEvent(type, name, obj) { - obj = obj || window; - var running = false; - - var throttle = function throttle() { - if (!running) { - running = true; - - requestAnimationFrame(function () { - obj.dispatchEvent(new CustomEvent(name)); - running = false; - }); - } - }; - - obj.addEventListener(type, throttle); - } - - throttleEvent('resize', 'optimizedResize'); - - function clone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - - function extend(obj, src) { - for (var key in src) { - if (src.hasOwnProperty(key)) obj[key] = src[key]; - } - - return obj; - } - - function hypotenuse(a, b) { - if (b == null) b = a; - - return Math.sqrt(a * a + b * b); - } - - function random(min, max) { - if (max == null) { - max = min; - min = 0; - } - - return min + Math.floor(Math.random() * (max - min + 1)); - } - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var OnTap = function () { - function OnTap(settings) { - var _this = this; - - _classCallCheck(this, OnTap); - - this.element = settings.element || document.body; - - this.callbacks = {}; - - this.events = ['click']; - - this.events.map(function (method) { - _this[method] = _this[method].bind(_this); - - if (typeof settings[method] === 'function') { - _this.element.addEventListener(method, _this[method]); - _this.callbacks[method] = settings[method]; - } - }); - } - - _createClass(OnTap, [{ - key: 'click', - value: function click(event) { - this.callbacks.click(event); - } - }]); - - return OnTap; - }(); - - exports.default = OnTap; - -/***/ }, -/* 4 */ -/***/ function(module, exports) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Point = function () { - function Point(newX, newY) { - _classCallCheck(this, Point); - - this.x = newX; - this.y = newY; - } - - _createClass(Point, [{ - key: "getX", - value: function getX() { - return this.x; - } - }, { - key: "getY", - value: function getY() { - return this.y; - } - }, { - key: "setX", - value: function setX(newX) { - this.x = newX; - } - }, { - key: "setY", - value: function setY(newY) { - this.y = newY; - } - }, { - key: "getPoint", - value: function getPoint() { - return { x: this.x, y: this.y }; - } - }]); - - return Point; - }(); - - exports.default = Point; - ; - -/***/ }, -/* 5 */ -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - //import {throttleEvent} from './utils.js'; - - var Sketch = function () { - function Sketch(settings) { - var _this = this; - - _classCallCheck(this, Sketch); - - this.lastTime = null; - - ['getContext', 'onResize', 'render'].map(function (method) { - return _this[method] = _this[method].bind(_this); - }); - - this.draw = settings.draw || function () {}; // () => {}; - this.container = settings.element || document.body; - - window.addEventListener('optimizedResize', this.onResize); - window.addEventListener('resize', function () { - return console.log('*** resize ***'); - }); - - this.canvas = document.createElement('canvas'); - this.canvas.width = this.container.offsetWidth; - this.canvas.height = this.container.offsetHeight; - - this.context = this.canvas.getContext('2d'); - - this.container.appendChild(this.canvas); - - requestAnimationFrame(this.render); - } - - _createClass(Sketch, [{ - key: 'getContext', - value: function getContext() { - return this.context; - } - }, { - key: 'onResize', - value: function onResize(event) { - console.log('sketch - onResize', arguments); - } - }, { - key: 'render', - value: function render(now) { - this.draw(this.context, now, this.lastTime); - - this.lastTime = now; - requestAnimationFrame(this.render); - } - }]); - - return Sketch; - }(); - - exports.default = Sketch; - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _tile = __webpack_require__(7); - - var _tile2 = _interopRequireDefault(_tile); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; - - var TileCircle = function (_Tile) { - _inherits(TileCircle, _Tile); - - function TileCircle(settings) { - _classCallCheck(this, TileCircle); - - return _possibleConstructorReturn(this, Object.getPrototypeOf(TileCircle).call(this, settings)); - } - - _createClass(TileCircle, [{ - key: 'filled', - value: function filled(settings) { - this.context.beginPath(); - this.context.arc(settings.x, settings.y, settings.scale, 0, 2 * Math.PI, false); - this.context.fillStyle = settings.color || RGBA_DEFAULT; - this.context.fill(); - } - }, { - key: 'outline', - value: function outline(settings) { - this.context.beginPath(); - this.context.arc(settings.x, settings.y, settings.scale, 0, 2 * Math.PI, false); - this.context.lineWidth = settings.width ? settings.width : 1; - this.context.strokeStyle = settings.color || RGBA_DEFAULT; - this.context.stroke(); - } - }]); - - return TileCircle; - }(_tile2.default); - - exports.default = TileCircle; - -/***/ }, -/* 7 */ -/***/ function(module, exports) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Tile = function () { - function Tile(settings) { - _classCallCheck(this, Tile); - - this.context = settings.context || null; - } - - _createClass(Tile, [{ - key: "setContext", - value: function setContext(newContext) { - this.context = newContext || this.context; - } - }]); - - return Tile; - }(); - - exports.default = Tile; - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _tile = __webpack_require__(7); - - var _tile2 = _interopRequireDefault(_tile); - - var _utils = __webpack_require__(2); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; - - var TileDiamond = function (_Tile) { - _inherits(TileDiamond, _Tile); - - function TileDiamond(settings) { - _classCallCheck(this, TileDiamond); - - return _possibleConstructorReturn(this, Object.getPrototypeOf(TileDiamond).call(this, settings)); - } - - _createClass(TileDiamond, [{ - key: 'filled', - value: function filled(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x + (0, _utils.hypotenuse)(scale), y); - this.context.lineTo(x, y - (0, _utils.hypotenuse)(scale)); - this.context.lineTo(x - (0, _utils.hypotenuse)(scale), y); - this.context.lineTo(x, y + (0, _utils.hypotenuse)(scale)); - - this.context.fillStyle = settings.color || RGBA_DEFAULT; - this.context.fill(); - } - }, { - key: 'outline', - value: function outline(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x + (0, _utils.hypotenuse)(scale), y); - this.context.lineTo(x, y - (0, _utils.hypotenuse)(scale)); - this.context.lineTo(x - (0, _utils.hypotenuse)(scale), y); - this.context.lineTo(x, y + (0, _utils.hypotenuse)(scale)); - this.context.closePath(); - - this.context.lineWidth = settings.width ? settings.width : 1; - this.context.strokeStyle = settings.color || RGBA_DEFAULT; - this.context.stroke(); - } - }]); - - return TileDiamond; - }(_tile2.default); - - exports.default = TileDiamond; - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _tile = __webpack_require__(7); - - var _tile2 = _interopRequireDefault(_tile); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; - - var TileHex = function (_Tile) { - _inherits(TileHex, _Tile); - - function TileHex(settings) { - _classCallCheck(this, TileHex); - - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(TileHex).call(this, settings)); - - _this.sqrt3 = Math.sqrt(3); - - _this.hexSides = 6; - _this.pointyTopCornerX = []; - _this.pointyTopCornerY = []; - _this.flatTopCornerX = []; - _this.flatTopCornerY = []; - - // dice dots, 0,0 is center - // TODO: if pointy: [0].concat(flatTop), if flat: [0].concat(pointy) - // this.hexDotX = [0]; - // this.hexDotY = [0]; - - _this.hexSlices = 24; - _this.hexSliceX = [0]; - _this.hexSliceY = [0]; - - for (var hexSlice = 0; hexSlice < _this.hexSlices; hexSlice++) { - _this.hexSliceX[hexSlice] = parseInt(Math.cos(hexSlice / _this.hexSlices * _this.hexSides * (2 * Math.PI) / _this.hexSides) * 1000) / 1000; - _this.hexSliceY[hexSlice] = parseInt(Math.sin(hexSlice / _this.hexSlices * _this.hexSides * (2 * Math.PI) / _this.hexSides) * 1000) / 1000; - - if ((hexSlice - 2) % 4 === 0) { - var cur = (hexSlice - 2) / 4; - _this.pointyTopCornerX[cur] = _this.hexSliceX[hexSlice]; - _this.pointyTopCornerY[cur] = _this.hexSliceY[hexSlice]; - } - - if (hexSlice % 4 === 0) { - var cur = hexSlice / 4; - _this.flatTopCornerX[cur] = _this.hexSliceX[hexSlice]; - _this.flatTopCornerY[cur] = _this.hexSliceY[hexSlice]; - } - - // if (((hexSlice-2) % 4) === 0) { - // let cur = (hexSlice-2) / 4; - // this.hexCornerX[cur] = this.hexSliceX[hexSlice]; - // this.hexCornerY[cur] = this.hexSliceY[hexSlice]; - // } - // - // if ((hexSlice % 4) === 0) { - // let cur = hexSlice / 4; - // this.hexDotX[cur+1] = this.hexSliceX[hexSlice]; - // this.hexDotY[cur+1] = this.hexSliceY[hexSlice]; - // } - } - return _this; - } - - _createClass(TileHex, [{ - key: 'outline', - value: function outline(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - var hexCornerX = settings.pointy ? this.pointyTopCornerX : this.flatTopCornerX; - var hexCornerY = settings.pointy ? this.pointyTopCornerY : this.flatTopCornerY; - - this.context.beginPath(); - this.context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]); - this.context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]); - this.context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]); - this.context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]); - this.context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]); - this.context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]); - this.context.closePath(); - - this.context.lineWidth = settings.width ? settings.width : 1; - this.context.strokeStyle = settings.color || RGBA_DEFAULT; - this.context.stroke(); - } - }, { - key: 'filled', - value: function filled(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - var hexCornerX = settings.pointy ? this.pointyTopCornerX : this.flatTopCornerX; - var hexCornerY = settings.pointy ? this.pointyTopCornerY : this.flatTopCornerY; - - this.context.beginPath(); - this.context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]); - this.context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]); - this.context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]); - this.context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]); - this.context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]); - this.context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]); - - this.context.fillStyle = settings.color || RGBA_DEFAULT; - this.context.fill(); - } - }]); - - return TileHex; - }(_tile2.default); - - exports.default = TileHex; - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _tile = __webpack_require__(7); - - var _tile2 = _interopRequireDefault(_tile); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; - - var TileSquare = function (_Tile) { - _inherits(TileSquare, _Tile); - - function TileSquare(settings) { - _classCallCheck(this, TileSquare); - - return _possibleConstructorReturn(this, Object.getPrototypeOf(TileSquare).call(this, settings)); - } - - _createClass(TileSquare, [{ - key: 'filled', - value: function filled(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x + scale, y + scale); - this.context.lineTo(x + scale, y - scale); - this.context.lineTo(x - scale, y - scale); - this.context.lineTo(x - scale, y + scale); - - this.context.fillStyle = settings.color || RGBA_DEFAULT; - this.context.fill(); - } - }, { - key: 'outline', - value: function outline(settings) { - var x = settings.x; - var y = settings.y; - var scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x + scale, y + scale); - this.context.lineTo(x + scale, y - scale); - this.context.lineTo(x - scale, y - scale); - this.context.lineTo(x - scale, y + scale); - this.context.closePath(); - - this.context.lineWidth = settings.width ? settings.width : 1; - this.context.strokeStyle = settings.color || RGBA_DEFAULT; - this.context.stroke(); - } - }]); - - return TileSquare; - }(_tile2.default); - - exports.default = TileSquare; - -/***/ } -/******/ ]))); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMjY2ODliNTdjODNkNDNjMTQxMDciLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rlc3NlbGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9vblRhcC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NrZXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZUNpcmNsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZURpYW1vbmQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RpbGVIZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RpbGVTcXVhcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ25DQSxLQUFJLGFBQWEseUJBQWU7QUFDL0IsV0FBUyxZQUFUO0VBRGdCLENBQWIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tDU2lCO0FBQ3BCLFdBRG9CLFVBQ3BCLENBQVksUUFBWixFQUFzQjs7O3lCQURGLFlBQ0U7O0FBQ3JCLElBQUMsTUFBRCxFQUFTLEdBQVQsQ0FBYSxrQkFBVTtBQUFDLFVBQUssTUFBTCxJQUFlLE1BQUssTUFBTCxFQUFhLElBQWIsT0FBZixDQUFEO0lBQVYsQ0FBYixDQURxQjs7QUFHckIsUUFBSyxPQUFMLEdBQWUsU0FBUyxhQUFULENBQXVCLFNBQVMs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LFNBQUssT0FBTCxDQUFhLElBQWIsR0FaZ0I7Ozs7MkJBZVQsVUFBVTtBQUNqQixRQUFJLElBQUksU0FBUyxDQUFULENBRFM7QUFFakIsUUFBSSxJQUFJLFNBQVMsQ0FBVCxDQUZTO0FBR2pCLFFBQUksUUFBUSxTQUFTLEtBQVQsQ0FISzs7QUFLakIsU0FBSyxPQUFMLENBQWEsU0FBYixHQUxpQjtBQU1qQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQU5pQjtBQU9qQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVBpQjtBQVFqQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVJpQjtBQVNqQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVRpQjtBQVVqQixTQUFLLE9BQUwsQ0FBYSxTQUFiLEdBVmlCOztBQVlqQixTQUFLLE9BQUwsQ0FBYSxTQUFiLEdBQXlCLFNBQVMsS0FBVCxHQUFpQixTQUFTLEtBQVQsR0FBaUIsQ0FBbEMsQ0FaUjtBQWFqQixTQUFLLE9BQUwsQ0FBYSxXQUFiLEdBQTJCLFNBQVMsS0FBVCxJQUFrQixZQUFsQixDQWJWO0FBY2pCLFNBQUssT0FBTCxDQUFhLE1BQWIsR0FkaUI7Ozs7U0FwQkUiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgMjY2ODliNTdjODNkNDNjMTQxMDdcbiAqKi8iLCJcbmltcG9ydCBUZXNzZWxsYXRlIGZyb20gJy4vdGVzc2VsbGF0ZS5qcyc7XG5cbnZhciB0ZXNzZWxsYXRlID0gbmV3IFRlc3NlbGxhdGUoe1xuXHRlbGVtZW50OiAnI2NvbnRhaW5lcidcbn0pO1xuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9tYWluLmpzXG4gKiovIiwiXG5pbXBvcnQge3JhbmRvbX0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmltcG9ydCBPblRhcCBmcm9tICcuL29uVGFwLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICcuL3BvaW50LmpzJztcbmltcG9ydCBTa2V0Y2ggZnJvbSAnLi9za2V0Y2guanMnO1xuXG5pbXBvcnQgVGlsZUNpcmNsZSBmcm9tICcuL3RpbGVDaXJjbGUuanMnO1xuaW1wb3J0IFRpbGVEaWFtb25kIGZyb20gJy4vdGlsZURpYW1vbmQuanMnO1xuaW1wb3J0IFRpbGVIZXggICAgZnJvbSAnLi90aWxlSGV4LmpzJztcbmltcG9ydCBUaWxlU3F1YXJlIGZyb20gJy4vdGlsZVNxdWFyZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3NlbGxhdGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdFsnZHJhdyddLm1hcChtZXRob2QgPT4ge3RoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpfSk7XG5cblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNldHRpbmdzLmVsZW1lbnQpO1xuXG5cdFx0dGhpcy5za2V0Y2ggPSBuZXcgU2tldGNoKHtcblx0XHRcdGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcblx0XHRcdGRyYXc6IHRoaXMuZHJhd1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5tYXAgPSBbXTtcblxuXHRcdHRoaXMub25UYXAgPSBuZXcgT25UYXAoe1xuXHRcdFx0ZWxlbWVudDogdGhpcy5lbGVtZW50LFxuXHRcdFx0Y2xpY2s6IChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgeCA9IGV2ZW50LnBhZ2VYO1xuXHRcdFx0XHRsZXQgeSA9IGV2ZW50LnBhZ2VZO1xuXHRcdFx0XHRsZXQgdGlsZXMgPSBbJ2NpcmNsZScsICdkaWFtb25kJywgJ2hleCcsICdzcXVhcmUnXTtcblx0XHRcdFx0bGV0IHN0eWxlcyA9IFsnZmlsbGVkJywgJ291dGxpbmUnXTtcblx0XHRcdFx0bGV0IHNjYWxlID0gcmFuZG9tKDEwLCA1MCk7XG5cblx0XHRcdFx0dGhpcy5tYXAucHVzaCh7XG5cdFx0XHRcdFx0dGlsZTogdGlsZXNbcmFuZG9tKHRpbGVzLmxlbmd0aC0xKV0sXG5cdFx0XHRcdFx0c3R5bGU6IHN0eWxlc1tyYW5kb20oc3R5bGVzLmxlbmd0aC0xKV0sXG5cdFx0XHRcdFx0eCxcblx0XHRcdFx0XHR5LFxuXHRcdFx0XHRcdHNjYWxlLFxuXHRcdFx0XHRcdHBvaW50eTogcmFuZG9tKDEpID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdFx0XHRcdGNvbG9yOiBgcmdiYSgkeyByYW5kb20oMjU1KSB9LCAkeyByYW5kb20oMjU1KSB9LCAkeyByYW5kb20oMjU1KSB9LCAwLjUpYFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuY2lyY2xlICA9IG5ldyBUaWxlQ2lyY2xlKHtjb250ZXh0OiB0aGlzLnNrZXRjaC5nZXRDb250ZXh0KCl9KTtcblx0XHR0aGlzLmRpYW1vbmQgPSBuZXcgVGlsZURpYW1vbmQoe2NvbnRleHQ6IHRoaXMuc2tldGNoLmdldENvbnRleHQoKX0pO1xuXHRcdHRoaXMuaGV4ICAgICA9IG5ldyBUaWxlSGV4KHtjb250ZXh0OiB0aGlzLnNrZXRjaC5nZXRDb250ZXh0KCl9KTtcblx0XHR0aGlzLnNxdWFyZSAgPSBuZXcgVGlsZVNxdWFyZSh7Y29udGV4dDogdGhpcy5za2V0Y2guZ2V0Q29udGV4dCgpfSk7XG5cdH1cblxuXHRkcmF3KGNvbnRleHQsIG5vdywgbGFzdFRpbWUpIHtcblx0XHRsZXQgY2FudmFzID0gY29udGV4dC5jYW52YXM7XG5cdFx0bGV0IHdpZHRoID0gY2FudmFzLndpZHRoO1xuXHRcdGxldCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXG5cdFx0Y29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cblx0XHR0aGlzLm1hcC5mb3JFYWNoKGNlbGwgPT4gdGhpc1tjZWxsLnRpbGVdW2NlbGwuc3R5bGVdKGNlbGwpKTtcblx0fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvdGVzc2VsbGF0ZS5qc1xuICoqLyIsIlxuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlRXZlbnQodHlwZSwgbmFtZSwgb2JqKSB7XG5cdG9iaiA9IG9iaiB8fCB3aW5kb3c7XG5cdGxldCBydW5uaW5nID0gZmFsc2U7XG5cblx0bGV0IHRocm90dGxlID0gKCkgPT4ge1xuXHRcdGlmICghcnVubmluZykge1xuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdG9iai5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChuYW1lKSk7XG5cdFx0XHRcdHJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRocm90dGxlKTtcbn1cblxudGhyb3R0bGVFdmVudCgncmVzaXplJywgJ29wdGltaXplZFJlc2l6ZScpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUob2JqKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iaiwgc3JjKSB7XG5cdGZvciAobGV0IGtleSBpbiBzcmMpIHtcblx0XHRpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIG9ialtrZXldID0gc3JjW2tleV07XG5cdH1cblxuXHRyZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHlwb3RlbnVzZShhLCBiKSB7XG5cdGlmIChiID09IG51bGwpIGIgPSBhO1xuXG5cdHJldHVybiBNYXRoLnNxcnQoYSphICsgYipiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCkge1xuXHRpZiAobWF4ID09IG51bGwpIHtcblx0XHRtYXggPSBtaW47XG5cdFx0bWluID0gMDtcblx0fVxuXG5cdHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy91dGlscy5qc1xuICoqLyIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT25UYXAge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHRoaXMuZWxlbWVudCA9IHNldHRpbmdzLmVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcblxuXHRcdHRoaXMuY2FsbGJhY2tzID0ge307XG5cblx0XHR0aGlzLmV2ZW50cyA9IFsnY2xpY2snXTtcblxuXHRcdHRoaXMuZXZlbnRzLm1hcChtZXRob2QgPT4ge1xuXHRcdFx0dGhpc1ttZXRob2RdID0gdGhpc1ttZXRob2RdLmJpbmQodGhpcyk7XG5cblx0XHRcdGlmICh0eXBlb2Ygc2V0dGluZ3NbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtZXRob2QsIHRoaXNbbWV0aG9kXSk7XG5cdFx0XHRcdHRoaXMuY2FsbGJhY2tzW21ldGhvZF0gPSBzZXR0aW5nc1ttZXRob2RdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Y2xpY2soZXZlbnQpIHtcblx0XHR0aGlzLmNhbGxiYWNrcy5jbGljayhldmVudCk7XG5cdH1cbn1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvb25UYXAuanNcbiAqKi8iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50IHtcblx0Y29uc3RydWN0b3IobmV3WCwgbmV3WSkge1xuXHRcdHRoaXMueCA9IG5ld1g7XG5cdFx0dGhpcy55ID0gbmV3WTtcblx0fVxuXG5cdGdldFgoKSB7IHJldHVybiB0aGlzLng7IH1cblx0Z2V0WSgpIHsgcmV0dXJuIHRoaXMueTsgfVxuXG5cdHNldFgobmV3WCkgeyB0aGlzLnggPSBuZXdYOyB9XG5cdHNldFkobmV3WSkgeyB0aGlzLnkgPSBuZXdZOyB9XG5cblx0Z2V0UG9pbnQoKSB7IHJldHVybiB7eDogdGhpcy54LCB5OiB0aGlzLnl9OyB9XG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcG9pbnQuanNcbiAqKi8iLCJcbi8vaW1wb3J0IHt0aHJvdHRsZUV2ZW50fSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2tldGNoIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHR0aGlzLmxhc3RUaW1lID0gbnVsbDtcblxuXHRcdFsnZ2V0Q29udGV4dCcsICdvblJlc2l6ZScsICdyZW5kZXInXS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuZHJhdyA9IHNldHRpbmdzLmRyYXcgfHwgZnVuY3Rpb24oKSB7fTsgLy8gKCkgPT4ge307XG5cdFx0dGhpcy5jb250YWluZXIgPSBzZXR0aW5ncy5lbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3B0aW1pemVkUmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IGNvbnNvbGUubG9nKCcqKiogcmVzaXplICoqKicpKTtcblxuXHRcdHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cdFx0dGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcblx0XHR0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cblx0XHR0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyKTtcblx0fVxuXG5cdGdldENvbnRleHQoKSB7IHJldHVybiB0aGlzLmNvbnRleHQ7IH1cblxuXHRvblJlc2l6ZShldmVudCkge1xuXHRcdGNvbnNvbGUubG9nKCdza2V0Y2ggLSBvblJlc2l6ZScsIGFyZ3VtZW50cyk7XG5cdH1cblxuXHRyZW5kZXIobm93KSB7XG5cdFx0dGhpcy5kcmF3KHRoaXMuY29udGV4dCwgbm93LCB0aGlzLmxhc3RUaW1lKTtcblxuXHRcdHRoaXMubGFzdFRpbWUgPSBub3c7XG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyKTtcblx0fVxufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9za2V0Y2guanNcbiAqKi8iLCJcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbmxldCBSR0JBX0RFRkFVTFQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZUNpcmNsZSBleHRlbmRzIFRpbGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHN1cGVyKHNldHRpbmdzKTtcblx0fVxuXG5cdGZpbGxlZChzZXR0aW5ncykge1xuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQuYXJjKHNldHRpbmdzLngsIHNldHRpbmdzLnksIHNldHRpbmdzLnNjYWxlLCAwLCAyKk1hdGguUEksIGZhbHNlKTtcblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5hcmMoc2V0dGluZ3MueCwgc2V0dGluZ3MueSwgc2V0dGluZ3Muc2NhbGUsIDAsIDIqTWF0aC5QSSwgZmFsc2UpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVDaXJjbGUuanNcbiAqKi8iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHRoaXMuY29udGV4dCA9IHNldHRpbmdzLmNvbnRleHQgfHwgbnVsbDtcblx0fVxuXG5cdHNldENvbnRleHQobmV3Q29udGV4dCkge1xuXHRcdHRoaXMuY29udGV4dCA9IG5ld0NvbnRleHQgfHwgdGhpcy5jb250ZXh0O1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGUuanNcbiAqKi8iLCJcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbmltcG9ydCB7aHlwb3RlbnVzZX0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmxldCBSR0JBX0RFRkFVTFQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZURpYW1vbmQgZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cdH1cblxuXHRmaWxsZWQoc2V0dGluZ3MpIHtcblx0XHRsZXQgeCA9IHNldHRpbmdzLng7XG5cdFx0bGV0IHkgPSBzZXR0aW5ncy55O1xuXHRcdGxldCBzY2FsZSA9IHNldHRpbmdzLnNjYWxlO1xuXG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5tb3ZlVG8oeCtoeXBvdGVudXNlKHNjYWxlKSwgeSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LCB5LWh5cG90ZW51c2Uoc2NhbGUpKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtaHlwb3RlbnVzZShzY2FsZSksIHkpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCwgeStoeXBvdGVudXNlKHNjYWxlKSk7XG5cblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0bGV0IHggPSBzZXR0aW5ncy54O1xuXHRcdGxldCB5ID0gc2V0dGluZ3MueTtcblx0XHRsZXQgc2NhbGUgPSBzZXR0aW5ncy5zY2FsZTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHgraHlwb3RlbnVzZShzY2FsZSksIHkpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCwgeS1oeXBvdGVudXNlKHNjYWxlKSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LWh5cG90ZW51c2Uoc2NhbGUpLCB5KTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgsIHkraHlwb3RlbnVzZShzY2FsZSkpO1xuXHRcdHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVEaWFtb25kLmpzXG4gKiovIiwiXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuXG5sZXQgUkdCQV9ERUZBVUxUID0gJ3JnYmEoMCwgMCwgMCwgMC41KSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVIZXggZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cblx0XHR0aGlzLnNxcnQzID0gTWF0aC5zcXJ0KDMpO1xuXG5cdFx0dGhpcy5oZXhTaWRlcyA9IDY7XG5cdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJYID0gW107XG5cdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJZID0gW107XG5cdFx0dGhpcy5mbGF0VG9wQ29ybmVyWCA9IFtdO1xuXHRcdHRoaXMuZmxhdFRvcENvcm5lclkgPSBbXTtcblxuXHRcdC8vIGRpY2UgZG90cywgMCwwIGlzIGNlbnRlclxuXHRcdC8vIFRPRE86IGlmIHBvaW50eTogWzBdLmNvbmNhdChmbGF0VG9wKSwgaWYgZmxhdDogWzBdLmNvbmNhdChwb2ludHkpXG4vL1x0XHR0aGlzLmhleERvdFggPSBbMF07XG4vL1x0XHR0aGlzLmhleERvdFkgPSBbMF07XG5cblx0XHR0aGlzLmhleFNsaWNlcyA9IDI0O1xuXHRcdHRoaXMuaGV4U2xpY2VYID0gWzBdO1xuXHRcdHRoaXMuaGV4U2xpY2VZID0gWzBdO1xuXG5cdFx0Zm9yIChsZXQgaGV4U2xpY2UgPSAwOyBoZXhTbGljZSA8IHRoaXMuaGV4U2xpY2VzOyBoZXhTbGljZSsrKSB7XG5cdFx0XHR0aGlzLmhleFNsaWNlWFtoZXhTbGljZV0gPSBwYXJzZUludChNYXRoLmNvcygoKGhleFNsaWNlL3RoaXMuaGV4U2xpY2VzKSp0aGlzLmhleFNpZGVzKSAqICgyICogTWF0aC5QSSkgLyB0aGlzLmhleFNpZGVzKSAqIDEwMDApIC8gMTAwMDtcblx0XHRcdHRoaXMuaGV4U2xpY2VZW2hleFNsaWNlXSA9IHBhcnNlSW50KE1hdGguc2luKCgoaGV4U2xpY2UvdGhpcy5oZXhTbGljZXMpKnRoaXMuaGV4U2lkZXMpICogKDIgKiBNYXRoLlBJKSAvIHRoaXMuaGV4U2lkZXMpICogMTAwMCkgLyAxMDAwO1xuXG5cdFx0XHRpZiAoKChoZXhTbGljZS0yKSAlIDQpID09PSAwKSB7XG5cdFx0XHRcdGxldCBjdXIgPSAoaGV4U2xpY2UtMikgLyA0O1xuXHRcdFx0XHR0aGlzLnBvaW50eVRvcENvcm5lclhbY3VyXSA9IHRoaXMuaGV4U2xpY2VYW2hleFNsaWNlXTtcblx0XHRcdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJZW2N1cl0gPSB0aGlzLmhleFNsaWNlWVtoZXhTbGljZV07XG5cdFx0XHR9XG5cblx0XHRcdGlmICgoaGV4U2xpY2UgJSA0KSA9PT0gMCkge1xuXHRcdFx0XHRsZXQgY3VyID0gaGV4U2xpY2UgLyA0O1xuXHRcdFx0XHR0aGlzLmZsYXRUb3BDb3JuZXJYW2N1cl0gPSB0aGlzLmhleFNsaWNlWFtoZXhTbGljZV07XG5cdFx0XHRcdHRoaXMuZmxhdFRvcENvcm5lcllbY3VyXSA9IHRoaXMuaGV4U2xpY2VZW2hleFNsaWNlXTtcblx0XHRcdH1cblxuLy9cdFx0XHRpZiAoKChoZXhTbGljZS0yKSAlIDQpID09PSAwKSB7XG4vL1x0XHRcdFx0bGV0IGN1ciA9IChoZXhTbGljZS0yKSAvIDQ7XG4vL1x0XHRcdFx0dGhpcy5oZXhDb3JuZXJYW2N1cl0gPSB0aGlzLmhleFNsaWNlWFtoZXhTbGljZV07XG4vL1x0XHRcdFx0dGhpcy5oZXhDb3JuZXJZW2N1cl0gPSB0aGlzLmhleFNsaWNlWVtoZXhTbGljZV07XG4vL1x0XHRcdH1cbi8vXG4vL1x0XHRcdGlmICgoaGV4U2xpY2UgJSA0KSA9PT0gMCkge1xuLy9cdFx0XHRcdGxldCBjdXIgPSBoZXhTbGljZSAvIDQ7XG4vL1x0XHRcdFx0dGhpcy5oZXhEb3RYW2N1cisxXSA9IHRoaXMuaGV4U2xpY2VYW2hleFNsaWNlXTtcbi8vXHRcdFx0XHR0aGlzLmhleERvdFlbY3VyKzFdID0gdGhpcy5oZXhTbGljZVlbaGV4U2xpY2VdO1xuLy9cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0b3V0bGluZShzZXR0aW5ncykge1xuXHRcdGxldCB4ID0gc2V0dGluZ3MueDtcblx0XHRsZXQgeSA9IHNldHRpbmdzLnk7XG5cdFx0bGV0IHNjYWxlID0gc2V0dGluZ3Muc2NhbGU7XG5cdFx0bGV0IGhleENvcm5lclggPSBzZXR0aW5ncy5wb2ludHkgPyB0aGlzLnBvaW50eVRvcENvcm5lclggOiB0aGlzLmZsYXRUb3BDb3JuZXJYO1xuXHRcdGxldCBoZXhDb3JuZXJZID0gc2V0dGluZ3MucG9pbnR5ID8gdGhpcy5wb2ludHlUb3BDb3JuZXJZIDogdGhpcy5mbGF0VG9wQ29ybmVyWTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFsxXSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVsxXSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzJdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbM10sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFs0XSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVs0XSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzVdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcblx0XHR0aGlzLmNvbnRleHQuY2xvc2VQYXRoKCk7XG5cblx0XHR0aGlzLmNvbnRleHQubGluZVdpZHRoID0gc2V0dGluZ3Mud2lkdGggPyBzZXR0aW5ncy53aWR0aCA6IDE7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5zdHJva2UoKTtcblx0fVxuXG5cdGZpbGxlZChzZXR0aW5ncykge1xuXHRcdGxldCB4ID0gc2V0dGluZ3MueDtcblx0XHRsZXQgeSA9IHNldHRpbmdzLnk7XG5cdFx0bGV0IHNjYWxlID0gc2V0dGluZ3Muc2NhbGU7XG5cdFx0bGV0IGhleENvcm5lclggPSBzZXR0aW5ncy5wb2ludHkgPyB0aGlzLnBvaW50eVRvcENvcm5lclggOiB0aGlzLmZsYXRUb3BDb3JuZXJYO1xuXHRcdGxldCBoZXhDb3JuZXJZID0gc2V0dGluZ3MucG9pbnR5ID8gdGhpcy5wb2ludHlUb3BDb3JuZXJZIDogdGhpcy5mbGF0VG9wQ29ybmVyWTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFsxXSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVsxXSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzJdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbM10sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFs0XSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVs0XSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzVdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcblxuXHRcdHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LmZpbGwoKTtcblx0fVxufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy90aWxlSGV4LmpzXG4gKiovIiwiXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuXG5sZXQgUkdCQV9ERUZBVUxUID0gJ3JnYmEoMCwgMCwgMCwgMC41KSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVTcXVhcmUgZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cdH1cblxuXHRmaWxsZWQoc2V0dGluZ3MpIHtcblx0XHRsZXQgeCA9IHNldHRpbmdzLng7XG5cdFx0bGV0IHkgPSBzZXR0aW5ncy55O1xuXHRcdGxldCBzY2FsZSA9IHNldHRpbmdzLnNjYWxlO1xuXG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5tb3ZlVG8oeCtzY2FsZSwgeStzY2FsZSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4K3NjYWxlLCB5LXNjYWxlKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtc2NhbGUsIHktc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeC1zY2FsZSwgeStzY2FsZSk7XG5cblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0bGV0IHggPSBzZXR0aW5ncy54O1xuXHRcdGxldCB5ID0gc2V0dGluZ3MueTtcblx0XHRsZXQgc2NhbGUgPSBzZXR0aW5ncy5zY2FsZTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHgrc2NhbGUsIHkrc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCtzY2FsZSwgeS1zY2FsZSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LXNjYWxlLCB5LXNjYWxlKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtc2NhbGUsIHkrc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVTcXVhcmUuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/src/tessellate.js b/src/tessellate.js index 04f1d0e..0174a45 100644 --- a/src/tessellate.js +++ b/src/tessellate.js @@ -6,7 +6,6 @@ import Point from './point.js'; import Sketch from './sketch.js'; import TileCircle from './tileCircle.js'; -import TileDiamond from './tileDiamond.js'; import TileHex from './tileHex.js'; import TileSquare from './tileSquare.js'; @@ -28,7 +27,7 @@ export default class Tessellate { click: (event) => { let x = event.pageX; let y = event.pageY; - let tiles = ['circle', 'diamond', 'hex', 'square']; + let tiles = ['circle', 'hex', 'square']; let styles = ['filled', 'outline']; let scale = random(10, 50); @@ -45,7 +44,6 @@ export default class Tessellate { }); this.circle = new TileCircle({context: this.sketch.getContext()}); - this.diamond = new TileDiamond({context: this.sketch.getContext()}); this.hex = new TileHex({context: this.sketch.getContext()}); this.square = new TileSquare({context: this.sketch.getContext()}); } diff --git a/src/tileDiamond.js b/src/tileDiamond.js deleted file mode 100644 index 1f9f92f..0000000 --- a/src/tileDiamond.js +++ /dev/null @@ -1,45 +0,0 @@ - -import Tile from './tile.js'; - -import {hypotenuse} from './utils.js'; - -let RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; - -export default class TileDiamond extends Tile { - constructor(settings) { - super(settings); - } - - filled(settings) { - let x = settings.x; - let y = settings.y; - let scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x+hypotenuse(scale), y); - this.context.lineTo(x, y-hypotenuse(scale)); - this.context.lineTo(x-hypotenuse(scale), y); - this.context.lineTo(x, y+hypotenuse(scale)); - - this.context.fillStyle = settings.color || RGBA_DEFAULT; - this.context.fill(); - } - - outline(settings) { - let x = settings.x; - let y = settings.y; - let scale = settings.scale; - - this.context.beginPath(); - this.context.moveTo(x+hypotenuse(scale), y); - this.context.lineTo(x, y-hypotenuse(scale)); - this.context.lineTo(x-hypotenuse(scale), y); - this.context.lineTo(x, y+hypotenuse(scale)); - this.context.closePath(); - - this.context.lineWidth = settings.width ? settings.width : 1; - this.context.strokeStyle = settings.color || RGBA_DEFAULT; - this.context.stroke(); - } -} - diff --git a/src/tileHex.js b/src/tileHex.js index 4b8a071..661bf41 100644 --- a/src/tileHex.js +++ b/src/tileHex.js @@ -7,50 +7,33 @@ export default class TileHex extends Tile { constructor(settings) { super(settings); - this.sqrt3 = Math.sqrt(3); - - this.hexSides = 6; - this.pointyTopCornerX = []; - this.pointyTopCornerY = []; this.flatTopCornerX = []; this.flatTopCornerY = []; + this.pointyTopCornerX = []; + this.pointyTopCornerY = []; // dice dots, 0,0 is center // TODO: if pointy: [0].concat(flatTop), if flat: [0].concat(pointy) // this.hexDotX = [0]; // this.hexDotY = [0]; - this.hexSlices = 24; - this.hexSliceX = [0]; - this.hexSliceY = [0]; - - for (let hexSlice = 0; hexSlice < this.hexSlices; hexSlice++) { - this.hexSliceX[hexSlice] = parseInt(Math.cos(((hexSlice/this.hexSlices)*this.hexSides) * (2 * Math.PI) / this.hexSides) * 1000) / 1000; - this.hexSliceY[hexSlice] = parseInt(Math.sin(((hexSlice/this.hexSlices)*this.hexSides) * (2 * Math.PI) / this.hexSides) * 1000) / 1000; - - if (((hexSlice-2) % 4) === 0) { - let cur = (hexSlice-2) / 4; - this.pointyTopCornerX[cur] = this.hexSliceX[hexSlice]; - this.pointyTopCornerY[cur] = this.hexSliceY[hexSlice]; - } + let hexSides = 6; + let hexSlices = 24; + for (let hexSlice = 0; hexSlice < hexSlices; hexSlice++) { + let x = parseInt(Math.cos(((hexSlice / hexSlices) * hexSides) * (2 * Math.PI) / hexSides) * 1000) / 1000; + let y = parseInt(Math.sin(((hexSlice / hexSlices) * hexSides) * (2 * Math.PI) / hexSides) * 1000) / 1000; if ((hexSlice % 4) === 0) { let cur = hexSlice / 4; - this.flatTopCornerX[cur] = this.hexSliceX[hexSlice]; - this.flatTopCornerY[cur] = this.hexSliceY[hexSlice]; + this.flatTopCornerX[cur] = x; + this.flatTopCornerY[cur] = y; } -// if (((hexSlice-2) % 4) === 0) { -// let cur = (hexSlice-2) / 4; -// this.hexCornerX[cur] = this.hexSliceX[hexSlice]; -// this.hexCornerY[cur] = this.hexSliceY[hexSlice]; -// } -// -// if ((hexSlice % 4) === 0) { -// let cur = hexSlice / 4; -// this.hexDotX[cur+1] = this.hexSliceX[hexSlice]; -// this.hexDotY[cur+1] = this.hexSliceY[hexSlice]; -// } + if (((hexSlice-2) % 4) === 0) { + let cur = (hexSlice-2) / 4; + this.pointyTopCornerX[cur] = x; + this.pointyTopCornerY[cur] = y; + } } } diff --git a/src/tileSquare.js b/src/tileSquare.js index 09fa3c4..be5fec5 100644 --- a/src/tileSquare.js +++ b/src/tileSquare.js @@ -1,23 +1,32 @@ import Tile from './tile.js'; +import {sqrt2} from './utils.js'; + let RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)'; export default class TileSquare extends Tile { constructor(settings) { super(settings); + + this.squareX = [1, 1, -1, -1]; + this.squareY = [1, -1, -1, 1]; + this.diamondX = [sqrt2, 0, -sqrt2, 0]; + this.diamondY = [0, -sqrt2, 0, sqrt2]; } filled(settings) { let x = settings.x; let y = settings.y; let scale = settings.scale; + let squareCornerX = settings.pointy ? this.diamondX : this.squareX; + let squareCornerY = settings.pointy ? this.diamondY : this.squareY; this.context.beginPath(); - this.context.moveTo(x+scale, y+scale); - this.context.lineTo(x+scale, y-scale); - this.context.lineTo(x-scale, y-scale); - this.context.lineTo(x-scale, y+scale); + this.context.moveTo(x + scale * squareCornerX[0], y + scale * squareCornerY[0]); + this.context.lineTo(x + scale * squareCornerX[1], y + scale * squareCornerY[1]); + this.context.lineTo(x + scale * squareCornerX[2], y + scale * squareCornerY[2]); + this.context.lineTo(x + scale * squareCornerX[3], y + scale * squareCornerY[3]); this.context.fillStyle = settings.color || RGBA_DEFAULT; this.context.fill(); @@ -27,12 +36,14 @@ export default class TileSquare extends Tile { let x = settings.x; let y = settings.y; let scale = settings.scale; + let squareCornerX = settings.pointy ? this.diamondX : this.squareX; + let squareCornerY = settings.pointy ? this.diamondY : this.squareY; this.context.beginPath(); - this.context.moveTo(x+scale, y+scale); - this.context.lineTo(x+scale, y-scale); - this.context.lineTo(x-scale, y-scale); - this.context.lineTo(x-scale, y+scale); + this.context.moveTo(x + scale * squareCornerX[0], y + scale * squareCornerY[0]); + this.context.lineTo(x + scale * squareCornerX[1], y + scale * squareCornerY[1]); + this.context.lineTo(x + scale * squareCornerX[2], y + scale * squareCornerY[2]); + this.context.lineTo(x + scale * squareCornerX[3], y + scale * squareCornerY[3]); this.context.closePath(); this.context.lineWidth = settings.width ? settings.width : 1; diff --git a/src/utils.js b/src/utils.js index ad815f2..499f0e1 100644 --- a/src/utils.js +++ b/src/utils.js @@ -31,6 +31,13 @@ export function extend(obj, src) { return obj; } +// hypotenuse factor of isoscelese right triangle +export let sqrt2 = Math.sqrt(2); + +// short width factor given the lenght of a hexagon's side +// (2*S gives long width) +export let sqrt3 = Math.sqrt(3); + export function hypotenuse(a, b) { if (b == null) b = a;