From bf17c089093698c75326c520611b59cab1af9157 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 30 Oct 2020 17:50:03 +0000 Subject: [PATCH 01/64] wip (wasm isn't compiling) --- .gitattributes | 17 - .gitignore | 10 +- Cargo.toml | 27 + LICENSE | 21 + _config.yml | 1 - build.sh | 5 +- deploy.sh | 8 +- includes/Rubik-Regular.ttf | Bin 220600 -> 0 bytes includes/croppie.css | 250 ---- includes/croppie.js | 1596 -------------------------- includes/default.bitsy | 84 -- includes/jquery.min.js | 2 - includes/lodash.min.js | 136 --- includes/rubik-regular-webfont.woff | Bin 33332 -> 0 bytes includes/rubik-regular-webfont.woff2 | Bin 27032 -> 0 bytes includes/script.js | 551 --------- includes/style.css | 112 -- includes/style.less | 196 ++-- index.html | 90 -- index.pug | 130 +-- package.json | 14 - readme.md | 87 -- script.js | 168 +++ src/lib.rs | 174 +++ 24 files changed, 523 insertions(+), 3156 deletions(-) delete mode 100644 .gitattributes create mode 100644 Cargo.toml create mode 100644 LICENSE delete mode 100644 _config.yml delete mode 100644 includes/Rubik-Regular.ttf delete mode 100644 includes/croppie.css delete mode 100644 includes/croppie.js delete mode 100644 includes/default.bitsy delete mode 100644 includes/jquery.min.js delete mode 100644 includes/lodash.min.js delete mode 100644 includes/rubik-regular-webfont.woff delete mode 100644 includes/rubik-regular-webfont.woff2 delete mode 100644 includes/script.js delete mode 100644 includes/style.css delete mode 100644 index.html delete mode 100644 package.json delete mode 100644 readme.md create mode 100644 script.js create mode 100644 src/lib.rs diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index bdb0cab..0000000 --- a/.gitattributes +++ /dev/null @@ -1,17 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 416130f..6daf201 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -node_modules -package-lock.json - # Windows image file caches Thumbs.db ehthumbs.db @@ -53,8 +50,7 @@ Temporary Items *.zip itch* -# node -node_modules - # IDE stuff -.idea \ No newline at end of file +.idea + +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d7397c1 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "pixsy" +version = "0.72.0" +description = "convert images to Bitsy rooms" +authors = ["Max Bradbury "] +edition = "2018" +license = "MIT" +repository = "https://tinybird.dev/max/image-to-bitsy" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +"base64" = "^0.12.3" +"bitsy-parser" = "^0.72.0" +"image" = "^0.23.7" +"wasm-bindgen" = "^0.2.64" + +[dependencies.web-sys] +version = "^0.3.4" +features = [ + 'Document', + 'Element', + 'HtmlElement', + 'Node', + 'Window', +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab3b50e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Max Bradbury + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 9da9a02..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-dinky \ No newline at end of file diff --git a/build.sh b/build.sh index a9ef88a..ac2bd52 100644 --- a/build.sh +++ b/build.sh @@ -1,4 +1,5 @@ -#!/usr/bin/env bash +#! /usr/bin/env bash -pug index.pug index.html +pug index.pug lessc includes/style.less includes/style.css +wasm-pack build --target web diff --git a/deploy.sh b/deploy.sh index 71b88e7..23ee025 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#! /usr/bin/env bash -zip -r image-to-bitsy.zip readme.md index.html includes/ -butler push image-to-bitsy.zip ruin/image-to-bitsy:html +./build.sh +# todo create dist directory instead of zip +zip -r tilesy.zip README.md index.html script.js background.png pkg/ includes/ +butler push tilesy.zip ruin/image-to-bitsy:html diff --git a/includes/Rubik-Regular.ttf b/includes/Rubik-Regular.ttf deleted file mode 100644 index 20100d2fc0afc686a3c0eb9b1350bbb31dc557b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220600 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

  • q4~T`%0`A@Qjs-OC0=*xj_a1uhsrO!bKUVL@ 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 X&bh#gq^2D=Usf57(*6{N^-}*o{XiDd literal 0 HcmV?d00001 diff --git a/old/includes/croppie.css b/old/includes/croppie.css new file mode 100644 index 0000000..0af2e2c --- /dev/null +++ b/old/includes/croppie.css @@ -0,0 +1,250 @@ +.croppie-container { + width: 100%; + height: 100%; +} + +.croppie-container .cr-image { + z-index: -1; + position: absolute; + top: 0; + left: 0; + transform-origin: 0 0; + max-height: none; + max-width: none; +} + +.croppie-container .cr-boundary { + position: relative; + overflow: hidden; + margin: 0 auto; + z-index: 1; + width: 100%; + height: 100%; +} + +.croppie-container .cr-viewport, +.croppie-container .cr-resizer { + position: absolute; + border: 2px solid #fff; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); + z-index: 0; +} + +.croppie-container .cr-resizer { + z-index: 2; + box-shadow: none; + pointer-events: none; +} + +.croppie-container .cr-resizer-vertical, +.croppie-container .cr-resizer-horisontal { + position: absolute; + pointer-events: all; +} + +.croppie-container .cr-resizer-vertical::after, +.croppie-container .cr-resizer-horisontal::after { + display: block; + position: absolute; + box-sizing: border-box; + border: 1px solid black; + background: #fff; + width: 10px; + height: 10px; + content: ''; +} + +.croppie-container .cr-resizer-vertical { + bottom: -5px; + cursor: row-resize; + width: 100%; + height: 10px; +} + +.croppie-container .cr-resizer-vertical::after { + left: 50%; + margin-left: -5px; +} + +.croppie-container .cr-resizer-horisontal { + right: -5px; + cursor: col-resize; + width: 10px; + height: 100%; +} + +.croppie-container .cr-resizer-horisontal::after { + top: 50%; + margin-top: -5px; +} + +.croppie-container .cr-original-image { + display: none; +} + +.croppie-container .cr-vp-circle { + border-radius: 50%; +} + +.croppie-container .cr-overlay { + z-index: 1; + position: absolute; + cursor: move; + touch-action: none; +} + +.croppie-container .cr-slider-wrap { + width: 75%; + margin: 15px auto; + text-align: center; +} + +.croppie-result { + position: relative; + overflow: hidden; +} + +.croppie-result img { + position: absolute; +} + +.croppie-container .cr-image, +.croppie-container .cr-overlay, +.croppie-container .cr-viewport { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} + +/*************************************/ +/***** STYLING RANGE INPUT ***********/ +/*************************************/ +/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ +/*************************************/ + +.cr-slider { + -webkit-appearance: none; +/*removes default webkit styles*/ + /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ + width: 300px; +/*required for proper track sizing in FF*/ + max-width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background-color: transparent; +} + +.cr-slider::-webkit-slider-runnable-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +.cr-slider:focus { + outline: none; +} +/* +.cr-slider:focus::-webkit-slider-runnable-track { +background: #ccc; +} +*/ + +.cr-slider::-moz-range-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +/*hide the outline behind the border*/ +.cr-slider:-moz-focusring { + outline: 1px solid white; + outline-offset: -1px; +} + +.cr-slider::-ms-track { + width: 100%; + height: 5px; + background: transparent; +/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ + border-width: 6px 0; + color: transparent;/*remove default tick marks*/ +} +.cr-slider::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top:1px; +} +.cr-slider:focus::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); +} +.cr-slider:focus::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); +} +/*******************************************/ + +/***********************************/ +/* Rotation Tools */ +/***********************************/ +.cr-rotate-controls { + position: absolute; + bottom: 5px; + left: 5px; + z-index: 1; +} +.cr-rotate-controls button { + border: 0; + background: none; +} +.cr-rotate-controls i:before { + display: inline-block; + font-style: normal; + font-weight: 900; + font-size: 22px; +} +.cr-rotate-l i:before { + content: '↺'; +} +.cr-rotate-r i:before { + content: '↻'; +} diff --git a/old/includes/croppie.js b/old/includes/croppie.js new file mode 100644 index 0000000..f6f4671 --- /dev/null +++ b/old/includes/croppie.js @@ -0,0 +1,1596 @@ +/************************* + * Croppie + * Copyright 2017 + * Foliotek + * Version: 2.5.1 + *************************/ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['exports'], factory); + } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { + // CommonJS + factory(exports); + } else { + // Browser globals + factory((root.commonJsStrict = {})); + } +}(this, function (exports) { + + /* Polyfills */ + if (typeof Promise !== 'function') { + /*! promise-polyfill 3.1.0 */ + !function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof a)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void k(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError("A promise cannot be resolved with itself.");if(a&&("object"==typeof a||"function"==typeof a)){var c=a.then;if("function"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k="function"==typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};c.prototype["catch"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},"undefined"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this); + } + + if ( typeof window.CustomEvent !== "function" ) { + (function(){ + function CustomEvent ( event, params ) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = document.createEvent( 'CustomEvent' ); + evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); + return evt; + } + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; + }()); + } + + if (!HTMLCanvasElement.prototype.toBlob) { + Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { + value: function (callback, type, quality) { + var binStr = atob( this.toDataURL(type, quality).split(',')[1] ), + len = binStr.length, + arr = new Uint8Array(len); + + for (var i=0; i= 5) { + var x= w; + w = h; + h = x; + } + return { width: w, height: h }; + } + + /* CSS Transform Prototype */ + var TRANSLATE_OPTS = { + 'translate3d': { + suffix: ', 0px' + }, + 'translate': { + suffix: '' + } + }; + var Transform = function (x, y, scale) { + this.x = parseFloat(x); + this.y = parseFloat(y); + this.scale = parseFloat(scale); + }; + + Transform.parse = function (v) { + if (v.style) { + return Transform.parse(v.style[CSS_TRANSFORM]); + } + else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) { + return Transform.fromMatrix(v); + } + else { + return Transform.fromString(v); + } + }; + + Transform.fromMatrix = function (v) { + var vals = v.substring(7).split(','); + if (!vals.length || v === 'none') { + vals = [1, 0, 0, 1, 0, 0]; + } + + return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0])); + }; + + Transform.fromString = function (v) { + var values = v.split(') '), + translate = values[0].substring(Croppie.globals.translate.length + 1).split(','), + scale = values.length > 1 ? values[1].substring(6) : 1, + x = translate.length > 1 ? translate[0] : 0, + y = translate.length > 1 ? translate[1] : 0; + + return new Transform(x, y, scale); + }; + + Transform.prototype.toString = function () { + var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || ''; + return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')'; + }; + + var TransformOrigin = function (el) { + if (!el || !el.style[CSS_TRANS_ORG]) { + this.x = 0; + this.y = 0; + return; + } + var css = el.style[CSS_TRANS_ORG].split(' '); + this.x = parseFloat(css[0]); + this.y = parseFloat(css[1]); + }; + + TransformOrigin.prototype.toString = function () { + return this.x + 'px ' + this.y + 'px'; + }; + + function getExifOrientation (img) { + return img.exifdata.Orientation; + } + + function drawCanvas(canvas, img, orientation) { + var width = img.width, + height = img.height, + ctx = canvas.getContext('2d'); + + canvas.width = img.width; + canvas.height = img.height; + + ctx.save(); + switch (orientation) { + case 2: + ctx.translate(width, 0); + ctx.scale(-1, 1); + break; + + case 3: + ctx.translate(width, height); + ctx.rotate(180*Math.PI/180); + break; + + case 4: + ctx.translate(0, height); + ctx.scale(1, -1); + break; + + case 5: + canvas.width = height; + canvas.height = width; + ctx.rotate(90*Math.PI/180); + ctx.scale(1, -1); + break; + + case 6: + canvas.width = height; + canvas.height = width; + ctx.rotate(90*Math.PI/180); + ctx.translate(0, -height); + break; + + case 7: + canvas.width = height; + canvas.height = width; + ctx.rotate(-90*Math.PI/180); + ctx.translate(-width, height); + ctx.scale(1, -1); + break; + + case 8: + canvas.width = height; + canvas.height = width; + ctx.translate(0, width); + ctx.rotate(-90*Math.PI/180); + break; + } + ctx.drawImage(img, 0,0, width, height); + ctx.restore(); + } + + /* Private Methods */ + function _create() { + var self = this, + contClass = 'croppie-container', + customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null, + boundary, img, viewport, overlay, bw, bh; + + self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self); + // Properties on class + self.data = {}; + self.elements = {}; + + boundary = self.elements.boundary = document.createElement('div'); + viewport = self.elements.viewport = document.createElement('div'); + img = self.elements.img = document.createElement('img'); + overlay = self.elements.overlay = document.createElement('div'); + + if (self.options.useCanvas) { + self.elements.canvas = document.createElement('canvas'); + self.elements.preview = self.elements.canvas; + } + else { + self.elements.preview = self.elements.img; + } + + addClass(boundary, 'cr-boundary'); + boundary.setAttribute('aria-dropeffect', 'none'); + bw = self.options.boundary.width; + bh = self.options.boundary.height; + css(boundary, { + width: (bw + (isNaN(bw) ? '' : 'px')), + height: (bh + (isNaN(bh) ? '' : 'px')) + }); + + addClass(viewport, 'cr-viewport'); + if (customViewportClass) { + addClass(viewport, customViewportClass); + } + css(viewport, { + width: self.options.viewport.width + 'px', + height: self.options.viewport.height + 'px' + }); + viewport.setAttribute('tabindex', 0); + + addClass(self.elements.preview, 'cr-image'); + setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' }); + addClass(overlay, 'cr-overlay'); + + self.element.appendChild(boundary); + boundary.appendChild(self.elements.preview); + boundary.appendChild(viewport); + boundary.appendChild(overlay); + + addClass(self.element, contClass); + if (self.options.customClass) { + addClass(self.element, self.options.customClass); + } + + _initDraggable.call(this); + + if (self.options.enableZoom) { + _initializeZoom.call(self); + } + + // if (self.options.enableOrientation) { + // _initRotationControls.call(self); + // } + + if (self.options.enableResize) { + _initializeResize.call(self); + } + } + + // function _initRotationControls () { + // var self = this, + // wrap, btnLeft, btnRight, iLeft, iRight; + + // wrap = document.createElement('div'); + // self.elements.orientationBtnLeft = btnLeft = document.createElement('button'); + // self.elements.orientationBtnRight = btnRight = document.createElement('button'); + + // wrap.appendChild(btnLeft); + // wrap.appendChild(btnRight); + + // iLeft = document.createElement('i'); + // iRight = document.createElement('i'); + // btnLeft.appendChild(iLeft); + // btnRight.appendChild(iRight); + + // addClass(wrap, 'cr-rotate-controls'); + // addClass(btnLeft, 'cr-rotate-l'); + // addClass(btnRight, 'cr-rotate-r'); + + // self.elements.boundary.appendChild(wrap); + + // btnLeft.addEventListener('click', function () { + // self.rotate(-90); + // }); + // btnRight.addEventListener('click', function () { + // self.rotate(90); + // }); + // } + + function _hasExif() { + return this.options.enableExif && window.EXIF; + } + + function _initializeResize () { + var self = this; + var wrap = document.createElement('div'); + var isDragging = false; + var direction; + var originalX; + var originalY; + var minSize = 50; + var maxWidth; + var maxHeight; + var vr; + var hr; + + addClass(wrap, 'cr-resizer'); + css(wrap, { + width: this.options.viewport.width + 'px', + height: this.options.viewport.height + 'px' + }); + + if (this.options.resizeControls.height) { + vr = document.createElement('div'); + addClass(vr, 'cr-resizer-vertical'); + wrap.appendChild(vr); + } + + if (this.options.resizeControls.width) { + hr = document.createElement('div'); + addClass(hr, 'cr-resizer-horisontal'); + wrap.appendChild(hr); + } + + function mouseDown(ev) { + if (ev.button !== undefined && ev.button !== 0) return; + + ev.preventDefault(); + if (isDragging) { + return; + } + + var overlayRect = self.elements.overlay.getBoundingClientRect(); + + isDragging = true; + originalX = ev.pageX; + originalY = ev.pageY; + direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h'; + maxWidth = overlayRect.width; + maxHeight = overlayRect.height; + + if (ev.touches) { + var touches = ev.touches[0]; + originalX = touches.pageX; + originalY = touches.pageY; + } + + window.addEventListener('mousemove', mouseMove); + window.addEventListener('touchmove', mouseMove); + window.addEventListener('mouseup', mouseUp); + window.addEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = 'none'; + } + + function mouseMove(ev) { + var pageX = ev.pageX; + var pageY = ev.pageY; + + ev.preventDefault(); + + if (ev.touches) { + var touches = ev.touches[0]; + pageX = touches.pageX; + pageY = touches.pageY; + } + + var deltaX = pageX - originalX; + var deltaY = pageY - originalY; + var newHeight = self.options.viewport.height + deltaY; + var newWidth = self.options.viewport.width + deltaX; + + if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) { + css(wrap, { + height: newHeight + 'px' + }); + + self.options.boundary.height += deltaY; + css(self.elements.boundary, { + height: self.options.boundary.height + 'px' + }); + + self.options.viewport.height += deltaY; + css(self.elements.viewport, { + height: self.options.viewport.height + 'px' + }); + } + else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) { + css(wrap, { + width: newWidth + 'px' + }); + + self.options.boundary.width += deltaX; + css(self.elements.boundary, { + width: self.options.boundary.width + 'px' + }); + + self.options.viewport.width += deltaX; + css(self.elements.viewport, { + width: self.options.viewport.width + 'px' + }); + } + + _updateOverlay.call(self); + _updateZoomLimits.call(self); + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalY = pageY; + originalX = pageX; + } + + function mouseUp() { + isDragging = false; + window.removeEventListener('mousemove', mouseMove); + window.removeEventListener('touchmove', mouseMove); + window.removeEventListener('mouseup', mouseUp); + window.removeEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = ''; + } + + if (vr) { + vr.addEventListener('mousedown', mouseDown); + } + + if (hr) { + hr.addEventListener('mousedown', mouseDown); + } + + this.elements.boundary.appendChild(wrap); + } + + function _setZoomerVal(v) { + if (this.options.enableZoom) { + var z = this.elements.zoomer, + val = fix(v, 4); + + z.value = Math.max(z.min, Math.min(z.max, val)); + } + } + + function _initializeZoom() { + var self = this, + wrap = self.elements.zoomerWrap = document.createElement('div'), + zoomer = self.elements.zoomer = document.createElement('input'); + + addClass(wrap, 'cr-slider-wrap'); + addClass(zoomer, 'cr-slider'); + zoomer.type = 'range'; + zoomer.step = '0.0001'; + zoomer.value = 1; + zoomer.style.display = self.options.showZoomer ? '' : 'none'; + zoomer.setAttribute('aria-label', 'zoom'); + + self.element.appendChild(wrap); + wrap.appendChild(zoomer); + + self._currentZoom = 1; + + function change() { + _onZoom.call(self, { + value: parseFloat(zoomer.value), + origin: new TransformOrigin(self.elements.preview), + viewportRect: self.elements.viewport.getBoundingClientRect(), + transform: Transform.parse(self.elements.preview) + }); + } + + function scroll(ev) { + var delta, targetZoom; + + if (ev.wheelDelta) { + delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2 + } else if (ev.deltaY) { + delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2 + } else if (ev.detail) { + delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2 + } else { + delta = 0; + } + + targetZoom = self._currentZoom + (delta * self._currentZoom); + + ev.preventDefault(); + _setZoomerVal.call(self, targetZoom); + change.call(self); + } + + self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress + self.elements.zoomer.addEventListener('change', change); + + if (self.options.mouseWheelZoom) { + self.elements.boundary.addEventListener('mousewheel', scroll); + self.elements.boundary.addEventListener('DOMMouseScroll', scroll); + } + } + + function _onZoom(ui) { + var self = this, + transform = ui ? ui.transform : Transform.parse(self.elements.preview), + vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(), + origin = ui ? ui.origin : new TransformOrigin(self.elements.preview); + + function applyCss() { + var transCss = {}; + transCss[CSS_TRANSFORM] = transform.toString(); + transCss[CSS_TRANS_ORG] = origin.toString(); + css(self.elements.preview, transCss); + } + + self._currentZoom = ui ? ui.value : self._currentZoom; + transform.scale = self._currentZoom; + self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom); + applyCss(); + + if (self.options.enforceBoundary) { + var boundaries = _getVirtualBoundaries.call(self, vpRect), + transBoundaries = boundaries.translate, + oBoundaries = boundaries.origin; + + if (transform.x >= transBoundaries.maxX) { + origin.x = oBoundaries.minX; + transform.x = transBoundaries.maxX; + } + + if (transform.x <= transBoundaries.minX) { + origin.x = oBoundaries.maxX; + transform.x = transBoundaries.minX; + } + + if (transform.y >= transBoundaries.maxY) { + origin.y = oBoundaries.minY; + transform.y = transBoundaries.maxY; + } + + if (transform.y <= transBoundaries.minY) { + origin.y = oBoundaries.maxY; + transform.y = transBoundaries.minY; + } + } + applyCss(); + _debouncedOverlay.call(self); + _triggerUpdate.call(self); + } + + function _getVirtualBoundaries(viewport) { + var self = this, + scale = self._currentZoom, + vpWidth = viewport.width, + vpHeight = viewport.height, + centerFromBoundaryX = self.elements.boundary.clientWidth / 2, + centerFromBoundaryY = self.elements.boundary.clientHeight / 2, + imgRect = self.elements.preview.getBoundingClientRect(), + curImgWidth = imgRect.width, + curImgHeight = imgRect.height, + halfWidth = vpWidth / 2, + halfHeight = vpHeight / 2; + + var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1; + var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale))); + + var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1; + var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale))); + + var originMinX = (1 / scale) * halfWidth; + var originMaxX = (curImgWidth * (1 / scale)) - originMinX; + + var originMinY = (1 / scale) * halfHeight; + var originMaxY = (curImgHeight * (1 / scale)) - originMinY; + + return { + translate: { + maxX: maxX, + minX: minX, + maxY: maxY, + minY: minY + }, + origin: { + maxX: originMaxX, + minX: originMinX, + maxY: originMaxY, + minY: originMinY + } + }; + } + + function _updateCenterPoint() { + var self = this, + scale = self._currentZoom, + data = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]), + pc = new TransformOrigin(self.elements.preview), + top = (vpData.top - data.top) + (vpData.height / 2), + left = (vpData.left - data.left) + (vpData.width / 2), + center = {}, + adj = {}; + + center.y = top / scale; + center.x = left / scale; + + adj.y = (center.y - pc.y) * (1 - scale); + adj.x = (center.x - pc.x) * (1 - scale); + + transform.x -= adj.x; + transform.y -= adj.y; + + var newCss = {}; + newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px'; + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + } + + function _initDraggable() { + var self = this, + isDragging = false, + originalX, + originalY, + originalDistance, + vpRect, + transform; + + function assignTransformCoordinates(deltaX, deltaY) { + var imgRect = self.elements.preview.getBoundingClientRect(), + top = transform.y + deltaY, + left = transform.x + deltaX; + + if (self.options.enforceBoundary) { + if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) { + transform.y = top; + } + + if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) { + transform.x = left; + } + } + else { + transform.y = top; + transform.x = left; + } + } + + function toggleGrabState(isDragging) { + self.elements.preview.setAttribute('aria-grabbed', isDragging); + self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none'); + } + + function keyDown(ev) { + var LEFT_ARROW = 37, + UP_ARROW = 38, + RIGHT_ARROW = 39, + DOWN_ARROW = 40; + + if (ev.shiftKey && (ev.keyCode == UP_ARROW || ev.keyCode == DOWN_ARROW)) { + var zoom = 0.0; + if (ev.keyCode == UP_ARROW) { + zoom = parseFloat(self.elements.zoomer.value, 10) + parseFloat(self.elements.zoomer.step, 10) + } + else { + zoom = parseFloat(self.elements.zoomer.value, 10) - parseFloat(self.elements.zoomer.step, 10) + } + self.setZoom(zoom); + } + else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) { + ev.preventDefault(); + var movement = parseKeyDown(ev.keyCode); + + transform = Transform.parse(self.elements.preview); + document.body.style[CSS_USERSELECT] = 'none'; + vpRect = self.elements.viewport.getBoundingClientRect(); + keyMove(movement); + }; + + function parseKeyDown(key) { + switch (key) { + case LEFT_ARROW: + return [1, 0]; + case UP_ARROW: + return [0, 1]; + case RIGHT_ARROW: + return [-1, 0]; + case DOWN_ARROW: + return [0, -1]; + }; + }; + } + + function keyMove(movement) { + var deltaX = movement[0], + deltaY = movement[1], + newCss = {}; + + assignTransformCoordinates(deltaX, deltaY); + + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + _updateOverlay.call(self); + document.body.style[CSS_USERSELECT] = ''; + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalDistance = 0; + } + + function mouseDown(ev) { + if (ev.button !== undefined && ev.button !== 0) return; + + ev.preventDefault(); + if (isDragging) return; + isDragging = true; + originalX = ev.pageX; + originalY = ev.pageY; + + if (ev.touches) { + var touches = ev.touches[0]; + originalX = touches.pageX; + originalY = touches.pageY; + } + toggleGrabState(isDragging); + transform = Transform.parse(self.elements.preview); + window.addEventListener('mousemove', mouseMove); + window.addEventListener('touchmove', mouseMove); + window.addEventListener('mouseup', mouseUp); + window.addEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = 'none'; + vpRect = self.elements.viewport.getBoundingClientRect(); + } + + function mouseMove(ev) { + ev.preventDefault(); + var pageX = ev.pageX, + pageY = ev.pageY; + + if (ev.touches) { + var touches = ev.touches[0]; + pageX = touches.pageX; + pageY = touches.pageY; + } + + var deltaX = pageX - originalX, + deltaY = pageY - originalY, + newCss = {}; + + if (ev.type == 'touchmove') { + if (ev.touches.length > 1) { + var touch1 = ev.touches[0]; + var touch2 = ev.touches[1]; + var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY)); + + if (!originalDistance) { + originalDistance = dist / self._currentZoom; + } + + var scale = dist / originalDistance; + + _setZoomerVal.call(self, scale); + dispatchChange(self.elements.zoomer); + return; + } + } + + assignTransformCoordinates(deltaX, deltaY); + + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + _updateOverlay.call(self); + originalY = pageY; + originalX = pageX; + } + + function mouseUp() { + isDragging = false; + toggleGrabState(isDragging); + window.removeEventListener('mousemove', mouseMove); + window.removeEventListener('touchmove', mouseMove); + window.removeEventListener('mouseup', mouseUp); + window.removeEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = ''; + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalDistance = 0; + } + + self.elements.overlay.addEventListener('mousedown', mouseDown); + self.elements.viewport.addEventListener('keydown', keyDown); + self.elements.overlay.addEventListener('touchstart', mouseDown); + } + + function _updateOverlay() { + var self = this, + boundRect = self.elements.boundary.getBoundingClientRect(), + imgData = self.elements.preview.getBoundingClientRect(); + + css(self.elements.overlay, { + width: imgData.width + 'px', + height: imgData.height + 'px', + top: (imgData.top - boundRect.top) + 'px', + left: (imgData.left - boundRect.left) + 'px' + }); + } + var _debouncedOverlay = debounce(_updateOverlay, 500); + + function _triggerUpdate() { + var self = this, + data = self.get(), + ev; + + if (!_isVisible.call(self)) { + return; + } + + self.options.update.call(self, data); + if (self.$ && typeof Prototype == 'undefined') { + self.$(self.element).trigger('update', data); + } + else { + var ev; + if (window.CustomEvent) { + ev = new CustomEvent('update', { detail: data }); + } else { + ev = document.createEvent('CustomEvent'); + ev.initCustomEvent('update', true, true, data); + } + + self.element.dispatchEvent(ev); + } + } + + function _isVisible() { + return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0; + } + + function _updatePropertiesFromImage() { + var self = this, + initialZoom = 1, + cssReset = {}, + img = self.elements.preview, + imgData = null, + transformReset = new Transform(0, 0, initialZoom), + originReset = new TransformOrigin(), + isVisible = _isVisible.call(self); + + if (!isVisible || self.data.bound) { + // if the croppie isn't visible or it doesn't need binding + return; + } + + self.data.bound = true; + cssReset[CSS_TRANSFORM] = transformReset.toString(); + cssReset[CSS_TRANS_ORG] = originReset.toString(); + cssReset['opacity'] = 1; + css(img, cssReset); + + imgData = self.elements.preview.getBoundingClientRect(); + + self._originalImageWidth = imgData.width; + self._originalImageHeight = imgData.height; + + if (self.options.enableZoom) { + _updateZoomLimits.call(self, true); + } + else { + self._currentZoom = initialZoom; + } + + transformReset.scale = self._currentZoom; + cssReset[CSS_TRANSFORM] = transformReset.toString(); + css(img, cssReset); + + if (self.data.points.length) { + _bindPoints.call(self, self.data.points); + } + else { + _centerImage.call(self); + } + + _updateCenterPoint.call(self); + _updateOverlay.call(self); + } + + function _updateZoomLimits (initial) { + var self = this, + minZoom = 0, + maxZoom = 1.5, + initialZoom, + defaultInitialZoom, + zoomer = self.elements.zoomer, + scale = parseFloat(zoomer.value), + boundaryData = self.elements.boundary.getBoundingClientRect(), + imgData = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + minW, + minH; + + if (self.options.enforceBoundary) { + minW = vpData.width / (initial ? imgData.width : imgData.width / scale); + minH = vpData.height / (initial ? imgData.height : imgData.height / scale); + minZoom = Math.max(minW, minH); + } + + if (minZoom >= maxZoom) { + maxZoom = minZoom + 1; + } + + zoomer.min = fix(minZoom, 4); + zoomer.max = fix(maxZoom, 4); + + if (initial) { + defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height)); + initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom; + _setZoomerVal.call(self, initialZoom); + } + + dispatchChange(zoomer); + } + + function _bindPoints(points) { + if (points.length != 4) { + throw "Croppie - Invalid number of points supplied: " + points; + } + var self = this, + pointsWidth = points[2] - points[0], + // pointsHeight = points[3] - points[1], + vpData = self.elements.viewport.getBoundingClientRect(), + boundRect = self.elements.boundary.getBoundingClientRect(), + vpOffset = { + left: vpData.left - boundRect.left, + top: vpData.top - boundRect.top + }, + scale = vpData.width / pointsWidth, + originTop = points[1], + originLeft = points[0], + transformTop = (-1 * points[1]) + vpOffset.top, + transformLeft = (-1 * points[0]) + vpOffset.left, + newCss = {}; + + newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px'; + newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString(); + css(self.elements.preview, newCss); + + _setZoomerVal.call(self, scale); + self._currentZoom = scale; + } + + function _centerImage() { + var self = this, + imgDim = self.elements.preview.getBoundingClientRect(), + vpDim = self.elements.viewport.getBoundingClientRect(), + boundDim = self.elements.boundary.getBoundingClientRect(), + vpLeft = vpDim.left - boundDim.left, + vpTop = vpDim.top - boundDim.top, + w = vpLeft - ((imgDim.width - vpDim.width) / 2), + h = vpTop - ((imgDim.height - vpDim.height) / 2), + transform = new Transform(w, h, self._currentZoom); + + css(self.elements.preview, CSS_TRANSFORM, transform.toString()); + } + + function _transferImageToCanvas(customOrientation) { + var self = this, + canvas = self.elements.canvas, + img = self.elements.img, + ctx = canvas.getContext('2d'), + exif = _hasExif.call(self), + customOrientation = self.options.enableOrientation && customOrientation; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + canvas.width = img.width; + canvas.height = img.height; + + if (exif && !customOrientation) { + var orientation = getExifOrientation(img); + drawCanvas(canvas, img, num(orientation || 0, 10)); + } + else if (customOrientation) { + drawCanvas(canvas, img, customOrientation); + } + } + + function _getCanvas(data) { + var self = this, + points = data.points, + left = num(points[0]), + top = num(points[1]), + right = num(points[2]), + bottom = num(points[3]), + width = right-left, + height = bottom-top, + circle = data.circle, + canvas = document.createElement('canvas'), + ctx = canvas.getContext('2d'), + outWidth = width, + outHeight = height, + startX = 0, + startY = 0, + canvasWidth = outWidth, + canvasHeight = outHeight, + customDimensions = (data.outputWidth && data.outputHeight), + outputWidthRatio = 1; + outputHeightRatio = 1; + + if (customDimensions) { + canvasWidth = data.outputWidth; + canvasHeight = data.outputHeight; + outputWidthRatio = canvasWidth / outWidth; + outputHeightRatio = canvasHeight / outHeight; + } + + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + if (data.backgroundColor) { + ctx.fillStyle = data.backgroundColor; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + } + + + // start fixing data to send to draw image for enforceBoundary: false + if (!self.options.enforceBoundary) { + if (left < 0) { + startX = Math.abs(left); + left = 0; + } + if (top < 0) { + startY = Math.abs(top); + top = 0; + } + if (right > self._originalImageWidth) { + width = self._originalImageWidth - left; + outWidth = width; + } + if (bottom > self._originalImageHeight) { + height = self._originalImageHeight - top; + outHeight = height; + } + } + else{ + width=Math.min(width, self._originalImageWidth); + height=Math.min(height, self._originalImageHeight) + } + + if (outputWidthRatio !== 1 || outputHeightRatio !== 1) { + startX *= outputWidthRatio; + startY *= outputHeightRatio; + outWidth *= outputWidthRatio; + outHeight *= outputHeightRatio; + } + ctx.drawImage(this.elements.preview, left, top, width, height, startX, startY, outWidth, outHeight); + if (circle) { + ctx.fillStyle = '#fff'; + ctx.globalCompositeOperation = 'destination-in'; + ctx.beginPath(); + ctx.arc(outWidth / 2, outHeight / 2, outWidth / 2, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + } + return canvas; + } + + function _getHtmlResult(data) { + var points = data.points, + div = document.createElement('div'), + img = document.createElement('img'), + width = points[2] - points[0], + height = points[3] - points[1]; + + addClass(div, 'croppie-result'); + div.appendChild(img); + css(img, { + left: (-1 * points[0]) + 'px', + top: (-1 * points[1]) + 'px' + }); + img.src = data.url; + css(div, { + width: width + 'px', + height: height + 'px' + }); + + return div; + } + + function _getBase64Result(data) { + return _getCanvas.call(this, data).toDataURL(data.format, data.quality); + } + + function _getBlobResult(data) { + var self = this; + return new Promise(function (resolve, reject) { + _getCanvas.call(self, data).toBlob(function (blob) { + resolve(blob); + }, data.format, data.quality); + }); + } + + function _bind(options, cb) { + var self = this, + url, + points = [], + zoom = null, + hasExif = _hasExif.call(self);; + + if (typeof (options) === 'string') { + url = options; + options = {}; + } + else if (Array.isArray(options)) { + points = options.slice(); + } + else if (typeof (options) == 'undefined' && self.data.url) { //refreshing + _updatePropertiesFromImage.call(self); + _triggerUpdate.call(self); + return null; + } + else { + url = options.url; + points = options.points || []; + zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom; + } + + self.data.bound = false; + self.data.url = url || self.data.url; + self.data.boundZoom = zoom; + + return loadImage(url, self.elements.img, hasExif).then(function (img) { + if (!points.length) { + var natDim = naturalImageDimensions(img); + var rect = self.elements.viewport.getBoundingClientRect(); + var aspectRatio = rect.width / rect.height; + var imgAspectRatio = natDim.width / natDim.height; + var width, height; + + if (imgAspectRatio > aspectRatio) { + height = natDim.height; + width = height * aspectRatio; + } + else { + width = natDim.width; + height = width / aspectRatio; + } + + var x0 = (natDim.width - width) / 2; + var y0 = (natDim.height - height) / 2; + var x1 = x0 + width; + var y1 = y0 + height; + + self.data.points = [x0, y0, x1, y1]; + } + else if (self.options.relative) { + points = [ + points[0] * img.naturalWidth / 100, + points[1] * img.naturalHeight / 100, + points[2] * img.naturalWidth / 100, + points[3] * img.naturalHeight / 100 + ]; + } + + self.data.points = points.map(function (p) { + return parseFloat(p); + }); + if (self.options.useCanvas) { + _transferImageToCanvas.call(self, options.orientation || 1); + } + _updatePropertiesFromImage.call(self); + _triggerUpdate.call(self); + cb && cb(); + }); + } + + function fix(v, decimalPoints) { + return parseFloat(v).toFixed(decimalPoints || 0); + } + + function _get() { + var self = this, + imgData = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + x1 = vpData.left - imgData.left, + y1 = vpData.top - imgData.top, + widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border + heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2, + x2 = x1 + self.elements.viewport.offsetWidth + widthDiff, + y2 = y1 + self.elements.viewport.offsetHeight + heightDiff, + scale = self._currentZoom; + + if (scale === Infinity || isNaN(scale)) { + scale = 1; + } + + var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY; + x1 = Math.max(max, x1 / scale); + y1 = Math.max(max, y1 / scale); + x2 = Math.max(max, x2 / scale); + y2 = Math.max(max, y2 / scale); + + return { + points: [fix(x1), fix(y1), fix(x2), fix(y2)], + zoom: scale + }; + } + + var RESULT_DEFAULTS = { + type: 'canvas', + format: 'png', + quality: 1 + }, + RESULT_FORMATS = ['jpeg', 'webp', 'png']; + + function _result(options) { + var self = this, + data = _get.call(self), + opts = deepExtend(RESULT_DEFAULTS, deepExtend({}, options)), + resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')), + size = opts.size || 'viewport', + format = opts.format, + quality = opts.quality, + backgroundColor = opts.backgroundColor, + circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'), + vpRect = self.elements.viewport.getBoundingClientRect(), + ratio = vpRect.width / vpRect.height, + prom; + + if (size === 'viewport') { + data.outputWidth = vpRect.width; + data.outputHeight = vpRect.height; + } else if (typeof size === 'object') { + if (size.width && size.height) { + data.outputWidth = size.width; + data.outputHeight = size.height; + } else if (size.width) { + data.outputWidth = size.width; + data.outputHeight = size.width / ratio; + } else if (size.height) { + data.outputWidth = size.height * ratio; + data.outputHeight = size.height; + } + } + + if (RESULT_FORMATS.indexOf(format) > -1) { + data.format = 'image/' + format; + data.quality = quality; + } + + data.circle = circle; + data.url = self.data.url; + data.backgroundColor = backgroundColor; + + prom = new Promise(function (resolve, reject) { + switch(resultType.toLowerCase()) + { + case 'rawcanvas': + resolve(_getCanvas.call(self, data)); + break; + case 'canvas': + case 'base64': + resolve(_getBase64Result.call(self, data)); + break; + case 'blob': + _getBlobResult.call(self, data).then(resolve); + break; + default: + resolve(_getHtmlResult.call(self, data)); + break; + } + }); + return prom; + } + + function _refresh() { + _updatePropertiesFromImage.call(this); + } + + function _rotate(deg) { + if (!this.options.useCanvas) { + throw 'Croppie: Cannot rotate without enableOrientation'; + } + + var self = this, + canvas = self.elements.canvas, + copy = document.createElement('canvas'), + ornt = 1; + + copy.width = canvas.width; + copy.height = canvas.height; + var ctx = copy.getContext('2d'); + ctx.drawImage(canvas, 0, 0); + + if (deg === 90 || deg === -270) ornt = 6; + if (deg === -90 || deg === 270) ornt = 8; + if (deg === 180 || deg === -180) ornt = 3; + + drawCanvas(canvas, copy, ornt); + _onZoom.call(self); + copy = null; + } + + function _destroy() { + var self = this; + self.element.removeChild(self.elements.boundary); + removeClass(self.element, 'croppie-container'); + if (self.options.enableZoom) { + self.element.removeChild(self.elements.zoomerWrap); + } + delete self.elements; + } + + if (window.jQuery) { + var $ = window.jQuery; + $.fn.croppie = function (opts) { + var ot = typeof opts; + + if (ot === 'string') { + var args = Array.prototype.slice.call(arguments, 1); + var singleInst = $(this).data('croppie'); + + if (opts === 'get') { + return singleInst.get(); + } + else if (opts === 'result') { + return singleInst.result.apply(singleInst, args); + } + else if (opts === 'bind') { + return singleInst.bind.apply(singleInst, args); + } + + return this.each(function () { + var i = $(this).data('croppie'); + if (!i) return; + + var method = i[opts]; + if ($.isFunction(method)) { + method.apply(i, args); + if (opts === 'destroy') { + $(this).removeData('croppie'); + } + } + else { + throw 'Croppie ' + opts + ' method not found'; + } + }); + } + else { + return this.each(function () { + var i = new Croppie(this, opts); + i.$ = $; + $(this).data('croppie', i); + }); + } + }; + } + + function Croppie(element, opts) { + this.element = element; + this.options = deepExtend(deepExtend({}, Croppie.defaults), opts); + + if (this.element.tagName.toLowerCase() === 'img') { + var origImage = this.element; + addClass(origImage, 'cr-original-image'); + setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' }); + var replacementDiv = document.createElement('div'); + this.element.parentNode.appendChild(replacementDiv); + replacementDiv.appendChild(origImage); + this.element = replacementDiv; + this.options.url = this.options.url || origImage.src; + } + + _create.call(this); + if (this.options.url) { + var bindOpts = { + url: this.options.url, + points: this.options.points + }; + delete this.options['url']; + delete this.options['points']; + _bind.call(this, bindOpts); + } + } + + Croppie.defaults = { + viewport: { + width: 100, + height: 100, + type: 'square' + }, + boundary: { }, + orientationControls: { + enabled: true, + leftClass: '', + rightClass: '' + }, + resizeControls: { + width: true, + height: true + }, + customClass: '', + showZoomer: true, + enableZoom: true, + enableResize: false, + mouseWheelZoom: true, + enableExif: false, + enforceBoundary: true, + enableOrientation: false, + enableKeyMovement: true, + update: function () { } + }; + + Croppie.globals = { + translate: 'translate3d' + }; + + deepExtend(Croppie.prototype, { + bind: function (options, cb) { + return _bind.call(this, options, cb); + }, + get: function () { + var data = _get.call(this); + var points = data.points; + if (this.options.relative) { + points[0] /= this.elements.img.naturalWidth / 100; + points[1] /= this.elements.img.naturalHeight / 100; + points[2] /= this.elements.img.naturalWidth / 100; + points[3] /= this.elements.img.naturalHeight / 100; + } + return data; + }, + result: function (type) { + return _result.call(this, type); + }, + refresh: function () { + return _refresh.call(this); + }, + setZoom: function (v) { + _setZoomerVal.call(this, v); + dispatchChange(this.elements.zoomer); + }, + rotate: function (deg) { + _rotate.call(this, deg); + }, + destroy: function () { + return _destroy.call(this); + } + }); + + exports.Croppie = window.Croppie = Croppie; + + if (typeof module === 'object' && !!module.exports) { + module.exports = Croppie; + } +})); diff --git a/old/includes/default.bitsy b/old/includes/default.bitsy new file mode 100644 index 0000000..ebe7a54 --- /dev/null +++ b/old/includes/default.bitsy @@ -0,0 +1,84 @@ +Write your game's title here + +# BITSY VERSION 5.3 + +! ROOM_FORMAT 1 + +PAL 0 +0,82,204 +128,159,255 +255,255,255 + +ROOM 0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,a,a,a,a,a,a,a,a,a,a,a,a,a,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 +0,a,a,a,a,a,a,a,a,a,a,a,a,a,a,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PAL 0 + +TIL a +11111111 +10000001 +10000001 +10011001 +10011001 +10000001 +10000001 +11111111 + +SPR A +00011000 +00011000 +00011000 +00111100 +01111110 +10111101 +00100100 +00100100 +POS 0 4,4 + +SPR a +00000000 +00000000 +01010001 +01110001 +01110010 +01111100 +00111100 +00100100 +DLG SPR_0 +POS 0 8,12 + +ITM 0 +00000000 +00000000 +00000000 +00111100 +01100100 +00100100 +00011000 +00000000 +NAME tea +DLG ITM_0 + +DLG SPR_0 +I'm a cat + +DLG ITM_0 +You found a nice warm cup of tea + +VAR a +42 + diff --git a/old/includes/jquery.min.js b/old/includes/jquery.min.js new file mode 100644 index 0000000..47b6397 --- /dev/null +++ b/old/includes/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.0 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"']/g,J=RegExp(G.source),Y=RegExp(H.source),Q=/<%-([\s\S]+?)%>/g,X=/<%([\s\S]+?)%>/g,nn=/<%=([\s\S]+?)%>/g,tn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,rn=/^\w*$/,en=/^\./,un=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,on=/[\\^$.*+?()[\]{}|]/g,fn=RegExp(on.source),cn=/^\s+|\s+$/g,an=/^\s+/,ln=/\s+$/,sn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,hn=/\{\n\/\* \[wrapped with (.+)\] \*/,pn=/,? & /,_n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,vn=/\\(\\)?/g,gn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,dn=/\w*$/,yn=/^[-+]0x[0-9a-f]+$/i,bn=/^0b[01]+$/i,xn=/^\[object .+?Constructor\]$/,jn=/^0o[0-7]+$/i,wn=/^(?:0|[1-9]\d*)$/,mn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,An=/($^)/,kn=/['\n\r\u2028\u2029\\]/g,En="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",On="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+En,Sn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",In=RegExp("['\u2019]","g"),Rn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),zn=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Sn+En,"g"),Wn=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)|\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)|\\d+",On].join("|"),"g"),Bn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),Ln=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Un="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Cn={}; +Cn["[object Float32Array]"]=Cn["[object Float64Array]"]=Cn["[object Int8Array]"]=Cn["[object Int16Array]"]=Cn["[object Int32Array]"]=Cn["[object Uint8Array]"]=Cn["[object Uint8ClampedArray]"]=Cn["[object Uint16Array]"]=Cn["[object Uint32Array]"]=true,Cn["[object Arguments]"]=Cn["[object Array]"]=Cn["[object ArrayBuffer]"]=Cn["[object Boolean]"]=Cn["[object DataView]"]=Cn["[object Date]"]=Cn["[object Error]"]=Cn["[object Function]"]=Cn["[object Map]"]=Cn["[object Number]"]=Cn["[object Object]"]=Cn["[object RegExp]"]=Cn["[object Set]"]=Cn["[object String]"]=Cn["[object WeakMap]"]=false; +var Dn={};Dn["[object Arguments]"]=Dn["[object Array]"]=Dn["[object ArrayBuffer]"]=Dn["[object DataView]"]=Dn["[object Boolean]"]=Dn["[object Date]"]=Dn["[object Float32Array]"]=Dn["[object Float64Array]"]=Dn["[object Int8Array]"]=Dn["[object Int16Array]"]=Dn["[object Int32Array]"]=Dn["[object Map]"]=Dn["[object Number]"]=Dn["[object Object]"]=Dn["[object RegExp]"]=Dn["[object Set]"]=Dn["[object String]"]=Dn["[object Symbol]"]=Dn["[object Uint8Array]"]=Dn["[object Uint8ClampedArray]"]=Dn["[object Uint16Array]"]=Dn["[object Uint32Array]"]=true, +Dn["[object Error]"]=Dn["[object Function]"]=Dn["[object WeakMap]"]=false;var Mn,Tn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$n=parseFloat,Fn=parseInt,Nn=typeof global=="object"&&global&&global.Object===Object&&global,Pn=typeof self=="object"&&self&&self.Object===Object&&self,Zn=Nn||Pn||Function("return this")(),qn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Vn=qn&&typeof module=="object"&&module&&!module.nodeType&&module,Kn=Vn&&Vn.exports===qn,Gn=Kn&&Nn.process; +n:{try{Mn=Gn&&Gn.binding&&Gn.binding("util");break n}catch(n){}Mn=void 0}var Hn=Mn&&Mn.isArrayBuffer,Jn=Mn&&Mn.isDate,Yn=Mn&&Mn.isMap,Qn=Mn&&Mn.isRegExp,Xn=Mn&&Mn.isSet,nt=Mn&&Mn.isTypedArray,tt=j("length"),rt=w({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I", +"\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C", +"\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i", +"\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S", +"\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe", +"\u0149":"'n","\u017f":"s"}),et=w({"&":"&","<":"<",">":">",'"':""","'":"'"}),ut=w({"&":"&","<":"<",">":">",""":'"',"'":"'"}),it=function w(En){function On(n){if(xu(n)&&!af(n)&&!(n instanceof Mn)){if(n instanceof zn)return n;if(ci.call(n,"__wrapped__"))return Pe(n)}return new zn(n)}function Sn(){}function zn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=F}function Mn(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1, +this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function dt(n,t,r,e,i,o){var f,c=1&t,a=2&t,l=4&t;if(r&&(f=i?r(n,e,i,o):r(n)),f!==F)return f;if(!bu(n))return n;if(e=af(n)){if(f=Ee(n),!c)return Mr(n,f)}else{var s=yo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(sf(n))return Wr(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Oe(n),!c)return a?Fr(n,pt(f,n)):$r(n,ht(f,n))}else{if(!Dn[s])return i?n:{};f=Se(n,s,dt,c)}}if(o||(o=new Vn), +i=o.get(n))return i;o.set(n,f);var a=l?a?ye:de:a?Uu:Lu,p=e?F:a(n);return u(p||n,function(e,u){p&&(u=e,e=n[u]),at(f,u,dt(e,t,r,u,n,o))}),f}function yt(n){var t=Lu(n);return function(r){return bt(r,n,t)}}function bt(n,t,r){var e=r.length;if(null==n)return!e;for(n=ni(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===F&&!(u in n)||!i(o))return false}return true}function xt(n,t,r){if(typeof n!="function")throw new ei("Expected a function");return jo(function(){n.apply(F,r)},t)}function jt(n,t,r,e){var u=-1,i=c,o=true,f=n.length,s=[],h=t.length; +if(!f)return s;r&&(t=l(t,S(r))),e?(i=a,o=false):200<=t.length&&(i=R,o=false,t=new qn(t));n:for(;++ut}function Bt(n,t){return null!=n&&ci.call(n,t)}function Lt(n,t){return null!=n&&t in ni(n)}function Ut(n,t,r){for(var e=r?a:c,u=n[0].length,i=n.length,o=i,f=Hu(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,S(t))),s=Mi(p.length,s),f[o]=!r&&(t||120<=u&&120<=p.length)?new qn(o&&p):F}var p=n[0],_=-1,v=f[0];n:for(;++_t.length?n:It(n,vr(t,0,-1)),t=null==n?n:n[$e(Ge(t))],null==t?F:r(t,n,e)}function Mt(n){return xu(n)&&"[object Arguments]"==zt(n)}function Tt(n){return xu(n)&&"[object ArrayBuffer]"==zt(n)}function $t(n){return xu(n)&&"[object Date]"==zt(n)}function Ft(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!xu(n)&&!xu(t))t=n!==n&&t!==t;else n:{ +var i=af(n),o=af(t),f=i?"[object Array]":yo(n),c=o?"[object Array]":yo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&sf(n)){if(!sf(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Vn),t=i||gf(n)?_e(n,t,r,e,Ft,u):ve(n,t,f,r,e,Ft,u);else{if(!(1&r)&&(i=a&&ci.call(n,"__wrapped__"),f=o&&ci.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Vn),t=Ft(n,t,r,e,u);break n}if(c)t:if(u||(u=new Vn), +i=1&r,f=de(n),o=f.length,c=de(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:ci.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Re(t,r)?n[t]:F}function rr(n,t,r){var e=-1;return t=l(t.length?t:[Nu],S(je())),n=Yt(n,function(n){return{a:l(t,function(t){return t(n)}),b:++e,c:n}}),A(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f?c:c*("desc"==r[e]?-1:1); +break n}}e=n.b-t.b}return e})}function er(n,t){return ur(n,t,function(t,r){return Bu(n,r)})}function ur(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Hu(u);++e=u){for(;e>>1,o=n[i];null!==o&&!Au(o)&&(r?o<=t:ot.length?n:It(n,vr(t,0,-1)), +null==n||delete n[$e(Ge(t))]}function Ar(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?wr(n[0]):[];for(var u=-1,i=Hu(e);++u=e?n:vr(n,t,r)}function Wr(n,t){if(t)return n.slice();var r=n.length,r=yi?yi(r):new n.constructor(r);return n.copy(r),r}function Br(n){var t=new n.constructor(n.byteLength);return new di(t).set(new di(n)),t}function Lr(n,t){return new n.constructor(t?Br(n.buffer):n.buffer,n.byteOffset,n.length)}function Ur(n,t){ +if(n!==t){var r=n!==F,e=null===n,u=n===n,i=Au(n),o=t!==F,f=null===t,c=t===t,a=Au(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?F:i,u=1),t=ni(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:C(f,a),o-=c.length,or?r?ar(t,n):t:(r=ar(t,Ri(n/T(t))),Bn.test(t)?zr($(r),0,n).join(""):r.slice(0,n))}function ue(n,t,e,u){function i(){for(var t=-1,c=arguments.length,a=-1,l=u.length,s=Hu(l+c),h=this&&this!==Zn&&this instanceof i?f:n;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Cr(e,r,h[4]):r,i[4]=e?C(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Dr(e,r,h[6]):r,i[6]=e?C(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Mi(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], +r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===F?c?0:n.length:Di(i[9]-a,0),!f&&24&t&&(t&=-25),De((h?lo:xo)(t&&1!=t?8==t||16==t?Jr(n,t,f):32!=t&&33!=t||u.length?Xr.apply(F,i):ue(n,t,r,e):Vr(n,t,r),i),n,t)}function se(n,t,r,e){return n===F||hu(n,ii[r])&&!ci.call(e,r)?t:n}function he(n,t,r,e,u,i){return bu(n)&&bu(t)&&(i.set(t,n),nr(n,t,F,he,i),i.delete(t)),n}function pe(n){return wu(n)?F:n}function _e(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;var c=-1,a=true,l=2&r?new qn:F; +for(i.set(n,t),i.set(t,n);++cr&&(r=Di(e+r,0)),g(n,je(t,3),r)):-1}function qe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==F&&(u=Ou(r),u=0>r?Di(e+u,0):Mi(u,e-1)), +g(n,je(t,3),u,true)}function Ve(n){return(null==n?0:n.length)?kt(n,1):[]}function Ke(n){return n&&n.length?n[0]:F}function Ge(n){var t=null==n?0:n.length;return t?n[t-1]:F}function He(n,t){return n&&n.length&&t&&t.length?or(n,t):n}function Je(n){return null==n?n:Ni.call(n)}function Ye(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(_u(n))return t=Di(n.length,t),true}),E(t,function(t){return l(n,j(t))})}function Qe(n,t){if(!n||!n.length)return[];var e=Ye(n);return null==t?e:l(e,function(n){ +return r(t,F,n)})}function Xe(n){return n=On(n),n.__chain__=true,n}function nu(n,t){return t(n)}function tu(){return this}function ru(n,t){return(af(n)?u:oo)(n,je(t,3))}function eu(n,t){return(af(n)?i:fo)(n,je(t,3))}function uu(n,t){return(af(n)?l:Yt)(n,je(t,3))}function iu(n,t,r){return t=r?F:t,t=n&&null==t?n.length:t,le(n,128,F,F,F,F,t)}function ou(n,t){var r;if(typeof t!="function")throw new ei("Expected a function");return n=Ou(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=F), +r}}function fu(n,t,r){return t=r?F:t,n=le(n,8,F,F,F,F,F,t),n.placeholder=fu.placeholder,n}function cu(n,t,r){return t=r?F:t,n=le(n,16,F,F,F,F,F,t),n.placeholder=cu.placeholder,n}function au(n,t,r){function e(t){var r=c,e=a;return c=a=F,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===F||r>=t||0>r||g&&n>=l}function i(){var n=Jo();if(u(n))return o(n);var r,e=jo;r=n-_,n=t-(n-p),r=g?Mi(n,l-r):n,h=e(i,r)}function o(n){return h=F,d&&c?e(n):(c=a=F,s)}function f(){var n=Jo(),r=u(n);if(c=arguments, +a=this,p=n,r){if(h===F)return _=n=p,h=jo(i,t),v?e(n):s;if(g)return h=jo(i,t),e(p)}return h===F&&(h=jo(i,t)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ei("Expected a function");return t=Iu(t)||0,bu(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Di(Iu(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==F&&ho(h),_=0,c=p=a=h=F},f.flush=function(){return h===F?s:o(Jo())},f}function lu(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), +r.cache=i.set(u,e)||i,e)}if(typeof n!="function"||null!=t&&typeof t!="function")throw new ei("Expected a function");return r.cache=new(lu.Cache||Pn),r}function su(n){if(typeof n!="function")throw new ei("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function hu(n,t){return n===t||n!==n&&t!==t}function pu(n){return null!=n&&yu(n.length)&&!gu(n); +}function _u(n){return xu(n)&&pu(n)}function vu(n){if(!xu(n))return false;var t=zt(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!wu(n)}function gu(n){return!!bu(n)&&(n=zt(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function du(n){return typeof n=="number"&&n==Ou(n)}function yu(n){return typeof n=="number"&&-1=n}function bu(n){var t=typeof n;return null!=n&&("object"==t||"function"==t); +}function xu(n){return null!=n&&typeof n=="object"}function ju(n){return typeof n=="number"||xu(n)&&"[object Number]"==zt(n)}function wu(n){return!(!xu(n)||"[object Object]"!=zt(n))&&(n=bi(n),null===n||(n=ci.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&fi.call(n)==hi))}function mu(n){return typeof n=="string"||!af(n)&&xu(n)&&"[object String]"==zt(n)}function Au(n){return typeof n=="symbol"||xu(n)&&"[object Symbol]"==zt(n)}function ku(n){if(!n)return[];if(pu(n))return mu(n)?$(n):Mr(n); +if(Ai&&n[Ai]){n=n[Ai]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=yo(n),("[object Map]"==t?L:"[object Set]"==t?D:Du)(n)}function Eu(n){return n?(n=Iu(n),n===N||n===-N?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Ou(n){n=Eu(n);var t=n%1;return n===n?t?n-t:n:0}function Su(n){return n?gt(Ou(n),0,4294967295):0}function Iu(n){if(typeof n=="number")return n;if(Au(n))return P;if(bu(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=bu(n)?n+"":n),typeof n!="string")return 0===n?n:+n; +n=n.replace(cn,"");var t=bn.test(n);return t||jn.test(n)?Fn(n.slice(2),t?2:8):yn.test(n)?P:+n}function Ru(n){return Tr(n,Uu(n))}function zu(n){return null==n?"":jr(n)}function Wu(n,t,r){return n=null==n?F:It(n,t),n===F?r:n}function Bu(n,t){return null!=n&&ke(n,t,Lt)}function Lu(n){return pu(n)?Gn(n):Ht(n)}function Uu(n){if(pu(n))n=Gn(n,true);else if(bu(n)){var t,r=Le(n),e=[];for(t in n)("constructor"!=t||!r&&ci.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in ni(n))t.push(r);n=t}return n}function Cu(n,t){ +if(null==n)return{};var r=l(ye(n),function(n){return[n]});return t=je(t),ur(n,r,function(n,r){return t(n,r[0])})}function Du(n){return null==n?[]:I(n,Lu(n))}function Mu(n){return Nf(zu(n).toLowerCase())}function Tu(n){return(n=zu(n))&&n.replace(mn,rt).replace(Rn,"")}function $u(n,t,r){return n=zu(n),t=r?F:t,t===F?Ln.test(n)?n.match(Wn)||[]:n.match(_n)||[]:n.match(t)||[]}function Fu(n){return function(){return n}}function Nu(n){return n}function Pu(n){return Gt(typeof n=="function"?n:dt(n,1))}function Zu(n,t,r){ +var e=Lu(t),i=St(t,e);null!=r||bu(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=St(t,Lu(t)));var o=!(bu(r)&&"chain"in r&&!r.chain),f=gu(n);return u(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Mr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function qu(){}function Vu(n){return We(n)?j($e(n)):ir(n)}function Ku(){return[]}function Gu(){ +return false}En=null==En?Zn:it.defaults(Zn.Object(),En,it.pick(Zn,Un));var Hu=En.Array,Ju=En.Date,Yu=En.Error,Qu=En.Function,Xu=En.Math,ni=En.Object,ti=En.RegExp,ri=En.String,ei=En.TypeError,ui=Hu.prototype,ii=ni.prototype,oi=En["__core-js_shared__"],fi=Qu.prototype.toString,ci=ii.hasOwnProperty,ai=0,li=function(){var n=/[^.]+$/.exec(oi&&oi.keys&&oi.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),si=ii.toString,hi=fi.call(ni),pi=Zn._,_i=ti("^"+fi.call(ci).replace(on,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),vi=Kn?En.Buffer:F,gi=En.Symbol,di=En.Uint8Array,yi=vi?vi.f:F,bi=U(ni.getPrototypeOf,ni),xi=ni.create,ji=ii.propertyIsEnumerable,wi=ui.splice,mi=gi?gi.isConcatSpreadable:F,Ai=gi?gi.iterator:F,ki=gi?gi.toStringTag:F,Ei=function(){ +try{var n=Ae(ni,"defineProperty");return n({},"",{}),n}catch(n){}}(),Oi=En.clearTimeout!==Zn.clearTimeout&&En.clearTimeout,Si=Ju&&Ju.now!==Zn.Date.now&&Ju.now,Ii=En.setTimeout!==Zn.setTimeout&&En.setTimeout,Ri=Xu.ceil,zi=Xu.floor,Wi=ni.getOwnPropertySymbols,Bi=vi?vi.isBuffer:F,Li=En.isFinite,Ui=ui.join,Ci=U(ni.keys,ni),Di=Xu.max,Mi=Xu.min,Ti=Ju.now,$i=En.parseInt,Fi=Xu.random,Ni=ui.reverse,Pi=Ae(En,"DataView"),Zi=Ae(En,"Map"),qi=Ae(En,"Promise"),Vi=Ae(En,"Set"),Ki=Ae(En,"WeakMap"),Gi=Ae(ni,"create"),Hi=Ki&&new Ki,Ji={},Yi=Fe(Pi),Qi=Fe(Zi),Xi=Fe(qi),no=Fe(Vi),to=Fe(Ki),ro=gi?gi.prototype:F,eo=ro?ro.valueOf:F,uo=ro?ro.toString:F,io=function(){ +function n(){}return function(t){return bu(t)?xi?xi(t):(n.prototype=t,t=new n,n.prototype=F,t):{}}}();On.templateSettings={escape:Q,evaluate:X,interpolate:nn,variable:"",imports:{_:On}},On.prototype=Sn.prototype,On.prototype.constructor=On,zn.prototype=io(Sn.prototype),zn.prototype.constructor=zn,Mn.prototype=io(Sn.prototype),Mn.prototype.constructor=Mn,Tn.prototype.clear=function(){this.__data__=Gi?Gi(null):{},this.size=0},Tn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], +this.size-=n?1:0,n},Tn.prototype.get=function(n){var t=this.__data__;return Gi?(n=t[n],"__lodash_hash_undefined__"===n?F:n):ci.call(t,n)?t[n]:F},Tn.prototype.has=function(n){var t=this.__data__;return Gi?t[n]!==F:ci.call(t,n)},Tn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Gi&&t===F?"__lodash_hash_undefined__":t,this},Nn.prototype.clear=function(){this.__data__=[],this.size=0},Nn.prototype.delete=function(n){var t=this.__data__;return n=lt(t,n),!(0>n)&&(n==t.length-1?t.pop():wi.call(t,n,1), +--this.size,true)},Nn.prototype.get=function(n){var t=this.__data__;return n=lt(t,n),0>n?F:t[n][1]},Nn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Tn,map:new(Zi||Nn),string:new Tn}},Pn.prototype.delete=function(n){return n=we(this,n).delete(n),this.size-=n?1:0,n},Pn.prototype.get=function(n){return we(this,n).get(n); +},Pn.prototype.has=function(n){return we(this,n).has(n)},Pn.prototype.set=function(n,t){var r=we(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},qn.prototype.add=qn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},qn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.clear=function(){this.__data__=new Nn,this.size=0},Vn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Vn.prototype.get=function(n){ +return this.__data__.get(n)},Vn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Nn){var e=r.__data__;if(!Zi||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Pn(e)}return r.set(n,t),this.size=r.size,this};var oo=Zr(Et),fo=Zr(Ot,true),co=qr(),ao=qr(true),lo=Hi?function(n,t){return Hi.set(n,t),n}:Nu,so=Ei?function(n,t){return Ei(n,"toString",{configurable:true,enumerable:false,value:Fu(t),writable:true})}:Nu,ho=Oi||function(n){ +return Zn.clearTimeout(n)},po=Vi&&1/D(new Vi([,-0]))[1]==N?function(n){return new Vi(n)}:qu,_o=Hi?function(n){return Hi.get(n)}:qu,vo=Wi?function(n){return null==n?[]:(n=ni(n),f(Wi(n),function(t){return ji.call(n,t)}))}:Ku,go=Wi?function(n){for(var t=[];n;)s(t,vo(n)),n=bi(n);return t}:Ku,yo=zt;(Pi&&"[object DataView]"!=yo(new Pi(new ArrayBuffer(1)))||Zi&&"[object Map]"!=yo(new Zi)||qi&&"[object Promise]"!=yo(qi.resolve())||Vi&&"[object Set]"!=yo(new Vi)||Ki&&"[object WeakMap]"!=yo(new Ki))&&(yo=function(n){ +var t=zt(n);if(n=(n="[object Object]"==t?n.constructor:F)?Fe(n):"")switch(n){case Yi:return"[object DataView]";case Qi:return"[object Map]";case Xi:return"[object Promise]";case no:return"[object Set]";case to:return"[object WeakMap]"}return t});var bo=oi?gu:Gu,xo=Me(lo),jo=Ii||function(n,t){return Zn.setTimeout(n,t)},wo=Me(so),mo=function(n){n=lu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return en.test(n)&&t.push(""),n.replace(un,function(n,r,e,u){ +t.push(e?u.replace(vn,"$1"):r||n)}),t}),Ao=lr(function(n,t){return _u(n)?jt(n,kt(t,1,_u,true)):[]}),ko=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),je(r,2)):[]}),Eo=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),F,r):[]}),Oo=lr(function(n){var t=l(n,Sr);return t.length&&t[0]===n[0]?Ut(t):[]}),So=lr(function(n){var t=Ge(n),r=l(n,Sr);return t===Ge(r)?t=F:r.pop(),r.length&&r[0]===n[0]?Ut(r,je(t,2)):[]}),Io=lr(function(n){var t=Ge(n),r=l(n,Sr);return(t=typeof t=="function"?t:F)&&r.pop(), +r.length&&r[0]===n[0]?Ut(r,F,t):[]}),Ro=lr(He),zo=ge(function(n,t){var r=null==n?0:n.length,e=vt(n,t);return fr(n,l(t,function(n){return Re(n,r)?+n:n}).sort(Ur)),e}),Wo=lr(function(n){return wr(kt(n,1,_u,true))}),Bo=lr(function(n){var t=Ge(n);return _u(t)&&(t=F),wr(kt(n,1,_u,true),je(t,2))}),Lo=lr(function(n){var t=Ge(n),t=typeof t=="function"?t:F;return wr(kt(n,1,_u,true),F,t)}),Uo=lr(function(n,t){return _u(n)?jt(n,t):[]}),Co=lr(function(n){return Er(f(n,_u))}),Do=lr(function(n){var t=Ge(n);return _u(t)&&(t=F), +Er(f(n,_u),je(t,2))}),Mo=lr(function(n){var t=Ge(n),t=typeof t=="function"?t:F;return Er(f(n,_u),F,t)}),To=lr(Ye),$o=lr(function(n){var t=n.length,t=1=t}),cf=Mt(function(){return arguments}())?Mt:function(n){return xu(n)&&ci.call(n,"callee")&&!ji.call(n,"callee")},af=Hu.isArray,lf=Hn?S(Hn):Tt,sf=Bi||Gu,hf=Jn?S(Jn):$t,pf=Yn?S(Yn):Nt,_f=Qn?S(Qn):qt,vf=Xn?S(Xn):Vt,gf=nt?S(nt):Kt,df=oe(Jt),yf=oe(function(n,t){return n<=t}),bf=Pr(function(n,t){ +if(Le(t)||pu(t))Tr(t,Lu(t),n);else for(var r in t)ci.call(t,r)&&at(n,r,t[r])}),xf=Pr(function(n,t){Tr(t,Uu(t),n)}),jf=Pr(function(n,t,r,e){Tr(t,Uu(t),n,e)}),wf=Pr(function(n,t,r,e){Tr(t,Lu(t),n,e)}),mf=ge(vt),Af=lr(function(n){return n.push(F,se),r(jf,F,n)}),kf=lr(function(n){return n.push(F,he),r(Rf,F,n)}),Ef=ne(function(n,t,r){n[t]=r},Fu(Nu)),Of=ne(function(n,t,r){ci.call(n,t)?n[t].push(r):n[t]=[r]},je),Sf=lr(Dt),If=Pr(function(n,t,r){nr(n,t,r)}),Rf=Pr(function(n,t,r,e){nr(n,t,r,e)}),zf=ge(function(n,t){ +var r={};if(null==n)return r;var e=false;t=l(t,function(t){return t=Rr(t,n),e||(e=1--n)return t.apply(this,arguments)}},On.ary=iu,On.assign=bf,On.assignIn=xf,On.assignInWith=jf,On.assignWith=wf,On.at=mf,On.before=ou,On.bind=Yo,On.bindAll=Zf,On.bindKey=Qo,On.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return af(n)?n:[n]}, +On.chain=Xe,On.chunk=function(n,t,r){if(t=(r?ze(n,t,r):t===F)?1:Di(Ou(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Hu(Ri(r/t));et?0:t,e)):[]},On.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0,0>t?0:t)):[]},On.dropRightWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true,true):[]},On.dropWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true):[]},On.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&ze(n,t,r)&&(r=0,e=u),u=n.length,r=Ou(r),0>r&&(r=-r>u?0:u+r),e=e===F||e>u?u:Ou(e),0>e&&(e+=u),e=r>e?0:Su(e);r>>0,r?(n=zu(n))&&(typeof t=="string"||null!=t&&!_f(t))&&(t=jr(t), +!t&&Bn.test(n))?zr($(n),0,r):n.split(t,r):[]},On.spread=function(n,t){if(typeof n!="function")throw new ei("Expected a function");return t=null==t?0:Di(Ou(t),0),lr(function(e){var u=e[t];return e=zr(e,0,t),u&&s(e,u),r(n,this,e)})},On.tail=function(n){var t=null==n?0:n.length;return t?vr(n,1,t):[]},On.take=function(n,t,r){return n&&n.length?(t=r||t===F?1:Ou(t),vr(n,0,0>t?0:t)):[]},On.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0>t?0:t,e)):[]},On.takeRightWhile=function(n,t){ +return n&&n.length?Ar(n,je(t,3),false,true):[]},On.takeWhile=function(n,t){return n&&n.length?Ar(n,je(t,3)):[]},On.tap=function(n,t){return t(n),n},On.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ei("Expected a function");return bu(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),au(n,t,{leading:e,maxWait:t,trailing:u})},On.thru=nu,On.toArray=ku,On.toPairs=Bf,On.toPairsIn=Lf,On.toPath=function(n){return af(n)?l(n,$e):Au(n)?[n]:Mr(mo(zu(n)))},On.toPlainObject=Ru, +On.transform=function(n,t,r){var e=af(n),i=e||sf(n)||gf(n);if(t=je(t,4),null==r){var o=n&&n.constructor;r=i?e?new o:[]:bu(n)&&gu(o)?io(bi(n)):{}}return(i?u:Et)(n,function(n,e,u){return t(r,n,e,u)}),r},On.unary=function(n){return iu(n,1)},On.union=Wo,On.unionBy=Bo,On.unionWith=Lo,On.uniq=function(n){return n&&n.length?wr(n):[]},On.uniqBy=function(n,t){return n&&n.length?wr(n,je(t,2)):[]},On.uniqWith=function(n,t){return t=typeof t=="function"?t:F,n&&n.length?wr(n,F,t):[]},On.unset=function(n,t){return null==n||mr(n,t); +},On.unzip=Ye,On.unzipWith=Qe,On.update=function(n,t,r){return null==n?n:pr(n,t,Ir(r)(It(n,t)),void 0)},On.updateWith=function(n,t,r,e){return e=typeof e=="function"?e:F,null!=n&&(n=pr(n,t,Ir(r)(It(n,t)),e)),n},On.values=Du,On.valuesIn=function(n){return null==n?[]:I(n,Uu(n))},On.without=Uo,On.words=$u,On.wrap=function(n,t){return rf(Ir(t),n)},On.xor=Co,On.xorBy=Do,On.xorWith=Mo,On.zip=To,On.zipObject=function(n,t){return Or(n||[],t||[],at)},On.zipObjectDeep=function(n,t){return Or(n||[],t||[],pr); +},On.zipWith=$o,On.entries=Bf,On.entriesIn=Lf,On.extend=xf,On.extendWith=jf,Zu(On,On),On.add=nc,On.attempt=Pf,On.camelCase=Uf,On.capitalize=Mu,On.ceil=tc,On.clamp=function(n,t,r){return r===F&&(r=t,t=F),r!==F&&(r=Iu(r),r=r===r?r:0),t!==F&&(t=Iu(t),t=t===t?t:0),gt(Iu(n),t,r)},On.clone=function(n){return dt(n,4)},On.cloneDeep=function(n){return dt(n,5)},On.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:F,dt(n,5,t)},On.cloneWith=function(n,t){return t=typeof t=="function"?t:F,dt(n,4,t)}, +On.conformsTo=function(n,t){return null==t||bt(n,t,Lu(t))},On.deburr=Tu,On.defaultTo=function(n,t){return null==n||n!==n?t:n},On.divide=rc,On.endsWith=function(n,t,r){n=zu(n),t=jr(t);var e=n.length,e=r=r===F?e:gt(Ou(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},On.eq=hu,On.escape=function(n){return(n=zu(n))&&Y.test(n)?n.replace(H,et):n},On.escapeRegExp=function(n){return(n=zu(n))&&fn.test(n)?n.replace(on,"\\$&"):n},On.every=function(n,t,r){var e=af(n)?o:wt;return r&&ze(n,t,r)&&(t=F),e(n,je(t,3)); +},On.find=Po,On.findIndex=Ze,On.findKey=function(n,t){return v(n,je(t,3),Et)},On.findLast=Zo,On.findLastIndex=qe,On.findLastKey=function(n,t){return v(n,je(t,3),Ot)},On.floor=ec,On.forEach=ru,On.forEachRight=eu,On.forIn=function(n,t){return null==n?n:co(n,je(t,3),Uu)},On.forInRight=function(n,t){return null==n?n:ao(n,je(t,3),Uu)},On.forOwn=function(n,t){return n&&Et(n,je(t,3))},On.forOwnRight=function(n,t){return n&&Ot(n,je(t,3))},On.get=Wu,On.gt=of,On.gte=ff,On.has=function(n,t){return null!=n&&ke(n,t,Bt); +},On.hasIn=Bu,On.head=Ke,On.identity=Nu,On.includes=function(n,t,r,e){return n=pu(n)?n:Du(n),r=r&&!e?Ou(r):0,e=n.length,0>r&&(r=Di(e+r,0)),mu(n)?r<=e&&-1r&&(r=Di(e+r,0)),d(n,t,r)):-1},On.inRange=function(n,t,r){return t=Eu(t),r===F?(r=t,t=0):r=Eu(r),n=Iu(n),n>=Mi(t,r)&&n=n},On.isSet=vf,On.isString=mu,On.isSymbol=Au,On.isTypedArray=gf,On.isUndefined=function(n){return n===F},On.isWeakMap=function(n){return xu(n)&&"[object WeakMap]"==yo(n)},On.isWeakSet=function(n){return xu(n)&&"[object WeakSet]"==zt(n)},On.join=function(n,t){ +return null==n?"":Ui.call(n,t)},On.kebabCase=Cf,On.last=Ge,On.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==F&&(u=Ou(r),u=0>u?Di(e+u,0):Mi(u,e-1)),t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=g(n,b,u,true);return n},On.lowerCase=Df,On.lowerFirst=Mf,On.lt=df,On.lte=yf,On.max=function(n){return n&&n.length?mt(n,Nu,Wt):F},On.maxBy=function(n,t){return n&&n.length?mt(n,je(t,2),Wt):F},On.mean=function(n){return x(n,Nu)},On.meanBy=function(n,t){return x(n,je(t,2))},On.min=function(n){ +return n&&n.length?mt(n,Nu,Jt):F},On.minBy=function(n,t){return n&&n.length?mt(n,je(t,2),Jt):F},On.stubArray=Ku,On.stubFalse=Gu,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return true},On.multiply=uc,On.nth=function(n,t){return n&&n.length?tr(n,Ou(t)):F},On.noConflict=function(){return Zn._===this&&(Zn._=pi),this},On.noop=qu,On.now=Jo,On.pad=function(n,t,r){n=zu(n);var e=(t=Ou(t))?T(n):0;return!t||e>=t?n:(t=(t-e)/2,ee(zi(t),r)+n+ee(Ri(t),r))},On.padEnd=function(n,t,r){ +n=zu(n);var e=(t=Ou(t))?T(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Fi(),Mi(n+r*(t-n+$n("1e-"+((r+"").length-1))),t)):cr(n,t); +},On.reduce=function(n,t,r){var e=af(n)?h:m,u=3>arguments.length;return e(n,je(t,4),r,u,oo)},On.reduceRight=function(n,t,r){var e=af(n)?p:m,u=3>arguments.length;return e(n,je(t,4),r,u,fo)},On.repeat=function(n,t,r){return t=(r?ze(n,t,r):t===F)?1:Ou(t),ar(zu(n),t)},On.replace=function(){var n=arguments,t=zu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},On.result=function(n,t,r){t=Rr(t,n);var e=-1,u=t.length;for(u||(u=1,n=F);++en||9007199254740991=i)return n;if(i=r-T(e),1>i)return e; +if(r=o?zr(o,0,i).join(""):n.slice(0,i),u===F)return r+e;if(o&&(i+=r.length-i),_f(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=ti(u.source,zu(dn.exec(u))+"g")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===F?i:c)}}else n.indexOf(jr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Mn.prototype[n+"Right"]=function(t){ +return this.reverse()[n](t).reverse()}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Mn.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:je(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");Mn.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Mn.prototype[n]=function(){return this.__filtered__?new Mn(this):this[r](1); +}}),Mn.prototype.compact=function(){return this.filter(Nu)},Mn.prototype.find=function(n){return this.filter(n).head()},Mn.prototype.findLast=function(n){return this.reverse().find(n)},Mn.prototype.invokeMap=lr(function(n,t){return typeof n=="function"?new Mn(this):this.map(function(r){return Dt(r,n,t)})}),Mn.prototype.reject=function(n){return this.filter(su(je(n)))},Mn.prototype.slice=function(n,t){n=Ou(n);var r=this;return r.__filtered__&&(0t)?new Mn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)), +t!==F&&(t=Ou(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Mn.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Mn.prototype.toArray=function(){return this.take(4294967295)},Et(Mn.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=On[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(On.prototype[t]=function(){function t(n){return n=u.apply(On,s([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Mn,a=f[0],l=c||af(o); +l&&r&&typeof a=="function"&&1!=a.length&&(c=l=false);var h=this.__chain__,p=!!this.__actions__.length,a=i&&!h,c=c&&!p;return!i&&l?(o=c?o:new Mn(this),o=n.apply(o,f),o.__actions__.push({func:nu,args:[t],thisArg:F}),new zn(o,h)):a&&c?n.apply(this,f):(o=this.thru(t),a?e?o.value()[0]:o.value():o)})}),u("pop push shift sort splice unshift".split(" "),function(n){var t=ui[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);On.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){ +var u=this.value();return t.apply(af(u)?u:[],n)}return this[r](function(r){return t.apply(af(r)?r:[],n)})}}),Et(Mn.prototype,function(n,t){var r=On[t];if(r){var e=r.name+"";(Ji[e]||(Ji[e]=[])).push({name:t,func:r})}}),Ji[Xr(F,2).name]=[{name:"wrapper",func:F}],Mn.prototype.clone=function(){var n=new Mn(this.__wrapped__);return n.__actions__=Mr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Mr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Mr(this.__views__), +n},Mn.prototype.reverse=function(){if(this.__filtered__){var n=new Mn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Mn.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=af(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c=this.__values__.length;return{done:n,value:n?F:this.__values__[this.__index__++]}},On.prototype.plant=function(n){for(var t,r=this;r instanceof Sn;){var e=Pe(r);e.__index__=0,e.__values__=F,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},On.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Mn?(this.__actions__.length&&(n=new Mn(this)),n=n.reverse(),n.__actions__.push({func:nu,args:[Je],thisArg:F}),new zn(n,this.__chain__)):this.thru(Je); +},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return kr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Ai&&(On.prototype[Ai]=tu),On}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Zn._=it, define(function(){return it})):Vn?((Vn.exports=it)._=it,qn._=it):Zn._=it}).call(this); \ No newline at end of file diff --git a/old/includes/rubik-regular-webfont.woff b/old/includes/rubik-regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e12d96463efed38b7896fd8e83c6473e52e19609 GIT binary patch literal 33332 zcmY&|GfNFE4*iYcl51_021d_jN#0Qdz?7avABC3+?R0IT}P zPwfZ#y#yXIMm7fa001`VPt5Qi>>o}2rZRGMCIkR*qJK0$dH@qrD9o;@y_wAq*Z-qw z`02|;shPga%)sf#7ti@e1Nr}eXlCtU`onnx09pDT8cUjX5M0EPhav^B6X`QgfcG=~5HsIkOc7Pq~f(@$=GKjQ$p`iZ&a@hAGq z-qGa8H{d5fK>ZJoz>Cyd?`C57lXD==4+s7qS`;<8e(e9w((+aE1jZbtOS`)I zI8Z?!*-Pv0?ox7g^}P!MA_wpIb41p+w0*3V|EBOW;|DR0Ac7DH^sXh>jX+r-8-^R@ zFJ&Po)<3b88nnROz$V6{bF1mm-V$((TgfjpBLzCjaL;H+y>W zKwUZ1k?@sv%nO#wn_HBd=kYbXc-V3DNqTc(|6PA{>^+{(0zUQ zZ?s+Rt0*HSYL&!jJx&;2!6m z`|g|j+sXwH$#hjj!qI(LR`Wns15th9uAI9$lBD42uj+_Uvu~?8jifpB_lzjFxMfrP zf>QwDp0G#OF5i^5X9!Pu80109Glg!E=s`UQ|5=fmT?xNM{2S-C3XfSg#Ivd+4_{dC z;)MrIX*@5^u$bX0)*u-M(*(Lmdw@ddv00E| zcL_nf2a;B_hr9h;tVeapLMTV8d@+{GZBB|&Gx(n7P-;Hrrv-t&jlo+c_ z_)RSyKI@Yj^6mDpa@PnhH?^SVNx3BlxzZU*1-Kby7DMX|dQTSeQ)G^q@DoiD-&7s= zGWiy_9s~U8;{i+##7WK{ncBZc%)bYz;2q}W5tUXjOYi~vcbAkuQE;ol!)BbW&?#&1 zn^1C`Zf(&t+Z$YN^W37jmTc8rYh0>5qD@>-BuW25umVDX&pV*w)uQI6IM4>#C$^~1q1lFM18c4gc$TmE_F#tD zzXrjr4amxu3K{-tk<%TLcXNre9SiXhq!5wAo!`?2AZ)X{OZZZa?Cm-?IN-bMOr}`} zY;6TJ$tCa2>*;~HL_d^G-QOc7zzyB6fI5%Q z<0F}?DnRAB=f(nQpvwBwG> zlehp3-BIY}Q61b}TX?7Np!`ALcmIv(ssu3bwfG}0NVqNm{@v*iUwXO!XAdXWn3vV=A9c;7%&Kkh-V-3FZ=#~c{Fbv(PYij{ zr*Oc0UkSkw#z?>)=R_;kE>k2BOUOO5VbcdQRfQ!}=KykvN!I7EbfhY z>9cM6t}|tawJxIt^TJe352i=zs@x0Y**0J+BBS3KccCB}FiL43Ky{!2+!lGU>tU`b zt(WE>b?p2oGxK_hOCWh;toeNvW&+WJEJwbX)$3(NL%KV9#|xfu5dvrFgP!VyN5ci2 z!*#H}5|ql=9>U9-sdNetROvdlYNLd2g=SpeUch}QE1aY*RkiL_V1tG+x+zs*cHJrh z9MvlJR|aGgGHO#4i&JlL27ZoO23=~JyQ5K2Kxn=o-xQH#jp!m`f{^7;O?zt_V6BD& zk3HQen{q7k($^o(4DQwwG`{7J;7Y30Wb7<8Z69IH#ep|wX9bA61yeoIdaID?RDNyO zZ#plW$r8WBbYLEjZ);I|QQEwfd~7oh1&7m~!`$XguY0AL$4=&iJI1$U3z3k}N}}9UTlGIiQ&BDGF885hl#% zJv;Xu(E}ToF2@sy$CfcVattL`u_$rHHVtw2N@rDN1fWEnpTCU4Q;>~vaov| zyG>FBhor*b(86q@5d$$af}ZM&2ZqUsx=s>rR#`lu)O-9kGxPvFr3R$9N7Spo6CPaJ zn_3<3co~25cNYLf$t}+Oi+v0YIB@OCRi4xAF~Hy&F}&40-7s-~W7FA!+S)Lg0%uF) z&maS?&73y`;xV*`oIU?2xn1jSdakkTcoeL0(Gj0@(7`4LD22~b%q*VqRLx6V{(*vs zy^5I`+$Wn6HX_!z#To&l2@uZSQ-#pl5Mczd$cd|?^j@)(yu~}ERb%5U=W>!Wv6oCK z#%71~+b6D-y&vUbv%_>kMquy9Fjg~Sq58XES2k?NYc~dbvp_&i8UMzjCP=qmwyUKJ zA-y4TjSn7;^QRJb-w{m^9gm$(&gy1sxUC4uI11OVdRpRdrH{h_D1#(XADGN`KoS05 z5$$5$_xmt-Z?-@eW^4ld*o61`$+Zx?7STE(9z<%m-E+2P1ZPp|HjY;oZIi|3QRzIV zKND`U-6y|f(T2@Mc{pqy;~C1v&GY7>nhO7#q6{R}eu7cK8AKCdByvEE0W)3hMsx=@T}?{)ok>Di1&9C&!-T@Ocv?t5PuVs*&frLL?3|c!-?Rk zl^Jmbqm&msW!Ro~83%b3)cP+RQTOqTWDb6%~1&K5~x19HBto3Ip#hpA@uHHVYI3SJK3efez|e zM__o$5lCa}ol1ML;VZa)41Qd_6Xc^f!RCPj78`}t8Qpl{xVlDte?{Eof_voz8}EXQ zH5WN+So03*w~b0-W2u!VF;4+fQj*^F&AZIdj@8^Ytcx)>g9~e5LX7b>bUhx^tg_}| zOgLWj9>+fkbcHL?jM=Q2$+#XLUBA9v?XJ_EaOJDiSOzyqjw{<}`CHvNYdY)N_16R4 zkD}Vus2wYtqqvxh@zlG1p03#VmYDyfM6jYiI z1n0<7h3C~nzqp~zNVHtok8)Lse+AH6wiUv!@)O{l;vvlwnnHYGrxu!Z&zj@(`m}E- z=9p}MKk*^>nnY2${-s96WG1C*Os^gRWxME<9oLHs{Pr9k*%(-BJMh6VdslfDYhkS( zmf4i(QzsEI=_s>wn9Gzhx#^Cyha7#P_*ipWrJc`^h`L_77Imu}1G)^iW$$z%68Cp9 z2GMpEcqOXu43ptJT~Mp=JZVRyIeda0$qOj0Mv>Wo-CBcsCp^?#oH@;Gr4A|mSFe=_ zzO>?T6A;bBY*~AO`lVj;-<1#nj zmbYpO&_|8iHv#d$Hk654nVxA7L!NI+A+h8!1K;&;EnNOC^^yz1f2jB!Lpz0Il>GU% zCEtv{oM+cl?Z_h8P}6GRpLOJ$+}uDjfa|Pq1pM`DiYZD+(|I=3iA1l0tRcI^4ore4 zUuLbhu`OFUPlB{(%5YH^k!M!qd9yw@80C)@gps=)%OiFY`0~)cl^&ZPd)6I)@q0zl zehX&|Hd4iWw_;z?#~|=Ubkel0y4mz?2M?5LnN+Ht4%dum5ubA)+dyMV=)D5QG`bL!Pvf;n228GHO zOf^qF9Mw4P8Mbqff$J$l=^z`%a)q(U{6Sh-^ZMxC3 zJ7c)fh28moAMSpcKK&A1kI7Z^St+C`A)XWBPQtaC@+hCx<>bj<0=56ZHm~sclB{(F zJ|Vs4p&gK3_L7anzwlp%%Rh?h&&;fO@&J2y@Hd=v;4$;Xxae!%IbRKIQ1$;3$!~~L zcD9D7&-cL}l2!{!Qw=gx-S;G*P=$Kqk8Q*jgNh~ZmpQMg8s5zW)(;fexdVL~r<)V? zkvzz?_-Mr8G4$q1-Dfp3pr4%n&7pca97dkvzon^~Ws;|xo6LzBa=67UYQFbpWPr=~bV`J(iVnF$BIndG)?UHV6-(eQ@mrG%{}9tYy=>q4WT=N$Ovm!IVQU zt=Bj6x$epV6?d&rpDiLmEuH1--8<72+-^4*szL*A-zCvzsvBOZW5ZC6`RJeUa!MX< z9^Hfv8>@RkFXY&bRO@GoDuNteK9m6<<*e3MA| zw}ykVGw~*)F0Rk}aQuiX`BvS9*;v}MFkUhxBkFAZRjTA$Qq6UJF@MI!H*3}&w9}+z zpYJ8M^egdWS%a7OvVNr~ZtC z=Pw#NpmQvXIa|r5Jb+2GPNtkdkF5IuxkDS&>`@L-?^IquC(+tpn&`zO-(GObw^y6t zI@_i#TxV~JWlfW6530Pm#Ikd@nmS<4CAF9emXO0x%MSOZ_;82pG9$BpbZ+<`EJS3; zc|Zg$3{%=oyn#ftb_E(m5H}@joK54zBySs8B$}e|`D!a8qq1zBW7lN85%)6keTyEv zGnhj%{;hkyA!~w^k1Kobo}5oGX1(Z9th6|cJzHtU)CKPA^W(sT) z(`Bf#;_Rw){z`W+X1NpagnUVJju9mme>s^6L>YA^z|)$6Ui^K@dv!sa@}1Z?zY}V zgieCY$vgeFvtv}&Kj+`TdZt=9YhWh2LFU?UAWNHWMUbZIf*OXU*-nfuP)+A zhh^_|ngz210_MMLr^fUqLs~Z}%nL~s#(y~n_vPhQep@|BM7|jeK}7Z-teqzDK+*PD zlV-4q;LWFauY4i6sk1(O#A)xZ9%GbXDWtf?h92=`O;pM<6nc^vPhjDMl3zVsYkI3} z6K1&GU#DqaCH|XHsNHWvS>Y#f@14QOW~$um#W-1Qnn)aHsP*0%nI;BN<7v@1{l-rz z**NR7Ze+er@(v`X5*$y%`!acemIPACrzxaLCTqme zqu{=gq7?2E`ecYq^NmXs^AosTV35T32~rd55NX`Ksh-!v8BC8aoMB!+K#GQr4)dGu^0UkBQ{!NKy&IZMjb!L^U zI1WvLHr5JhJX`6939h~VeNLCQ8IO#mVe+hO5UsS(^(MDT^s2U5H$TMA^7cK-!YTjX zx5;HS8F6I=)UWOCS084h1LI#qghPbHLkz*;!QtWI(TveVLczg@2&#xgnM7bjNc)P! zgC$XrX~am#w1aFlg(*?!^OXeVdzCdl&%IUGmCQ-svat6vyw|z+IoH|m@A`oHIe#yP zPA^BWm%U>gYg^$MNW{y!a_eo@Y_dOCx|8l|L zRTAsULzHsUViwzdwh_h{tSJM081+BMsST0OFX6KbGyPWk0E`CHsV?y8^p30C+hQK8 zZJ=xRo%HJ{{%bvWVUVGKl>X3^2JmVPt9egqAJ~hW#0$x<1`~!_W7Y96$y$mIgGu?Q z#JH4?;zPTxUwh?=cx-=faGeks-^JSFD0`U|f?&!^U<;wr5{6w&d8Vx~($A=xSmIGt zN?8y~+N4&XIpW%vsHEC7G863@jb*>J*wC@(Bk{F|F!A-#>2ILzR@2IN6XwN;6^Mf* zPw;o~=LUO<{1s}`%G_hqE-UKtD=$=P=_lG2(%(AhvgSj4VU2+0ZlbRb%+wWn0&j^g zXEM{`s!ou(98%2YIcAAK8kDM2b#qqn>B^=DCpmKkA?`3y+W<>B`eYAN7p@|FXX*Hs z7R@AKINnNL(HiF(%U9t}n@F44^pwqe(2toU#`(;(^YU?#W{%3k{{+n6&B~f0Y>jZ2 zHip;P8}TSnG~!Sd@V^_;&>HRPwNkkxQ?Mg)cn$HxAw{u1wmO5zX9jz$^KWHuq^WEV zR-y1EM&wc&oU4av%=NbxH=`ytxcLlgVLo8po>zR_IdcvFZ8T_dEc|+2gw4VuzBt3IC&dQfs4F2g7)m@WdqHt zXqX!Dw%){7atZsYqQqkx>UXImy(r3OF#rKiS6h_c|IpoIYgj|;PZ99_<$%vg{ zfaAj6yU>}*KaaknB-7Z^x}|AIO|3YZv>=71B2QA0D_5Hh?Sq8-&meL5D@Up4x_c+ z#{v%SYV->(|Hd^Q7X@MwpRlCA9|R!C51aA7xcd60{`y$pqTq<_Acu^BuQad_{>|_~ z!12Q%#M1Lpd%$Gs46Ybu`@N-xjH@Hz(YkxewCUYqo=B_u(i5A!N`4Fb(Go-T>T-HEgyG4`wv?r1j_>Ks zvQ?X{USC7f-Y!z;C;~p8*NnW!J-m>VoRgi}cW{J{QW>Lk2D2O6(7aKIfQ*U&EC9bV zvgK!;h!QLl&<>~u)c&jnH2^vQ2Y}B1p$pIr7yt|chJLsfKslfg-~~T> zu9vaUbxb5fZbM3cDB<6tDzBl~vpqE6hl=mB0?GbIw{dOvlNSwdk- zcxE~|cA}&bEi(~2siXR)4oM{Mz7IQz3tW~`B&^Np#+6A;&%1BtmA-y}GnDAa+%!S%#o^lDY={v2(0YmjL76 zV&EuAzgU9UDGE;^9^d|%7cpW0XPj?cJtP{@R# zj7Xv*1Ad}~Y_{#;!<9eLA(mLaZ@J3A%=WcW2>qW9x9T)v}{d)Ak^l z!&_s3lFa_}z|`ptx@JIw*LT9fmJPMef70?Jd81=3z!f69*`bNOC8hsU@Z-<>#!YW+ z%H;gP>F;HZihwNeHWm7JIa^vmY?N57o}&~QmfYbi3l)Il@RS7$EmG%jlXeP(jI;Js z_MqKugsOuys;}}r_{0Fccl8k4Aa_qQi4R-U?|adQ>)VSwFAegJjJJ?9TFSvDPQl_n zF$^)KZ)yH{@DmdJ0-c+WNT*cw$G$oELOk1&Ty!w^UA69_KNB-n5VwM!pzcyiJ$a&Q zVh>46HA{7r9$CS_X21beX~$G!ShR7HjrWZUgVU3=*-WsTcf!dywD*oGq@3O)j!x;o zw%cQr=<(yUsUAm8RAPRQf9u-gElk&D##_@M`MLE1qt=MKWR3*HyvkV9gXLz^c=Ybh zr_uQmg6a1Jd?vRos4cJMIR)rDfPLpAqZS9LLpOzgcQ|0qNIymdTQ^YrJo|0;QsR@v z?$GOP!6E5nwV8PSeuXQ15k zW-lXJwx*HRCa^qu#>~teB9*1=^UIyv$QSX`HcZQ~v#^gJ19%Zn^fTMsue^Bl5fuYtr4=yGGW?7k6`ym%lnR*0JlyosZSzXr6~jm8 z=8)ksLk;SBPD@9do%i}`C*P}!R$Q^i2f-fpvjK?L&B^PUI6*V30yHZdm~>9hvH0gW zTs>w@w{i0Jy~bC0JiIR9x&MioR^=OGOP1 zA}5(+N1Hml8xLUi@^!@Mj%Y+`&E9dO8+5ZF?v=R3q<<(~ob6|dbu+@`*gaO5)mH+($$6+93n@7#al5GFFc{KCq z#(vP_==%k@M1$XbFKULbt&YXvUcRRam|&ex`?|Q_2>;_DD0^#H%yJ+KUg^Eu7|}f^ zI={+lX__1+V0j|mHaE2m#SIyvh0T*rD|tG9-a)nl>BSfX4?p1Gn1iD$JJ`F(q?Tb} zl`8*k)x86(eHjyU%!Q5Dg z6$K*XH~ySy4w_4qMwlmLHwVR|+@FIUpxTpd`j!@guCDt%`h{C~0&2~XV8hUV=YAW; z2Q$!YLjePBa#!8X&Ce;BS*{WwdRB5d2=FZLb_X9n^EkbvKH>9+=PkMGi*C1*{5A{c zdVUUfcMb|Tf~!0aUxvrGfT-@pVK~3~Yg!aDI;M+fH=C#{9v`i0e#5wtGwy7-nyidI zmr>*#A}tvuy)i6=PUSABuS|Txuk|WVt7(-*e+(9WnJ*1hm$^wi$JXzXvFkip-r4NA zQHlg;`9>+l%QufTQc6xweI3qM7<2%cE-2YA?wbhWrIU#Cq5~i+5s=T<#;KT}!h4eA z{btAv%YneIUI_)^p3l$rFqoLdeT&b1+x6XNaQz~D+?Jv*+kXF|L*R-%(_2tFPcLLB z&3#CpAQgcyqKZe&V*52@GOUmvQy~ChBw=%bi+&Ga$tmp~!eYv*r?=aF6Jymyo0djGsJiEOUSdncR8N!leMaWPJjTXuT zLS4Wg6xe{QCpAmczA@GCZC+g~w?$V5=#UrQmw?}zdX$VIgdNB_F>=lQv;Ie`S_RLV zm_54iOtQYAZcGKmd}({#o_X67jK}OVXBs18j$KoHMF#eB`qeCQ_MES@Yhwo}BZYEMzFZ`7dY3ucIo#ZSm% zS)F1x3_Y{}dHmm3rB4yS+QnDD2Z{*L##cxAbBg1D8V>~<4}V+4P8Z!JM5s#a4TNCc zQ8Kq9;$TJU%iw%AGYyY`STooop7w6YtEdcdmzmF?x!i?rEn)$}-$P|z23n1YdmCSF_)C9x$j$Mf4!c;Nswq65_#6GlEu zYDSwYg!)HMgMb|ynDwg{n>gqpBHZ)oEM9iySy43-*^)_@?%!b{jnjC0L1U6zBaBa| zKz@cBJ|pI17%0Cq*LTrDtH09lzcBt!e;-imWDsvZ@|5Pi-OXK4$9X8_0+dyX@duM( z4Gwy4&JtXfl6rexsDTFDy%bsuUZ)fsSxPQJ9*1s?uuwcy;=k2GAXjxQC0ph($07*K z(ihi#o*yq&Vw#wtD~z;aH~Y_885mek6)+gNzuh25?T#6k<)ZOF=GPJun)tampv&y| zxOhHJvmlh@qI=&qo$3a2)bjlH(DEVL8ID=QHzFx9QfP$zO39J3gc4sTCHdN`kbmp( zfk2^?F+(_~!k^bXG-Z#$73c%cNlxDu4A#@3F)f0W;wrqn*c9`5{Y9JUZ>jv)l2EWF zpQ8iTW$A#TJb{=Bke;~A>E10L?tVgYn~z(0a0j)$rl1Iv;?0k(3l|f|FxX2 zG4%{WtHD?x63?-zE<;8vMavdm@jwPhnn51P5gDEmSGrF?;YGO{OgFajtw%1twDO&NiQ?F}%P zH`H>!F{m@6z!Y1d!~BB0xoNDE%5YGi*hs+ye)4L_kUq=V^#Zx)v~Sdv=m1o*>6X**kl#_XJuQ1s~e4glTS-A8jK)SkhIimlMWxH9`h{L+1d~gC3jfO==K5rAY|Ecx_sFaTQH?!CG~dwU9j{O%yut ziBHOyM;4N-%RE^Edd@L#Bu_>Q>&EFhVsH6ETsHyGwiAAj)06(mK!UmRp}yI-dC+0* zevV9G&MPDKVMtWr^IYuK4mT@@`}r_$5`8vyX_-fv4(87FMq^*w^R{l@-)ondw;V}nG%7*^8G5fXa znz|7mOs<~TKafrW0M12ep)&g;MCAx2A4}a!8@Kbl6V!MH!jjxBgD2!8Z@#@}w7TW) zpCL*d{}0z)apvs4AXStn->+P;@ZoT!lNEVi@#m847 z32d(R4l_^jJBasRI5?$mfdjo2p`qOGfe&jH#zr3>r@I+Fw6tEcu(7#u>{GHa*?Cu| z>3saiJtfoEb~qIgvGF9#nAqj?^mPP~A>hcmc7}kXHjGPE{yC(hXZYn=a;Nw}qpWIn9KvmU?%d!3G)P)0A&+4LNszfMCDB=?j9ORO6qoW+5~dY zWjdWu*7ktXPyOBu8}S-)?1|^Fa7hYAKGM))`-JA~@bNYV3U~f3J1pwy5j(0l)!}w~ zLEm01PWMfmZ<(2rY1@fe?Ca_=A;5n|!sCOIeFxe?5dUIH7Bt4>T0@LWxU85GL5v+A zKFlYRODkfUY_#eRAfNk_D?llmXL5sm|Fw_75evbWQ5{@I2irwe z^MIf+G7#4(6jD)FjL#IdS=1e5a7J+FoBnJOzN^%U0re@h0GTDPCs&>~qf8I7mTL01 zY#>q|)LH3I2Yv1$7GMT)vi=1r{Q%4*7F6YEzNP}U#dWgBg zkGS>Ss-${sYq0B-dmI|JuQ2{SNC!DtSay3H5Dzv=sw=z)|ZH(C>C!H1-P31#H zMolx)<}AYqN!|R^cvSPhmQPXeFQXz5FXW;y?QC|&O-^Tb21HCA9u}Ts!iv}x@VrAN z=IVijH-~ffB>KE93q$o#)_*+jcck_ev*gLEZjidA4DQ!M^!QvEZ+l26L+;fBv6)*w z+V#}v|6n!Gc4T5W30{|zNQUG-&b9U1*$vKjcK+GitOFY=yaPeD&TMV09qvmsZ~yfb zl3<|WkcIoa(!+u0K;F#OR^SslW>A;7JeUKb2L&>|i zk?7%8)&L}ook4u;7V_+dgp;RrP(UpmUz*7Bwi9xT!WRZR{Q3iisgLf@t?*#dPlF&T z9Mw=OP<9{en^UeKtXcf?zM^GB$bbTgd4>Qd+e=S)?nY1gbjlmRw=FTtaJw`sBx)5a z0T~h;$A5V5QI=LjTcPKmOa7^J%sUk~u}jVG?~p3*Yl*@tK^CPDmE+F|xxEI8*)gFv zHE3ToXA~MS>YR84ADzG+$kR!3%5H*Gk_iEU4P=4JK1e!e@n)dQl;@g}<-Qiq+=NJ7 z<{=HIf;g4znq(*~tWoh0$t0k)1A=i43%>7C`gQi^mABS*Q@HDq^0heA#pX2}+vTa) zHa{xc?^luGE-Q}+Q5rYOMcxG*x~jLc^L=yT^+(L-Uy!1C`}Fs}Eff^5em-9y`;}4s zw*94PWv0k`+OXGDk_9{3o%k|v&Pb3ePI16ReLhfClJPN9{^zSPRuH4025Y&Eps)nt zJMIxW-}qd1=I<))DVSBJDzZ229vPvJOjp#3PR63eh9Etki`5P{*=AaS%px3Al9<3VA1_pT?D>um0)6*UN~y%jS%-j|V#f(9iFE{`((xT|x7@0W~u zn4;Maj!k|fv`ey;8M|!kji;N7N*>@mr|A9@;$0`+l;-{Fe-?D_2`wtYEs%KsviHI9 zGuu7L{FClC1ljIoBCKbiTnpDNN{6j1t*DF`WDYStpAy_=;_@XC_}^9%l(8JGE_%gW zUv5=zTE(7Adc`=FpLgS8V|_gyPP5A1|A=Y1`B_Mnmo;gf^EQ-;JQ`7CaqCa%3OGw3 ziD_r!I{=N9Xdo)kO_z(J8Q%<}v$}{SEaku$-RyVs(8iPG6$It#LZ zz_e9q1c&e&7(2tO_0qeK%`NX*2*hw`HD3yPPWdn#GgYQYrqYeTap(?cM;@TrcVDTD zWMNg9eI``?4he!y7}y%YC9dD)kT^DunUx!9yMbZiAb#dFjelo5&p)nVY$Y6w4W|7y zs5^B8cETo_McA*#R;b;K(&2_NGil4(SsqmHE`-O|B^Ws1+Ft{=tDmSUgc9DTZKfdo z$4P7eoT3@W7EKGa)H=g7-bL63E5RK67Dr~%k-)M!0DIwnt_vaW;-PA(K&?%GzmM{1#5V!&yLrFcmMjg+YmR?95RL z^7!PWco|x@S@h(lGQy64K9oy}O!%*mQjVD4vkXE@2Zq*9*Pa+LW$)JovW! z*KxXQv;Wlt#~Da*sF1P(AJ(B^FWMC2R}&46#FO6i7x&?F(#}T7(SUdQHA$z~f;VYY zTAT+1&~T^_Pz9-;TbNZffw!gV{r$3 zky6LDieb(jc1)ISHhwyH*IY33-$$6-SR;N8&zBVbtI|B+C4wFsryFjJj5bz$T@UxS zVS2kQCMN?04EjOb%KE@!WDoVq+j>IDNg$?6$3c!{D@g-tLH+wb%{fXEDJd!a0HS|k zXC>M9*xn_GF__XY&kXeG{TKueudpyX)1@{OQr|0t93DN(%{PaG#p9I_T{il_FntrP zcn1u+I4ud1cjEUv)7$fo3YmH1JchJ)Qvw?AjzC(5gZA39$W@Q~`-FU0x|UUrxdDA` zKsG993uP2he1dlv)c$;E+4}AZhc*YiJqK7&He`ya?XV$@#x-L7cgd9x^-C@oyd#U*bA2g z2JplxVq{yBC-S|JYJjT4JzNeO!C03%T<#ue{>HG)gS)H@r%d0cb}AT*tEuQkdTk`< zK1u5Mo!WPPH4fS@k?Px7<7pr#u5seS%JkOGWpe?`aG&KB+{$LwFihMkL}YZVxn$KS zbl+4)j7l)Tnkoxi{cAHA*#&&13Ru(lLyqso%WWI}=7c}g*4u8@Xk1W}Pp-+i8$J#u zM{84T$oKiuy=SO@BuJf~i}7Jq9RXokJK&bf=XCJ&CCDg|2gsU?Dhn@UIC*@ZAl{8(M}s45AShH`Y9W_&!F5JKce%C3QdtPNh(7)0ApLw>s4} zm^T)0{?f!^tv^x-ZP6P2dM1iY@^F#V{PywNe59?HTA&s3ORQ50I7Ga>dLY{wd4|g zs*8zE!Xtn)Sa6ObQr`F$^)d|9C6{;3_==U@g^OosyG))=AbNsLE z2D-q;#>l3@g{2UXML(_%i`{`fe(#&GvaprP$#ZTWIkWE`F)P)&QS8t4-qPv!SP(hV z_#Vc1UINwP$3XAMS>;b{?2aR7%bdd6)tWW=>LnOAC$J!wFbdj?HC zfy&mT!a$O2H_Sfykg?A_7OmbB>DZ`UI6{Py1V%y}?(%gYS8SVIbNFG{>@G3pBFfun>Z7PedtV2HsuLTEdZ%#mMb zP1kS>8}acW?JUWYu|CDEv4T!XXSYCo?guE z4cKanUvFcr%t^2`yG4K1% zZ{LROuYNpSw#JN?#O;wcsap5L2X&jd-YXR>fO)F%nJgrzj)tCh=fmnTjWT-}@HI$t zPfuCW8fSbWrEDcwOBC01Goxr1VrOJ7;Xu{1omQ?WPzRWsOctRxdr{(+e<3w^Cl@BEN}?Y&$Ks zl9-}cH1RgP!LJtu(@^!r4`rZFyOEgo&3b!h1A5cY99@(l+K=@^m;F_uXk$OY{Vh6H zx8wvlcE)_RIfJYunwr2QaV{J8^Wr56wFb_JOJJqQzexMAsnynwcWs~(_hFTG#K%MNstyeE-X3e4&tu6yMKE~gp zZg57Nem(LyNfLnIP$)DK8W^;<$_u~}V&XXgVG2;$08IE2*}Sca!6&F^!-0K}i*}c; z%|SS2gC5^yYM~&O>D>9=JUmPEC3Ivm&o$^en9dKmKY>V`B4``fz<@(TYO1$~xjzTR zMq|L^;j+Hs6Q)SO@8cKl>#JPsJtZjTjt6vA-APuJ_;jqvl+HXLi(@SzzIF6Wit3;}(q)$B}W{G9l*jK3yzxid7`JSW<$TOm&41fZz&aelMoB&HOrR!0H7Nf<(h7yCq3>UR zhrzm&q2p+|xg%#LXkDz$nwO>i!>yNA1FGE554=y3Afuv1vltMLP3{-I1kH z(4!SyDIY`?gPdW`Rml@u{5BMoC$(HoPH@m=R2CLrfE=>K(H`A91rDT0Vf6RLp^Y35 z0EG%S&Wgcppy)=s7-syMf&W-`jBsXAKl_`UuBQ;?8mmnDM!?JTb)t7UJaM^A&*$>K zCk9f?cB`@CzBhL3B$~;V%kBHnO_{qW$x=tewcy}x+t;9zWUZj&j(BGv214jA4*tpJ6V8KT*33x>*?n zWw#VrY$(zA-D1z1^lM64-pWd<%Q z8aq#lO8=|Fgu{=Yn8WP%wy}aa&G48?5Lr$4939Q16pKX&*w+iw)wvBy|9nQ-NL=>g z{{d$}n7sD_hANk z11@I9NMvm_&&wMkvXvu&VgWy|)WXrqz|`4<9JC}2B|eO=3wYTLG}*vo_Ly0kHCAnB zQF=>5mJnFQbm8DsPL84X;8T zeEkm_Ci_DS{o^RdL}c7g zQ94`B2Vj{8)SP0Hg(=I$Q6&go&l5o-otHb0uuTq-dgAf|Od}-A17vxLEJ~D{fmDHV zyb(YoBrQfW4a-)q%`oMa0S>CTXuo(Nc@#bT-LX!enP!QqULnid7X^<_24^yP>95IN zr;>1|f0VcvOa(${)J}3!6R9Rv0)ED*Zd?%{Rh&Iy?Jy^B=>FXKq~DIi^}Epp z^hk0HLgNAw8l&wpHfn;6#YPbR@JdN3F<`T~_VP`n`YW*s7#&K;?V606m&tf$Sy`_t zb#`cb?Gpc+f1A0qKh7{-d$Ukx);k++-_kifEM@D!(I>KW;MZF;9U!LeO6l8I8h7lD z2!I<+8-ryf&6B-HK_S5U8P8n&#)IygGYUad=g3;mC6I}3RU6W|N7dH5^oy%%qLC~Q zh*~1GfGn&j4v_>RlwxvOR=4PxEGqGS=}XOuf9>%2H}7vJ9Dnrq(Z|&-l^L7eGJSFP z!uQF7f$Q3B>TT)iWW6E>cZg+1m zrkb(^U||OxGdf&0qtyhVozY}5+FTAJeIa$fiZNll^bnDORo9Jx$M|pcb)$1xJ9yQ< zMqEdl4*JtzQ<`zFRU=vy*T!g6HIlX{F)g?kqXrC%FG32Z;m_5n>QTpGCP4{+T?wd_ zK_xH-ETG<02MS`wVinnvkVRg$gVxkE!cDkjElYIAMXLsde6FEDtLhUUX&Fu&eo}Ha z4D9N7^E>3;%)z~XNEB@5^Lvk}Ggd{m)e-df+W9UTXsnE+1{wM;&Z7f(-e zM<={ZyZb|-{@qR9T@_7x$Z4~RbIzq^*a?_3V!Y2$Sumc?g7LB_EkW{?E0O$07w*JW z5xip&!CQHt1*`JVx{QYz1aDa%!3Q2aoI&t^K7Qm;)%!iS=+{)NmrAPosew9o8t|nW z;I1yYs|>xFE8#-0r{Pp{0=i|7`&&8+A7Rr$S|uRnY?kU_Wp zvqzSB_9u_1o?Q)BhT<6uWv73jhB8KsS={LeM$=E`mu!G4!+bQU+dxLkY*Z=IXX-VG zYNqQoELx?8Vk%liC9~X%utXID2S#^e>f+!B^b##>swW8TgN0|(wsZty^Ca-1jrs?z zUW3HqO(Yh_b&FEu2jI?RkgT=`eF)ClC0V$vRKrlK)pRvjS1i)N(EK;wetAO8(Aqdm zsD^VslA|xd#jMrFTZ0hM&ql&gYcL6)S&J3$C0VSnMR{vDl3uLHz9OM~HHI;{xI#8- zD6PW1g>oIQc*;=-g1GxZs3YF4a{2BDf2PblJL1zXTeR50h{e4ou~58kG&Ir~2o4_` zdFohr=OYsnk4(le@ar&Dn4MFjW7Fc6Lp#R);0Cc_-{TV#=kIC!N5P}Fg~B#p)a{S@ zMBe+v-A((3!=cRsKEY$;z0&4pzvL|~vb7G3$C?fd$HLu1)FR%ez)yy72TUcUnrgBW zLiK5875LjDS%^QqgD{ZZK?tAai1>?FMf|JnBP?UG;Yk|tpCtkVP#?<)u9$tDvArld zN0S%MYKWgE>*=W^5v7HH^>>8TeA#oCAVR|VoCbRy0y!ssh{(B@EO=<)ak6*a2nSPdOB$(xW z^gWDg5fZAd=@}e%3;53l72>qGXL0VizTitFw-9$I*UByE-7n8cn;B;Ch7xD1v&8t}zZ;#-7N^sY zdM!QNA?6|{rjIb}yeoqakJrvTy)Yt_i^aN21|rM2p9{wy#Qb-9{Ft7R`6%vv#4Qk% zk_V$#%oXZ7!5ww+G5f#&E!Lz#2T21GqiAAq}eILi#FpQL_b zaF>kP$|SCUew+S|$-=u_#?&+Pu+in>xq?({N>cC9yHk%C(|f<$!6!ArxZUu-G~0;_ z(#q(sh4ZnRxRtJKFD)8!l!w@_*HV$(-(CQ=+&_d zgFSd1#*(#$pjV?4MXz7JhG4sLr9hQY&Em2IyBc+~W-qFV(>gc2($WY3`81a&lk7J2Sa`k0dA5mOt3ZmMD_NSUs zcV8;5YEl(WDSSC_Twk3~_vFQ!HDjFKH@~>`rz~?5%fT!Cl~Q|GW%GSc?;*+So$cj4 zy}do=AM>6&#b;@ujp8n_87U>fO`uwjneI#{l!YU~x8hs3x zWi!NMV6fehVQ7(4T;6=`%FyR8ilp&=`H*~Cc9wIEyA)7 z)nk#p{4KlMz1_XN-QMSp=VuZ-uK$1&7-!u0fk@toPl?ERL zlKi3QiXrumO&xpp>>%0W{}4T|`z7-};4^itB`+7Pw9I1hwNp>(5lP*l;h5(M-oPoK(~5x#g7)?VIYmW83GtrCy7HFLZH-?&{k)G}H` z?4ClskrD0T*v*2=E}G%OqhiM+snhgM&<)HhfQ3YVf+>aN*#wSc6Rtgta3m9o+X$Np z!*z$#H$9)+p4~i(ruKdsW!>ygsUB*Kf(UaisP^!2OLO^J51%cP+;dr}1h!XlN;`PC z+=$Y^&!eO31>Fd_2n1KN~L} zJ~uPOku1vrQ}5XBU?z*bwKJ2%4(=ZBG5xXH2WM#J{IIGUW1r6F=mFc@O1(fO`@xpY zTKe0~K_#l2Pe$8O7orJ(EoAdyDem^p$9tu=yx`mpU4MQ-P_Bs1?O>@=Ant|;>5QZ& z8^7g>NK({erHqJczIswMs>ilSdQKijQLVPjC##2vIjRD6`y3E`SPx#ack3-kVbLOY zC**2g4q_c~Kd@kPFWlZ?N!E7{!vioJG+9>7WHq3Z((t2gY1NBe5F;R1UJ(@aUyF9cJ1!#-@nDnvh=x7D0Rea({=71 z-x2F+%VRyHFyB9LWXI^q>8Zw^HUleix4|uE!;V%)Fg+P!o{oj0jWch3bxE~;-NeaZ zSIiZPg<5{UjqmM^@9YumPQLTV&c@!6-f?n~*t?_C-2TN@t$zV^0x(b)m7s2*{)9>v zp?+;K%*zo;X~FgDenS6x<9t$2_N(h@pm=^nuIEVC4{yPI(%Xq&cmwc-D?+;4)a!9u zavo5((=y8oQVqg(FTi$EY}695@ZX}U0 zSR40Ol0{WFiD-p5p4n}MYA!2Rz*FoOf|$^si)YJsjvnTQycPcPA&#r%Lfla7_dAa7 z9p*xo7zbbY{oY}Yi*wc7VC+ce$-RT{NZo6Jp7D76_U=HS`}TNzyeIIJkYy5s7smjwa$o>0{c+h~?m$qGC)tYSj~-0(zVt zH;HQX!~ksuiGGWg@Dr<(JgNUH6rwkg&%)GzQ7sKxc!n7!r9svOf2cMz31Uma))(Mp z5^gZ>@G1c5Q$J;6VABSuNnFoXZI?dVc7fYhI^j+y+3(ZYh%xh>#6jI;oS)U-gwDwg z(4qaI+gwRJWv57tAYD7zu&m%<5WNZ$NG6wzL{c^DCmAeZ#lhK7n_t z`PpKhu#v2Nly<_S`s!OIwDryGebw1zdYOP%pKDJ?z1b@vwOWl|oIFPh&9oLi`_1%l zU!P!$PMn?C{rFuF4U5ICCediy81Ijb9(LUDm4j19dy4zFhN5?Vb=U64r)uE|M+ZK! zA>Id16!$-LaO!__JDzv+9G#2~`@)@$?xT0chP~lV=8?&hl6NrNG;>=+Vrbkihr_@M@Rlzz`?idI&1xb zK9JeonZqvT?(JDwd>u9Q=?D5C$c`1F<6Ee2sJ&I@97L1Jrq($xIiDNuDa1YG!|Z&r zhd8mGe(;H*268t9cN;=@w;_hIwF4(GXH&bt**N7Em_r9YpX|5=9c0H%Ad!)X+`(ZG zJ7-ke!`%wcly!j66gqOeM1&f8Ed1XXZDmz~2z8StMtm*q)wE;lC_U>fuc%zH)!bea zPj^ySdmUW^tNy9!*J#tZbF}Gir>Flm_3vLhm-_Iv>2o_Ce|u);?XU0H@pU{tzT-oN zy>wyd$WSmeBAD}CTVvs7ABP*eIA3!()>mpQ6h=Zpc;Lb%mU(08Z@d3~{0lShUKks@ z@a~LuywG2EW>)GM@`YUHkher?bh~eGyBj2@H)M8&d_&z*@{E?7)a_#?bDjij8Ku5X zB^}6-e3d)-q(CL#0>rG8=0fBqDXj<62UXGs)s8;;O_9i)i>I7G=9rol%Wr+@)1?I~ zo9rK%E4AE2tH$lw-k4B`H`5;Zlyo68k?NN`$yw@la3H`6S)Y(>>bbXSqPTB1FqDlcV;BNOdH@lDt8?{g~M7vtyCfJV}3UBsX_A;*u(Z^tIUz z+83f-gLk)=#5!jTv>*%#CB~VPp~29_#}lzw;_+*;7pW%Z;gG*`N3`ca*^f;Y&Q-*} z^Hzwy;Fl!78rK|S-(lu*jsq{tSJdKZ1#||W)#`1|z-iEG<#-FY3Uj6|5A;d5gLw^n zl@)wdAL+~{s3^}R&E;q&$Fq!oB^ln31x@TBQka8A!zEZ&YapW5vDsC^0wfp>5AAPh zxo;>8$JUnpL*aA7o4baGySi>>kEsnm?rGH;f3%SM!^5ci`@o_7n*BB91zUM5l?;;} zK4jJE>aFl!abXZ)7XBb0xo?zZ!j)QO5NNuN*C8YnP+RW8dLbiEehvlF&SE03S4Pgbr zoSQHv=_Xdh4S{Gfk4!ZW=T}XZc5oSsbtls8s<0ntrVcTl)tyYk-sOqHvYlTV@=J}e zu)$Qsbp=?~*FN5oxTCYOtn==Eg0@W|=HoCY7Pai?Yxj$rBu+5<#VySNU(=8jy?J0L z3U(iJd(5j0)+=wsJ($>P4du;`!L~G)r_L^q#1eVBJata_m*@QIobvr?hlmqV{Q2mi zJScZU9-LPA)xs)u4<;CXqQw{{)V6?gBH;o~NUue1UTm}HGENA*sV4S7OXGORoPXv+ zh!CC*8HL~5IdtkPGf(LD*{lvu81(r=B4^J(6RHn|f`Z$Al;1TxerzJGo3CoMts({b zxLByWvbHs=JhzBMjWE7r#`8j%@TlMTK3D1KQ;Tt(rhwV_g4w42{)bYNY$qF_!qko0 z`i3vPzTq<=NqkaXFtgMVA?Pw#K$hHtnbi)!_))_DQrv$-Qh!%p=TO(Kwd;q-ddJs~ z9(|mgkPklGKHA(g+8*Y~W$N*qp*7Y$u)3hwA9bYsTCH}&r%~N&WUp2`r8Zcx=FTUr zq```{m~0?Y(*8}#knpnr2JY=SJpk*5| zjYh&@?VuE8#*=0L_LnygO44AH*V}~0=5l5dKE2-Nn>J~8$=`b*)kJ?x#lgxqVP~N^ z14~)3@3J&kLe5B=A>(C4dvHa13n?Z8pla4w=t4JGVv&nU8n1<}MXwjD$t^e2SU3$@ z5Y4TPlS&+r{YR{37biH&T_Yn759ol`XwY{bzR|g{b7X9H9O6$mG9}HjRwZ# zGl|@j&v5h|TYC2hs$9C5H|WR7-d?B5KLTUSm*?_S=U~@5Ho{2a(TEBZW0qX(*63on z_iWDEP^dGs-|RE_+2_3le`=;f3#UN;emG>*S;8tl-VOM8AL(uFr-mrf))EaKdMI9+ zb7~%{3ac^a1l2>JK@!UG+mBz0tI~kE&yV}Rdx89fgxgxqM^?%zeC02$r(hs}n($w8X z4qz+&k;O&_Qttq8UG`P!>i|t{0D?Ap5d?GJ2Tbh5q<;^>zA88=N+>xHJ|^=$y=tGI)ue3o2I9UnpY!B|bL2xo()>~?0G2MD!zB!T{A46)7Z_NWV zumQhb4eQ*oI@ZCh+oPZ+w@2o-t4!^WB)5;^*W0%NCr7vA>1YRVav~cQ$)gr|9QZia zN{W<~4dZa!naE%zxzr-pT`yw#tSWUCoON+kKA&7w$F73O7MN?-HwM??byy>X{oW?1 zWDTxAH08|$u2xEO=98sCl432-Y!VUxiGYX6#WrQw_$^m!{6_ZFZ$d|7V-pF5%Z0O2 zvfS1LcxyIapxh+ICDb&tP4r??&&(Ft((9L5rT@ztzO}E{=Z#tH21oDAr2m+88@=&b zJ2>52i%X8g{*WGDxo*k@6p5_t^0g_`W7B$V!1V703QE3fx)tdD zTKbtyU<6=)!f*T;=Yt8Z*WQfo<&59O=pg@jbJ5ay)lm&A=atCJt5H&#mdy*-UmC7~ zUrTlrsytII_|+LViF*!(Cc#tm9iyk#=HSmi#yg5)V$r%B)Wa+V&SFO{8VjbTO!=Q& z$>O8_1DJ0I)rI?Wm(I5{Jzu#&QoL}e#g*AA+`Q5)DLtf$r4we|l~Ag%4MACJ;u_|! zB6-Xpsdi6A^yxh4H4woX?2x3^aLDDbnaq|x-o^(zC8;G^T>>`>xjw#VeR`OLj;87& zhm8|By9LfeHgYa}@^j`r)jz3pc^~K!qBc>j)LqLdQ@u!;pd>d%m2xn0F^I3)u*)@g z4bmbcjEkpW%i7VApww5BWZR~MT+ho=Vu|ozrOl?R6K{DTgh(%6;zh>2^nB8c}@f18~)yB1q=>CWz+ z$;qCc$^G6Er`PLrmal70p6eMM?diGo)*fd$d7k)0hN5zN0qdX#7*qGp${V9fiEf_I zM=8Yh`N&+=CNGkyN;f~pImjue+E2OivK)>mB^(x?BugsMg_gK+8Mq{$d=_cF^3$}q zTJO4;B|{wxV_;Gye?a#*=?y;493aP24C$nP2|I_E&@H^g!5JSjq`bZ)sNc zAh7qDFLW}(v(H|oiDUaWPL4CTX{iKpWt!o3ZtTJ5v|c_tz_(%D{@~TRCDvX;w?r)B zFUF;=io`W`O|-7SD(m)9JiHX9tl3sk|8^EcS?pVso@?)a(_F7{j`Rx9vhEz|fu(R| z?MYHguuAqEo3GB#mTQ<}>u2ESnpkGtNk6#;j9Gv3OCb!E?oGQx|2|p6=%DUip9_-nvvNKgo26)c-b1 z4L=%K+Aor!{t7;(v~dJij)S!Pu*@f&WWS~pc%ThwWsZOOkS;A%Azjvx#4M%xcv%Ze zpv_OJ4B ztlc!r8WfY=GxX9f#Th+zdxV2aS{9#u>qyEicn*SM-b?rG`>NKqcs*Pu>+>+GD32jtUhHA1wAACxPB`;p)7^0F+WJ~ruM(}T)A#b{R}a(HYmKSbuMwr8 z-JkyS1NL7)Zv`q0cE3sMR=xP9u8rvORQrywxkPP{Z{~>YRw_yW4q9^~4G0di5ukmY zPMIsA3xK^$OGW^GSL>bWTxvKG*`?bu;@NtQGzzL>EH%^D zLjdOKZ1A&m{(WoA|Ay7(-=D?*mh0pHns)zs3DLfWU$}09EC)myUBHGQUAAML!wR~{ zH%dwz4!vkc8qto7tVX9>vgov#1W}E>U^XH{iNv*2Y<<&l-DJDEJ-IFlURu+>uo@lT zCvJfz=`Ab&>JK)lettcSgZcDWQox&+7qPYpFBW*ihQsB6!}%~Q>YW% zryu0(C;M{~)Mo6wMYgjxVSiWcjZd`PMfOD`z?arX18*ZH`2gGHjC0 z&nw-?Jbd|#*F;{REq7waf+h?9H+q|^Drl+Rtk&MfV7i%BzwugiJ5?dQ*pJztiy0{& zomFw0&N%qFP(Q;WEB|=<`I9^NE^{952=xK$`cA)jeENlxBeq^Hmv_*O%+H1IpBXrI zM}lDuw$~m8uHp(hLqDB}THFJthw){RZPORVO7ygYua9!B!P7$r-+XkW?Z7u~cj+A; z(c)7Vkc}<-|LLi(BWqjsH2@YN{Z7HYiV#;dtk&_gX0?u|F|Ffi(p4VBblugvp04z& zYxF^VXPNU{uPtg$*V1&rf5UvD*EpY*UUH53(623XhU-m;-M=LCUoxM@)#uZ++I*Tb z{E@DeKWlouH752SYdN>8PH;td54ua{33gZ{c6fB1>dhHr8?n z!SV)|*yA)Y@TC+HY?$gYT^lK`Vtd!1$3L!NV%H_d@zrfAqxMn-zL!y(uzGE2H`OqS zmfVqL4OQW@YH3^5$Y*J*>RTb&>or=X|8=Q+uiJR_drQSTtM7OzMCDtlWJ$XF&|HzL z1hY9s5H9BVN)}(SQJH=-jbd;`BKUe5ETt_3UrSyn>T_w?-c0+AOb7X*m3_q_%B2sj z+eBUz-jD8i^4|SV-BbG>%!7VLYa^f4^Q)bDKBk;`35b-TmE*&^jl=r##icVWt+${GF~p}4AeILn3*}DH7a>x@~?ict7Xse-o2-T?cdxt`o#U6qz2d5 zIU0|ScKJiYAu-Vx96faY>sRhWsn)6eMRR@%65S3+>ucE^Mtj!kFsg#B4xn0x)?u_? z>oB@)tq!C8*kSZWvSFkDMs35!joOBd4s0}O4JWY2=&aeXv7R8_p3mB3bY+)S>t|~_ zdU9!VR_Xe?kh1gH{aimexTGm*Htk!0_FuoI?yiGtc6Z(OU+eCQlyAjsjhmOZ{I@lE zU70@oY;9lXmKGL&mM*ZmnWe?Z+4SE^?ZEwH8T#L}7X5D}^zQ@u_i6OsuF-#VE&6Xq z`i~I$Zy(X{AK=k09OPEuE1`~Dy|5Mg`Ytu zY%3cyUm084u6L0)mw-3J)Gq3K*}NGAmeis(@6QEHfyR0ZgcB{Kqwi`gnpRb`1*N&BB3;F!BpS2 z#C7uSDg_#!je$>N_#SEw1tD55Fk`fi;d`hl5-3iG@BC-rWr@(KM(z;9b3#XRsHnKe zV(08vdX_Sj)%YosdX5{Z+o-?G=4jXI+9o$k@@Q0v0lXXncsVY~;mcUkG22!jHUt$4 zI7&%M8yxC2#`dXdje^^4`6>t+Ot9i((1*@oY2UPC$OZroz&D1d`jW-yZN-CF73T%TH)0=9M# zuDaB#u4SI@me1n(TEkk|yxeC|YVi#&gZ!++xTS-jkBk=Id?TE7wI=>6K5+FCn9t@3 z_pB(2`Ap96LsBdQ{}zj7h|Sf%#x_x1)Xmg5_5V`IcErz(QKe5mFNY$@KGJifuO?6B zrRN8}UvBFV|vw$3A2yd<8m88a=MfOuL}&$X=_Jb)|plTfeX7E`C6k2id4 zdf#8AdtM*ff3KHw6sLP$-+lDerry_|TFz|dHKyh34>a6~ZLnA4^3aWa+gEFgeb4yL zyO*<^F39eajlHF@SNI6_%^xoZt7&y+LQFbNkrczRoajc5!y67q=3LcB@(pG;(4r znuG0pRyL#0ZsQ}}x2t>IVxV+$A00J@z1jhLR#ElTW~zfqRv-_GfCoht637x z6=K!~OGPfktPQN1Ep5E4n6zZ537hPeElFap(}aCxXq0KoZZuv)TlN!6VL-DTB)%(_mxq~wNWF} zr2e^O@yYtsSZrC(Of8Q|GPLNR`q!n!7NA9^N{dcyXZmK97P!gWv>9npd(E_1CuF!z z5&5$1a#3PfjYcxis1B&KjXJgtm70M{36)9-@JF?hJP=hvfGB&w zGYw%!P$dE|F`~9$x&gpt{SBRf9g&VVW0Ep}D@B$>JDROd%WP3aZZn?N^NOPw{E6v? z>(Rdz1;lC6E{A{DM(S^5pkHBzx)WKz?<$mjW)asd98Zhni7c$ge2UFIcWC>87wd-T ztokJ*)-NS_lJMlI#kwKgN>j6}%3*k^Dfx9)2l^$i!TI>q(kAo_bqYS3v@y9>AJa8g zFP&PdxCNO}EZMyL$^A87_$VdsG|H-7qO)q3j8~~$TB2gh1{GODh5ljL=$0wT z(n0DzeI3RqF81!(oUUD>SF2s(E@Q{P**ph_kySp4tgsoNhurw=1x&Gwh`yN_{gbP9 z`}t%`*7(`?v*nN)2c5_Fqc>39)D)GBqrSIb-zW?k~eW_vHHGHPq=vV z;fr@pUOe3O!pYO8zx?IXr%%%FOh0?1-6>3cu2=8i6H$xTm2h#kyg;GJ6?G13ONya} zFFo_-1ACu6+TDHh*}bPOT{;E-ut)mhyDx5_zL@D~AHuxJ=3Fp%m^W$F%_nQq??}mN zbl<;5qkHT}CnD;uO2`h&oGBD*?Lk`dxb`qYz zqSb6k3I=~7(`COiehpprSK>APy87;4SZZP&*WZR;_u&%U_ShO-`LpR1&!W@PHxcx% z_9lX@OWs5PRH{>{q?pdTGyjhZmqDmtmioOU*X`05wpYV!)f9Hmx8jUGV+ICt=JEkdIf{CMrxdf$bkvd)F&%ARUFYnh_?pKNmtRo`hN`1zyeeM{sj_ zKIUJ0EVF^aXtUbiR_1XH62#$e3`O3J5+B);DeQ_>)0zy}0e?j`{AIHjrR4$fT5fq| zC|%uUrn9QM9H9;@7$=Os_|xbhsqX4zH1=Qmr|2L8HM)}NbRWN`XU`T80NUv~v9D+M zmJNEW?y>>wavHcAjptuK?$H-p6L61VnMLN~UE1-RpAJog`u8+B+P;G)yPJgeGPTBn zyypS@fS*b%c0yYDric19-t^Fbh2|O%b6XT|IPn?Y_^=XPtn&_t2bMyKtGyC}y=Tdr zO#eIPi*L42yj375#n>J1`scf{JZ!ypUW_gC{a2Z=?rYhuK6}3H)Xi(ow_}a@b}r*@ zBhH$aW1or3YdZLKrvLO>p8Q(Ku+nksG0`ZN+Z5UkCT=B=j*P(yRObi@UnmHjX2Fdpt^{DAD}0^+VAyB{MQjomk$9 zk{MZ++*q!|DnTWqt|7=u0tAW?$M8ei7(rSXieU(jktjuj*b#y>Mg3$L?j6InX&>7B zpfG{}{dtIk7RW$ojNCvtU@#SWlHeb}pVUc)J7cX2~wY|959=ZfONXLz+)pT=2B z!{Ik2wlhN|<`LsQo4%}di75DuW8gMy^-QoZISR3pvV8cpk4}01*HDme61C*#r~YyN zko>kR4=ucM;)T;E&Oe-y<<)aXR{r|ZtV2=g?AqT}-rILTEuMX1T1ihGJ6p_Jdzg0Q za2uEAz+3t?KYueaItH|ieyuc>Biyh-!Pko%R(JyYBdt8&lS9_td5rfTAr%#1?I?uI z{frnpjCl=f4za``3jWm++L74Y><^ncWclj_Z)*hJ4~9#@ZJ1bXL?cEDNuH-TM#g;j zw-Vb`n4zqPS!7tL`rNmBIO^<-Ur=}O7R$@G+y0Jg9 zfz#m>>*iRcZ$TffNGYt#CCtqPZ2voO`;SHFLE<*Jm-i;hdqWAyi5|=b7$_7>ZwI9i zR1q#W+NGay-*hY2H{L_vEq?X4@;xO;-|KF|W_AW-w$Z!4y3zP^i1#W7z3X@Mdp}Qh zE3cwye)+h=?>(j@*jX6!2zVA8;U?sl0%&$oKG1=H6oi3}iSwWFs73WCP*)z4kNJku zdL*7!GU=0%xKf1GYjaGEN0iE^3B3>6cnaFMV71|OXv1IEMm}mks-lgj@VB3i^jl3S zMTLbDdOYH5tNb^nVjGWqz0A%?x1fzAVX-RJ79!AsueOEmrUvqlh~CRj_;&0Vjl_?N z-*2znh>gS}0*_xw$p0ZZ=m|k>8NIp?#u(7*^+#F!<*oK}Vs3>ENU0;55XCCZs!X|S zmmPr~+BcqVR(G^P``B;Lzx-LX-vkrcQ`>KEL%&&lzhT8I`J?@!-_665avw3aXeoGu zA&fSRC_kfGmOr5}O-Z|PRE?xA2G;1-tg9Z)(siQR=LG877mf2iI}CWr-3F?CMwK@k zg}2#8m~@eyk(d7;n7|h;EMN;8*a;KZBdx%?x(Yh7&m@t7#_S)~=`_-eZPzq@OA%qN zCUOx1RbaJelH)FmV&mr(9>l^Iw(5L6Zil*@UO;b)((Cde!oD4lh~g6Gg;+rH!w7e1 z2>EZuB&vJiQ`}w9H?$^cKs;yY!!hc^AoT%BeEgc|h1~_y+eJn-es>tWAGl%Z5)ZBy z=j888>kdBSncPl5xqN#}K%SDcRoYTsIHoBMA1y_hM2oK0? z)=;jQoeyZ5nF(Jv2Q@H@458s?vdAH#l@vm=RM4sNY374iZKj};aR9f9#XP8fZ^7J# z0HU#On}#eu$ZKuJBvF)813E?MpzStEQ#}9`8My?`%3*b7MO9a0Y`F4^f4(@=7hMV^ zeWBe;r{*ue6J!@vwQ`7Eg4e~)_bxAu(L+zc5O$mgk>4$Rf9BZdvj?qdW_HsHn6{x*(Aw z3VRY=F9-cZmT>PFXbA6$8~i%LHHrxu9!k*2`Z?xX=vp~I94n<>5 zgmCRCkJ8^5qlEEM-p*NB5Em{zN_%n1j09og>ffmsgpN7LYK93E-N6AC7GXv~W+Nz8 zM9O8BL#r;S>`_%crsm)uyQSvh3Ez)@;!DJHD%_gx*t{jx9qX8eYwy&Es*b3YmsOQL zS$UaVRg;}puXZNYNdWmLTC~DWp6`D3C;pz~aw=Jna~$RT4$7IT%9#f_cUp29 z3603)brN-$i#kmE@!=p?k3LL{gedhe*^AMunFAffHD4=d%}h*kh8yX{8->06Mrj3| zz$Zymqe?9fyKNNuvXivz9ATQAZj@MzZQCNq`~%E=eE{dH(LFks+U&uV=pk@Y3-@a% zIjF-HelBawlJGNJ_?cOhcm{=^ouSld6n=&?R)X*oup!TASoXRLlL6pUQo}rUbJqmN z$jOCq=iNd#w`~?KI{W3DU@jQM`W=0~Y4fqV>e0o7Y81=$x(<5%A!g(uUnMB9POk?+ zuX_&E>eWo-5Nha9)|eyB7P)4NbEwWDYIcsObmmaAMM^kE%}$eMOVi&Ynw|mpzv&PL zgbYi-6IF9x6p3U~zop@9cj0C?JMQ&C7%K@>f2=FZ!Qi0C6IXd_wL zKx97_36VvR$dXtxLY9!n!#0W3+(pGTv=CV&mPJGgT=F9_gecgbM8Xe|FtO;vzvv@G zETsI9h>(cwyqCrzJ~*7YcjnH_JLiu2j`QHBngHtuv4s)!2kmAUj;y26c9Ae+=(Ap< zUCp7Fi0VArWCL*pxOx>iYa2s)4N-FxgW5r*Orup6a7|WGEAvRm5?UmPbBw#>2^!U5 zattC|H}wDwJmAm_IHAf?Ufy@0j%KxK7*TLrCZ->lQI8cTs2G!DVTs z9zCdMZL>azh_#MK7e$r800_1=*MHpalMPIJ&s%I8_$`ip3}&A z+Iu-&gRHJ#&Ow)YgBmrDi2pAu7!wz@>M7D{0K?XAoKzoioAqfki@5oPxZQ+C38CKC zeIEo~K+%g{--j}&iqb23@sj+RcxxtcYR8A(y`Yx;?588X7v-QA<_z~MQZG;UeGmwd zQ@#&QIjqgnbLyWbe<0pT2JU|!_M!ouoICD&Q4Y_GW$H@~w4g6AillcZ-NBx0rKS@= zAPVfVYNJQ*iReGz3pqt*-t%G?GC^M|>FFkt)*8B%;yby-zNkYt--k=jr`W?oUaeY0 z3z7Err5_2tAxF*v^1$!8u>BKZo*n)Ru@vI}0C?JCU|`UJ!YYOnjN6!&G0$TOVrgPI z!z#i$i}eSa7F!To1KSdI4t6K@Z5%cn^EfRycX58eGvB(Un2fS zLPsJ%VuHjai64@Bl9!}Hq>f3uNFS5YkvSu)AzLPUNlr^HOzx4qo%{|3GlfkGe-!sA zsVOxn9Z^{`&nPb`uLa&}-aCBqe0KQ!^7ZlEb@0reuiBGV%KBDY1ph?0u(iCPiO5*-&kE&5mVuNa${ zhM0y}qu5iiuj1n3Zp61Fm;eBALz!g&00031008O$egFjk000000ssL30ss~O00961 z_y7O^0C?J+lF3d2K@f)jan!hS@Zf<{AB<6>2u5S%MkGWN5*Li#Ojrh(I0`x-diCtV zr|}tF?j~M*1|Pw{YkFWHE{W+3{Z&`h-$iu+n862ZSi|E0ZukXkVS-k`Lx|zdu#FrZ z3=boYH^U?3Ps5{#TN8%IpsYE=$!}?ID|AbjP)O<$L zR)${?v-b_Zl1~GEw-L8JY@>lDZgB+{HPq39!UD=zl7YviB6_}94tE`M&EET$>&%_RVvYa3ghY#z3M=R zgRCRku5>nMvK0!XDybtiJ3I*@Jnm)M7xDrXp0vpo(Nm1COKbtV$aCN0G&s_ko^rlV zVVNi2bulIH->a_G(pnp=YZp z9ZN_J9`^=MYxM6iKmV_s6V_7dzD771C#Gjv?qxG!+P6;aB(~&tqdR$<($^|$*R#`- zUe;*&wEe!fy5xz=`}IqCU#7#YMR?k6&__&@aTv$(?*pZUviHWlSKqfS!`%X}dv9@} zKwCw?VpUvd+%p;zJ!xDQHSQUWdQjs=jU(#8vpXKtn~8<@@6G4($@3)7lP5nSXsbVd zYWQD$28obJBC!yK6&umSU?-M1;z=NpB$7!Xl{C`HAd@Vz$sw0K@+qJl?dd>AI?r5_G7bey{dp597 ztYTvq2iVFTK1ei&ILR-5@|&Za<{|ev!+aL7hbkUZ%>y3sj3+#$g-_x1Uh)*AdQ4r$}*ORQ(nPJnpnjeR&$LbG_#g;BrN2ES$t)dd_5N13U|p;WzBS2~p?t?J7 zWCw*^41y0ocV%K`23v+HQG++nsB$|%!=JwAFxWQi-43|)yJuIk5ivLqkm&C1+1dYp zMshMlN$dcPR=;)!GfA0^?omWX^}sT!V`A2rBMcAH3%1uCq{T`~J7>xZJ4T|q;GC23 z^Ehs>#k_2HWrvx5>#?Tu2i-JIYp=A`4J)y85UDWYxMm4=`<1cE5Z4)z5@k7kT zUtr5bC2w%kgXh~79Q7X@#T(Oji3#O}dUs+xr)`CeYY@}gqh5k)?cbh#_dXE>S+a0I zAY6<~`S=LKpa4kX5bvgckKvez%2Pnag`ffof{KeJf~bgyXhcu}(T$2Tu2kcWMolzo z5;K-7F=Lvfi5azNlBR9OYMcJ7jC zBSJ>Z2pHPSKg10`2VGDXcOGzeK_DCHfQAF(VZHfp&i}|05TsptQ9wim#9)i|G*kM^ z`=z(#Y}Yf(MP1IBA9a34ao}Qz@3_EghaHFMgKhbrf6s-4%m1?$y;bUHTZSAFZ#5OR z&OD#rx8H9bA~wkEnfA3JD*I5&KOvzkt=t2lXm#m?Y7GtmUmqUcwel};ma_-QDJ2Df z6w|&|u>%4jSC}Dp&d;o--|z94ez^R8F1_UUzAf9cE!(p_+g_I-A|Z$bk-R1$2qH2J zA~J{!gNTR>G9WUD$QHo=p}K!9Y-CHqpcAFk$HD0}y;k|9wJqzOHETAO$;+H65MO(1 zZ&R4vojY>wA%#y)mck;0dcP0~;}NEXJm??&`F0hw!&1Qci1w%FkODwmcDHDXGgk^$ zThv(eTIc}5IW|P(A=bBr*!eCX3I<8`@RALdP<2<6y3}e}>S%Kq#sZO{JzuWi z!idwyi#>M@0KL9IPx=xhEL$bsdV4Q~%3@jaSfoM;EJC%9+2Xu@l1Y;7GqCPC1tei>1$AL11-pbajGZPqCACx9 zsdLAU-8y$)I>I(~?fg%*qSdp#KfZ7Qs}-Qd3!s0MW%)}J%ViSB$&^}tmmemlQeoE= z3{GNx^eH+TY;5F}sC>uMnY9)8_+ z0M{DyKLmKR(ReSaqzteckl2Crfb_b(BlI~8azq)ztg9d^u0go&bC55FWkLATYmhg- zfq(*}O1?{Yqk~qxNXY~?w66c_Q^%gSHI=|7uNc7!W-m#whb1!6;^(0JwJvEW6kBlZ%+0=kj`;5a&r_iTqKcG28ciO0e=1G#wRk!(Jq3J?MOh*dZUdntG|YrtAWzIxQYs+rO=iNu z_w%Xku>>i~LGDJd9$u0@jN;G$)8o3Ni{-!u@PbV!25rooa(hM}Ph#*b8T!Ke*uLc65QGo(H5P}mx1O`Ch(0**;ek!NX)6~8!i9up#g-j=j+|h*a)-13 zcEW=vJOUyTe}SmzSRzH^iV-VLyaZA?a%t)0(<@_Eqsb;)jhM8@UdJps?u7FmdF-iY z5OW?wC}75KgMmz`fE)nW>bB!y)U{;tw;z*4l|7k%jnEYTEGTHK@CN6 zQT(9ShNj5V?}pROp2bGne)4iY1p}`pGIaMouZ>m`-Vgn5YsWwj-#td*Ytz&alsrIklU9blQj|BXjiU*yJp{ex2O^ZXTW2G97}3Nuu&sOLBsQYe zNE)kp)Gx7L4)-UuQ3h0A=1|0JRx&C!6bjuwlZ7ILs@TYi$(NTQ4$j8`jBV|#9VVpb z3zCzO1+We^h!R5c0qap?sJh=C=c?k(X#Zw#R%|1IG0>CP1cXXS5ni-*WMX%oB*OlG zB8EOg(0J%^6sF7kOfd+`K_Z`*X)*>iVWY_A!Yb_moj!7R7{ue|2RqxXGQb0;!iIE# z334AYhaGa)3kU=z{XZa7@~YL*2nx9|rb(LXOU}5@Dta1Z!=POvkJ3TA-_Ht@QWoxY zaqUW}Qi?=!Hsc)a>RB=Iw?-)Zy#GpBw!|{7j^22g|5*XbVAY>*~U&$%{!a1}LdU=p_$+Thv@JG7iqi3bZKLT-saClc)kA#0FK|3M+2=T_@z{3VY!WFB(<^%+WP0`0%7z%OaiW| z2n*4lErNzla%71xf8-er8bC%!$!k;kUv_Sugfk|lPRLk*wF`65Gua3?=+`F#P{!|* zATsrm;Wx$Nsz7_U0CkEF&cw5SZaHXQ zJG^=H*YPA~qe?aDXiXO0P>ol%@>LEChed$qV)41Vpe1DU33~Y$)i@dt0M0w|-sOX` z_k3~Euk;gn?1uHb%=wMcW<1 zjrAbv7zfjJOpk+u-Him5fCA6PKrP#{IqREW18OYv%+Dffz*VxuMt$q%#Z8WN1#aCdD-%1H- zi>C#QB_HPfWkdH)=|svNmkBTES?>bJrFwV0Dp&@nHYsR3B`S`_Yk?B_AFBSPMM*;} z#k_b*C!rU2%u~fETJMgrF<41o_JQ))`iNpJzRoCCE=A^9ZJ-lsTRDSN`s13yD||J3 zy>wWjvPPBk!e)G`4zP;^6$SsF1_WQO7@MjLG2e-o?tix?XJgzpppp`IwFSFI%bB%z z4o({ULReLQ;xEljw{}Hm@n2`?me6%OfPnT|R|YF*2MeeG6!Y}Hok4&E2?eaojJIZk zpwShfS|G9@6jZ@Ngu3DgG<4>TFogN#3&+F~fsG?llxVInocJR(!T1DZ5&^6vVk$g| z#gR!OAq_a?2dg^DrGMbiM7`xrZ38p{Xg9DetZC}lAkY!2AkRP(iYfZ_K!Di@9Dfw9 z46%eS9t`vg-k@Jk2zXWoA{U1%h>9=Df|{w+o&(zz12!~Xp%_-dF9hkWNHUHV+_&)y zMHe7DMu9W-Y=tj8DSreU#EUZUwFDW2$r;lzfpt1CBlJrd3<<-9gD@!JfCXYL!cJoD zun?oU5=-W`5;l@U?m$@PeOdj$)kkP8gbgZSwK&V0I*um@z=VP6l`+dDfqggw;sQ3% z&lv&FVlZqJCNZCW?wVxmr(X{Qn8ktE5aSAR<_={+B~eTdV49%Xie4Bnx^%$ zmD^;8bW;`;JK>xb7hKorf#-%+ucwZC;VTo~qIJ?Y!&4Ale6jCW|4bkjkdmU^+W*>y z%DejbT38N_+<)^5NXB5Mt=oL#o9IBEDV=7xB+u<@I*+j*uvanCGpcPSX42dBgf$ye z5zuRMf5BhR+>~u8%mNV%_i&Q7>O;GAy%`Ma6*Mra8|CEnwupMVtu-y7Fb#673L`O* zU~p3fgyE#jY)p=#qgx?{&W)PRZl@2lIBoQFjpInRvpeTK%mr=N0f>32sUkdcXoU67 zQC=yD2JVFDw=EB$IG$!|(h5VHLC~$jI53JUW3$gEfg(=_t!xV&fm>jkA&7Pa)LfWG z__R7VslNL_t5L4$R>mMK<4jBLs;2?tBKexk0c2HDN*0ijVX*ABT%-$M>u|8+jcS|X z$Up8WQi}}<^eeuNJn4*ZHd`-rA7lp45Tw)Ad-ZL7(=8GHd&3E2e{cL!1pM_P!2 zei}!uaI8{U#|4V!$nABUP*JI-{}Ozn19?2#Qg!IOv{WF%r7{TXJKEx}t+#ylKjHhm z*=@b=gYW;uyWa7BxaV!~xlypDG^0hf{>G{MOg{6cXLV8f3^_b&8S8g-x`jJGvt3ARjji&*X|176g7awcv)%#!mAa6?PIn@Vpb8aV%$ ztthzh+>>YjQEzp%nP?DrS6KyvRbw8MgKx~tzZH>qiexQ37lW=Zl}(BMlaTU)zq<=y z;aI^?mfVs1knvgu4~{xn@nk?sNluD^3(1)+_KrsrTGhKmArb%kGP{0S{K;C^_Mn77vmFcM|f6f2le&d`QcVh zHI@EsztgcmIYhz&4-vXJufA8zjNxs z@tJvVva>lrQEE{YX&l{DRDOUwa^r+*rIEJx6z<)=tJO8X^nv#@s@2^8jYj377@`Y@ zZKVGC{Y0s}TD7MSElysvhoGeaX?Z~`vbp=TfPOm#Y2z9ry;rt2ag8G72+<9hgf@Et zH;)P;tuE(%glXIv*e^1Uuk=QU`nFVD+-DjrMp@!(wr@uX7%}!kV-+O6BseZM;ak0Y zYKeFl&wyDcggmo|3|hU+aQ;kCKS4j4A>Z@)D^Y8iSz}Ftk8{zafP64SzRz+{qsS+@ zs#RKyyLgWlP%0idE-ck&E22yZOX0|IyAh&3+f<~LB5SMbfGd$keX9Xi6cLX>!Fggp z#O|b!y$zBOjl!97Q>rvb5c$Q&q^J?> zo&pg6;h4D=hycMEP<|@Wqr`mP7dglsi-F+8cMVW2K&X7h%o=s*wbc%L9I@n_D^}fm zJXGNnD?p=_*xK5`&%<L~aDcRtMIC6vZr_x$dPw#t zqDW*b)~MGGN1U??;x{ZwfM6jY*mD5XA|BQtBcqT<0-7syoi*x3{(WVKj6*C-k$T<6 z9dZVQ)D){G)P|&fji&qG7PbOJ5Xod<(Pf(hAl`;s8Cz=1>;HveTh421e2gP?j{(iR0GN59Rql< zq)bo}V9Tu*Zi#?H27Qa8#w1i>m~5lGCdBQXS2_s-%&7^IXaj;1&k8-HM^5Udya6R~ zp!w#I1f;o~mlq4k4_WZYW&U2=pah@@6*hADu+O3NBc)^F6mUgN4_0*^jR;X@+H!1%h&1Px0+hO(Hwj`({6Xm_~ZwXpZH0PRr>zW9O}|1^0vI|9`TM%r=re zmGR<4y5lI0(LBQP>i_=}oL`TXtJ%l*`u**L7b`E`ciFOYmK@e8^6SCVZ_uyR?VDvN z3c&Mc<3%+K{%-}4%g|QVK_ekmCeG$G%khFJ$%?A!hH2T3>-j;m6-IG8>7?CWKg)|j zsTfXVR5UjxHZDGa#}^1iiQ*)QG+CCCnkG+IWGFLLS?cVZ4Y`^;tuDU+eCg>M7~8Si zIri^6aOmLS+4;GJ#bZa8j-Nbz>dd*b7nd(x1~qStC7(C$HJ81rF9p4SfLdV3uT=ag z*!vS4`FoST5&-u7@#2I^l(hs@J=~r!BI<&JMX0nzPRk7tA85rt99OKN9+Kx0w%?~q#w&NbuTXJ})_w{)O zgrckdDFw}@KGv|gQWFgWZ>0SK^mFg11hvaj6~I@L!Em;_$8NuOF0E!`e0Gu8C@U=6 zpe&!mIR@JZ(MY$fbdelK6m>LKq)R)Ow#CZoa(0$RP^GGi?c$sy_phkV>Gz8gir9i# zsa0d2e3))XO>fYpOl^4VGKS^x2M^Q?JEQ_=f-b|r>|mO|JQiG2#rBP{!NKqE95Xvh z)%hfMIz$1qwqhqg3{VG{Cs^Xyc_9u6ck0r|ev6f03yTkB!0!JW&uS*Gs;j4@+j>5} zyQ&a+1T{m=Z?<}UMh&chBZIUbY*6FY)@1>t0$#v@D)eO*GxiVxZTi;3#5oA;jv+m| zjpgNdVkqu-3g}}vOdjd|C#(}9`i986$2%YjJVy2RlTH>uZTEE6hV~ExrTTN>Due&;e^?cls<(+nggD<4tM|rjZ=%cUz_=Y z;Ru571ON|gkYD;f_?)w9I)xufTwt#P(2B*x(=-KdX)b=Id1kL`dzzr>fXkSGo7kgh z6Wt*f0ib~x%p*$+xHw{a)s4(v$MFhK1OS}AJ{D#G+(@N{g*?GcQ#^0A@KKu#K$>#7 zEBKuIrJr4`tOIJms*#yh?HRWf=ooeGP3X*(I)>L$H0~XA z^~)3hf-Xt+xS6GUELG)9e4TMj#&DVb>}usUz<}Ff$jm*Xe26(BCb(GlMS#HfGE*{Y zS)68p1r}QBYau7e3HPS!%+_?cfOP<9bCpJj&Cy#AyZKjL2z{AMb1yXEqPlq`2($Js z)yk|9!U&Q`;iDWBP-fU}LTvNQC^wpN+<5NGc9?WoV`|@PCPeCB3H zRO}o-4MWH%7Uvyd#9N$ULoaohVSqAMU4$8}WQYew{FzyU3SzT98p4Wl z#y$b~C?EsZRFnt72hLZZhXJAHw8eg-U|InHAuN{+ESe<|S4@9`_joD~*C_ZMyx~0% zw_C>6cJJv0T~cxv?qM;&XVk#aq?}_>E?P4?YL)vbP9v!d8&2{JabSn3IN{P^=!EVF z*k+_|)AFLi>(DG_<`7#w@tcoJZth~_xt?Ww8#PO6E`ky)X_%(J+8fjt50TuNF9+e) z7l$5*Gnh%ca)qaCsne#?q;P&&Pbv9_I=Y;xxdt{eBA0I{?B+RCM3&SiT|EaGvxFlgMJ52!3R@A@yb=9A-9D|Hb@=8S=)2|8J_Ejo1^g6%~)sBTE z>z!)PlAMvP3bZNBb1BYsS@i{I5u(lTL7Anzdxh&P&)}btJEftjfmg&8>wEXm%%%zs zS#EABqI1d90wkF!<)m2Uf@nqxHeB?>kB1M_0a=sy(+O;2&u+TU8hD}QQLrMJ(uJRn zkZlR#jlz$|MV~MG!D}dL0asd5;&}{N4i+<34Mz{PU|z)Da>}-U@=L8$*Dp@{BM6M$ z0qv=%@@P$%niOwF@ZIH=S}8O@JQ?c;2{Vg7*KlcfJ)~Z)y$Th&$W1H$f-!t1jy!Oq7kVR-5GOeVaDJmc~ItMHtRZHfWo^@CRuT)qX}745E^WZbsXqHE{#6z*zp&mRRMW6cmZjOQ>N*53-J|Zt z9MZ=dGtGp!%zy)xcub?3#0^SGT0}r|&@%3XRE!#VZ>X#_ zslO|tt~Yq()CeRn{)s=>%u>!tWW}eZe-ikNY#@ZNSD|v(x`jNa)%9Vf8yl&$Qj7)> ze8X$H4u}%oG%g9KZV+Z~OD%{swXtgz2Ey@lQ+h51ur>nGgB>!NTs)n#9wc8l!<{18J!z497_|uQtRk zKw6J21To{zcURXpepQk>PP3%SuK`roG-qN+WrQJG;6imhFd##s;=);qFDMXQNkGCU zyWjHta!1Fl^PNj9}lz zn+RA>*U2sDW6Gfkv!*s$KI&u~qH?G*imzM{N7s%jesqd&nqC}K%CyIneVYk;V zVh3yt8!r)p5T8m~!=5qFf@&P4II0Bg0?ZVS*4wv-S1aoLI9{&`#onXEE#%~$A+%zg ztvsL)(IX*ONh;-siQXaIc@!4}zu}Z;s#=)RM51ya-fH zNTut1N@6t}x3k6!Hc{g@?kl&Ki=F{^Y9_g5IXgCP3IX=;d2+9xp9IwlA^wA z9(L_fkovu;4YZuO@oJ|#UpyxEIzv)rnb;lL0D$DI2i`!twqiNq)CDp+0D19@W?P&= zV3j5JoROJNhtB>TpRsW6?kqHmIoTysHi*EplEsM|^cEWVdzJ2!)IkxCrEpWd6XL8? z3`@L|L&IMjWRpeS0MFWVYt&ez14DcYKZRyUI?9&Vzwt729-B8i z2uXggp=g|gin>2QM#kZe{%~${FF3gS@_UP-KxWK;6F(>bu$@-mOS9skVz%zN2EM*r z`LyrJ#{Hc0Y%_h2pYrahmJ{7;8erlXXJmqe;VN}a`$;w+%C7`eDYsS`K!7wbIEpRF z?Wwn58p5MXZUfpH5B-7S~Ds*(l+r-2-)k@J~{N1s5kuvaaJqZ zSD8#2rd?NSErzzS2aw$x8CZ`DX(BV&+FWAr0SZqVp1y;37h(w`yX7LN?2BRb->sK* zy2qpQu}k$%IC~O_L)kNPGiCv$VWZ1zvjl{&PjY&Ri*+z0A8Y!`$e3!$#eN`L;WGfH zp-hk-1b#4vE!oV>RkN$qC2wE7nlw{0H2k0w2$8U;JKSlz@ZQ4huCx{-1hPp!til6x z_i{0HNo>g6cpNFb+<$|(aO_RcF5w>rI>NOw8(m#;?F)w)pd-B0xn4K3@74a+7?9xD zEPd{uuc*#swZisjw#*I!h`cs}ie}!2&j4G(W{dHn96P;klW})bX?;zZj97oQkcW%-!Kn{3KzEe6%ZdpVhfepz!CDkYeGPCeU zQ*oFXuYMPp(KYYQn>Yi*?adWeJbK4YZ{H?lHqg>=f?*so2pvEN&d7;7ifNwFK#6K{ z6N{!1&&Wq5m5Y56IMD$zJp7`lBm@pi_KfdQy{y&U0(^<@m1$D*A^`p_ZITBY`A9#crUC z1P)Lmp&BTFo-uKbd!tQfIMjzcRkF;9W+wq2I8AY7*HSk0WVYRP0!bx^kDfG^o|O6u zkRhrneMELJYkiB89%lmIs#SXl;=%rjqzI;+O-_Uxj>PF~xssk8l zy3wSrips%)2O}P>*do#}9}Vlbdz5Vs`|)y=dH^Y{Q7KN<)z$>4t;liWcr(!x&5TUF z#ZRou!ti5c4hN_v}xVNM|yV~3A14Y_BH($_|DR_jhOtvhk2e7&xO8Kog( ztvIXt*t0&S2tX4lNK3Dlxj~O1mfRi$%>_yu$lw+{-L3s=%FKoFDk5X#n@BRdC_!fd zHVrZgo>vVImPQY^1FbC^T)&Q|9c3JfTWhMlLeLzom1Hr+sr^4uq>VMBVBY5vmV2B#Qr!vGho zQoPk~hWIJpO5eHo072|KoG<)5#aj?RN2>Cj+UWlr4jLPlx0eqC_%2I*2X=-9-UoOa z@IyksTQ+vq)ynUU=U>K?@EY!+33rF7zLg$EDSqwuL->(HMwH*zo}s}z+#l#uFt|MI z!Bl(vDK%lIT{GQYT)fBQ65thoDyxqDY&Jt`ikS(k_Of{I zl^SyyjVYP@p~ljAk;%3@E6Suc#Qp-unN*9B*SLo6@(P5B=;pD#BO^uiI3gu55PxQk z?jF6Xb}PYKefBXbhMkZY@yRP<8a$3g#V%u6?hwDyeB6jpJf%cZW>G|x4}=G(uDvP> zAL5S-^dKb3jqN^ook2I@r)55FgeYF-c_f+`@C)4(F4?=54TA}~AP zxVjp%BJpv?K;a^@qd+=zRm*0jriUBc8R2+|w4;6mYL&1Fl@HCFEYKF%-hIfZd2)z*u>Pt{yij3$VYC6af~U-!Cqo+;*GnR+bS^V9$@fFop zs@Cy@yWFM!V9khZ-=<5Z_Xxqqw9FXMp=sH-Bx$^UC;r{({kFqtrb0Xjs9d!Cg+;&`1TRopxT^BR6 zLEu(G*GV>LKbWn7o#A9(Py>T3rJ8}>)WTBs#GMXf~#?OfZ>WtT@M zxkss$|K9A80b7*41OpsDZi#>j7Qh>!69)f{UlL@fE!;!H{Fa5+oiI0u>I2jgra3v8 zS*4b4kti+K@6i8zijyaZoreMLGrqJRLMEwz(dfOQ^fGU-MRCGhtvKF2e~DLCbRlZc zq#EhZeH?=?3eJg89HNKV=0g$u+gm(PcTc zVv3_zs#Gn^w6u*(m5N>&ceie8T1%l3S?8H^HNPj%Zzo#DtB-nU-JZLls9a*##0(7Z zl@rCL<9RVMPR6t*Lp<76z8G&R@}BP~Pa4h8sHdfzTyE)!;%wP;ujQh^T)iylvm{Sn zRkP^XN}h!*5!aEGJi0o9WfLoT_2fi}W#OKzpasii(MI3c7?W>PJBhY1k23ki#1#2C zMR*;k{T~%8jtzF4mzFeKl6G|@9V=#$io*(`a=I*4R}+jc?F@8P*Jg{?Zs+4_nEyVW_i82y13fCn0pDN?)xBxF@u)c zW70aqEVrddG?bCaX;kLvKCnP zH6 z-#Has;Z8IboVIVqBh~p(POSYc>*Pe^@q{eOY;?@S%P7){t+)*^-4pY}T$Ox`d&#e9 z;6LT+{=R6vg?m37xeJ8Oaki2-bukRB|>=A3k}tMM^9j1N*bQU}L< z5*@1T8*Fh?s0dvN=7UmpMq7{|;!UH~qzb6#F#3GQZ#C`L|VlL@Rjowpko_d(qJIJ4bgt{IAj(vh|P^Wf>>Cdcuik?O0?tz-r%jcQGo-lPPU4Mdu zcCla!74moY4nEAA+I%l#+nC~(iZu5R+8@fMht+qW4k&jpsaZyKcYNrcto?sf-7Z=LQDy0oA#<8iU@T5=iczR-!e)ja?1)#X;u-=nGPlr; z+PFa|51G5u%%Fm}F{AD?P-eyur6f0Iv@ANvo}m-|!dEt?+}*zYX~w|V6ZO!z^mYRU zAhRg^lW=&gP^Ke@!SRAm1cWsDe?qFnj$%oD6AxmiT#Nm8jxw}qB1>@ksfp!<2iHo| z0bJS#E3Xq=>KeG7ys7o7q^DUtll3&g=YGF6h>64dR2h?DBkpcflrzb(`lI>2{e=C14_J# z9#Z#z^J8_(Bwksssbk-+Epls75*CJPWVeR4-Ro~tRWiIS`4&_Yw-s6QI$?PHu8PzV z8XA|~I^U>ZRUlpTa6w)dJw2UNk3oIe< ztIC#ZpR4t5%Jk%t4UM8`ZK8@~9(d zI>65Gfa5&*I&1?P1RFEa7Q-1VSeQqJX^hQ#abllXSoeq4# zHmY;fpdIkD4b!j>k<3^4-^&Y=v{d^HUUQ9VGD79#L&q2Q78h;EuJ=Xzh-ETdcrgz$pm<+CVwgJJ`1;T~;ws}c)^%0T9z^%pLFmN3F<{nwq zFDYah{Nxf&4O$VH-!@-}#*x9;7w zsb_lLn$#zq&U8txO|#CE?yqk?C@QL26gPMCuQWu$&hQmSWdGi6jn(FO@_LJBJRHW! zj8>N=?`2jL?H4z;NM;xD30AE;w{^uB$*JPdB4Qb$cB$Dc7mAL~96hlKUXz*tm0qP89OroFq-!`><<4GkJ_hq^WYKzyx*KVKS4h99rp<5NAGc1`W} z0;7{`R0!uQ!4WH6gECJqXHQ;+NQsf!x*4%-A)em{vU|)r&@?7a&|3@Si zYpqY3ZLXgeR8`Fhn%ds1^)3;SER3x&@o=23vT8mA@nIXI&$$i*Q$s0{rj~?CBsD^s z>X)Qp8d(}j>F1N>DJN5zB)snNCZ*fl{@S>fL#kmIm-MsQcb+hM)o=%gXb1Jq$D7$&BgWM>b&}`e1lf4r?;&EO3wV46-dBQ0jtcli?8n=>$ci=k<(JO$P z^Bm{wk?eqe=};Y}p{ZSk0q^+)?NbGGk<=~+{kry+$AwiEsJ4e04BJDEq6oPg&IcAc zM1Qi+MAv97qWB;uiC-fj$1TsbJt0L-(y`;XHI=Ge5eCC_ScN!7dAn7m??|IOJq<-c z0F-Nxqkt#GvnyKG>)Lc;=Il||9q?Ml(CHckgE3>)(o5Gj7*;+LUu}t-O+x0ZzOI(qgGgx=OV0ohp_O@Fg z;a!un%1PDqoS=2Pjm5O+->A9rio=Z4K5>MV7 z_eJ%5q3+k`J(ZpAJ}OQ+=IIOOX|bTyVDfY`&;?1&J!E0o?j=|;=6G?&Zm28fC zTs?kRQN}m-f`Tx9x$m*|>ZBvmfG9{>tZsiR<(CzN3#Nk0S9(NIJrVbKb1`|d$cIl9 zZLa}&Q_G|;@qob0yJtayA)H_4hi8CzaVznxx!rGcxju|n5DnI;8IO(YOe7gm3^tFT zeUZD0H^)A%nYc4y(N;=0yHZ)4Qs|yR)VL=xq&`k{o?m&b;lkOCnI$O&I3+RHUBYnFTAR`9&}OE);aC=iXM+Y;zJzq)XjQ~yUURon?F_}iQvbuL&9(2B>hi)% z@Hi422S0oIWw?iPUS&vEQl>YAC;NR>A4Fq=l} z%ZS~WaIai!&oT`HYBE&gr%gJBPDvj{w%ME*eMz1>0pzxg zHwLJb?hNbKQz!*(WYK_W70OU%xj7z5(IqA6D3Ou*6mb$o*IG(G%8$nBC`lRlL%LYO z&sTJ+NPi#6%#J;FqR}|XGm03+N@8?8kde9^w#tVUg&msG`Pk!;?rDxRB|N3QENZee zxM=kW;-}hPBS(2w|k{ zlTw`Pp+6rTxFw0(5o7fARr&MngekFsgW{MDZjql{72xZ@sg2vHP?KeYnnRb@_#bYu zKRLBndh$4ZF^@Oo<|5f8Dh=%Oivllf4^l^fWuc?jHDM zFOD?L3pu)YVozopU6~ZD45ZPr;pdCDll|D?PtyMJ_D)TTAA!Hqo`$n!eiwJWgR^P0 zz+k0P+(ysbvv?diI%6fmP|18DT}^u3;$o8(kl;hGH~;u2Yh2>8@N;t?vh;JrfWDP^jbotB69N5LqaH$^3wb zpAL_9um0t8@C{HA3N+z^e&tXEZVpb|)c1WIzB2+lhrz(-F(|Jo0V~^RG_Q;@mcMeI zIV?#;jnJ$4(~Y234rjvKMw%ZEd_tpT(B@}$M~fK@arEv58pj z?CW&TFoz~2R1btz@K#eU%q(0v8823;5`9U0$V^p=)h}=Yybgzi^gbgYG}svsH)&?a zHe7fJHf42SHLvu}aOJy{8}(N>=EePj_`V#ajLZ-6{V|s9)P5!vBc^h~0wnx69VH>U zFhCd^sARCbGKKOoWh&FDu|D-*X=)^^inU^AfIZ&lusbsX-^AwAXug;SbEBib(rDa- zBS#hj?>27iC~#34vhoMJMmO%&XW3*dq@dV~;EJvOSOo{2$>$_vpz63_hKTpjAbo)L( z-N7G?IITNIuaD^#n2iiy#pen?27^=G@k%$4PXtT( z1glep;3UZ-R3+x9iOg_6jF=OwlK9Ad(3atf(o(C1w(L-HeYkB@YUQbhPlS<5wXieI zwsfWK^*uY*J@FF)JNxI|D2qa*9NhBU4LJ|euQD_R#DJ2q z6WHJNYUg!KUa9b*fded5I>n{=_wStxX|z^J<2jPTbJgQre|c>B*+8sU&v!VQdR^7K zQ7<1Z*!+KjoWuSCUgfv=5R|;23m|Z(zk_Y}4ZvGNFU3qwUo3rw+tDlj8w)WvbI#bXM@k#oUDA z7&wEO@$=VU=iaLs_h}2h z1r2PPBxXYO)mwm*G{9?BZ&RwaIZMjql}^N03QoDtOfM|h8RuS)%Fh|6EURvvT+{{1 zLCxWgYQ*p5pp&hQ8KrUDn!_EIh)8|Y3jSf0ideqVEH-YGs_$Awxzwi3@*Csn>%kI) zuG7{;>sJyQ8hWDOGMPCF_DrJn<3bE;M>ScF^Chn(2A~ zEjcqTd5NA6IOi%-LCmk;&0a2-k3jMk#GmE z&5Tj0E7V3=##dW^<$Cbu&TaVtoD0hvs>GWdAaag%VnvoJCbAsSQmvX*#=78~S*>hU z7E_lT@AovE6dF>cxp$Xy@ahz>vdKS6C$}EL<56LDu z`-*rAmW}%p4Tk;kmQsFqa)o?|tK(-MsM3V(t*kvM?5vuLxiMu_1tbayxsj}zHZjpm zR#ekySvmhAaUSWMrz}L%+qiLK@AR%A3#6DSI1czf=`!&u>hAe2G-Y<0g8 z8*t;E00X-S7KJerUWdCpJi|^8Y^R+F`Jc-~G`xT3lD-rVX+!vS%*k-hE}QC3`epb%ld88BQ)0?V~k`?Ajl zwPUX`ubDZGQgxdy*=lX`h&@@GZQAzUgp%#>t2bftHp#>0&YIeFy(K2z1v^$>XKunS zm4Ef63chh>}Ir);CAJVt|b~}Lu~E?RIb4NpN~2NUdVu##ck5z z`sqyvB9U8H4!@o~!j+xqrQl&C>K@i5o^ENI=NHA9@m6G$L~}v9

    u0vx+dNT^uZqw$jHY!9Urqc>!qf|v< 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 literal 0 HcmV?d00001 diff --git a/old/includes/script.js b/old/includes/script.js new file mode 100644 index 0000000..00ae14c --- /dev/null +++ b/old/includes/script.js @@ -0,0 +1,551 @@ +$(document).ready(function() { + // todo define things like 16x16, 128x128 etc. as constants? + // also script debounce/throttle times + let animationTime = 400; // defined in bitsy.js + + let bitsyData = {}; + + let palette = { + id: 0, + background: { + red: 62, + green: 43, + blue: 32 + }, + tile: { + red: 208, + green: 112, + blue: 56 + }, + sprite: { + red: 229, + green: 92, + blue: 68 + } + }; + + let room = []; + + let tileMatchThreshold = 64; + + let croptions = { + url: 'https://i.imgur.com/ThQZ94v.jpg', + viewport: {width: 128, height: 128, type: 'square'}, + boundary: {width: 256, height: 256}, + zoom: 0 + }; + + let $croppie = $('#croppie'); + + $croppie.croppie(croptions); + + function colourDifference(colour1, colour2) { + let difference = {}; + + _.each(['red', 'green', 'blue'], function(key) { + difference[key] = Math.abs(colour1[key] - colour2[key]); + }); + + return _.toInteger(_.sum(_.toArray(difference))); + } + + function zeroPad(input, desiredLength) { + while (input.length < desiredLength) { + input = "0" + input; + } + + return input; + } + + function colourToHex(colour) { + return '#' + zeroPad(Number(colour.red ).toString(16), 2) + + zeroPad(Number(colour.green).toString(16), 2) + + zeroPad(Number(colour.blue ).toString(16), 2); + } + + function hexToColour(hex) { + let rgb = hex.match(/[\da-f]{2}/gi); + + return { + red: parseInt(rgb[0], 16), + green: parseInt(rgb[1], 16), + blue: parseInt(rgb[2], 16) + }; + } + + function getClosestColour(initialColour, colourOptions) { + // ditch sprite colour as we're not using it atm + delete colourOptions.sprite; + + _.each(palette, function(colour, name) { + colourOptions[name].name = name; + colourOptions[name].difference = colourDifference(initialColour, colour); + }); + + // lowest difference (closest) wins + return _.first(_.sortBy(colourOptions, 'difference')); + } + + function newTileName() { + let tileNames = _.map(bitsyData.tiles, 'name'); + + let i = 1; // start with 1 as 0 is an implicit tile + + while (tileNames.indexOf(i.toString(36)) > -1) { + i++; + } + + // base 36 = 0-9a-z + return i.toString(36); + } + + function handleBitsyGameData() { + let input = $('#bitsy-data').val(); + + if ( ! input) { + return; + } + + bitsyData = {}; + + // get palettes + let palettes = input.match(/PAL ([^\n]*)\n(NAME ([^\n]*)\n)?(([0-9,]+){3}\n){3,}/g); + + bitsyData.palettes = {}; + + // do palettes always go 0..n? + // will this cause problems if not? + _.each(palettes, function(palette, n) { + let name = ""; + + if (palette.match(/NAME (.+)\n/)) { + name = palette.match(/NAME (.+)\n/)[0].replace('NAME ', ''); + } else if (palette.match(/PAL (\d+)\n/)) { + name = palette.match(/PAL (\d+)\n/)[0].replace("PAL", "palette"); + } + + let colours = palette.match(/\d+,\d+,\d+/g); + + colours = _.map(colours, function(colour) { + let rgb = colour.split(','); + + return {red: rgb[0], green: rgb[1], blue: rgb[2]}; + }); + + bitsyData.palettes[name] = { + id: n, + background: colours[0], + tile: colours[1], + sprite: colours[2] + } + }); + + // get tiles + + bitsyData.tiles = []; + + // tile 0 (background colour only) is implicit in bitsy rather than being stored in the game data + // so, make our own version + bitsyData.tiles.push({ + name: "0", + bitmap: _.chunk(_.times(64, _.constant(0)), 8), + new: false // this could also be used to stop it from being added to the game data, wooo + }); + + // everything after > is an optional second animation frame + // todo: handle multiple animation frames! more than 2 are allowed (but not via the standard editor) + let tiles = input.match(/TIL (.*)\n([01]{8}\n){8}(>\n([01]{8}\n){8})?/g); + + _.each(tiles, function(tile) { + let name = tile.match(/TIL .*/)[0].replace('TIL ', ''); + + tile = tile.replace(/TIL .*\n/, ''); + + let bitmap = _.map(tile.match(/[01]/g), _.toInteger); + + let newTile = { + name: name, + new: false + }; + + // todo make this agnostic? i.e. tile.frames = _.chunk(bitmap, 64) + + if (bitmap.length === 64) { // normal tile + newTile.bitmap = _.chunk(bitmap, 8); + } else if (bitmap.length === 128) { // animated tile + newTile.bitmap = _.chunk(_.take( bitmap, 64), 8); + newTile.secondAnimationFrame = _.chunk(_.takeRight(bitmap, 64), 8); + } + + bitsyData.tiles.push(newTile); + }); + + if (_.find(bitsyData.palettes, {'id': palette.id})) { + // user has already selected a palette, leave it be + + // in case this is the first run: + palette = _.find(bitsyData.palettes, {'id': palette.id}) + + // if we just set the palette to the newly imported palette with the same ID, + // we will lose any changes the user has made to the palettes + // is this a big issue considering that the palettes cannot be currently saved anyway? + } else { + // set palette to first imported palette and redraw + palette = _.first(_.sortBy(bitsyData.palettes, 'id')); + } + + renderDebounced(); + + // update palette picker + $('tr.palette').remove(); + + _.each(bitsyData.palettes, function(palette, name) { + $('#palette tbody').append( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + ); + }); + + $('input[name="id"][value="' + palette.id + '"]').siblings(':radio').trigger('click'); + } + + function readFile(input, callback) { + if (input.files && input.files[0]) { + let reader = new FileReader(); + + reader.onload = callback; + + reader.readAsDataURL(input.files[0]); + } + } + + function readTextFile(input, callback) { + if (input.files && input.files[0]) { + let reader = new FileReader(); + + reader.onload = callback; + + reader.readAsText(input.files[0]); + } + } + + function render() { + $croppie.croppie('result', { + type: 'rawcanvas', + size: 'viewport' + }).then(function (result) { + let imageData = result.getContext('2d').getImageData(0, 0, 128, 128); + let rawData = imageData.data; + let monochrome = []; + + let brightnessAdjustment = parseFloat($('#brightness').val()); + + // for each pixel + for (let i = 0; i < rawData.length; i += 4) { + // this brightness adjustment is pretty crude but whatever + let pixel = { + red: _.clamp(rawData[i ] + brightnessAdjustment, 0, 255), + green: _.clamp(rawData[i + 1] + brightnessAdjustment, 0, 255), + blue: _.clamp(rawData[i + 2] + brightnessAdjustment, 0, 255) + }; + + let targetColour = getClosestColour(pixel, palette); + + if (targetColour.name === "background") { + monochrome.push(0); + } else { // tile + monochrome.push(1) + } + + rawData[i ] = targetColour.red; + rawData[i + 1] = targetColour.green; + rawData[i + 2] = targetColour.blue; + rawData[i + 3] = 255; // alpha + } + + // split monochrome bitmap into equal chunks for easier x:y access + monochrome = _.chunk(monochrome, 128); + + document.getElementById('preview').getContext('2d').putImageData(imageData, 0, 0); + + // tiled output + + room = []; + + _.times(16, function(tileY) { + _.times(16, function(tileX) { + // make pseudo-tile from monochrome bitmap + let pseudoTile = []; + + _.times(8, function(y) { + pseudoTile.push( + _.slice(monochrome[(tileY * 8) + y], (tileX * 8), (tileX * 8) + 8) + ); + }); + + let bestMatch; + + // if we want to always create new tiles, don't bother trying to check matches + if (tileMatchThreshold === 64) { + // even if we want to "always create new tiles" we still don't want to create duplicates + bestMatch = _.find(bitsyData.tiles, function(tile) { + return _.isEqual(tile.bitmap, pseudoTile); + }); + + if (bestMatch) { + bestMatch.match = 64; + } + } else { + _.each(bitsyData.tiles, function(tile) { + tile.match = 0; + + _.each(tile.bitmap, function(row, y) { + _.each(row, function(pixel, x) { + if (parseInt(pixel) === parseInt(pseudoTile[y][x])) { + tile.match++; + } + }); + }); + + if (tile.secondAnimationFrame) { + _.each(tile.secondAnimationFrame, function(row, y) { + _.each(row, function(pixel, x) { + if (parseInt(pixel) === parseInt(pseudoTile[y][x])) { + tile.match++; + } + }); + }); + + tile.match /= 2; + } + }); + + // what if there are several equally good matches? + // find highest match amount and find all of them + let bestMatchAmount = _.last(_.sortBy(bitsyData.tiles, ['match'])).match; + let bestMatches = _.filter(bitsyData.tiles, {'match': bestMatchAmount}); + + // sort by name in ascending order + // earlier names are preferable + bestMatch = _.first(_.sortBy(bestMatches, 'name')); + } + + if ( ! bestMatch || bestMatch.match < tileMatchThreshold) { + // turn pseudo-tile into a real tile and add it to the tile data + + let name = newTileName(); + + bitsyData.tiles.push({ + name: name, + bitmap: pseudoTile, + new: true + }); + + room.push(name); + + // issue with this approach: + // what if a tile we add late in the loop is a better match for an earlier "good enough" match? + // this would also cause different results if the user were to add the same room several times + // we could keep iterating until the room no longer changes + } else { + room.push(bestMatch.name); + } + }); + }); + + room = _.chunk(room, 16); + + // write room to output + + imageData = document.getElementById("room-output").getContext('2d').getImageData(0, 0, 128, 128); + rawData = imageData.data; + + _.each(room, function(row, tileY) { + _.each(row, function(tileName, tileX) { + let tile = _.find(bitsyData.tiles, {'name' : tileName}); + + _.each(tile.bitmap, function(row, y) { + _.each(row, function(pixel, x) { + let position = (((tileY * 8) + y) * 128) + ((tileX * 8) + x); + + position *= 4; // 4 values (rgba) per pixel + + let pixelColour = {}; + + switch(parseInt(pixel)) { + case 0: pixelColour = palette.background; break; + case 1: pixelColour = palette.tile; break; + default: console.log("error"); + } + + rawData[position ] = pixelColour.red; + rawData[position + 1] = pixelColour.green; + rawData[position + 2] = pixelColour.blue; + rawData[position + 3] = 255; + }); + }); + }); + }); + + document.getElementById('room-output').getContext('2d').putImageData(imageData, 0, 0); + }); + } + + let renderDebounced = _.debounce(render, 30); + let renderThrottled = _.throttle(render, 30); + + $croppie.on('update', renderDebounced); + + let $brightness = $('#brightness'); + + $brightness.on('change', renderThrottled); + + $brightness.on('dblclick', function() { + $(this).val(0); + + renderDebounced(); + }); + + $('label[for="brightness"]').on('click touchdown', function() { + $('#brightness').trigger('dblclick'); + }); + + let $bitsyData = $('#bitsy-data'); + + $bitsyData.on('change blur keyup', handleBitsyGameData); + + $bitsyData.on('focus', function() { + $(this).select(); + }); + + handleBitsyGameData(); + + $('#imageUpload').on('change', function () { + readFile(this, function (e) { + $croppie.croppie('bind', { + url: e.target.result, + zoom: 0 + }); + }); + }); + + $('input.game-data').on('change', function() { + readTextFile(this, function (e) { + $bitsyData.val(e.target.result); + handleBitsyGameData(); + }); + }); + + // these inputs get added and removed from the DOM so the event handler needs to be on the document + $(document).on('change', '#palette input', function() { + let id = parseInt($(this).closest('.palette').find('input[name="id"]').val()); + + // if this is a colour input, update the palette + if ($(this).attr('type') === 'color') { + if (id === palette.id) { + palette[$(this).attr('name')] = hexToColour($(this).val()); + } + } + + // if this is a radio button, pick this palette + if ($(this).attr('type') === 'radio') { + palette.id = id; + palette.background = hexToColour($(this).closest('.palette').find('input[name="background"]').val()); + palette.tile = hexToColour($(this).closest('.palette').find('input[name="tile"]' ).val()); + // sprite colour is not currently used + } + + renderDebounced(); + }); + + $(document).on('change', '#threshold', function() { + let newValue = parseInt($(this).val()); + + if (newValue < tileMatchThreshold) { + // set tiles back to default + bitsyData.tiles = _.filter(bitsyData.tiles, ['new', false]); + } + + tileMatchThreshold = newValue; + + renderThrottled(); + }); + + $('#never').on('click touchend', function() { + $('#threshold').val(0).change(); + }); + + $('#always').on('click touchend', function() { + $('#threshold').val(64).change(); + }); + + $('#save').on('click touchend', function() { + $textArea = $('textarea'); + + let newGameData = $textArea.val(); + + // handle rooms + + // need to import IDs so we don't give the new room a conflicting ID + let roomIds = newGameData.match(/ROOM \d+\n/g); + + roomIds = _.map(roomIds, function(roomId) { + return parseInt(roomId.replace(/[^\d]+/g, "")); + }); + + let newRoomId = _.max(roomIds) + 1; + + let newRoomName = $('#roomName').val(); + // remove invalid chars? what's invalid? newlines? are those possible? + + let newRoom = "ROOM " + newRoomId + "\n"; + + _.each(room, function(row) { + newRoom += _.toString(row) + "\n"; + }); + + if (newRoomName) { + newRoom += "NAME " + newRoomName + "\n"; + } + + newRoom += "PAL " + palette.id + "\n"; + + newGameData = newGameData.replace(/(ROOM .*\n(.*\n)*PAL .*)/g, '$1\n\n' + newRoom); + + // handle tiles + + let newTiles = _.filter(bitsyData.tiles, 'new'); + let tileText = ""; + + _.each(newTiles, function(tile, n) { + tileText += "TIL " + tile.name + "\n"; //again, rename tile name to id... + + _.each(tile.bitmap, function(row) { + tileText += row.join('') + "\n"; + }); + + tileText += "NAME " + newRoomName + " " + (n + 1) + "\n"; + + // don't need to worry about animation right now + + tileText += "\n"; + }); + + newGameData = newGameData.replace(/(TIL.*(.*\n)*)SPR/g, '$1\n\n' + tileText + 'SPR'); + + // write + $textArea.val(newGameData); + + handleBitsyGameData(); + + // todo: give the user some nice "yay! it worked!" kinda feedback? + }); +}); diff --git a/old/includes/snowy-owls.png b/old/includes/snowy-owls.png new file mode 100644 index 0000000000000000000000000000000000000000..cf21bcdce468c70e26a9064f2b55449594df4d6e GIT binary patch literal 87977 zcmV)mK%T#eP)kv)z4f-KtaPWPbCTkCP>;s{G;W4_|-y`q%Q+UVdYY2O@&1 zA|gNanDMdyPaN~IZy)oA>;M0+^}qaC0f2`OAJR0J2y#E2e`K|wpJPfEP3XmZ{LsdaQ5dYi1JOUK~5J4oBFN$b6 z$dGD;d}?P?5x@~j>>SB{iHoBsj8II7Q`Pf>j;<@Dl#oV9lZLi!Y1)>iZD`t-$)qJU z_IpY~+uHF>lW0;Ri6AKrsU@pK@ddjU-Ih-GMbNiuR8kAc(ira>YQxZ1s&bb zi(lOOzN(!)`$=N1v&LE}n(h7UpXaP(l$^8w)2*LFR&r;b^?5+El820DE$94cYiYx^ zH53s)Qqc0hIz_T|9wm!gEYyG68KuaNpqfXsT<2LrFfYkk$nDk=*;&gu?K{HQP>v0? zj?NQTEY?>96w>yrj6W*h4Lt!x{O(0$G-mbx*ZXQD@s-bfk?U8lZ;w|lu?fZX1@e&T z`i{OIxOL+y>-B1DT&>-peff93`(6IqzxLPZyNzF1$q32DLPkk`3uOW8?1Cgyge0WY z)`_kC`hDa zppk$kjqYQl{Mo^41W|~Nq2ZE9m5Fr)ctPuZ@h^dKtWoy)(wxbP{ma?bEZb*8hGEDI zgVN`Lei#^ro~|DlHUqgI*z`T?UK!RsLqD+Y>}UMTfh?jxLe$43si=QK&@c#UchqB` z6E`Xfsy4o)cE?#WSrv4sbD8&`>jsYr^d#oAuUUC4S7>t-JwRsC=5w*F{xQ`tA%%pAEo$ZsFnax31 z=rVMdA77WOO5YDGmltf-8?GE5aQU?r12A;&$vQw*S295b22oI9Kxks|M93oqi~C5D z$k`W8>eQ%P0uxj9FSz~ExDl}#muw%WRII;Qo$TjO116s=L=ZQ9L)aYwnoP<{Gc@Qh zF!VjckjSZF7lINIYX}llbF*CIb~a@tf)v)I3=0zIZ!1sf|A^S)?%5r zZOs_n<2@ZM<`$L=s?zok)*+J{6Ji+#doO1r6Il?&Es&jWPy<5IglZydCS^w8lnebYlua+w zvS0yK-N(XHAVRi28rgp#JGhj^*7~UumaxuMu_kQKpSqHfGs<8LMF+ADXf}oEa|HmK zi~4s6CS(%;5oa`7=%|E{qln;!!p4_X%^IsvRVq=?0cQ(7 zzi}*T_vCJ4c6y)D;+7^98HNJT#wN!!Jr%_dVi!Oi=LCGmuqiQo?ML z-DS|&g4}ME#=ctCJX#sqx=+`mEnu*BoE4!4M#Vv>es%Ua)R7WZ%&hN+LWi}_8X#zl zKsA$dPd{WBdUq$n`a3A(>RpYkSFj{}{MCB70%bEO#g-{# z?d_Nx@7ehVHA5D2Uf;KQG?jPb6awb%hRv|MEAf%fuwv{&5NCT7<<8DZ2L&`D0O3TN zENe<5868N;uApLf+Xz4+ha;2ow$bx@Y^QAzj>yuCr6nZByp*vuc{vPh#Q?~P4!HD_>Dx!sl`Ub)Yb&q~Soi zPZ=Y1hN0$fY9lmxK!<@o_oSR?vM}UAgJ$Q9 zW>fHCq}XI<207vhS^|i}7+g^Ik4J7^fnvX(5K;|LEdMFgJ{M&bTULCG&UzyFmjeiL z%zbuX_Bqr5S7(KFB8-V>XFz4AadjJPE&T5!nJi**>26GbYZ66ud|v@zQpjs8ehEfm zMq?|$&gkD~iOodaw!00H_T(+$P|$hN%M zFJ6RDMtCwnO39I`Cl6*d!#B-7NLBZX***`bkpYQsNEH?_VQ5jKo?}GJE_ivc#R(t0 zV3`Y>BpAef|Aypa%(->Hw<8S=nvLEMxo6Nst41+BDibdbO`VK4|S^d*H~ma|3hMf`IesRDIT{de4A3=t?2(3}h6$M-TI1L$D>|1b=+ zF33af(W3Z4e~r?UZSs@CpdPW+Org3Z@S*N!yV82#DAm#W*lj_>m5RkFj)IO6wJJz} zfVhB_`=`>stuURqEvmwOinuk102Fc5;f9XK<93TD_GwUXS0 zh}epA7cmzmoDOlyuL4=bVnXF+B;ensTef94`OjWsE2yXI-Z_X5fsRCh(om7k9gMmRPV3HOYAP=ti{RYhqdFWA{kTuig zfs_Zk$pLa|8FWCi(B^DbK4*rcG+I^D5IgP-cMGbzCO>u{=xmUlNK<->Ze$V0zJCBg zGg|0!mLM6i9V|7|vyFg9b;KF6U4XMt-u}X?F*Lt<}Jw1q<;kNVtpPo<(pH z%^tIe;G}r|FR~4x1F5hwW45U{YvVY!1+wGbQnl`q95};Os^DOT((k4Ci#CjTGiBP= zAYkZzWdph;LpHryvJEeLZ2>^enZEBm6;wD%W#w^pU!;Tu{6gRdB{C!gIm{lQLn)Lh z_`fY+op4D(;XPiUTC%Z1wSF~_<-#!fIX*^F$UWq?rm!?I3eLt(GAl>>z#JgDX5GuC?h3>^-h$(#&lR72<0VZs_Nxnj5)x$DL5ky=` z%-&_E&3RMWf(Vw^juC2=87-7v3QLnR-f@AC zqPgF?&m7s+Fa!!N80fxMn-PF>OGB#cV-4nN-c+QuX@UerL1}FL`YR z0j)s9BIG`Dz=9TJs|E0^k6m7blx;yx2$C-VK7r=L+&mAN*XJ`^_ zc))>fK@dhlj@DwJ!7V|(Q!VK_&ACMW^U!!M+bo^t0ki=fJS!k%1|&oFlwVfQITu&N z{k)tp#IpEBqsbQ~xjRs;m8cyxC?yyk_fmw)|7&nE=FG81ZmG!S$TFWkCL5cKEIy_L z8v370jy+OL5%e>gXwm+`=X7v?v}qdJrX@+sY_?!$w##%nrICmcB^I+8-O#h?Hk_QD zF(_O=y2|tOGfqxVS+Cc0LqDRvRfdbYYlVh7ek|>*HSNoYJ&fI*a1(MKih_w#{~>&8 zf4>AS0~ir!qPb9PHvtA>gU@(HYtR6+!RkXKnJenr9(n z+B9QtXTfUIK^~Y+r_5$EhGF3FaG&LRV1_RZZ}vZCKU!J z2k06YIqxb=K%yoj+>;dK&CXMFN9*^ZjJ%v92gs|}zbGo=MR-cnSUEZlNOkGQj-#uN zGs6*u3s|7oZ$R8) zODfhaSg=4zP2qwOLesmYLxYx^i;x^_G!HN|Ccn1` zK6%hbt$0b%QUL z)b$wxwFt#j`YuuzY-xRY<8B)$HhK&Brfg3mYgN{7YZkF#t#0 z-UlUv&u9WKk+3fe3MrLh3dN%MWh0NJ4T?V$109I8*Ih;p&t&IfGe3&^R@SMj6AOB;MRXv27+wE~47Rjj<#(S-l(49Ej* z5r#V0yTb15h~xP!j(4wf?fP|YTscAzR+|m){p1}c)0P{zZg6n0!^e*wa{By)FMs2! z?C#7tJ-eW766^JbluV(sX8OJ}xoKOvzGG*x$DjDd&++vye3fti!FT!I55C6-k00^= zM-QEO+J++&qo@k>)sK1CSbvQ>WMFW{V;h+yJCh7|XBddG-0bPv>?y>U`zA?E)4BZW zc#bn3Pl+=3y2`^a0u&5nlByTA1$)p^6qlW;se6&;Jh}lG)c{1SU=U%`cg~P%J!yS~ z#ox{h6rA`ewE&k~0FO!s1^1|C6s%-1-EYKmx~e2+0NH(#*yJ(}+7&f$z_5KGX33+p zs7Zm!saWr@sDVN1EF_k_$8xo1oO3xisNLW#T}uk1{Dfv1&#l&mI1;XEw49 zv@|}5_&%j308K;@Leg5<7wBFBSzvT`OyS2!uG94 z2WBJa`f_R?Y-A)uFFTA&g+N)=eLxeIB#AadPBA#4^L+uLfi^~!4Ll;BAH%2`T_jz~RJByXBZL5PywafS}CP z_mlFzx>cM`X52r1l`r4_28-z~j~+i|wOsScotu34;C-Gwe#Ep*%y;Gh?CvZW`hlix z88#b^j*i*v?(*J)2dq{d*RCA1dw9TPVm4)VbYOY&-XibAVAlMjhmUC|4SnBpeC3$M ze9r9~xA}Mf%wOd5pL~PA^J~A%M~@$|+N@z@?Sem<8#q*%QS*0)p@M>BwE(Z?k(*c3 zYL!FUs;D{$Af!?|ARy*e)G^fctMYBEL!^RKRDP=O3>6Rh7?$`rGnQVIYO&1?gGgyc z%>b%s5}MS|G`179$cb!Qd??Gk?S}L6*9*G=&G+rg#AM^q41!rM-waT)-BA>S2RI!; zi`Apjs;G<#;Y=fORu|9|3!5>J@PNh(H{oAR7**>F(8LP+@@n1IX&@Drl&a8*DZJ#7 zMV2k=9K}uJN!8JRWos%%PJmlor~(j~fi25Tbs5H%ZY%0N7QL;%%L0zbL6a}tv5M&a?ZOCA9DNdO>SPl2BMsuo}#&9XLrG7vtc@&&}}-NK6%Q~)hoVD zI?=XsZr;4XX0zeJdk>h*S`PR3OTkze63v;u8(4K6n{I>Bu)MgSX&VwkJ8ejk`1JiZ zx%!un`9Ht&E&l#*{$n=lj23D?l9h^}c7IV1fO=_jF6>~O!o(HSusVC(p%%D@&!2Ma zZ4jfYPHXGztMA2dWfx}_u@4~Vw(6+zuNp%Ut80l(XA#>fD;KdD)Y!MD*0*A7#VF`j zQCNwgY{|w?G5@@@C0GDu*gh=1;Zr3ga8XgKE$D2FAdM>zJY$g6z(X_GhT@Dg$)eCA zNLG@k1XabV$P}7Ll|+;XOo_x))aZ8X!V0vL@)My(bk&)QAJ?lgVepCed-n;8x`K%2 z2ca%hS`=|6Pz;9u+_wB9!O@`YS_TsV1H|I$KN$qBY-S)$J~^Z5?A+c z^0|9o%N8x071D`a<#^;Oas}h zbqbcLr4fJ?sU}xM{JPWy7xh{ZS8U99rL4AVlu%Sx-jNmmETyc8ZhvRnxeLS@xj#W0M{a>g;@5)++pu0O*{qjd5R;hB=16Lowux8o-KHM~Ru@ZB+p_6fT1@dk`LjR!^SpWQ zHGb#2-{#xj{av0uePV&yQ9(^E!lzl0*-x%M7^-qk%L%@XNzLE0NV1J@`qnvut=)K4QUpXBoP_6f3Y9X3|uI<-$bb^ zh+|@(c$xDO)zvbhu&z$yVgTh<)yE<+U4C8h;A9Qh#J`yCQV3NR0%u7T5UM4YGN0q+ z8poDG`O9Zx{VsPCa~D?(2dd^2D%8e=+uxIB#_P8}%bRyT$Glz8_XE@UlrMetOYH9M zA!3`Q6fw&^^t5fW#aPO?oLa9pE4sdO#ZtP}lAJT$#W`);koygri*r`1QxIV?-D7>x zl9~y7N7q^G?$dW0GD^Q$(dU6CwJa73nzp5F8b0~TecpWaKA*b(27mV-{t6#__&%%E zMcI{zn!=OaXv8+=p#5I&p*a`hqT-ewqs<1)7Ii`)r|ear0j%yG_=dNz(nVQa291&W zig`)6gj}Q=$RtPMv{ZSI^Y||j*TQ8!T_8J|| zWig~ofcp2WkV1-EL-}tc8MWM2xxVi|PM7vMM4k2JTC4I`RBXk#{K%rZW1$%d!?sIM z)w;wGVy%i8RdBovKaC_lb?1w`cH=Wl(-e_JYLw;q1+&?#1YU<>DC3R26t;$V3AG7x z9(snMr{8So`>s&#^~E_CXHV$56>ZZp^lQ#fp78wSA&1xQGo5whJTRH<(r+%9FLoid zq|`Fs-D9&^v07gssbPk%^B}Zs!`DCm6+Zvwr}?$t`X~JTfBFx3^x*?vS0%RWl!CQU zti!-S%dzA2#tmIG9Ete~160zxj>cmpQ?L2RMR{!{lJ9&}wQa-Y)H&AL&J&C}0M_|) zVYIeEE*JuZO|;$&M5r-?QVlp#$+6X{!`_zNc)bt<$ZnbOd}aBPNcrL8^xUP?LAapH zXwpK+wcN02mn09khy}V@siIq5k&zWt|HSLJ&1$Af`IC({c}1ZG^&Di}r)xYGPwz!~1IzPs=JPp2Z0aGChp?hG-eKxxX|%rY8M+O9*VA zOqtCVj^@q zw%pai;L97lT>W1L09w<0u^DlE*+I=Vk9($+A{Q|qClsd)U|b0(hIi%0rQD-ic09o5 zv_F(_%ct@w5?tYNWfDYeAAbOrO8k?8vQ@cLxfAD1{#hnzQxG`5gUY4Z@Np*xwYV3w zoRxa^@?PAll-V6A{Rm+r!fS~aEo`a6q*jE-?x(N?gnL)sK_&Y3*)#abW~%4v;20P%Vbty_eLzO$yPn+;vR zCJzJM+Jbz~pFZS+pZtLHlM@zu*EqWI8l&`lXi+U4f}_O%;s}ulL;iD>(+F=FrUx)g`fSC ztk-LP`B(og-Ni7PXO|Oao>oG)ZD_(Cxu95(5Gl=SqM=Mt#v+$BvSc<$s$yL(%TD8B zup%aAskMmSXjRRIi?8mWHANn)n*^G+sg}OHYW$}#&+U&1Hu|#HRv}OvUo52OMN5fq zxv3bwN702s^#>wW5KRtEkzyaL6~2g-1^Z&9?K^Td5vo(5*uf|)l$Cl4QKW3uTbhSL z;S{SdY+`Yu*IO!Qw(GfD5INh32b2O%smo=bRnU{IQ8St!dnZ_w^)1A=QlybZr`8V? z0P?w#8a7N-R;cW%u1kPa0(RzCdF$p^Nt&z%UK{$ZW4&3G66=%_O=>MD<_%NwQ1^f2 z)X=sQZ0omwu9?kdP2a6qojzrG_LTK{%@4l&+x+B*KVbLZ2D{Bo-uv$F^X$<>=uT-T ziM_o&-uU!e%y;+LSsb!HU9(Z4mpNCjzmC$<_Z^eAp_xo*o7UnIea{+Y+D@2G=O6}T z^Vtsn{$Kbd?p(XYU;Q8dJ5J9|irmI-)ysjg*nL>mSmIWry%#|O3rHlT#E!=DU)MRJ z`VJtmr8ifOo2(Sj%bQJ3lYg2=Lky-j_}Me|42m3M6=61+6}_nU=5i=Sd}=0O!tHbcqE@Xp zc&@&kAZ<(2Sk+m$1H&-TyY*i!&p1DQ#`5$T?>~5lw}13Qo;_dj(MR9mC;#Zz_~`MH zgZaQ`?*h5u+t2rS@4W~7{4e|&@*1+Vw9^^K*RL_(*`@D$*2^W@UC_)A*xB8uX&Z}2 zZF*MACG+{5*=$bJG^i?lR=)E2ukw@k-{n_+?SCa-oFmx$=Fxg+0ZXqim0EO_DdJb= zIC``hld81`TBt)9Bq>T8auw}B3u7!kq06Y7@}j6C*Ekei!7~tEStxN?@!AY$r$zb8 zC5k+3^K}Xne%b3q7r>7zJDR)_q4-Fld=d;G5YmqmF(Fqd8F8OQiGBiM`Ur2S4m2j& zCNGuAs4Socy&8#Wi8Y+fXI%?WHcpqria|Q@;Z}tMv}yk z2iE%dbL7CNz%|xjCxDkFr7?EsR4!DZ&C*>1KY7A${U5*1dk>y)UEW6)6MppGn$<>mdIrY_@U_*5NASzseM(p7DOQ7OlJLB$l>G)OiD=biRe({lRjqd{Mw60d z2_&rb=*dHf*H$M)8dMTl64tCFp{3ZkK}a+-&I^*!;{sOVTp)48((qt6?_ zo;-BEhV=mbNCP%{UaX_Jxc%QGFGZsqd!J>TQmOxlH8BX@GKpfT4F`%B?F*SK!kmQUzaz=>(5C2(144Xm z{~D6Cmd0|0w?%3kOe*~^R$^q8W39q9+6Kh&F9CMr#VwNMOeAkn+Y&gH8jskYU*+2V zZE_x1uU0foOSfJT^;FN#&Uo_Z5v%1n{ib8Nz98j}D_4%VanpjC6Ws+7`mUqjtXZ8u z=VE!n>im?8DE2>?|+g<&obZp;2F1%&)J>A^C8hr8YVjjJa6vs z+FLhB%|JWZXXoIM`R*0=j<0ige2u-mJ^F6N+0#c1-G-rC)348IQVUJPW_@lxc4`>9 zj$vx?fIM`_Y=I>6jeqWE{y5+H{qOMpgSSaE;kosw?#rVBQ_0^@UH4l}7dJ$1@%EB&U4Khg@ZXMoZ)+|__pVDpC z=v3*44uJFX6aJh3`oH4cZ~yPyIXLI3T<3ca;pX+LeEE%={N?}bzhD>7^$%7RcduFYKRAUm;jm&ov~KW(L|wGJ(Uuv z1gj%Zi5P1|JWUB{!s44Us`!(5BlzO3fw7R}(c0)Y;Ix;qFV^@o-`tP#AjvpgVst+k z#)!FikgPBltx6~({<|q|Rlw>arZDIuA937MrXqit^0MwDkdWjQu%i67TT#~~ z_RBA3`&`?*P3~>;&5#GA>*@OqAUt^Y$NaN@@~eFD$_Ko4ujQXU=y>$#Igj3doBPLa zGMP?58dI>LBWLB~k3J+fQ;v@Au)a8Dv%a92&e(J-maC50{E(f)eR4bHkNnXiK6>~2 z{OE_@1zFIoSM=wP*+0I*@%2~u+}D4B>#x4f&h9?DJ3CegHgs$@D<-pjn#lo^*{*Fj z9yUzcmcF|HO|+98ki^CEgxsxZo0jQLqMfK^CHf6nGjF~2DeisZO`bh{LZ?fUzTzT5 z6yrqO@>1t7QIu8JK0qIEx!Ka&GXE&v4oph$T2ic8cDbwCZW#!Z5={^*RS8?YhU{d{2RacZ*y>Ti+h#Tb}de=_Bj&m@FTV)Lfes4L9&TCaA}j)bsX1GMxqZT2^isEzTTI zG}NUjI$&!d1!yE1iU^~Ca&=8i7PYWblXrI+qS(!kZyIw~FO?;g^#uT z_4NV(gkW0$f-vFKD7C~}z;?~PJx)oT#?(lsNE+cqr8|Wh)yuo@W0O^$BqVh*O8g<& zR?9{$mRkJmI6k7h5{qEKVx_?{8g(U6k)Kth1X9X({kW!pLbc{4F*rtqqO0S=oe`iK z%D6P80@h{(>bY@?QEI8A3ZJJvXj04m{MZ7Rnpv-wT%4b=b8y6DwxI7e+=_{?X&z$>5l1R_E^ogvMHuIsqCxL}io)uw0vV2^gTVAcrB zlaH*S%P?^I>@nTuoSnsj+0KI1@);t+!O=dcop9&PFY&3*{tWZQE^TW}Z#K6EBVD(l z>w6}%1vx9LizV84i?$)NUazcn;bO^hd4aSZC{yS*nRa5GaTK9#r&cnY&)8fnO?Hyi zT1Xa}oEVbYmf(QiM`1Qi0!Ne_DO5smb!5{2kGS(I>d=0Df zv1zh4(W7GDB&8Upm8KwRP%LqUHU&zSg7Y9?jRPoJl*O$fZ1oR_>i(g0g-wpEF;_LP zmtB)w2KQ`w(NueJ}aXlXg|FcAqtQS0NG*+WsF64&?curu9f=m*vpE4s~wA!nx3nYnb$gu`aS*S_|3el+bkdG?gW?hbE!{)=3> z^9iQyl+9*M+fL|KOCEppkoP|PkZ*nKJG}Gm2mI16{UX<|U+3`$|ALP{c!#`R(RTy0 zMP~W*eO65(Ysb?kA8~Ph&W9hJuy^Ga^Tj^Rq~YN3nE8B%-Ti$w>$NNPIm6Ha!o~80 zVGuSwJbC(vZgoME8v1U-`S}^==cl9uZPT)|f5`Eb1w%e#P@(HO7Kp)&7|9);|6oRZR7UL+pn_g(}h&21Jdhrcpj#l7oUz z+@N@x&iR0BGn2-zTj?*9=dgRnm1ys*s0U6epo#wtQGB#r=U=M%Jh!Vj%1XWe0@VQz zqYXf1kz>BL5ZZs!GDG88Cq`Y7+fOCoKEye;tJ*-AHZyi7`%aw)NQueL0lRw#v`s_r z+jnywm@am?e)|)kJ=6J|>3mMV*|0i)%IV2t7W>zD^6`h3AsIGSuA4It-uVf#dB#FE zw9`3hHsgHx5oae)>835SenUH*FxxvMovv7Y{4qD~e1b3ikw3%H(RCVWSg$vH`2M^6 z=nsC6Vc5{L3$9$h%g)gi+O{=$+4M~32VA>)g~iSsNkYF_vtBLv_~Xa4(_Ln>xpfxW zS)jThcN@}Vill~}`JB(b@fkjR{E)XF{1^r$H3>A)B$Jm)h(|N2fOyxT*fSD`tTXZMTGTsj;g%yNPXY(i(bqdyxC$%bnaTAKN;x2=fLt?L; zzGPL#z%57#C=o$G>N<=^ll?h=LMoAV#WwhW&`u^uYG@k|iYBpLeHTlXr%%zor%f%J zO$Uwez3=`W?R8?@6ISFRi}ZQIg-X=lJ09`>Zck=7J^b zG_6{o z{9J82VKSMF&M8FEPa!3tco9Pwnf-rd0EmcwZJ1FpD-}_!O5mbd230GA!)n&Ze@bJe z_EcX{c&iXBOd<(mI$U;bjm9!ar9_Hl8Bn!?Kutz4+}COlYdz+Qo$x@P)1|Pqb*Tcd zFYgZ+Ex>4QDh`Jbc+zf!ik64=H?%^;rKkh3a;oEZYZ7qV@3Xkdkge2r(zFJKP2)TG zl<23JMA!_OflQNxe!XIS@f=l{?_Xnman8a1G4H?k4v*e{kImVPCyzg1SiviIZt(8= zPgv}nGF&W~?O);1;}2O5=gg-Qri&T3UVVkx?sZ;y{c9XuyTj?(n*F`R{@xx3hX)LI zUS-n{beo>Zq~-W%pT%NMN{MIB&*?gQCg5wYy~1?bGM!GnAjc$i=m(xZdCuwCId|^d zU@@PdzpT72VN-&##G!ODy(Z7(jx2xW`HO8tF|u*C%< ze6lT+sYi_%Ln+sb-$zRpuvA)wNh$kaXS!!qb7EFL3bsTuUElfh5MxVkPwqR0p<^>_ zY^R_!EDmn4xj5&^2R|lnI@YHTxpnIXKlttMlQ-u)dblL_neTq*_t@Xxp=lc~mP-!y z=KPVbew8a%ud+Be;_96@*uQq4-Mwo(eDD#+SB|)P?>3A1oRq{KZ6(5b-Lbk@qd7Be z6HVK)yO`2V5(oP`F7RPEEU?@6nPIRdqj}ia=BA;c+jLCYmg#hYYQv4|H+W;c;8L zUqq;C3p^M3kr6Jfz{@GdGBTExBB&(@SYj71d0k=vcIDdWzAl?gtiEIvG??>KN>c)pm!=;@=BJFDbsUdw6MKFTWeWv(xSxuzG3s zw6)^sJlMlN;|aAn4{SCU^y@YKu*Mp1>@b_m>DEh5AHB`;=|e8gPsx4H;qD&vD{{YP zz1r~pd+(8lj_0SRBoVG(J7jNX&hFkWi^H4T|LoUU=Z5KgpI7eQWPSC3y}dnj7b(h5 zn|S>AgnO^v-_1T`+5G>|Mov~adBaj)?gKZ8e7z~ z?x6F!`{II1vigCDS3wB|A`K-Duq9XHQg|uXDIJQU#~|5bR>5Q$oxv2?)I%MN+%S6` zK#dlSWFwTK7^Wi7T>9jN*QFpJHBjfnB5P6hTrM<9efcOgd}*n-lq3~eFJ4VY++e-C zqTJ(b0m&ovBP%(+X@@GJYl=8{MsEN-pp#-j#PYg14-n4^7y;;bgHAM%jADS;?Gz={sfQAJk)X>jwmQRH!P~L50)JDaZL5Q{TRe*h4q+V2{{J zO=COx`pzHKWtDT*j@^o?&YpkF#l;FH3+7jk*lc>{{Uh2W(AzWhvi4>CH?AM>*-zc$ z?!7m-dH+k?ee-J!edg}%>%4aV6>ATEF=Mq{^6d0Ex9{F$zSv>tta-=r;XbR?2GPuw zD+e4L?w}bC4)#hwcYU#8xm+?i+~?xrf_EQ$$llH_gDMkA*6}B2QiADZf+S_Lu}7Md z5`Xk7--Imu4}bHovRp08c3W}Fozz?*RlIpeLrnupk=ar$nruT@+5cWzk4a&k)iO&Q zQdX_{^i5@|qgCGOiBTAUf0k_1TmcTDl)anrFk^D*lvTz9j9&73NhP2wyWlx&EjyBM z(Q6$Qlhbi~o=)7fG7fYEM;e#QCeny6c|fq#?E7TJM5nlm7hmBs86z;4AWK-<2sow+ zE-@)tJsx1nofYrR9@nX8Jc@x9D_(1_{J*0@Cwpg9c_nz;X`hF3iAv#q8aj_@-c~%I z{I0C~ivqGysn(Q|Qu zI-73b;9!U8v_&)Y{)oA6eCg|)FQ4;we)aFLT%P*5vn!iF-N}1jmL_-MlRIgwqu+9?TJn-lUPgRFuD=Zuhmjla#Eq){(c7 z2ntdIf)do-?Ozl)h?mxQ7uT%zXznd#7Y_h3+6m~29b1=62{7hv44N(8;Q|s07yx0F z#_EyZ(fu%5i!$4n2$*?9PaP& z<|p6en}71(;@)Sz%I)j7xO3+Q2Zwufn~tQ)-jQVm7CSRi+t8%so4;&L`@ZL5xnZ%G zpMmM`C@wF; zTyv~$a2t#~lzJA5`zYZ`miQ5+*-QjGHP`(pmtU7$01I>s{+MTb z%u5E-=W(&b;6{!!Id{ksB) z#a_l>GXAdJ_N1{gSP`!iSF4yKxqE~)$n1wq*Z1ZosCR8@=Nw+S?H9CEV&8RMbvfbc z&DZ$ZKmH3m`sh7A_vzQUapM+W`R1SHb6@^B4v&vGK0IKtn9;TkX@7@ktb*e1h|hxy zv&C=|^To`brrUU)K7chVn@!K@^CkU|5oy@nnRB>5V>W5a18EU4>+cVjl_a$OIsH(q zq4~}ee&)+R!}I4S{H?$DHyFCk*0!<7z8jEdSGR3dWZpQT`#Cg*+@U%52W zftrCCSIZ*d2Ae$LowF+TRJYsYK}%!Qv3!gUAkx|;XkX~)c7EXU>xCd-Y8q0`-Y&_g zhvo<}VW1%X)Y2fkQc-a$-(T2--PwR3DeCDdR=<>CmTIdJZC5XlkkO=zj-I-jD;vnh z29k(1gdixL15&V$@^chbC}opD)5o>cK31*A1#ufMgk29;M2+R85;G}E9b>9fFCz*k z^@Q8MyzttY9*`Q_CaObygtlmeJk6>aEpC{!R602&001BWNkle^DEaTG;nYNwqr@r~8S$7+L<2U~SCuh$rsO?YcDV?IRZdTblLRqld zq_s)WdALw7Q&J6uk98YWwE6=_i=U1g3XdNI{--D?D>6P}k76?1dJvGY0o-zpwaSl3 zZ8+%ew1miA5~UY|fD&70{i(cJ$zm;#v-b!nu}fzGVb!y$N8_u%Uw!{k9YDka90}Df zT$n+mfNXYff4ycIB&*wbEof?fkvfA2t##ZB8b@RvMicH#Ahsyg5S^a`^`Kx?__`@C zXqQ{-63J1azAi<<(SiFiBH`BEVo~|&1BLrZ7hiO(FY&$ z;d>9bSe|kJ&9^u^70yqda&Uaa?!i7Ey!$?j#e!R}+-C1^k0v$NXf-RE@hpYaYDAT0 zF&LU@+lE#Xc~C^mt;y=oj~Fc5lNwJIXM3qjE`g~IBEekNHoqKi&RubR1{uG zsgXGfVDeE~b4_Ws zHx>mLMLNg(1dJ(Cw10}|Y5;)8tJit`GoPhx8m4W_WYV(P^z7^%aP4Nt(bczj{_!&&{P&jfTo>r`uyA~3`y+lE|^SPx_;pKvlFJX8O^j|KASL|w6<%ov7Lj~ z10q+eH~15ZMzl7b&SS2Gw}f-{&~Gx6wqY@!(X@$n+3?0|Z}HX}pW@=;jDPg4U*~sz z?^`@Qc|yXBiit==@@>AsURA_n3zlZxsw0V@I8^ppj7Jrd(l}R5N6OAu)L5;{Lp2Yz zbh&9-N_Gj^7C{X*@FG*p>KTAhCTsk9;n{$pgzCYOCV6#VdG4N+Qs9V%#;~2gR1hgv zKUFL56WT~b{%cCHx(xvUS{jp>59K$J#2-4Gd`F;tra6&QR6*sk7&gxZb}IuZ?a!jC zz^EvxD6`$&*e6R+7uXje`+HK7`t`NN7LcuvU+Uk-c-3Jcq^O*sz9!AYskPAcJDqBMy97Ma&E19cWrV;_3DxltxfJ7Sn2JfZl- z3RZzruXE6NFzRI%X|GF92e!PuCVPrW$~FlpH{dOmnm}N+{r|-pQ=_PbN(Gf4rQ{M) zs{N8+zFJ`o)*v)$_J#1}>}FHc|L2U_9?Wv%g1WnqJpksB21oAVhDhUOm2oYrdx#*U z-Ak=rj1I5%FFF`d<=*W)~Dv*qb;OL!^xCoUq`Vj#(TdJ?N4}N#Hiz;-R zjqRHk+kUISdew7rzU2J;oXK>?@s(p%=PRC_oUnIomqs!_`WJt|wd+^;mF1$)G>Q3QLenNx6Q`%={OJ2{bNAIdT)BEoY7FoP ze^T$Ad$*ZRUS)r09{9xh3-=u~~n)rh;#tlkSiBTl+9>A%gp|L&&nn)T6#SvR6yAwup9)ck;U&Xl~f~KQ` ziIULrj(GX7Fp3Rq2P{Qkcd|#@%!nlE&SHmVGNJD?o32CXdH&=v2Uo6e`_(&~o}7Zh zjm4bJdPO^%^Tluc3=iM`kn^)OXXk64Jv-%Md-ua0&ba_p(N_Y2y!Ymr_Fij! zYx)*H{GWd8n^go&*Rfo!IC}bw=Z~Lo?Tt6Nb>}AF)}d)Tj*gCb_V_WTgO9%Z5vfv? zbxYGUq^aiM)^#L;)(ymnD_{n$wnE7;zzxu^rvRo|)ExW?kQwZM}WMhiltNnr1kG&s$eM1?r zz=L^fJ@xo7QxIHrzusXr1%61Y8_1HVG^Vh_j)=iV|N9~BHxPXS;{AQE4F!;BMNwpQ ze$rysb*@G}YL^yc4V~?xzpI4uHztq@Gzue?BQWqvpoiRESqSMQ6X6IMRB#g{T6x-S z?T-A+ZooYit%_vSv6c;F0gG)XDm`{#*-1o7+TX&j0+aaB`=OoNOj6; zy(Z5xF3&Exar=Pn`NY@k!(`$(`xncStIGvfXP4~VI6xICRaNoZU;L74Rr2u<|B&f? z?#HuRR;v~N@HfBU^yGx?of&za(bNrHqOcgwPR{uIzxrzy%LVU!@B!8snyy6%OWU+4 z?ep?}@3w72Rk_&)v+0B+(HLu4uh!VEV|97O!{7cEohBUKxkHlWASG#*V2uleu2v

    qf*AKv>m<6^>J{_THfylZZJMr8!{uW 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 to bitsy

    image-to-bitsy

    convert any image to a bitsy room

    about +| +please contact me if you have any issues: +twitter, +email +

    game data

    paste or upload your game data (or html) here

    (maybe make a backup first)

    image

    palette

    preview

    output



    \ No newline at end of file diff --git a/old/readme.md b/old/readme.md new file mode 100644 index 0000000..a50634d --- /dev/null +++ b/old/readme.md @@ -0,0 +1,87 @@ +# image to bitsy + +## about + +a tool for Bitsy. upload any image and convert it into a room. +the room will be added to the game data automatically and you can paste it back into Bitsy. + +## thanks + +to **Adam Le Doux** for creating the wonderful and inspiring Bitsy + +to **J.P. LeBreton** for creating Playscii which was a huge inspiration for this tool + +to **Mark Wonnacott** for being relentlessly encouraging and making me want to work even an eighth as hard as them + +to **Foliotek** for the **Croppie** image plugin + +## contributing + +Forks and pull requests welcome! + +The stylesheet and html are auto-generated; if you want to alter them please edit the pug template or less stylesheet, then either run the included `build.sh` script or build from the command line as follows: + +`pug index.pug index.html` + +`lessc style.less style.css` + +`pug` and `less` can be installed via `npm` as follows: + +`npm install -g pug-cli` + +`npm install -g less` + +I had to hack the included Croppie plugin to allow the user to upload images from their own computer without falling foul of CORS restrictions. So the version bundled here is non-standard. It's a one-line change: + +``` +// croppie.js:182 (original) +if (src.match(/^(https)?:\/\/|^\/\//)) { +// croppie.js:182 (mine) +if (src.match(/^(file|https)?:\/\/|^\/\//)) { +``` + +## bugs + +* does not work on ipad (can't scroll to the right?) + * possibly fixed; needs testing +* create tiles slider breaks onto 2 lines in some browsers? +* sometimes overwrites existing rooms? + +## to do + +* test new room ID handling!!! +* don't reuse wall tiles +* add 'clear'/'upload' buttons for game data +* select all on clicking game data entry field +* allow user to save output as image, or tweet it :) + * *user can currently right-click -> Save As but the 128x128 size is not great* +* animate animated tiles +* profile script performance and optimise where most needed +* make brightness slider trigger redraw every so often while being dragged, instead of waiting until drag stop +* add up/down arrows to the brightness slider for incremental tweaks +* add 'all-white' tile by default in case the game data doesn't have it? +* handle arbitrary animation frames (editor only supports 2 frames, but game data has no upper limit) +* list how many new tiles are being created +* combine preview and output +* give warning on duplicate room names? +* loading spinner on rendering? +* make brightness slider exponential +* rotation options for image + +## could do + +* add some alternate default tiles - something more useful e.g. dithered tiles, gradients +* add dithering options +* add camera support so users can take a pic instead of uploading an image +* add a 'smoothing' stage to remove errant pixels +* allow user to add palettes to game data +* allow user to draw to canvas +* do a 'branching tree' approach to finding the closest tile? i.e. create a 1x1, 2x2, 4x4 version of each tile, so all the broadly darker tiles will sit under '0' and lighter tiles under '1', then tiles that are lighter at the top will sit under '1100', etc... I'm not sure how much more effective this will be or whatever it will give better/faster results but it's worth a try +* give heavier weighting to edge pixels when finding a matching tile? (thanks Mark) +* apply grid lines to preview +* optionally add inverted versions of existing tiles if they are a better match +* make new tiles out of fragments of existing tiles instead of directly copying from bitmap +* allow user to zoom out so the image is letterboxed/windowboxed/etc. +* add 'invert' function +* allow for image colour hack +* make a tool for batch importing images? From daf9b21096de90c797bb207cb3e191e0f102523f Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 21:33:14 +0000 Subject: [PATCH 31/64] todos --- TODO.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index bafbfbf..8fed505 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,7 @@ * tests * if image is exactly 128×128, *don't* crop -* custom palette * tile reuse -* find a way to implement Atkinson dithering instead of CatmullRom +* implement Atkinson and Bayer dithering options +* if "create new bitsy game", add new room as room 0 +* actually create room From d04eaf892beaf2209b2a3999175d52e1beb21b35 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 21:55:30 +0000 Subject: [PATCH 32/64] move name to top --- index.pug | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.pug b/index.pug index be17ae4..b8052be 100644 --- a/index.pug +++ b/index.pug @@ -58,6 +58,10 @@ html(lang="en-gb") | brightness input#brightness(type="range" min=-96 max=96 value=0) td(style="vertical-align: top;") + label + | name (optional) + input#room-name(type="text" placeholder="e.g. 'bedroom'" autocomplete="off") + label | palette select#palette @@ -73,10 +77,6 @@ html(lang="en-gb") | dither br - label - | name (optional) - input#room-name(type="text" placeholder="e.g. 'bedroom'" autocomplete="off") - button.pagination.prev#back-to-image previous button.pagination.next#room-next next .page.download From e5da032236f0ccd3808d8999d804a1ba695ffc52 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 00:05:48 +0000 Subject: [PATCH 33/64] remove commented tests --- src/lib.rs | 66 +----------------------------------------------------- 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bc10f05..b5a0f46 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -313,71 +313,7 @@ mod test { let expected = include_str!("test-resources/test.png.base64").trim(); assert_eq!(output, expected); } - // - // #[test] - // fn colour_difference_none() { - // let output = crate::colour_difference( - // Rgba::from([255; 4]), - // &bitsy_parser::Colour { - // red: 255, - // green: 255, - // blue: 255 - // } - // ); - // assert_eq!(output, 0); - // } - // - // #[test] - // fn colour_difference_some() { - // let output = crate::colour_difference( - // Rgba::from([255; 4]), - // &bitsy_parser::Colour { - // red: 254, - // green: 255, - // blue: 255 - // } - // ); - // assert_eq!(output, 1); - // } - // - // #[test] - // fn colour_difference_some_2() { - // let output = crate::colour_difference( - // Rgba::from([254; 4]), - // &bitsy_parser::Colour { - // red: 254, - // green: 255, - // blue: 254 - // } - // ); - // assert_eq!(output, 1); - // } - - // #[test] - // fn colour_difference_max() { - // let expected = 255 * 3; - // - // let output = crate::colour_difference( - // Rgba::from([0; 4]), - // &bitsy_parser::Colour { - // red: 255, - // green: 255, - // blue: 255 - // } - // ); - // assert_eq!(output, expected); - // - // let output = crate::colour_difference( - // Rgba::from([255; 4]), - // &bitsy_parser::Colour { - // red: 0, - // green: 0, - // blue: 0 - // } - // ); - // assert_eq!(output, expected); - // } - + #[test] fn get_palettes() { load_default_game(); From c1c4fca1db2ae1dbee90df59f664b724ec962a1e Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 10:09:04 +0000 Subject: [PATCH 34/64] reset function --- script.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/script.js b/script.js index 28c46e6..82b036d 100644 --- a/script.js +++ b/script.js @@ -239,8 +239,17 @@ async function run() { buttonAddImage.addEventListener("click", addImage); buttonAddImage.addEventListener("touchend", addImage); + // would it be easier just to reload the page? lol function reset() { clear_game(); + // todo clear file inputs + inputBrightness.value = 0; + inputRoomName.value = ""; + selectPalette.innerHTML = ""; + divNewPalette.style.display = "none"; + inputColourBackground.value = "#2f4ac9"; + inputColourForeground.value = "#8798fe"; + checkboxDither.checked = true; } buttonReset.addEventListener("click", reset); From 8a8b861e5d664ff4b9c06fb3abe095698e51b342 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 11:23:17 +0000 Subject: [PATCH 35/64] todo --- TODO.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.md b/TODO.md index 8fed505..682e0e7 100644 --- a/TODO.md +++ b/TODO.md @@ -3,6 +3,8 @@ * tests * if image is exactly 128×128, *don't* crop * tile reuse +* noise reduction (remove lonely pixels) * implement Atkinson and Bayer dithering options * if "create new bitsy game", add new room as room 0 * actually create room +* stats for added room (number of tiles) From 03ce88e0151ea7deb0469e4b7a3bba02aec0fc54 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 11:23:37 +0000 Subject: [PATCH 36/64] descriptive button --- index.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.pug b/index.pug index b8052be..9bc40eb 100644 --- a/index.pug +++ b/index.pug @@ -78,7 +78,7 @@ html(lang="en-gb") br button.pagination.prev#back-to-image previous - button.pagination.next#room-next next + button.pagination.next#room-next add room .page.download h2 download From 63cb971aca9bad8ed68b2bb88587fd773aa753c1 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 11:23:44 +0000 Subject: [PATCH 37/64] whitespace --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index b5a0f46..269ce73 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -313,7 +313,7 @@ mod test { let expected = include_str!("test-resources/test.png.base64").trim(); assert_eq!(output, expected); } - + #[test] fn get_palettes() { load_default_game(); From 512f386c25446e5b863dad41e4a4d923b4c73775 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 12:30:46 +0000 Subject: [PATCH 38/64] first attempt at creating room --- Cargo.toml | 2 +- TODO.md | 1 + src/lib.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 16227c3..0414973 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pixsy" -version = "0.72.5" +version = "0.72.6" description = "convert images to Bitsy rooms" authors = ["Max Bradbury "] edition = "2018" diff --git a/TODO.md b/TODO.md index 682e0e7..0a59acd 100644 --- a/TODO.md +++ b/TODO.md @@ -8,3 +8,4 @@ * if "create new bitsy game", add new room as room 0 * actually create room * stats for added room (number of tiles) +* dedupe "palette from custom colours" functionality diff --git a/src/lib.rs b/src/lib.rs index 269ce73..4d43ac0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -242,18 +242,40 @@ pub fn add_room() -> String { return "No game data loaded".to_string(); } + match &state.palette { + SelectedPalette::None => { return "No palette selected".to_string(); }, + _ => {} + }; + let mut game = state.game.clone().unwrap(); if state.image.is_none() { return "No image loaded".to_string(); } + let palette_id = Some(match &state.palette { + SelectedPalette::None => bitsy_parser::mock::game_default().palettes[0].id.clone(), + SelectedPalette::Existing { id } => id.clone(), + SelectedPalette::New { background, foreground } => { + game.add_palette(bitsy_parser::Palette { + id: "0".to_string(), + name: None, + colours: vec![ + background.clone(), + foreground.clone(), + bitsy_parser::Colour { red: 0, green: 0, blue: 0 } + ], + }) + }, + }); + let width = state.image.as_ref().unwrap().width(); let height = state.image.as_ref().unwrap().height(); let columns = (width as f64 / SD as f64).floor() as u32; let rows = (height as f64 / SD as f64).floor() as u32; - let mut tile_index = 1; + let mut tile_ids = Vec::new(); + let mut new_tile_count: u32 = 0; for column in 0..columns { for row in 0..rows { @@ -271,25 +293,45 @@ pub fn add_room() -> String { let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.room_name, &tile_index), + name: tile_name(&state.room_name, &new_tile_count), wall: None, animation_frames: vec![Image { pixels }], colour_id: None }; - if !game.tiles.contains(&tile) { - game.add_tile(tile.clone()); - - tile_index += 1; - } + tile_ids.push( + if game.tiles.contains(&tile) { + game.tiles.iter().find(|&t| t == &tile).unwrap().id.clone() + } else { + new_tile_count += 1; + game.add_tile(tile.clone()) + } + ); } } + // todo if player selected "create new game", delete room 0 here + + game.add_room(bitsy_parser::Room { + id: "0".to_string(), + palette_id, + name: None, + tiles: tile_ids, + items: vec![], + exits: vec![], + endings: vec![], + walls: None + }); + game.dedupe_tiles(); state.game = Some(game.to_owned()); - "OK".to_string() + format!( + "Added room \"{}\" with {} new tiles", + &state.room_name.as_ref().unwrap_or(&"untitled".to_string()), + new_tile_count + ) } #[wasm_bindgen] From 8c92b05b74fe370dc9c2f6ef04bb5ec99bd362b2 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 14:54:49 +0000 Subject: [PATCH 39/64] generate the dang room --- TODO.md | 3 -- src/lib.rs | 59 +++++++++++++++++------------ src/test-resources/expected.bitsy | 25 ++++++++++-- src/test-resources/test.png | Bin 234 -> 523 bytes src/test-resources/test.png.base64 | 2 +- 5 files changed, 58 insertions(+), 31 deletions(-) diff --git a/TODO.md b/TODO.md index 0a59acd..7f6a639 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,8 @@ # todo -* tests * if image is exactly 128×128, *don't* crop * tile reuse * noise reduction (remove lonely pixels) * implement Atkinson and Bayer dithering options -* if "create new bitsy game", add new room as room 0 -* actually create room * stats for added room (number of tiles) * dedupe "palette from custom colours" functionality diff --git a/src/lib.rs b/src/lib.rs index 4d43ac0..b6c3063 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -269,48 +269,57 @@ pub fn add_room() -> String { }, }); - let width = state.image.as_ref().unwrap().width(); - let height = state.image.as_ref().unwrap().height(); + let foreground = &game.palettes + .iter() + .find(|&palette| &palette.id == palette_id.as_ref().unwrap()) + .unwrap().colours[1].clone(); + + let preview = render_preview(&state); + + let width = 128; + let height = 128; let columns = (width as f64 / SD as f64).floor() as u32; let rows = (height as f64 / SD as f64).floor() as u32; let mut tile_ids = Vec::new(); - let mut new_tile_count: u32 = 0; + let initial_tile_count = game.tiles.len(); - for column in 0..columns { - for row in 0..rows { + for row in 0..rows { + for column in 0..columns { let mut pixels = Vec::with_capacity(64); + fn colour_match(a: &image::Rgb, b: &bitsy_parser::Colour) -> u8 { + if a[0] == b.red && a[1] == b.green && a[2] == b.blue { 1 } else { 0 } + }; + for y in (row * SD)..((row + 1) * SD) { for x in (column * SD)..((column + 1) * SD) { - let pixel = state.image.as_ref().unwrap().get_pixel(x, y).to_rgb(); - let total = pixel[0] as u32 + pixel[1] as u32 + pixel[2] as u32; - // is each channel brighter than 128/255 on average? - pixels.push(if total >= 384 {1} else {0}); + let pixel = preview.get_pixel(x, y).to_rgb(); + pixels.push(colour_match(&pixel, foreground)); } } let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.room_name, &new_tile_count), + name: tile_name(&state.room_name, &(row * column)), wall: None, animation_frames: vec![Image { pixels }], colour_id: None }; - tile_ids.push( - if game.tiles.contains(&tile) { - game.tiles.iter().find(|&t| t == &tile).unwrap().id.clone() - } else { - new_tile_count += 1; - game.add_tile(tile.clone()) - } - ); + let tile_id = if game.tiles.contains(&tile) { + game.tiles.iter().find(|&t| t == &tile).unwrap().id.clone() + } else { + game.add_tile(tile) + }; + + tile_ids.push(tile_id); } } - // todo if player selected "create new game", delete room 0 here + // todo if player selected "create new game", delete room 0 here? + // that would probably break unless the avatar was also placed in the room game.add_room(bitsy_parser::Room { id: "0".to_string(), @@ -325,12 +334,14 @@ pub fn add_room() -> String { game.dedupe_tiles(); + let new_tile_count = game.tiles.len(); + state.game = Some(game.to_owned()); format!( "Added room \"{}\" with {} new tiles", &state.room_name.as_ref().unwrap_or(&"untitled".to_string()), - new_tile_count + new_tile_count - initial_tile_count ) } @@ -376,9 +387,9 @@ mod test { #[test] fn example() { load_default_game(); - load_image(include_str!("test-resources/test.png.base64").to_string()); - add_room(); - - assert_eq!(output(), include_str!("test-resources/expected.bitsy")); + load_image(include_str!("test-resources/test.png.base64").trim().to_string()); + println!("add_room(): {}", add_room()); + // todo what? why are extraneous pixels appearing in the output tiles? + assert_eq!( output(), include_str!("test-resources/expected.bitsy")); } } diff --git a/src/test-resources/expected.bitsy b/src/test-resources/expected.bitsy index 1bbfbd3..6919a0a 100644 --- a/src/test-resources/expected.bitsy +++ b/src/test-resources/expected.bitsy @@ -30,6 +30,25 @@ ROOM 0 NAME example room PAL 0 +ROOM 1 +a,a,1,1,2,2,3,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PAL 0 + TIL a 11111111 10000001 @@ -41,7 +60,7 @@ TIL a 11111111 NAME block -TIL 2 +TIL 1 00011000 00111000 00011000 @@ -51,7 +70,7 @@ TIL 2 00011000 00111100 -TIL 3 +TIL 2 00111100 01100110 01100110 @@ -61,7 +80,7 @@ TIL 3 01100000 01111110 -TIL 4 +TIL 3 00111100 01100110 01100110 diff --git a/src/test-resources/test.png b/src/test-resources/test.png index 63df3da79a050bcecb58acdb9f38760cbe7d0503..0455f0cd3e06cbf59ee2a26ee30af2107f278ece 100644 GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#X#z`%IO)5S5Q zV$R#^7qglT7#sqPfBoM-$2RxIrE42G#NJu@-|7(E>n2-#Zl|t9@*lnbZ?gX1zPJ11 z@xv8&(n{w%&%6C?Kle8I`WU-g-(J)|n{#{4=e*j~IoJ1{yLIv6$udK`%enhE8MUsr zsOnkM_xV<)@d3$oTpQl#H5eYdJ-OOsU(#3BPdBR>j@u=%6+DkmpYv66$ETU!UJ3NQ zdshBi;Pm~T+}mfSCdz;0cwoiUA?z@R;Sq~~dV>Yy5l#g^hQd)HU`W(5+j&&7=D)uo Q42)d{Pgg&ebxsLQ0E0%ktN;K2 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQY^(zo*^7SP{WbZ0pu_Aba4!c zXni}?o3F)y$N90~_x+n9&#qALP}(Wgd}aG0-zl?dq9&wpF#M>kckZoLp7~ej@teiB z-rq2K{*FJE^F+<+Vh^^Hhod&8*Ld}-T}`~(^=Ec&jE3%-fZmB&=Vx4FG%gT%FoA&~ z^TVli3*r`pe|KniFKNjBqNHT-S~6tbN^8zg)6EihQxuh!u10(2~cr>mdKI;Vst0E5t39smFU diff --git a/src/test-resources/test.png.base64 b/src/test-resources/test.png.base64 index 4c542ca..acc6769 100644 --- a/src/test-resources/test.png.base64 +++ b/src/test-resources/test.png.base64 @@ -1 +1 @@ -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAQCAYAAACm53kpAAAAvElEQVR4nO2QQQrDMBAD6/8/upVSBMqClab2IWAP2M1qtgmovcFrgNYa7i96lWdO8nKi7oz6HkcBvWUo3FgKXo7PQpmTvJzy2XNiWgGEM/HM6fmaz54TpwLwiBvhjVnPhDPxzLny5Gpn1FceVcCoJ7/sOKcCKlC4sRS8O87EMyf55Ejy1dU58YgCerm46+ucOArA79/oI/U1ykXy1QntXHlSd9wluHX+52LsAnB2ATjLsgvA2QXgLMvyBXwAjqzoAQg4VfAAAAAASUVORK5CYII= +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAcJJREFUeJzt19FqgzAAQFEz+v+/nD1t2NLWsQgW7jlP2ogVvUYdc865LRhj/C7/7Gr/29678cfDeNxmdZznbtv2vwu2H39cPtr26H/mnNuc8259ZZzXvs7a0dHJdjE+022/sjKFrzh6jKyO89ppM8AZrgqw7C6AMcbbk3s0vmL1BfLZewDHPmIGcOdfZ5z1GbjymfbqEI7u5nf7EMvfjG3bzJVhH/EI4DoCiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHEfQM+SHkFb+/YEwAAAABJRU5ErkJggg== From f9b0f6b6db9c336066819e05c0333bff43511cd0 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 15:30:39 +0000 Subject: [PATCH 40/64] name room and give tiles appropriate names too --- src/lib.rs | 9 +++++---- src/test-resources/expected.bitsy | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b6c3063..390b07b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -302,7 +302,7 @@ pub fn add_room() -> String { let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.room_name, &(row * column)), + name: tile_name(&state.room_name, &((row * SD) + column + 1)), wall: None, animation_frames: vec![Image { pixels }], colour_id: None @@ -324,7 +324,7 @@ pub fn add_room() -> String { game.add_room(bitsy_parser::Room { id: "0".to_string(), palette_id, - name: None, + name: state.room_name.clone(), tiles: tile_ids, items: vec![], exits: vec![], @@ -357,7 +357,7 @@ pub fn output() -> String { #[cfg(test)] mod test { - use crate::{add_room, load_image, load_default_game, output, get_preview}; + use crate::{add_room, load_image, load_default_game, output, get_preview, set_room_name}; #[test] fn image_to_base64() { @@ -388,8 +388,9 @@ mod test { fn example() { load_default_game(); load_image(include_str!("test-resources/test.png.base64").trim().to_string()); + set_room_name("test".to_string()); println!("add_room(): {}", add_room()); // todo what? why are extraneous pixels appearing in the output tiles? - assert_eq!( output(), include_str!("test-resources/expected.bitsy")); + assert_eq!(output(), include_str!("test-resources/expected.bitsy")); } } diff --git a/src/test-resources/expected.bitsy b/src/test-resources/expected.bitsy index 6919a0a..9614757 100644 --- a/src/test-resources/expected.bitsy +++ b/src/test-resources/expected.bitsy @@ -47,6 +47,7 @@ a,a,1,1,2,2,3,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +NAME test PAL 0 TIL a @@ -69,6 +70,7 @@ TIL 1 00011000 00011000 00111100 +NAME test 3 TIL 2 00111100 @@ -79,6 +81,7 @@ TIL 2 00110000 01100000 01111110 +NAME test 5 TIL 3 00111100 @@ -89,6 +92,7 @@ TIL 3 01100110 01100110 00111100 +NAME test 7 SPR A 00011000 From 0ef2d2acd900dc59f27d25dc2440a1309940def2 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 15:31:57 +0000 Subject: [PATCH 41/64] return image size so the client side can determine whether to crop or not --- script.js | 10 +++++++++- src/lib.rs | 9 +++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/script.js b/script.js index 82b036d..f7d74e5 100644 --- a/script.js +++ b/script.js @@ -165,7 +165,15 @@ async function run() { buttonImageProceed.removeAttribute("disabled"); } - cropper.loadImage(e.target.result); + if (load_image(e.target.result) === "128×128") { + // we can't just do `buttonImageProceed.click()` + // because this calls the handleImage() function, which we don't want here + el("page-image").style.display = "none"; + el("page-room").style.display = "block"; + loadPreview(); + } else { + cropper.loadImage(e.target.result); + } }, "image"); }); diff --git a/src/lib.rs b/src/lib.rs index 390b07b..4d133b4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -101,22 +101,23 @@ pub fn load_image(image_base64: String) -> String { Ok(image) => { match image::load_from_memory(image.as_ref()) { Ok(image) => { + let size = format!("{}×{}", image.width(), image.height()); // todo get rid of magic numbers! what about Bitsy HD? let image = image.resize(128, 128, CatmullRom); state.image = Some(image); - "OK" + size }, _ => { state.image = None; - "Couldn't load image" + "Couldn't load image".to_string() } } }, _ => { state.image = None; - "Couldn't decode image" + "Couldn't decode image".to_string() } - }.to_string() + } } #[wasm_bindgen] From e76ff570535992290b083eb2297ea7e4c81ba05c Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 15:32:18 +0000 Subject: [PATCH 42/64] allow auto pagination from image to room --- index.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.pug b/index.pug index 9bc40eb..667da51 100644 --- a/index.pug +++ b/index.pug @@ -35,7 +35,7 @@ html(lang="en-gb") button.pagination.prev previous button.pagination.next#game-data-next(disabled=true) next - .page.image + .page.image#page-image h2 image .image-container @@ -44,7 +44,7 @@ html(lang="en-gb") button.pagination.prev previous button.pagination.next#image-next(disabled=true) next - .page.room + .page.room#page-room h2 room table From 80df4a9a6ad86e4833112e2ac1863a14528514a9 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 15:37:38 +0000 Subject: [PATCH 43/64] better tile names --- src/lib.rs | 6 +++--- src/test-resources/expected.bitsy | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4d133b4..57f6f1b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,9 +49,9 @@ lazy_static! { ); } -fn tile_name(prefix: &Option, index: &u32) -> Option { +fn tile_name(prefix: &Option, x: &u32, y: &u32) -> Option { if let Some(prefix) = prefix { - Some(format!("{} {}", prefix, index)) + Some(format!("{} ({},{})", prefix, x, y)) } else { None } @@ -303,7 +303,7 @@ pub fn add_room() -> String { let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.room_name, &((row * SD) + column + 1)), + name: tile_name(&state.room_name, &row, &column), wall: None, animation_frames: vec![Image { pixels }], colour_id: None diff --git a/src/test-resources/expected.bitsy b/src/test-resources/expected.bitsy index 9614757..93504e1 100644 --- a/src/test-resources/expected.bitsy +++ b/src/test-resources/expected.bitsy @@ -70,7 +70,7 @@ TIL 1 00011000 00011000 00111100 -NAME test 3 +NAME test (0,2) TIL 2 00111100 @@ -81,7 +81,7 @@ TIL 2 00110000 01100000 01111110 -NAME test 5 +NAME test (0,4) TIL 3 00111100 @@ -92,7 +92,7 @@ TIL 3 01100110 01100110 00111100 -NAME test 7 +NAME test (0,6) SPR A 00011000 From 7ff67e51f8190cc5002317e0d37628fe367297e3 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 16:59:04 +0000 Subject: [PATCH 44/64] x,y instead of y,x --- src/lib.rs | 2 +- src/test-resources/expected.bitsy | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 57f6f1b..4f4aa3a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -303,7 +303,7 @@ pub fn add_room() -> String { let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.room_name, &row, &column), + name: tile_name(&state.room_name, &column, &row), wall: None, animation_frames: vec![Image { pixels }], colour_id: None diff --git a/src/test-resources/expected.bitsy b/src/test-resources/expected.bitsy index 93504e1..579845b 100644 --- a/src/test-resources/expected.bitsy +++ b/src/test-resources/expected.bitsy @@ -70,7 +70,7 @@ TIL 1 00011000 00011000 00111100 -NAME test (0,2) +NAME test (2,0) TIL 2 00111100 @@ -81,7 +81,7 @@ TIL 2 00110000 01100000 01111110 -NAME test (0,4) +NAME test (4,0) TIL 3 00111100 @@ -92,7 +92,7 @@ TIL 3 01100110 01100110 00111100 -NAME test (0,6) +NAME test (6,0) SPR A 00011000 From fbe40fb8669f47b9f9066dd48bd2e1e589242fa6 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:33:15 +0000 Subject: [PATCH 45/64] dedupe palette function --- TODO.md | 1 - src/lib.rs | 28 ++++++++++++---------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/TODO.md b/TODO.md index 7f6a639..33f4741 100644 --- a/TODO.md +++ b/TODO.md @@ -5,4 +5,3 @@ * noise reduction (remove lonely pixels) * implement Atkinson and Bayer dithering options * stats for added room (number of tiles) -* dedupe "palette from custom colours" functionality diff --git a/src/lib.rs b/src/lib.rs index 4f4aa3a..41f584c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -185,19 +185,23 @@ fn image_to_base64(image: &DynamicImage) -> String { format!("data:image/png;base64,{}", base64::encode(&bytes)) } +fn palette_from(bg: &bitsy_parser::Colour, fg: &bitsy_parser::Colour) -> bitsy_parser::Palette { + bitsy_parser::Palette { + id: "0".to_string(), + name: None, + colours: vec![ + bg.clone(), fg.clone(), bitsy_parser::Colour { red: 0, green: 0, blue: 0 } + ], + } +} + fn render_preview(state: &State) -> DynamicImage { let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); let palette = match &state.palette { SelectedPalette::None => bitsy_parser::mock::game_default().palettes[0].clone(), SelectedPalette::Existing { id } => state.game.as_ref().unwrap().get_palette(id).unwrap().clone(), - SelectedPalette::New { background, foreground } => bitsy_parser::Palette { - id: "0".to_string(), - name: None, - colours: vec![ - background.clone(), foreground.clone(), bitsy_parser::Colour { red: 0, green: 0, blue: 0 } - ], - }, + SelectedPalette::New { background, foreground } => palette_from(background, foreground), }; let colour_map = crate::ColourMap::from(&palette); @@ -258,15 +262,7 @@ pub fn add_room() -> String { SelectedPalette::None => bitsy_parser::mock::game_default().palettes[0].id.clone(), SelectedPalette::Existing { id } => id.clone(), SelectedPalette::New { background, foreground } => { - game.add_palette(bitsy_parser::Palette { - id: "0".to_string(), - name: None, - colours: vec![ - background.clone(), - foreground.clone(), - bitsy_parser::Colour { red: 0, green: 0, blue: 0 } - ], - }) + game.add_palette(palette_from(background, foreground)) }, }); From 7d274bb3c247f1e515eb78e9eb06274c16ed518e Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:33:39 +0000 Subject: [PATCH 46/64] this function doesn't return anything --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index f7d74e5..73a3d87 100644 --- a/script.js +++ b/script.js @@ -96,7 +96,7 @@ async function run() { } function new_game() { - console.debug(load_default_game()); + load_default_game(); textareaGameDataInput.value = output(); checkGameData(); // we don't need to look at the default game data, so skip ahead to the image page From c2787db422911827320df532d854c84d47f621c3 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:34:48 +0000 Subject: [PATCH 47/64] better load_image errors --- src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 41f584c..674dd4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -95,6 +95,11 @@ pub fn load_image(image_base64: String) -> String { let mut state = STATE.lock().expect("Couldn't lock application state"); let image_base64: Vec<&str> = image_base64.split("base64,").collect(); + + if image_base64.len() < 2 { + return format!("Error: Badly-formatted base64: {}", image_base64.join("")); + } + let image_base64 = image_base64[1]; match base64::decode(image_base64) { @@ -109,13 +114,13 @@ pub fn load_image(image_base64: String) -> String { }, _ => { state.image = None; - "Couldn't load image".to_string() + "Error: Couldn't load image".to_string() } } }, _ => { state.image = None; - "Couldn't decode image".to_string() + "Error: Couldn't decode image".to_string() } } } From e5a87f854ec7a63041cd7979b6b6d8b457b5e0aa Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:35:08 +0000 Subject: [PATCH 48/64] this would break things --- src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 674dd4c..b6178a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -320,9 +320,6 @@ pub fn add_room() -> String { } } - // todo if player selected "create new game", delete room 0 here? - // that would probably break unless the avatar was also placed in the room - game.add_room(bitsy_parser::Room { id: "0".to_string(), palette_id, From 745b18dfc0585cff9b0ad9a7649c3a65f83fc057 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:35:28 +0000 Subject: [PATCH 49/64] styling tweaks --- includes/style.less | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/includes/style.less b/includes/style.less index 333b505..e811bca 100644 --- a/includes/style.less +++ b/includes/style.less @@ -1,6 +1,7 @@ -@background: #fff4d9; -@text: #ec6d7d; -@accent: #a3c4ef; +@background: #57506a; +@page-background: #968eb5; +@accent: #ec6d7d; +@text: #464256; * { box-sizing: border-box; @@ -36,6 +37,10 @@ button { } } +header * { + color: @accent; +} + h1 { margin: 0; } @@ -112,8 +117,8 @@ textarea { height: 80vmin; width: 80vmin; - background-color: @background; - border: 2px solid @accent; + background-color: @page-background; + color: @text; border-radius: 5vmin; box-shadow: @accent 1vmin 1vmin; padding: 5vmin; From f62202cb744f024a5d9b70fe4c84bc8f5417de1a Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:36:00 +0000 Subject: [PATCH 50/64] style header differently --- index.pug | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/index.pug b/index.pug index 667da51..89be170 100644 --- a/index.pug +++ b/index.pug @@ -7,17 +7,18 @@ html(lang="en-gb") link(rel="stylesheet" href="includes/cropper.css") script(src="includes/cropper.min.js") body - h1 - | pixsy - //img(alt="pixsy" src="includes/pixsy.png") - p. - convert images to Bitsy rooms - | - #[a(href="./old/") old version] - | - #[a(href="mailto:max@tinybird.info") email] - | - #[a(href="https://twitter.com/synth_ruiner") twitter] + header + h1 + | pixsy + //img(alt="pixsy" src="includes/pixsy.png") + p. + convert images to Bitsy rooms + | + #[a(href="./old/") old version] + | + #[a(href="mailto:max@tinybird.info") email] + | + #[a(href="https://twitter.com/synth_ruiner") twitter] .pages .page#start button.normal.pagination.next#new create a new bitsy game From bb0b970281ca9b4e2ea74546b300d7f7953a9d4b Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:36:11 +0000 Subject: [PATCH 51/64] bump --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 0414973..3738210 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pixsy" -version = "0.72.6" +version = "0.72.7" description = "convert images to Bitsy rooms" authors = ["Max Bradbury "] edition = "2018" From 458604cd1a0015b3b0880275f3f2fdd117bf6023 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 17:36:24 +0000 Subject: [PATCH 52/64] display number of tiles added --- index.pug | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.pug b/index.pug index 89be170..3b2f7c8 100644 --- a/index.pug +++ b/index.pug @@ -81,6 +81,8 @@ html(lang="en-gb") button.pagination.prev#back-to-image previous button.pagination.next#room-next add room .page.download + p#added + h2 download textarea#output(autocomplete="off") From 6e43249d649a1baffe25d1c7cf5b6a40b3794651 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:06:08 +0000 Subject: [PATCH 53/64] done --- TODO.md | 1 - 1 file changed, 1 deletion(-) diff --git a/TODO.md b/TODO.md index 33f4741..1290e6a 100644 --- a/TODO.md +++ b/TODO.md @@ -4,4 +4,3 @@ * tile reuse * noise reduction (remove lonely pixels) * implement Atkinson and Bayer dithering options -* stats for added room (number of tiles) From afc626bae0803cb7a856ffcda560b003a876c2dc Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:07:26 +0000 Subject: [PATCH 54/64] =?UTF-8?q?undo=20skipping=20crop=20on=20128=C2=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/script.js b/script.js index 73a3d87..035ed15 100644 --- a/script.js +++ b/script.js @@ -165,15 +165,7 @@ async function run() { buttonImageProceed.removeAttribute("disabled"); } - if (load_image(e.target.result) === "128×128") { - // we can't just do `buttonImageProceed.click()` - // because this calls the handleImage() function, which we don't want here - el("page-image").style.display = "none"; - el("page-room").style.display = "block"; - loadPreview(); - } else { - cropper.loadImage(e.target.result); - } + cropper.loadImage(e.target.result); }, "image"); }); From 3b851975d070c610bd789e43f1e770ef835e8270 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:07:42 +0000 Subject: [PATCH 55/64] room stats --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index 035ed15..c4bb506 100644 --- a/script.js +++ b/script.js @@ -216,7 +216,7 @@ async function run() { }); function addRoom() { - console.log(add_room()); + el("added").innerText = add_room(); textareaGameDataOutput.value = output(); } From 3d1129c613dd6403b06dd5e355df9239fb2a5252 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:07:48 +0000 Subject: [PATCH 56/64] log --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index c4bb506..f56d9f1 100644 --- a/script.js +++ b/script.js @@ -174,7 +174,7 @@ async function run() { } function handleImage() { - console.log(load_image(cropper.getCroppedImage())); + console.log("Loading image: " + load_image(cropper.getCroppedImage())); loadPreview(); } From da04534fd92d0070921b823966243b052b15e185 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:45:10 +0000 Subject: [PATCH 57/64] fix crop shit --- includes/cropper.css | 122 -------------------- includes/cropper.min.js | 1 - includes/croppie.css | 250 ++++++++++++++++++++++++++++++++++++++++ includes/croppie.min.js | 1 + index.pug | 6 +- script.js | 36 ++++-- 6 files changed, 279 insertions(+), 137 deletions(-) delete mode 100644 includes/cropper.css delete mode 100644 includes/cropper.min.js create mode 100644 includes/croppie.css create mode 100644 includes/croppie.min.js diff --git a/includes/cropper.css b/includes/cropper.css deleted file mode 100644 index c0222d8..0000000 --- a/includes/cropper.css +++ /dev/null @@ -1,122 +0,0 @@ -.slider[type='range'] { - -webkit-appearance: none; - margin: 9px 0; - width: 100% -} - -.slider[type='range']:focus { - outline: 0 -} - -.slider[type='range']::-webkit-slider-runnable-track { - cursor: pointer; - height: 5px; - width: 100%; - background: #008ecc; - border: none -} - -.slider[type='range']::-webkit-slider-thumb { - background: #fff; - border: 1px solid #e0e0e0; - border-radius: 50%; - box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); - cursor: pointer; - height: 18px; - width: 18px; - -webkit-appearance: none; - margin-top: -6.5px -} - -.slider[type='range']::-moz-range-track { - cursor: pointer; - height: 5px; - width: 100%; - background: #008ecc; - border: none -} - -.slider[type='range']::-moz-range-thumb { - background: #fff; - border: 1px solid #e0e0e0; - border-radius: 50%; - box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); - cursor: pointer; - height: 18px; - width: 18px -} - -.slider[type='range']::-ms-track { - cursor: pointer; - height: 5px; - width: 100%; - background: transparent; - border-color: transparent; - border-width: 9px 0; - color: transparent -} - -.slider[type='range']::-ms-fill-lower { - background: #008ecc; - border: none -} - -.slider[type='range']::-ms-fill-upper { - background: #008ecc; - border: none -} - -.slider[type='range']::-ms-thumb { - background: #fff; - border: 1px solid #e0e0e0; - border-radius: 50%; - box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); - cursor: pointer; - height: 18px; - width: 18px; - margin-top: 0 -} - - -.cropper { - display: inline-block -} - -.cropper canvas { - border-radius: 3px -} - -.cropper canvas:hover { - cursor: move -} - -.cropper-tools { - margin-top: 15px; - text-align: center -} - -.cropper-zoom { - display: inline-block -} - -.cropper-zoom .slider { - margin: 0 10px; - width: 225px -} - -.cropper-zoom .icon { - margin-top: 2px; - font-size: 18px -} - -.cropper-zoom .icon:last-child { - font-size: 24px -} - -.cropper .icon { - display: inline-block; - width: 1em; - height: 1em; - fill: rgba(0, 0, 0, .54); - vertical-align: middle; -} \ No newline at end of file diff --git a/includes/cropper.min.js b/includes/cropper.min.js deleted file mode 100644 index 4a08f11..0000000 --- a/includes/cropper.min.js +++ /dev/null @@ -1 +0,0 @@ -var Cropper=function(){"use strict";function t(t){if(!t)throw Error("Node is not passed or invalid selector.");var e=t;if("string"==typeof e&&!(e=document.querySelector(t)))throw Error("Invalid selector.");if(!(e instanceof window.HTMLElement))throw Error("Node should be instance of window.HTMLElement or valid selector string.");return e}function e(t){if(!t)throw Error("Config is not passed or invalid.");if("[object Object]"!==Object.prototype.toString.call(t))throw Error("Invalid config.")}function n(t){if(!t&&0!==t)throw Error("Dimension is not passed or invalid.");if("number"!=typeof t)throw Error("Invalid dimension.");if(!isFinite(t))throw Error("Invalid dimension.");if(t<0)throw Error("Invalid dimension.");return t}function i(t){if(void 0===t)return function(){};if(!t||"function"!=typeof t)throw Error("Invalid callback.");return t}function r(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}var o={width:560,height:340},s={cutout:{fill:"rgba(0, 0, 0, 0.3)"},pattern:{size:16,fill1:"rgb(215, 215, 215)",fill2:"rgb(250, 250, 250)"}},a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;h(this,t),this.width=e,this.height=n},d=function(){function t(e){if(h(this,t),this._node=e,!e||"string"==typeof e){if("svg"===e||"use"===e)return void(this._node=document.createElementNS("http://www.w3.org/2000/svg",e));this._node=document.createElement(e||"div")}}return u(t,[{key:"render",value:function(t){if(!t)throw Error("Parent node are not passed.");return t.appendChild(this._node),this}},{key:"setWidth",value:function(t){return this._node.width=t,this}},{key:"setHeight",value:function(t){return this._node.height=t,this}},{key:"getSize",value:function(){return new _(this._node.width,this._node.height)}},{key:"getNode",value:function(){return this._node}},{key:"getContext2d",value:function(){return this._node.getContext("2d")}},{key:"setType",value:function(t){return this._node.type=t,this}},{key:"addClass",value:function(t){return this._node.className+=this._node.className.length>1?" "+t:t,this}},{key:"setAttribute",value:function(t,e){return this._node.setAttribute(t,e),this}}]),t}(),g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},v=function(t,e){return e={exports:{}},t(e,e.exports),e.exports}(function(t,e){!function(e,n){t.exports=function(){function t(t){var e=void 0===t?"undefined":a(t);return null!==t&&("object"===e||"function"===e)}function e(t){return"function"==typeof t}function n(t){F=t}function i(t){W=t}function o(){return void 0!==D?function(){D(h)}:s()}function s(){var t=setTimeout;return function(){return t(h,1)}}function h(){for(var t=0;tn?e:n;return this._scale=this._originScale=i,this._scale}},{key:"getSize",value:function(){var t=this.getNode().width*this._scale,e=this.getNode().height*this._scale;return new _(t,e)}},{key:"setZoom",value:function(t){return this._zoom=t,this._scale=this._originScale+this._originScale*t,this}},{key:"getZoom",value:function(){return this._zoom}},{key:"getScale",value:function(){return this._scale}},{key:"getOriginScale",value:function(){return this._originScale}},{key:"_checkFormat",value:function(){return this.getNode().width>this.getNode().height?"landscape":this.getNode().width0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;h(this,t),this.x=e,this.y=n},b=function(){function t(){h(this,t),this._size=0,this._origin={x:0,y:0}}return u(t,[{key:"update",value:function(t){return this._size=t.width>t.height?.85*t.height:.85*t.width,this._origin={x:(t.width-this._size)/2,y:(t.height-this._size)/2},this}},{key:"getRect",value:function(){return{origin:new w(this._origin.x,this._origin.y),size:new _(this._size,this._size)}}},{key:"getMinX",value:function(){return this._origin.x}},{key:"getMaxX",value:function(){return this._origin.x+this._size}},{key:"getMidX",value:function(){return this._origin.x+this._size/2}},{key:"getMinY",value:function(){return this._origin.y}},{key:"getMaxY",value:function(){return this._origin.y+this._size}},{key:"getMidY",value:function(){return this._origin.y+this._size/2}}]),t}(),k=function(){function t(e,n){h(this,t),this._frame=e,this._canvas=n,this._context=new m(this._canvas.getNode().getContext("2d"))}return u(t,[{key:"draw",value:function(){return this._context.fillStyle(s.cutout.fill),this._context.beginPath(),this._context.rect(0,0,this._canvas.getNode().width,this._canvas.getNode().height),this._context.moveTo(this._frame.getMinX(),this._frame.getMinY()),this._context.lineTo(this._frame.getMinX(),this._frame.getMaxY()),this._context.lineTo(this._frame.getMaxX(),this._frame.getMaxY()),this._context.lineTo(this._frame.getMaxX(),this._frame.getMinY()),this._context.closePath(),this._context.fill(),this}}]),t}(),x=function(t){function e(t,n){h(this,e);var i=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"canvas"));return i._frame=t,i._canvas=n,i._context=new m(i._node.getContext("2d")),i}return l(e,t),u(e,[{key:"toDataURL",value:function(){return this.setWidth(this._frame.getRect().size.width),this.setHeight(this._frame.getRect().size.height),this._context.drawImage(this._canvas.getNode(),this._frame.getMinX(),this._frame.getMinY(),this._frame.getRect().size.width,this._frame.getRect().size.height,0,0,this._frame.getRect().size.width,this._frame.getRect().size.height),this.getNode().toDataURL()}}]),e}(d),P=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new d(document.body);h(this,t),this._element=e,this._parent=n,this._onMoveCallback=function(){},this._onPressCallback=function(){},this._onReleaseCallback=function(){},this._onReleaseHandler=this.onReleaseHandler.bind(this),this._onPressHandler=this.onPressHandler.bind(this),this._onMoveHandler=this.onMoveHandler.bind(this)}return u(t,[{key:"onMove",value:function(t){this._onMoveCallback=t}},{key:"onPress",value:function(t){this._onPressCallback=t}},{key:"onRelease",value:function(t){this._onReleaseCallback=t}},{key:"init",value:function(){this._element.getNode().addEventListener("mousedown",this._onPressHandler,!1),this._element.getNode().addEventListener("touchstart",this._onPressHandler,!1),this._parent.getNode().addEventListener("mouseup",this._onReleaseHandler,!1),this._parent.getNode().addEventListener("touchend",this._onReleaseHandler,!1)}},{key:"onMoveHandler",value:function(t){this._onMoveCallback(this._getEventPoint(t))}},{key:"onPressHandler",value:function(t){this._parent.getNode().addEventListener("mousemove",this._onMoveHandler,!1),this._parent.getNode().addEventListener("touchmove",this._onMoveHandler,!1),this._onPressCallback(this._getEventPoint(t))}},{key:"onReleaseHandler",value:function(t){this._parent.getNode().removeEventListener("mousemove",this._onMoveHandler,!1),this._parent.getNode().removeEventListener("touchmove",this._onMoveHandler,!1),this._onReleaseCallback(this._getEventPoint(t))}},{key:"_convertCoordinates",value:function(t){var e=this._element.getNode().getBoundingClientRect(),n=t.x-e.left*(this._element.getNode().width/e.width),i=t.y-e.top*(this._element.getNode().height/e.height);return new w(n,i)}},{key:"_getEventPoint",value:function(t){var e=t.clientX||t.touches[0].clientX,n=t.clientY||t.touches[0].clientY;return this._convertCoordinates(new w(e,n))}}]),t}(),C=function(t){function e(){h(this,e);var t=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"canvas"));return t._context=new m(t._node.getContext("2d")),t._image=new y,t._pattern=new p,t._frame=new b,t._cutout=new k(t._frame,t),t._generator=new x(t._frame,t),t._moveEventListener=new P(t),t._lastPoint=new w(0,0),t._basePoint=new w(0,0),t._onChangeCallback=function(){},t}return l(e,t),u(e,[{key:"render",value:function(t){var n=this;return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"render",this).call(this,t),this._drawBackground(),this._moveEventListener.init(),this._moveEventListener.onPress(function(t){n._lastPoint=t}),this._moveEventListener.onMove(function(t){n._drawImage(t)}),this}},{key:"setWidth",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setWidth",this).call(this,t),this._frame.update(this.getNode()),this}},{key:"setHeight",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setHeight",this).call(this,t),this._frame.update(this.getNode()),this}},{key:"setImage",value:function(t){return this._resetPoints(),this._image=t,this._image.scaleToFit(this._frame),this}},{key:"draw",value:function(){return this._drawImage(this._centerImagePoint()),this}},{key:"redraw",value:function(){return this._resetPoints(),this._image.scaleToFit(this._frame),this.draw(),this}},{key:"clear",value:function(){return this._context.clearRect(0,0,this.getNode().width,this.getNode().height),this}},{key:"toDataURL",value:function(){return this._generator.toDataURL()}},{key:"setZoom",value:function(t){var e=this._image.getSize();this._image.setZoom(t);var n=this._image.getSize(),i=this._lastPoint.x-(n.width-e.width)/2,r=this._lastPoint.y-(n.height-e.height)/2;return this._drawImage(new w(i,r)),this}},{key:"onChange",value:function(t){this._onChangeCallback=t}},{key:"getData",value:function(){return{origin:{x:(this._frame.getMinX()-this._basePoint.x)/this._image.getScale(),y:(this._frame.getMinY()-this._basePoint.y)/this._image.getScale()},size:{width:this._frame.getRect().size.width/this._image.getScale(),height:this._frame.getRect().size.width/this._image.getScale()}}}},{key:"setData",value:function(t){var e=this._frame.getRect().size.width/t.size.width,n=(e-this._image.getOriginScale())/this._image.getOriginScale();this.setZoom(n);var i=this._frame.getMinX()-t.origin.x*this._image.getScale(),r=this._frame.getMinY()-t.origin.y*this._image.getScale(),o=new w(i,r);return this._resetPoints(),this._drawImage(o),{origin:o,zoom:n}}},{key:"_resetPoints",value:function(){return this._lastPoint=new w(0,0),this._basePoint=new w(0,0),this}},{key:"_centerImagePoint",value:function(){var t=this._frame.getMidX()-this._image.getSize().width/2,e=this._frame.getMidY()-this._image.getSize().height/2;return new w(t,e)}},{key:"_validatePoint",value:function(t){var e=t;return this._image.getSize().widththis._frame.getMinX()?e.x=this._frame.getMinX():t.x+this._image.getSize().widththis._frame.getMinY()?e.y=this._frame.getMinY():t.y+this._image.getSize().height0&&void 0!==arguments[0]?arguments[0]:new w(0,0);this.clear(),this._drawBackground();var e=this._basePoint.x+(t.x-this._lastPoint.x),n=this._basePoint.y+(t.y-this._lastPoint.y);return this._basePoint=this._validatePoint(new w(e,n)),this._lastPoint=t,this._context.drawImage(this._image.getNode(),this._basePoint.x,this._basePoint.y,this._image.getSize().width,this._image.getSize().height),this._cutout.draw(),this._onChangeCallback(this),this}},{key:"_drawBackground",value:function(){var t=this._context.createPattern(this._pattern.getNode(),"repeat");return this._context.rect(0,0,this.getNode().width,this.getNode().height),this._context.fillStyle(t),this._context.fill(),this}}]),e}(d),S=function(t){function e(){h(this,e);var t=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"input"));return t.setType("range"),t.addClass("slider"),t.setAttribute("min",0),t.setAttribute("max",100),t.setAttribute("value",0),t._onChangeCallback=function(){},t._onChangeHandler=t._onChange.bind(t),t}return l(e,t),u(e,[{key:"onChange",value:function(t){return this._onChangeCallback=t,this.getNode().addEventListener("change",this._onChangeHandler,!1),this.getNode().addEventListener("input",this._onChangeHandler,!1),this}},{key:"setValue",value:function(t){return this.getNode().value=t,this}},{key:"_onChange",value:function(){this._onChangeCallback(Number(this.getNode().value))}}]),e}(d),N=function(t){function e(t){h(this,e);var n=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"svg"));return n.setAttribute("class","icon icon-"+t),n._use=new d("use"),n._use.getNode().setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","#icon-"+t),n._use.render(n.getNode()),n}return l(e,t),e}(d);return function(){function r(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h(this,r),e(t),this._canvas=new C,this._image=new y,this._slider=new S,this.setWidth(t.width||o.width),this.setHeight(t.height||o.height),this._onInitCallback=i(t.onInit),this._onChangeCallback=i(t.onChange)}return u(r,[{key:"render",value:function(e){var n=this;this._node=t(e);var i=new d;i.addClass("cropper"),i.render(this._node),this._canvas.render(i.getNode());var r=new d;r.addClass("cropper-tools"),r.render(i.getNode());var o=new d;o.addClass("cropper-zoom"),o.render(r.getNode());var s=new N("frame-landscape"),a=new N("frame-landscape");return s.render(o.getNode()),this._slider.render(o.getNode()),this._slider.onChange(function(t){n._canvas.setZoom(t/100)}),a.render(o.getNode()),this._onInitCallback(this),this._canvas.onChange(function(){n._onChangeCallback(n)}),this}},{key:"setWidth",value:function(t){try{n(t)}catch(t){throw Error("Width property: "+t.message)}return this._canvas.setWidth(t),this._canvas.redraw(),this}},{key:"setHeight",value:function(t){try{n(t)}catch(t){throw Error("Height property: "+t.message)}return this._canvas.setHeight(t),this._canvas.redraw(),this}},{key:"loadImage",value:function(t){var e=this;if(!t)throw Error("Image url or path is not passed.");if("string"!=typeof t)throw Error("Invalid url or path.");return this._image.load(t).then(function(t){return e._canvas.setImage(t),e._canvas.draw(),e._slider.setValue(0),e})}},{key:"getCroppedImage",value:function(){return this._canvas.toDataURL()}},{key:"setZoom",value:function(t){try{n(t)}catch(t){throw Error("Zoom property: "+t.message)}return this._canvas.setZoom(t),this._slider.setValue(100*t),this}},{key:"reset",value:function(){return this.setZoom(0),this._canvas.redraw(),this}},{key:"getData",value:function(){return this._canvas.getData()}},{key:"setData",value:function(t){var e=this._canvas.setData(t),n=e.zoom;return this._slider.setValue(100*n),this}}]),r}()}(); diff --git a/includes/croppie.css b/includes/croppie.css new file mode 100644 index 0000000..0af2e2c --- /dev/null +++ b/includes/croppie.css @@ -0,0 +1,250 @@ +.croppie-container { + width: 100%; + height: 100%; +} + +.croppie-container .cr-image { + z-index: -1; + position: absolute; + top: 0; + left: 0; + transform-origin: 0 0; + max-height: none; + max-width: none; +} + +.croppie-container .cr-boundary { + position: relative; + overflow: hidden; + margin: 0 auto; + z-index: 1; + width: 100%; + height: 100%; +} + +.croppie-container .cr-viewport, +.croppie-container .cr-resizer { + position: absolute; + border: 2px solid #fff; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); + z-index: 0; +} + +.croppie-container .cr-resizer { + z-index: 2; + box-shadow: none; + pointer-events: none; +} + +.croppie-container .cr-resizer-vertical, +.croppie-container .cr-resizer-horisontal { + position: absolute; + pointer-events: all; +} + +.croppie-container .cr-resizer-vertical::after, +.croppie-container .cr-resizer-horisontal::after { + display: block; + position: absolute; + box-sizing: border-box; + border: 1px solid black; + background: #fff; + width: 10px; + height: 10px; + content: ''; +} + +.croppie-container .cr-resizer-vertical { + bottom: -5px; + cursor: row-resize; + width: 100%; + height: 10px; +} + +.croppie-container .cr-resizer-vertical::after { + left: 50%; + margin-left: -5px; +} + +.croppie-container .cr-resizer-horisontal { + right: -5px; + cursor: col-resize; + width: 10px; + height: 100%; +} + +.croppie-container .cr-resizer-horisontal::after { + top: 50%; + margin-top: -5px; +} + +.croppie-container .cr-original-image { + display: none; +} + +.croppie-container .cr-vp-circle { + border-radius: 50%; +} + +.croppie-container .cr-overlay { + z-index: 1; + position: absolute; + cursor: move; + touch-action: none; +} + +.croppie-container .cr-slider-wrap { + width: 75%; + margin: 15px auto; + text-align: center; +} + +.croppie-result { + position: relative; + overflow: hidden; +} + +.croppie-result img { + position: absolute; +} + +.croppie-container .cr-image, +.croppie-container .cr-overlay, +.croppie-container .cr-viewport { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} + +/*************************************/ +/***** STYLING RANGE INPUT ***********/ +/*************************************/ +/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ +/*************************************/ + +.cr-slider { + -webkit-appearance: none; +/*removes default webkit styles*/ + /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ + width: 300px; +/*required for proper track sizing in FF*/ + max-width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background-color: transparent; +} + +.cr-slider::-webkit-slider-runnable-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +.cr-slider:focus { + outline: none; +} +/* +.cr-slider:focus::-webkit-slider-runnable-track { +background: #ccc; +} +*/ + +.cr-slider::-moz-range-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +/*hide the outline behind the border*/ +.cr-slider:-moz-focusring { + outline: 1px solid white; + outline-offset: -1px; +} + +.cr-slider::-ms-track { + width: 100%; + height: 5px; + background: transparent; +/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ + border-width: 6px 0; + color: transparent;/*remove default tick marks*/ +} +.cr-slider::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top:1px; +} +.cr-slider:focus::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); +} +.cr-slider:focus::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); +} +/*******************************************/ + +/***********************************/ +/* Rotation Tools */ +/***********************************/ +.cr-rotate-controls { + position: absolute; + bottom: 5px; + left: 5px; + z-index: 1; +} +.cr-rotate-controls button { + border: 0; + background: none; +} +.cr-rotate-controls i:before { + display: inline-block; + font-style: normal; + font-weight: 900; + font-size: 22px; +} +.cr-rotate-l i:before { + content: '↺'; +} +.cr-rotate-r i:before { + content: '↻'; +} diff --git a/includes/croppie.min.js b/includes/croppie.min.js new file mode 100644 index 0000000..1223fd2 --- /dev/null +++ b/includes/croppie.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports&&"string"!=typeof exports.nodeName?module.exports=t():e.Croppie=t()}("undefined"!=typeof self?self:this,function(){"function"!=typeof Promise&&function(e){function n(e,t){return function(){e.apply(t,arguments)}}function r(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],u(e,n(i,this),n(o,this))}function a(n){var i=this;return null===this._state?void this._deferreds.push(n):void c(function(){var e=i._state?n.onFulfilled:n.onRejected;if(null!==e){var t;try{t=e(i._value)}catch(e){return void n.reject(e)}n.resolve(t)}else(i._state?n.resolve:n.reject)(i._value)})}function i(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void u(n(t,e),n(i,this),n(o,this))}this._state=!0,this._value=e,s.call(this)}catch(e){o.call(this,e)}}function o(e){this._state=!1,this._value=e,s.call(this)}function s(){for(var e=0,t=this._deferreds.length;en.top+t&&l.bottomn.left+e&&l.right=s.maxX&&(o.x=l.minX,n.x=s.maxX),n.x<=s.minX&&(o.x=l.maxX,n.x=s.minX),n.y>=s.maxY&&(o.y=l.minY,n.y=s.maxY),n.y<=s.minY&&(o.y=l.maxY,n.y=s.minY)}r(),I.call(t),F.call(t)}).call(i,{value:parseFloat(t.value),origin:new L(i.elements.preview),viewportRect:i.elements.viewport.getBoundingClientRect(),transform:E.parse(i.elements.preview)})}function n(e){var t,n;if("ctrl"===i.options.mouseWheelZoom&&!0!==e.ctrlKey)return 0;t=e.wheelDelta?e.wheelDelta/1200:e.deltaY?e.deltaY/1060:e.detail?e.detail/-60:0,n=i._currentZoom+t*i._currentZoom,e.preventDefault(),B.call(i,n),o.call(i)}x(e,"cr-slider-wrap"),x(t,"cr-slider"),t.type="range",t.step="0.0001",t.value="1",t.style.display=i.options.showZoomer?"":"none",t.setAttribute("aria-label","zoom"),i.element.appendChild(e),e.appendChild(t),i._currentZoom=1,i.elements.zoomer.addEventListener("input",o),i.elements.zoomer.addEventListener("change",o),i.options.mouseWheelZoom&&(i.elements.boundary.addEventListener("mousewheel",n),i.elements.boundary.addEventListener("DOMMouseScroll",n))}.call(a),a.options.enableResize&&function(){var l,u,c,h,p,e,t,d=this,m=document.createElement("div"),i=!1,f=50;x(m,"cr-resizer"),b(m,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(x(e=document.createElement("div"),"cr-resizer-vertical"),m.appendChild(e));this.options.resizeControls.width&&(x(t=document.createElement("div"),"cr-resizer-horisontal"),m.appendChild(t));function n(e){if((void 0===e.button||0===e.button)&&(e.preventDefault(),!i)){var t=d.elements.overlay.getBoundingClientRect();if(i=!0,u=e.pageX,c=e.pageY,l=-1!==e.currentTarget.className.indexOf("vertical")?"v":"h",h=t.width,p=t.height,e.touches){var n=e.touches[0];u=n.pageX,c=n.pageY}window.addEventListener("mousemove",o),window.addEventListener("touchmove",o),window.addEventListener("mouseup",r),window.addEventListener("touchend",r),document.body.style[w]="none"}}function o(e){var t=e.pageX,n=e.pageY;if(e.preventDefault(),e.touches){var i=e.touches[0];t=i.pageX,n=i.pageY}var o=t-u,r=n-c,a=d.options.viewport.height+r,s=d.options.viewport.width+o;"v"===l&&f<=a&&a<=p?(b(m,{height:a+"px"}),d.options.boundary.height+=r,b(d.elements.boundary,{height:d.options.boundary.height+"px"}),d.options.viewport.height+=r,b(d.elements.viewport,{height:d.options.viewport.height+"px"})):"h"===l&&f<=s&&s<=h&&(b(m,{width:s+"px"}),d.options.boundary.width+=o,b(d.elements.boundary,{width:d.options.boundary.width+"px"}),d.options.viewport.width+=o,b(d.elements.viewport,{width:d.options.viewport.width+"px"})),z.call(d),W.call(d),Z.call(d),F.call(d),c=n,u=t}function r(){i=!1,window.removeEventListener("mousemove",o),window.removeEventListener("touchmove",o),window.removeEventListener("mouseup",r),window.removeEventListener("touchend",r),document.body.style[w]=""}e&&(e.addEventListener("mousedown",n),e.addEventListener("touchstart",n));t&&(t.addEventListener("mousedown",n),t.addEventListener("touchstart",n));this.elements.boundary.appendChild(m)}.call(a)}function R(){return this.options.enableExif&&window.EXIF}function B(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=A(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function Z(e){var t=this,n=t._currentZoom,i=t.elements.preview.getBoundingClientRect(),o=t.elements.viewport.getBoundingClientRect(),r=E.parse(t.elements.preview.style[g]),a=new L(t.elements.preview),s=o.top-i.top+o.height/2,l=o.left-i.left+o.width/2,u={},c={};if(e){var h=a.x,p=a.y,d=r.x,m=r.y;u.y=h,u.x=p,r.y=d,r.x=m}else u.y=s/n,u.x=l/n,c.y=(u.y-a.y)*(1-n),c.x=(u.x-a.x)*(1-n),r.x-=c.x,r.y-=c.y;var f={};f[v]=u.x+"px "+u.y+"px",f[g]=r.toString(),b(t.elements.preview,f)}function z(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();b(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}L.prototype.toString=function(){return this.x+"px "+this.y+"px"};var a,s,h,M,I=(a=z,s=500,function(){var e=this,t=arguments,n=h&&!M;clearTimeout(M),M=setTimeout(function(){M=null,h||a.apply(e,t)},s),n&&a.apply(e,t)});function F(){var e,t=this,n=t.get();X.call(t)&&(t.options.update.call(t,n),t.$&&"undefined"==typeof Prototype?t.$(t.element).trigger("update.croppie",n):(window.CustomEvent?e=new CustomEvent("update",{detail:n}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,n),t.element.dispatchEvent(e)))}function X(){return 0l.max)?B.call(r,uthis._originalImageWidth&&(g=(d=this._originalImageWidth-h)/o*u),i<0&&(p=0,v=Math.abs(i)/r*c),m+p>this._originalImageHeight&&(w=(m=this._originalImageHeight-p)/r*c),l.drawImage(this.elements.preview,h,p,d,m,f,v,g,w),a&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function k(c,h){var e,i,o,r,p=this,d=[],t=null,n=R.call(p);if("string"==typeof c)e=c,c={};else if(Array.isArray(c))d=c.slice();else{if(void 0===c&&p.data.url)return Y.call(p),F.call(p),null;e=c.url,d=c.points||[],t=void 0===c.zoom?null:c.zoom}return p.data.bound=!1,p.data.url=e||p.data.url,p.data.boundZoom=t,(i=e,o=n,r=new Image,r.style.opacity="0",new Promise(function(e,t){function n(){r.style.opacity="1",setTimeout(function(){e(r)},1)}r.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&r.setAttribute("crossOrigin","anonymous"),r.onload=function(){o?EXIF.getData(r,function(){n()}):n()},r.onerror=function(e){r.style.opacity=1,setTimeout(function(){t(e)},1)},r.src=i})).then(function(e){if(function(t){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,function(e){t.classList.add(e)}),this.elements.img.parentNode.replaceChild(t,this.elements.img),this.elements.preview=t),this.elements.img=t}.call(p,e),d.length)p.options.relative&&(d=[d[0]*e.naturalWidth/100,d[1]*e.naturalHeight/100,d[2]*e.naturalWidth/100,d[3]*e.naturalHeight/100]);else{var t,n,i=m(e),o=p.elements.viewport.getBoundingClientRect(),r=o.width/o.height;r { + console.log("Loading image: " + load_image(result)); + + el("page-image").style.display = "none"; + el("page-room" ).style.display = "block"; + + loadPreview(); + }); } buttonImageProceed.addEventListener("click", handleImage); From b3690c4dd7e45d443a2278c14c3adc0e56978d24 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:46:58 +0000 Subject: [PATCH 58/64] black and white palette --- script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script.js b/script.js index fc22e0f..f25a16e 100644 --- a/script.js +++ b/script.js @@ -167,7 +167,7 @@ async function run() { el('image').addEventListener('change', function () { readFile(this, function (e) { - croppie.bind({url: e.target.result}); + croppie.bind({url: e.target.result, zoom: 0}); divCroppie.style.display = "block"; buttonImageProceed.removeAttribute("disabled"); }, "image"); @@ -261,8 +261,8 @@ async function run() { inputRoomName.value = ""; selectPalette.innerHTML = ""; divNewPalette.style.display = "none"; - inputColourBackground.value = "#2f4ac9"; - inputColourForeground.value = "#8798fe"; + inputColourBackground.value = "#000"; + inputColourForeground.value = "#fff"; checkboxDither.checked = true; } From 055928eb7b9daeacaf08f0276e6ee254a4624224 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:48:04 +0000 Subject: [PATCH 59/64] todo --- TODO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 1290e6a..7e5744d 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,6 @@ # todo -* if image is exactly 128×128, *don't* crop * tile reuse * noise reduction (remove lonely pixels) * implement Atkinson and Bayer dithering options +* fix weird problem with pixels flipping (see test::example) From b478b1e3ee537470a8b553664770fb09fbb8ffc0 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:50:42 +0000 Subject: [PATCH 60/64] update deploy script --- deploy.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deploy.sh b/deploy.sh index b21127a..287e21a 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,7 +1,6 @@ #! /usr/bin/env bash -./build.sh rm -rf dist mkdir dist -cp -r README.md LICENSE index.html script.js background.png pkg includes dist +cp -r README.md LICENSE index.html script.js pkg includes dist # butler push dist ruin/pixsy:html From 6f8e00130c05e7a67ea887bb0da4e906b1fd14c6 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:50:55 +0000 Subject: [PATCH 61/64] update deploy script --- deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index 287e21a..6b65b74 100644 --- a/deploy.sh +++ b/deploy.sh @@ -3,4 +3,4 @@ rm -rf dist mkdir dist cp -r README.md LICENSE index.html script.js pkg includes dist -# butler push dist ruin/pixsy:html +butler push dist ruin/pixsy:html From 2d73963aa09ab9327f2139da3b2a3f49fe0155a2 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:52:29 +0000 Subject: [PATCH 62/64] black and white palette --- index.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.pug b/index.pug index faa3dc3..6986682 100644 --- a/index.pug +++ b/index.pug @@ -69,9 +69,9 @@ html(lang="en-gb") #new-palette(style="display: none;") .half - input#colour-background(type="color" value="#2f4ac9") + input#colour-background(type="color" value="#000") .half - input#colour-foreground(type="color" value="#8798fe") + input#colour-foreground(type="color" value="#fff") label input#dither(type="checkbox" checked=true) From f6308110be7e50e5f8b1baa4141b2cace60e29b0 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 20:53:52 +0000 Subject: [PATCH 63/64] try again --- index.pug | 4 ++-- script.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/index.pug b/index.pug index 6986682..7d0164f 100644 --- a/index.pug +++ b/index.pug @@ -69,9 +69,9 @@ html(lang="en-gb") #new-palette(style="display: none;") .half - input#colour-background(type="color" value="#000") + input#colour-background(type="color" value="#000000") .half - input#colour-foreground(type="color" value="#fff") + input#colour-foreground(type="color" value="#ffffff") label input#dither(type="checkbox" checked=true) diff --git a/script.js b/script.js index f25a16e..ed11d6e 100644 --- a/script.js +++ b/script.js @@ -261,8 +261,8 @@ async function run() { inputRoomName.value = ""; selectPalette.innerHTML = ""; divNewPalette.style.display = "none"; - inputColourBackground.value = "#000"; - inputColourForeground.value = "#fff"; + inputColourBackground.value = "#000000"; + inputColourForeground.value = "#ffffff"; checkboxDither.checked = true; } From 3e7d6eeaa51454ec19c9600ad7027b66883850f9 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sun, 8 Nov 2020 21:18:51 +0000 Subject: [PATCH 64/64] include old version --- deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index 6b65b74..4ee7b5d 100644 --- a/deploy.sh +++ b/deploy.sh @@ -2,5 +2,5 @@ rm -rf dist mkdir dist -cp -r README.md LICENSE index.html script.js pkg includes dist +cp -r README.md LICENSE index.html script.js pkg includes old dist butler push dist ruin/pixsy:html
  • q4~T`%0`A@Qjs-OC0=*xj_a1uhsrO!bKUVL@ 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 X&bh#gq^2D=Usf57(*6{N^-}*o{XiDd diff --git a/includes/croppie.css b/includes/croppie.css deleted file mode 100644 index 0af2e2c..0000000 --- a/includes/croppie.css +++ /dev/null @@ -1,250 +0,0 @@ -.croppie-container { - width: 100%; - height: 100%; -} - -.croppie-container .cr-image { - z-index: -1; - position: absolute; - top: 0; - left: 0; - transform-origin: 0 0; - max-height: none; - max-width: none; -} - -.croppie-container .cr-boundary { - position: relative; - overflow: hidden; - margin: 0 auto; - z-index: 1; - width: 100%; - height: 100%; -} - -.croppie-container .cr-viewport, -.croppie-container .cr-resizer { - position: absolute; - border: 2px solid #fff; - margin: auto; - top: 0; - bottom: 0; - right: 0; - left: 0; - box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); - z-index: 0; -} - -.croppie-container .cr-resizer { - z-index: 2; - box-shadow: none; - pointer-events: none; -} - -.croppie-container .cr-resizer-vertical, -.croppie-container .cr-resizer-horisontal { - position: absolute; - pointer-events: all; -} - -.croppie-container .cr-resizer-vertical::after, -.croppie-container .cr-resizer-horisontal::after { - display: block; - position: absolute; - box-sizing: border-box; - border: 1px solid black; - background: #fff; - width: 10px; - height: 10px; - content: ''; -} - -.croppie-container .cr-resizer-vertical { - bottom: -5px; - cursor: row-resize; - width: 100%; - height: 10px; -} - -.croppie-container .cr-resizer-vertical::after { - left: 50%; - margin-left: -5px; -} - -.croppie-container .cr-resizer-horisontal { - right: -5px; - cursor: col-resize; - width: 10px; - height: 100%; -} - -.croppie-container .cr-resizer-horisontal::after { - top: 50%; - margin-top: -5px; -} - -.croppie-container .cr-original-image { - display: none; -} - -.croppie-container .cr-vp-circle { - border-radius: 50%; -} - -.croppie-container .cr-overlay { - z-index: 1; - position: absolute; - cursor: move; - touch-action: none; -} - -.croppie-container .cr-slider-wrap { - width: 75%; - margin: 15px auto; - text-align: center; -} - -.croppie-result { - position: relative; - overflow: hidden; -} - -.croppie-result img { - position: absolute; -} - -.croppie-container .cr-image, -.croppie-container .cr-overlay, -.croppie-container .cr-viewport { - -webkit-transform: translateZ(0); - -moz-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); -} - -/*************************************/ -/***** STYLING RANGE INPUT ***********/ -/*************************************/ -/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ -/*************************************/ - -.cr-slider { - -webkit-appearance: none; -/*removes default webkit styles*/ - /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ - width: 300px; -/*required for proper track sizing in FF*/ - max-width: 100%; - padding-top: 8px; - padding-bottom: 8px; - background-color: transparent; -} - -.cr-slider::-webkit-slider-runnable-track { - width: 100%; - height: 3px; - background: rgba(0, 0, 0, 0.5); - border: 0; - border-radius: 3px; -} - -.cr-slider::-webkit-slider-thumb { - -webkit-appearance: none; - border: none; - height: 16px; - width: 16px; - border-radius: 50%; - background: #ddd; - margin-top: -6px; -} - -.cr-slider:focus { - outline: none; -} -/* -.cr-slider:focus::-webkit-slider-runnable-track { -background: #ccc; -} -*/ - -.cr-slider::-moz-range-track { - width: 100%; - height: 3px; - background: rgba(0, 0, 0, 0.5); - border: 0; - border-radius: 3px; -} - -.cr-slider::-moz-range-thumb { - border: none; - height: 16px; - width: 16px; - border-radius: 50%; - background: #ddd; - margin-top: -6px; -} - -/*hide the outline behind the border*/ -.cr-slider:-moz-focusring { - outline: 1px solid white; - outline-offset: -1px; -} - -.cr-slider::-ms-track { - width: 100%; - height: 5px; - background: transparent; -/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ - border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ - border-width: 6px 0; - color: transparent;/*remove default tick marks*/ -} -.cr-slider::-ms-fill-lower { - background: rgba(0, 0, 0, 0.5); - border-radius: 10px; -} -.cr-slider::-ms-fill-upper { - background: rgba(0, 0, 0, 0.5); - border-radius: 10px; -} -.cr-slider::-ms-thumb { - border: none; - height: 16px; - width: 16px; - border-radius: 50%; - background: #ddd; - margin-top:1px; -} -.cr-slider:focus::-ms-fill-lower { - background: rgba(0, 0, 0, 0.5); -} -.cr-slider:focus::-ms-fill-upper { - background: rgba(0, 0, 0, 0.5); -} -/*******************************************/ - -/***********************************/ -/* Rotation Tools */ -/***********************************/ -.cr-rotate-controls { - position: absolute; - bottom: 5px; - left: 5px; - z-index: 1; -} -.cr-rotate-controls button { - border: 0; - background: none; -} -.cr-rotate-controls i:before { - display: inline-block; - font-style: normal; - font-weight: 900; - font-size: 22px; -} -.cr-rotate-l i:before { - content: '↺'; -} -.cr-rotate-r i:before { - content: '↻'; -} diff --git a/includes/croppie.js b/includes/croppie.js deleted file mode 100644 index f6f4671..0000000 --- a/includes/croppie.js +++ /dev/null @@ -1,1596 +0,0 @@ -/************************* - * Croppie - * Copyright 2017 - * Foliotek - * Version: 2.5.1 - *************************/ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['exports'], factory); - } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { - // CommonJS - factory(exports); - } else { - // Browser globals - factory((root.commonJsStrict = {})); - } -}(this, function (exports) { - - /* Polyfills */ - if (typeof Promise !== 'function') { - /*! promise-polyfill 3.1.0 */ - !function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof a)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void k(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError("A promise cannot be resolved with itself.");if(a&&("object"==typeof a||"function"==typeof a)){var c=a.then;if("function"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k="function"==typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};c.prototype["catch"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},"undefined"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this); - } - - if ( typeof window.CustomEvent !== "function" ) { - (function(){ - function CustomEvent ( event, params ) { - params = params || { bubbles: false, cancelable: false, detail: undefined }; - var evt = document.createEvent( 'CustomEvent' ); - evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); - return evt; - } - CustomEvent.prototype = window.Event.prototype; - window.CustomEvent = CustomEvent; - }()); - } - - if (!HTMLCanvasElement.prototype.toBlob) { - Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { - value: function (callback, type, quality) { - var binStr = atob( this.toDataURL(type, quality).split(',')[1] ), - len = binStr.length, - arr = new Uint8Array(len); - - for (var i=0; i= 5) { - var x= w; - w = h; - h = x; - } - return { width: w, height: h }; - } - - /* CSS Transform Prototype */ - var TRANSLATE_OPTS = { - 'translate3d': { - suffix: ', 0px' - }, - 'translate': { - suffix: '' - } - }; - var Transform = function (x, y, scale) { - this.x = parseFloat(x); - this.y = parseFloat(y); - this.scale = parseFloat(scale); - }; - - Transform.parse = function (v) { - if (v.style) { - return Transform.parse(v.style[CSS_TRANSFORM]); - } - else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) { - return Transform.fromMatrix(v); - } - else { - return Transform.fromString(v); - } - }; - - Transform.fromMatrix = function (v) { - var vals = v.substring(7).split(','); - if (!vals.length || v === 'none') { - vals = [1, 0, 0, 1, 0, 0]; - } - - return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0])); - }; - - Transform.fromString = function (v) { - var values = v.split(') '), - translate = values[0].substring(Croppie.globals.translate.length + 1).split(','), - scale = values.length > 1 ? values[1].substring(6) : 1, - x = translate.length > 1 ? translate[0] : 0, - y = translate.length > 1 ? translate[1] : 0; - - return new Transform(x, y, scale); - }; - - Transform.prototype.toString = function () { - var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || ''; - return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')'; - }; - - var TransformOrigin = function (el) { - if (!el || !el.style[CSS_TRANS_ORG]) { - this.x = 0; - this.y = 0; - return; - } - var css = el.style[CSS_TRANS_ORG].split(' '); - this.x = parseFloat(css[0]); - this.y = parseFloat(css[1]); - }; - - TransformOrigin.prototype.toString = function () { - return this.x + 'px ' + this.y + 'px'; - }; - - function getExifOrientation (img) { - return img.exifdata.Orientation; - } - - function drawCanvas(canvas, img, orientation) { - var width = img.width, - height = img.height, - ctx = canvas.getContext('2d'); - - canvas.width = img.width; - canvas.height = img.height; - - ctx.save(); - switch (orientation) { - case 2: - ctx.translate(width, 0); - ctx.scale(-1, 1); - break; - - case 3: - ctx.translate(width, height); - ctx.rotate(180*Math.PI/180); - break; - - case 4: - ctx.translate(0, height); - ctx.scale(1, -1); - break; - - case 5: - canvas.width = height; - canvas.height = width; - ctx.rotate(90*Math.PI/180); - ctx.scale(1, -1); - break; - - case 6: - canvas.width = height; - canvas.height = width; - ctx.rotate(90*Math.PI/180); - ctx.translate(0, -height); - break; - - case 7: - canvas.width = height; - canvas.height = width; - ctx.rotate(-90*Math.PI/180); - ctx.translate(-width, height); - ctx.scale(1, -1); - break; - - case 8: - canvas.width = height; - canvas.height = width; - ctx.translate(0, width); - ctx.rotate(-90*Math.PI/180); - break; - } - ctx.drawImage(img, 0,0, width, height); - ctx.restore(); - } - - /* Private Methods */ - function _create() { - var self = this, - contClass = 'croppie-container', - customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null, - boundary, img, viewport, overlay, bw, bh; - - self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self); - // Properties on class - self.data = {}; - self.elements = {}; - - boundary = self.elements.boundary = document.createElement('div'); - viewport = self.elements.viewport = document.createElement('div'); - img = self.elements.img = document.createElement('img'); - overlay = self.elements.overlay = document.createElement('div'); - - if (self.options.useCanvas) { - self.elements.canvas = document.createElement('canvas'); - self.elements.preview = self.elements.canvas; - } - else { - self.elements.preview = self.elements.img; - } - - addClass(boundary, 'cr-boundary'); - boundary.setAttribute('aria-dropeffect', 'none'); - bw = self.options.boundary.width; - bh = self.options.boundary.height; - css(boundary, { - width: (bw + (isNaN(bw) ? '' : 'px')), - height: (bh + (isNaN(bh) ? '' : 'px')) - }); - - addClass(viewport, 'cr-viewport'); - if (customViewportClass) { - addClass(viewport, customViewportClass); - } - css(viewport, { - width: self.options.viewport.width + 'px', - height: self.options.viewport.height + 'px' - }); - viewport.setAttribute('tabindex', 0); - - addClass(self.elements.preview, 'cr-image'); - setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' }); - addClass(overlay, 'cr-overlay'); - - self.element.appendChild(boundary); - boundary.appendChild(self.elements.preview); - boundary.appendChild(viewport); - boundary.appendChild(overlay); - - addClass(self.element, contClass); - if (self.options.customClass) { - addClass(self.element, self.options.customClass); - } - - _initDraggable.call(this); - - if (self.options.enableZoom) { - _initializeZoom.call(self); - } - - // if (self.options.enableOrientation) { - // _initRotationControls.call(self); - // } - - if (self.options.enableResize) { - _initializeResize.call(self); - } - } - - // function _initRotationControls () { - // var self = this, - // wrap, btnLeft, btnRight, iLeft, iRight; - - // wrap = document.createElement('div'); - // self.elements.orientationBtnLeft = btnLeft = document.createElement('button'); - // self.elements.orientationBtnRight = btnRight = document.createElement('button'); - - // wrap.appendChild(btnLeft); - // wrap.appendChild(btnRight); - - // iLeft = document.createElement('i'); - // iRight = document.createElement('i'); - // btnLeft.appendChild(iLeft); - // btnRight.appendChild(iRight); - - // addClass(wrap, 'cr-rotate-controls'); - // addClass(btnLeft, 'cr-rotate-l'); - // addClass(btnRight, 'cr-rotate-r'); - - // self.elements.boundary.appendChild(wrap); - - // btnLeft.addEventListener('click', function () { - // self.rotate(-90); - // }); - // btnRight.addEventListener('click', function () { - // self.rotate(90); - // }); - // } - - function _hasExif() { - return this.options.enableExif && window.EXIF; - } - - function _initializeResize () { - var self = this; - var wrap = document.createElement('div'); - var isDragging = false; - var direction; - var originalX; - var originalY; - var minSize = 50; - var maxWidth; - var maxHeight; - var vr; - var hr; - - addClass(wrap, 'cr-resizer'); - css(wrap, { - width: this.options.viewport.width + 'px', - height: this.options.viewport.height + 'px' - }); - - if (this.options.resizeControls.height) { - vr = document.createElement('div'); - addClass(vr, 'cr-resizer-vertical'); - wrap.appendChild(vr); - } - - if (this.options.resizeControls.width) { - hr = document.createElement('div'); - addClass(hr, 'cr-resizer-horisontal'); - wrap.appendChild(hr); - } - - function mouseDown(ev) { - if (ev.button !== undefined && ev.button !== 0) return; - - ev.preventDefault(); - if (isDragging) { - return; - } - - var overlayRect = self.elements.overlay.getBoundingClientRect(); - - isDragging = true; - originalX = ev.pageX; - originalY = ev.pageY; - direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h'; - maxWidth = overlayRect.width; - maxHeight = overlayRect.height; - - if (ev.touches) { - var touches = ev.touches[0]; - originalX = touches.pageX; - originalY = touches.pageY; - } - - window.addEventListener('mousemove', mouseMove); - window.addEventListener('touchmove', mouseMove); - window.addEventListener('mouseup', mouseUp); - window.addEventListener('touchend', mouseUp); - document.body.style[CSS_USERSELECT] = 'none'; - } - - function mouseMove(ev) { - var pageX = ev.pageX; - var pageY = ev.pageY; - - ev.preventDefault(); - - if (ev.touches) { - var touches = ev.touches[0]; - pageX = touches.pageX; - pageY = touches.pageY; - } - - var deltaX = pageX - originalX; - var deltaY = pageY - originalY; - var newHeight = self.options.viewport.height + deltaY; - var newWidth = self.options.viewport.width + deltaX; - - if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) { - css(wrap, { - height: newHeight + 'px' - }); - - self.options.boundary.height += deltaY; - css(self.elements.boundary, { - height: self.options.boundary.height + 'px' - }); - - self.options.viewport.height += deltaY; - css(self.elements.viewport, { - height: self.options.viewport.height + 'px' - }); - } - else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) { - css(wrap, { - width: newWidth + 'px' - }); - - self.options.boundary.width += deltaX; - css(self.elements.boundary, { - width: self.options.boundary.width + 'px' - }); - - self.options.viewport.width += deltaX; - css(self.elements.viewport, { - width: self.options.viewport.width + 'px' - }); - } - - _updateOverlay.call(self); - _updateZoomLimits.call(self); - _updateCenterPoint.call(self); - _triggerUpdate.call(self); - originalY = pageY; - originalX = pageX; - } - - function mouseUp() { - isDragging = false; - window.removeEventListener('mousemove', mouseMove); - window.removeEventListener('touchmove', mouseMove); - window.removeEventListener('mouseup', mouseUp); - window.removeEventListener('touchend', mouseUp); - document.body.style[CSS_USERSELECT] = ''; - } - - if (vr) { - vr.addEventListener('mousedown', mouseDown); - } - - if (hr) { - hr.addEventListener('mousedown', mouseDown); - } - - this.elements.boundary.appendChild(wrap); - } - - function _setZoomerVal(v) { - if (this.options.enableZoom) { - var z = this.elements.zoomer, - val = fix(v, 4); - - z.value = Math.max(z.min, Math.min(z.max, val)); - } - } - - function _initializeZoom() { - var self = this, - wrap = self.elements.zoomerWrap = document.createElement('div'), - zoomer = self.elements.zoomer = document.createElement('input'); - - addClass(wrap, 'cr-slider-wrap'); - addClass(zoomer, 'cr-slider'); - zoomer.type = 'range'; - zoomer.step = '0.0001'; - zoomer.value = 1; - zoomer.style.display = self.options.showZoomer ? '' : 'none'; - zoomer.setAttribute('aria-label', 'zoom'); - - self.element.appendChild(wrap); - wrap.appendChild(zoomer); - - self._currentZoom = 1; - - function change() { - _onZoom.call(self, { - value: parseFloat(zoomer.value), - origin: new TransformOrigin(self.elements.preview), - viewportRect: self.elements.viewport.getBoundingClientRect(), - transform: Transform.parse(self.elements.preview) - }); - } - - function scroll(ev) { - var delta, targetZoom; - - if (ev.wheelDelta) { - delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2 - } else if (ev.deltaY) { - delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2 - } else if (ev.detail) { - delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2 - } else { - delta = 0; - } - - targetZoom = self._currentZoom + (delta * self._currentZoom); - - ev.preventDefault(); - _setZoomerVal.call(self, targetZoom); - change.call(self); - } - - self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress - self.elements.zoomer.addEventListener('change', change); - - if (self.options.mouseWheelZoom) { - self.elements.boundary.addEventListener('mousewheel', scroll); - self.elements.boundary.addEventListener('DOMMouseScroll', scroll); - } - } - - function _onZoom(ui) { - var self = this, - transform = ui ? ui.transform : Transform.parse(self.elements.preview), - vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(), - origin = ui ? ui.origin : new TransformOrigin(self.elements.preview); - - function applyCss() { - var transCss = {}; - transCss[CSS_TRANSFORM] = transform.toString(); - transCss[CSS_TRANS_ORG] = origin.toString(); - css(self.elements.preview, transCss); - } - - self._currentZoom = ui ? ui.value : self._currentZoom; - transform.scale = self._currentZoom; - self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom); - applyCss(); - - if (self.options.enforceBoundary) { - var boundaries = _getVirtualBoundaries.call(self, vpRect), - transBoundaries = boundaries.translate, - oBoundaries = boundaries.origin; - - if (transform.x >= transBoundaries.maxX) { - origin.x = oBoundaries.minX; - transform.x = transBoundaries.maxX; - } - - if (transform.x <= transBoundaries.minX) { - origin.x = oBoundaries.maxX; - transform.x = transBoundaries.minX; - } - - if (transform.y >= transBoundaries.maxY) { - origin.y = oBoundaries.minY; - transform.y = transBoundaries.maxY; - } - - if (transform.y <= transBoundaries.minY) { - origin.y = oBoundaries.maxY; - transform.y = transBoundaries.minY; - } - } - applyCss(); - _debouncedOverlay.call(self); - _triggerUpdate.call(self); - } - - function _getVirtualBoundaries(viewport) { - var self = this, - scale = self._currentZoom, - vpWidth = viewport.width, - vpHeight = viewport.height, - centerFromBoundaryX = self.elements.boundary.clientWidth / 2, - centerFromBoundaryY = self.elements.boundary.clientHeight / 2, - imgRect = self.elements.preview.getBoundingClientRect(), - curImgWidth = imgRect.width, - curImgHeight = imgRect.height, - halfWidth = vpWidth / 2, - halfHeight = vpHeight / 2; - - var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1; - var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale))); - - var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1; - var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale))); - - var originMinX = (1 / scale) * halfWidth; - var originMaxX = (curImgWidth * (1 / scale)) - originMinX; - - var originMinY = (1 / scale) * halfHeight; - var originMaxY = (curImgHeight * (1 / scale)) - originMinY; - - return { - translate: { - maxX: maxX, - minX: minX, - maxY: maxY, - minY: minY - }, - origin: { - maxX: originMaxX, - minX: originMinX, - maxY: originMaxY, - minY: originMinY - } - }; - } - - function _updateCenterPoint() { - var self = this, - scale = self._currentZoom, - data = self.elements.preview.getBoundingClientRect(), - vpData = self.elements.viewport.getBoundingClientRect(), - transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]), - pc = new TransformOrigin(self.elements.preview), - top = (vpData.top - data.top) + (vpData.height / 2), - left = (vpData.left - data.left) + (vpData.width / 2), - center = {}, - adj = {}; - - center.y = top / scale; - center.x = left / scale; - - adj.y = (center.y - pc.y) * (1 - scale); - adj.x = (center.x - pc.x) * (1 - scale); - - transform.x -= adj.x; - transform.y -= adj.y; - - var newCss = {}; - newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px'; - newCss[CSS_TRANSFORM] = transform.toString(); - css(self.elements.preview, newCss); - } - - function _initDraggable() { - var self = this, - isDragging = false, - originalX, - originalY, - originalDistance, - vpRect, - transform; - - function assignTransformCoordinates(deltaX, deltaY) { - var imgRect = self.elements.preview.getBoundingClientRect(), - top = transform.y + deltaY, - left = transform.x + deltaX; - - if (self.options.enforceBoundary) { - if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) { - transform.y = top; - } - - if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) { - transform.x = left; - } - } - else { - transform.y = top; - transform.x = left; - } - } - - function toggleGrabState(isDragging) { - self.elements.preview.setAttribute('aria-grabbed', isDragging); - self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none'); - } - - function keyDown(ev) { - var LEFT_ARROW = 37, - UP_ARROW = 38, - RIGHT_ARROW = 39, - DOWN_ARROW = 40; - - if (ev.shiftKey && (ev.keyCode == UP_ARROW || ev.keyCode == DOWN_ARROW)) { - var zoom = 0.0; - if (ev.keyCode == UP_ARROW) { - zoom = parseFloat(self.elements.zoomer.value, 10) + parseFloat(self.elements.zoomer.step, 10) - } - else { - zoom = parseFloat(self.elements.zoomer.value, 10) - parseFloat(self.elements.zoomer.step, 10) - } - self.setZoom(zoom); - } - else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) { - ev.preventDefault(); - var movement = parseKeyDown(ev.keyCode); - - transform = Transform.parse(self.elements.preview); - document.body.style[CSS_USERSELECT] = 'none'; - vpRect = self.elements.viewport.getBoundingClientRect(); - keyMove(movement); - }; - - function parseKeyDown(key) { - switch (key) { - case LEFT_ARROW: - return [1, 0]; - case UP_ARROW: - return [0, 1]; - case RIGHT_ARROW: - return [-1, 0]; - case DOWN_ARROW: - return [0, -1]; - }; - }; - } - - function keyMove(movement) { - var deltaX = movement[0], - deltaY = movement[1], - newCss = {}; - - assignTransformCoordinates(deltaX, deltaY); - - newCss[CSS_TRANSFORM] = transform.toString(); - css(self.elements.preview, newCss); - _updateOverlay.call(self); - document.body.style[CSS_USERSELECT] = ''; - _updateCenterPoint.call(self); - _triggerUpdate.call(self); - originalDistance = 0; - } - - function mouseDown(ev) { - if (ev.button !== undefined && ev.button !== 0) return; - - ev.preventDefault(); - if (isDragging) return; - isDragging = true; - originalX = ev.pageX; - originalY = ev.pageY; - - if (ev.touches) { - var touches = ev.touches[0]; - originalX = touches.pageX; - originalY = touches.pageY; - } - toggleGrabState(isDragging); - transform = Transform.parse(self.elements.preview); - window.addEventListener('mousemove', mouseMove); - window.addEventListener('touchmove', mouseMove); - window.addEventListener('mouseup', mouseUp); - window.addEventListener('touchend', mouseUp); - document.body.style[CSS_USERSELECT] = 'none'; - vpRect = self.elements.viewport.getBoundingClientRect(); - } - - function mouseMove(ev) { - ev.preventDefault(); - var pageX = ev.pageX, - pageY = ev.pageY; - - if (ev.touches) { - var touches = ev.touches[0]; - pageX = touches.pageX; - pageY = touches.pageY; - } - - var deltaX = pageX - originalX, - deltaY = pageY - originalY, - newCss = {}; - - if (ev.type == 'touchmove') { - if (ev.touches.length > 1) { - var touch1 = ev.touches[0]; - var touch2 = ev.touches[1]; - var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY)); - - if (!originalDistance) { - originalDistance = dist / self._currentZoom; - } - - var scale = dist / originalDistance; - - _setZoomerVal.call(self, scale); - dispatchChange(self.elements.zoomer); - return; - } - } - - assignTransformCoordinates(deltaX, deltaY); - - newCss[CSS_TRANSFORM] = transform.toString(); - css(self.elements.preview, newCss); - _updateOverlay.call(self); - originalY = pageY; - originalX = pageX; - } - - function mouseUp() { - isDragging = false; - toggleGrabState(isDragging); - window.removeEventListener('mousemove', mouseMove); - window.removeEventListener('touchmove', mouseMove); - window.removeEventListener('mouseup', mouseUp); - window.removeEventListener('touchend', mouseUp); - document.body.style[CSS_USERSELECT] = ''; - _updateCenterPoint.call(self); - _triggerUpdate.call(self); - originalDistance = 0; - } - - self.elements.overlay.addEventListener('mousedown', mouseDown); - self.elements.viewport.addEventListener('keydown', keyDown); - self.elements.overlay.addEventListener('touchstart', mouseDown); - } - - function _updateOverlay() { - var self = this, - boundRect = self.elements.boundary.getBoundingClientRect(), - imgData = self.elements.preview.getBoundingClientRect(); - - css(self.elements.overlay, { - width: imgData.width + 'px', - height: imgData.height + 'px', - top: (imgData.top - boundRect.top) + 'px', - left: (imgData.left - boundRect.left) + 'px' - }); - } - var _debouncedOverlay = debounce(_updateOverlay, 500); - - function _triggerUpdate() { - var self = this, - data = self.get(), - ev; - - if (!_isVisible.call(self)) { - return; - } - - self.options.update.call(self, data); - if (self.$ && typeof Prototype == 'undefined') { - self.$(self.element).trigger('update', data); - } - else { - var ev; - if (window.CustomEvent) { - ev = new CustomEvent('update', { detail: data }); - } else { - ev = document.createEvent('CustomEvent'); - ev.initCustomEvent('update', true, true, data); - } - - self.element.dispatchEvent(ev); - } - } - - function _isVisible() { - return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0; - } - - function _updatePropertiesFromImage() { - var self = this, - initialZoom = 1, - cssReset = {}, - img = self.elements.preview, - imgData = null, - transformReset = new Transform(0, 0, initialZoom), - originReset = new TransformOrigin(), - isVisible = _isVisible.call(self); - - if (!isVisible || self.data.bound) { - // if the croppie isn't visible or it doesn't need binding - return; - } - - self.data.bound = true; - cssReset[CSS_TRANSFORM] = transformReset.toString(); - cssReset[CSS_TRANS_ORG] = originReset.toString(); - cssReset['opacity'] = 1; - css(img, cssReset); - - imgData = self.elements.preview.getBoundingClientRect(); - - self._originalImageWidth = imgData.width; - self._originalImageHeight = imgData.height; - - if (self.options.enableZoom) { - _updateZoomLimits.call(self, true); - } - else { - self._currentZoom = initialZoom; - } - - transformReset.scale = self._currentZoom; - cssReset[CSS_TRANSFORM] = transformReset.toString(); - css(img, cssReset); - - if (self.data.points.length) { - _bindPoints.call(self, self.data.points); - } - else { - _centerImage.call(self); - } - - _updateCenterPoint.call(self); - _updateOverlay.call(self); - } - - function _updateZoomLimits (initial) { - var self = this, - minZoom = 0, - maxZoom = 1.5, - initialZoom, - defaultInitialZoom, - zoomer = self.elements.zoomer, - scale = parseFloat(zoomer.value), - boundaryData = self.elements.boundary.getBoundingClientRect(), - imgData = self.elements.preview.getBoundingClientRect(), - vpData = self.elements.viewport.getBoundingClientRect(), - minW, - minH; - - if (self.options.enforceBoundary) { - minW = vpData.width / (initial ? imgData.width : imgData.width / scale); - minH = vpData.height / (initial ? imgData.height : imgData.height / scale); - minZoom = Math.max(minW, minH); - } - - if (minZoom >= maxZoom) { - maxZoom = minZoom + 1; - } - - zoomer.min = fix(minZoom, 4); - zoomer.max = fix(maxZoom, 4); - - if (initial) { - defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height)); - initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom; - _setZoomerVal.call(self, initialZoom); - } - - dispatchChange(zoomer); - } - - function _bindPoints(points) { - if (points.length != 4) { - throw "Croppie - Invalid number of points supplied: " + points; - } - var self = this, - pointsWidth = points[2] - points[0], - // pointsHeight = points[3] - points[1], - vpData = self.elements.viewport.getBoundingClientRect(), - boundRect = self.elements.boundary.getBoundingClientRect(), - vpOffset = { - left: vpData.left - boundRect.left, - top: vpData.top - boundRect.top - }, - scale = vpData.width / pointsWidth, - originTop = points[1], - originLeft = points[0], - transformTop = (-1 * points[1]) + vpOffset.top, - transformLeft = (-1 * points[0]) + vpOffset.left, - newCss = {}; - - newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px'; - newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString(); - css(self.elements.preview, newCss); - - _setZoomerVal.call(self, scale); - self._currentZoom = scale; - } - - function _centerImage() { - var self = this, - imgDim = self.elements.preview.getBoundingClientRect(), - vpDim = self.elements.viewport.getBoundingClientRect(), - boundDim = self.elements.boundary.getBoundingClientRect(), - vpLeft = vpDim.left - boundDim.left, - vpTop = vpDim.top - boundDim.top, - w = vpLeft - ((imgDim.width - vpDim.width) / 2), - h = vpTop - ((imgDim.height - vpDim.height) / 2), - transform = new Transform(w, h, self._currentZoom); - - css(self.elements.preview, CSS_TRANSFORM, transform.toString()); - } - - function _transferImageToCanvas(customOrientation) { - var self = this, - canvas = self.elements.canvas, - img = self.elements.img, - ctx = canvas.getContext('2d'), - exif = _hasExif.call(self), - customOrientation = self.options.enableOrientation && customOrientation; - - ctx.clearRect(0, 0, canvas.width, canvas.height); - canvas.width = img.width; - canvas.height = img.height; - - if (exif && !customOrientation) { - var orientation = getExifOrientation(img); - drawCanvas(canvas, img, num(orientation || 0, 10)); - } - else if (customOrientation) { - drawCanvas(canvas, img, customOrientation); - } - } - - function _getCanvas(data) { - var self = this, - points = data.points, - left = num(points[0]), - top = num(points[1]), - right = num(points[2]), - bottom = num(points[3]), - width = right-left, - height = bottom-top, - circle = data.circle, - canvas = document.createElement('canvas'), - ctx = canvas.getContext('2d'), - outWidth = width, - outHeight = height, - startX = 0, - startY = 0, - canvasWidth = outWidth, - canvasHeight = outHeight, - customDimensions = (data.outputWidth && data.outputHeight), - outputWidthRatio = 1; - outputHeightRatio = 1; - - if (customDimensions) { - canvasWidth = data.outputWidth; - canvasHeight = data.outputHeight; - outputWidthRatio = canvasWidth / outWidth; - outputHeightRatio = canvasHeight / outHeight; - } - - canvas.width = canvasWidth; - canvas.height = canvasHeight; - - if (data.backgroundColor) { - ctx.fillStyle = data.backgroundColor; - ctx.fillRect(0, 0, canvasWidth, canvasHeight); - } - - - // start fixing data to send to draw image for enforceBoundary: false - if (!self.options.enforceBoundary) { - if (left < 0) { - startX = Math.abs(left); - left = 0; - } - if (top < 0) { - startY = Math.abs(top); - top = 0; - } - if (right > self._originalImageWidth) { - width = self._originalImageWidth - left; - outWidth = width; - } - if (bottom > self._originalImageHeight) { - height = self._originalImageHeight - top; - outHeight = height; - } - } - else{ - width=Math.min(width, self._originalImageWidth); - height=Math.min(height, self._originalImageHeight) - } - - if (outputWidthRatio !== 1 || outputHeightRatio !== 1) { - startX *= outputWidthRatio; - startY *= outputHeightRatio; - outWidth *= outputWidthRatio; - outHeight *= outputHeightRatio; - } - ctx.drawImage(this.elements.preview, left, top, width, height, startX, startY, outWidth, outHeight); - if (circle) { - ctx.fillStyle = '#fff'; - ctx.globalCompositeOperation = 'destination-in'; - ctx.beginPath(); - ctx.arc(outWidth / 2, outHeight / 2, outWidth / 2, 0, Math.PI * 2, true); - ctx.closePath(); - ctx.fill(); - } - return canvas; - } - - function _getHtmlResult(data) { - var points = data.points, - div = document.createElement('div'), - img = document.createElement('img'), - width = points[2] - points[0], - height = points[3] - points[1]; - - addClass(div, 'croppie-result'); - div.appendChild(img); - css(img, { - left: (-1 * points[0]) + 'px', - top: (-1 * points[1]) + 'px' - }); - img.src = data.url; - css(div, { - width: width + 'px', - height: height + 'px' - }); - - return div; - } - - function _getBase64Result(data) { - return _getCanvas.call(this, data).toDataURL(data.format, data.quality); - } - - function _getBlobResult(data) { - var self = this; - return new Promise(function (resolve, reject) { - _getCanvas.call(self, data).toBlob(function (blob) { - resolve(blob); - }, data.format, data.quality); - }); - } - - function _bind(options, cb) { - var self = this, - url, - points = [], - zoom = null, - hasExif = _hasExif.call(self);; - - if (typeof (options) === 'string') { - url = options; - options = {}; - } - else if (Array.isArray(options)) { - points = options.slice(); - } - else if (typeof (options) == 'undefined' && self.data.url) { //refreshing - _updatePropertiesFromImage.call(self); - _triggerUpdate.call(self); - return null; - } - else { - url = options.url; - points = options.points || []; - zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom; - } - - self.data.bound = false; - self.data.url = url || self.data.url; - self.data.boundZoom = zoom; - - return loadImage(url, self.elements.img, hasExif).then(function (img) { - if (!points.length) { - var natDim = naturalImageDimensions(img); - var rect = self.elements.viewport.getBoundingClientRect(); - var aspectRatio = rect.width / rect.height; - var imgAspectRatio = natDim.width / natDim.height; - var width, height; - - if (imgAspectRatio > aspectRatio) { - height = natDim.height; - width = height * aspectRatio; - } - else { - width = natDim.width; - height = width / aspectRatio; - } - - var x0 = (natDim.width - width) / 2; - var y0 = (natDim.height - height) / 2; - var x1 = x0 + width; - var y1 = y0 + height; - - self.data.points = [x0, y0, x1, y1]; - } - else if (self.options.relative) { - points = [ - points[0] * img.naturalWidth / 100, - points[1] * img.naturalHeight / 100, - points[2] * img.naturalWidth / 100, - points[3] * img.naturalHeight / 100 - ]; - } - - self.data.points = points.map(function (p) { - return parseFloat(p); - }); - if (self.options.useCanvas) { - _transferImageToCanvas.call(self, options.orientation || 1); - } - _updatePropertiesFromImage.call(self); - _triggerUpdate.call(self); - cb && cb(); - }); - } - - function fix(v, decimalPoints) { - return parseFloat(v).toFixed(decimalPoints || 0); - } - - function _get() { - var self = this, - imgData = self.elements.preview.getBoundingClientRect(), - vpData = self.elements.viewport.getBoundingClientRect(), - x1 = vpData.left - imgData.left, - y1 = vpData.top - imgData.top, - widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border - heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2, - x2 = x1 + self.elements.viewport.offsetWidth + widthDiff, - y2 = y1 + self.elements.viewport.offsetHeight + heightDiff, - scale = self._currentZoom; - - if (scale === Infinity || isNaN(scale)) { - scale = 1; - } - - var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY; - x1 = Math.max(max, x1 / scale); - y1 = Math.max(max, y1 / scale); - x2 = Math.max(max, x2 / scale); - y2 = Math.max(max, y2 / scale); - - return { - points: [fix(x1), fix(y1), fix(x2), fix(y2)], - zoom: scale - }; - } - - var RESULT_DEFAULTS = { - type: 'canvas', - format: 'png', - quality: 1 - }, - RESULT_FORMATS = ['jpeg', 'webp', 'png']; - - function _result(options) { - var self = this, - data = _get.call(self), - opts = deepExtend(RESULT_DEFAULTS, deepExtend({}, options)), - resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')), - size = opts.size || 'viewport', - format = opts.format, - quality = opts.quality, - backgroundColor = opts.backgroundColor, - circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'), - vpRect = self.elements.viewport.getBoundingClientRect(), - ratio = vpRect.width / vpRect.height, - prom; - - if (size === 'viewport') { - data.outputWidth = vpRect.width; - data.outputHeight = vpRect.height; - } else if (typeof size === 'object') { - if (size.width && size.height) { - data.outputWidth = size.width; - data.outputHeight = size.height; - } else if (size.width) { - data.outputWidth = size.width; - data.outputHeight = size.width / ratio; - } else if (size.height) { - data.outputWidth = size.height * ratio; - data.outputHeight = size.height; - } - } - - if (RESULT_FORMATS.indexOf(format) > -1) { - data.format = 'image/' + format; - data.quality = quality; - } - - data.circle = circle; - data.url = self.data.url; - data.backgroundColor = backgroundColor; - - prom = new Promise(function (resolve, reject) { - switch(resultType.toLowerCase()) - { - case 'rawcanvas': - resolve(_getCanvas.call(self, data)); - break; - case 'canvas': - case 'base64': - resolve(_getBase64Result.call(self, data)); - break; - case 'blob': - _getBlobResult.call(self, data).then(resolve); - break; - default: - resolve(_getHtmlResult.call(self, data)); - break; - } - }); - return prom; - } - - function _refresh() { - _updatePropertiesFromImage.call(this); - } - - function _rotate(deg) { - if (!this.options.useCanvas) { - throw 'Croppie: Cannot rotate without enableOrientation'; - } - - var self = this, - canvas = self.elements.canvas, - copy = document.createElement('canvas'), - ornt = 1; - - copy.width = canvas.width; - copy.height = canvas.height; - var ctx = copy.getContext('2d'); - ctx.drawImage(canvas, 0, 0); - - if (deg === 90 || deg === -270) ornt = 6; - if (deg === -90 || deg === 270) ornt = 8; - if (deg === 180 || deg === -180) ornt = 3; - - drawCanvas(canvas, copy, ornt); - _onZoom.call(self); - copy = null; - } - - function _destroy() { - var self = this; - self.element.removeChild(self.elements.boundary); - removeClass(self.element, 'croppie-container'); - if (self.options.enableZoom) { - self.element.removeChild(self.elements.zoomerWrap); - } - delete self.elements; - } - - if (window.jQuery) { - var $ = window.jQuery; - $.fn.croppie = function (opts) { - var ot = typeof opts; - - if (ot === 'string') { - var args = Array.prototype.slice.call(arguments, 1); - var singleInst = $(this).data('croppie'); - - if (opts === 'get') { - return singleInst.get(); - } - else if (opts === 'result') { - return singleInst.result.apply(singleInst, args); - } - else if (opts === 'bind') { - return singleInst.bind.apply(singleInst, args); - } - - return this.each(function () { - var i = $(this).data('croppie'); - if (!i) return; - - var method = i[opts]; - if ($.isFunction(method)) { - method.apply(i, args); - if (opts === 'destroy') { - $(this).removeData('croppie'); - } - } - else { - throw 'Croppie ' + opts + ' method not found'; - } - }); - } - else { - return this.each(function () { - var i = new Croppie(this, opts); - i.$ = $; - $(this).data('croppie', i); - }); - } - }; - } - - function Croppie(element, opts) { - this.element = element; - this.options = deepExtend(deepExtend({}, Croppie.defaults), opts); - - if (this.element.tagName.toLowerCase() === 'img') { - var origImage = this.element; - addClass(origImage, 'cr-original-image'); - setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' }); - var replacementDiv = document.createElement('div'); - this.element.parentNode.appendChild(replacementDiv); - replacementDiv.appendChild(origImage); - this.element = replacementDiv; - this.options.url = this.options.url || origImage.src; - } - - _create.call(this); - if (this.options.url) { - var bindOpts = { - url: this.options.url, - points: this.options.points - }; - delete this.options['url']; - delete this.options['points']; - _bind.call(this, bindOpts); - } - } - - Croppie.defaults = { - viewport: { - width: 100, - height: 100, - type: 'square' - }, - boundary: { }, - orientationControls: { - enabled: true, - leftClass: '', - rightClass: '' - }, - resizeControls: { - width: true, - height: true - }, - customClass: '', - showZoomer: true, - enableZoom: true, - enableResize: false, - mouseWheelZoom: true, - enableExif: false, - enforceBoundary: true, - enableOrientation: false, - enableKeyMovement: true, - update: function () { } - }; - - Croppie.globals = { - translate: 'translate3d' - }; - - deepExtend(Croppie.prototype, { - bind: function (options, cb) { - return _bind.call(this, options, cb); - }, - get: function () { - var data = _get.call(this); - var points = data.points; - if (this.options.relative) { - points[0] /= this.elements.img.naturalWidth / 100; - points[1] /= this.elements.img.naturalHeight / 100; - points[2] /= this.elements.img.naturalWidth / 100; - points[3] /= this.elements.img.naturalHeight / 100; - } - return data; - }, - result: function (type) { - return _result.call(this, type); - }, - refresh: function () { - return _refresh.call(this); - }, - setZoom: function (v) { - _setZoomerVal.call(this, v); - dispatchChange(this.elements.zoomer); - }, - rotate: function (deg) { - _rotate.call(this, deg); - }, - destroy: function () { - return _destroy.call(this); - } - }); - - exports.Croppie = window.Croppie = Croppie; - - if (typeof module === 'object' && !!module.exports) { - module.exports = Croppie; - } -})); diff --git a/includes/default.bitsy b/includes/default.bitsy deleted file mode 100644 index ebe7a54..0000000 --- a/includes/default.bitsy +++ /dev/null @@ -1,84 +0,0 @@ -Write your game's title here - -# BITSY VERSION 5.3 - -! ROOM_FORMAT 1 - -PAL 0 -0,82,204 -128,159,255 -255,255,255 - -ROOM 0 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0,a,a,a,a,a,a,a,a,a,a,a,a,a,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,0,0,0,0,0,0,0,0,0,0,0,0,a,0 -0,a,a,a,a,a,a,a,a,a,a,a,a,a,a,0 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PAL 0 - -TIL a -11111111 -10000001 -10000001 -10011001 -10011001 -10000001 -10000001 -11111111 - -SPR A -00011000 -00011000 -00011000 -00111100 -01111110 -10111101 -00100100 -00100100 -POS 0 4,4 - -SPR a -00000000 -00000000 -01010001 -01110001 -01110010 -01111100 -00111100 -00100100 -DLG SPR_0 -POS 0 8,12 - -ITM 0 -00000000 -00000000 -00000000 -00111100 -01100100 -00100100 -00011000 -00000000 -NAME tea -DLG ITM_0 - -DLG SPR_0 -I'm a cat - -DLG ITM_0 -You found a nice warm cup of tea - -VAR a -42 - diff --git a/includes/jquery.min.js b/includes/jquery.min.js deleted file mode 100644 index 47b6397..0000000 --- a/includes/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.0 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"']/g,J=RegExp(G.source),Y=RegExp(H.source),Q=/<%-([\s\S]+?)%>/g,X=/<%([\s\S]+?)%>/g,nn=/<%=([\s\S]+?)%>/g,tn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,rn=/^\w*$/,en=/^\./,un=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,on=/[\\^$.*+?()[\]{}|]/g,fn=RegExp(on.source),cn=/^\s+|\s+$/g,an=/^\s+/,ln=/\s+$/,sn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,hn=/\{\n\/\* \[wrapped with (.+)\] \*/,pn=/,? & /,_n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,vn=/\\(\\)?/g,gn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,dn=/\w*$/,yn=/^[-+]0x[0-9a-f]+$/i,bn=/^0b[01]+$/i,xn=/^\[object .+?Constructor\]$/,jn=/^0o[0-7]+$/i,wn=/^(?:0|[1-9]\d*)$/,mn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,An=/($^)/,kn=/['\n\r\u2028\u2029\\]/g,En="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",On="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+En,Sn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",In=RegExp("['\u2019]","g"),Rn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),zn=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Sn+En,"g"),Wn=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)|\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)|\\d+",On].join("|"),"g"),Bn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),Ln=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Un="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Cn={}; -Cn["[object Float32Array]"]=Cn["[object Float64Array]"]=Cn["[object Int8Array]"]=Cn["[object Int16Array]"]=Cn["[object Int32Array]"]=Cn["[object Uint8Array]"]=Cn["[object Uint8ClampedArray]"]=Cn["[object Uint16Array]"]=Cn["[object Uint32Array]"]=true,Cn["[object Arguments]"]=Cn["[object Array]"]=Cn["[object ArrayBuffer]"]=Cn["[object Boolean]"]=Cn["[object DataView]"]=Cn["[object Date]"]=Cn["[object Error]"]=Cn["[object Function]"]=Cn["[object Map]"]=Cn["[object Number]"]=Cn["[object Object]"]=Cn["[object RegExp]"]=Cn["[object Set]"]=Cn["[object String]"]=Cn["[object WeakMap]"]=false; -var Dn={};Dn["[object Arguments]"]=Dn["[object Array]"]=Dn["[object ArrayBuffer]"]=Dn["[object DataView]"]=Dn["[object Boolean]"]=Dn["[object Date]"]=Dn["[object Float32Array]"]=Dn["[object Float64Array]"]=Dn["[object Int8Array]"]=Dn["[object Int16Array]"]=Dn["[object Int32Array]"]=Dn["[object Map]"]=Dn["[object Number]"]=Dn["[object Object]"]=Dn["[object RegExp]"]=Dn["[object Set]"]=Dn["[object String]"]=Dn["[object Symbol]"]=Dn["[object Uint8Array]"]=Dn["[object Uint8ClampedArray]"]=Dn["[object Uint16Array]"]=Dn["[object Uint32Array]"]=true, -Dn["[object Error]"]=Dn["[object Function]"]=Dn["[object WeakMap]"]=false;var Mn,Tn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$n=parseFloat,Fn=parseInt,Nn=typeof global=="object"&&global&&global.Object===Object&&global,Pn=typeof self=="object"&&self&&self.Object===Object&&self,Zn=Nn||Pn||Function("return this")(),qn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Vn=qn&&typeof module=="object"&&module&&!module.nodeType&&module,Kn=Vn&&Vn.exports===qn,Gn=Kn&&Nn.process; -n:{try{Mn=Gn&&Gn.binding&&Gn.binding("util");break n}catch(n){}Mn=void 0}var Hn=Mn&&Mn.isArrayBuffer,Jn=Mn&&Mn.isDate,Yn=Mn&&Mn.isMap,Qn=Mn&&Mn.isRegExp,Xn=Mn&&Mn.isSet,nt=Mn&&Mn.isTypedArray,tt=j("length"),rt=w({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I", -"\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C", -"\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i", -"\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S", -"\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe", -"\u0149":"'n","\u017f":"s"}),et=w({"&":"&","<":"<",">":">",'"':""","'":"'"}),ut=w({"&":"&","<":"<",">":">",""":'"',"'":"'"}),it=function w(En){function On(n){if(xu(n)&&!af(n)&&!(n instanceof Mn)){if(n instanceof zn)return n;if(ci.call(n,"__wrapped__"))return Pe(n)}return new zn(n)}function Sn(){}function zn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=F}function Mn(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1, -this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function dt(n,t,r,e,i,o){var f,c=1&t,a=2&t,l=4&t;if(r&&(f=i?r(n,e,i,o):r(n)),f!==F)return f;if(!bu(n))return n;if(e=af(n)){if(f=Ee(n),!c)return Mr(n,f)}else{var s=yo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(sf(n))return Wr(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Oe(n),!c)return a?Fr(n,pt(f,n)):$r(n,ht(f,n))}else{if(!Dn[s])return i?n:{};f=Se(n,s,dt,c)}}if(o||(o=new Vn), -i=o.get(n))return i;o.set(n,f);var a=l?a?ye:de:a?Uu:Lu,p=e?F:a(n);return u(p||n,function(e,u){p&&(u=e,e=n[u]),at(f,u,dt(e,t,r,u,n,o))}),f}function yt(n){var t=Lu(n);return function(r){return bt(r,n,t)}}function bt(n,t,r){var e=r.length;if(null==n)return!e;for(n=ni(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===F&&!(u in n)||!i(o))return false}return true}function xt(n,t,r){if(typeof n!="function")throw new ei("Expected a function");return jo(function(){n.apply(F,r)},t)}function jt(n,t,r,e){var u=-1,i=c,o=true,f=n.length,s=[],h=t.length; -if(!f)return s;r&&(t=l(t,S(r))),e?(i=a,o=false):200<=t.length&&(i=R,o=false,t=new qn(t));n:for(;++ut}function Bt(n,t){return null!=n&&ci.call(n,t)}function Lt(n,t){return null!=n&&t in ni(n)}function Ut(n,t,r){for(var e=r?a:c,u=n[0].length,i=n.length,o=i,f=Hu(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,S(t))),s=Mi(p.length,s),f[o]=!r&&(t||120<=u&&120<=p.length)?new qn(o&&p):F}var p=n[0],_=-1,v=f[0];n:for(;++_t.length?n:It(n,vr(t,0,-1)),t=null==n?n:n[$e(Ge(t))],null==t?F:r(t,n,e)}function Mt(n){return xu(n)&&"[object Arguments]"==zt(n)}function Tt(n){return xu(n)&&"[object ArrayBuffer]"==zt(n)}function $t(n){return xu(n)&&"[object Date]"==zt(n)}function Ft(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!xu(n)&&!xu(t))t=n!==n&&t!==t;else n:{ -var i=af(n),o=af(t),f=i?"[object Array]":yo(n),c=o?"[object Array]":yo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&sf(n)){if(!sf(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Vn),t=i||gf(n)?_e(n,t,r,e,Ft,u):ve(n,t,f,r,e,Ft,u);else{if(!(1&r)&&(i=a&&ci.call(n,"__wrapped__"),f=o&&ci.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Vn),t=Ft(n,t,r,e,u);break n}if(c)t:if(u||(u=new Vn), -i=1&r,f=de(n),o=f.length,c=de(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:ci.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Re(t,r)?n[t]:F}function rr(n,t,r){var e=-1;return t=l(t.length?t:[Nu],S(je())),n=Yt(n,function(n){return{a:l(t,function(t){return t(n)}),b:++e,c:n}}),A(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f?c:c*("desc"==r[e]?-1:1); -break n}}e=n.b-t.b}return e})}function er(n,t){return ur(n,t,function(t,r){return Bu(n,r)})}function ur(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Hu(u);++e=u){for(;e>>1,o=n[i];null!==o&&!Au(o)&&(r?o<=t:ot.length?n:It(n,vr(t,0,-1)), -null==n||delete n[$e(Ge(t))]}function Ar(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?wr(n[0]):[];for(var u=-1,i=Hu(e);++u=e?n:vr(n,t,r)}function Wr(n,t){if(t)return n.slice();var r=n.length,r=yi?yi(r):new n.constructor(r);return n.copy(r),r}function Br(n){var t=new n.constructor(n.byteLength);return new di(t).set(new di(n)),t}function Lr(n,t){return new n.constructor(t?Br(n.buffer):n.buffer,n.byteOffset,n.length)}function Ur(n,t){ -if(n!==t){var r=n!==F,e=null===n,u=n===n,i=Au(n),o=t!==F,f=null===t,c=t===t,a=Au(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?F:i,u=1),t=ni(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:C(f,a),o-=c.length,or?r?ar(t,n):t:(r=ar(t,Ri(n/T(t))),Bn.test(t)?zr($(r),0,n).join(""):r.slice(0,n))}function ue(n,t,e,u){function i(){for(var t=-1,c=arguments.length,a=-1,l=u.length,s=Hu(l+c),h=this&&this!==Zn&&this instanceof i?f:n;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Cr(e,r,h[4]):r,i[4]=e?C(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Dr(e,r,h[6]):r,i[6]=e?C(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Mi(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], -r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===F?c?0:n.length:Di(i[9]-a,0),!f&&24&t&&(t&=-25),De((h?lo:xo)(t&&1!=t?8==t||16==t?Jr(n,t,f):32!=t&&33!=t||u.length?Xr.apply(F,i):ue(n,t,r,e):Vr(n,t,r),i),n,t)}function se(n,t,r,e){return n===F||hu(n,ii[r])&&!ci.call(e,r)?t:n}function he(n,t,r,e,u,i){return bu(n)&&bu(t)&&(i.set(t,n),nr(n,t,F,he,i),i.delete(t)),n}function pe(n){return wu(n)?F:n}function _e(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;var c=-1,a=true,l=2&r?new qn:F; -for(i.set(n,t),i.set(t,n);++cr&&(r=Di(e+r,0)),g(n,je(t,3),r)):-1}function qe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==F&&(u=Ou(r),u=0>r?Di(e+u,0):Mi(u,e-1)), -g(n,je(t,3),u,true)}function Ve(n){return(null==n?0:n.length)?kt(n,1):[]}function Ke(n){return n&&n.length?n[0]:F}function Ge(n){var t=null==n?0:n.length;return t?n[t-1]:F}function He(n,t){return n&&n.length&&t&&t.length?or(n,t):n}function Je(n){return null==n?n:Ni.call(n)}function Ye(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(_u(n))return t=Di(n.length,t),true}),E(t,function(t){return l(n,j(t))})}function Qe(n,t){if(!n||!n.length)return[];var e=Ye(n);return null==t?e:l(e,function(n){ -return r(t,F,n)})}function Xe(n){return n=On(n),n.__chain__=true,n}function nu(n,t){return t(n)}function tu(){return this}function ru(n,t){return(af(n)?u:oo)(n,je(t,3))}function eu(n,t){return(af(n)?i:fo)(n,je(t,3))}function uu(n,t){return(af(n)?l:Yt)(n,je(t,3))}function iu(n,t,r){return t=r?F:t,t=n&&null==t?n.length:t,le(n,128,F,F,F,F,t)}function ou(n,t){var r;if(typeof t!="function")throw new ei("Expected a function");return n=Ou(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=F), -r}}function fu(n,t,r){return t=r?F:t,n=le(n,8,F,F,F,F,F,t),n.placeholder=fu.placeholder,n}function cu(n,t,r){return t=r?F:t,n=le(n,16,F,F,F,F,F,t),n.placeholder=cu.placeholder,n}function au(n,t,r){function e(t){var r=c,e=a;return c=a=F,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===F||r>=t||0>r||g&&n>=l}function i(){var n=Jo();if(u(n))return o(n);var r,e=jo;r=n-_,n=t-(n-p),r=g?Mi(n,l-r):n,h=e(i,r)}function o(n){return h=F,d&&c?e(n):(c=a=F,s)}function f(){var n=Jo(),r=u(n);if(c=arguments, -a=this,p=n,r){if(h===F)return _=n=p,h=jo(i,t),v?e(n):s;if(g)return h=jo(i,t),e(p)}return h===F&&(h=jo(i,t)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ei("Expected a function");return t=Iu(t)||0,bu(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Di(Iu(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==F&&ho(h),_=0,c=p=a=h=F},f.flush=function(){return h===F?s:o(Jo())},f}function lu(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), -r.cache=i.set(u,e)||i,e)}if(typeof n!="function"||null!=t&&typeof t!="function")throw new ei("Expected a function");return r.cache=new(lu.Cache||Pn),r}function su(n){if(typeof n!="function")throw new ei("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function hu(n,t){return n===t||n!==n&&t!==t}function pu(n){return null!=n&&yu(n.length)&&!gu(n); -}function _u(n){return xu(n)&&pu(n)}function vu(n){if(!xu(n))return false;var t=zt(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!wu(n)}function gu(n){return!!bu(n)&&(n=zt(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function du(n){return typeof n=="number"&&n==Ou(n)}function yu(n){return typeof n=="number"&&-1=n}function bu(n){var t=typeof n;return null!=n&&("object"==t||"function"==t); -}function xu(n){return null!=n&&typeof n=="object"}function ju(n){return typeof n=="number"||xu(n)&&"[object Number]"==zt(n)}function wu(n){return!(!xu(n)||"[object Object]"!=zt(n))&&(n=bi(n),null===n||(n=ci.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&fi.call(n)==hi))}function mu(n){return typeof n=="string"||!af(n)&&xu(n)&&"[object String]"==zt(n)}function Au(n){return typeof n=="symbol"||xu(n)&&"[object Symbol]"==zt(n)}function ku(n){if(!n)return[];if(pu(n))return mu(n)?$(n):Mr(n); -if(Ai&&n[Ai]){n=n[Ai]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=yo(n),("[object Map]"==t?L:"[object Set]"==t?D:Du)(n)}function Eu(n){return n?(n=Iu(n),n===N||n===-N?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Ou(n){n=Eu(n);var t=n%1;return n===n?t?n-t:n:0}function Su(n){return n?gt(Ou(n),0,4294967295):0}function Iu(n){if(typeof n=="number")return n;if(Au(n))return P;if(bu(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=bu(n)?n+"":n),typeof n!="string")return 0===n?n:+n; -n=n.replace(cn,"");var t=bn.test(n);return t||jn.test(n)?Fn(n.slice(2),t?2:8):yn.test(n)?P:+n}function Ru(n){return Tr(n,Uu(n))}function zu(n){return null==n?"":jr(n)}function Wu(n,t,r){return n=null==n?F:It(n,t),n===F?r:n}function Bu(n,t){return null!=n&&ke(n,t,Lt)}function Lu(n){return pu(n)?Gn(n):Ht(n)}function Uu(n){if(pu(n))n=Gn(n,true);else if(bu(n)){var t,r=Le(n),e=[];for(t in n)("constructor"!=t||!r&&ci.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in ni(n))t.push(r);n=t}return n}function Cu(n,t){ -if(null==n)return{};var r=l(ye(n),function(n){return[n]});return t=je(t),ur(n,r,function(n,r){return t(n,r[0])})}function Du(n){return null==n?[]:I(n,Lu(n))}function Mu(n){return Nf(zu(n).toLowerCase())}function Tu(n){return(n=zu(n))&&n.replace(mn,rt).replace(Rn,"")}function $u(n,t,r){return n=zu(n),t=r?F:t,t===F?Ln.test(n)?n.match(Wn)||[]:n.match(_n)||[]:n.match(t)||[]}function Fu(n){return function(){return n}}function Nu(n){return n}function Pu(n){return Gt(typeof n=="function"?n:dt(n,1))}function Zu(n,t,r){ -var e=Lu(t),i=St(t,e);null!=r||bu(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=St(t,Lu(t)));var o=!(bu(r)&&"chain"in r&&!r.chain),f=gu(n);return u(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Mr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function qu(){}function Vu(n){return We(n)?j($e(n)):ir(n)}function Ku(){return[]}function Gu(){ -return false}En=null==En?Zn:it.defaults(Zn.Object(),En,it.pick(Zn,Un));var Hu=En.Array,Ju=En.Date,Yu=En.Error,Qu=En.Function,Xu=En.Math,ni=En.Object,ti=En.RegExp,ri=En.String,ei=En.TypeError,ui=Hu.prototype,ii=ni.prototype,oi=En["__core-js_shared__"],fi=Qu.prototype.toString,ci=ii.hasOwnProperty,ai=0,li=function(){var n=/[^.]+$/.exec(oi&&oi.keys&&oi.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),si=ii.toString,hi=fi.call(ni),pi=Zn._,_i=ti("^"+fi.call(ci).replace(on,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),vi=Kn?En.Buffer:F,gi=En.Symbol,di=En.Uint8Array,yi=vi?vi.f:F,bi=U(ni.getPrototypeOf,ni),xi=ni.create,ji=ii.propertyIsEnumerable,wi=ui.splice,mi=gi?gi.isConcatSpreadable:F,Ai=gi?gi.iterator:F,ki=gi?gi.toStringTag:F,Ei=function(){ -try{var n=Ae(ni,"defineProperty");return n({},"",{}),n}catch(n){}}(),Oi=En.clearTimeout!==Zn.clearTimeout&&En.clearTimeout,Si=Ju&&Ju.now!==Zn.Date.now&&Ju.now,Ii=En.setTimeout!==Zn.setTimeout&&En.setTimeout,Ri=Xu.ceil,zi=Xu.floor,Wi=ni.getOwnPropertySymbols,Bi=vi?vi.isBuffer:F,Li=En.isFinite,Ui=ui.join,Ci=U(ni.keys,ni),Di=Xu.max,Mi=Xu.min,Ti=Ju.now,$i=En.parseInt,Fi=Xu.random,Ni=ui.reverse,Pi=Ae(En,"DataView"),Zi=Ae(En,"Map"),qi=Ae(En,"Promise"),Vi=Ae(En,"Set"),Ki=Ae(En,"WeakMap"),Gi=Ae(ni,"create"),Hi=Ki&&new Ki,Ji={},Yi=Fe(Pi),Qi=Fe(Zi),Xi=Fe(qi),no=Fe(Vi),to=Fe(Ki),ro=gi?gi.prototype:F,eo=ro?ro.valueOf:F,uo=ro?ro.toString:F,io=function(){ -function n(){}return function(t){return bu(t)?xi?xi(t):(n.prototype=t,t=new n,n.prototype=F,t):{}}}();On.templateSettings={escape:Q,evaluate:X,interpolate:nn,variable:"",imports:{_:On}},On.prototype=Sn.prototype,On.prototype.constructor=On,zn.prototype=io(Sn.prototype),zn.prototype.constructor=zn,Mn.prototype=io(Sn.prototype),Mn.prototype.constructor=Mn,Tn.prototype.clear=function(){this.__data__=Gi?Gi(null):{},this.size=0},Tn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], -this.size-=n?1:0,n},Tn.prototype.get=function(n){var t=this.__data__;return Gi?(n=t[n],"__lodash_hash_undefined__"===n?F:n):ci.call(t,n)?t[n]:F},Tn.prototype.has=function(n){var t=this.__data__;return Gi?t[n]!==F:ci.call(t,n)},Tn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Gi&&t===F?"__lodash_hash_undefined__":t,this},Nn.prototype.clear=function(){this.__data__=[],this.size=0},Nn.prototype.delete=function(n){var t=this.__data__;return n=lt(t,n),!(0>n)&&(n==t.length-1?t.pop():wi.call(t,n,1), ---this.size,true)},Nn.prototype.get=function(n){var t=this.__data__;return n=lt(t,n),0>n?F:t[n][1]},Nn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Tn,map:new(Zi||Nn),string:new Tn}},Pn.prototype.delete=function(n){return n=we(this,n).delete(n),this.size-=n?1:0,n},Pn.prototype.get=function(n){return we(this,n).get(n); -},Pn.prototype.has=function(n){return we(this,n).has(n)},Pn.prototype.set=function(n,t){var r=we(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},qn.prototype.add=qn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},qn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.clear=function(){this.__data__=new Nn,this.size=0},Vn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Vn.prototype.get=function(n){ -return this.__data__.get(n)},Vn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Nn){var e=r.__data__;if(!Zi||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Pn(e)}return r.set(n,t),this.size=r.size,this};var oo=Zr(Et),fo=Zr(Ot,true),co=qr(),ao=qr(true),lo=Hi?function(n,t){return Hi.set(n,t),n}:Nu,so=Ei?function(n,t){return Ei(n,"toString",{configurable:true,enumerable:false,value:Fu(t),writable:true})}:Nu,ho=Oi||function(n){ -return Zn.clearTimeout(n)},po=Vi&&1/D(new Vi([,-0]))[1]==N?function(n){return new Vi(n)}:qu,_o=Hi?function(n){return Hi.get(n)}:qu,vo=Wi?function(n){return null==n?[]:(n=ni(n),f(Wi(n),function(t){return ji.call(n,t)}))}:Ku,go=Wi?function(n){for(var t=[];n;)s(t,vo(n)),n=bi(n);return t}:Ku,yo=zt;(Pi&&"[object DataView]"!=yo(new Pi(new ArrayBuffer(1)))||Zi&&"[object Map]"!=yo(new Zi)||qi&&"[object Promise]"!=yo(qi.resolve())||Vi&&"[object Set]"!=yo(new Vi)||Ki&&"[object WeakMap]"!=yo(new Ki))&&(yo=function(n){ -var t=zt(n);if(n=(n="[object Object]"==t?n.constructor:F)?Fe(n):"")switch(n){case Yi:return"[object DataView]";case Qi:return"[object Map]";case Xi:return"[object Promise]";case no:return"[object Set]";case to:return"[object WeakMap]"}return t});var bo=oi?gu:Gu,xo=Me(lo),jo=Ii||function(n,t){return Zn.setTimeout(n,t)},wo=Me(so),mo=function(n){n=lu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return en.test(n)&&t.push(""),n.replace(un,function(n,r,e,u){ -t.push(e?u.replace(vn,"$1"):r||n)}),t}),Ao=lr(function(n,t){return _u(n)?jt(n,kt(t,1,_u,true)):[]}),ko=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),je(r,2)):[]}),Eo=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),F,r):[]}),Oo=lr(function(n){var t=l(n,Sr);return t.length&&t[0]===n[0]?Ut(t):[]}),So=lr(function(n){var t=Ge(n),r=l(n,Sr);return t===Ge(r)?t=F:r.pop(),r.length&&r[0]===n[0]?Ut(r,je(t,2)):[]}),Io=lr(function(n){var t=Ge(n),r=l(n,Sr);return(t=typeof t=="function"?t:F)&&r.pop(), -r.length&&r[0]===n[0]?Ut(r,F,t):[]}),Ro=lr(He),zo=ge(function(n,t){var r=null==n?0:n.length,e=vt(n,t);return fr(n,l(t,function(n){return Re(n,r)?+n:n}).sort(Ur)),e}),Wo=lr(function(n){return wr(kt(n,1,_u,true))}),Bo=lr(function(n){var t=Ge(n);return _u(t)&&(t=F),wr(kt(n,1,_u,true),je(t,2))}),Lo=lr(function(n){var t=Ge(n),t=typeof t=="function"?t:F;return wr(kt(n,1,_u,true),F,t)}),Uo=lr(function(n,t){return _u(n)?jt(n,t):[]}),Co=lr(function(n){return Er(f(n,_u))}),Do=lr(function(n){var t=Ge(n);return _u(t)&&(t=F), -Er(f(n,_u),je(t,2))}),Mo=lr(function(n){var t=Ge(n),t=typeof t=="function"?t:F;return Er(f(n,_u),F,t)}),To=lr(Ye),$o=lr(function(n){var t=n.length,t=1=t}),cf=Mt(function(){return arguments}())?Mt:function(n){return xu(n)&&ci.call(n,"callee")&&!ji.call(n,"callee")},af=Hu.isArray,lf=Hn?S(Hn):Tt,sf=Bi||Gu,hf=Jn?S(Jn):$t,pf=Yn?S(Yn):Nt,_f=Qn?S(Qn):qt,vf=Xn?S(Xn):Vt,gf=nt?S(nt):Kt,df=oe(Jt),yf=oe(function(n,t){return n<=t}),bf=Pr(function(n,t){ -if(Le(t)||pu(t))Tr(t,Lu(t),n);else for(var r in t)ci.call(t,r)&&at(n,r,t[r])}),xf=Pr(function(n,t){Tr(t,Uu(t),n)}),jf=Pr(function(n,t,r,e){Tr(t,Uu(t),n,e)}),wf=Pr(function(n,t,r,e){Tr(t,Lu(t),n,e)}),mf=ge(vt),Af=lr(function(n){return n.push(F,se),r(jf,F,n)}),kf=lr(function(n){return n.push(F,he),r(Rf,F,n)}),Ef=ne(function(n,t,r){n[t]=r},Fu(Nu)),Of=ne(function(n,t,r){ci.call(n,t)?n[t].push(r):n[t]=[r]},je),Sf=lr(Dt),If=Pr(function(n,t,r){nr(n,t,r)}),Rf=Pr(function(n,t,r,e){nr(n,t,r,e)}),zf=ge(function(n,t){ -var r={};if(null==n)return r;var e=false;t=l(t,function(t){return t=Rr(t,n),e||(e=1--n)return t.apply(this,arguments)}},On.ary=iu,On.assign=bf,On.assignIn=xf,On.assignInWith=jf,On.assignWith=wf,On.at=mf,On.before=ou,On.bind=Yo,On.bindAll=Zf,On.bindKey=Qo,On.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return af(n)?n:[n]}, -On.chain=Xe,On.chunk=function(n,t,r){if(t=(r?ze(n,t,r):t===F)?1:Di(Ou(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Hu(Ri(r/t));et?0:t,e)):[]},On.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0,0>t?0:t)):[]},On.dropRightWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true,true):[]},On.dropWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true):[]},On.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&ze(n,t,r)&&(r=0,e=u),u=n.length,r=Ou(r),0>r&&(r=-r>u?0:u+r),e=e===F||e>u?u:Ou(e),0>e&&(e+=u),e=r>e?0:Su(e);r>>0,r?(n=zu(n))&&(typeof t=="string"||null!=t&&!_f(t))&&(t=jr(t), -!t&&Bn.test(n))?zr($(n),0,r):n.split(t,r):[]},On.spread=function(n,t){if(typeof n!="function")throw new ei("Expected a function");return t=null==t?0:Di(Ou(t),0),lr(function(e){var u=e[t];return e=zr(e,0,t),u&&s(e,u),r(n,this,e)})},On.tail=function(n){var t=null==n?0:n.length;return t?vr(n,1,t):[]},On.take=function(n,t,r){return n&&n.length?(t=r||t===F?1:Ou(t),vr(n,0,0>t?0:t)):[]},On.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0>t?0:t,e)):[]},On.takeRightWhile=function(n,t){ -return n&&n.length?Ar(n,je(t,3),false,true):[]},On.takeWhile=function(n,t){return n&&n.length?Ar(n,je(t,3)):[]},On.tap=function(n,t){return t(n),n},On.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ei("Expected a function");return bu(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),au(n,t,{leading:e,maxWait:t,trailing:u})},On.thru=nu,On.toArray=ku,On.toPairs=Bf,On.toPairsIn=Lf,On.toPath=function(n){return af(n)?l(n,$e):Au(n)?[n]:Mr(mo(zu(n)))},On.toPlainObject=Ru, -On.transform=function(n,t,r){var e=af(n),i=e||sf(n)||gf(n);if(t=je(t,4),null==r){var o=n&&n.constructor;r=i?e?new o:[]:bu(n)&&gu(o)?io(bi(n)):{}}return(i?u:Et)(n,function(n,e,u){return t(r,n,e,u)}),r},On.unary=function(n){return iu(n,1)},On.union=Wo,On.unionBy=Bo,On.unionWith=Lo,On.uniq=function(n){return n&&n.length?wr(n):[]},On.uniqBy=function(n,t){return n&&n.length?wr(n,je(t,2)):[]},On.uniqWith=function(n,t){return t=typeof t=="function"?t:F,n&&n.length?wr(n,F,t):[]},On.unset=function(n,t){return null==n||mr(n,t); -},On.unzip=Ye,On.unzipWith=Qe,On.update=function(n,t,r){return null==n?n:pr(n,t,Ir(r)(It(n,t)),void 0)},On.updateWith=function(n,t,r,e){return e=typeof e=="function"?e:F,null!=n&&(n=pr(n,t,Ir(r)(It(n,t)),e)),n},On.values=Du,On.valuesIn=function(n){return null==n?[]:I(n,Uu(n))},On.without=Uo,On.words=$u,On.wrap=function(n,t){return rf(Ir(t),n)},On.xor=Co,On.xorBy=Do,On.xorWith=Mo,On.zip=To,On.zipObject=function(n,t){return Or(n||[],t||[],at)},On.zipObjectDeep=function(n,t){return Or(n||[],t||[],pr); -},On.zipWith=$o,On.entries=Bf,On.entriesIn=Lf,On.extend=xf,On.extendWith=jf,Zu(On,On),On.add=nc,On.attempt=Pf,On.camelCase=Uf,On.capitalize=Mu,On.ceil=tc,On.clamp=function(n,t,r){return r===F&&(r=t,t=F),r!==F&&(r=Iu(r),r=r===r?r:0),t!==F&&(t=Iu(t),t=t===t?t:0),gt(Iu(n),t,r)},On.clone=function(n){return dt(n,4)},On.cloneDeep=function(n){return dt(n,5)},On.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:F,dt(n,5,t)},On.cloneWith=function(n,t){return t=typeof t=="function"?t:F,dt(n,4,t)}, -On.conformsTo=function(n,t){return null==t||bt(n,t,Lu(t))},On.deburr=Tu,On.defaultTo=function(n,t){return null==n||n!==n?t:n},On.divide=rc,On.endsWith=function(n,t,r){n=zu(n),t=jr(t);var e=n.length,e=r=r===F?e:gt(Ou(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},On.eq=hu,On.escape=function(n){return(n=zu(n))&&Y.test(n)?n.replace(H,et):n},On.escapeRegExp=function(n){return(n=zu(n))&&fn.test(n)?n.replace(on,"\\$&"):n},On.every=function(n,t,r){var e=af(n)?o:wt;return r&&ze(n,t,r)&&(t=F),e(n,je(t,3)); -},On.find=Po,On.findIndex=Ze,On.findKey=function(n,t){return v(n,je(t,3),Et)},On.findLast=Zo,On.findLastIndex=qe,On.findLastKey=function(n,t){return v(n,je(t,3),Ot)},On.floor=ec,On.forEach=ru,On.forEachRight=eu,On.forIn=function(n,t){return null==n?n:co(n,je(t,3),Uu)},On.forInRight=function(n,t){return null==n?n:ao(n,je(t,3),Uu)},On.forOwn=function(n,t){return n&&Et(n,je(t,3))},On.forOwnRight=function(n,t){return n&&Ot(n,je(t,3))},On.get=Wu,On.gt=of,On.gte=ff,On.has=function(n,t){return null!=n&&ke(n,t,Bt); -},On.hasIn=Bu,On.head=Ke,On.identity=Nu,On.includes=function(n,t,r,e){return n=pu(n)?n:Du(n),r=r&&!e?Ou(r):0,e=n.length,0>r&&(r=Di(e+r,0)),mu(n)?r<=e&&-1r&&(r=Di(e+r,0)),d(n,t,r)):-1},On.inRange=function(n,t,r){return t=Eu(t),r===F?(r=t,t=0):r=Eu(r),n=Iu(n),n>=Mi(t,r)&&n=n},On.isSet=vf,On.isString=mu,On.isSymbol=Au,On.isTypedArray=gf,On.isUndefined=function(n){return n===F},On.isWeakMap=function(n){return xu(n)&&"[object WeakMap]"==yo(n)},On.isWeakSet=function(n){return xu(n)&&"[object WeakSet]"==zt(n)},On.join=function(n,t){ -return null==n?"":Ui.call(n,t)},On.kebabCase=Cf,On.last=Ge,On.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==F&&(u=Ou(r),u=0>u?Di(e+u,0):Mi(u,e-1)),t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=g(n,b,u,true);return n},On.lowerCase=Df,On.lowerFirst=Mf,On.lt=df,On.lte=yf,On.max=function(n){return n&&n.length?mt(n,Nu,Wt):F},On.maxBy=function(n,t){return n&&n.length?mt(n,je(t,2),Wt):F},On.mean=function(n){return x(n,Nu)},On.meanBy=function(n,t){return x(n,je(t,2))},On.min=function(n){ -return n&&n.length?mt(n,Nu,Jt):F},On.minBy=function(n,t){return n&&n.length?mt(n,je(t,2),Jt):F},On.stubArray=Ku,On.stubFalse=Gu,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return true},On.multiply=uc,On.nth=function(n,t){return n&&n.length?tr(n,Ou(t)):F},On.noConflict=function(){return Zn._===this&&(Zn._=pi),this},On.noop=qu,On.now=Jo,On.pad=function(n,t,r){n=zu(n);var e=(t=Ou(t))?T(n):0;return!t||e>=t?n:(t=(t-e)/2,ee(zi(t),r)+n+ee(Ri(t),r))},On.padEnd=function(n,t,r){ -n=zu(n);var e=(t=Ou(t))?T(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Fi(),Mi(n+r*(t-n+$n("1e-"+((r+"").length-1))),t)):cr(n,t); -},On.reduce=function(n,t,r){var e=af(n)?h:m,u=3>arguments.length;return e(n,je(t,4),r,u,oo)},On.reduceRight=function(n,t,r){var e=af(n)?p:m,u=3>arguments.length;return e(n,je(t,4),r,u,fo)},On.repeat=function(n,t,r){return t=(r?ze(n,t,r):t===F)?1:Ou(t),ar(zu(n),t)},On.replace=function(){var n=arguments,t=zu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},On.result=function(n,t,r){t=Rr(t,n);var e=-1,u=t.length;for(u||(u=1,n=F);++en||9007199254740991=i)return n;if(i=r-T(e),1>i)return e; -if(r=o?zr(o,0,i).join(""):n.slice(0,i),u===F)return r+e;if(o&&(i+=r.length-i),_f(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=ti(u.source,zu(dn.exec(u))+"g")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===F?i:c)}}else n.indexOf(jr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Mn.prototype[n+"Right"]=function(t){ -return this.reverse()[n](t).reverse()}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Mn.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:je(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");Mn.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Mn.prototype[n]=function(){return this.__filtered__?new Mn(this):this[r](1); -}}),Mn.prototype.compact=function(){return this.filter(Nu)},Mn.prototype.find=function(n){return this.filter(n).head()},Mn.prototype.findLast=function(n){return this.reverse().find(n)},Mn.prototype.invokeMap=lr(function(n,t){return typeof n=="function"?new Mn(this):this.map(function(r){return Dt(r,n,t)})}),Mn.prototype.reject=function(n){return this.filter(su(je(n)))},Mn.prototype.slice=function(n,t){n=Ou(n);var r=this;return r.__filtered__&&(0t)?new Mn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)), -t!==F&&(t=Ou(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Mn.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Mn.prototype.toArray=function(){return this.take(4294967295)},Et(Mn.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=On[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(On.prototype[t]=function(){function t(n){return n=u.apply(On,s([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Mn,a=f[0],l=c||af(o); -l&&r&&typeof a=="function"&&1!=a.length&&(c=l=false);var h=this.__chain__,p=!!this.__actions__.length,a=i&&!h,c=c&&!p;return!i&&l?(o=c?o:new Mn(this),o=n.apply(o,f),o.__actions__.push({func:nu,args:[t],thisArg:F}),new zn(o,h)):a&&c?n.apply(this,f):(o=this.thru(t),a?e?o.value()[0]:o.value():o)})}),u("pop push shift sort splice unshift".split(" "),function(n){var t=ui[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);On.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){ -var u=this.value();return t.apply(af(u)?u:[],n)}return this[r](function(r){return t.apply(af(r)?r:[],n)})}}),Et(Mn.prototype,function(n,t){var r=On[t];if(r){var e=r.name+"";(Ji[e]||(Ji[e]=[])).push({name:t,func:r})}}),Ji[Xr(F,2).name]=[{name:"wrapper",func:F}],Mn.prototype.clone=function(){var n=new Mn(this.__wrapped__);return n.__actions__=Mr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Mr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Mr(this.__views__), -n},Mn.prototype.reverse=function(){if(this.__filtered__){var n=new Mn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Mn.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=af(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c=this.__values__.length;return{done:n,value:n?F:this.__values__[this.__index__++]}},On.prototype.plant=function(n){for(var t,r=this;r instanceof Sn;){var e=Pe(r);e.__index__=0,e.__values__=F,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},On.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Mn?(this.__actions__.length&&(n=new Mn(this)),n=n.reverse(),n.__actions__.push({func:nu,args:[Je],thisArg:F}),new zn(n,this.__chain__)):this.thru(Je); -},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return kr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Ai&&(On.prototype[Ai]=tu),On}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Zn._=it, define(function(){return it})):Vn?((Vn.exports=it)._=it,qn._=it):Zn._=it}).call(this); \ No newline at end of file diff --git a/includes/rubik-regular-webfont.woff b/includes/rubik-regular-webfont.woff deleted file mode 100644 index e12d96463efed38b7896fd8e83c6473e52e19609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33332 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

    u0vx+dNT^uZqw$jHY!9Urqc>!qf|v< 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 diff --git a/includes/script.js b/includes/script.js deleted file mode 100644 index 5d6c0f0..0000000 --- a/includes/script.js +++ /dev/null @@ -1,551 +0,0 @@ -$(document).ready(function() { - // todo define things like 16x16, 128x128 etc. as constants? - // also script debounce/throttle times - let animationTime = 400; // defined in bitsy.js - - let bitsyData = {}; - - let palette = { - id: 0, - background: { - red: 62, - green: 43, - blue: 32 - }, - tile: { - red: 208, - green: 112, - blue: 56 - }, - sprite: { - red: 229, - green: 92, - blue: 68 - } - }; - - let room = []; - - let tileMatchThreshold = 64; - - let croptions = { - url: 'https://i.imgur.com/ThQZ94v.jpg', - viewport: {width: 128, height: 128, type: 'square'}, - boundary: {width: 256, height: 256}, - zoom: 0 - }; - - let $croppie = $('#croppie'); - - $croppie.croppie(croptions); - - function colourDifference(colour1, colour2) { - let difference = {}; - - _.each(['red', 'green', 'blue'], function(key) { - difference[key] = Math.abs(colour1[key] - colour2[key]); - }); - - return _.toInteger(_.sum(_.toArray(difference))); - } - - function zeroPad(input, desiredLength) { - while (input.length < desiredLength) { - input = "0" + input; - } - - return input; - } - - function colourToHex(colour) { - return '#' + zeroPad(Number(colour.red ).toString(16), 2) - + zeroPad(Number(colour.green).toString(16), 2) - + zeroPad(Number(colour.blue ).toString(16), 2); - } - - function hexToColour(hex) { - let rgb = hex.match(/[\da-f]{2}/gi); - - return { - red: parseInt(rgb[0], 16), - green: parseInt(rgb[1], 16), - blue: parseInt(rgb[2], 16) - }; - } - - function getClosestColour(initialColour, colourOptions) { - // ditch sprite colour as we're not using it atm - delete colourOptions.sprite; - - _.each(palette, function(colour, name) { - colourOptions[name].name = name; - colourOptions[name].difference = colourDifference(initialColour, colour); - }); - - // lowest difference (closest) wins - return _.first(_.sortBy(colourOptions, 'difference')); - } - - function newTileName() { - let tileNames = _.map(bitsyData.tiles, 'name'); - - let i = 1; // start with 1 as 0 is an implicit tile - - while (tileNames.indexOf(i.toString(36)) > -1) { - i++; - } - - // base 36 = 0-9a-z - return i.toString(36); - } - - function handleBitsyGameData() { - let input = $bitsyData.val(); - - if ( ! input) { - return; - } - - bitsyData = {}; - - // get palettes - let palettes = input.match(/PAL ([^\n]*)\n(NAME ([^\n]*)\n)?(([0-9,]+){3}\n){3,}/g); - - bitsyData.palettes = {}; - - // do palettes always go 0..n? - // will this cause problems if not? - _.each(palettes, function(palette, n) { - let name = ""; - - if (palette.match(/NAME (.+)\n/)) { - name = palette.match(/NAME (.+)\n/)[0].replace('NAME ', ''); - } else if (palette.match(/PAL (\d+)\n/)) { - name = palette.match(/PAL (\d+)\n/)[0].replace("PAL", "palette"); - } - - let colours = palette.match(/\d+,\d+,\d+/g); - - colours = _.map(colours, function(colour) { - let rgb = colour.split(','); - - return {red: rgb[0], green: rgb[1], blue: rgb[2]}; - }); - - bitsyData.palettes[name] = { - id: n, - background: colours[0], - tile: colours[1], - sprite: colours[2] - } - }); - - // get tiles - - bitsyData.tiles = []; - - // tile 0 (background colour only) is implicit in bitsy rather than being stored in the game data - // so, make our own version - bitsyData.tiles.push({ - name: "0", - bitmap: _.chunk(_.times(64, _.constant(0)), 8), - new: false // this could also be used to stop it from being added to the game data, wooo - }); - - // everything after > is an optional second animation frame - // todo: handle multiple animation frames! more than 2 are allowed (but not via the standard editor) - let tiles = input.match(/TIL (.*)\n([01]{8}\n){8}(>\n([01]{8}\n){8})?/g); - - _.each(tiles, function(tile) { - let name = tile.match(/TIL .*/)[0].replace('TIL ', ''); - - tile = tile.replace(/TIL .*\n/, ''); - - let bitmap = _.map(tile.match(/[01]/g), _.toInteger); - - let newTile = { - name: name, - new: false - }; - - // todo make this agnostic? i.e. tile.frames = _.chunk(bitmap, 64) - - if (bitmap.length === 64) { // normal tile - newTile.bitmap = _.chunk(bitmap, 8); - } else if (bitmap.length === 128) { // animated tile - newTile.bitmap = _.chunk(_.take( bitmap, 64), 8); - newTile.secondAnimationFrame = _.chunk(_.takeRight(bitmap, 64), 8); - } - - bitsyData.tiles.push(newTile); - }); - - if (_.find(bitsyData.palettes, {'id': palette.id})) { - // user has already selected a palette, leave it be - - // in case this is the first run: - palette = _.find(bitsyData.palettes, {'id': palette.id}) - - // if we just set the palette to the newly imported palette with the same ID, - // we will lose any changes the user has made to the palettes - // is this a big issue considering that the palettes cannot be currently saved anyway? - } else { - // set palette to first imported palette and redraw - palette = _.first(_.sortBy(bitsyData.palettes, 'id')); - } - - renderDebounced(); - - // update palette picker - $('tr.palette').remove(); - - _.each(bitsyData.palettes, function(palette, name) { - $('#palette tbody').append( - '' - + '' - + '' - + '' - + '' - + '' - + '' - + '' - + '' - + '' - ); - }); - - $('input[name="id"][value="' + palette.id + '"]').siblings(':radio').trigger('click'); - } - - function readFile(input, callback) { - if (input.files && input.files[0]) { - let reader = new FileReader(); - - reader.onload = callback; - - reader.readAsDataURL(input.files[0]); - } - } - - function readTextFile(input, callback) { - if (input.files && input.files[0]) { - let reader = new FileReader(); - - reader.onload = callback; - - reader.readAsText(input.files[0]); - } - } - - function render() { - $croppie.croppie('result', { - type: 'rawcanvas', - size: 'viewport' - }).then(function (result) { - let imageData = result.getContext('2d').getImageData(0, 0, 128, 128); - let rawData = imageData.data; - let monochrome = []; - - let brightnessAdjustment = parseFloat($('#brightness').val()); - - // for each pixel - for (let i = 0; i < rawData.length; i += 4) { - // this brightness adjustment is pretty crude but whatever - let pixel = { - red: _.clamp(rawData[i ] + brightnessAdjustment, 0, 255), - green: _.clamp(rawData[i + 1] + brightnessAdjustment, 0, 255), - blue: _.clamp(rawData[i + 2] + brightnessAdjustment, 0, 255) - }; - - let targetColour = getClosestColour(pixel, palette); - - if (targetColour.name === "background") { - monochrome.push(0); - } else { // tile - monochrome.push(1) - } - - rawData[i ] = targetColour.red; - rawData[i + 1] = targetColour.green; - rawData[i + 2] = targetColour.blue; - rawData[i + 3] = 255; // alpha - } - - // split monochrome bitmap into equal chunks for easier x:y access - monochrome = _.chunk(monochrome, 128); - - document.getElementById('preview').getContext('2d').putImageData(imageData, 0, 0); - - // tiled output - - room = []; - - _.times(16, function(tileY) { - _.times(16, function(tileX) { - // make pseudo-tile from monochrome bitmap - let pseudoTile = []; - - _.times(8, function(y) { - pseudoTile.push( - _.slice(monochrome[(tileY * 8) + y], (tileX * 8), (tileX * 8) + 8) - ); - }); - - let bestMatch; - - // if we want to always create new tiles, don't bother trying to check matches - if (tileMatchThreshold === 64) { - // even if we want to "always create new tiles" we still don't want to create duplicates - bestMatch = _.find(bitsyData.tiles, function(tile) { - return _.isEqual(tile.bitmap, pseudoTile); - }); - - if (bestMatch) { - bestMatch.match = 64; - } - } else { - _.each(bitsyData.tiles, function(tile) { - tile.match = 0; - - _.each(tile.bitmap, function(row, y) { - _.each(row, function(pixel, x) { - if (parseInt(pixel) === parseInt(pseudoTile[y][x])) { - tile.match++; - } - }); - }); - - if (tile.secondAnimationFrame) { - _.each(tile.secondAnimationFrame, function(row, y) { - _.each(row, function(pixel, x) { - if (parseInt(pixel) === parseInt(pseudoTile[y][x])) { - tile.match++; - } - }); - }); - - tile.match /= 2; - } - }); - - // what if there are several equally good matches? - // find highest match amount and find all of them - let bestMatchAmount = _.last(_.sortBy(bitsyData.tiles, ['match'])).match; - let bestMatches = _.filter(bitsyData.tiles, {'match': bestMatchAmount}); - - // sort by name in ascending order - // earlier names are preferable - bestMatch = _.first(_.sortBy(bestMatches, 'name')); - } - - if ( ! bestMatch || bestMatch.match < tileMatchThreshold) { - // turn pseudo-tile into a real tile and add it to the tile data - - let name = newTileName(); - - bitsyData.tiles.push({ - name: name, - bitmap: pseudoTile, - new: true - }); - - room.push(name); - - // issue with this approach: - // what if a tile we add late in the loop is a better match for an earlier "good enough" match? - // this would also cause different results if the user were to add the same room several times - // we could keep iterating until the room no longer changes - } else { - room.push(bestMatch.name); - } - }); - }); - - room = _.chunk(room, 16); - - // write room to output - - imageData = document.getElementById("room-output").getContext('2d').getImageData(0, 0, 128, 128); - rawData = imageData.data; - - _.each(room, function(row, tileY) { - _.each(row, function(tileName, tileX) { - let tile = _.find(bitsyData.tiles, {'name' : tileName}); - - _.each(tile.bitmap, function(row, y) { - _.each(row, function(pixel, x) { - let position = (((tileY * 8) + y) * 128) + ((tileX * 8) + x); - - position *= 4; // 4 values (rgba) per pixel - - let pixelColour = {}; - - switch(parseInt(pixel)) { - case 0: pixelColour = palette.background; break; - case 1: pixelColour = palette.tile; break; - default: console.log("error"); - } - - rawData[position ] = pixelColour.red; - rawData[position + 1] = pixelColour.green; - rawData[position + 2] = pixelColour.blue; - rawData[position + 3] = 255; - }); - }); - }); - }); - - document.getElementById('room-output').getContext('2d').putImageData(imageData, 0, 0); - }); - } - - let renderDebounced = _.debounce(render, 30); - let renderThrottled = _.throttle(render, 30); - - $croppie.on('update', renderDebounced); - - let $brightness = $('#brightness'); - - $brightness.on('change', renderThrottled); - - $brightness.on('dblclick', function() { - $(this).val(0); - - renderDebounced(); - }); - - $('label[for="brightness"]').on('click touchdown', function() { - $('#brightness').trigger('dblclick'); - }); - - let $bitsyData = $('#bitsy-data'); - - $bitsyData.on('change blur keyup', handleBitsyGameData); - - $bitsyData.on('focus', function() { - $(this).select(); - }); - - handleBitsyGameData(); - - $('#imageUpload').on('change', function () { - readFile(this, function (e) { - $croppie.croppie('bind', { - url: e.target.result, - zoom: 0 - }); - }); - }); - - $('input.game-data').on('change', function() { - readTextFile(this, function (e) { - $bitsyData.val(e.target.result); - handleBitsyGameData(); - }); - }); - - // these inputs get added and removed from the DOM so the event handler needs to be on the document - $(document).on('change', '#palette input', function() { - let id = parseInt($(this).closest('.palette').find('input[name="id"]').val()); - - // if this is a colour input, update the palette - if ($(this).attr('type') === 'color') { - if (id === palette.id) { - palette[$(this).attr('name')] = hexToColour($(this).val()); - } - } - - // if this is a radio button, pick this palette - if ($(this).attr('type') === 'radio') { - palette.id = id; - palette.background = hexToColour($(this).closest('.palette').find('input[name="background"]').val()); - palette.tile = hexToColour($(this).closest('.palette').find('input[name="tile"]' ).val()); - // sprite colour is not currently used - } - - renderDebounced(); - }); - - $(document).on('change', '#threshold', function() { - let newValue = parseInt($(this).val()); - - if (newValue < tileMatchThreshold) { - // set tiles back to default - bitsyData.tiles = _.filter(bitsyData.tiles, ['new', false]); - } - - tileMatchThreshold = newValue; - - renderThrottled(); - }); - - $('#never').on('click touchend', function() { - $('#threshold').val(0).change(); - }); - - $('#always').on('click touchend', function() { - $('#threshold').val(64).change(); - }); - - $('#save').on('click touchend', function() { - let $textArea = $('textarea'); - - let newGameData = $textArea.val(); - - // handle rooms - - // need to import IDs so we don't give the new room a conflicting ID - let roomIds = newGameData.match(/ROOM \d+\n/g); - - roomIds = _.map(roomIds, function(roomId) { - return parseInt(roomId.replace(/[^\d]+/g, "")); - }); - - let newRoomId = _.max(roomIds) + 1; - - let newRoomName = $('#roomName').val(); - // remove invalid chars? what's invalid? newlines? are those possible? - - let newRoom = "ROOM " + newRoomId + "\n"; - - _.each(room, function(row) { - newRoom += _.toString(row) + "\n"; - }); - - if (newRoomName) { - newRoom += "NAME " + newRoomName + "\n"; - } - - newRoom += "PAL " + palette.id + "\n"; - - newGameData = newGameData.replace(/(ROOM .*\n(.*\n)*PAL .*)/g, '$1\n\n' + newRoom); - - // handle tiles - - let newTiles = _.filter(bitsyData.tiles, 'new'); - let tileText = ""; - - _.each(newTiles, function(tile, n) { - tileText += "TIL " + tile.name + "\n"; //again, rename tile name to id... - - _.each(tile.bitmap, function(row) { - tileText += row.join('') + "\n"; - }); - - tileText += "NAME " + newRoomName + " " + (n + 1) + "\n"; - - // don't need to worry about animation right now - - tileText += "\n"; - }); - - newGameData = newGameData.replace(/(TIL.*(.*\n)*)SPR/g, '$1\n\n' + tileText + 'SPR'); - - // write - $textArea.val(newGameData); - - handleBitsyGameData(); - - // todo: give the user some nice "yay! it worked!" kinda feedback? - }); -}); diff --git a/includes/style.css b/includes/style.css deleted file mode 100644 index 8a6ebcb..0000000 --- a/includes/style.css +++ /dev/null @@ -1,112 +0,0 @@ -@font-face { - font-family: 'rubikregular'; - src: url('rubik-regular-webfont.woff2') format('woff2'), url('rubik-regular-webfont.woff') format('woff'); - font-weight: normal; - font-style: normal; -} -* { - box-sizing: border-box; - font-family: "rubikregular", sans-serif; - text-align: center; -} -html, -body { - background-color: #594a54; - color: #d3cbd0; -} -a { - color: #f69f8f; -} -canvas { - image-rendering: -moz-crisp-edges; - image-rendering: pixelated; -} -input[type="color"] { - width: 2em; - height: 2em; - margin: 0; - padding: 0; - border: none; - background: none; -} -input[type="color"][disabled] { - opacity: 0.5; -} -input[type="file"] { - padding: 1em 0; - width: 256px; -} -input[type="text"], -button { - width: 14em; - margin: 1em; - padding: 0.25em; - font-size: 1em; -} -table { - margin: 0 auto; -} -table td, -table th { - width: 50%; -} -table td { - text-align: left; -} -table th { - text-align: right; -} -textarea { - height: 256px; - width: 256px; - font-family: monospace; -} -textarea, -input { - text-align: left; -} -.box256 { - height: 256px; - width: 256px; -} -.centre { - margin: 0 auto; -} -.croppie-container { - height: auto; -} -.flex-container { - background-color: #d3cbd0; - display: flex; - flex-flow: row wrap; -} -.section { - margin: 0 auto; - background-color: #d3cbd0; - color: #594a54; - width: 256px; - padding-bottom: 1em; -} -#brightness { - width: 256px; -} -#threshold { - width: 150px; -} -#brightness + label, -#threshold + label { - margin: 0 auto; -} -#palettes { - height: 256px; - width: 256px; - overflow-y: scroll; -} -#preview, -#room-output { - margin: 0 auto; - width: 256px; -} -#save { - margin-top: 0; -} diff --git a/includes/style.less b/includes/style.less index 98f8b33..f95c7a0 100644 --- a/includes/style.less +++ b/includes/style.less @@ -1,144 +1,108 @@ -@font-face { - font-family: 'rubikregular'; - src: url('rubik-regular-webfont.woff2') format('woff2'), - url('rubik-regular-webfont.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@light: #d3cbd0; -@dark: #594a54; -@accent: #f69f8f; // pink +@background: #fff4d9; +@text: #ec6d7d; +@accent: #a3c4ef; * { box-sizing: border-box; - font-family: "rubikregular", sans-serif; + color: @text; + margin: 0 auto 0.5em auto; text-align: center; } html, body { - background-color: @dark; - color: @light; -} - -a { - color: @accent; -} - -canvas { - image-rendering: -moz-crisp-edges; - image-rendering: pixelated; -} - -input[type="color"] { - &[disabled] { - opacity: 0.5; - } - - width: 2em; - height: 2em; + background-color: @background; + font-size: 3vmin; margin: 0; padding: 0; - border: none; - background: none; } -input[type="file"] { - padding: 1em 0; - width: 256px; +button { + padding: 1em; + white-space: nowrap; + width: 100%; + + &.pagination:not(.normal) { + position: absolute; + bottom: 5vmin; + width: auto; + + &.prev { + left: 5vmin; + } + + &.next, &.start { + right: 5vmin; + } + } } -input[type="text"], button { - width: 14em; - margin: 1em; - padding: 0.25em; - font-size: 1em; +h1 { + margin: 0; } -table { - margin: 0 auto; +h3 { + font-size: 0.9em; +} - td, th { - width: 50%; +input { + width: 100%; + text-align: left; + + &[type="checkbox"] { + width: auto; + margin-right: 1em; + position: relative; + top: 0.25em; + left: 0.25em; } +} - td { - text-align: left; - } +img { + max-height: 12em; + max-width: 100%; + margin: 0; +} - th { - text-align: right; - } +p { + font-size: 0.8em; + margin: 0 auto 1em auto; +} + +label { + font-size: 0.75em; + font-weight: bold; } textarea { - .box256; - - font-family: monospace; + height: 15em; + padding: 0.5em; + text-align: left; + width: 100%; } -textarea, input { +.background { + background-color: @background; + padding: 0.5em; + border-radius: 0.5em; +} + +.checkboxes label { + margin-right: 1em; +} + +.image-container { + height: 38.5vmin; text-align: left; } -.box256 { - height: 256px; - width: 256px; -} - -.centre { - margin: 0 auto; -} - -.croppie-container { - height: auto; -} - -.flex-container { - background-color: @light; - display: flex; - flex-flow: row wrap; -} - -// make this just for desktop view? -// put sections in a single column on mobile/etc? -.section { - .centre; - - background-color: @light; - color: @dark; - width: 256px; - padding-bottom: 1em; -} - -#brightness { - width: 256px; -} - -#threshold { - width: 150px; -} - -#brightness, #threshold { - + label{ - .centre; - } - - // todo make this match the croppie slider or vice versa -} - -#palettes { - .box256; - - overflow-y: scroll; -} - -#preview, #room-output { - .centre; - - width: 256px; -} - -#save { - margin-top: 0; +.page { + height: 70vmin; + width: 70vmin; + + background-color: @background; + border: 2px solid @accent; + border-radius: 5vmin; + box-shadow: @accent 1vmin 1vmin; + padding: 5vmin; + position: relative; } diff --git a/index.html b/index.html deleted file mode 100644 index 4bc52bc..0000000 --- a/index.html +++ /dev/null @@ -1,90 +0,0 @@ -image to bitsy

    image-to-bitsy

    convert any image to a bitsy room

    about -| -please contact me if you have any issues: -twitter, -email -

    game data

    paste or upload your game data (or html) here

    (maybe make a backup first)

    image

    palette

    preview

    output



    \ No newline at end of file diff --git a/index.pug b/index.pug index a7c450a..c9d6fc0 100644 --- a/index.pug +++ b/index.pug @@ -1,96 +1,50 @@ doctype html -html +html(lang="en-gb") head meta(charset="utf-8") - title image to bitsy - - // lodash - script(src="includes/lodash.min.js") - - // jquery - script(src="includes/jquery.min.js") - - // croppie - link(rel="stylesheet" href="includes/croppie.css") - script(src="includes/croppie.js") - - // main stuff - link(rel="stylesheet" type="text/css" href="includes/style.css") - script(src="includes/script.js") + title pixsy + link(rel="stylesheet" href="includes/style.css") body - header - h1 image-to-bitsy - p convert any image to a #[a(href="https://ledoux.itch.io/bitsy") bitsy] room - p. - #[a(href="https://github.com/synth-ruiner/bitsy-image-to-room") about] - | - please contact me if you have any issues: - #[a(href="https://twitter.com/synth_ruiner") twitter], - #[a(href="mailto:max@tinybird.info") email] - - .flex-container - #game-data.section + h1 + | pixsy + //img(alt="tilesy" src="includes/tilesy.png") + p + span.background convert images to Bitsy rooms + .pages + .page#start + button.normal.pagination.next#new create a new bitsy game + button.normal.pagination.next#load load an existing bitsy game + .page.game-data h2 game data - - textarea#bitsy-data(placeholder="Bitsy data or html") - include includes/default.bitsy - - p - input.game-data(type="file") - p paste or upload your game data (or html) here - p (maybe make a backup first) - - #image.section + input#game(type="file" autocomplete="off") + br + textarea#game-data( + placeholder="Paste your game data here or use the file chooser button above" + autocomplete="off" + ) + button.pagination.prev previous + button.pagination.next#game-data-next(disabled=true) next + .page.image h2 image + .image-container + input#image(type="file" autocomplete="off") + img#preview + button.pagination.prev previous + button.pagination.next next + .page.extras + h2 tiles + label + | tile name (optional) + input#prefix(type="text" placeholder="e.g. 'forest'" autocomplete="off") - #croppie - - input#imageUpload(type="file" accepts="image/*") - - #palette.section - h2 palette - - form#palettes - table - tbody - - #crop.section - h2 preview - - canvas#preview(width=128, height=128) - - input#brightness(type="range" min=-255 max=255 value=0) - - label(for="brightness") brightness - - //- to do - input#dithering(type="checkbox") - label(for="dithering") dithering - - //- to do - input#smoothing(type="checkbox") - label(for="smoothing") smoothing - - #output.section - h2 output - - canvas#room-output(width=128, height=128) - - label#never never - input#threshold(type="range" min=0 max=64 value=64) - label#always always + button.pagination.prev#back-to-image previous + button.pagination.next#import next + .page.download + h2 download + textarea#output(autocomplete="off") br - label(for="threshold") create new tiles - br - - input#roomName(type="text", placeholder="room name") - - button#save write to game data - - //- to do - - //-label favour broad strokes | favour details - - br - - //-button Download \ No newline at end of file + button#download download + button.pagination.prev#add add another image + button.pagination.start#reset start again + script(type="module") + include script.js diff --git a/package.json b/package.json deleted file mode 100644 index 28778ee..0000000 --- a/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "bitsy-image-to-room", - "description": "Tool to convert images to Bitsy rooms. Can work as an offline web application", - "version": "0.0.1", - "devDependencies": { - "pug": "latest", - "pug-cli": "latest", - "less": "latest" - }, - "dependencies": { - "croppie": "^2.5.1", - "jquery": "^3.5.0" - } -} diff --git a/readme.md b/readme.md deleted file mode 100644 index a50634d..0000000 --- a/readme.md +++ /dev/null @@ -1,87 +0,0 @@ -# image to bitsy - -## about - -a tool for Bitsy. upload any image and convert it into a room. -the room will be added to the game data automatically and you can paste it back into Bitsy. - -## thanks - -to **Adam Le Doux** for creating the wonderful and inspiring Bitsy - -to **J.P. LeBreton** for creating Playscii which was a huge inspiration for this tool - -to **Mark Wonnacott** for being relentlessly encouraging and making me want to work even an eighth as hard as them - -to **Foliotek** for the **Croppie** image plugin - -## contributing - -Forks and pull requests welcome! - -The stylesheet and html are auto-generated; if you want to alter them please edit the pug template or less stylesheet, then either run the included `build.sh` script or build from the command line as follows: - -`pug index.pug index.html` - -`lessc style.less style.css` - -`pug` and `less` can be installed via `npm` as follows: - -`npm install -g pug-cli` - -`npm install -g less` - -I had to hack the included Croppie plugin to allow the user to upload images from their own computer without falling foul of CORS restrictions. So the version bundled here is non-standard. It's a one-line change: - -``` -// croppie.js:182 (original) -if (src.match(/^(https)?:\/\/|^\/\//)) { -// croppie.js:182 (mine) -if (src.match(/^(file|https)?:\/\/|^\/\//)) { -``` - -## bugs - -* does not work on ipad (can't scroll to the right?) - * possibly fixed; needs testing -* create tiles slider breaks onto 2 lines in some browsers? -* sometimes overwrites existing rooms? - -## to do - -* test new room ID handling!!! -* don't reuse wall tiles -* add 'clear'/'upload' buttons for game data -* select all on clicking game data entry field -* allow user to save output as image, or tweet it :) - * *user can currently right-click -> Save As but the 128x128 size is not great* -* animate animated tiles -* profile script performance and optimise where most needed -* make brightness slider trigger redraw every so often while being dragged, instead of waiting until drag stop -* add up/down arrows to the brightness slider for incremental tweaks -* add 'all-white' tile by default in case the game data doesn't have it? -* handle arbitrary animation frames (editor only supports 2 frames, but game data has no upper limit) -* list how many new tiles are being created -* combine preview and output -* give warning on duplicate room names? -* loading spinner on rendering? -* make brightness slider exponential -* rotation options for image - -## could do - -* add some alternate default tiles - something more useful e.g. dithered tiles, gradients -* add dithering options -* add camera support so users can take a pic instead of uploading an image -* add a 'smoothing' stage to remove errant pixels -* allow user to add palettes to game data -* allow user to draw to canvas -* do a 'branching tree' approach to finding the closest tile? i.e. create a 1x1, 2x2, 4x4 version of each tile, so all the broadly darker tiles will sit under '0' and lighter tiles under '1', then tiles that are lighter at the top will sit under '1100', etc... I'm not sure how much more effective this will be or whatever it will give better/faster results but it's worth a try -* give heavier weighting to edge pixels when finding a matching tile? (thanks Mark) -* apply grid lines to preview -* optionally add inverted versions of existing tiles if they are a better match -* make new tiles out of fragments of existing tiles instead of directly copying from bitmap -* allow user to zoom out so the image is letterboxed/windowboxed/etc. -* add 'invert' function -* allow for image colour hack -* make a tool for batch importing images? diff --git a/script.js b/script.js new file mode 100644 index 0000000..c8ec306 --- /dev/null +++ b/script.js @@ -0,0 +1,168 @@ +import init, {load_default_game_data, add_tiles} from './pkg/pixsy.js'; + +// stolen from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server +function download(filename, text) { + let element = document.createElement('a'); + + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); +} + +function el(id) { + return document.getElementById(id); +} + +function pagination(e) { + const parent = e.target.parentNode; + + parent.style.display = "none"; + + if (e.target.classList.contains("next")) { + parent.nextSibling.style.display = "block"; + } else if (e.target.classList.contains("prev")) { + parent.previousSibling.style.display = "block"; + } else if (e.target.classList.contains("start")) { + document.getElementById("start").style.display = "block"; + } +} + +function readFile(input, callback, type = "text") { + if (input.files && input.files[0]) { + let reader = new FileReader(); + reader.onload = callback; + + if (type === "text") { + reader.readAsText(input.files[0]); + } else { + reader.readAsDataURL(input.files[0]); + } + } +} + +async function run() { + await init(); + + const buttonAddImage = el("add"); + const buttonBackToImage = el("back-to-image"); + const buttonDownload = el("download"); + const buttonGameDataProceed = el("game-data-next"); + const buttonImportGame = el("import"); + const buttonLoadGame = el("load"); + const buttonNewGame = el("new"); + const buttonReset = el("reset"); + const checkboxInvertTiles = el("invert"); + const checkboxFlipTiles = el("flip"); + const checkboxMirrorTiles = el("mirror"); + const checkboxRotateTiles = el("rotate"); + const inputPrefix = el("prefix"); + const imagePreview = el("preview"); + const textareaGameDataInput = el("game-data"); + const textareaGameDataOutput = el("output"); + + // hide all pages except start page + for (let page of document.getElementsByClassName('page')) { + page.style.display = "none"; + } + el("start").style.display = "block"; + + for (let pageButton of document.getElementsByClassName("pagination")) { + pageButton.addEventListener('click', pagination); + pageButton.addEventListener('touchend', pagination); + } + + function new_game() { + textareaGameDataInput.value = load_default_game_data(); + checkGameData(); + // we don't need to look at the default game data, so skip ahead to the image page + buttonGameDataProceed.click(); + } + + function clear_game() { + textareaGameDataInput.value = ""; + checkGameData(); + } + + buttonNewGame.addEventListener("click", new_game); + buttonNewGame.addEventListener("touchend", new_game); + buttonLoadGame.addEventListener("click", clear_game); + buttonLoadGame.addEventListener("touchend", clear_game); + + // handle game data and image + + el("game").addEventListener("change", function() { + readFile(this, function (e) { + textareaGameDataInput.value = e.target.result; + checkGameData(); + }, "text"); + }); + + function checkGameData() { + if (textareaGameDataInput.value.length > 0) { + buttonGameDataProceed.removeAttribute("disabled"); + } else { + buttonGameDataProceed.setAttribute("disabled", "disabled"); + } + } + + textareaGameDataInput.addEventListener("change", checkGameData); + textareaGameDataInput.addEventListener("keyup", checkGameData); + checkGameData(); + + imagePreview.style.display = "none"; + + el('image').addEventListener('change', function () { + readFile(this, function (e) { + imagePreview.src = e.target.result; + imagePreview.style.display = "initial" + }, "image"); + }); + + function addTiles() { + let image = imagePreview.getAttribute("src"); + let gameData = textareaGameDataInput.value; + let prefix = inputPrefix.value; + + textareaGameDataOutput.value = add_tiles( + gameData, + image, + prefix, + checkboxInvertTiles.checked, + checkboxFlipTiles.checked, + checkboxMirrorTiles.checked, + checkboxRotateTiles.checked + ); + } + + buttonImportGame.addEventListener("click", addTiles); + buttonImportGame.addEventListener("touchend", addTiles); + + function handleDownload() { + download("output.bitsy", textareaGameDataOutput.value); + } + + buttonDownload.addEventListener("click", handleDownload); + buttonDownload.addEventListener("touchend", handleDownload); + + function addImage() { + textareaGameDataInput.value = textareaGameDataOutput.value; + textareaGameDataOutput.value = ""; + buttonBackToImage.click(); + } + + buttonAddImage.addEventListener("click", addImage); + buttonAddImage.addEventListener("touchend", addImage); + + function reset() { + clear_game(); + imagePreview.removeAttribute("src"); + } + + buttonReset.addEventListener("click", reset); + buttonReset.addEventListener("touchend", reset); +} + +run(); diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..a7316bf --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,174 @@ +use bitsy_parser::game::Game; +use bitsy_parser::image::Image; +use bitsy_parser::tile::Tile; +use image::{GenericImageView, Pixel}; +use wasm_bindgen::prelude::*; + +const SD: u32 = 8; + +#[wasm_bindgen] +pub fn load_default_game_data() -> String { + bitsy_parser::mock::game_default().to_string() +} + +fn tile_name(prefix: &str, index: &u32) -> Option { + if prefix.len() > 0 { + Some(format!("{} {}", prefix, index)) + } else { + None + } +} + +/// image is a base64-encoded string +/// prefix will be ignored if empty +#[wasm_bindgen] +pub fn add_tiles( + game_data: String, + image: String, + prefix: String, + invert: bool, + flip: bool, + mirror: bool, + rotate: bool +) -> String { + let game = Game::from(game_data); + if game.is_err() { + return format!("Couldn't parse game data"); + } + let mut game = game.unwrap(); + + let image: Vec<&str> = image.split("base64,").collect(); + let image = image[1]; + + let image = base64::decode(image); + if image.is_err() { + return format!("Couldn't decode image"); + } + let image = image.unwrap(); + let image = image::load_from_memory(image.as_ref()); + if image.is_err() { + return format!("Couldn't load image"); + } + let image = image.unwrap(); + + let width = image.width(); + let height = image.height(); + let columns = (width as f64 / SD as f64).floor() as u32; + let rows = (height as f64 / SD as f64).floor() as u32; + + let mut tile_index = 1; + + for column in 0..columns { + for row in 0..rows { + let mut pixels = Vec::with_capacity(64); + + for y in (row * SD)..((row + 1) * SD) { + for x in (column * SD)..((column + 1) * SD) { + let pixel = image.get_pixel(x, y).to_rgb(); + let total = pixel[0] as u32 + pixel[1] as u32 + pixel[2] as u32; + // is each channel brighter than 128/255 on average? + pixels.push(if total >= 384 {1} else {0}); + } + } + + let tile = Tile { + /// "0" will get overwritten to a new, safe tile ID + id: "0".to_string(), + name: tile_name(&prefix, &tile_index), + wall: None, + animation_frames: vec![Image { pixels }], + colour_id: None + }; + + if !game.tiles.contains(&tile) { + game.add_tile(tile.clone()); + + tile_index += 1; + } + + if invert { + let mut inverted = tile.clone(); + inverted.invert(); + + if inverted.name.is_some() { + inverted.name = Some(format!("{} inverted", inverted.name.unwrap())); + } + + if !game.tiles.contains(&inverted) { + game.add_tile(inverted); + } + } + + if flip { + let mut flipped = tile.clone(); + flipped.flip(); + + if flipped.name.is_some() { + flipped.name = Some(format!("{} flipped", flipped.name.unwrap())); + } + + if !game.tiles.contains(&flipped) { + game.add_tile(flipped); + } + } + + if mirror { + let mut mirrored = tile.clone(); + mirrored.mirror(); + + if mirrored.name.is_some() { + mirrored.name = Some(format!("{} mirrored", mirrored.name.unwrap())); + } + + if !game.tiles.contains(&mirrored) { + game.add_tile(mirrored); + } + } + + if rotate { + for i in 1..4 { + let mut rotated = tile.clone(); + + for _ in 0..i { + rotated.rotate(); + } + + if rotated.name.is_some() { + rotated.name = Some(format!("{} {}°", rotated.name.unwrap(), i * 90)); + } + + if !game.tiles.contains(&rotated) { + game.add_tile(rotated); + } + } + } + } + } + + game.dedupe_tiles(); + game.to_string() +} + +#[cfg(test)] +mod test { + use crate::add_tiles; + + #[test] + fn example() { + let game_data = bitsy_parser::mock::game_default().to_string(); + let image = include_str!("test-resources/test.png.base64").to_string(); + + let output = add_tiles( + game_data, + image, + "".to_string(), + false, + false, + false, + false + ); + + let expected = include_str!("test-resources/expected.bitsy"); + assert_eq!(output, expected); + } +} From 8a8743de933f1fee7471ed26c42d956c60a6cf37 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 30 Oct 2020 23:54:19 +0000 Subject: [PATCH 02/64] exact version --- Cargo.toml | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d7397c1..a9c3136 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,17 +11,7 @@ repository = "https://tinybird.dev/max/image-to-bitsy" crate-type = ["cdylib", "rlib"] [dependencies] -"base64" = "^0.12.3" -"bitsy-parser" = "^0.72.0" -"image" = "^0.23.7" -"wasm-bindgen" = "^0.2.64" - -[dependencies.web-sys] -version = "^0.3.4" -features = [ - 'Document', - 'Element', - 'HtmlElement', - 'Node', - 'Window', -] +"base64" = "^0.13.0" +"bitsy-parser" = "^0.72.3" +"image" = "^0.23.11" +"wasm-bindgen" = "=0.2.65" # because later versions are currently broken From 4dbcd6ac6665a800e6ac04438d6721fbe8c16c2a Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 15:38:43 +0000 Subject: [PATCH 03/64] update with new changes from tilesy --- .gitignore | 1 + Cargo.toml | 11 +-- deploy.sh | 7 +- script.js | 59 +++++++++++----- src/lib.rs | 204 ++++++++++++++++++++++++++++++++++++++--------------- 5 files changed, 202 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 6daf201..7943bb3 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ itch* .idea /Cargo.lock +/dist/ diff --git a/Cargo.toml b/Cargo.toml index a9c3136..7881897 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pixsy" -version = "0.72.0" +version = "0.72.3" description = "convert images to Bitsy rooms" authors = ["Max Bradbury "] edition = "2018" @@ -8,10 +8,11 @@ license = "MIT" repository = "https://tinybird.dev/max/image-to-bitsy" [lib] -crate-type = ["cdylib", "rlib"] +crate-type = ["cdylib"] [dependencies] -"base64" = "^0.13.0" +"base64" = "^0.12.3" "bitsy-parser" = "^0.72.3" -"image" = "^0.23.11" -"wasm-bindgen" = "=0.2.65" # because later versions are currently broken +"image" = "^0.23.7" +"lazy_static" = "^1.4.0" +"wasm-bindgen" = "=0.2.64" # newer versions are bugged... diff --git a/deploy.sh b/deploy.sh index 23ee025..e38a15e 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,6 +1,7 @@ #! /usr/bin/env bash ./build.sh -# todo create dist directory instead of zip -zip -r tilesy.zip README.md index.html script.js background.png pkg/ includes/ -butler push tilesy.zip ruin/image-to-bitsy:html +rm -rf dist +mkdir dist +cp -r README.md LICENSE index.html script.js background.png pkg includes dist +butler push dist ruin/image-to-bitsy:html diff --git a/script.js b/script.js index c8ec306..d292584 100644 --- a/script.js +++ b/script.js @@ -1,4 +1,19 @@ -import init, {load_default_game_data, add_tiles} from './pkg/pixsy.js'; +import init, { + add_tiles, + load_image, + load_game, + load_default_game, + output, + set_prefix, + set_invert, + set_flip, + set_mirror, + set_rotate +} from './pkg/pixsy.js'; + +if (typeof WebAssembly !== "object") { + document.getElementById("start").innerText = "Sorry - your browser does not support WebAssembly"; +} // stolen from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server function download(filename, text) { @@ -75,7 +90,8 @@ async function run() { } function new_game() { - textareaGameDataInput.value = load_default_game_data(); + load_default_game() + textareaGameDataInput.value = output(); checkGameData(); // we don't need to look at the default game data, so skip ahead to the image page buttonGameDataProceed.click(); @@ -96,6 +112,7 @@ async function run() { el("game").addEventListener("change", function() { readFile(this, function (e) { textareaGameDataInput.value = e.target.result; + console.log(load_game(e.target.result)); checkGameData(); }, "text"); }); @@ -117,24 +134,14 @@ async function run() { el('image').addEventListener('change', function () { readFile(this, function (e) { imagePreview.src = e.target.result; - imagePreview.style.display = "initial" + imagePreview.style.display = "initial"; + console.log(load_image(imagePreview.getAttribute("src"))); }, "image"); }); function addTiles() { - let image = imagePreview.getAttribute("src"); - let gameData = textareaGameDataInput.value; - let prefix = inputPrefix.value; - - textareaGameDataOutput.value = add_tiles( - gameData, - image, - prefix, - checkboxInvertTiles.checked, - checkboxFlipTiles.checked, - checkboxMirrorTiles.checked, - checkboxRotateTiles.checked - ); + console.log(add_tiles()); + textareaGameDataOutput.value = output(); } buttonImportGame.addEventListener("click", addTiles); @@ -156,6 +163,26 @@ async function run() { buttonAddImage.addEventListener("click", addImage); buttonAddImage.addEventListener("touchend", addImage); + inputPrefix.addEventListener("change", () => { + set_prefix(inputPrefix.value); + }) + + checkboxInvertTiles.addEventListener("change", () => { + set_invert(checkboxInvertTiles.checked); + }); + + checkboxFlipTiles.addEventListener("change", () => { + set_flip(checkboxFlipTiles.checked); + }); + + checkboxMirrorTiles.addEventListener("change", () => { + set_mirror(checkboxMirrorTiles.checked); + }); + + checkboxRotateTiles.addEventListener("change", () => { + set_rotate(checkboxRotateTiles.checked); + }); + function reset() { clear_game(); imagePreview.removeAttribute("src"); diff --git a/src/lib.rs b/src/lib.rs index a7316bf..f060e5f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,35 @@ use bitsy_parser::game::Game; use bitsy_parser::image::Image; use bitsy_parser::tile::Tile; -use image::{GenericImageView, Pixel}; +use image::{GenericImageView, Pixel, DynamicImage}; +use lazy_static::lazy_static; +use std::sync::Mutex; use wasm_bindgen::prelude::*; const SD: u32 = 8; -#[wasm_bindgen] -pub fn load_default_game_data() -> String { - bitsy_parser::mock::game_default().to_string() +struct State { + game: Option, + image: Option, + prefix: String, + invert: bool, + flip: bool, + mirror: bool, + rotate: bool, +} + +lazy_static! { + static ref STATE: Mutex = Mutex::new( + State { + game: None, + image: None, + prefix: "".to_string(), + invert: false, + flip: false, + mirror: false, + rotate: false, + } + ); } fn tile_name(prefix: &str, index: &u32) -> Option { @@ -19,40 +40,108 @@ fn tile_name(prefix: &str, index: &u32) -> Option { } } -/// image is a base64-encoded string +#[wasm_bindgen] +pub fn load_default_game() { + let mut state = STATE.lock().unwrap(); + state.game = Some(bitsy_parser::mock::game_default()); +} + +#[wasm_bindgen] +pub fn load_game(game_data: String) -> String { + let result = Game::from(game_data); + let mut state = STATE.lock().unwrap(); + + match result { + Ok(game) => { + state.game = Some(game); + "".to_string() + }, + _ => { + state.game = None; + format!("{}", result.err().unwrap()) + } + } +} + +#[wasm_bindgen] +pub fn load_image(image_base64: String) -> String { + let mut state = STATE.lock().expect("Couldn't lock application state"); + + let image_base64: Vec<&str> = image_base64.split("base64,").collect(); + let image_base64 = image_base64[1]; + + match base64::decode(image_base64) { + Ok(image) => { + match image::load_from_memory(image.as_ref()) { + Ok(image) => { + state.image = Some(image); + "OK" + }, + _ => { + state.image = None; + "Couldn't load image" + } + } + }, + _ => { + state.image = None; + "Couldn't decode image" + } + }.to_string() +} + +#[wasm_bindgen] +pub fn set_prefix(prefix: String) { + let mut state = STATE.lock().unwrap(); + + state.prefix = prefix; +} + +#[wasm_bindgen] +pub fn set_invert(invert: bool) { + let mut state = STATE.lock().unwrap(); + + state.invert = invert; +} + +#[wasm_bindgen] +pub fn set_flip(flip: bool) { + let mut state = STATE.lock().unwrap(); + + state.flip = flip; +} + +#[wasm_bindgen] +pub fn set_mirror(mirror: bool) { + let mut state = STATE.lock().unwrap(); + + state.mirror = mirror; +} + +#[wasm_bindgen] +pub fn set_rotate(rotate: bool) { + let mut state = STATE.lock().unwrap(); + + state.rotate = rotate; +} + /// prefix will be ignored if empty #[wasm_bindgen] -pub fn add_tiles( - game_data: String, - image: String, - prefix: String, - invert: bool, - flip: bool, - mirror: bool, - rotate: bool -) -> String { - let game = Game::from(game_data); - if game.is_err() { - return format!("Couldn't parse game data"); - } - let mut game = game.unwrap(); +pub fn add_tiles() -> String { + let mut state = STATE.lock().expect("Couldn't lock application state"); - let image: Vec<&str> = image.split("base64,").collect(); - let image = image[1]; - - let image = base64::decode(image); - if image.is_err() { - return format!("Couldn't decode image"); + if state.game.is_none() { + return "No game data loaded".to_string(); } - let image = image.unwrap(); - let image = image::load_from_memory(image.as_ref()); - if image.is_err() { - return format!("Couldn't load image"); - } - let image = image.unwrap(); - let width = image.width(); - let height = image.height(); + let mut game = state.game.clone().unwrap(); + + if state.image.is_none() { + return "No image loaded".to_string(); + } + + let width = state.image.as_ref().unwrap().width(); + let height = state.image.as_ref().unwrap().height(); let columns = (width as f64 / SD as f64).floor() as u32; let rows = (height as f64 / SD as f64).floor() as u32; @@ -64,7 +153,7 @@ pub fn add_tiles( for y in (row * SD)..((row + 1) * SD) { for x in (column * SD)..((column + 1) * SD) { - let pixel = image.get_pixel(x, y).to_rgb(); + let pixel = state.image.as_ref().unwrap().get_pixel(x, y).to_rgb(); let total = pixel[0] as u32 + pixel[1] as u32 + pixel[2] as u32; // is each channel brighter than 128/255 on average? pixels.push(if total >= 384 {1} else {0}); @@ -72,9 +161,9 @@ pub fn add_tiles( } let tile = Tile { - /// "0" will get overwritten to a new, safe tile ID + // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&prefix, &tile_index), + name: tile_name(&state.prefix, &tile_index), wall: None, animation_frames: vec![Image { pixels }], colour_id: None @@ -86,7 +175,7 @@ pub fn add_tiles( tile_index += 1; } - if invert { + if state.invert { let mut inverted = tile.clone(); inverted.invert(); @@ -99,7 +188,7 @@ pub fn add_tiles( } } - if flip { + if state.flip { let mut flipped = tile.clone(); flipped.flip(); @@ -112,7 +201,7 @@ pub fn add_tiles( } } - if mirror { + if state.mirror { let mut mirrored = tile.clone(); mirrored.mirror(); @@ -125,7 +214,7 @@ pub fn add_tiles( } } - if rotate { + if state.rotate { for i in 1..4 { let mut rotated = tile.clone(); @@ -146,29 +235,32 @@ pub fn add_tiles( } game.dedupe_tiles(); - game.to_string() + + state.game = Some(game.to_owned()); + + "OK".to_string() +} + +#[wasm_bindgen] +pub fn output() -> String { + let state = STATE.lock().unwrap(); + + match &state.game { + Some(game) => game.to_string(), + None => "No game loaded".to_string(), + } } #[cfg(test)] mod test { - use crate::add_tiles; + use crate::{add_tiles, load_image, load_default_game, output}; #[test] fn example() { - let game_data = bitsy_parser::mock::game_default().to_string(); - let image = include_str!("test-resources/test.png.base64").to_string(); + load_default_game(); + load_image(include_str!("test-resources/test.png.base64").to_string()); + add_tiles(); - let output = add_tiles( - game_data, - image, - "".to_string(), - false, - false, - false, - false - ); - - let expected = include_str!("test-resources/expected.bitsy"); - assert_eq!(output, expected); + assert_eq!(output(), include_str!("test-resources/expected.bitsy")); } } From 196ec06c88b13bcbe428d7052e5b5f074b7f3a9a Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 15:39:43 +0000 Subject: [PATCH 04/64] ignore output html --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7943bb3..901c06d 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,4 @@ itch* /Cargo.lock /dist/ +/index.html From 65257b38867dcf1de54336e5785162523571ff07 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 15:46:44 +0000 Subject: [PATCH 05/64] readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6a3647 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# pixsy + +convert images to rooms for use in Bitsy From 4c958373bafff2c30f457cc642c866009ae3b6dd Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 16:11:44 +0000 Subject: [PATCH 06/64] tweaks --- index.pug | 6 +-- script.js | 8 +--- src/lib.rs | 123 ++++++++--------------------------------------------- 3 files changed, 22 insertions(+), 115 deletions(-) diff --git a/index.pug b/index.pug index c9d6fc0..ff5a50c 100644 --- a/index.pug +++ b/index.pug @@ -7,9 +7,9 @@ html(lang="en-gb") body h1 | pixsy - //img(alt="tilesy" src="includes/tilesy.png") - p - span.background convert images to Bitsy rooms + //img(alt="pixsy" src="includes/pixsy.png") + p convert images to Bitsy rooms + p looking for the #[a(href="./old/") old version]? .pages .page#start button.normal.pagination.next#new create a new bitsy game diff --git a/script.js b/script.js index d292584..5c3a844 100644 --- a/script.js +++ b/script.js @@ -1,14 +1,10 @@ import init, { - add_tiles, + add_room, load_image, load_game, load_default_game, output, - set_prefix, - set_invert, - set_flip, - set_mirror, - set_rotate + set_room_name, } from './pkg/pixsy.js'; if (typeof WebAssembly !== "object") { diff --git a/src/lib.rs b/src/lib.rs index f060e5f..11225c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,31 +9,25 @@ use wasm_bindgen::prelude::*; const SD: u32 = 8; struct State { - game: Option, - image: Option, - prefix: String, - invert: bool, - flip: bool, - mirror: bool, - rotate: bool, + game: Option, + image: Option, + room_name: Option, + palette: Option, } lazy_static! { static ref STATE: Mutex = Mutex::new( State { - game: None, - image: None, - prefix: "".to_string(), - invert: false, - flip: false, - mirror: false, - rotate: false, + game: None, + image: None, + room_name: None, + palette: None, } ); } -fn tile_name(prefix: &str, index: &u32) -> Option { - if prefix.len() > 0 { +fn tile_name(prefix: &Option, index: &u32) -> Option { + if let Some(prefix) = prefix { Some(format!("{} {}", prefix, index)) } else { None @@ -91,43 +85,17 @@ pub fn load_image(image_base64: String) -> String { } #[wasm_bindgen] -pub fn set_prefix(prefix: String) { +pub fn set_room_name(room_name: String) { let mut state = STATE.lock().unwrap(); - state.prefix = prefix; + match room_name.is_empty() { + true => { state.room_name = None }, + false => { state.room_name = Some(room_name) }, + } } #[wasm_bindgen] -pub fn set_invert(invert: bool) { - let mut state = STATE.lock().unwrap(); - - state.invert = invert; -} - -#[wasm_bindgen] -pub fn set_flip(flip: bool) { - let mut state = STATE.lock().unwrap(); - - state.flip = flip; -} - -#[wasm_bindgen] -pub fn set_mirror(mirror: bool) { - let mut state = STATE.lock().unwrap(); - - state.mirror = mirror; -} - -#[wasm_bindgen] -pub fn set_rotate(rotate: bool) { - let mut state = STATE.lock().unwrap(); - - state.rotate = rotate; -} - -/// prefix will be ignored if empty -#[wasm_bindgen] -pub fn add_tiles() -> String { +pub fn add_room() -> String { let mut state = STATE.lock().expect("Couldn't lock application state"); if state.game.is_none() { @@ -163,7 +131,7 @@ pub fn add_tiles() -> String { let tile = Tile { // "0" will get overwritten to a new, safe tile ID id: "0".to_string(), - name: tile_name(&state.prefix, &tile_index), + name: tile_name(&state.room_name, &tile_index), wall: None, animation_frames: vec![Image { pixels }], colour_id: None @@ -174,63 +142,6 @@ pub fn add_tiles() -> String { tile_index += 1; } - - if state.invert { - let mut inverted = tile.clone(); - inverted.invert(); - - if inverted.name.is_some() { - inverted.name = Some(format!("{} inverted", inverted.name.unwrap())); - } - - if !game.tiles.contains(&inverted) { - game.add_tile(inverted); - } - } - - if state.flip { - let mut flipped = tile.clone(); - flipped.flip(); - - if flipped.name.is_some() { - flipped.name = Some(format!("{} flipped", flipped.name.unwrap())); - } - - if !game.tiles.contains(&flipped) { - game.add_tile(flipped); - } - } - - if state.mirror { - let mut mirrored = tile.clone(); - mirrored.mirror(); - - if mirrored.name.is_some() { - mirrored.name = Some(format!("{} mirrored", mirrored.name.unwrap())); - } - - if !game.tiles.contains(&mirrored) { - game.add_tile(mirrored); - } - } - - if state.rotate { - for i in 1..4 { - let mut rotated = tile.clone(); - - for _ in 0..i { - rotated.rotate(); - } - - if rotated.name.is_some() { - rotated.name = Some(format!("{} {}°", rotated.name.unwrap(), i * 90)); - } - - if !game.tiles.contains(&rotated) { - game.add_tile(rotated); - } - } - } } } From ca93a00eda4c0c95fa644675f5c704106d8a656c Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 16:18:38 +0000 Subject: [PATCH 07/64] "set palette" function --- src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 11225c8..f56f6d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,6 +94,16 @@ pub fn set_room_name(room_name: String) { } } +#[wasm_bindgen] +pub fn set_palette(palette_id: String) { + let mut state = STATE.lock().unwrap(); + + match palette_id.is_empty() { + true => { state.palette = None }, + false => { state.palette = Some(palette_id) }, + } +} + #[wasm_bindgen] pub fn add_room() -> String { let mut state = STATE.lock().expect("Couldn't lock application state"); From 6b679c3bbc946e94f9aea7e79cfeae5cce99f47e Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Wed, 4 Nov 2020 16:19:51 +0000 Subject: [PATCH 08/64] ignore output css --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 901c06d..65dbdf4 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,4 @@ itch* /Cargo.lock /dist/ /index.html +/includes/style.css From 1b3505929b56ff15974fe06052e862bec1f50a86 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Thu, 5 Nov 2020 09:52:14 +0000 Subject: [PATCH 09/64] new crop tool --- includes/cropper.css | 122 ++++++++++++++++++++++++++++++++++++++++ includes/cropper.min.js | 1 + includes/style.less | 10 +++- index.pug | 6 +- script.js | 41 +++----------- 5 files changed, 145 insertions(+), 35 deletions(-) create mode 100644 includes/cropper.css create mode 100644 includes/cropper.min.js diff --git a/includes/cropper.css b/includes/cropper.css new file mode 100644 index 0000000..c0222d8 --- /dev/null +++ b/includes/cropper.css @@ -0,0 +1,122 @@ +.slider[type='range'] { + -webkit-appearance: none; + margin: 9px 0; + width: 100% +} + +.slider[type='range']:focus { + outline: 0 +} + +.slider[type='range']::-webkit-slider-runnable-track { + cursor: pointer; + height: 5px; + width: 100%; + background: #008ecc; + border: none +} + +.slider[type='range']::-webkit-slider-thumb { + background: #fff; + border: 1px solid #e0e0e0; + border-radius: 50%; + box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); + cursor: pointer; + height: 18px; + width: 18px; + -webkit-appearance: none; + margin-top: -6.5px +} + +.slider[type='range']::-moz-range-track { + cursor: pointer; + height: 5px; + width: 100%; + background: #008ecc; + border: none +} + +.slider[type='range']::-moz-range-thumb { + background: #fff; + border: 1px solid #e0e0e0; + border-radius: 50%; + box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); + cursor: pointer; + height: 18px; + width: 18px +} + +.slider[type='range']::-ms-track { + cursor: pointer; + height: 5px; + width: 100%; + background: transparent; + border-color: transparent; + border-width: 9px 0; + color: transparent +} + +.slider[type='range']::-ms-fill-lower { + background: #008ecc; + border: none +} + +.slider[type='range']::-ms-fill-upper { + background: #008ecc; + border: none +} + +.slider[type='range']::-ms-thumb { + background: #fff; + border: 1px solid #e0e0e0; + border-radius: 50%; + box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.12); + cursor: pointer; + height: 18px; + width: 18px; + margin-top: 0 +} + + +.cropper { + display: inline-block +} + +.cropper canvas { + border-radius: 3px +} + +.cropper canvas:hover { + cursor: move +} + +.cropper-tools { + margin-top: 15px; + text-align: center +} + +.cropper-zoom { + display: inline-block +} + +.cropper-zoom .slider { + margin: 0 10px; + width: 225px +} + +.cropper-zoom .icon { + margin-top: 2px; + font-size: 18px +} + +.cropper-zoom .icon:last-child { + font-size: 24px +} + +.cropper .icon { + display: inline-block; + width: 1em; + height: 1em; + fill: rgba(0, 0, 0, .54); + vertical-align: middle; +} \ No newline at end of file diff --git a/includes/cropper.min.js b/includes/cropper.min.js new file mode 100644 index 0000000..4a08f11 --- /dev/null +++ b/includes/cropper.min.js @@ -0,0 +1 @@ +var Cropper=function(){"use strict";function t(t){if(!t)throw Error("Node is not passed or invalid selector.");var e=t;if("string"==typeof e&&!(e=document.querySelector(t)))throw Error("Invalid selector.");if(!(e instanceof window.HTMLElement))throw Error("Node should be instance of window.HTMLElement or valid selector string.");return e}function e(t){if(!t)throw Error("Config is not passed or invalid.");if("[object Object]"!==Object.prototype.toString.call(t))throw Error("Invalid config.")}function n(t){if(!t&&0!==t)throw Error("Dimension is not passed or invalid.");if("number"!=typeof t)throw Error("Invalid dimension.");if(!isFinite(t))throw Error("Invalid dimension.");if(t<0)throw Error("Invalid dimension.");return t}function i(t){if(void 0===t)return function(){};if(!t||"function"!=typeof t)throw Error("Invalid callback.");return t}function r(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}var o={width:560,height:340},s={cutout:{fill:"rgba(0, 0, 0, 0.3)"},pattern:{size:16,fill1:"rgb(215, 215, 215)",fill2:"rgb(250, 250, 250)"}},a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;h(this,t),this.width=e,this.height=n},d=function(){function t(e){if(h(this,t),this._node=e,!e||"string"==typeof e){if("svg"===e||"use"===e)return void(this._node=document.createElementNS("http://www.w3.org/2000/svg",e));this._node=document.createElement(e||"div")}}return u(t,[{key:"render",value:function(t){if(!t)throw Error("Parent node are not passed.");return t.appendChild(this._node),this}},{key:"setWidth",value:function(t){return this._node.width=t,this}},{key:"setHeight",value:function(t){return this._node.height=t,this}},{key:"getSize",value:function(){return new _(this._node.width,this._node.height)}},{key:"getNode",value:function(){return this._node}},{key:"getContext2d",value:function(){return this._node.getContext("2d")}},{key:"setType",value:function(t){return this._node.type=t,this}},{key:"addClass",value:function(t){return this._node.className+=this._node.className.length>1?" "+t:t,this}},{key:"setAttribute",value:function(t,e){return this._node.setAttribute(t,e),this}}]),t}(),g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},v=function(t,e){return e={exports:{}},t(e,e.exports),e.exports}(function(t,e){!function(e,n){t.exports=function(){function t(t){var e=void 0===t?"undefined":a(t);return null!==t&&("object"===e||"function"===e)}function e(t){return"function"==typeof t}function n(t){F=t}function i(t){W=t}function o(){return void 0!==D?function(){D(h)}:s()}function s(){var t=setTimeout;return function(){return t(h,1)}}function h(){for(var t=0;tn?e:n;return this._scale=this._originScale=i,this._scale}},{key:"getSize",value:function(){var t=this.getNode().width*this._scale,e=this.getNode().height*this._scale;return new _(t,e)}},{key:"setZoom",value:function(t){return this._zoom=t,this._scale=this._originScale+this._originScale*t,this}},{key:"getZoom",value:function(){return this._zoom}},{key:"getScale",value:function(){return this._scale}},{key:"getOriginScale",value:function(){return this._originScale}},{key:"_checkFormat",value:function(){return this.getNode().width>this.getNode().height?"landscape":this.getNode().width0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;h(this,t),this.x=e,this.y=n},b=function(){function t(){h(this,t),this._size=0,this._origin={x:0,y:0}}return u(t,[{key:"update",value:function(t){return this._size=t.width>t.height?.85*t.height:.85*t.width,this._origin={x:(t.width-this._size)/2,y:(t.height-this._size)/2},this}},{key:"getRect",value:function(){return{origin:new w(this._origin.x,this._origin.y),size:new _(this._size,this._size)}}},{key:"getMinX",value:function(){return this._origin.x}},{key:"getMaxX",value:function(){return this._origin.x+this._size}},{key:"getMidX",value:function(){return this._origin.x+this._size/2}},{key:"getMinY",value:function(){return this._origin.y}},{key:"getMaxY",value:function(){return this._origin.y+this._size}},{key:"getMidY",value:function(){return this._origin.y+this._size/2}}]),t}(),k=function(){function t(e,n){h(this,t),this._frame=e,this._canvas=n,this._context=new m(this._canvas.getNode().getContext("2d"))}return u(t,[{key:"draw",value:function(){return this._context.fillStyle(s.cutout.fill),this._context.beginPath(),this._context.rect(0,0,this._canvas.getNode().width,this._canvas.getNode().height),this._context.moveTo(this._frame.getMinX(),this._frame.getMinY()),this._context.lineTo(this._frame.getMinX(),this._frame.getMaxY()),this._context.lineTo(this._frame.getMaxX(),this._frame.getMaxY()),this._context.lineTo(this._frame.getMaxX(),this._frame.getMinY()),this._context.closePath(),this._context.fill(),this}}]),t}(),x=function(t){function e(t,n){h(this,e);var i=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"canvas"));return i._frame=t,i._canvas=n,i._context=new m(i._node.getContext("2d")),i}return l(e,t),u(e,[{key:"toDataURL",value:function(){return this.setWidth(this._frame.getRect().size.width),this.setHeight(this._frame.getRect().size.height),this._context.drawImage(this._canvas.getNode(),this._frame.getMinX(),this._frame.getMinY(),this._frame.getRect().size.width,this._frame.getRect().size.height,0,0,this._frame.getRect().size.width,this._frame.getRect().size.height),this.getNode().toDataURL()}}]),e}(d),P=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new d(document.body);h(this,t),this._element=e,this._parent=n,this._onMoveCallback=function(){},this._onPressCallback=function(){},this._onReleaseCallback=function(){},this._onReleaseHandler=this.onReleaseHandler.bind(this),this._onPressHandler=this.onPressHandler.bind(this),this._onMoveHandler=this.onMoveHandler.bind(this)}return u(t,[{key:"onMove",value:function(t){this._onMoveCallback=t}},{key:"onPress",value:function(t){this._onPressCallback=t}},{key:"onRelease",value:function(t){this._onReleaseCallback=t}},{key:"init",value:function(){this._element.getNode().addEventListener("mousedown",this._onPressHandler,!1),this._element.getNode().addEventListener("touchstart",this._onPressHandler,!1),this._parent.getNode().addEventListener("mouseup",this._onReleaseHandler,!1),this._parent.getNode().addEventListener("touchend",this._onReleaseHandler,!1)}},{key:"onMoveHandler",value:function(t){this._onMoveCallback(this._getEventPoint(t))}},{key:"onPressHandler",value:function(t){this._parent.getNode().addEventListener("mousemove",this._onMoveHandler,!1),this._parent.getNode().addEventListener("touchmove",this._onMoveHandler,!1),this._onPressCallback(this._getEventPoint(t))}},{key:"onReleaseHandler",value:function(t){this._parent.getNode().removeEventListener("mousemove",this._onMoveHandler,!1),this._parent.getNode().removeEventListener("touchmove",this._onMoveHandler,!1),this._onReleaseCallback(this._getEventPoint(t))}},{key:"_convertCoordinates",value:function(t){var e=this._element.getNode().getBoundingClientRect(),n=t.x-e.left*(this._element.getNode().width/e.width),i=t.y-e.top*(this._element.getNode().height/e.height);return new w(n,i)}},{key:"_getEventPoint",value:function(t){var e=t.clientX||t.touches[0].clientX,n=t.clientY||t.touches[0].clientY;return this._convertCoordinates(new w(e,n))}}]),t}(),C=function(t){function e(){h(this,e);var t=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"canvas"));return t._context=new m(t._node.getContext("2d")),t._image=new y,t._pattern=new p,t._frame=new b,t._cutout=new k(t._frame,t),t._generator=new x(t._frame,t),t._moveEventListener=new P(t),t._lastPoint=new w(0,0),t._basePoint=new w(0,0),t._onChangeCallback=function(){},t}return l(e,t),u(e,[{key:"render",value:function(t){var n=this;return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"render",this).call(this,t),this._drawBackground(),this._moveEventListener.init(),this._moveEventListener.onPress(function(t){n._lastPoint=t}),this._moveEventListener.onMove(function(t){n._drawImage(t)}),this}},{key:"setWidth",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setWidth",this).call(this,t),this._frame.update(this.getNode()),this}},{key:"setHeight",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setHeight",this).call(this,t),this._frame.update(this.getNode()),this}},{key:"setImage",value:function(t){return this._resetPoints(),this._image=t,this._image.scaleToFit(this._frame),this}},{key:"draw",value:function(){return this._drawImage(this._centerImagePoint()),this}},{key:"redraw",value:function(){return this._resetPoints(),this._image.scaleToFit(this._frame),this.draw(),this}},{key:"clear",value:function(){return this._context.clearRect(0,0,this.getNode().width,this.getNode().height),this}},{key:"toDataURL",value:function(){return this._generator.toDataURL()}},{key:"setZoom",value:function(t){var e=this._image.getSize();this._image.setZoom(t);var n=this._image.getSize(),i=this._lastPoint.x-(n.width-e.width)/2,r=this._lastPoint.y-(n.height-e.height)/2;return this._drawImage(new w(i,r)),this}},{key:"onChange",value:function(t){this._onChangeCallback=t}},{key:"getData",value:function(){return{origin:{x:(this._frame.getMinX()-this._basePoint.x)/this._image.getScale(),y:(this._frame.getMinY()-this._basePoint.y)/this._image.getScale()},size:{width:this._frame.getRect().size.width/this._image.getScale(),height:this._frame.getRect().size.width/this._image.getScale()}}}},{key:"setData",value:function(t){var e=this._frame.getRect().size.width/t.size.width,n=(e-this._image.getOriginScale())/this._image.getOriginScale();this.setZoom(n);var i=this._frame.getMinX()-t.origin.x*this._image.getScale(),r=this._frame.getMinY()-t.origin.y*this._image.getScale(),o=new w(i,r);return this._resetPoints(),this._drawImage(o),{origin:o,zoom:n}}},{key:"_resetPoints",value:function(){return this._lastPoint=new w(0,0),this._basePoint=new w(0,0),this}},{key:"_centerImagePoint",value:function(){var t=this._frame.getMidX()-this._image.getSize().width/2,e=this._frame.getMidY()-this._image.getSize().height/2;return new w(t,e)}},{key:"_validatePoint",value:function(t){var e=t;return this._image.getSize().widththis._frame.getMinX()?e.x=this._frame.getMinX():t.x+this._image.getSize().widththis._frame.getMinY()?e.y=this._frame.getMinY():t.y+this._image.getSize().height0&&void 0!==arguments[0]?arguments[0]:new w(0,0);this.clear(),this._drawBackground();var e=this._basePoint.x+(t.x-this._lastPoint.x),n=this._basePoint.y+(t.y-this._lastPoint.y);return this._basePoint=this._validatePoint(new w(e,n)),this._lastPoint=t,this._context.drawImage(this._image.getNode(),this._basePoint.x,this._basePoint.y,this._image.getSize().width,this._image.getSize().height),this._cutout.draw(),this._onChangeCallback(this),this}},{key:"_drawBackground",value:function(){var t=this._context.createPattern(this._pattern.getNode(),"repeat");return this._context.rect(0,0,this.getNode().width,this.getNode().height),this._context.fillStyle(t),this._context.fill(),this}}]),e}(d),S=function(t){function e(){h(this,e);var t=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"input"));return t.setType("range"),t.addClass("slider"),t.setAttribute("min",0),t.setAttribute("max",100),t.setAttribute("value",0),t._onChangeCallback=function(){},t._onChangeHandler=t._onChange.bind(t),t}return l(e,t),u(e,[{key:"onChange",value:function(t){return this._onChangeCallback=t,this.getNode().addEventListener("change",this._onChangeHandler,!1),this.getNode().addEventListener("input",this._onChangeHandler,!1),this}},{key:"setValue",value:function(t){return this.getNode().value=t,this}},{key:"_onChange",value:function(){this._onChangeCallback(Number(this.getNode().value))}}]),e}(d),N=function(t){function e(t){h(this,e);var n=f(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,"svg"));return n.setAttribute("class","icon icon-"+t),n._use=new d("use"),n._use.getNode().setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","#icon-"+t),n._use.render(n.getNode()),n}return l(e,t),e}(d);return function(){function r(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h(this,r),e(t),this._canvas=new C,this._image=new y,this._slider=new S,this.setWidth(t.width||o.width),this.setHeight(t.height||o.height),this._onInitCallback=i(t.onInit),this._onChangeCallback=i(t.onChange)}return u(r,[{key:"render",value:function(e){var n=this;this._node=t(e);var i=new d;i.addClass("cropper"),i.render(this._node),this._canvas.render(i.getNode());var r=new d;r.addClass("cropper-tools"),r.render(i.getNode());var o=new d;o.addClass("cropper-zoom"),o.render(r.getNode());var s=new N("frame-landscape"),a=new N("frame-landscape");return s.render(o.getNode()),this._slider.render(o.getNode()),this._slider.onChange(function(t){n._canvas.setZoom(t/100)}),a.render(o.getNode()),this._onInitCallback(this),this._canvas.onChange(function(){n._onChangeCallback(n)}),this}},{key:"setWidth",value:function(t){try{n(t)}catch(t){throw Error("Width property: "+t.message)}return this._canvas.setWidth(t),this._canvas.redraw(),this}},{key:"setHeight",value:function(t){try{n(t)}catch(t){throw Error("Height property: "+t.message)}return this._canvas.setHeight(t),this._canvas.redraw(),this}},{key:"loadImage",value:function(t){var e=this;if(!t)throw Error("Image url or path is not passed.");if("string"!=typeof t)throw Error("Invalid url or path.");return this._image.load(t).then(function(t){return e._canvas.setImage(t),e._canvas.draw(),e._slider.setValue(0),e})}},{key:"getCroppedImage",value:function(){return this._canvas.toDataURL()}},{key:"setZoom",value:function(t){try{n(t)}catch(t){throw Error("Zoom property: "+t.message)}return this._canvas.setZoom(t),this._slider.setValue(100*t),this}},{key:"reset",value:function(){return this.setZoom(0),this._canvas.redraw(),this}},{key:"getData",value:function(){return this._canvas.getData()}},{key:"setData",value:function(t){var e=this._canvas.setData(t),n=e.zoom;return this._slider.setValue(100*n),this}}]),r}()}(); diff --git a/includes/style.less b/includes/style.less index f95c7a0..8945633 100644 --- a/includes/style.less +++ b/includes/style.less @@ -90,8 +90,12 @@ textarea { margin-right: 1em; } +.cropper-tools { + margin-top: 0; +} + .image-container { - height: 38.5vmin; + height: 46vh; text-align: left; } @@ -106,3 +110,7 @@ textarea { padding: 5vmin; position: relative; } + +#crop canvas { + height: 32vh; +} diff --git a/index.pug b/index.pug index ff5a50c..4941bb2 100644 --- a/index.pug +++ b/index.pug @@ -4,6 +4,8 @@ html(lang="en-gb") meta(charset="utf-8") title pixsy link(rel="stylesheet" href="includes/style.css") + link(rel="stylesheet" href="includes/cropper.css") + script(src="includes/cropper.min.js") body h1 | pixsy @@ -27,8 +29,8 @@ html(lang="en-gb") .page.image h2 image .image-container - input#image(type="file" autocomplete="off") - img#preview + input#image(type="file" accept="image/*") + #crop button.pagination.prev previous button.pagination.next next .page.extras diff --git a/script.js b/script.js index 5c3a844..fa75634 100644 --- a/script.js +++ b/script.js @@ -65,15 +65,12 @@ async function run() { const buttonLoadGame = el("load"); const buttonNewGame = el("new"); const buttonReset = el("reset"); - const checkboxInvertTiles = el("invert"); - const checkboxFlipTiles = el("flip"); - const checkboxMirrorTiles = el("mirror"); - const checkboxRotateTiles = el("rotate"); - const inputPrefix = el("prefix"); - const imagePreview = el("preview"); const textareaGameDataInput = el("game-data"); const textareaGameDataOutput = el("output"); + const cropper = new Cropper({ width: 128, height: 128 }); + let cropperRendered = false; + // hide all pages except start page for (let page of document.getElementsByClassName('page')) { page.style.display = "none"; @@ -125,13 +122,14 @@ async function run() { textareaGameDataInput.addEventListener("keyup", checkGameData); checkGameData(); - imagePreview.style.display = "none"; - el('image').addEventListener('change', function () { readFile(this, function (e) { - imagePreview.src = e.target.result; - imagePreview.style.display = "initial"; - console.log(load_image(imagePreview.getAttribute("src"))); + if ( ! cropperRendered) { + cropper.render("#crop"); + cropperRendered = true; + } + + cropper.loadImage(e.target.result); }, "image"); }); @@ -159,29 +157,8 @@ async function run() { buttonAddImage.addEventListener("click", addImage); buttonAddImage.addEventListener("touchend", addImage); - inputPrefix.addEventListener("change", () => { - set_prefix(inputPrefix.value); - }) - - checkboxInvertTiles.addEventListener("change", () => { - set_invert(checkboxInvertTiles.checked); - }); - - checkboxFlipTiles.addEventListener("change", () => { - set_flip(checkboxFlipTiles.checked); - }); - - checkboxMirrorTiles.addEventListener("change", () => { - set_mirror(checkboxMirrorTiles.checked); - }); - - checkboxRotateTiles.addEventListener("change", () => { - set_rotate(checkboxRotateTiles.checked); - }); - function reset() { clear_game(); - imagePreview.removeAttribute("src"); } buttonReset.addEventListener("click", reset); From 0cb4f3af8d966398a14823e7d66ee8ec13ae4380 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Thu, 5 Nov 2020 09:52:45 +0000 Subject: [PATCH 10/64] bigger pages; page caption --- includes/style.less | 4 ++-- index.pug | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/includes/style.less b/includes/style.less index 8945633..748f62b 100644 --- a/includes/style.less +++ b/includes/style.less @@ -100,8 +100,8 @@ textarea { } .page { - height: 70vmin; - width: 70vmin; + height: 80vmin; + width: 80vmin; background-color: @background; border: 2px solid @accent; diff --git a/index.pug b/index.pug index 4941bb2..ce491fd 100644 --- a/index.pug +++ b/index.pug @@ -10,8 +10,14 @@ html(lang="en-gb") h1 | pixsy //img(alt="pixsy" src="includes/pixsy.png") - p convert images to Bitsy rooms - p looking for the #[a(href="./old/") old version]? + p. + convert images to Bitsy rooms + | + #[a(href="./old/") old version] + | + #[a(href="mailto:max@tinybird.info") email] + | + #[a(href="https://twitter.com/synth_ruiner") twitter] .pages .page#start button.normal.pagination.next#new create a new bitsy game From 03588c4c553b5f3732a34acaa6166cd2356f0779 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Thu, 5 Nov 2020 18:48:22 +0000 Subject: [PATCH 11/64] lots of stuff --- Cargo.toml | 2 + TODO.md | 8 ++ deploy.sh | 2 +- includes/style.less | 18 ++- index.pug | 43 +++++- script.js | 56 +++++++- src/lib.rs | 106 ++++++++++++-- src/test-resources/colour_input.png | Bin 0 -> 13253 bytes src/test-resources/colour_input.png.base64 | 1 + .../colour_input.png.base64.greyscale | 1 + src/test-resources/expected.bitsy | 136 ++++++++++++++++++ src/test-resources/test.png | Bin 0 -> 234 bytes src/test-resources/test.png.base64 | 1 + 13 files changed, 350 insertions(+), 24 deletions(-) create mode 100644 TODO.md create mode 100644 src/test-resources/colour_input.png create mode 100644 src/test-resources/colour_input.png.base64 create mode 100644 src/test-resources/colour_input.png.base64.greyscale create mode 100644 src/test-resources/expected.bitsy create mode 100644 src/test-resources/test.png create mode 100644 src/test-resources/test.png.base64 diff --git a/Cargo.toml b/Cargo.toml index 7881897..caf9afa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,8 @@ crate-type = ["cdylib"] [dependencies] "base64" = "^0.12.3" "bitsy-parser" = "^0.72.3" +"dither" = "1.3.9" "image" = "^0.23.7" +"json" = "^0.12.4" "lazy_static" = "^1.4.0" "wasm-bindgen" = "=0.2.64" # newer versions are bugged... diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..18682bc --- /dev/null +++ b/TODO.md @@ -0,0 +1,8 @@ +# todo + +* preview +* dithering +* palette selection +* palette dropdown +* unit test +* if uploaded image is exactly 128×128, *don't* crop diff --git a/deploy.sh b/deploy.sh index e38a15e..b21127a 100644 --- a/deploy.sh +++ b/deploy.sh @@ -4,4 +4,4 @@ rm -rf dist mkdir dist cp -r README.md LICENSE index.html script.js background.png pkg includes dist -butler push dist ruin/image-to-bitsy:html +# butler push dist ruin/pixsy:html diff --git a/includes/style.less b/includes/style.less index 748f62b..b55b4be 100644 --- a/includes/style.less +++ b/includes/style.less @@ -58,7 +58,6 @@ input { } img { - max-height: 12em; max-width: 100%; margin: 0; } @@ -73,6 +72,10 @@ label { font-weight: bold; } +select { + width: 100%; +} + textarea { height: 15em; padding: 0.5em; @@ -94,6 +97,12 @@ textarea { margin-top: 0; } +.half { + display: inline-block; + text-align: left; + width: 50%; +} + .image-container { height: 46vh; text-align: left; @@ -114,3 +123,10 @@ textarea { #crop canvas { height: 32vh; } + +#preview { + width: 256px; + height: 256px; + image-rendering: pixelated; + image-rendering: crisp-edges; +} diff --git a/index.pug b/index.pug index ce491fd..ca35914 100644 --- a/index.pug +++ b/index.pug @@ -24,34 +24,63 @@ html(lang="en-gb") button.normal.pagination.next#load load an existing bitsy game .page.game-data h2 game data + input#game(type="file" autocomplete="off") br + textarea#game-data( placeholder="Paste your game data here or use the file chooser button above" autocomplete="off" ) + button.pagination.prev previous button.pagination.next#game-data-next(disabled=true) next .page.image h2 image + .image-container input#image(type="file" accept="image/*") #crop + button.pagination.prev previous - button.pagination.next next - .page.extras - h2 tiles - label - | tile name (optional) - input#prefix(type="text" placeholder="e.g. 'forest'" autocomplete="off") + button.pagination.next#image-next(disabled=true) next + .page.room + h2 room + + table + tbody + tr + td(style="width: 60%") + img#preview(alt="preview") + br + + label + | brightness + input#brightness(type="range" min=-64 max=64 value=0) + td + label + | palette + select#palette + + label + input#dither(type="checkbox") + | dither + br + + label + | name (optional) + input#room-name(type="text" placeholder="e.g. 'bedroom'" autocomplete="off") button.pagination.prev#back-to-image previous - button.pagination.next#import next + button.pagination.next#room-next next .page.download h2 download + textarea#output(autocomplete="off") br + button#download download + button.pagination.prev#add add another image button.pagination.start#reset start again script(type="module") diff --git a/script.js b/script.js index fa75634..80eacc6 100644 --- a/script.js +++ b/script.js @@ -1,14 +1,17 @@ import init, { add_room, + get_palettes, + get_preview, load_image, load_game, load_default_game, output, + set_dither, set_room_name, } from './pkg/pixsy.js'; if (typeof WebAssembly !== "object") { - document.getElementById("start").innerText = "Sorry - your browser does not support WebAssembly"; + window.location = "./old/" } // stolen from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server @@ -61,10 +64,14 @@ async function run() { const buttonBackToImage = el("back-to-image"); const buttonDownload = el("download"); const buttonGameDataProceed = el("game-data-next"); - const buttonImportGame = el("import"); + const buttonImageProceed = el("image-next"); + const buttonRoomProceed = el("room-next"); const buttonLoadGame = el("load"); const buttonNewGame = el("new"); const buttonReset = el("reset"); + const checkboxDither = el("dither"); + const inputRoomName = el("room-name"); + const selectPalette = el("palette"); const textareaGameDataInput = el("game-data"); const textareaGameDataOutput = el("output"); @@ -110,9 +117,25 @@ async function run() { }, "text"); }); + function setPaletteDropdown() { + let palettes = JSON.parse(get_palettes()); + + selectPalette.innerHTML = ""; + + for (let palette of palettes) { + let option = document.createElement("option"); + + option.value = palette.id; + option.innerText = palette.name; + + selectPalette.appendChild(option); + } + } + function checkGameData() { if (textareaGameDataInput.value.length > 0) { buttonGameDataProceed.removeAttribute("disabled"); + setPaletteDropdown(); } else { buttonGameDataProceed.setAttribute("disabled", "disabled"); } @@ -127,19 +150,40 @@ async function run() { if ( ! cropperRendered) { cropper.render("#crop"); cropperRendered = true; + buttonImageProceed.removeAttribute("disabled"); } cropper.loadImage(e.target.result); }, "image"); }); - function addTiles() { - console.log(add_tiles()); + function loadPreview() { + el("preview").setAttribute("src", get_preview()); + } + + function handleImage() { + console.log(load_image(cropper.getCroppedImage())); + loadPreview(); + } + + buttonImageProceed.addEventListener("click", handleImage); + buttonImageProceed.addEventListener("touchend", handleImage); + + checkboxDither.addEventListener("change", () => { + set_dither(checkboxDither.checked); + }); + + inputRoomName.addEventListener("change", () => { + set_room_name(inputRoomName.value); + }); + + function addRoom() { + console.log(add_room()); textareaGameDataOutput.value = output(); } - buttonImportGame.addEventListener("click", addTiles); - buttonImportGame.addEventListener("touchend", addTiles); + buttonRoomProceed.addEventListener("click", addRoom); + buttonRoomProceed.addEventListener("touchend", addRoom); function handleDownload() { download("output.bitsy", textareaGameDataOutput.value); diff --git a/src/lib.rs b/src/lib.rs index f56f6d7..168e29b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ use image::{GenericImageView, Pixel, DynamicImage}; use lazy_static::lazy_static; use std::sync::Mutex; use wasm_bindgen::prelude::*; +use image::imageops::dither; const SD: u32 = 8; @@ -13,6 +14,7 @@ struct State { image: Option, room_name: Option, palette: Option, + dither: bool, } lazy_static! { @@ -22,6 +24,7 @@ lazy_static! { image: None, room_name: None, palette: None, + dither: true, } ); } @@ -38,6 +41,7 @@ fn tile_name(prefix: &Option, index: &u32) -> Option { pub fn load_default_game() { let mut state = STATE.lock().unwrap(); state.game = Some(bitsy_parser::mock::game_default()); + state.palette = Some(bitsy_parser::mock::game_default().palette_ids()[0].clone()) } #[wasm_bindgen] @@ -47,11 +51,14 @@ pub fn load_game(game_data: String) -> String { match result { Ok(game) => { - state.game = Some(game); + let palette_id = game.palette_ids()[0].clone(); + state.game = Some(game); + state.palette = Some(palette_id); "".to_string() }, _ => { - state.game = None; + state.game = None; + state.palette = None; format!("{}", result.err().unwrap()) } } @@ -84,6 +91,22 @@ pub fn load_image(image_base64: String) -> String { }.to_string() } +#[wasm_bindgen] +pub fn set_dither(dither: bool) { + let mut state = STATE.lock().unwrap(); + state.dither = dither; +} + +#[wasm_bindgen] +pub fn set_palette(palette_id: String) { + let mut state = STATE.lock().unwrap(); + + match palette_id.is_empty() { + true => { state.palette = None }, + false => { state.palette = Some(palette_id) }, + } +} + #[wasm_bindgen] pub fn set_room_name(room_name: String) { let mut state = STATE.lock().unwrap(); @@ -95,12 +118,52 @@ pub fn set_room_name(room_name: String) { } #[wasm_bindgen] -pub fn set_palette(palette_id: String) { - let mut state = STATE.lock().unwrap(); +pub fn get_palettes() -> String { + let state = STATE.lock().unwrap(); - match palette_id.is_empty() { - true => { state.palette = None }, - false => { state.palette = Some(palette_id) }, + let mut palette_objects = json::JsonValue::new_array(); + + for palette in &state.game.as_ref().unwrap().palettes { + let mut object = json::JsonValue::new_object(); + + object.insert("id", palette.id.clone()).unwrap(); + + object.insert( + "name", + palette.name.clone().unwrap_or( + format!("Palette {}", palette.id)) + ).unwrap(); + + palette_objects.push(object).unwrap(); + } + + json::stringify(palette_objects) +} + +fn image_to_base64(image: &DynamicImage) -> String { + let mut bytes: Vec = Vec::new(); + image.write_to(&mut bytes, image::ImageOutputFormat::Png).unwrap(); + format!("data:image/png;base64,{}", base64::encode(&bytes)) +} + +fn render_preview(image: &DynamicImage) -> DynamicImage { + let image = image.clone(); + let image = image.grayscale(); + + // todo dither + + // todo convert to palette colours + + image +} + +#[wasm_bindgen] +pub fn get_preview() -> String { + let state = STATE.lock().unwrap(); + + match &state.image.is_some() { + true => image_to_base64(&render_preview(state.image.as_ref().unwrap())), + false => "".to_string(), } } @@ -174,13 +237,38 @@ pub fn output() -> String { #[cfg(test)] mod test { - use crate::{add_tiles, load_image, load_default_game, output}; + use crate::{add_room, load_image, load_default_game, output, get_preview}; + + #[test] + fn image_to_base64() { + let image = image::load_from_memory(include_bytes!("test-resources/test.png")).unwrap(); + let output = crate::image_to_base64(&image); + let expected = include_str!("test-resources/test.png.base64").trim(); + assert_eq!(output, expected); + } + + #[test] + fn get_palettes() { + load_default_game(); + let output = crate::get_palettes(); + let expected = "[{\"id\":\"0\",\"name\":\"blueprint\"}]"; + assert_eq!(output, expected); + } + + #[test] + fn render_preview() { + load_default_game(); + load_image(include_str!("test-resources/colour_input.png.base64").trim().to_string()); + let output = get_preview(); + let expected = include_str!("test-resources/colour_input.png.base64.greyscale").trim(); + assert_eq!(output, expected); + } #[test] fn example() { load_default_game(); load_image(include_str!("test-resources/test.png.base64").to_string()); - add_tiles(); + add_room(); assert_eq!(output(), include_str!("test-resources/expected.bitsy")); } diff --git a/src/test-resources/colour_input.png b/src/test-resources/colour_input.png new file mode 100644 index 0000000000000000000000000000000000000000..227c1a36f70ea0e550c2398b6a9704b321c58f1a GIT binary patch literal 13253 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 literal 0 HcmV?d00001 diff --git a/src/test-resources/test.png.base64 b/src/test-resources/test.png.base64 new file mode 100644 index 0000000..4c542ca --- /dev/null +++ b/src/test-resources/test.png.base64 @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAQCAYAAACm53kpAAAAvElEQVR4nO2QQQrDMBAD6/8/upVSBMqClab2IWAP2M1qtgmovcFrgNYa7i96lWdO8nKi7oz6HkcBvWUo3FgKXo7PQpmTvJzy2XNiWgGEM/HM6fmaz54TpwLwiBvhjVnPhDPxzLny5Gpn1FceVcCoJ7/sOKcCKlC4sRS8O87EMyf55Ejy1dU58YgCerm46+ucOArA79/oI/U1ykXy1QntXHlSd9wluHX+52LsAnB2ATjLsgvA2QXgLMvyBXwAjqzoAQg4VfAAAAAASUVORK5CYII= From 4bd896f05aa4171cc1f22bbec547f378a6c639ba Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 12:35:37 +0000 Subject: [PATCH 12/64] brightness adjustment; find closest palette colour; tests --- script.js | 8 +++ src/lib.rs | 144 +++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 137 insertions(+), 15 deletions(-) diff --git a/script.js b/script.js index 80eacc6..401a089 100644 --- a/script.js +++ b/script.js @@ -6,6 +6,7 @@ import init, { load_game, load_default_game, output, + set_brightness, set_dither, set_room_name, } from './pkg/pixsy.js'; @@ -70,6 +71,7 @@ async function run() { const buttonNewGame = el("new"); const buttonReset = el("reset"); const checkboxDither = el("dither"); + const inputBrightness = el("brightness"); const inputRoomName = el("room-name"); const selectPalette = el("palette"); const textareaGameDataInput = el("game-data"); @@ -171,12 +173,18 @@ async function run() { checkboxDither.addEventListener("change", () => { set_dither(checkboxDither.checked); + loadPreview(); }); inputRoomName.addEventListener("change", () => { set_room_name(inputRoomName.value); }); + inputBrightness.addEventListener("input", () => { + set_brightness(inputBrightness.value); + loadPreview(); + }); + function addRoom() { console.log(add_room()); textareaGameDataOutput.value = output(); diff --git a/src/lib.rs b/src/lib.rs index 168e29b..1268165 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(clamp)] + use bitsy_parser::game::Game; use bitsy_parser::image::Image; use bitsy_parser::tile::Tile; @@ -10,21 +12,23 @@ use image::imageops::dither; const SD: u32 = 8; struct State { - game: Option, - image: Option, - room_name: Option, - palette: Option, - dither: bool, + game: Option, + image: Option, + room_name: Option, + palette: Option, + dither: bool, + brightness: i32, } lazy_static! { static ref STATE: Mutex = Mutex::new( State { - game: None, - image: None, - room_name: None, - palette: None, - dither: true, + game: None, + image: None, + room_name: None, + palette: None, + dither: true, + brightness: 0, } ); } @@ -117,6 +121,12 @@ pub fn set_room_name(room_name: String) { } } +#[wasm_bindgen] +pub fn set_brightness(brightness: i32) { + let mut state = STATE.lock().unwrap(); + state.brightness = brightness; +} + #[wasm_bindgen] pub fn get_palettes() -> String { let state = STATE.lock().unwrap(); @@ -146,15 +156,54 @@ fn image_to_base64(image: &DynamicImage) -> String { format!("data:image/png;base64,{}", base64::encode(&bytes)) } -fn render_preview(image: &DynamicImage) -> DynamicImage { - let image = image.clone(); - let image = image.grayscale(); +fn colour_difference(compare: image::Rgba, other: &bitsy_parser::Colour) -> u32 { + let diff_red = (compare[0] as i16 - other.red as i16).abs(); + let diff_green= (compare[1] as i16 - other.green as i16).abs(); + let diff_blue = (compare[2] as i16 - other.blue as i16).abs(); + + (diff_red + diff_green + diff_blue) as u32 +} + +fn closest_colour(compare: image::Rgba, colours: &[bitsy_parser::Colour]) -> image::Rgba { + let diff_background = colour_difference(compare, &colours[0]); + let diff_foreground = colour_difference(compare, &colours[1]); + + if diff_foreground <= diff_background { + image::Rgba::from([colours[1].red, colours[1].green, colours[1].blue, 255]) + } else { + image::Rgba::from([colours[0].red, colours[0].green, colours[0].blue, 255]) + } +} + +fn adjust_brightness(pixel: &mut image::Rgba, state: &State) -> image::Rgba { + pixel[0] = (pixel[0] as i32 + state.brightness).clamp(0, 255) as u8; + pixel[1] = (pixel[1] as i32 + state.brightness).clamp(0, 255) as u8; + pixel[2] = (pixel[2] as i32 + state.brightness).clamp(0, 255) as u8; + + *pixel +} + +fn render_preview(state: &State) -> DynamicImage { + let image = state.image.as_ref().unwrap().clone(); + let mut preview = image.clone(); // todo dither // todo convert to palette colours - image + // get background and foreground colours from palette + let colours = &state.game.as_ref().unwrap().palettes + .iter() + .find(|palette| &palette.id == state.palette.as_ref().unwrap()) + .unwrap() + .colours[0..2]; + + for (x, y, mut pixel) in image.pixels() { + // is pixel closer to background or foreground? + preview.put_pixel(x, y, closest_colour(adjust_brightness(&mut pixel, &state), colours)); + } + + preview } #[wasm_bindgen] @@ -162,7 +211,7 @@ pub fn get_preview() -> String { let state = STATE.lock().unwrap(); match &state.image.is_some() { - true => image_to_base64(&render_preview(state.image.as_ref().unwrap())), + true => image_to_base64(&render_preview(&state)), false => "".to_string(), } } @@ -238,6 +287,7 @@ pub fn output() -> String { #[cfg(test)] mod test { use crate::{add_room, load_image, load_default_game, output, get_preview}; + use image::Rgba; #[test] fn image_to_base64() { @@ -247,6 +297,70 @@ mod test { assert_eq!(output, expected); } + #[test] + fn colour_difference_none() { + let output = crate::colour_difference( + Rgba::from([255; 4]), + &bitsy_parser::Colour { + red: 255, + green: 255, + blue: 255 + } + ); + assert_eq!(output, 0); + } + + #[test] + fn colour_difference_some() { + let output = crate::colour_difference( + Rgba::from([255; 4]), + &bitsy_parser::Colour { + red: 254, + green: 255, + blue: 255 + } + ); + assert_eq!(output, 1); + } + + #[test] + fn colour_difference_some_2() { + let output = crate::colour_difference( + Rgba::from([254; 4]), + &bitsy_parser::Colour { + red: 254, + green: 255, + blue: 254 + } + ); + assert_eq!(output, 1); + } + + #[test] + fn colour_difference_max() { + let expected = 255 * 3; + + let output = crate::colour_difference( + Rgba::from([0; 4]), + &bitsy_parser::Colour { + red: 255, + green: 255, + blue: 255 + } + ); + assert_eq!(output, expected); + + let output = crate::colour_difference( + Rgba::from([255; 4]), + &bitsy_parser::Colour { + red: 0, + green: 0, + blue: 0 + } + ); + assert_eq!(output, expected); + } + #[test] fn get_palettes() { load_default_game(); From 69a3b482be2b66be3fce807e4d252ae6dc34f28e Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 12:47:26 +0000 Subject: [PATCH 13/64] update palette on selection --- script.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/script.js b/script.js index 401a089..8d5e4b1 100644 --- a/script.js +++ b/script.js @@ -8,6 +8,7 @@ import init, { output, set_brightness, set_dither, + set_palette, set_room_name, } from './pkg/pixsy.js'; @@ -171,6 +172,11 @@ async function run() { buttonImageProceed.addEventListener("click", handleImage); buttonImageProceed.addEventListener("touchend", handleImage); + selectPalette.addEventListener("change", () => { + set_palette(selectPalette.value); + loadPreview(); + }); + checkboxDither.addEventListener("change", () => { set_dither(checkboxDither.checked); loadPreview(); From 5916c4af172207dea9ca20b02cff8c3463696cd1 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 12:50:31 +0000 Subject: [PATCH 14/64] update to-do list --- TODO.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 18682bc..d0fd61a 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,7 @@ * preview * dithering -* palette selection -* palette dropdown -* unit test -* if uploaded image is exactly 128×128, *don't* crop +* tests +* if image is exactly 128×128, *don't* crop +* custom palette +* tile reuse From fd5f141f19d16decf20cbe3aef6063fe09557e19 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 15:33:26 +0000 Subject: [PATCH 15/64] implement colour mapping and dithering properly --- Cargo.toml | 1 - TODO.md | 3 +- src/colour_map.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 59 ++++++++++--------------------------- 4 files changed, 90 insertions(+), 47 deletions(-) create mode 100644 src/colour_map.rs diff --git a/Cargo.toml b/Cargo.toml index caf9afa..b4d0742 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,6 @@ crate-type = ["cdylib"] [dependencies] "base64" = "^0.12.3" "bitsy-parser" = "^0.72.3" -"dither" = "1.3.9" "image" = "^0.23.7" "json" = "^0.12.4" "lazy_static" = "^1.4.0" diff --git a/TODO.md b/TODO.md index d0fd61a..bafbfbf 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,7 @@ # todo -* preview -* dithering * tests * if image is exactly 128×128, *don't* crop * custom palette * tile reuse +* find a way to implement Atkinson dithering instead of CatmullRom diff --git a/src/colour_map.rs b/src/colour_map.rs new file mode 100644 index 0000000..1a0b62e --- /dev/null +++ b/src/colour_map.rs @@ -0,0 +1,74 @@ +use image::{Luma, Rgba}; + +#[derive(Clone, Copy)] +pub struct ColourMap { + background: Rgba, + foreground: Rgba, +} + +impl ColourMap { + pub(crate) fn from(palette: &bitsy_parser::Palette) -> ColourMap { + let background = Rgba::from([ + palette.colours[0].red, + palette.colours[0].green, + palette.colours[0].blue, + 255, + ]); + + let foreground = Rgba::from([ + palette.colours[1].red, + palette.colours[1].green, + palette.colours[1].blue, + 255, + ]); + + ColourMap { background, foreground } + } +} + +fn diff(a: &Rgba, b:&Rgba) -> u32 { + let diff_red = (a[0] as i16 - b[0] as i16).abs(); + let diff_green= (a[1] as i16 - b[1] as i16).abs(); + let diff_blue = (a[2] as i16 - b[2] as i16).abs(); + + (diff_red + diff_green + diff_blue) as u32 +} + +impl image::imageops::colorops::ColorMap for ColourMap { + type Color = Rgba; + + #[inline(always)] + fn index_of(&self, color: &Self::Color) -> usize { + let diff_background = diff(color, &self.background); + let diff_foreground = diff(color, &self.foreground); + + if diff_foreground <= diff_background { 1 } else { 0 } + } + + #[inline(always)] + fn lookup(&self, idx: usize) -> Option { + match idx { + 0 => Some(self.background.into()), + 1 => Some(self.foreground.into()), + _ => None, + } + } + + /// Indicate NeuQuant implements `lookup`. + fn has_lookup(&self) -> bool { + true + } + + #[inline(always)] + fn map_color(&self, color: &mut Self::Color) { + let closest = match self.index_of(color) { + 1 => self.foreground, + _ => self.background, + }; + + color[0] = closest[0]; + color[1] = closest[1]; + color[2] = closest[2]; + color[3] = closest[3]; + } +} diff --git a/src/lib.rs b/src/lib.rs index 1268165..173a2eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,11 +3,15 @@ use bitsy_parser::game::Game; use bitsy_parser::image::Image; use bitsy_parser::tile::Tile; -use image::{GenericImageView, Pixel, DynamicImage}; +use image::{GenericImageView, Pixel, DynamicImage, GenericImage, ImageBuffer}; use lazy_static::lazy_static; use std::sync::Mutex; use wasm_bindgen::prelude::*; -use image::imageops::dither; + +mod colour_map; + +use colour_map::ColourMap; +use image::imageops::FilterType::CatmullRom; const SD: u32 = 8; @@ -156,54 +160,21 @@ fn image_to_base64(image: &DynamicImage) -> String { format!("data:image/png;base64,{}", base64::encode(&bytes)) } -fn colour_difference(compare: image::Rgba, other: &bitsy_parser::Colour) -> u32 { - let diff_red = (compare[0] as i16 - other.red as i16).abs(); - let diff_green= (compare[1] as i16 - other.green as i16).abs(); - let diff_blue = (compare[2] as i16 - other.blue as i16).abs(); - - (diff_red + diff_green + diff_blue) as u32 -} - -fn closest_colour(compare: image::Rgba, colours: &[bitsy_parser::Colour]) -> image::Rgba { - let diff_background = colour_difference(compare, &colours[0]); - let diff_foreground = colour_difference(compare, &colours[1]); - - if diff_foreground <= diff_background { - image::Rgba::from([colours[1].red, colours[1].green, colours[1].blue, 255]) - } else { - image::Rgba::from([colours[0].red, colours[0].green, colours[0].blue, 255]) - } -} - -fn adjust_brightness(pixel: &mut image::Rgba, state: &State) -> image::Rgba { - pixel[0] = (pixel[0] as i32 + state.brightness).clamp(0, 255) as u8; - pixel[1] = (pixel[1] as i32 + state.brightness).clamp(0, 255) as u8; - pixel[2] = (pixel[2] as i32 + state.brightness).clamp(0, 255) as u8; - - *pixel -} - fn render_preview(state: &State) -> DynamicImage { - let image = state.image.as_ref().unwrap().clone(); - let mut preview = image.clone(); + let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); - // todo dither + // todo get actual chosen palette + let colour_map = crate::ColourMap::from(&state.game.as_ref().unwrap().palettes[0]); - // todo convert to palette colours + image::imageops::brighten(&mut buffer, state.brightness); - // get background and foreground colours from palette - let colours = &state.game.as_ref().unwrap().palettes - .iter() - .find(|palette| &palette.id == state.palette.as_ref().unwrap()) - .unwrap() - .colours[0..2]; - - for (x, y, mut pixel) in image.pixels() { - // is pixel closer to background or foreground? - preview.put_pixel(x, y, closest_colour(adjust_brightness(&mut pixel, &state), colours)); + if state.dither { + image::imageops::dither(&mut buffer, &colour_map); + } else { + image::imageops::colorops::index_colors(&mut buffer, &colour_map); } - preview + image::DynamicImage::ImageRgba8(buffer) } #[wasm_bindgen] From 0780bc8267e4c92ac816bf677153d3239cbdd431 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 16:14:47 +0000 Subject: [PATCH 16/64] get actual palette; comment broken tests; fix for new bitsy_parser game result --- Cargo.toml | 2 +- src/lib.rs | 135 +++++++++++++++++++++++++++-------------------------- 2 files changed, 70 insertions(+), 67 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b4d0742..da2464a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ crate-type = ["cdylib"] [dependencies] "base64" = "^0.12.3" -"bitsy-parser" = "^0.72.3" +"bitsy-parser" = "^0.72.4" "image" = "^0.23.7" "json" = "^0.12.4" "lazy_static" = "^1.4.0" diff --git a/src/lib.rs b/src/lib.rs index 173a2eb..81ec1dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,11 +54,12 @@ pub fn load_default_game() { #[wasm_bindgen] pub fn load_game(game_data: String) -> String { - let result = Game::from(game_data); let mut state = STATE.lock().unwrap(); + let result = Game::from(game_data); + match result { - Ok(game) => { + Ok((game, _errs)) => { let palette_id = game.palette_ids()[0].clone(); state.game = Some(game); state.palette = Some(palette_id); @@ -164,7 +165,9 @@ fn render_preview(state: &State) -> DynamicImage { let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); // todo get actual chosen palette - let colour_map = crate::ColourMap::from(&state.game.as_ref().unwrap().palettes[0]); + let palette_id = state.palette.as_ref().unwrap(); + let palette = &state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); + let colour_map = crate::ColourMap::from(palette); image::imageops::brighten(&mut buffer, state.brightness); @@ -267,70 +270,70 @@ mod test { let expected = include_str!("test-resources/test.png.base64").trim(); assert_eq!(output, expected); } + // + // #[test] + // fn colour_difference_none() { + // let output = crate::colour_difference( + // Rgba::from([255; 4]), + // &bitsy_parser::Colour { + // red: 255, + // green: 255, + // blue: 255 + // } + // ); + // assert_eq!(output, 0); + // } + // + // #[test] + // fn colour_difference_some() { + // let output = crate::colour_difference( + // Rgba::from([255; 4]), + // &bitsy_parser::Colour { + // red: 254, + // green: 255, + // blue: 255 + // } + // ); + // assert_eq!(output, 1); + // } + // + // #[test] + // fn colour_difference_some_2() { + // let output = crate::colour_difference( + // Rgba::from([254; 4]), + // &bitsy_parser::Colour { + // red: 254, + // green: 255, + // blue: 254 + // } + // ); + // assert_eq!(output, 1); + // } - #[test] - fn colour_difference_none() { - let output = crate::colour_difference( - Rgba::from([255; 4]), - &bitsy_parser::Colour { - red: 255, - green: 255, - blue: 255 - } - ); - assert_eq!(output, 0); - } - - #[test] - fn colour_difference_some() { - let output = crate::colour_difference( - Rgba::from([255; 4]), - &bitsy_parser::Colour { - red: 254, - green: 255, - blue: 255 - } - ); - assert_eq!(output, 1); - } - - #[test] - fn colour_difference_some_2() { - let output = crate::colour_difference( - Rgba::from([254; 4]), - &bitsy_parser::Colour { - red: 254, - green: 255, - blue: 254 - } - ); - assert_eq!(output, 1); - } - - #[test] - fn colour_difference_max() { - let expected = 255 * 3; - - let output = crate::colour_difference( - Rgba::from([0; 4]), - &bitsy_parser::Colour { - red: 255, - green: 255, - blue: 255 - } - ); - assert_eq!(output, expected); - - let output = crate::colour_difference( - Rgba::from([255; 4]), - &bitsy_parser::Colour { - red: 0, - green: 0, - blue: 0 - } - ); - assert_eq!(output, expected); - } + // #[test] + // fn colour_difference_max() { + // let expected = 255 * 3; + // + // let output = crate::colour_difference( + // Rgba::from([0; 4]), + // &bitsy_parser::Colour { + // red: 255, + // green: 255, + // blue: 255 + // } + // ); + // assert_eq!(output, expected); + // + // let output = crate::colour_difference( + // Rgba::from([255; 4]), + // &bitsy_parser::Colour { + // red: 0, + // green: 0, + // blue: 0 + // } + // ); + // assert_eq!(output, expected); + // } #[test] fn get_palettes() { From 37cde1713df07852520a6b430efa51af892821ed Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Fri, 6 Nov 2020 16:16:17 +0000 Subject: [PATCH 17/64] remove unused imports; bump --- Cargo.toml | 2 +- src/colour_map.rs | 2 +- src/lib.rs | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index da2464a..69594ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pixsy" -version = "0.72.3" +version = "0.72.4" description = "convert images to Bitsy rooms" authors = ["Max Bradbury "] edition = "2018" diff --git a/src/colour_map.rs b/src/colour_map.rs index 1a0b62e..0293982 100644 --- a/src/colour_map.rs +++ b/src/colour_map.rs @@ -1,4 +1,4 @@ -use image::{Luma, Rgba}; +use image::Rgba; #[derive(Clone, Copy)] pub struct ColourMap { diff --git a/src/lib.rs b/src/lib.rs index 81ec1dd..576a296 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ use bitsy_parser::game::Game; use bitsy_parser::image::Image; use bitsy_parser::tile::Tile; -use image::{GenericImageView, Pixel, DynamicImage, GenericImage, ImageBuffer}; +use image::{GenericImageView, Pixel, DynamicImage}; use lazy_static::lazy_static; use std::sync::Mutex; use wasm_bindgen::prelude::*; @@ -11,7 +11,6 @@ use wasm_bindgen::prelude::*; mod colour_map; use colour_map::ColourMap; -use image::imageops::FilterType::CatmullRom; const SD: u32 = 8; @@ -261,7 +260,6 @@ pub fn output() -> String { #[cfg(test)] mod test { use crate::{add_room, load_image, load_default_game, output, get_preview}; - use image::Rgba; #[test] fn image_to_base64() { From 013e1e1c8c2d306e2ce7a01556f95018a2c216ad Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 10:54:52 +0000 Subject: [PATCH 18/64] resize cropped image (plugin doesn't seem to allow specification of size) --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 576a296..949d2bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,6 +83,7 @@ pub fn load_image(image_base64: String) -> String { Ok(image) => { match image::load_from_memory(image.as_ref()) { Ok(image) => { + let image = image.resize(128, 128, CatmullRom); state.image = Some(image); "OK" }, From ec44370d7e2ee30449e06875e3e1e4f004c33732 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 10:57:01 +0000 Subject: [PATCH 19/64] =?UTF-8?q?make=20cropper=20a=20bit=20bigger=20so=20?= =?UTF-8?q?we=20can=20scale=20down=20instead=20of=20having=20to=20scale=20?= =?UTF-8?q?up=20to=20128=C3=97128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/style.less | 4 ---- script.js | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/includes/style.less b/includes/style.less index b55b4be..333b505 100644 --- a/includes/style.less +++ b/includes/style.less @@ -120,10 +120,6 @@ textarea { position: relative; } -#crop canvas { - height: 32vh; -} - #preview { width: 256px; height: 256px; diff --git a/script.js b/script.js index 8d5e4b1..184cd8a 100644 --- a/script.js +++ b/script.js @@ -78,7 +78,7 @@ async function run() { const textareaGameDataInput = el("game-data"); const textareaGameDataOutput = el("output"); - const cropper = new Cropper({ width: 128, height: 128 }); + const cropper = new Cropper({ width: 192, height: 192 }); let cropperRendered = false; // hide all pages except start page From 0150a5ca337377539f6f13d74d74259f5b77d8aa Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 10:58:46 +0000 Subject: [PATCH 20/64] a bit more range on brightness adjustment; top-align room options --- index.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.pug b/index.pug index ca35914..89c5249 100644 --- a/index.pug +++ b/index.pug @@ -56,8 +56,8 @@ html(lang="en-gb") label | brightness - input#brightness(type="range" min=-64 max=64 value=0) - td + input#brightness(type="range" min=-96 max=96 value=0) + td(style="vertical-align: top;") label | palette select#palette From 080d0853eba5887dd5015024bd91e0d46d57d522 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 11:00:07 +0000 Subject: [PATCH 21/64] bit more logging --- script.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script.js b/script.js index 184cd8a..66d12b8 100644 --- a/script.js +++ b/script.js @@ -93,7 +93,7 @@ async function run() { } function new_game() { - load_default_game() + console.debug(load_default_game()); textareaGameDataInput.value = output(); checkGameData(); // we don't need to look at the default game data, so skip ahead to the image page @@ -121,7 +121,8 @@ async function run() { }); function setPaletteDropdown() { - let palettes = JSON.parse(get_palettes()); + const palettes = JSON.parse(get_palettes()); + console.debug(palettes); selectPalette.innerHTML = ""; From 3a8e349aac650df1aaf8e916a2684bb5552e54f1 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 11:10:27 +0000 Subject: [PATCH 22/64] feedback for loading game --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 949d2bf..a43cbb7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,7 +62,7 @@ pub fn load_game(game_data: String) -> String { let palette_id = game.palette_ids()[0].clone(); state.game = Some(game); state.palette = Some(palette_id); - "".to_string() + format!("Loaded game") }, _ => { state.game = None; From 45ef41c3668b455dd8b42fab05be03f7b382ea57 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 13:48:00 +0000 Subject: [PATCH 23/64] fix dithering and indexing for image --- index.pug | 2 +- src/lib.rs | 34 +++++++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/index.pug b/index.pug index 89c5249..d161e67 100644 --- a/index.pug +++ b/index.pug @@ -63,7 +63,7 @@ html(lang="en-gb") select#palette label - input#dither(type="checkbox") + input#dither(type="checkbox" checked=true) | dither br diff --git a/src/lib.rs b/src/lib.rs index a43cbb7..3456230 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,8 @@ use bitsy_parser::game::Game; use bitsy_parser::image::Image; use bitsy_parser::tile::Tile; use image::{GenericImageView, Pixel, DynamicImage}; +use image::imageops::ColorMap; +use image::imageops::FilterType::CatmullRom; use lazy_static::lazy_static; use std::sync::Mutex; use wasm_bindgen::prelude::*; @@ -83,6 +85,7 @@ pub fn load_image(image_base64: String) -> String { Ok(image) => { match image::load_from_memory(image.as_ref()) { Ok(image) => { + // todo get rid of magic numbers! what about Bitsy HD? let image = image.resize(128, 128, CatmullRom); state.image = Some(image); "OK" @@ -162,19 +165,40 @@ fn image_to_base64(image: &DynamicImage) -> String { } fn render_preview(state: &State) -> DynamicImage { - let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); + let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); // todo get actual chosen palette - let palette_id = state.palette.as_ref().unwrap(); - let palette = &state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); + let palette_id = state.palette.as_ref().unwrap(); + let palette = *&state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); let colour_map = crate::ColourMap::from(palette); - image::imageops::brighten(&mut buffer, state.brightness); + let mut buffer = image::imageops::brighten(&mut buffer, state.brightness); if state.dither { image::imageops::dither(&mut buffer, &colour_map); } else { - image::imageops::colorops::index_colors(&mut buffer, &colour_map); + // just do colour indexing + let indices = image::imageops::colorops::index_colors(&mut buffer, &colour_map); + + // todo get rid of magic numbers! what about Bitsy HD? + buffer = image::ImageBuffer::from_fn(128, 128, |x, y| -> image::Rgba { + let p = indices.get_pixel(x, y); + colour_map + .lookup(p.0[0] as usize) + .expect("indexed color out-of-range") + .into() + }); + let mut indexed = buffer.clone(); + for (i, pixel) in buffer.pixels().enumerate() { + // todo get rid of magic numbers! what about Bitsy HD? + let mut pixel = image::Rgba::from(pixel.0); + colour_map.map_color(&mut pixel); + indexed.put_pixel( + (i % 128) as u32, + (i / 128) as u32, + pixel + ); + } } image::DynamicImage::ImageRgba8(buffer) From 31d7ff52ca8f3af232443cb93911f26fccd927e8 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 13:48:38 +0000 Subject: [PATCH 24/64] done --- src/lib.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3456230..bb1273d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -166,11 +166,9 @@ fn image_to_base64(image: &DynamicImage) -> String { fn render_preview(state: &State) -> DynamicImage { let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); - - // todo get actual chosen palette - let palette_id = state.palette.as_ref().unwrap(); - let palette = *&state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); - let colour_map = crate::ColourMap::from(palette); + let palette_id = state.palette.as_ref().unwrap(); + let palette = *&state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); + let colour_map = crate::ColourMap::from(palette); let mut buffer = image::imageops::brighten(&mut buffer, state.brightness); From db3cdf42ff05049eb45ae3789d008dbb46ac7176 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 16:27:27 +0000 Subject: [PATCH 25/64] remove extraneous colour index stuff --- src/lib.rs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bb1273d..9a6ceaf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -186,17 +186,6 @@ fn render_preview(state: &State) -> DynamicImage { .expect("indexed color out-of-range") .into() }); - let mut indexed = buffer.clone(); - for (i, pixel) in buffer.pixels().enumerate() { - // todo get rid of magic numbers! what about Bitsy HD? - let mut pixel = image::Rgba::from(pixel.0); - colour_map.map_color(&mut pixel); - indexed.put_pixel( - (i % 128) as u32, - (i / 128) as u32, - pixel - ); - } } image::DynamicImage::ImageRgba8(buffer) From aea19fcd6cd6d7038a694286323fa6a175130343 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 16:27:58 +0000 Subject: [PATCH 26/64] bump bitsy-parser version for hex colours --- Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 69594ee..d6d3d7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,9 @@ repository = "https://tinybird.dev/max/image-to-bitsy" crate-type = ["cdylib"] [dependencies] -"base64" = "^0.12.3" -"bitsy-parser" = "^0.72.4" -"image" = "^0.23.7" -"json" = "^0.12.4" -"lazy_static" = "^1.4.0" -"wasm-bindgen" = "=0.2.64" # newer versions are bugged... +base64 = "^0.12.3" +bitsy-parser = "^0.72.5" +image = "^0.23.7" +json = "^0.12.4" +lazy_static = "^1.4.0" +wasm-bindgen = "=0.2.64" # newer versions are bugged... From 6a58e8c003585ac4d48732e6d0b4d0a644544b86 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 16:30:50 +0000 Subject: [PATCH 27/64] change the way palettes are handled; support custom palette --- index.pug | 6 ++++++ script.js | 25 +++++++++++++++++++++++- src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 74 insertions(+), 13 deletions(-) diff --git a/index.pug b/index.pug index d161e67..be17ae4 100644 --- a/index.pug +++ b/index.pug @@ -62,6 +62,12 @@ html(lang="en-gb") | palette select#palette + #new-palette(style="display: none;") + .half + input#colour-background(type="color" value="#2f4ac9") + .half + input#colour-foreground(type="color" value="#8798fe") + label input#dither(type="checkbox" checked=true) | dither diff --git a/script.js b/script.js index 66d12b8..28c46e6 100644 --- a/script.js +++ b/script.js @@ -72,7 +72,10 @@ async function run() { const buttonNewGame = el("new"); const buttonReset = el("reset"); const checkboxDither = el("dither"); + const divNewPalette = el("new-palette"); const inputBrightness = el("brightness"); + const inputColourBackground = el("colour-background"); + const inputColourForeground = el("colour-foreground"); const inputRoomName = el("room-name"); const selectPalette = el("palette"); const textareaGameDataInput = el("game-data"); @@ -126,6 +129,11 @@ async function run() { selectPalette.innerHTML = ""; + palettes.push({ + id: "NEW_PALETTE", + name: "new palette" + }); + for (let palette of palettes) { let option = document.createElement("option"); @@ -174,10 +182,25 @@ async function run() { buttonImageProceed.addEventListener("touchend", handleImage); selectPalette.addEventListener("change", () => { - set_palette(selectPalette.value); + set_palette(selectPalette.value, inputColourBackground.value, inputColourForeground.value); + + if (selectPalette.value === "NEW_PALETTE") { + divNewPalette.style.display = "block"; + } else { + divNewPalette.style.display = "none"; + } + loadPreview(); }); + function updateCustomPalette() { + set_palette(selectPalette.value, inputColourBackground.value, inputColourForeground.value); + loadPreview(); + } + + inputColourForeground.addEventListener("change", updateCustomPalette); + inputColourBackground.addEventListener("change", updateCustomPalette); + checkboxDither.addEventListener("change", () => { set_dither(checkboxDither.checked); loadPreview(); diff --git a/src/lib.rs b/src/lib.rs index 9a6ceaf..5d42374 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,11 +16,22 @@ use colour_map::ColourMap; const SD: u32 = 8; +enum SelectedPalette { + None, + Existing { + id: String, + }, + New { + background: bitsy_parser::Colour, + foreground: bitsy_parser::Colour, + } +} + struct State { game: Option, image: Option, room_name: Option, - palette: Option, + palette: SelectedPalette, dither: bool, brightness: i32, } @@ -31,7 +42,7 @@ lazy_static! { game: None, image: None, room_name: None, - palette: None, + palette: SelectedPalette::None, dither: true, brightness: 0, } @@ -49,8 +60,13 @@ fn tile_name(prefix: &Option, index: &u32) -> Option { #[wasm_bindgen] pub fn load_default_game() { let mut state = STATE.lock().unwrap(); + state.game = Some(bitsy_parser::mock::game_default()); - state.palette = Some(bitsy_parser::mock::game_default().palette_ids()[0].clone()) + + // yes, this will probably always just be "0", but to be safe… + state.palette = SelectedPalette::Existing { + id: bitsy_parser::mock::game_default().palette_ids()[0].clone() + } } #[wasm_bindgen] @@ -63,12 +79,12 @@ pub fn load_game(game_data: String) -> String { Ok((game, _errs)) => { let palette_id = game.palette_ids()[0].clone(); state.game = Some(game); - state.palette = Some(palette_id); + state.palette = SelectedPalette::Existing { id: palette_id }; format!("Loaded game") }, _ => { state.game = None; - state.palette = None; + state.palette = SelectedPalette::None; format!("{}", result.err().unwrap()) } } @@ -110,12 +126,16 @@ pub fn set_dither(dither: bool) { } #[wasm_bindgen] -pub fn set_palette(palette_id: String) { +pub fn set_palette(palette_id: &str, background: String, foreground: String) { let mut state = STATE.lock().unwrap(); - match palette_id.is_empty() { - true => { state.palette = None }, - false => { state.palette = Some(palette_id) }, + state.palette = match palette_id { + "NEW_PALETTE" => SelectedPalette::New { + background: bitsy_parser::Colour::from_hex(&background).unwrap(), + foreground: bitsy_parser::Colour::from_hex(&foreground).unwrap(), + }, + "" => SelectedPalette::None, + _ => SelectedPalette::Existing { id: palette_id.to_string() }, } } @@ -166,10 +186,22 @@ fn image_to_base64(image: &DynamicImage) -> String { fn render_preview(state: &State) -> DynamicImage { let mut buffer = state.image.as_ref().unwrap().clone().into_rgba(); - let palette_id = state.palette.as_ref().unwrap(); - let palette = *&state.game.as_ref().unwrap().get_palette(palette_id).unwrap(); - let colour_map = crate::ColourMap::from(palette); + let palette = match &state.palette { + SelectedPalette::None => bitsy_parser::mock::game_default().palettes[0].clone(), + SelectedPalette::Existing { id } => state.game.as_ref().unwrap().get_palette(id).unwrap().clone(), + SelectedPalette::New { background, foreground } => Palette { + id: "0".to_string(), + name: None, + colours: vec![ + background.clone(), foreground.clone(), Colour { red: 0, green: 0, blue: 0 } + ], + }, + }; + + let colour_map = crate::ColourMap::from(&palette); + + // adjust brightness let mut buffer = image::imageops::brighten(&mut buffer, state.brightness); if state.dither { From 9261c41cd84902792059b21cba644eed3d27d5da Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 16:31:09 +0000 Subject: [PATCH 28/64] tidyup --- src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 5d42374..5f89bc7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -213,9 +213,10 @@ fn render_preview(state: &State) -> DynamicImage { // todo get rid of magic numbers! what about Bitsy HD? buffer = image::ImageBuffer::from_fn(128, 128, |x, y| -> image::Rgba { let p = indices.get_pixel(x, y); + colour_map .lookup(p.0[0] as usize) - .expect("indexed color out-of-range") + .expect("indexed colour out-of-range") .into() }); } From 9eb090924abb7d9d04b9d9b837c815119db3d595 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 16:32:47 +0000 Subject: [PATCH 29/64] bump --- Cargo.toml | 2 +- src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d6d3d7a..16227c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pixsy" -version = "0.72.4" +version = "0.72.5" description = "convert images to Bitsy rooms" authors = ["Max Bradbury "] edition = "2018" diff --git a/src/lib.rs b/src/lib.rs index 5f89bc7..bc10f05 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -190,11 +190,11 @@ fn render_preview(state: &State) -> DynamicImage { let palette = match &state.palette { SelectedPalette::None => bitsy_parser::mock::game_default().palettes[0].clone(), SelectedPalette::Existing { id } => state.game.as_ref().unwrap().get_palette(id).unwrap().clone(), - SelectedPalette::New { background, foreground } => Palette { + SelectedPalette::New { background, foreground } => bitsy_parser::Palette { id: "0".to_string(), name: None, colours: vec![ - background.clone(), foreground.clone(), Colour { red: 0, green: 0, blue: 0 } + background.clone(), foreground.clone(), bitsy_parser::Colour { red: 0, green: 0, blue: 0 } ], }, }; From 34053a1327733dd44e83eaef9c274e60d3f25c11 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 7 Nov 2020 19:31:44 +0000 Subject: [PATCH 30/64] add old version --- old/includes/Rubik-Regular.ttf | Bin 0 -> 220600 bytes old/includes/croppie.css | 250 ++++ old/includes/croppie.js | 1596 ++++++++++++++++++++++ old/includes/default.bitsy | 84 ++ old/includes/jquery.min.js | 2 + old/includes/lodash.min.js | 136 ++ old/includes/rubik-regular-webfont.woff | Bin 0 -> 33332 bytes old/includes/rubik-regular-webfont.woff2 | Bin 0 -> 27032 bytes old/includes/script.js | 551 ++++++++ old/includes/snowy-owls.png | Bin 0 -> 87977 bytes old/includes/style.css | 112 ++ old/includes/style.less | 144 ++ old/index.html | 90 ++ old/readme.md | 87 ++ 14 files changed, 3052 insertions(+) create mode 100644 old/includes/Rubik-Regular.ttf create mode 100644 old/includes/croppie.css create mode 100644 old/includes/croppie.js create mode 100644 old/includes/default.bitsy create mode 100644 old/includes/jquery.min.js create mode 100644 old/includes/lodash.min.js create mode 100644 old/includes/rubik-regular-webfont.woff create mode 100644 old/includes/rubik-regular-webfont.woff2 create mode 100644 old/includes/script.js create mode 100644 old/includes/snowy-owls.png create mode 100644 old/includes/style.css create mode 100644 old/includes/style.less create mode 100644 old/index.html create mode 100644 old/readme.md diff --git a/old/includes/Rubik-Regular.ttf b/old/includes/Rubik-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..20100d2fc0afc686a3c0eb9b1350bbb31dc557b7 GIT binary patch literal 220600 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