summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2021-05-27 16:25:47 +0200
committerChristian Grothoff <christian@grothoff.org>2021-05-27 16:25:47 +0200
commitd23d40ff40ad01ffb52d311878bd9f5db461bb13 (patch)
tree8015b539ef48d11dafd6ed880e46d893b3209c90
parentd54c6a3d80c178aea25091630abb5794dc5bc712 (diff)
downloadauditor-d23d40ff40ad01ffb52d311878bd9f5db461bb13.tar.gz
auditor-d23d40ff40ad01ffb52d311878bd9f5db461bb13.tar.bz2
auditor-d23d40ff40ad01ffb52d311878bd9f5db461bb13.zip
fix site generation logic
-rw-r--r--locale/de/LC_MESSAGES/messages.mobin2479 -> 2505 bytes
-rw-r--r--locale/de/LC_MESSAGES/messages.po30
-rw-r--r--locale/en/LC_MESSAGES/messages.po30
-rw-r--r--locale/messages.pot30
-rw-r--r--static/dist/qrious@4.0.2/AUTHORS.md8
-rw-r--r--static/dist/qrious@4.0.2/CHANGES.md121
-rw-r--r--static/dist/qrious@4.0.2/LICENSE.md16
-rw-r--r--static/dist/qrious@4.0.2/README.md201
-rw-r--r--static/dist/qrious@4.0.2/qrious.js2363
-rw-r--r--static/dist/qrious@4.0.2/qrious.js.map1
-rw-r--r--static/dist/qrious@4.0.2/qrious.min.js6
-rw-r--r--static/dist/qrious@4.0.2/qrious.min.js.map1
-rw-r--r--template/index.html.j2123
-rw-r--r--www.yml2
14 files changed, 2834 insertions, 98 deletions
diff --git a/locale/de/LC_MESSAGES/messages.mo b/locale/de/LC_MESSAGES/messages.mo
index 4bb2b3a..f84407a 100644
--- a/locale/de/LC_MESSAGES/messages.mo
+++ b/locale/de/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po
index 872b5b0..4fc1413 100644
--- a/locale/de/LC_MESSAGES/messages.po
+++ b/locale/de/LC_MESSAGES/messages.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-05-27 14:48+0200\n"
+"POT-Creation-Date: 2021-05-27 16:20+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: en <LL@li.org>\n"
@@ -13,64 +13,60 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n!=1)\n"
"Generated-By: Babel 2.3.4\n"
-#: template/index.html.j2:2 template/index.html.j2:67
+#: template/index.html.j2:5 template/index.html.j2:138
msgid "{curr} Auditor"
msgstr ""
-#: template/index.html.j2:69
+#: template/index.html.j2:144
msgid "This is an auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:139
+#: template/index.html.j2:156
msgid "This is the Web site of the auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:140
+#: template/index.html.j2:157
msgid ""
"In the GNU Taler system, an auditor is responsible for verifying that an "
"exchange operates correctly. If you trust us to do a good job auditing, "
-"please click here:"
+"please scan the following QR code or open the link:"
msgstr ""
-#: template/index.html.j2:147
-msgid "Add Auditor"
-msgstr ""
-
-#: template/index.html.j2:150
+#: template/index.html.j2:173
msgid ""
"This will tell your wallet that you are willing to trust exchanges that we "
"audit to handle the {curr} currency properly."
msgstr ""
-#: template/index.html.j2:153
+#: template/index.html.j2:176
msgid ""
"If you do not have a Taler wallet installed, please first install the wallet "
"from <a href=\"https://wallet.taler.net/\">wallet installation page</a>. It "
"only takes one click."
msgstr ""
-#: template/index.html.j2:172
+#: template/index.html.j2:203
msgid ""
"GNU Taler is developed as part of the <a href='https://www.gnu.org/'>GNU "
"project</a> for the GNU operating system."
msgstr ""
-#: template/index.html.j2:174
+#: template/index.html.j2:205
msgid "and"
msgstr ""
-#: template/index.html.j2:177
+#: template/index.html.j2:208
msgid ""
"We are grateful for support and free hosting of this site by <a "
"href='https://www.bfh.ch/'>BFH</a>."
msgstr ""
-#: template/index.html.j2:179
+#: template/index.html.j2:210
msgid ""
"This page was created using <a href='https://www.gnu.org/'>Free Software</a> "
"only."
msgstr ""
-#: template/index.html.j2:181
+#: template/index.html.j2:212
msgid "JavaScript license information"
msgstr ""
diff --git a/locale/en/LC_MESSAGES/messages.po b/locale/en/LC_MESSAGES/messages.po
index 872b5b0..4fc1413 100644
--- a/locale/en/LC_MESSAGES/messages.po
+++ b/locale/en/LC_MESSAGES/messages.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-05-27 14:48+0200\n"
+"POT-Creation-Date: 2021-05-27 16:20+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: en <LL@li.org>\n"
@@ -13,64 +13,60 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n!=1)\n"
"Generated-By: Babel 2.3.4\n"
-#: template/index.html.j2:2 template/index.html.j2:67
+#: template/index.html.j2:5 template/index.html.j2:138
msgid "{curr} Auditor"
msgstr ""
-#: template/index.html.j2:69
+#: template/index.html.j2:144
msgid "This is an auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:139
+#: template/index.html.j2:156
msgid "This is the Web site of the auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:140
+#: template/index.html.j2:157
msgid ""
"In the GNU Taler system, an auditor is responsible for verifying that an "
"exchange operates correctly. If you trust us to do a good job auditing, "
-"please click here:"
+"please scan the following QR code or open the link:"
msgstr ""
-#: template/index.html.j2:147
-msgid "Add Auditor"
-msgstr ""
-
-#: template/index.html.j2:150
+#: template/index.html.j2:173
msgid ""
"This will tell your wallet that you are willing to trust exchanges that we "
"audit to handle the {curr} currency properly."
msgstr ""
-#: template/index.html.j2:153
+#: template/index.html.j2:176
msgid ""
"If you do not have a Taler wallet installed, please first install the wallet "
"from <a href=\"https://wallet.taler.net/\">wallet installation page</a>. It "
"only takes one click."
msgstr ""
-#: template/index.html.j2:172
+#: template/index.html.j2:203
msgid ""
"GNU Taler is developed as part of the <a href='https://www.gnu.org/'>GNU "
"project</a> for the GNU operating system."
msgstr ""
-#: template/index.html.j2:174
+#: template/index.html.j2:205
msgid "and"
msgstr ""
-#: template/index.html.j2:177
+#: template/index.html.j2:208
msgid ""
"We are grateful for support and free hosting of this site by <a "
"href='https://www.bfh.ch/'>BFH</a>."
msgstr ""
-#: template/index.html.j2:179
+#: template/index.html.j2:210
msgid ""
"This page was created using <a href='https://www.gnu.org/'>Free Software</a> "
"only."
msgstr ""
-#: template/index.html.j2:181
+#: template/index.html.j2:212
msgid "JavaScript license information"
msgstr ""
diff --git a/locale/messages.pot b/locale/messages.pot
index 5680389..69bb175 100644
--- a/locale/messages.pot
+++ b/locale/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-05-27 14:48+0200\n"
+"POT-Creation-Date: 2021-05-27 16:20+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,65 +17,61 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"
-#: template/index.html.j2:2 template/index.html.j2:67
+#: template/index.html.j2:5 template/index.html.j2:138
msgid "{curr} Auditor"
msgstr ""
-#: template/index.html.j2:69
+#: template/index.html.j2:144
msgid "This is an auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:139
+#: template/index.html.j2:156
msgid "This is the Web site of the auditor for the {curr} currency."
msgstr ""
-#: template/index.html.j2:140
+#: template/index.html.j2:157
msgid ""
"In the GNU Taler system, an auditor is responsible for verifying that an "
"exchange operates correctly. If you trust us to do a good job auditing, "
-"please click here:"
+"please scan the following QR code or open the link:"
msgstr ""
-#: template/index.html.j2:147
-msgid "Add Auditor"
-msgstr ""
-
-#: template/index.html.j2:150
+#: template/index.html.j2:173
msgid ""
"This will tell your wallet that you are willing to trust exchanges that "
"we audit to handle the {curr} currency properly."
msgstr ""
-#: template/index.html.j2:153
+#: template/index.html.j2:176
msgid ""
"If you do not have a Taler wallet installed, please first install the "
"wallet from <a href=\"https://wallet.taler.net/\">wallet installation "
"page</a>. It only takes one click."
msgstr ""
-#: template/index.html.j2:172
+#: template/index.html.j2:203
msgid ""
"GNU Taler is developed as part of the <a href='https://www.gnu.org/'>GNU "
"project</a> for the GNU operating system."
msgstr ""
-#: template/index.html.j2:174
+#: template/index.html.j2:205
msgid "and"
msgstr ""
-#: template/index.html.j2:177
+#: template/index.html.j2:208
msgid ""
"We are grateful for support and free hosting of this site by <a "
"href='https://www.bfh.ch/'>BFH</a>."
msgstr ""
-#: template/index.html.j2:179
+#: template/index.html.j2:210
msgid ""
"This page was created using <a href='https://www.gnu.org/'>Free "
"Software</a> only."
msgstr ""
-#: template/index.html.j2:181
+#: template/index.html.j2:212
msgid "JavaScript license information"
msgstr ""
diff --git a/static/dist/qrious@4.0.2/AUTHORS.md b/static/dist/qrious@4.0.2/AUTHORS.md
new file mode 100644
index 0000000..91065f8
--- /dev/null
+++ b/static/dist/qrious@4.0.2/AUTHORS.md
@@ -0,0 +1,8 @@
+# Authors ordered by first contribution
+
+* Tom Zerucha <tz@execpc.com>
+* Alasdair Mercer <mercer.alasdair@gmail.com>
+* Alexandre Perrin <alex@kaworu.ch>
+* Michael Mason
+* Benjamin Besse <contact@throrinstudio.com>
+* Marek Vavrecan <vavrecan@gmail.com>
diff --git a/static/dist/qrious@4.0.2/CHANGES.md b/static/dist/qrious@4.0.2/CHANGES.md
new file mode 100644
index 0000000..34ad178
--- /dev/null
+++ b/static/dist/qrious@4.0.2/CHANGES.md
@@ -0,0 +1,121 @@
+## Version 4.0.2, 2017.06.04
+
+* Correct CDNJS links in README [#93](https://github.com/neocotic/qrious/issues/93)
+
+## Version 4.0.1, 2017.06.04
+
+* Publish releases to open source CDN [#87](https://github.com/neocotic/qrious/issues/87)
+* Add live demo link to README [#89](https://github.com/neocotic/qrious/issues/89)
+* webpack - need to manually install qrious-core [#90](https://github.com/neocotic/qrious/issues/90)
+* Remove dependencies (non-dev) badge from README [#91](https://github.com/neocotic/qrious/issues/91)
+
+## Version 4.0.0, 2017.06.02
+
+* Split into multiple modules [#53](https://github.com/neocotic/qrious/issues/53) (**breaking change**)
+* Remove QRious.VERSION [#84](https://github.com/neocotic/qrious/issues/84) (**breaking change**)
+
+## Version 3.0.1, 2017.06.01
+
+* Correct file sizes of distribution files in README [#82](https://github.com/neocotic/qrious/issues/82)
+
+## Version 3.0.0, 2017.06.01
+
+* Reduce size of distribution files [#59](https://github.com/neocotic/qrious/issues/59) (**breaking change**)
+* Drop support for Node.js < 4 [#74](https://github.com/neocotic/qrious/issues/74) (**breaking change**)
+* Remove QRious.DEFAULTS [#77](https://github.com/neocotic/qrious/issues/77) (**breaking change**)
+* Rewrite code in ES5 [#81](https://github.com/neocotic/qrious/issues/81) (**breaking change**)
+
+## Version 2.3.0, 2017.05.31
+
+* Enable setting of multiple properties at once resulting in a single re-render [#69](https://github.com/neocotic/qrious/issues/69)
+* Deferring or avoiding ImageRenderer [#71](https://github.com/neocotic/qrious/issues/71)
+* Switch to container-based Travis builds for faster boot times [#73](https://github.com/neocotic/qrious/issues/73)
+* Change code style to be more contributor-friendly [#75](https://github.com/neocotic/qrious/issues/75)
+* Improve download links in README [#76](https://github.com/neocotic/qrious/issues/76)
+
+## Version 2.2.0, 2016.10.30
+
+* Add `backgroundAlpha` and `foregroundAlpha` options to control transparency [#63](https://github.com/neocotic/qrious/issues/63)
+
+## Version 2.1.0, 2016.10.04
+
+* Allow `padding` to be set explicitly [#44](https://github.com/neocotic/qrious/issues/44)
+* Fix support for older browsers [#55](https://github.com/neocotic/qrious/issues/55)
+* Update code style to fit with other projects
+* Update build system to run on older Node.js versions at a reduced capacity
+
+## Version 2.0.2, 2016.08.05
+
+* Fix bug where mask is incorrectly applied [#50](https://github.com/neocotic/qrious/issues/50)
+
+## Version 2.0.1, 2016.07.03
+
+* Correct license mentioned into `README.md`
+
+## Version 2.0.0, 2016.06.26
+
+* Rename library to QRious and move package from `qr-js` to `qrious`
+* Completely redesign API to follow OOP pattern for simplicity
+* Remove `save` and `saveSync` method
+* Remove `noConflict` method
+* Remove documentation generated by `docco`
+* Restructure code base to make it more maintainable and use [Rollup](http://rollupjs.org) to build it
+* Provide better built-in support for [Browserify](http://browserify.org) and [Webpack](http://webpack.github.io) etc
+* Switch from [JSHint](https://github.com/jshint/jshint) to [ESLint](http://eslint.org)
+* Add `demo.html` to allow contributors to experiment and test with changes due to lack of unit tests
+* Remove `INSTALL.md` and consolidate contents into `README.md` and `CONTRIBUTING.md`
+* Add [EditorConfig](http://editorconfig.org) file
+* Add support for [Travis CI](https://travis-ci.org)
+
+## Version 1.1.4, 2015.11.11
+
+* Fix padding issues [#2](https://github.com/neocotic/qrious/issues/2)
+* Make the QR code center-aligned [#35](https://github.com/neocotic/qrious/pull/35)
+* Update [node-canvas](https://github.com/Automattic/node-canvas) dependency version to support [Node.js](https://nodejs.org) v4 and above [#38](https://github.com/neocotic/qrious/pull/38)
+
+## Version 1.1.3, 2014.09.01
+
+* Revert back to [GPL License](http://www.gnu.org/licenses/) [#23](https://github.com/neocotic/qrious/issues/23)
+
+## Version 1.1.2, 2014.04.27
+
+* Fix "too many open files" bug [#20](https://github.com/neocotic/qrious/issues/20)
+
+## Version 1.1.1, 2013.12.03
+
+* Fix bug with IIFE
+
+## Version 1.1.0, 2013.12.02
+
+* Fix [RequireJS](http://requirejs.org) support [#9](https://github.com/neocotic/qrious/issues/9)
+* Remove [Ender](http://enderjs.com) support [#13](https://github.com/neocotic/qrious/issues/13)
+* Improve code formatting and style [#14](https://github.com/neocotic/qrious/issues/14)
+* Support different MIME types for `toDataURL` and other related functions [#16](https://github.com/neocotic/qrious/issues/16)
+* Remove unnecessary callback arguments from synchronous functions [#17](https://github.com/neocotic/qrious/issues/17)
+* Make `save` fully asynchronous [#17](https://github.com/neocotic/qrious/issues/17)
+* Add `saveSync` for synchronous saving [#17](https://github.com/neocotic/qrious/issues/17)
+* Add [Grunt](http://gruntjs.com) build system [#18](https://github.com/neocotic/qrious/issues/18)
+* Generate source map as part of build [#18](https://github.com/neocotic/qrious/issues/18)
+* Improve developer documentation [#18](https://github.com/neocotic/qrious/issues/18)
+* Add support for [Bower](https://bower.io) [#19](https://github.com/neocotic/qrious/issues/19)
+* Many small fixes and tweaks
+
+## Version 1.0.3, 2011.12.19
+
+* Rename `QRCode` to `qr` [#3](https://github.com/neocotic/qrious/issues/3)
+* Remove all deprecated methods [#3](https://github.com/neocotic/qrious/issues/3)
+* Reformat code and add additional, along with some original, code comments [#4](https://github.com/neocotic/qrious/issues/4)
+* Add support for [Node.js](https://nodejs.org), [CommonJS](http://www.commonjs.org) and [Ender](http://enderjs.com) [#6](https://github.com/neocotic/qrious/issues/6)
+* Add optional `callback` functionality to API methods [#6](https://github.com/neocotic/qrious/issues/6)
+* Allow `data` arguments to be an object or string value [#7](https://github.com/neocotic/qrious/issues/7)
+* Add `VERSION` property to the API [#8](https://github.com/neocotic/qrious/issues/8)
+* Add `toDataURL`, `save` and `noConflict` methods to the API [#8](https://github.com/neocotic/qrious/issues/8)
+* Now distributed under the MIT license
+
+## Version 1.0.2, 2011.08.31
+
+* Deprecate `generateCanvas` and `generateImage` and replaced with `canvas` and `image` respectively [#1](https://github.com/neocotic/qrious/issues/1)
+
+## Version 1.0.1, 2011.08.12
+
+* Allow customisation of colours used when rendering
diff --git a/static/dist/qrious@4.0.2/LICENSE.md b/static/dist/qrious@4.0.2/LICENSE.md
new file mode 100644
index 0000000..c275508
--- /dev/null
+++ b/static/dist/qrious@4.0.2/LICENSE.md
@@ -0,0 +1,16 @@
+QRious
+Copyright (C) 2017 Alasdair Mercer
+Copyright (C) 2010 Tom Zerucha
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/static/dist/qrious@4.0.2/README.md b/static/dist/qrious@4.0.2/README.md
new file mode 100644
index 0000000..e466602
--- /dev/null
+++ b/static/dist/qrious@4.0.2/README.md
@@ -0,0 +1,201 @@
+ .d88888b. 8888888b. d8b
+ d88P" "Y88b 888 Y88b Y8P
+ 888 888 888 888
+ 888 888 888 d88P 888 .d88b. 888 888 .d8888b
+ 888 888 8888888P" 888 d88""88b 888 888 88K
+ 888 Y8b 888 888 T88b 888 888 888 888 888 "Y8888b.
+ Y88b.Y8b88P 888 T88b 888 Y88..88P Y88b 888 X88
+ "Y888888" 888 T88b 888 "Y88P" "Y88888 88888P'
+ Y8b
+
+[QRious](https://github.com/neocotic/qrious) is a pure JavaScript library for generating QR codes using HTML5 canvas.
+
+[![Chat](https://img.shields.io/gitter/room/neocotic/qrious.svg?style=flat-square)](https://gitter.im/neocotic/qrious)
+[![Demo](https://img.shields.io/badge/demo-live-brightgreen.svg?style=flat-square)](https://codepen.io/neocotic/pen/YQzmBm)
+[![Dev Dependency Status](https://img.shields.io/david/dev/neocotic/qrious.svg?style=flat-square)](https://david-dm.org/neocotic/qrious?type=dev)
+[![License](https://img.shields.io/npm/l/qrious.svg?style=flat-square)](https://github.com/neocotic/qrious/blob/master/LICENSE.md)
+[![Release](https://img.shields.io/npm/v/qrious.svg?style=flat-square)](https://www.npmjs.com/package/qrious)
+
+* [Install](#install)
+* [Examples](#examples)
+* [API](#api)
+* [Migrating from older versions](#migrating-from-older-versions)
+* [Bugs](#bugs)
+* [Contributors](#contributors)
+* [License](#license)
+
+## Install
+
+Install using the package manager for your desired environment(s):
+
+``` bash
+$ npm install --save qrious
+# OR:
+$ bower install --save qrious
+```
+
+If you want to simply download the file to be used in the browser you can find them below:
+
+* [Development Version](https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.js) (71kb - [Source Map](https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.js.map))
+* [Production Version](https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js) (18kb - [Source Map](https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js.map))
+
+Check out [node-qrious](https://github.com/neocotic/node-qrious) if you want to install it for use within
+[Node.js](https://nodejs.org).
+
+## Examples
+
+``` html
+<!DOCTYPE html>
+<html>
+ <body>
+ <canvas id="qr"></canvas>
+
+ <script src="/path/to/qrious.js"></script>
+ <script>
+ (function() {
+ var qr = new QRious({
+ element: document.getElementById('qr'),
+ value: 'https://github.com/neocotic/qrious'
+ });
+ })();
+ </script>
+ </body>
+</html>
+```
+
+Open up `demo.html` in your browser to play around a bit.
+
+## API
+
+Simply create an instance of `QRious` and you've done most of the work. You can control many aspects of the QR code
+using the following fields on your instance:
+
+| Field | Type | Description | Default | Read Only |
+| --------------- | ------- | -------------------------------------------------- | ------------- | --------- |
+| background | String | Background color of the QR code | `"white"` | No |
+| backgroundAlpha | Number | Background alpha of the QR code | `1.0` | No |
+| element | Element | Element to render the QR code | `<canvas>` | Yes |
+| foreground | String | Foreground color of the QR code | `"black"` | No |
+| foregroundAlpha | Number | Foreground alpha of the QR code | `1.0` | No |
+| level | String | Error correction level of the QR code (L, M, Q, H) | `"L"` | No |
+| mime | String | MIME type used to render the image for the QR code | `"image/png"` | No |
+| padding | Number | Padding for the QR code (pixels) | `null` (auto) | No |
+| size | Number | Size of the QR code (pixels) | `100` | No |
+| value | String | Value encoded within the QR code | `""` | No |
+
+``` javascript
+var qr = new QRious();
+qr.background = 'green';
+qr.backgroundAlpha = 0.8;
+qr.foreground = 'blue';
+qr.foregroundAlpha = 0.8;
+qr.level = 'H';
+qr.padding = 25;
+qr.size = 500;
+qr.value = 'https://github.com/neocotic/qrious';
+```
+
+The QR code will automatically update when you change one of these fields, so be wary when you plan on changing lots of
+fields at the same time. You probably want to make a single call to `set(options)` instead as it will only update the QR
+code once:
+
+``` javascript
+var qr = new QRious();
+qr.set({
+ background: 'green',
+ backgroundAlpha: 0.8,
+ foreground: 'blue',
+ foregroundAlpha: 0.8,
+ level: 'H',
+ padding: 25,
+ size: 500,
+ value: 'https://github.com/neocotic/qrious'
+});
+```
+
+These can also be passed as options to the constructor itself:
+
+``` javascript
+var qr = new QRious({
+ background: 'green',
+ backgroundAlpha: 0.8,
+ foreground: 'blue',
+ foregroundAlpha: 0.8,
+ level: 'H',
+ padding: 25,
+ size: 500,
+ value: 'https://github.com/neocotic/qrious'
+});
+```
+
+You can also pass in an `element` option to the constructor which can be used to generate the QR code using an existing
+DOM element, which is the only time that you can specify read only options. `element` must either be a `<canvas>`
+element or an `<img>` element which can then be accessed via the `canvas` or `image` fields on the instance
+respectively. An element will be created for whichever one isn't provided or for both if no `element` is specified,
+which means that they can be appended to the document at a later time.
+
+``` javascript
+var qr = new QRious({
+ element: document.querySelector('canvas'),
+ value: 'https://github.com/neocotic/qrious'
+});
+
+qr.canvas.parentNode.appendChild(qr.image);
+```
+
+A reference to the `QRious` instance is also stored on both of the elements for convenience.
+
+``` javascript
+var canvas = document.querySelector('canvas');
+var qr = new QRious({
+ element: canvas,
+ value: 'https://github.com/neocotic/qrious'
+});
+
+qr === canvas.qrious;
+//=> true
+```
+
+### `toDataURL([mime])`
+
+Generates a base64 encoded data URI for the QR code. If you don't specify a MIME type, it will default to the one
+passed to the constructor as an option or the default value for the `mime` option.
+
+``` javascript
+var qr = new QRious({
+ value: 'https://github.com/neocotic/qrious'
+});
+
+qr.toDataURL();
+//=> "data:image/png;base64,iVBOR...AIpqDnseH86KAAAAAElFTkSuQmCC"
+qr.toDataURL('image/jpeg');
+//=> "data:image/jpeg;base64,/9j/...xqAqIqgKFAAAAAq3RRQAUUUUAf/Z"
+```
+
+## Migrating from older versions
+
+If you've been using an older major version and would like details on what's changed and information on how to migrate
+to the latest major release below:
+
+https://github.com/neocotic/qrious/wiki/Migrating-from-older-versions
+
+## Bugs
+
+If you have any problems with QRious or would like to see changes currently in development you can do so
+[here](https://github.com/neocotic/nqrious/issues). Core features and issues are maintained separately
+[here](https://github.com/neocotic/qrious-core/issues).
+
+## Contributors
+
+If you want to contribute, you're a legend! Information on how you can do so can be found in
+[CONTRIBUTING.md](https://github.com/neocotic/qrious/blob/master/CONTRIBUTING.md). We want your suggestions and pull
+requests!
+
+A list of QRious contributors can be found in [AUTHORS.md](https://github.com/neocotic/qrious/blob/master/AUTHORS.md).
+
+## License
+
+Copyright © 2017 Alasdair Mercer
+Copyright © 2010 Tom Zerucha
+
+See [LICENSE.md](https://github.com/neocotic/qrious/blob/master/LICENSE.md) for more information on our GPLv3 license.
diff --git a/static/dist/qrious@4.0.2/qrious.js b/static/dist/qrious@4.0.2/qrious.js
new file mode 100644
index 0000000..4733bf3
--- /dev/null
+++ b/static/dist/qrious@4.0.2/qrious.js
@@ -0,0 +1,2363 @@
+/*
+ * QRious v4.0.2
+ * Copyright (C) 2017 Alasdair Mercer
+ * Copyright (C) 2010 Tom Zerucha
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.QRious = factory());
+}(this, (function () { 'use strict';
+
+ /*
+ * Copyright (C) 2017 Alasdair Mercer, !ninja
+ *
+ * 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.
+ */
+
+ /**
+ * A bare-bones constructor for surrogate prototype swapping.
+ *
+ * @private
+ * @constructor
+ */
+ var Constructor = /* istanbul ignore next */ function() {};
+ /**
+ * A reference to <code>Object.prototype.hasOwnProperty</code>.
+ *
+ * @private
+ * @type {Function}
+ */
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ /**
+ * A reference to <code>Array.prototype.slice</code>.
+ *
+ * @private
+ * @type {Function}
+ */
+ var slice = Array.prototype.slice;
+
+ /**
+ * Creates an object which inherits the given <code>prototype</code>.
+ *
+ * Optionally, the created object can be extended further with the specified <code>properties</code>.
+ *
+ * @param {Object} prototype - the prototype to be inherited by the created object
+ * @param {Object} [properties] - the optional properties to be extended by the created object
+ * @return {Object} The newly created object.
+ * @private
+ */
+ function createObject(prototype, properties) {
+ var result;
+ /* istanbul ignore next */
+ if (typeof Object.create === 'function') {
+ result = Object.create(prototype);
+ } else {
+ Constructor.prototype = prototype;
+ result = new Constructor();
+ Constructor.prototype = null;
+ }
+
+ if (properties) {
+ extendObject(true, result, properties);
+ }
+
+ return result;
+ }
+
+ /**
+ * Extends the constructor to which this method is associated with the <code>prototype</code> and/or
+ * <code>statics</code> provided.
+ *
+ * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special
+ * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used
+ * instead. The class name may also be used string representation for instances of the child constructor (via
+ * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.
+ *
+ * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple
+ * constructor which only calls the super constructor will be used instead.
+ *
+ * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.
+ *
+ * @param {string} [name=this.class_] - the class name to be used for the child constructor
+ * @param {Function} [constructor] - the constructor for the child
+ * @param {Object} [prototype] - the prototype properties to be defined for the child
+ * @param {Object} [statics] - the static properties to be defined for the child
+ * @return {Function} The child <code>constructor</code> provided or the one created if none was given.
+ * @public
+ */
+ function extend(name, constructor, prototype, statics) {
+ var superConstructor = this;
+
+ if (typeof name !== 'string') {
+ statics = prototype;
+ prototype = constructor;
+ constructor = name;
+ name = null;
+ }
+
+ if (typeof constructor !== 'function') {
+ statics = prototype;
+ prototype = constructor;
+ constructor = function() {
+ return superConstructor.apply(this, arguments);
+ };
+ }
+
+ extendObject(false, constructor, superConstructor, statics);
+
+ constructor.prototype = createObject(superConstructor.prototype, prototype);
+ constructor.prototype.constructor = constructor;
+
+ constructor.class_ = name || superConstructor.class_;
+ constructor.super_ = superConstructor;
+
+ return constructor;
+ }
+
+ /**
+ * Extends the specified <code>target</code> object with the properties in each of the <code>sources</code> provided.
+ *
+ * if any source is <code>null</code> it will be ignored.
+ *
+ * @param {boolean} own - <code>true</code> to only copy <b>own</b> properties from <code>sources</code> onto
+ * <code>target</code>; otherwise <code>false</code>
+ * @param {Object} target - the target object which should be extended
+ * @param {...Object} [sources] - the source objects whose properties are to be copied onto <code>target</code>
+ * @return {void}
+ * @private
+ */
+ function extendObject(own, target, sources) {
+ sources = slice.call(arguments, 2);
+
+ var property;
+ var source;
+
+ for (var i = 0, length = sources.length; i < length; i++) {
+ source = sources[i];
+
+ for (property in source) {
+ if (!own || hasOwnProperty.call(source, property)) {
+ target[property] = source[property];
+ }
+ }
+ }
+ }
+
+ var extend_1 = extend;
+
+ /**
+ * The base class from which all others should extend.
+ *
+ * @public
+ * @constructor
+ */
+ function Nevis() {}
+ Nevis.class_ = 'Nevis';
+ Nevis.super_ = Object;
+
+ /**
+ * Extends the constructor to which this method is associated with the <code>prototype</code> and/or
+ * <code>statics</code> provided.
+ *
+ * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special
+ * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used
+ * instead. The class name may also be used string representation for instances of the child constructor (via
+ * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.
+ *
+ * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple
+ * constructor which only calls the super constructor will be used instead.
+ *
+ * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.
+ *
+ * @param {string} [name=this.class_] - the class name to be used for the child constructor
+ * @param {Function} [constructor] - the constructor for the child
+ * @param {Object} [prototype] - the prototype properties to be defined for the child
+ * @param {Object} [statics] - the static properties to be defined for the child
+ * @return {Function} The child <code>constructor</code> provided or the one created if none was given.
+ * @public
+ * @static
+ * @memberof Nevis
+ */
+ Nevis.extend = extend_1;
+
+ var nevis = Nevis;
+
+ var lite = nevis;
+
+ /**
+ * Responsible for rendering a QR code {@link Frame} on a specific type of element.
+ *
+ * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.
+ *
+ * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element
+ * from the renderer will result in it being immediately enabled and the element being rendered.
+ *
+ * @param {QRious} qrious - the {@link QRious} instance to be used
+ * @param {*} element - the element onto which the QR code is to be rendered
+ * @param {boolean} [enabled] - <code>true</code> this {@link Renderer} is enabled; otherwise <code>false</code>.
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Renderer = lite.extend(function(qrious, element, enabled) {
+ /**
+ * The {@link QRious} instance.
+ *
+ * @protected
+ * @type {QRious}
+ * @memberof Renderer#
+ */
+ this.qrious = qrious;
+
+ /**
+ * The element onto which this {@link Renderer} is rendering the QR code.
+ *
+ * @protected
+ * @type {*}
+ * @memberof Renderer#
+ */
+ this.element = element;
+ this.element.qrious = qrious;
+
+ /**
+ * Whether this {@link Renderer} is enabled.
+ *
+ * @protected
+ * @type {boolean}
+ * @memberof Renderer#
+ */
+ this.enabled = Boolean(enabled);
+ }, {
+
+ /**
+ * Draws the specified QR code <code>frame</code> on the underlying element.
+ *
+ * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
+ *
+ * @param {Frame} frame - the {@link Frame} to be drawn
+ * @return {void}
+ * @protected
+ * @abstract
+ * @memberof Renderer#
+ */
+ draw: function(frame) {},
+
+ /**
+ * Returns the element onto which this {@link Renderer} is rendering the QR code.
+ *
+ * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered
+ * before the element is returned.
+ *
+ * @return {*} The element.
+ * @public
+ * @memberof Renderer#
+ */
+ getElement: function() {
+ if (!this.enabled) {
+ this.enabled = true;
+ this.render();
+ }
+
+ return this.element;
+ },
+
+ /**
+ * Calculates the size (in pixel units) to represent an individual module within the QR code based on the
+ * <code>frame</code> provided.
+ *
+ * Any configured padding will be excluded from the returned size.
+ *
+ * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.
+ * This is done so that the inevitable clipping is handled more gracefully since this way at least something is
+ * displayed instead of just a blank space filled by the background color.
+ *
+ * @param {Frame} frame - the {@link Frame} from which the module size is to be derived
+ * @return {number} The pixel size for each module in the QR code which will be no less than one.
+ * @protected
+ * @memberof Renderer#
+ */
+ getModuleSize: function(frame) {
+ var qrious = this.qrious;
+ var padding = qrious.padding || 0;
+ var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);
+
+ return Math.max(1, pixels);
+ },
+
+ /**
+ * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the <code>frame</code>
+ * provided.
+ *
+ * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its
+ * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally
+ * and it is not clipped from all directions.
+ *
+ * @param {Frame} frame - the {@link Frame} from which the offset is to be derived
+ * @return {number} The pixel offset for the QR code which will be no less than zero.
+ * @protected
+ * @memberof Renderer#
+ */
+ getOffset: function(frame) {
+ var qrious = this.qrious;
+ var padding = qrious.padding;
+
+ if (padding != null) {
+ return padding;
+ }
+
+ var moduleSize = this.getModuleSize(frame);
+ var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);
+
+ return Math.max(0, offset);
+ },
+
+ /**
+ * Renders a QR code on the underlying element based on the <code>frame</code> provided.
+ *
+ * @param {Frame} frame - the {@link Frame} to be rendered
+ * @return {void}
+ * @public
+ * @memberof Renderer#
+ */
+ render: function(frame) {
+ if (this.enabled) {
+ this.resize();
+ this.reset();
+ this.draw(frame);
+ }
+ },
+
+ /**
+ * Resets the underlying element, effectively clearing any previously rendered QR code.
+ *
+ * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
+ *
+ * @return {void}
+ * @protected
+ * @abstract
+ * @memberof Renderer#
+ */
+ reset: function() {},
+
+ /**
+ * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.
+ *
+ * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.
+ *
+ * @return {void}
+ * @protected
+ * @abstract
+ * @memberof Renderer#
+ */
+ resize: function() {}
+
+ });
+
+ var Renderer_1 = Renderer;
+
+ /**
+ * An implementation of {@link Renderer} for working with <code>canvas</code> elements.
+ *
+ * @public
+ * @class
+ * @extends Renderer
+ */
+ var CanvasRenderer = Renderer_1.extend({
+
+ /**
+ * @override
+ */
+ draw: function(frame) {
+ var i, j;
+ var qrious = this.qrious;
+ var moduleSize = this.getModuleSize(frame);
+ var offset = this.getOffset(frame);
+ var context = this.element.getContext('2d');
+
+ context.fillStyle = qrious.foreground;
+ context.globalAlpha = qrious.foregroundAlpha;
+
+ for (i = 0; i < frame.width; i++) {
+ for (j = 0; j < frame.width; j++) {
+ if (frame.buffer[(j * frame.width) + i]) {
+ context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);
+ }
+ }
+ }
+ },
+
+ /**
+ * @override
+ */
+ reset: function() {
+ var qrious = this.qrious;
+ var context = this.element.getContext('2d');
+ var size = qrious.size;
+
+ context.lineWidth = 1;
+ context.clearRect(0, 0, size, size);
+ context.fillStyle = qrious.background;
+ context.globalAlpha = qrious.backgroundAlpha;
+ context.fillRect(0, 0, size, size);
+ },
+
+ /**
+ * @override
+ */
+ resize: function() {
+ var element = this.element;
+
+ element.width = element.height = this.qrious.size;
+ }
+
+ });
+
+ var CanvasRenderer_1 = CanvasRenderer;
+
+ /* eslint no-multi-spaces: "off" */
+
+
+
+ /**
+ * Contains alignment pattern information.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Alignment = lite.extend(null, {
+
+ /**
+ * The alignment pattern block.
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof Alignment
+ */
+ BLOCK: [
+ 0, 11, 15, 19, 23, 27, 31,
+ 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
+ 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
+ ]
+
+ });
+
+ var Alignment_1 = Alignment;
+
+ /* eslint no-multi-spaces: "off" */
+
+
+
+ /**
+ * Contains error correction information.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var ErrorCorrection = lite.extend(null, {
+
+ /**
+ * The error correction blocks.
+ *
+ * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally
+ * the ECC width.
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof ErrorCorrection
+ */
+ BLOCKS: [
+ 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
+ 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
+ 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
+ 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
+ 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
+ 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
+ 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
+ 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
+ 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
+ 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
+ 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
+ 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
+ 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
+ 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
+ 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
+ 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
+ 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
+ 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
+ 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
+ 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
+ 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
+ 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
+ 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
+ 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
+ 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
+ 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
+ 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
+ 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
+ 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
+ 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
+ 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
+ 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
+ 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
+ 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
+ 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
+ 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
+ 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
+ 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
+ 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
+ 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
+ ],
+
+ /**
+ * The final format bits with mask (level << 3 | mask).
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof ErrorCorrection
+ */
+ FINAL_FORMAT: [
+ // L
+ 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,
+ // M
+ 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,
+ // Q
+ 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,
+ // H
+ 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b
+ ],
+
+ /**
+ * A map of human-readable ECC levels.
+ *
+ * @public
+ * @static
+ * @type {Object.<string, number>}
+ * @memberof ErrorCorrection
+ */
+ LEVELS: {
+ L: 1,
+ M: 2,
+ Q: 3,
+ H: 4
+ }
+
+ });
+
+ var ErrorCorrection_1 = ErrorCorrection;
+
+ /**
+ * Contains Galois field information.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Galois = lite.extend(null, {
+
+ /**
+ * The Galois field exponent table.
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof Galois
+ */
+ EXPONENT: [
+ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
+ 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
+ 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
+ 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
+ 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
+ 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
+ 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
+ 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
+ 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
+ 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
+ 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
+ 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
+ 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
+ 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
+ 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
+ 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
+ ],
+
+ /**
+ * The Galois field log table.
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof Galois
+ */
+ LOG: [
+ 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
+ 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
+ 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
+ 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
+ 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
+ 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
+ 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
+ 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
+ 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
+ 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
+ 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
+ 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
+ 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
+ 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
+ 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
+ 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
+ ]
+
+ });
+
+ var Galois_1 = Galois;
+
+ /**
+ * Contains version pattern information.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Version = lite.extend(null, {
+
+ /**
+ * The version pattern block.
+ *
+ * @public
+ * @static
+ * @type {number[]}
+ * @memberof Version
+ */
+ BLOCK: [
+ 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,
+ 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,
+ 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69
+ ]
+
+ });
+
+ var Version_1 = Version;
+
+ /**
+ * Generates information for a QR code frame based on a specific value to be encoded.
+ *
+ * @param {Frame~Options} options - the options to be used
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Frame = lite.extend(function(options) {
+ var dataBlock, eccBlock, index, neccBlock1, neccBlock2;
+ var valueLength = options.value.length;
+
+ this._badness = [];
+ this._level = ErrorCorrection_1.LEVELS[options.level];
+ this._polynomial = [];
+ this._value = options.value;
+ this._version = 0;
+ this._stringBuffer = [];
+
+ while (this._version < 40) {
+ this._version++;
+
+ index = ((this._level - 1) * 4) + ((this._version - 1) * 16);
+
+ neccBlock1 = ErrorCorrection_1.BLOCKS[index++];
+ neccBlock2 = ErrorCorrection_1.BLOCKS[index++];
+ dataBlock = ErrorCorrection_1.BLOCKS[index++];
+ eccBlock = ErrorCorrection_1.BLOCKS[index];
+
+ index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);
+
+ if (valueLength <= index) {
+ break;
+ }
+ }
+
+ this._dataBlock = dataBlock;
+ this._eccBlock = eccBlock;
+ this._neccBlock1 = neccBlock1;
+ this._neccBlock2 = neccBlock2;
+
+ /**
+ * The data width is based on version.
+ *
+ * @public
+ * @type {number}
+ * @memberof Frame#
+ */
+ // FIXME: Ensure that it fits instead of being truncated.
+ var width = this.width = 17 + (4 * this._version);
+
+ /**
+ * The image buffer.
+ *
+ * @public
+ * @type {number[]}
+ * @memberof Frame#
+ */
+ this.buffer = Frame._createArray(width * width);
+
+ this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);
+ this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);
+
+ this._insertFinders();
+ this._insertAlignments();
+
+ // Insert single foreground cell.
+ this.buffer[8 + (width * (width - 8))] = 1;
+
+ this._insertTimingGap();
+ this._reverseMask();
+ this._insertTimingRowAndColumn();
+ this._insertVersion();
+ this._syncMask();
+ this._convertBitStream(valueLength);
+ this._calculatePolynomial();
+ this._appendEccToData();
+ this._interleaveBlocks();
+ this._pack();
+ this._finish();
+ }, {
+
+ _addAlignment: function(x, y) {
+ var i;
+ var buffer = this.buffer;
+ var width = this.width;
+
+ buffer[x + (width * y)] = 1;
+
+ for (i = -2; i < 2; i++) {
+ buffer[x + i + (width * (y - 2))] = 1;
+ buffer[x - 2 + (width * (y + i + 1))] = 1;
+ buffer[x + 2 + (width * (y + i))] = 1;
+ buffer[x + i + 1 + (width * (y + 2))] = 1;
+ }
+
+ for (i = 0; i < 2; i++) {
+ this._setMask(x - 1, y + i);
+ this._setMask(x + 1, y - i);
+ this._setMask(x - i, y - 1);
+ this._setMask(x + i, y + 1);
+ }
+ },
+
+ _appendData: function(data, dataLength, ecc, eccLength) {
+ var bit, i, j;
+ var polynomial = this._polynomial;
+ var stringBuffer = this._stringBuffer;
+
+ for (i = 0; i < eccLength; i++) {
+ stringBuffer[ecc + i] = 0;
+ }
+
+ for (i = 0; i < dataLength; i++) {
+ bit = Galois_1.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];
+
+ if (bit !== 255) {
+ for (j = 1; j < eccLength; j++) {
+ stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^
+ Galois_1.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];
+ }
+ } else {
+ for (j = ecc; j < ecc + eccLength; j++) {
+ stringBuffer[j] = stringBuffer[j + 1];
+ }
+ }
+
+ stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois_1.EXPONENT[Frame._modN(bit + polynomial[0])];
+ }
+ },
+
+ _appendEccToData: function() {
+ var i;
+ var data = 0;
+ var dataBlock = this._dataBlock;
+ var ecc = this._calculateMaxLength();
+ var eccBlock = this._eccBlock;
+
+ for (i = 0; i < this._neccBlock1; i++) {
+ this._appendData(data, dataBlock, ecc, eccBlock);
+
+ data += dataBlock;
+ ecc += eccBlock;
+ }
+
+ for (i = 0; i < this._neccBlock2; i++) {
+ this._appendData(data, dataBlock + 1, ecc, eccBlock);
+
+ data += dataBlock + 1;
+ ecc += eccBlock;
+ }
+ },
+
+ _applyMask: function(mask) {
+ var r3x, r3y, x, y;
+ var buffer = this.buffer;
+ var width = this.width;
+
+ switch (mask) {
+ case 0:
+ for (y = 0; y < width; y++) {
+ for (x = 0; x < width; x++) {
+ if (!((x + y) & 1) && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 1:
+ for (y = 0; y < width; y++) {
+ for (x = 0; x < width; x++) {
+ if (!(y & 1) && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 2:
+ for (y = 0; y < width; y++) {
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ }
+
+ if (!r3x && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 3:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y === 3) {
+ r3y = 0;
+ }
+
+ for (r3x = r3y, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ }
+
+ if (!r3x && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 4:
+ for (y = 0; y < width; y++) {
+ for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ r3y = !r3y;
+ }
+
+ if (!r3y && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 5:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y === 3) {
+ r3y = 0;
+ }
+
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ }
+
+ if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 6:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y === 3) {
+ r3y = 0;
+ }
+
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ }
+
+ if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ case 7:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y === 3) {
+ r3y = 0;
+ }
+
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x === 3) {
+ r3x = 0;
+ }
+
+ if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {
+ buffer[x + (y * width)] ^= 1;
+ }
+ }
+ }
+
+ break;
+ }
+ },
+
+ _calculateMaxLength: function() {
+ return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;
+ },
+
+ _calculatePolynomial: function() {
+ var i, j;
+ var eccBlock = this._eccBlock;
+ var polynomial = this._polynomial;
+
+ polynomial[0] = 1;
+
+ for (i = 0; i < eccBlock; i++) {
+ polynomial[i + 1] = 1;
+
+ for (j = i; j > 0; j--) {
+ polynomial[j] = polynomial[j] ? polynomial[j - 1] ^
+ Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[j]] + i)] : polynomial[j - 1];
+ }
+
+ polynomial[0] = Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[0]] + i)];
+ }
+
+ // Use logs for generator polynomial to save calculation step.
+ for (i = 0; i <= eccBlock; i++) {
+ polynomial[i] = Galois_1.LOG[polynomial[i]];
+ }
+ },
+
+ _checkBadness: function() {
+ var b, b1, h, x, y;
+ var bad = 0;
+ var badness = this._badness;
+ var buffer = this.buffer;
+ var width = this.width;
+
+ // Blocks of same colour.
+ for (y = 0; y < width - 1; y++) {
+ for (x = 0; x < width - 1; x++) {
+ // All foreground colour.
+ if ((buffer[x + (width * y)] &&
+ buffer[x + 1 + (width * y)] &&
+ buffer[x + (width * (y + 1))] &&
+ buffer[x + 1 + (width * (y + 1))]) ||
+ // All background colour.
+ !(buffer[x + (width * y)] ||
+ buffer[x + 1 + (width * y)] ||
+ buffer[x + (width * (y + 1))] ||
+ buffer[x + 1 + (width * (y + 1))])) {
+ bad += Frame.N2;
+ }
+ }
+ }
+
+ var bw = 0;
+
+ // X runs.
+ for (y = 0; y < width; y++) {
+ h = 0;
+
+ badness[0] = 0;
+
+ for (b = 0, x = 0; x < width; x++) {
+ b1 = buffer[x + (width * y)];
+
+ if (b === b1) {
+ badness[h]++;
+ } else {
+ badness[++h] = 1;
+ }
+
+ b = b1;
+ bw += b ? 1 : -1;
+ }
+
+ bad += this._getBadness(h);
+ }
+
+ if (bw < 0) {
+ bw = -bw;
+ }
+
+ var count = 0;
+ var big = bw;
+ big += big << 2;
+ big <<= 1;
+
+ while (big > width * width) {
+ big -= width * width;
+ count++;
+ }
+
+ bad += count * Frame.N4;
+
+ // Y runs.
+ for (x = 0; x < width; x++) {
+ h = 0;
+
+ badness[0] = 0;
+
+ for (b = 0, y = 0; y < width; y++) {
+ b1 = buffer[x + (width * y)];
+
+ if (b === b1) {
+ badness[h]++;
+ } else {
+ badness[++h] = 1;
+ }
+
+ b = b1;
+ }
+
+ bad += this._getBadness(h);
+ }
+
+ return bad;
+ },
+
+ _convertBitStream: function(length) {
+ var bit, i;
+ var ecc = this._ecc;
+ var version = this._version;
+
+ // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).
+ for (i = 0; i < length; i++) {
+ ecc[i] = this._value.charCodeAt(i);
+ }
+
+ var stringBuffer = this._stringBuffer = ecc.slice();
+ var maxLength = this._calculateMaxLength();
+
+ if (length >= maxLength - 2) {
+ length = maxLength - 2;
+
+ if (version > 9) {
+ length--;
+ }
+ }
+
+ // Shift and re-pack to insert length prefix.
+ var index = length;
+
+ if (version > 9) {
+ stringBuffer[index + 2] = 0;
+ stringBuffer[index + 3] = 0;
+
+ while (index--) {
+ bit = stringBuffer[index];
+
+ stringBuffer[index + 3] |= 255 & (bit << 4);
+ stringBuffer[index + 2] = bit >> 4;
+ }
+
+ stringBuffer[2] |= 255 & (length << 4);
+ stringBuffer[1] = length >> 4;
+ stringBuffer[0] = 0x40 | (length >> 12);
+ } else {
+ stringBuffer[index + 1] = 0;
+ stringBuffer[index + 2] = 0;
+
+ while (index--) {
+ bit = stringBuffer[index];
+
+ stringBuffer[index + 2] |= 255 & (bit << 4);
+ stringBuffer[index + 1] = bit >> 4;
+ }
+
+ stringBuffer[1] |= 255 & (length << 4);
+ stringBuffer[0] = 0x40 | (length >> 4);
+ }
+
+ // Fill to end with pad pattern.
+ index = length + 3 - (version < 10);
+
+ while (index < maxLength) {
+ stringBuffer[index++] = 0xec;
+ stringBuffer[index++] = 0x11;
+ }
+ },
+
+ _getBadness: function(length) {
+ var i;
+ var badRuns = 0;
+ var badness = this._badness;
+
+ for (i = 0; i <= length; i++) {
+ if (badness[i] >= 5) {
+ badRuns += Frame.N1 + badness[i] - 5;
+ }
+ }
+
+ // FBFFFBF as in finder.
+ for (i = 3; i < length - 1; i += 2) {
+ if (badness[i - 2] === badness[i + 2] &&
+ badness[i + 2] === badness[i - 1] &&
+ badness[i - 1] === badness[i + 1] &&
+ badness[i - 1] * 3 === badness[i] &&
+ // Background around the foreground pattern? Not part of the specs.
+ (badness[i - 3] === 0 || i + 3 > length ||
+ badness[i - 3] * 3 >= badness[i] * 4 ||
+ badness[i + 3] * 3 >= badness[i] * 4)) {
+ badRuns += Frame.N3;
+ }
+ }
+
+ return badRuns;
+ },
+
+ _finish: function() {
+ // Save pre-mask copy of frame.
+ this._stringBuffer = this.buffer.slice();
+
+ var currentMask, i;
+ var bit = 0;
+ var mask = 30000;
+
+ /*
+ * Using for instead of while since in original Arduino code if an early mask was "good enough" it wouldn't try for
+ * a better one since they get more complex and take longer.
+ */
+ for (i = 0; i < 8; i++) {
+ // Returns foreground-background imbalance.
+ this._applyMask(i);
+
+ currentMask = this._checkBadness();
+
+ // Is current mask better than previous best?
+ if (currentMask < mask) {
+ mask = currentMask;
+ bit = i;
+ }
+
+ // Don't increment "i" to a void redoing mask.
+ if (bit === 7) {
+ break;
+ }
+
+ // Reset for next pass.
+ this.buffer = this._stringBuffer.slice();
+ }
+
+ // Redo best mask as none were "good enough" (i.e. last wasn't bit).
+ if (bit !== i) {
+ this._applyMask(bit);
+ }
+
+ // Add in final mask/ECC level bytes.
+ mask = ErrorCorrection_1.FINAL_FORMAT[bit + (this._level - 1 << 3)];
+
+ var buffer = this.buffer;
+ var width = this.width;
+
+ // Low byte.
+ for (i = 0; i < 8; i++, mask >>= 1) {
+ if (mask & 1) {
+ buffer[width - 1 - i + (width * 8)] = 1;
+
+ if (i < 6) {
+ buffer[8 + (width * i)] = 1;
+ } else {
+ buffer[8 + (width * (i + 1))] = 1;
+ }
+ }
+ }
+
+ // High byte.
+ for (i = 0; i < 7; i++, mask >>= 1) {
+ if (mask & 1) {
+ buffer[8 + (width * (width - 7 + i))] = 1;
+
+ if (i) {
+ buffer[6 - i + (width * 8)] = 1;
+ } else {
+ buffer[7 + (width * 8)] = 1;
+ }
+ }
+ }
+ },
+
+ _interleaveBlocks: function() {
+ var i, j;
+ var dataBlock = this._dataBlock;
+ var ecc = this._ecc;
+ var eccBlock = this._eccBlock;
+ var k = 0;
+ var maxLength = this._calculateMaxLength();
+ var neccBlock1 = this._neccBlock1;
+ var neccBlock2 = this._neccBlock2;
+ var stringBuffer = this._stringBuffer;
+
+ for (i = 0; i < dataBlock; i++) {
+ for (j = 0; j < neccBlock1; j++) {
+ ecc[k++] = stringBuffer[i + (j * dataBlock)];
+ }
+
+ for (j = 0; j < neccBlock2; j++) {
+ ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];
+ }
+ }
+
+ for (j = 0; j < neccBlock2; j++) {
+ ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];
+ }
+
+ for (i = 0; i < eccBlock; i++) {
+ for (j = 0; j < neccBlock1 + neccBlock2; j++) {
+ ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];
+ }
+ }
+
+ this._stringBuffer = ecc;
+ },
+
+ _insertAlignments: function() {
+ var i, x, y;
+ var version = this._version;
+ var width = this.width;
+
+ if (version > 1) {
+ i = Alignment_1.BLOCK[version];
+ y = width - 7;
+
+ for (;;) {
+ x = width - 7;
+
+ while (x > i - 3) {
+ this._addAlignment(x, y);
+
+ if (x < i) {
+ break;
+ }
+
+ x -= i;
+ }
+
+ if (y <= i + 9) {
+ break;
+ }
+
+ y -= i;
+
+ this._addAlignment(6, y);
+ this._addAlignment(y, 6);
+ }
+ }
+ },
+
+ _insertFinders: function() {
+ var i, j, x, y;
+ var buffer = this.buffer;
+ var width = this.width;
+
+ for (i = 0; i < 3; i++) {
+ j = 0;
+ y = 0;
+
+ if (i === 1) {
+ j = width - 7;
+ }
+ if (i === 2) {
+ y = width - 7;
+ }
+
+ buffer[y + 3 + (width * (j + 3))] = 1;
+
+ for (x = 0; x < 6; x++) {
+ buffer[y + x + (width * j)] = 1;
+ buffer[y + (width * (j + x + 1))] = 1;
+ buffer[y + 6 + (width * (j + x))] = 1;
+ buffer[y + x + 1 + (width * (j + 6))] = 1;
+ }
+
+ for (x = 1; x < 5; x++) {
+ this._setMask(y + x, j + 1);
+ this._setMask(y + 1, j + x + 1);
+ this._setMask(y + 5, j + x);
+ this._setMask(y + x + 1, j + 5);
+ }
+
+ for (x = 2; x < 4; x++) {
+ buffer[y + x + (width * (j + 2))] = 1;
+ buffer[y + 2 + (width * (j + x + 1))] = 1;
+ buffer[y + 4 + (width * (j + x))] = 1;
+ buffer[y + x + 1 + (width * (j + 4))] = 1;
+ }
+ }
+ },
+
+ _insertTimingGap: function() {
+ var x, y;
+ var width = this.width;
+
+ for (y = 0; y < 7; y++) {
+ this._setMask(7, y);
+ this._setMask(width - 8, y);
+ this._setMask(7, y + width - 7);
+ }
+
+ for (x = 0; x < 8; x++) {
+ this._setMask(x, 7);
+ this._setMask(x + width - 8, 7);
+ this._setMask(x, width - 8);
+ }
+ },
+
+ _insertTimingRowAndColumn: function() {
+ var x;
+ var buffer = this.buffer;
+ var width = this.width;
+
+ for (x = 0; x < width - 14; x++) {
+ if (x & 1) {
+ this._setMask(8 + x, 6);
+ this._setMask(6, 8 + x);
+ } else {
+ buffer[8 + x + (width * 6)] = 1;
+ buffer[6 + (width * (8 + x))] = 1;
+ }
+ }
+ },
+
+ _insertVersion: function() {
+ var i, j, x, y;
+ var buffer = this.buffer;
+ var version = this._version;
+ var width = this.width;
+
+ if (version > 6) {
+ i = Version_1.BLOCK[version - 7];
+ j = 17;
+
+ for (x = 0; x < 6; x++) {
+ for (y = 0; y < 3; y++, j--) {
+ if (1 & (j > 11 ? version >> j - 12 : i >> j)) {
+ buffer[5 - x + (width * (2 - y + width - 11))] = 1;
+ buffer[2 - y + width - 11 + (width * (5 - x))] = 1;
+ } else {
+ this._setMask(5 - x, 2 - y + width - 11);
+ this._setMask(2 - y + width - 11, 5 - x);
+ }
+ }
+ }
+ }
+ },
+
+ _isMasked: function(x, y) {
+ var bit = Frame._getMaskBit(x, y);
+
+ return this._mask[bit] === 1;
+ },
+
+ _pack: function() {
+ var bit, i, j;
+ var k = 1;
+ var v = 1;
+ var width = this.width;
+ var x = width - 1;
+ var y = width - 1;
+
+ // Interleaved data and ECC codes.
+ var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;
+
+ for (i = 0; i < length; i++) {
+ bit = this._stringBuffer[i];
+
+ for (j = 0; j < 8; j++, bit <<= 1) {
+ if (0x80 & bit) {
+ this.buffer[x + (width * y)] = 1;
+ }
+
+ // Find next fill position.
+ do {
+ if (v) {
+ x--;
+ } else {
+ x++;
+
+ if (k) {
+ if (y !== 0) {
+ y--;
+ } else {
+ x -= 2;
+ k = !k;
+
+ if (x === 6) {
+ x--;
+ y = 9;
+ }
+ }
+ } else if (y !== width - 1) {
+ y++;
+ } else {
+ x -= 2;
+ k = !k;
+
+ if (x === 6) {
+ x--;
+ y -= 8;
+ }
+ }
+ }
+
+ v = !v;
+ } while (this._isMasked(x, y));
+ }
+ }
+ },
+
+ _reverseMask: function() {
+ var x, y;
+ var width = this.width;
+
+ for (x = 0; x < 9; x++) {
+ this._setMask(x, 8);
+ }
+
+ for (x = 0; x < 8; x++) {
+ this._setMask(x + width - 8, 8);
+ this._setMask(8, x);
+ }
+
+ for (y = 0; y < 7; y++) {
+ this._setMask(8, y + width - 7);
+ }
+ },
+
+ _setMask: function(x, y) {
+ var bit = Frame._getMaskBit(x, y);
+
+ this._mask[bit] = 1;
+ },
+
+ _syncMask: function() {
+ var x, y;
+ var width = this.width;
+
+ for (y = 0; y < width; y++) {
+ for (x = 0; x <= y; x++) {
+ if (this.buffer[x + (width * y)]) {
+ this._setMask(x, y);
+ }
+ }
+ }
+ }
+
+ }, {
+
+ _createArray: function(length) {
+ var i;
+ var array = [];
+
+ for (i = 0; i < length; i++) {
+ array[i] = 0;
+ }
+
+ return array;
+ },
+
+ _getMaskBit: function(x, y) {
+ var bit;
+
+ if (x > y) {
+ bit = x;
+ x = y;
+ y = bit;
+ }
+
+ bit = y;
+ bit += y * y;
+ bit >>= 1;
+ bit += x;
+
+ return bit;
+ },
+
+ _modN: function(x) {
+ while (x >= 255) {
+ x -= 255;
+ x = (x >> 8) + (x & 255);
+ }
+
+ return x;
+ },
+
+ // *Badness* coefficients.
+ N1: 3,
+ N2: 3,
+ N3: 40,
+ N4: 10
+
+ });
+
+ var Frame_1 = Frame;
+
+ /**
+ * The options used by {@link Frame}.
+ *
+ * @typedef {Object} Frame~Options
+ * @property {string} level - The ECC level to be used.
+ * @property {string} value - The value to be encoded.
+ */
+
+ /**
+ * An implementation of {@link Renderer} for working with <code>img</code> elements.
+ *
+ * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from
+ * the rendered <code>canvas</code> element as the <code>src</code> for the <code>img</code> element being rendered.
+ *
+ * @public
+ * @class
+ * @extends Renderer
+ */
+ var ImageRenderer = Renderer_1.extend({
+
+ /**
+ * @override
+ */
+ draw: function() {
+ this.element.src = this.qrious.toDataURL();
+ },
+
+ /**
+ * @override
+ */
+ reset: function() {
+ this.element.src = '';
+ },
+
+ /**
+ * @override
+ */
+ resize: function() {
+ var element = this.element;
+
+ element.width = element.height = this.qrious.size;
+ }
+
+ });
+
+ var ImageRenderer_1 = ImageRenderer;
+
+ /**
+ * Defines an available option while also configuring how values are applied to the target object.
+ *
+ * Optionally, a default value can be specified as well a value transformer for greater control over how the option
+ * value is applied.
+ *
+ * If no value transformer is specified, then any specified option will be applied directly. All values are maintained
+ * on the target object itself as a field using the option name prefixed with a single underscore.
+ *
+ * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the
+ * property that is defined on the target object that uses the option name.
+ *
+ * @param {string} name - the name to be used
+ * @param {boolean} [modifiable] - <code>true</code> if the property defined on target objects should include a setter;
+ * otherwise <code>false</code>
+ * @param {*} [defaultValue] - the default value to be used
+ * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Option = lite.extend(function(name, modifiable, defaultValue, valueTransformer) {
+ /**
+ * The name for this {@link Option}.
+ *
+ * @public
+ * @type {string}
+ * @memberof Option#
+ */
+ this.name = name;
+
+ /**
+ * Whether a setter should be included on the property defined on target objects for this {@link Option}.
+ *
+ * @public
+ * @type {boolean}
+ * @memberof Option#
+ */
+ this.modifiable = Boolean(modifiable);
+
+ /**
+ * The default value for this {@link Option}.
+ *
+ * @public
+ * @type {*}
+ * @memberof Option#
+ */
+ this.defaultValue = defaultValue;
+
+ this._valueTransformer = valueTransformer;
+ }, {
+
+ /**
+ * Transforms the specified <code>value</code> so that it can be applied for this {@link Option}.
+ *
+ * If a value transformer has been specified for this {@link Option}, it will be called upon to transform
+ * <code>value</code>. Otherwise, <code>value</code> will be returned directly.
+ *
+ * @param {*} value - the value to be transformed
+ * @return {*} The transformed value or <code>value</code> if no value transformer is specified.
+ * @public
+ * @memberof Option#
+ */
+ transform: function(value) {
+ var transformer = this._valueTransformer;
+ if (typeof transformer === 'function') {
+ return transformer(value, this);
+ }
+
+ return value;
+ }
+
+ });
+
+ var Option_1 = Option;
+
+ /**
+ * Returns a transformed value for the specified <code>value</code> to be applied for the <code>option</code> provided.
+ *
+ * @callback Option~ValueTransformer
+ * @param {*} value - the value to be transformed
+ * @param {Option} option - the {@link Option} for which <code>value</code> is being transformed
+ * @return {*} The transform value.
+ */
+
+ /**
+ * Contains utility methods that are useful throughout the library.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Utilities = lite.extend(null, {
+
+ /**
+ * Returns the absolute value of a given number.
+ *
+ * This method is simply a convenient shorthand for <code>Math.abs</code> while ensuring that nulls are returned as
+ * <code>null</code> instead of zero.
+ *
+ * @param {number} value - the number whose absolute value is to be returned
+ * @return {number} The absolute value of <code>value</code> or <code>null</code> if <code>value</code> is
+ * <code>null</code>.
+ * @public
+ * @static
+ * @memberof Utilities
+ */
+ abs: function(value) {
+ return value != null ? Math.abs(value) : null;
+ },
+
+ /**
+ * Returns whether the specified <code>object</code> has a property with the specified <code>name</code> as an own
+ * (not inherited) property.
+ *
+ * @param {Object} object - the object on which the property is to be checked
+ * @param {string} name - the name of the property to be checked
+ * @return {boolean} <code>true</code> if <code>object</code> has an own property with <code>name</code>.
+ * @public
+ * @static
+ * @memberof Utilities
+ */
+ hasOwn: function(object, name) {
+ return Object.prototype.hasOwnProperty.call(object, name);
+ },
+
+ /**
+ * A non-operation method that does absolutely nothing.
+ *
+ * @return {void}
+ * @public
+ * @static
+ * @memberof Utilities
+ */
+ noop: function() {},
+
+ /**
+ * Transforms the specified <code>string</code> to upper case while remaining null-safe.
+ *
+ * @param {string} string - the string to be transformed to upper case
+ * @return {string} <code>string</code> transformed to upper case if <code>string</code> is not <code>null</code>.
+ * @public
+ * @static
+ * @memberof Utilities
+ */
+ toUpperCase: function(string) {
+ return string != null ? string.toUpperCase() : null;
+ }
+
+ });
+
+ var Utilities_1 = Utilities;
+
+ /**
+ * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.
+ *
+ * Although the option definitions are shared between targets, the values are maintained on the targets themselves.
+ *
+ * @param {Option[]} options - the options to be used
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var OptionManager = lite.extend(function(options) {
+ /**
+ * The available options for this {@link OptionManager}.
+ *
+ * @public
+ * @type {Object.<string, Option>}
+ * @memberof OptionManager#
+ */
+ this.options = {};
+
+ options.forEach(function(option) {
+ this.options[option.name] = option;
+ }, this);
+ }, {
+
+ /**
+ * Returns whether an option with the specified <code>name</code> is available.
+ *
+ * @param {string} name - the name of the {@link Option} whose existence is to be checked
+ * @return {boolean} <code>true</code> if an {@link Option} exists with <code>name</code>; otherwise
+ * <code>false</code>.
+ * @public
+ * @memberof OptionManager#
+ */
+ exists: function(name) {
+ return this.options[name] != null;
+ },
+
+ /**
+ * Returns the value of the option with the specified <code>name</code> on the <code>target</code> object provided.
+ *
+ * @param {string} name - the name of the {@link Option} whose value on <code>target</code> is to be returned
+ * @param {Object} target - the object from which the value of the named {@link Option} is to be returned
+ * @return {*} The value of the {@link Option} with <code>name</code> on <code>target</code>.
+ * @public
+ * @memberof OptionManager#
+ */
+ get: function(name, target) {
+ return OptionManager._get(this.options[name], target);
+ },
+
+ /**
+ * Returns a copy of all of the available options on the <code>target</code> object provided.
+ *
+ * @param {Object} target - the object from which the option name/value pairs are to be returned
+ * @return {Object.<string, *>} A hash containing the name/value pairs of all options on <code>target</code>.
+ * @public
+ * @memberof OptionManager#
+ */
+ getAll: function(target) {
+ var name;
+ var options = this.options;
+ var result = {};
+
+ for (name in options) {
+ if (Utilities_1.hasOwn(options, name)) {
+ result[name] = OptionManager._get(options[name], target);
+ }
+ }
+
+ return result;
+ },
+
+ /**
+ * Initializes the available options for the <code>target</code> object provided and then applies the initial values
+ * within the speciifed <code>options</code>.
+ *
+ * This method will throw an error if any of the names within <code>options</code> does not match an available option.
+ *
+ * This involves setting the default values and defining properties for all of the available options on
+ * <code>target</code> before finally calling {@link OptionMananger#setAll} with <code>options</code> and
+ * <code>target</code>. Any options that are configured to be modifiable will have a setter included in their defined
+ * property that will allow its corresponding value to be modified.
+ *
+ * If a change handler is specified, it will be called whenever the value changes on <code>target</code> for a
+ * modifiable option, but only when done so via the defined property's setter.
+ *
+ * @param {Object.<string, *>} options - the name/value pairs of the initial options to be set
+ * @param {Object} target - the object on which the options are to be initialized
+ * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on
+ * <code>target</code>
+ * @return {void}
+ * @throws {Error} If <code>options</code> contains an invalid option name.
+ * @public
+ * @memberof OptionManager#
+ */
+ init: function(options, target, changeHandler) {
+ if (typeof changeHandler !== 'function') {
+ changeHandler = Utilities_1.noop;
+ }
+
+ var name, option;
+
+ for (name in this.options) {
+ if (Utilities_1.hasOwn(this.options, name)) {
+ option = this.options[name];
+
+ OptionManager._set(option, option.defaultValue, target);
+ OptionManager._createAccessor(option, target, changeHandler);
+ }
+ }
+
+ this._setAll(options, target, true);
+ },
+
+ /**
+ * Sets the value of the option with the specified <code>name</code> on the <code>target</code> object provided to
+ * <code>value</code>.
+ *
+ * This method will throw an error if <code>name</code> does not match an available option or matches an option that
+ * cannot be modified.
+ *
+ * If <code>value</code> is <code>null</code> and the {@link Option} has a default value configured, then that default
+ * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to
+ * transform whichever value was determined to be used.
+ *
+ * This method returns whether the value of the underlying field on <code>target</code> was changed as a result.
+ *
+ * @param {string} name - the name of the {@link Option} whose value is to be set
+ * @param {*} value - the value to be set for the named {@link Option} on <code>target</code>
+ * @param {Object} target - the object on which <code>value</code> is to be set for the named {@link Option}
+ * @return {boolean} <code>true</code> if the underlying field on <code>target</code> was changed; otherwise
+ * <code>false</code>.
+ * @throws {Error} If <code>name</code> is invalid or is for an option that cannot be modified.
+ * @public
+ * @memberof OptionManager#
+ */
+ set: function(name, value, target) {
+ return this._set(name, value, target);
+ },
+
+ /**
+ * Sets all of the specified <code>options</code> on the <code>target</code> object provided to their corresponding
+ * values.
+ *
+ * This method will throw an error if any of the names within <code>options</code> does not match an available option
+ * or matches an option that cannot be modified.
+ *
+ * If any value within <code>options</code> is <code>null</code> and the corresponding {@link Option} has a default
+ * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer
+ * configured, it will be used to transform whichever value was determined to be used.
+ *
+ * This method returns whether the value for any of the underlying fields on <code>target</code> were changed as a
+ * result.
+ *
+ * @param {Object.<string, *>} options - the name/value pairs of options to be set
+ * @param {Object} target - the object on which the options are to be set
+ * @return {boolean} <code>true</code> if any of the underlying fields on <code>target</code> were changed; otherwise
+ * <code>false</code>.
+ * @throws {Error} If <code>options</code> contains an invalid option name or an option that cannot be modiifed.
+ * @public
+ * @memberof OptionManager#
+ */
+ setAll: function(options, target) {
+ return this._setAll(options, target);
+ },
+
+ _set: function(name, value, target, allowUnmodifiable) {
+ var option = this.options[name];
+ if (!option) {
+ throw new Error('Invalid option: ' + name);
+ }
+ if (!option.modifiable && !allowUnmodifiable) {
+ throw new Error('Option cannot be modified: ' + name);
+ }
+
+ return OptionManager._set(option, value, target);
+ },
+
+ _setAll: function(options, target, allowUnmodifiable) {
+ if (!options) {
+ return false;
+ }
+
+ var name;
+ var changed = false;
+
+ for (name in options) {
+ if (Utilities_1.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {
+ changed = true;
+ }
+ }
+
+ return changed;
+ }
+
+ }, {
+
+ _createAccessor: function(option, target, changeHandler) {
+ var descriptor = {
+ get: function() {
+ return OptionManager._get(option, target);
+ }
+ };
+
+ if (option.modifiable) {
+ descriptor.set = function(value) {
+ if (OptionManager._set(option, value, target)) {
+ changeHandler(value, option);
+ }
+ };
+ }
+
+ Object.defineProperty(target, option.name, descriptor);
+ },
+
+ _get: function(option, target) {
+ return target['_' + option.name];
+ },
+
+ _set: function(option, value, target) {
+ var fieldName = '_' + option.name;
+ var oldValue = target[fieldName];
+ var newValue = option.transform(value != null ? value : option.defaultValue);
+
+ target[fieldName] = newValue;
+
+ return newValue !== oldValue;
+ }
+
+ });
+
+ var OptionManager_1 = OptionManager;
+
+ /**
+ * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's
+ * setter.
+ *
+ * @callback OptionManager~ChangeHandler
+ * @param {*} value - the new value for <code>option</code> on the target object
+ * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.
+ * @return {void}
+ */
+
+ /**
+ * A basic manager for {@link Service} implementations that are mapped to simple names.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var ServiceManager = lite.extend(function() {
+ this._services = {};
+ }, {
+
+ /**
+ * Returns the {@link Service} being managed with the specified <code>name</code>.
+ *
+ * @param {string} name - the name of the {@link Service} to be returned
+ * @return {Service} The {@link Service} is being managed with <code>name</code>.
+ * @throws {Error} If no {@link Service} is being managed with <code>name</code>.
+ * @public
+ * @memberof ServiceManager#
+ */
+ getService: function(name) {
+ var service = this._services[name];
+ if (!service) {
+ throw new Error('Service is not being managed with name: ' + name);
+ }
+
+ return service;
+ },
+
+ /**
+ * Sets the {@link Service} implementation to be managed for the specified <code>name</code> to the
+ * <code>service</code> provided.
+ *
+ * @param {string} name - the name of the {@link Service} to be managed with <code>name</code>
+ * @param {Service} service - the {@link Service} implementation to be managed
+ * @return {void}
+ * @throws {Error} If a {@link Service} is already being managed with the same <code>name</code>.
+ * @public
+ * @memberof ServiceManager#
+ */
+ setService: function(name, service) {
+ if (this._services[name]) {
+ throw new Error('Service is already managed with name: ' + name);
+ }
+
+ if (service) {
+ this._services[name] = service;
+ }
+ }
+
+ });
+
+ var ServiceManager_1 = ServiceManager;
+
+ var optionManager = new OptionManager_1([
+ new Option_1('background', true, 'white'),
+ new Option_1('backgroundAlpha', true, 1, Utilities_1.abs),
+ new Option_1('element'),
+ new Option_1('foreground', true, 'black'),
+ new Option_1('foregroundAlpha', true, 1, Utilities_1.abs),
+ new Option_1('level', true, 'L', Utilities_1.toUpperCase),
+ new Option_1('mime', true, 'image/png'),
+ new Option_1('padding', true, null, Utilities_1.abs),
+ new Option_1('size', true, 100, Utilities_1.abs),
+ new Option_1('value', true, '')
+ ]);
+ var serviceManager = new ServiceManager_1();
+
+ /**
+ * Enables configuration of a QR code generator which uses HTML5 <code>canvas</code> for rendering.
+ *
+ * @param {QRious~Options} [options] - the options to be used
+ * @throws {Error} If any <code>options</code> are invalid.
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var QRious = lite.extend(function(options) {
+ optionManager.init(options, this, this.update.bind(this));
+
+ var element = optionManager.get('element', this);
+ var elementService = serviceManager.getService('element');
+ var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();
+ var image = element && elementService.isImage(element) ? element : elementService.createImage();
+
+ this._canvasRenderer = new CanvasRenderer_1(this, canvas, true);
+ this._imageRenderer = new ImageRenderer_1(this, image, image === element);
+
+ this.update();
+ }, {
+
+ /**
+ * Returns all of the options configured for this {@link QRious}.
+ *
+ * Any changes made to the returned object will not be reflected in the options themselves or their corresponding
+ * underlying fields.
+ *
+ * @return {Object.<string, *>} A copy of the applied options.
+ * @public
+ * @memberof QRious#
+ */
+ get: function() {
+ return optionManager.getAll(this);
+ },
+
+ /**
+ * Sets all of the specified <code>options</code> and automatically updates this {@link QRious} if any of the
+ * underlying fields are changed as a result.
+ *
+ * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between
+ * changes.
+ *
+ * @param {QRious~Options} options - the options to be set
+ * @return {void}
+ * @throws {Error} If any <code>options</code> are invalid or cannot be modified.
+ * @public
+ * @memberof QRious#
+ */
+ set: function(options) {
+ if (optionManager.setAll(options, this)) {
+ this.update();
+ }
+ },
+
+ /**
+ * Returns the image data URI for the generated QR code using the <code>mime</code> provided.
+ *
+ * @param {string} [mime] - the MIME type for the image
+ * @return {string} The image data URI for the QR code.
+ * @public
+ * @memberof QRious#
+ */
+ toDataURL: function(mime) {
+ return this.canvas.toDataURL(mime || this.mime);
+ },
+
+ /**
+ * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.
+ *
+ * @return {void}
+ * @protected
+ * @memberof QRious#
+ */
+ update: function() {
+ var frame = new Frame_1({
+ level: this.level,
+ value: this.value
+ });
+
+ this._canvasRenderer.render(frame);
+ this._imageRenderer.render(frame);
+ }
+
+ }, {
+
+ /**
+ * Configures the <code>service</code> provided to be used by all {@link QRious} instances.
+ *
+ * @param {Service} service - the {@link Service} to be configured
+ * @return {void}
+ * @throws {Error} If a {@link Service} has already been configured with the same name.
+ * @public
+ * @static
+ * @memberof QRious
+ */
+ use: function(service) {
+ serviceManager.setService(service.getName(), service);
+ }
+
+ });
+
+ Object.defineProperties(QRious.prototype, {
+
+ canvas: {
+ /**
+ * Returns the <code>canvas</code> element being used to render the QR code for this {@link QRious}.
+ *
+ * @return {*} The <code>canvas</code> element.
+ * @public
+ * @memberof QRious#
+ * @alias canvas
+ */
+ get: function() {
+ return this._canvasRenderer.getElement();
+ }
+ },
+
+ image: {
+ /**
+ * Returns the <code>img</code> element being used to render the QR code for this {@link QRious}.
+ *
+ * @return {*} The <code>img</code> element.
+ * @public
+ * @memberof QRious#
+ * @alias image
+ */
+ get: function() {
+ return this._imageRenderer.getElement();
+ }
+ }
+
+ });
+
+ var QRious_1$2 = QRious;
+
+ /**
+ * The options used by {@link QRious}.
+ *
+ * @typedef {Object} QRious~Options
+ * @property {string} [background="white"] - The background color to be applied to the QR code.
+ * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.
+ * @property {*} [element] - The element to be used to render the QR code which may either be an <code>canvas</code> or
+ * <code>img</code>. The element(s) will be created if needed.
+ * @property {string} [foreground="black"] - The foreground color to be applied to the QR code.
+ * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.
+ * @property {string} [level="L"] - The error correction level to be applied to the QR code.
+ * @property {string} [mime="image/png"] - The MIME type to be used to render the image for the QR code.
+ * @property {number} [padding] - The padding for the QR code in pixels.
+ * @property {number} [size=100] - The size of the QR code in pixels.
+ * @property {string} [value=""] - The value to be encoded within the QR code.
+ */
+
+ var index = QRious_1$2;
+
+ /**
+ * Defines a service contract that must be met by all implementations.
+ *
+ * @public
+ * @class
+ * @extends Nevis
+ */
+ var Service = lite.extend({
+
+ /**
+ * Returns the name of this {@link Service}.
+ *
+ * @return {string} The service name.
+ * @public
+ * @abstract
+ * @memberof Service#
+ */
+ getName: function() {}
+
+ });
+
+ var Service_1 = Service;
+
+ /**
+ * A service for working with elements.
+ *
+ * @public
+ * @class
+ * @extends Service
+ */
+ var ElementService = Service_1.extend({
+
+ /**
+ * Creates an instance of a canvas element.
+ *
+ * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.
+ *
+ * @return {*} The newly created canvas element.
+ * @public
+ * @abstract
+ * @memberof ElementService#
+ */
+ createCanvas: function() {},
+
+ /**
+ * Creates an instance of a image element.
+ *
+ * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.
+ *
+ * @return {*} The newly created image element.
+ * @public
+ * @abstract
+ * @memberof ElementService#
+ */
+ createImage: function() {},
+
+ /**
+ * @override
+ */
+ getName: function() {
+ return 'element';
+ },
+
+ /**
+ * Returns whether the specified <code>element</code> is a canvas.
+ *
+ * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.
+ *
+ * @param {*} element - the element to be checked
+ * @return {boolean} <code>true</code> if <code>element</code> is a canvas; otherwise <code>false</code>.
+ * @public
+ * @abstract
+ * @memberof ElementService#
+ */
+ isCanvas: function(element) {},
+
+ /**
+ * Returns whether the specified <code>element</code> is an image.
+ *
+ * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.
+ *
+ * @param {*} element - the element to be checked
+ * @return {boolean} <code>true</code> if <code>element</code> is an image; otherwise <code>false</code>.
+ * @public
+ * @abstract
+ * @memberof ElementService#
+ */
+ isImage: function(element) {}
+
+ });
+
+ var ElementService_1 = ElementService;
+
+ /**
+ * An implementation of {@link ElementService} intended for use within a browser environment.
+ *
+ * @public
+ * @class
+ * @extends ElementService
+ */
+ var BrowserElementService = ElementService_1.extend({
+
+ /**
+ * @override
+ */
+ createCanvas: function() {
+ return document.createElement('canvas');
+ },
+
+ /**
+ * @override
+ */
+ createImage: function() {
+ return document.createElement('img');
+ },
+
+ /**
+ * @override
+ */
+ isCanvas: function(element) {
+ return element instanceof HTMLCanvasElement;
+ },
+
+ /**
+ * @override
+ */
+ isImage: function(element) {
+ return element instanceof HTMLImageElement;
+ }
+
+ });
+
+ var BrowserElementService_1 = BrowserElementService;
+
+ index.use(new BrowserElementService_1());
+
+ var QRious_1 = index;
+
+ return QRious_1;
+
+})));
+
+//# sourceMappingURL=qrious.js.map \ No newline at end of file
diff --git a/static/dist/qrious@4.0.2/qrious.js.map b/static/dist/qrious@4.0.2/qrious.js.map
new file mode 100644
index 0000000..c1aaf2c
--- /dev/null
+++ b/static/dist/qrious@4.0.2/qrious.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"qrious.js","sources":["../node_modules/nevis/src/extend.js","../node_modules/nevis/src/nevis.js","../node_modules/nevis/lite.js","../node_modules/qrious-core/src/renderer/Renderer.js","../node_modules/qrious-core/src/renderer/CanvasRenderer.js","../node_modules/qrious-core/src/Alignment.js","../node_modules/qrious-core/src/ErrorCorrection.js","../node_modules/qrious-core/src/Galois.js","../node_modules/qrious-core/src/Version.js","../node_modules/qrious-core/src/Frame.js","../node_modules/qrious-core/src/renderer/ImageRenderer.js","../node_modules/qrious-core/src/option/Option.js","../node_modules/qrious-core/src/util/Utilities.js","../node_modules/qrious-core/src/option/OptionManager.js","../node_modules/qrious-core/src/service/ServiceManager.js","../node_modules/qrious-core/src/QRious.js","../node_modules/qrious-core/index.js","../node_modules/qrious-core/src/service/Service.js","../node_modules/qrious-core/src/service/element/ElementService.js","../src/service/element/BrowserElementService.js","../src/QRious.js"],"sourcesContent":["/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\n/**\n * A bare-bones constructor for surrogate prototype swapping.\n *\n * @private\n * @constructor\n */\nvar Constructor = /* istanbul ignore next */ function() {};\n/**\n * A reference to <code>Object.prototype.hasOwnProperty</code>.\n *\n * @private\n * @type {Function}\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * A reference to <code>Array.prototype.slice</code>.\n *\n * @private\n * @type {Function}\n */\nvar slice = Array.prototype.slice;\n\n/**\n * Creates an object which inherits the given <code>prototype</code>.\n *\n * Optionally, the created object can be extended further with the specified <code>properties</code>.\n *\n * @param {Object} prototype - the prototype to be inherited by the created object\n * @param {Object} [properties] - the optional properties to be extended by the created object\n * @return {Object} The newly created object.\n * @private\n */\nfunction createObject(prototype, properties) {\n var result;\n /* istanbul ignore next */\n if (typeof Object.create === 'function') {\n result = Object.create(prototype);\n } else {\n Constructor.prototype = prototype;\n result = new Constructor();\n Constructor.prototype = null;\n }\n\n if (properties) {\n extendObject(true, result, properties);\n }\n\n return result;\n}\n\n/**\n * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n * <code>statics</code> provided.\n *\n * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n *\n * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n * @public\n */\nfunction extend(name, constructor, prototype, statics) {\n var superConstructor = this;\n\n if (typeof name !== 'string') {\n statics = prototype;\n prototype = constructor;\n constructor = name;\n name = null;\n }\n\n if (typeof constructor !== 'function') {\n statics = prototype;\n prototype = constructor;\n constructor = function() {\n return superConstructor.apply(this, arguments);\n };\n }\n\n extendObject(false, constructor, superConstructor, statics);\n\n constructor.prototype = createObject(superConstructor.prototype, prototype);\n constructor.prototype.constructor = constructor;\n\n constructor.class_ = name || superConstructor.class_;\n constructor.super_ = superConstructor;\n\n return constructor;\n}\n\n/**\n * Extends the specified <code>target</code> object with the properties in each of the <code>sources</code> provided.\n *\n * if any source is <code>null</code> it will be ignored.\n *\n * @param {boolean} own - <code>true</code> to only copy <b>own</b> properties from <code>sources</code> onto\n * <code>target</code>; otherwise <code>false</code>\n * @param {Object} target - the target object which should be extended\n * @param {...Object} [sources] - the source objects whose properties are to be copied onto <code>target</code>\n * @return {void}\n * @private\n */\nfunction extendObject(own, target, sources) {\n sources = slice.call(arguments, 2);\n\n var property;\n var source;\n\n for (var i = 0, length = sources.length; i < length; i++) {\n source = sources[i];\n\n for (property in source) {\n if (!own || hasOwnProperty.call(source, property)) {\n target[property] = source[property];\n }\n }\n }\n}\n\nmodule.exports = extend;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nvar extend = require('./extend');\n\n/**\n * The base class from which all others should extend.\n *\n * @public\n * @constructor\n */\nfunction Nevis() {}\nNevis.class_ = 'Nevis';\nNevis.super_ = Object;\n\n/**\n * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n * <code>statics</code> provided.\n *\n * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n *\n * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n * @public\n * @static\n * @memberof Nevis\n */\nNevis.extend = extend;\n\nmodule.exports = Nevis;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nmodule.exports = require('./src/nevis');\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Responsible for rendering a QR code {@link Frame} on a specific type of element.\n *\n * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.\n *\n * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element\n * from the renderer will result in it being immediately enabled and the element being rendered.\n *\n * @param {QRious} qrious - the {@link QRious} instance to be used\n * @param {*} element - the element onto which the QR code is to be rendered\n * @param {boolean} [enabled] - <code>true</code> this {@link Renderer} is enabled; otherwise <code>false</code>.\n * @public\n * @class\n * @extends Nevis\n */\nvar Renderer = Nevis.extend(function(qrious, element, enabled) {\n /**\n * The {@link QRious} instance.\n *\n * @protected\n * @type {QRious}\n * @memberof Renderer#\n */\n this.qrious = qrious;\n\n /**\n * The element onto which this {@link Renderer} is rendering the QR code.\n *\n * @protected\n * @type {*}\n * @memberof Renderer#\n */\n this.element = element;\n this.element.qrious = qrious;\n\n /**\n * Whether this {@link Renderer} is enabled.\n *\n * @protected\n * @type {boolean}\n * @memberof Renderer#\n */\n this.enabled = Boolean(enabled);\n}, {\n\n /**\n * Draws the specified QR code <code>frame</code> on the underlying element.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @param {Frame} frame - the {@link Frame} to be drawn\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n draw: function(frame) {},\n\n /**\n * Returns the element onto which this {@link Renderer} is rendering the QR code.\n *\n * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered\n * before the element is returned.\n *\n * @return {*} The element.\n * @public\n * @memberof Renderer#\n */\n getElement: function() {\n if (!this.enabled) {\n this.enabled = true;\n this.render();\n }\n\n return this.element;\n },\n\n /**\n * Calculates the size (in pixel units) to represent an individual module within the QR code based on the\n * <code>frame</code> provided.\n *\n * Any configured padding will be excluded from the returned size.\n *\n * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.\n * This is done so that the inevitable clipping is handled more gracefully since this way at least something is\n * displayed instead of just a blank space filled by the background color.\n *\n * @param {Frame} frame - the {@link Frame} from which the module size is to be derived\n * @return {number} The pixel size for each module in the QR code which will be no less than one.\n * @protected\n * @memberof Renderer#\n */\n getModuleSize: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding || 0;\n var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);\n\n return Math.max(1, pixels);\n },\n\n /**\n * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the <code>frame</code>\n * provided.\n *\n * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its\n * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally\n * and it is not clipped from all directions.\n *\n * @param {Frame} frame - the {@link Frame} from which the offset is to be derived\n * @return {number} The pixel offset for the QR code which will be no less than zero.\n * @protected\n * @memberof Renderer#\n */\n getOffset: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding;\n\n if (padding != null) {\n return padding;\n }\n\n var moduleSize = this.getModuleSize(frame);\n var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);\n\n return Math.max(0, offset);\n },\n\n /**\n * Renders a QR code on the underlying element based on the <code>frame</code> provided.\n *\n * @param {Frame} frame - the {@link Frame} to be rendered\n * @return {void}\n * @public\n * @memberof Renderer#\n */\n render: function(frame) {\n if (this.enabled) {\n this.resize();\n this.reset();\n this.draw(frame);\n }\n },\n\n /**\n * Resets the underlying element, effectively clearing any previously rendered QR code.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n reset: function() {},\n\n /**\n * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n resize: function() {}\n\n});\n\nmodule.exports = Renderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with <code>canvas</code> elements.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar CanvasRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function(frame) {\n var i, j;\n var qrious = this.qrious;\n var moduleSize = this.getModuleSize(frame);\n var offset = this.getOffset(frame);\n var context = this.element.getContext('2d');\n\n context.fillStyle = qrious.foreground;\n context.globalAlpha = qrious.foregroundAlpha;\n\n for (i = 0; i < frame.width; i++) {\n for (j = 0; j < frame.width; j++) {\n if (frame.buffer[(j * frame.width) + i]) {\n context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);\n }\n }\n }\n },\n\n /**\n * @override\n */\n reset: function() {\n var qrious = this.qrious;\n var context = this.element.getContext('2d');\n var size = qrious.size;\n\n context.lineWidth = 1;\n context.clearRect(0, 0, size, size);\n context.fillStyle = qrious.background;\n context.globalAlpha = qrious.backgroundAlpha;\n context.fillRect(0, 0, size, size);\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = CanvasRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains alignment pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Alignment = Nevis.extend(null, {\n\n /**\n * The alignment pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Alignment\n */\n BLOCK: [\n 0, 11, 15, 19, 23, 27, 31,\n 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n ]\n\n});\n\nmodule.exports = Alignment;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains error correction information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ErrorCorrection = Nevis.extend(null, {\n\n /**\n * The error correction blocks.\n *\n * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally\n * the ECC width.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n BLOCKS: [\n 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,\n 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,\n 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,\n 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,\n 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,\n 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,\n 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,\n 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,\n 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,\n 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,\n 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,\n 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,\n 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,\n 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,\n 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,\n 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,\n 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,\n 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,\n 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,\n 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,\n 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,\n 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,\n 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,\n 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,\n 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,\n 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,\n 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,\n 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,\n 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,\n 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,\n 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,\n 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,\n 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,\n 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,\n 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,\n 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,\n 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,\n 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,\n 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,\n 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30\n ],\n\n /**\n * The final format bits with mask (level << 3 | mask).\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n FINAL_FORMAT: [\n // L\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n // M\n 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,\n // Q\n 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,\n // H\n 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b\n ],\n\n /**\n * A map of human-readable ECC levels.\n *\n * @public\n * @static\n * @type {Object.<string, number>}\n * @memberof ErrorCorrection\n */\n LEVELS: {\n L: 1,\n M: 2,\n Q: 3,\n H: 4\n }\n\n});\n\nmodule.exports = ErrorCorrection;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains Galois field information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Galois = Nevis.extend(null, {\n\n /**\n * The Galois field exponent table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n EXPONENT: [\n 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n ],\n\n /**\n * The Galois field log table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n LOG: [\n 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n ]\n\n});\n\nmodule.exports = Galois;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains version pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Version = Nevis.extend(null, {\n\n /**\n * The version pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Version\n */\n BLOCK: [\n 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,\n 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,\n 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69\n ]\n\n});\n\nmodule.exports = Version;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Alignment = require('./Alignment');\nvar ErrorCorrection = require('./ErrorCorrection');\nvar Galois = require('./Galois');\nvar Version = require('./Version');\n\n/**\n * Generates information for a QR code frame based on a specific value to be encoded.\n *\n * @param {Frame~Options} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Frame = Nevis.extend(function(options) {\n var dataBlock, eccBlock, index, neccBlock1, neccBlock2;\n var valueLength = options.value.length;\n\n this._badness = [];\n this._level = ErrorCorrection.LEVELS[options.level];\n this._polynomial = [];\n this._value = options.value;\n this._version = 0;\n this._stringBuffer = [];\n\n while (this._version < 40) {\n this._version++;\n\n index = ((this._level - 1) * 4) + ((this._version - 1) * 16);\n\n neccBlock1 = ErrorCorrection.BLOCKS[index++];\n neccBlock2 = ErrorCorrection.BLOCKS[index++];\n dataBlock = ErrorCorrection.BLOCKS[index++];\n eccBlock = ErrorCorrection.BLOCKS[index];\n\n index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);\n\n if (valueLength <= index) {\n break;\n }\n }\n\n this._dataBlock = dataBlock;\n this._eccBlock = eccBlock;\n this._neccBlock1 = neccBlock1;\n this._neccBlock2 = neccBlock2;\n\n /**\n * The data width is based on version.\n *\n * @public\n * @type {number}\n * @memberof Frame#\n */\n // FIXME: Ensure that it fits instead of being truncated.\n var width = this.width = 17 + (4 * this._version);\n\n /**\n * The image buffer.\n *\n * @public\n * @type {number[]}\n * @memberof Frame#\n */\n this.buffer = Frame._createArray(width * width);\n\n this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);\n this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);\n\n this._insertFinders();\n this._insertAlignments();\n\n // Insert single foreground cell.\n this.buffer[8 + (width * (width - 8))] = 1;\n\n this._insertTimingGap();\n this._reverseMask();\n this._insertTimingRowAndColumn();\n this._insertVersion();\n this._syncMask();\n this._convertBitStream(valueLength);\n this._calculatePolynomial();\n this._appendEccToData();\n this._interleaveBlocks();\n this._pack();\n this._finish();\n}, {\n\n _addAlignment: function(x, y) {\n var i;\n var buffer = this.buffer;\n var width = this.width;\n\n buffer[x + (width * y)] = 1;\n\n for (i = -2; i < 2; i++) {\n buffer[x + i + (width * (y - 2))] = 1;\n buffer[x - 2 + (width * (y + i + 1))] = 1;\n buffer[x + 2 + (width * (y + i))] = 1;\n buffer[x + i + 1 + (width * (y + 2))] = 1;\n }\n\n for (i = 0; i < 2; i++) {\n this._setMask(x - 1, y + i);\n this._setMask(x + 1, y - i);\n this._setMask(x - i, y - 1);\n this._setMask(x + i, y + 1);\n }\n },\n\n _appendData: function(data, dataLength, ecc, eccLength) {\n var bit, i, j;\n var polynomial = this._polynomial;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < eccLength; i++) {\n stringBuffer[ecc + i] = 0;\n }\n\n for (i = 0; i < dataLength; i++) {\n bit = Galois.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];\n\n if (bit !== 255) {\n for (j = 1; j < eccLength; j++) {\n stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^\n Galois.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];\n }\n } else {\n for (j = ecc; j < ecc + eccLength; j++) {\n stringBuffer[j] = stringBuffer[j + 1];\n }\n }\n\n stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois.EXPONENT[Frame._modN(bit + polynomial[0])];\n }\n },\n\n _appendEccToData: function() {\n var i;\n var data = 0;\n var dataBlock = this._dataBlock;\n var ecc = this._calculateMaxLength();\n var eccBlock = this._eccBlock;\n\n for (i = 0; i < this._neccBlock1; i++) {\n this._appendData(data, dataBlock, ecc, eccBlock);\n\n data += dataBlock;\n ecc += eccBlock;\n }\n\n for (i = 0; i < this._neccBlock2; i++) {\n this._appendData(data, dataBlock + 1, ecc, eccBlock);\n\n data += dataBlock + 1;\n ecc += eccBlock;\n }\n },\n\n _applyMask: function(mask) {\n var r3x, r3y, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n switch (mask) {\n case 0:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!((x + y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 1:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!(y & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 2:\n for (y = 0; y < width; y++) {\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 3:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 4:\n for (y = 0; y < width; y++) {\n for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n r3y = !r3y;\n }\n\n if (!r3y && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 5:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 6:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 7:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n }\n },\n\n _calculateMaxLength: function() {\n return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n },\n\n _calculatePolynomial: function() {\n var i, j;\n var eccBlock = this._eccBlock;\n var polynomial = this._polynomial;\n\n polynomial[0] = 1;\n\n for (i = 0; i < eccBlock; i++) {\n polynomial[i + 1] = 1;\n\n for (j = i; j > 0; j--) {\n polynomial[j] = polynomial[j] ? polynomial[j - 1] ^\n Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[j]] + i)] : polynomial[j - 1];\n }\n\n polynomial[0] = Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[0]] + i)];\n }\n\n // Use logs for generator polynomial to save calculation step.\n for (i = 0; i <= eccBlock; i++) {\n polynomial[i] = Galois.LOG[polynomial[i]];\n }\n },\n\n _checkBadness: function() {\n var b, b1, h, x, y;\n var bad = 0;\n var badness = this._badness;\n var buffer = this.buffer;\n var width = this.width;\n\n // Blocks of same colour.\n for (y = 0; y < width - 1; y++) {\n for (x = 0; x < width - 1; x++) {\n // All foreground colour.\n if ((buffer[x + (width * y)] &&\n buffer[x + 1 + (width * y)] &&\n buffer[x + (width * (y + 1))] &&\n buffer[x + 1 + (width * (y + 1))]) ||\n // All background colour.\n !(buffer[x + (width * y)] ||\n buffer[x + 1 + (width * y)] ||\n buffer[x + (width * (y + 1))] ||\n buffer[x + 1 + (width * (y + 1))])) {\n bad += Frame.N2;\n }\n }\n }\n\n var bw = 0;\n\n // X runs.\n for (y = 0; y < width; y++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, x = 0; x < width; x++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n bw += b ? 1 : -1;\n }\n\n bad += this._getBadness(h);\n }\n\n if (bw < 0) {\n bw = -bw;\n }\n\n var count = 0;\n var big = bw;\n big += big << 2;\n big <<= 1;\n\n while (big > width * width) {\n big -= width * width;\n count++;\n }\n\n bad += count * Frame.N4;\n\n // Y runs.\n for (x = 0; x < width; x++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, y = 0; y < width; y++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n }\n\n bad += this._getBadness(h);\n }\n\n return bad;\n },\n\n _convertBitStream: function(length) {\n var bit, i;\n var ecc = this._ecc;\n var version = this._version;\n\n // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).\n for (i = 0; i < length; i++) {\n ecc[i] = this._value.charCodeAt(i);\n }\n\n var stringBuffer = this._stringBuffer = ecc.slice();\n var maxLength = this._calculateMaxLength();\n\n if (length >= maxLength - 2) {\n length = maxLength - 2;\n\n if (version > 9) {\n length--;\n }\n }\n\n // Shift and re-pack to insert length prefix.\n var index = length;\n\n if (version > 9) {\n stringBuffer[index + 2] = 0;\n stringBuffer[index + 3] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 3] |= 255 & (bit << 4);\n stringBuffer[index + 2] = bit >> 4;\n }\n\n stringBuffer[2] |= 255 & (length << 4);\n stringBuffer[1] = length >> 4;\n stringBuffer[0] = 0x40 | (length >> 12);\n } else {\n stringBuffer[index + 1] = 0;\n stringBuffer[index + 2] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 2] |= 255 & (bit << 4);\n stringBuffer[index + 1] = bit >> 4;\n }\n\n stringBuffer[1] |= 255 & (length << 4);\n stringBuffer[0] = 0x40 | (length >> 4);\n }\n\n // Fill to end with pad pattern.\n index = length + 3 - (version < 10);\n\n while (index < maxLength) {\n stringBuffer[index++] = 0xec;\n stringBuffer[index++] = 0x11;\n }\n },\n\n _getBadness: function(length) {\n var i;\n var badRuns = 0;\n var badness = this._badness;\n\n for (i = 0; i <= length; i++) {\n if (badness[i] >= 5) {\n badRuns += Frame.N1 + badness[i] - 5;\n }\n }\n\n // FBFFFBF as in finder.\n for (i = 3; i < length - 1; i += 2) {\n if (badness[i - 2] === badness[i + 2] &&\n badness[i + 2] === badness[i - 1] &&\n badness[i - 1] === badness[i + 1] &&\n badness[i - 1] * 3 === badness[i] &&\n // Background around the foreground pattern? Not part of the specs.\n (badness[i - 3] === 0 || i + 3 > length ||\n badness[i - 3] * 3 >= badness[i] * 4 ||\n badness[i + 3] * 3 >= badness[i] * 4)) {\n badRuns += Frame.N3;\n }\n }\n\n return badRuns;\n },\n\n _finish: function() {\n // Save pre-mask copy of frame.\n this._stringBuffer = this.buffer.slice();\n\n var currentMask, i;\n var bit = 0;\n var mask = 30000;\n\n /*\n * Using for instead of while since in original Arduino code if an early mask was \"good enough\" it wouldn't try for\n * a better one since they get more complex and take longer.\n */\n for (i = 0; i < 8; i++) {\n // Returns foreground-background imbalance.\n this._applyMask(i);\n\n currentMask = this._checkBadness();\n\n // Is current mask better than previous best?\n if (currentMask < mask) {\n mask = currentMask;\n bit = i;\n }\n\n // Don't increment \"i\" to a void redoing mask.\n if (bit === 7) {\n break;\n }\n\n // Reset for next pass.\n this.buffer = this._stringBuffer.slice();\n }\n\n // Redo best mask as none were \"good enough\" (i.e. last wasn't bit).\n if (bit !== i) {\n this._applyMask(bit);\n }\n\n // Add in final mask/ECC level bytes.\n mask = ErrorCorrection.FINAL_FORMAT[bit + (this._level - 1 << 3)];\n\n var buffer = this.buffer;\n var width = this.width;\n\n // Low byte.\n for (i = 0; i < 8; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[width - 1 - i + (width * 8)] = 1;\n\n if (i < 6) {\n buffer[8 + (width * i)] = 1;\n } else {\n buffer[8 + (width * (i + 1))] = 1;\n }\n }\n }\n\n // High byte.\n for (i = 0; i < 7; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[8 + (width * (width - 7 + i))] = 1;\n\n if (i) {\n buffer[6 - i + (width * 8)] = 1;\n } else {\n buffer[7 + (width * 8)] = 1;\n }\n }\n }\n },\n\n _interleaveBlocks: function() {\n var i, j;\n var dataBlock = this._dataBlock;\n var ecc = this._ecc;\n var eccBlock = this._eccBlock;\n var k = 0;\n var maxLength = this._calculateMaxLength();\n var neccBlock1 = this._neccBlock1;\n var neccBlock2 = this._neccBlock2;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < dataBlock; i++) {\n for (j = 0; j < neccBlock1; j++) {\n ecc[k++] = stringBuffer[i + (j * dataBlock)];\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n\n for (i = 0; i < eccBlock; i++) {\n for (j = 0; j < neccBlock1 + neccBlock2; j++) {\n ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];\n }\n }\n\n this._stringBuffer = ecc;\n },\n\n _insertAlignments: function() {\n var i, x, y;\n var version = this._version;\n var width = this.width;\n\n if (version > 1) {\n i = Alignment.BLOCK[version];\n y = width - 7;\n\n for (;;) {\n x = width - 7;\n\n while (x > i - 3) {\n this._addAlignment(x, y);\n\n if (x < i) {\n break;\n }\n\n x -= i;\n }\n\n if (y <= i + 9) {\n break;\n }\n\n y -= i;\n\n this._addAlignment(6, y);\n this._addAlignment(y, 6);\n }\n }\n },\n\n _insertFinders: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n for (i = 0; i < 3; i++) {\n j = 0;\n y = 0;\n\n if (i === 1) {\n j = width - 7;\n }\n if (i === 2) {\n y = width - 7;\n }\n\n buffer[y + 3 + (width * (j + 3))] = 1;\n\n for (x = 0; x < 6; x++) {\n buffer[y + x + (width * j)] = 1;\n buffer[y + (width * (j + x + 1))] = 1;\n buffer[y + 6 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 6))] = 1;\n }\n\n for (x = 1; x < 5; x++) {\n this._setMask(y + x, j + 1);\n this._setMask(y + 1, j + x + 1);\n this._setMask(y + 5, j + x);\n this._setMask(y + x + 1, j + 5);\n }\n\n for (x = 2; x < 4; x++) {\n buffer[y + x + (width * (j + 2))] = 1;\n buffer[y + 2 + (width * (j + x + 1))] = 1;\n buffer[y + 4 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 4))] = 1;\n }\n }\n },\n\n _insertTimingGap: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < 7; y++) {\n this._setMask(7, y);\n this._setMask(width - 8, y);\n this._setMask(7, y + width - 7);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x, 7);\n this._setMask(x + width - 8, 7);\n this._setMask(x, width - 8);\n }\n },\n\n _insertTimingRowAndColumn: function() {\n var x;\n var buffer = this.buffer;\n var width = this.width;\n\n for (x = 0; x < width - 14; x++) {\n if (x & 1) {\n this._setMask(8 + x, 6);\n this._setMask(6, 8 + x);\n } else {\n buffer[8 + x + (width * 6)] = 1;\n buffer[6 + (width * (8 + x))] = 1;\n }\n }\n },\n\n _insertVersion: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var version = this._version;\n var width = this.width;\n\n if (version > 6) {\n i = Version.BLOCK[version - 7];\n j = 17;\n\n for (x = 0; x < 6; x++) {\n for (y = 0; y < 3; y++, j--) {\n if (1 & (j > 11 ? version >> j - 12 : i >> j)) {\n buffer[5 - x + (width * (2 - y + width - 11))] = 1;\n buffer[2 - y + width - 11 + (width * (5 - x))] = 1;\n } else {\n this._setMask(5 - x, 2 - y + width - 11);\n this._setMask(2 - y + width - 11, 5 - x);\n }\n }\n }\n }\n },\n\n _isMasked: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n return this._mask[bit] === 1;\n },\n\n _pack: function() {\n var bit, i, j;\n var k = 1;\n var v = 1;\n var width = this.width;\n var x = width - 1;\n var y = width - 1;\n\n // Interleaved data and ECC codes.\n var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n\n for (i = 0; i < length; i++) {\n bit = this._stringBuffer[i];\n\n for (j = 0; j < 8; j++, bit <<= 1) {\n if (0x80 & bit) {\n this.buffer[x + (width * y)] = 1;\n }\n\n // Find next fill position.\n do {\n if (v) {\n x--;\n } else {\n x++;\n\n if (k) {\n if (y !== 0) {\n y--;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y = 9;\n }\n }\n } else if (y !== width - 1) {\n y++;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y -= 8;\n }\n }\n }\n\n v = !v;\n } while (this._isMasked(x, y));\n }\n }\n },\n\n _reverseMask: function() {\n var x, y;\n var width = this.width;\n\n for (x = 0; x < 9; x++) {\n this._setMask(x, 8);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x + width - 8, 8);\n this._setMask(8, x);\n }\n\n for (y = 0; y < 7; y++) {\n this._setMask(8, y + width - 7);\n }\n },\n\n _setMask: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n this._mask[bit] = 1;\n },\n\n _syncMask: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < width; y++) {\n for (x = 0; x <= y; x++) {\n if (this.buffer[x + (width * y)]) {\n this._setMask(x, y);\n }\n }\n }\n }\n\n}, {\n\n _createArray: function(length) {\n var i;\n var array = [];\n\n for (i = 0; i < length; i++) {\n array[i] = 0;\n }\n\n return array;\n },\n\n _getMaskBit: function(x, y) {\n var bit;\n\n if (x > y) {\n bit = x;\n x = y;\n y = bit;\n }\n\n bit = y;\n bit += y * y;\n bit >>= 1;\n bit += x;\n\n return bit;\n },\n\n _modN: function(x) {\n while (x >= 255) {\n x -= 255;\n x = (x >> 8) + (x & 255);\n }\n\n return x;\n },\n\n // *Badness* coefficients.\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n\n});\n\nmodule.exports = Frame;\n\n/**\n * The options used by {@link Frame}.\n *\n * @typedef {Object} Frame~Options\n * @property {string} level - The ECC level to be used.\n * @property {string} value - The value to be encoded.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with <code>img</code> elements.\n *\n * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from\n * the rendered <code>canvas</code> element as the <code>src</code> for the <code>img</code> element being rendered.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar ImageRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function() {\n this.element.src = this.qrious.toDataURL();\n },\n\n /**\n * @override\n */\n reset: function() {\n this.element.src = '';\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = ImageRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines an available option while also configuring how values are applied to the target object.\n *\n * Optionally, a default value can be specified as well a value transformer for greater control over how the option\n * value is applied.\n *\n * If no value transformer is specified, then any specified option will be applied directly. All values are maintained\n * on the target object itself as a field using the option name prefixed with a single underscore.\n *\n * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the\n * property that is defined on the target object that uses the option name.\n *\n * @param {string} name - the name to be used\n * @param {boolean} [modifiable] - <code>true</code> if the property defined on target objects should include a setter;\n * otherwise <code>false</code>\n * @param {*} [defaultValue] - the default value to be used\n * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Option = Nevis.extend(function(name, modifiable, defaultValue, valueTransformer) {\n /**\n * The name for this {@link Option}.\n *\n * @public\n * @type {string}\n * @memberof Option#\n */\n this.name = name;\n\n /**\n * Whether a setter should be included on the property defined on target objects for this {@link Option}.\n *\n * @public\n * @type {boolean}\n * @memberof Option#\n */\n this.modifiable = Boolean(modifiable);\n\n /**\n * The default value for this {@link Option}.\n *\n * @public\n * @type {*}\n * @memberof Option#\n */\n this.defaultValue = defaultValue;\n\n this._valueTransformer = valueTransformer;\n}, {\n\n /**\n * Transforms the specified <code>value</code> so that it can be applied for this {@link Option}.\n *\n * If a value transformer has been specified for this {@link Option}, it will be called upon to transform\n * <code>value</code>. Otherwise, <code>value</code> will be returned directly.\n *\n * @param {*} value - the value to be transformed\n * @return {*} The transformed value or <code>value</code> if no value transformer is specified.\n * @public\n * @memberof Option#\n */\n transform: function(value) {\n var transformer = this._valueTransformer;\n if (typeof transformer === 'function') {\n return transformer(value, this);\n }\n\n return value;\n }\n\n});\n\nmodule.exports = Option;\n\n/**\n * Returns a transformed value for the specified <code>value</code> to be applied for the <code>option</code> provided.\n *\n * @callback Option~ValueTransformer\n * @param {*} value - the value to be transformed\n * @param {Option} option - the {@link Option} for which <code>value</code> is being transformed\n * @return {*} The transform value.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains utility methods that are useful throughout the library.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Utilities = Nevis.extend(null, {\n\n /**\n * Returns the absolute value of a given number.\n *\n * This method is simply a convenient shorthand for <code>Math.abs</code> while ensuring that nulls are returned as\n * <code>null</code> instead of zero.\n *\n * @param {number} value - the number whose absolute value is to be returned\n * @return {number} The absolute value of <code>value</code> or <code>null</code> if <code>value</code> is\n * <code>null</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n abs: function(value) {\n return value != null ? Math.abs(value) : null;\n },\n\n /**\n * Returns whether the specified <code>object</code> has a property with the specified <code>name</code> as an own\n * (not inherited) property.\n *\n * @param {Object} object - the object on which the property is to be checked\n * @param {string} name - the name of the property to be checked\n * @return {boolean} <code>true</code> if <code>object</code> has an own property with <code>name</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n hasOwn: function(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n },\n\n /**\n * A non-operation method that does absolutely nothing.\n *\n * @return {void}\n * @public\n * @static\n * @memberof Utilities\n */\n noop: function() {},\n\n /**\n * Transforms the specified <code>string</code> to upper case while remaining null-safe.\n *\n * @param {string} string - the string to be transformed to upper case\n * @return {string} <code>string</code> transformed to upper case if <code>string</code> is not <code>null</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n toUpperCase: function(string) {\n return string != null ? string.toUpperCase() : null;\n }\n\n});\n\nmodule.exports = Utilities;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Utilities = require('../util/Utilities');\n\n/**\n * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.\n *\n * Although the option definitions are shared between targets, the values are maintained on the targets themselves.\n *\n * @param {Option[]} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar OptionManager = Nevis.extend(function(options) {\n /**\n * The available options for this {@link OptionManager}.\n *\n * @public\n * @type {Object.<string, Option>}\n * @memberof OptionManager#\n */\n this.options = {};\n\n options.forEach(function(option) {\n this.options[option.name] = option;\n }, this);\n}, {\n\n /**\n * Returns whether an option with the specified <code>name</code> is available.\n *\n * @param {string} name - the name of the {@link Option} whose existence is to be checked\n * @return {boolean} <code>true</code> if an {@link Option} exists with <code>name</code>; otherwise\n * <code>false</code>.\n * @public\n * @memberof OptionManager#\n */\n exists: function(name) {\n return this.options[name] != null;\n },\n\n /**\n * Returns the value of the option with the specified <code>name</code> on the <code>target</code> object provided.\n *\n * @param {string} name - the name of the {@link Option} whose value on <code>target</code> is to be returned\n * @param {Object} target - the object from which the value of the named {@link Option} is to be returned\n * @return {*} The value of the {@link Option} with <code>name</code> on <code>target</code>.\n * @public\n * @memberof OptionManager#\n */\n get: function(name, target) {\n return OptionManager._get(this.options[name], target);\n },\n\n /**\n * Returns a copy of all of the available options on the <code>target</code> object provided.\n *\n * @param {Object} target - the object from which the option name/value pairs are to be returned\n * @return {Object.<string, *>} A hash containing the name/value pairs of all options on <code>target</code>.\n * @public\n * @memberof OptionManager#\n */\n getAll: function(target) {\n var name;\n var options = this.options;\n var result = {};\n\n for (name in options) {\n if (Utilities.hasOwn(options, name)) {\n result[name] = OptionManager._get(options[name], target);\n }\n }\n\n return result;\n },\n\n /**\n * Initializes the available options for the <code>target</code> object provided and then applies the initial values\n * within the speciifed <code>options</code>.\n *\n * This method will throw an error if any of the names within <code>options</code> does not match an available option.\n *\n * This involves setting the default values and defining properties for all of the available options on\n * <code>target</code> before finally calling {@link OptionMananger#setAll} with <code>options</code> and\n * <code>target</code>. Any options that are configured to be modifiable will have a setter included in their defined\n * property that will allow its corresponding value to be modified.\n *\n * If a change handler is specified, it will be called whenever the value changes on <code>target</code> for a\n * modifiable option, but only when done so via the defined property's setter.\n *\n * @param {Object.<string, *>} options - the name/value pairs of the initial options to be set\n * @param {Object} target - the object on which the options are to be initialized\n * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on\n * <code>target</code>\n * @return {void}\n * @throws {Error} If <code>options</code> contains an invalid option name.\n * @public\n * @memberof OptionManager#\n */\n init: function(options, target, changeHandler) {\n if (typeof changeHandler !== 'function') {\n changeHandler = Utilities.noop;\n }\n\n var name, option;\n\n for (name in this.options) {\n if (Utilities.hasOwn(this.options, name)) {\n option = this.options[name];\n\n OptionManager._set(option, option.defaultValue, target);\n OptionManager._createAccessor(option, target, changeHandler);\n }\n }\n\n this._setAll(options, target, true);\n },\n\n /**\n * Sets the value of the option with the specified <code>name</code> on the <code>target</code> object provided to\n * <code>value</code>.\n *\n * This method will throw an error if <code>name</code> does not match an available option or matches an option that\n * cannot be modified.\n *\n * If <code>value</code> is <code>null</code> and the {@link Option} has a default value configured, then that default\n * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to\n * transform whichever value was determined to be used.\n *\n * This method returns whether the value of the underlying field on <code>target</code> was changed as a result.\n *\n * @param {string} name - the name of the {@link Option} whose value is to be set\n * @param {*} value - the value to be set for the named {@link Option} on <code>target</code>\n * @param {Object} target - the object on which <code>value</code> is to be set for the named {@link Option}\n * @return {boolean} <code>true</code> if the underlying field on <code>target</code> was changed; otherwise\n * <code>false</code>.\n * @throws {Error} If <code>name</code> is invalid or is for an option that cannot be modified.\n * @public\n * @memberof OptionManager#\n */\n set: function(name, value, target) {\n return this._set(name, value, target);\n },\n\n /**\n * Sets all of the specified <code>options</code> on the <code>target</code> object provided to their corresponding\n * values.\n *\n * This method will throw an error if any of the names within <code>options</code> does not match an available option\n * or matches an option that cannot be modified.\n *\n * If any value within <code>options</code> is <code>null</code> and the corresponding {@link Option} has a default\n * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer\n * configured, it will be used to transform whichever value was determined to be used.\n *\n * This method returns whether the value for any of the underlying fields on <code>target</code> were changed as a\n * result.\n *\n * @param {Object.<string, *>} options - the name/value pairs of options to be set\n * @param {Object} target - the object on which the options are to be set\n * @return {boolean} <code>true</code> if any of the underlying fields on <code>target</code> were changed; otherwise\n * <code>false</code>.\n * @throws {Error} If <code>options</code> contains an invalid option name or an option that cannot be modiifed.\n * @public\n * @memberof OptionManager#\n */\n setAll: function(options, target) {\n return this._setAll(options, target);\n },\n\n _set: function(name, value, target, allowUnmodifiable) {\n var option = this.options[name];\n if (!option) {\n throw new Error('Invalid option: ' + name);\n }\n if (!option.modifiable && !allowUnmodifiable) {\n throw new Error('Option cannot be modified: ' + name);\n }\n\n return OptionManager._set(option, value, target);\n },\n\n _setAll: function(options, target, allowUnmodifiable) {\n if (!options) {\n return false;\n }\n\n var name;\n var changed = false;\n\n for (name in options) {\n if (Utilities.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {\n changed = true;\n }\n }\n\n return changed;\n }\n\n}, {\n\n _createAccessor: function(option, target, changeHandler) {\n var descriptor = {\n get: function() {\n return OptionManager._get(option, target);\n }\n };\n\n if (option.modifiable) {\n descriptor.set = function(value) {\n if (OptionManager._set(option, value, target)) {\n changeHandler(value, option);\n }\n };\n }\n\n Object.defineProperty(target, option.name, descriptor);\n },\n\n _get: function(option, target) {\n return target['_' + option.name];\n },\n\n _set: function(option, value, target) {\n var fieldName = '_' + option.name;\n var oldValue = target[fieldName];\n var newValue = option.transform(value != null ? value : option.defaultValue);\n\n target[fieldName] = newValue;\n\n return newValue !== oldValue;\n }\n\n});\n\nmodule.exports = OptionManager;\n\n/**\n * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's\n * setter.\n *\n * @callback OptionManager~ChangeHandler\n * @param {*} value - the new value for <code>option</code> on the target object\n * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.\n * @return {void}\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * A basic manager for {@link Service} implementations that are mapped to simple names.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ServiceManager = Nevis.extend(function() {\n this._services = {};\n}, {\n\n /**\n * Returns the {@link Service} being managed with the specified <code>name</code>.\n *\n * @param {string} name - the name of the {@link Service} to be returned\n * @return {Service} The {@link Service} is being managed with <code>name</code>.\n * @throws {Error} If no {@link Service} is being managed with <code>name</code>.\n * @public\n * @memberof ServiceManager#\n */\n getService: function(name) {\n var service = this._services[name];\n if (!service) {\n throw new Error('Service is not being managed with name: ' + name);\n }\n\n return service;\n },\n\n /**\n * Sets the {@link Service} implementation to be managed for the specified <code>name</code> to the\n * <code>service</code> provided.\n *\n * @param {string} name - the name of the {@link Service} to be managed with <code>name</code>\n * @param {Service} service - the {@link Service} implementation to be managed\n * @return {void}\n * @throws {Error} If a {@link Service} is already being managed with the same <code>name</code>.\n * @public\n * @memberof ServiceManager#\n */\n setService: function(name, service) {\n if (this._services[name]) {\n throw new Error('Service is already managed with name: ' + name);\n }\n\n if (service) {\n this._services[name] = service;\n }\n }\n\n});\n\nmodule.exports = ServiceManager;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar CanvasRenderer = require('./renderer/CanvasRenderer');\nvar Frame = require('./Frame');\nvar ImageRenderer = require('./renderer/ImageRenderer');\nvar Option = require('./option/Option');\nvar OptionManager = require('./option/OptionManager');\nvar ServiceManager = require('./service/ServiceManager');\nvar Utilities = require('./util/Utilities');\n\nvar optionManager = new OptionManager([\n new Option('background', true, 'white'),\n new Option('backgroundAlpha', true, 1, Utilities.abs),\n new Option('element'),\n new Option('foreground', true, 'black'),\n new Option('foregroundAlpha', true, 1, Utilities.abs),\n new Option('level', true, 'L', Utilities.toUpperCase),\n new Option('mime', true, 'image/png'),\n new Option('padding', true, null, Utilities.abs),\n new Option('size', true, 100, Utilities.abs),\n new Option('value', true, '')\n]);\nvar serviceManager = new ServiceManager();\n\n/**\n * Enables configuration of a QR code generator which uses HTML5 <code>canvas</code> for rendering.\n *\n * @param {QRious~Options} [options] - the options to be used\n * @throws {Error} If any <code>options</code> are invalid.\n * @public\n * @class\n * @extends Nevis\n */\nvar QRious = Nevis.extend(function(options) {\n optionManager.init(options, this, this.update.bind(this));\n\n var element = optionManager.get('element', this);\n var elementService = serviceManager.getService('element');\n var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();\n var image = element && elementService.isImage(element) ? element : elementService.createImage();\n\n this._canvasRenderer = new CanvasRenderer(this, canvas, true);\n this._imageRenderer = new ImageRenderer(this, image, image === element);\n\n this.update();\n}, {\n\n /**\n * Returns all of the options configured for this {@link QRious}.\n *\n * Any changes made to the returned object will not be reflected in the options themselves or their corresponding\n * underlying fields.\n *\n * @return {Object.<string, *>} A copy of the applied options.\n * @public\n * @memberof QRious#\n */\n get: function() {\n return optionManager.getAll(this);\n },\n\n /**\n * Sets all of the specified <code>options</code> and automatically updates this {@link QRious} if any of the\n * underlying fields are changed as a result.\n *\n * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between\n * changes.\n *\n * @param {QRious~Options} options - the options to be set\n * @return {void}\n * @throws {Error} If any <code>options</code> are invalid or cannot be modified.\n * @public\n * @memberof QRious#\n */\n set: function(options) {\n if (optionManager.setAll(options, this)) {\n this.update();\n }\n },\n\n /**\n * Returns the image data URI for the generated QR code using the <code>mime</code> provided.\n *\n * @param {string} [mime] - the MIME type for the image\n * @return {string} The image data URI for the QR code.\n * @public\n * @memberof QRious#\n */\n toDataURL: function(mime) {\n return this.canvas.toDataURL(mime || this.mime);\n },\n\n /**\n * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.\n *\n * @return {void}\n * @protected\n * @memberof QRious#\n */\n update: function() {\n var frame = new Frame({\n level: this.level,\n value: this.value\n });\n\n this._canvasRenderer.render(frame);\n this._imageRenderer.render(frame);\n }\n\n}, {\n\n /**\n * Configures the <code>service</code> provided to be used by all {@link QRious} instances.\n *\n * @param {Service} service - the {@link Service} to be configured\n * @return {void}\n * @throws {Error} If a {@link Service} has already been configured with the same name.\n * @public\n * @static\n * @memberof QRious\n */\n use: function(service) {\n serviceManager.setService(service.getName(), service);\n }\n\n});\n\nObject.defineProperties(QRious.prototype, {\n\n canvas: {\n /**\n * Returns the <code>canvas</code> element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The <code>canvas</code> element.\n * @public\n * @memberof QRious#\n * @alias canvas\n */\n get: function() {\n return this._canvasRenderer.getElement();\n }\n },\n\n image: {\n /**\n * Returns the <code>img</code> element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The <code>img</code> element.\n * @public\n * @memberof QRious#\n * @alias image\n */\n get: function() {\n return this._imageRenderer.getElement();\n }\n }\n\n});\n\nmodule.exports = QRious;\n\n/**\n * The options used by {@link QRious}.\n *\n * @typedef {Object} QRious~Options\n * @property {string} [background=\"white\"] - The background color to be applied to the QR code.\n * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.\n * @property {*} [element] - The element to be used to render the QR code which may either be an <code>canvas</code> or\n * <code>img</code>. The element(s) will be created if needed.\n * @property {string} [foreground=\"black\"] - The foreground color to be applied to the QR code.\n * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.\n * @property {string} [level=\"L\"] - The error correction level to be applied to the QR code.\n * @property {string} [mime=\"image/png\"] - The MIME type to be used to render the image for the QR code.\n * @property {number} [padding] - The padding for the QR code in pixels.\n * @property {number} [size=100] - The size of the QR code in pixels.\n * @property {string} [value=\"\"] - The value to be encoded within the QR code.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nmodule.exports = require('./src/QRious');\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines a service contract that must be met by all implementations.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Service = Nevis.extend({\n\n /**\n * Returns the name of this {@link Service}.\n *\n * @return {string} The service name.\n * @public\n * @abstract\n * @memberof Service#\n */\n getName: function() {}\n\n});\n\nmodule.exports = Service;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Service = require('../Service');\n\n/**\n * A service for working with elements.\n *\n * @public\n * @class\n * @extends Service\n */\nvar ElementService = Service.extend({\n\n /**\n * Creates an instance of a canvas element.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @return {*} The newly created canvas element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createCanvas: function() {},\n\n /**\n * Creates an instance of a image element.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @return {*} The newly created image element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createImage: function() {},\n\n /**\n * @override\n */\n getName: function() {\n return 'element';\n },\n\n /**\n * Returns whether the specified <code>element</code> is a canvas.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} <code>true</code> if <code>element</code> is a canvas; otherwise <code>false</code>.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isCanvas: function(element) {},\n\n /**\n * Returns whether the specified <code>element</code> is an image.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} <code>true</code> if <code>element</code> is an image; otherwise <code>false</code>.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isImage: function(element) {}\n\n});\n\nmodule.exports = ElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar ElementService = require('qrious-core/src/service/element/ElementService');\n\n/**\n * An implementation of {@link ElementService} intended for use within a browser environment.\n *\n * @public\n * @class\n * @extends ElementService\n */\nvar BrowserElementService = ElementService.extend({\n\n /**\n * @override\n */\n createCanvas: function() {\n return document.createElement('canvas');\n },\n\n /**\n * @override\n */\n createImage: function() {\n return document.createElement('img');\n },\n\n /**\n * @override\n */\n isCanvas: function(element) {\n return element instanceof HTMLCanvasElement;\n },\n\n /**\n * @override\n */\n isImage: function(element) {\n return element instanceof HTMLImageElement;\n }\n\n});\n\nmodule.exports = BrowserElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar QRious = require('qrious-core');\n\nvar BrowserElementService = require('./service/element/BrowserElementService');\n\nQRious.use(new BrowserElementService());\n\nmodule.exports = QRious;\n"],"names":["extend","require$$0","Nevis","Renderer","ErrorCorrection","Galois","Alignment","Version","Utilities","OptionManager","Option","ServiceManager","CanvasRenderer","ImageRenderer","Frame","Service","ElementService","QRious","BrowserElementService"],"mappings":"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C,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;KAC5E;;;;;;;;;;IAUD,YAAY,EAAE;;MAEZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;KAC/D;;;;;;;;;;IAUD,MAAM,EAAE;MACN,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;KACL;;GAEF,CAAC,CAAC;;AAEH,uBAAc,GAAG,eAAe,CAAC;;;;;;;;;AC9FjC,MAAI,MAAM,GAAGA,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE;;;;;;;;;;IAU9B,QAAQ,EAAE;MACR,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KAC/F;;;;;;;;;;IAUD,GAAG,EAAE;MACH,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI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"} \ No newline at end of file
diff --git a/static/dist/qrious@4.0.2/qrious.min.js b/static/dist/qrious@4.0.2/qrious.min.js
new file mode 100644
index 0000000..5735ea6
--- /dev/null
+++ b/static/dist/qrious@4.0.2/qrious.min.js
@@ -0,0 +1,6 @@
+/*! QRious v4.0.2 | (C) 2017 Alasdair Mercer | GPL v3 License
+Based on jsqrencode | (C) 2010 tz@execpc.com | GPL v3 License
+*/
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.QRious=e()}(this,function(){"use strict";function t(t,e){var n;return"function"==typeof Object.create?n=Object.create(t):(s.prototype=t,n=new s,s.prototype=null),e&&i(!0,n,e),n}function e(e,n,s,r){var o=this;return"string"!=typeof e&&(r=s,s=n,n=e,e=null),"function"!=typeof n&&(r=s,s=n,n=function(){return o.apply(this,arguments)}),i(!1,n,o,r),n.prototype=t(o.prototype,s),n.prototype.constructor=n,n.class_=e||o.class_,n.super_=o,n}function i(t,e,i){for(var n,s,a=0,h=(i=o.call(arguments,2)).length;a<h;a++){s=i[a];for(n in s)t&&!r.call(s,n)||(e[n]=s[n])}}function n(){}var s=function(){},r=Object.prototype.hasOwnProperty,o=Array.prototype.slice,a=e;n.class_="Nevis",n.super_=Object,n.extend=a;var h=n,f=h.extend(function(t,e,i){this.qrious=t,this.element=e,this.element.qrious=t,this.enabled=Boolean(i)},{draw:function(t){},getElement:function(){return this.enabled||(this.enabled=!0,this.render()),this.element},getModuleSize:function(t){var e=this.qrious,i=e.padding||0,n=Math.floor((e.size-2*i)/t.width);return Math.max(1,n)},getOffset:function(t){var e=this.qrious,i=e.padding;if(null!=i)return i;var n=this.getModuleSize(t),s=Math.floor((e.size-n*t.width)/2);return Math.max(0,s)},render:function(t){this.enabled&&(this.resize(),this.reset(),this.draw(t))},reset:function(){},resize:function(){}}),c=f.extend({draw:function(t){var e,i,n=this.qrious,s=this.getModuleSize(t),r=this.getOffset(t),o=this.element.getContext("2d");for(o.fillStyle=n.foreground,o.globalAlpha=n.foregroundAlpha,e=0;e<t.width;e++)for(i=0;i<t.width;i++)t.buffer[i*t.width+e]&&o.fillRect(s*e+r,s*i+r,s,s)},reset:function(){var t=this.qrious,e=this.element.getContext("2d"),i=t.size;e.lineWidth=1,e.clearRect(0,0,i,i),e.fillStyle=t.background,e.globalAlpha=t.backgroundAlpha,e.fillRect(0,0,i,i)},resize:function(){var t=this.element;t.width=t.height=this.qrious.size}}),u=h.extend(null,{BLOCK:[0,11,15,19,23,27,31,16,18,20,22,24,26,28,20,22,24,24,26,28,28,22,24,24,26,26,28,28,24,24,26,26,26,28,28,24,26,26,26,28,28]}),l=h.extend(null,{BLOCKS:[1,0,19,7,1,0,16,10,1,0,13,13,1,0,9,17,1,0,34,10,1,0,28,16,1,0,22,22,1,0,16,28,1,0,55,15,1,0,44,26,2,0,17,18,2,0,13,22,1,0,80,20,2,0,32,18,2,0,24,26,4,0,9,16,1,0,108,26,2,0,43,24,2,2,15,18,2,2,11,22,2,0,68,18,4,0,27,16,4,0,19,24,4,0,15,28,2,0,78,20,4,0,31,18,2,4,14,18,4,1,13,26,2,0,97,24,2,2,38,22,4,2,18,22,4,2,14,26,2,0,116,30,3,2,36,22,4,4,16,20,4,4,12,24,2,2,68,18,4,1,43,26,6,2,19,24,6,2,15,28,4,0,81,20,1,4,50,30,4,4,22,28,3,8,12,24,2,2,92,24,6,2,36,22,4,6,20,26,7,4,14,28,4,0,107,26,8,1,37,22,8,4,20,24,12,4,11,22,3,1,115,30,4,5,40,24,11,5,16,20,11,5,12,24,5,1,87,22,5,5,41,24,5,7,24,30,11,7,12,24,5,1,98,24,7,3,45,28,15,2,19,24,3,13,15,30,1,5,107,28,10,1,46,28,1,15,22,28,2,17,14,28,5,1,120,30,9,4,43,26,17,1,22,28,2,19,14,28,3,4,113,28,3,11,44,26,17,4,21,26,9,16,13,26,3,5,107,28,3,13,41,26,15,5,24,30,15,10,15,28,4,4,116,28,17,0,42,26,17,6,22,28,19,6,16,30,2,7,111,28,17,0,46,28,7,16,24,30,34,0,13,24,4,5,121,30,4,14,47,28,11,14,24,30,16,14,15,30,6,4,117,30,6,14,45,28,11,16,24,30,30,2,16,30,8,4,106,26,8,13,47,28,7,22,24,30,22,13,15,30,10,2,114,28,19,4,46,28,28,6,22,28,33,4,16,30,8,4,122,30,22,3,45,28,8,26,23,30,12,28,15,30,3,10,117,30,3,23,45,28,4,31,24,30,11,31,15,30,7,7,116,30,21,7,45,28,1,37,23,30,19,26,15,30,5,10,115,30,19,10,47,28,15,25,24,30,23,25,15,30,13,3,115,30,2,29,46,28,42,1,24,30,23,28,15,30,17,0,115,30,10,23,46,28,10,35,24,30,19,35,15,30,17,1,115,30,14,21,46,28,29,19,24,30,11,46,15,30,13,6,115,30,14,23,46,28,44,7,24,30,59,1,16,30,12,7,121,30,12,26,47,28,39,14,24,30,22,41,15,30,6,14,121,30,6,34,47,28,46,10,24,30,2,64,15,30,17,4,122,30,29,14,46,28,49,10,24,30,24,46,15,30,4,18,122,30,13,32,46,28,48,14,24,30,42,32,15,30,20,4,117,30,40,7,47,28,43,22,24,30,10,67,15,30,19,6,118,30,18,31,47,28,34,34,24,30,20,61,15,30],FINAL_FORMAT:[30660,29427,32170,30877,26159,25368,27713,26998,21522,20773,24188,23371,17913,16590,20375,19104,13663,12392,16177,14854,9396,8579,11994,11245,5769,5054,7399,6608,1890,597,3340,2107],LEVELS:{L:1,M:2,Q:3,H:4}}),_=h.extend(null,{EXPONENT:[1,2,4,8,16,32,64,128,29,58,116,232,205,135,19,38,76,152,45,90,180,117,234,201,143,3,6,12,24,48,96,192,157,39,78,156,37,74,148,53,106,212,181,119,238,193,159,35,70,140,5,10,20,40,80,160,93,186,105,210,185,111,222,161,95,190,97,194,153,47,94,188,101,202,137,15,30,60,120,240,253,231,211,187,107,214,177,127,254,225,223,163,91,182,113,226,217,175,67,134,17,34,68,136,13,26,52,104,208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,102,204,133,23,46,92,184,109,218,169,79,158,33,66,132,21,42,84,168,77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,191,99,198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,98,196,149,55,110,220,165,87,174,65,130,25,50,100,200,141,7,14,28,56,112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,88,176,125,250,233,207,131,27,54,108,216,173,71,142,0],LOG:[255,0,1,25,2,50,26,198,3,223,51,238,27,104,199,75,4,100,224,14,52,141,239,129,28,193,105,248,200,8,76,113,5,138,101,47,225,36,15,33,53,147,142,218,240,18,130,69,29,181,194,125,106,39,249,185,201,154,9,120,77,228,114,166,6,191,139,98,102,221,48,253,226,152,37,179,16,145,34,136,54,208,148,206,143,150,219,189,241,210,19,92,131,56,70,64,30,66,182,163,195,72,126,110,107,58,40,84,250,133,186,61,202,94,155,159,10,21,121,43,78,212,229,172,115,243,167,87,7,112,192,247,140,128,99,13,103,74,222,237,49,197,254,24,227,165,153,119,38,184,180,124,17,68,146,217,35,32,137,46,55,63,209,91,149,188,207,205,144,135,151,178,220,252,190,97,242,86,211,171,20,42,93,158,132,60,57,83,71,109,65,162,31,45,67,216,183,123,164,118,196,23,73,236,127,12,111,246,108,161,59,82,41,157,85,170,251,96,134,177,187,204,62,90,203,89,95,176,156,169,160,81,11,245,22,235,122,117,44,215,79,174,213,233,230,231,173,232,116,214,244,234,168,80,88,175]}),d=h.extend(null,{BLOCK:[3220,1468,2713,1235,3062,1890,2119,1549,2344,2936,1117,2583,1330,2470,1667,2249,2028,3780,481,4011,142,3098,831,3445,592,2517,1776,2234,1951,2827,1070,2660,1345,3177]}),v=h.extend(function(t){var e,i,n,s,r,o=t.value.length;for(this._badness=[],this._level=l.LEVELS[t.level],this._polynomial=[],this._value=t.value,this._version=0,this._stringBuffer=[];this._version<40&&(this._version++,n=4*(this._level-1)+16*(this._version-1),s=l.BLOCKS[n++],r=l.BLOCKS[n++],e=l.BLOCKS[n++],i=l.BLOCKS[n],n=e*(s+r)+r-3+(this._version<=9),!(o<=n)););this._dataBlock=e,this._eccBlock=i,this._neccBlock1=s,this._neccBlock2=r;var a=this.width=17+4*this._version;this.buffer=v._createArray(a*a),this._ecc=v._createArray(e+(e+i)*(s+r)+r),this._mask=v._createArray((a*(a+1)+1)/2),this._insertFinders(),this._insertAlignments(),this.buffer[8+a*(a-8)]=1,this._insertTimingGap(),this._reverseMask(),this._insertTimingRowAndColumn(),this._insertVersion(),this._syncMask(),this._convertBitStream(o),this._calculatePolynomial(),this._appendEccToData(),this._interleaveBlocks(),this._pack(),this._finish()},{_addAlignment:function(t,e){var i,n=this.buffer,s=this.width;for(n[t+s*e]=1,i=-2;i<2;i++)n[t+i+s*(e-2)]=1,n[t-2+s*(e+i+1)]=1,n[t+2+s*(e+i)]=1,n[t+i+1+s*(e+2)]=1;for(i=0;i<2;i++)this._setMask(t-1,e+i),this._setMask(t+1,e-i),this._setMask(t-i,e-1),this._setMask(t+i,e+1)},_appendData:function(t,e,i,n){var s,r,o,a=this._polynomial,h=this._stringBuffer;for(r=0;r<n;r++)h[i+r]=0;for(r=0;r<e;r++){if(255!==(s=_.LOG[h[t+r]^h[i]]))for(o=1;o<n;o++)h[i+o-1]=h[i+o]^_.EXPONENT[v._modN(s+a[n-o])];else for(o=i;o<i+n;o++)h[o]=h[o+1];h[i+n-1]=255===s?0:_.EXPONENT[v._modN(s+a[0])]}},_appendEccToData:function(){var t,e=0,i=this._dataBlock,n=this._calculateMaxLength(),s=this._eccBlock;for(t=0;t<this._neccBlock1;t++)this._appendData(e,i,n,s),e+=i,n+=s;for(t=0;t<this._neccBlock2;t++)this._appendData(e,i+1,n,s),e+=i+1,n+=s},_applyMask:function(t){var e,i,n,s,r=this.buffer,o=this.width;switch(t){case 0:for(s=0;s<o;s++)for(n=0;n<o;n++)n+s&1||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 1:for(s=0;s<o;s++)for(n=0;n<o;n++)1&s||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 2:for(s=0;s<o;s++)for(e=0,n=0;n<o;n++,e++)3===e&&(e=0),e||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 3:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=i,n=0;n<o;n++,e++)3===e&&(e=0),e||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 4:for(s=0;s<o;s++)for(e=0,i=s>>1&1,n=0;n<o;n++,e++)3===e&&(e=0,i=!i),i||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 5:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(n&s&1)+!(!e|!i)||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 6:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(n&s&1)+(e&&e===i)&1||this._isMasked(n,s)||(r[n+s*o]^=1);break;case 7:for(i=0,s=0;s<o;s++,i++)for(3===i&&(i=0),e=0,n=0;n<o;n++,e++)3===e&&(e=0),(e&&e===i)+(n+s&1)&1||this._isMasked(n,s)||(r[n+s*o]^=1)}},_calculateMaxLength:function(){return this._dataBlock*(this._neccBlock1+this._neccBlock2)+this._neccBlock2},_calculatePolynomial:function(){var t,e,i=this._eccBlock,n=this._polynomial;for(n[0]=1,t=0;t<i;t++){for(n[t+1]=1,e=t;e>0;e--)n[e]=n[e]?n[e-1]^_.EXPONENT[v._modN(_.LOG[n[e]]+t)]:n[e-1];n[0]=_.EXPONENT[v._modN(_.LOG[n[0]]+t)]}for(t=0;t<=i;t++)n[t]=_.LOG[n[t]]},_checkBadness:function(){var t,e,i,n,s,r=0,o=this._badness,a=this.buffer,h=this.width;for(s=0;s<h-1;s++)for(n=0;n<h-1;n++)(a[n+h*s]&&a[n+1+h*s]&&a[n+h*(s+1)]&&a[n+1+h*(s+1)]||!(a[n+h*s]||a[n+1+h*s]||a[n+h*(s+1)]||a[n+1+h*(s+1)]))&&(r+=v.N2);var f=0;for(s=0;s<h;s++){for(i=0,o[0]=0,t=0,n=0;n<h;n++)t===(e=a[n+h*s])?o[i]++:o[++i]=1,f+=(t=e)?1:-1;r+=this._getBadness(i)}f<0&&(f=-f);var c=0,u=f;for(u+=u<<2,u<<=1;u>h*h;)u-=h*h,c++;for(r+=c*v.N4,n=0;n<h;n++){for(i=0,o[0]=0,t=0,s=0;s<h;s++)t===(e=a[n+h*s])?o[i]++:o[++i]=1,t=e;r+=this._getBadness(i)}return r},_convertBitStream:function(t){var e,i,n=this._ecc,s=this._version;for(i=0;i<t;i++)n[i]=this._value.charCodeAt(i);var r=this._stringBuffer=n.slice(),o=this._calculateMaxLength();t>=o-2&&(t=o-2,s>9&&t--);var a=t;if(s>9){for(r[a+2]=0,r[a+3]=0;a--;)e=r[a],r[a+3]|=255&e<<4,r[a+2]=e>>4;r[2]|=255&t<<4,r[1]=t>>4,r[0]=64|t>>12}else{for(r[a+1]=0,r[a+2]=0;a--;)e=r[a],r[a+2]|=255&e<<4,r[a+1]=e>>4;r[1]|=255&t<<4,r[0]=64|t>>4}for(a=t+3-(s<10);a<o;)r[a++]=236,r[a++]=17},_getBadness:function(t){var e,i=0,n=this._badness;for(e=0;e<=t;e++)n[e]>=5&&(i+=v.N1+n[e]-5);for(e=3;e<t-1;e+=2)n[e-2]===n[e+2]&&n[e+2]===n[e-1]&&n[e-1]===n[e+1]&&3*n[e-1]===n[e]&&(0===n[e-3]||e+3>t||3*n[e-3]>=4*n[e]||3*n[e+3]>=4*n[e])&&(i+=v.N3);return i},_finish:function(){this._stringBuffer=this.buffer.slice();var t,e,i=0,n=3e4;for(e=0;e<8&&(this._applyMask(e),(t=this._checkBadness())<n&&(n=t,i=e),7!==i);e++)this.buffer=this._stringBuffer.slice();i!==e&&this._applyMask(i),n=l.FINAL_FORMAT[i+(this._level-1<<3)];var s=this.buffer,r=this.width;for(e=0;e<8;e++,n>>=1)1&n&&(s[r-1-e+8*r]=1,e<6?s[8+r*e]=1:s[8+r*(e+1)]=1);for(e=0;e<7;e++,n>>=1)1&n&&(s[8+r*(r-7+e)]=1,e?s[6-e+8*r]=1:s[7+8*r]=1)},_interleaveBlocks:function(){var t,e,i=this._dataBlock,n=this._ecc,s=this._eccBlock,r=0,o=this._calculateMaxLength(),a=this._neccBlock1,h=this._neccBlock2,f=this._stringBuffer;for(t=0;t<i;t++){for(e=0;e<a;e++)n[r++]=f[t+e*i];for(e=0;e<h;e++)n[r++]=f[a*i+t+e*(i+1)]}for(e=0;e<h;e++)n[r++]=f[a*i+t+e*(i+1)];for(t=0;t<s;t++)for(e=0;e<a+h;e++)n[r++]=f[o+t+e*s];this._stringBuffer=n},_insertAlignments:function(){var t,e,i,n=this._version,s=this.width;if(n>1)for(t=u.BLOCK[n],i=s-7;;){for(e=s-7;e>t-3&&(this._addAlignment(e,i),!(e<t));)e-=t;if(i<=t+9)break;i-=t,this._addAlignment(6,i),this._addAlignment(i,6)}},_insertFinders:function(){var t,e,i,n,s=this.buffer,r=this.width;for(t=0;t<3;t++){for(e=0,n=0,1===t&&(e=r-7),2===t&&(n=r-7),s[n+3+r*(e+3)]=1,i=0;i<6;i++)s[n+i+r*e]=1,s[n+r*(e+i+1)]=1,s[n+6+r*(e+i)]=1,s[n+i+1+r*(e+6)]=1;for(i=1;i<5;i++)this._setMask(n+i,e+1),this._setMask(n+1,e+i+1),this._setMask(n+5,e+i),this._setMask(n+i+1,e+5);for(i=2;i<4;i++)s[n+i+r*(e+2)]=1,s[n+2+r*(e+i+1)]=1,s[n+4+r*(e+i)]=1,s[n+i+1+r*(e+4)]=1}},_insertTimingGap:function(){var t,e,i=this.width;for(e=0;e<7;e++)this._setMask(7,e),this._setMask(i-8,e),this._setMask(7,e+i-7);for(t=0;t<8;t++)this._setMask(t,7),this._setMask(t+i-8,7),this._setMask(t,i-8)},_insertTimingRowAndColumn:function(){var t,e=this.buffer,i=this.width;for(t=0;t<i-14;t++)1&t?(this._setMask(8+t,6),this._setMask(6,8+t)):(e[8+t+6*i]=1,e[6+i*(8+t)]=1)},_insertVersion:function(){var t,e,i,n,s=this.buffer,r=this._version,o=this.width;if(r>6)for(t=d.BLOCK[r-7],e=17,i=0;i<6;i++)for(n=0;n<3;n++,e--)1&(e>11?r>>e-12:t>>e)?(s[5-i+o*(2-n+o-11)]=1,s[2-n+o-11+o*(5-i)]=1):(this._setMask(5-i,2-n+o-11),this._setMask(2-n+o-11,5-i))},_isMasked:function(t,e){var i=v._getMaskBit(t,e);return 1===this._mask[i]},_pack:function(){var t,e,i,n=1,s=1,r=this.width,o=r-1,a=r-1,h=(this._dataBlock+this._eccBlock)*(this._neccBlock1+this._neccBlock2)+this._neccBlock2;for(e=0;e<h;e++)for(t=this._stringBuffer[e],i=0;i<8;i++,t<<=1){128&t&&(this.buffer[o+r*a]=1);do{s?o--:(o++,n?0!==a?a--:(n=!n,6===(o-=2)&&(o--,a=9)):a!==r-1?a++:(n=!n,6===(o-=2)&&(o--,a-=8))),s=!s}while(this._isMasked(o,a))}},_reverseMask:function(){var t,e,i=this.width;for(t=0;t<9;t++)this._setMask(t,8);for(t=0;t<8;t++)this._setMask(t+i-8,8),this._setMask(8,t);for(e=0;e<7;e++)this._setMask(8,e+i-7)},_setMask:function(t,e){var i=v._getMaskBit(t,e);this._mask[i]=1},_syncMask:function(){var t,e,i=this.width;for(e=0;e<i;e++)for(t=0;t<=e;t++)this.buffer[t+i*e]&&this._setMask(t,e)}},{_createArray:function(t){var e,i=[];for(e=0;e<t;e++)i[e]=0;return i},_getMaskBit:function(t,e){var i;return t>e&&(i=t,t=e,e=i),i=e,i+=e*e,i>>=1,i+=t},_modN:function(t){for(;t>=255;)t=((t-=255)>>8)+(255&t);return t},N1:3,N2:3,N3:40,N4:10}),p=v,m=f.extend({draw:function(){this.element.src=this.qrious.toDataURL()},reset:function(){this.element.src=""},resize:function(){var t=this.element;t.width=t.height=this.qrious.size}}),g=h.extend(function(t,e,i,n){this.name=t,this.modifiable=Boolean(e),this.defaultValue=i,this._valueTransformer=n},{transform:function(t){var e=this._valueTransformer;return"function"==typeof e?e(t,this):t}}),k=h.extend(null,{abs:function(t){return null!=t?Math.abs(t):null},hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},noop:function(){},toUpperCase:function(t){return null!=t?t.toUpperCase():null}}),w=h.extend(function(t){this.options={},t.forEach(function(t){this.options[t.name]=t},this)},{exists:function(t){return null!=this.options[t]},get:function(t,e){return w._get(this.options[t],e)},getAll:function(t){var e,i=this.options,n={};for(e in i)k.hasOwn(i,e)&&(n[e]=w._get(i[e],t));return n},init:function(t,e,i){"function"!=typeof i&&(i=k.noop);var n,s;for(n in this.options)k.hasOwn(this.options,n)&&(s=this.options[n],w._set(s,s.defaultValue,e),w._createAccessor(s,e,i));this._setAll(t,e,!0)},set:function(t,e,i){return this._set(t,e,i)},setAll:function(t,e){return this._setAll(t,e)},_set:function(t,e,i,n){var s=this.options[t];if(!s)throw new Error("Invalid option: "+t);if(!s.modifiable&&!n)throw new Error("Option cannot be modified: "+t);return w._set(s,e,i)},_setAll:function(t,e,i){if(!t)return!1;var n,s=!1;for(n in t)k.hasOwn(t,n)&&this._set(n,t[n],e,i)&&(s=!0);return s}},{_createAccessor:function(t,e,i){var n={get:function(){return w._get(t,e)}};t.modifiable&&(n.set=function(n){w._set(t,n,e)&&i(n,t)}),Object.defineProperty(e,t.name,n)},_get:function(t,e){return e["_"+t.name]},_set:function(t,e,i){var n="_"+t.name,s=i[n],r=t.transform(null!=e?e:t.defaultValue);return i[n]=r,r!==s}}),M=w,b=h.extend(function(){this._services={}},{getService:function(t){var e=this._services[t];if(!e)throw new Error("Service is not being managed with name: "+t);return e},setService:function(t,e){if(this._services[t])throw new Error("Service is already managed with name: "+t);e&&(this._services[t]=e)}}),B=new M([new g("background",!0,"white"),new g("backgroundAlpha",!0,1,k.abs),new g("element"),new g("foreground",!0,"black"),new g("foregroundAlpha",!0,1,k.abs),new g("level",!0,"L",k.toUpperCase),new g("mime",!0,"image/png"),new g("padding",!0,null,k.abs),new g("size",!0,100,k.abs),new g("value",!0,"")]),y=new b,O=h.extend(function(t){B.init(t,this,this.update.bind(this));var e=B.get("element",this),i=y.getService("element"),n=e&&i.isCanvas(e)?e:i.createCanvas(),s=e&&i.isImage(e)?e:i.createImage();this._canvasRenderer=new c(this,n,!0),this._imageRenderer=new m(this,s,s===e),this.update()},{get:function(){return B.getAll(this)},set:function(t){B.setAll(t,this)&&this.update()},toDataURL:function(t){return this.canvas.toDataURL(t||this.mime)},update:function(){var t=new p({level:this.level,value:this.value});this._canvasRenderer.render(t),this._imageRenderer.render(t)}},{use:function(t){y.setService(t.getName(),t)}});Object.defineProperties(O.prototype,{canvas:{get:function(){return this._canvasRenderer.getElement()}},image:{get:function(){return this._imageRenderer.getElement()}}});var A=O,L=h.extend({getName:function(){}}).extend({createCanvas:function(){},createImage:function(){},getName:function(){return"element"},isCanvas:function(t){},isImage:function(t){}}).extend({createCanvas:function(){return document.createElement("canvas")},createImage:function(){return document.createElement("img")},isCanvas:function(t){return t instanceof HTMLCanvasElement},isImage:function(t){return t instanceof HTMLImageElement}});return A.use(new L),A});
+
+//# sourceMappingURL=qrious.min.js.map \ No newline at end of file
diff --git a/static/dist/qrious@4.0.2/qrious.min.js.map b/static/dist/qrious@4.0.2/qrious.min.js.map
new file mode 100644
index 0000000..ff65e0b
--- /dev/null
+++ b/static/dist/qrious@4.0.2/qrious.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"qrious.min.js","sources":["../node_modules/nevis/src/extend.js","../node_modules/nevis/src/nevis.js","../node_modules/qrious-core/src/renderer/Renderer.js","../node_modules/qrious-core/src/renderer/CanvasRenderer.js","../node_modules/qrious-core/src/Alignment.js","../node_modules/qrious-core/src/ErrorCorrection.js","../node_modules/qrious-core/src/Galois.js","../node_modules/qrious-core/src/Version.js","../node_modules/qrious-core/src/Frame.js","../node_modules/qrious-core/src/renderer/ImageRenderer.js","../node_modules/qrious-core/src/option/Option.js","../node_modules/qrious-core/src/util/Utilities.js","../node_modules/qrious-core/src/option/OptionManager.js","../node_modules/qrious-core/src/service/ServiceManager.js","../node_modules/qrious-core/src/QRious.js","../node_modules/qrious-core/src/service/Service.js","../node_modules/qrious-core/src/service/element/ElementService.js","../src/service/element/BrowserElementService.js","../src/QRious.js"],"sourcesContent":["/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\n/**\n * A bare-bones constructor for surrogate prototype swapping.\n *\n * @private\n * @constructor\n */\nvar Constructor = /* istanbul ignore next */ function() {};\n/**\n * A reference to <code>Object.prototype.hasOwnProperty</code>.\n *\n * @private\n * @type {Function}\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * A reference to <code>Array.prototype.slice</code>.\n *\n * @private\n * @type {Function}\n */\nvar slice = Array.prototype.slice;\n\n/**\n * Creates an object which inherits the given <code>prototype</code>.\n *\n * Optionally, the created object can be extended further with the specified <code>properties</code>.\n *\n * @param {Object} prototype - the prototype to be inherited by the created object\n * @param {Object} [properties] - the optional properties to be extended by the created object\n * @return {Object} The newly created object.\n * @private\n */\nfunction createObject(prototype, properties) {\n var result;\n /* istanbul ignore next */\n if (typeof Object.create === 'function') {\n result = Object.create(prototype);\n } else {\n Constructor.prototype = prototype;\n result = new Constructor();\n Constructor.prototype = null;\n }\n\n if (properties) {\n extendObject(true, result, properties);\n }\n\n return result;\n}\n\n/**\n * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n * <code>statics</code> provided.\n *\n * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n *\n * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n * @public\n */\nfunction extend(name, constructor, prototype, statics) {\n var superConstructor = this;\n\n if (typeof name !== 'string') {\n statics = prototype;\n prototype = constructor;\n constructor = name;\n name = null;\n }\n\n if (typeof constructor !== 'function') {\n statics = prototype;\n prototype = constructor;\n constructor = function() {\n return superConstructor.apply(this, arguments);\n };\n }\n\n extendObject(false, constructor, superConstructor, statics);\n\n constructor.prototype = createObject(superConstructor.prototype, prototype);\n constructor.prototype.constructor = constructor;\n\n constructor.class_ = name || superConstructor.class_;\n constructor.super_ = superConstructor;\n\n return constructor;\n}\n\n/**\n * Extends the specified <code>target</code> object with the properties in each of the <code>sources</code> provided.\n *\n * if any source is <code>null</code> it will be ignored.\n *\n * @param {boolean} own - <code>true</code> to only copy <b>own</b> properties from <code>sources</code> onto\n * <code>target</code>; otherwise <code>false</code>\n * @param {Object} target - the target object which should be extended\n * @param {...Object} [sources] - the source objects whose properties are to be copied onto <code>target</code>\n * @return {void}\n * @private\n */\nfunction extendObject(own, target, sources) {\n sources = slice.call(arguments, 2);\n\n var property;\n var source;\n\n for (var i = 0, length = sources.length; i < length; i++) {\n source = sources[i];\n\n for (property in source) {\n if (!own || hasOwnProperty.call(source, property)) {\n target[property] = source[property];\n }\n }\n }\n}\n\nmodule.exports = extend;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nvar extend = require('./extend');\n\n/**\n * The base class from which all others should extend.\n *\n * @public\n * @constructor\n */\nfunction Nevis() {}\nNevis.class_ = 'Nevis';\nNevis.super_ = Object;\n\n/**\n * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n * <code>statics</code> provided.\n *\n * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n *\n * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n * @public\n * @static\n * @memberof Nevis\n */\nNevis.extend = extend;\n\nmodule.exports = Nevis;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Responsible for rendering a QR code {@link Frame} on a specific type of element.\n *\n * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.\n *\n * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element\n * from the renderer will result in it being immediately enabled and the element being rendered.\n *\n * @param {QRious} qrious - the {@link QRious} instance to be used\n * @param {*} element - the element onto which the QR code is to be rendered\n * @param {boolean} [enabled] - <code>true</code> this {@link Renderer} is enabled; otherwise <code>false</code>.\n * @public\n * @class\n * @extends Nevis\n */\nvar Renderer = Nevis.extend(function(qrious, element, enabled) {\n /**\n * The {@link QRious} instance.\n *\n * @protected\n * @type {QRious}\n * @memberof Renderer#\n */\n this.qrious = qrious;\n\n /**\n * The element onto which this {@link Renderer} is rendering the QR code.\n *\n * @protected\n * @type {*}\n * @memberof Renderer#\n */\n this.element = element;\n this.element.qrious = qrious;\n\n /**\n * Whether this {@link Renderer} is enabled.\n *\n * @protected\n * @type {boolean}\n * @memberof Renderer#\n */\n this.enabled = Boolean(enabled);\n}, {\n\n /**\n * Draws the specified QR code <code>frame</code> on the underlying element.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @param {Frame} frame - the {@link Frame} to be drawn\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n draw: function(frame) {},\n\n /**\n * Returns the element onto which this {@link Renderer} is rendering the QR code.\n *\n * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered\n * before the element is returned.\n *\n * @return {*} The element.\n * @public\n * @memberof Renderer#\n */\n getElement: function() {\n if (!this.enabled) {\n this.enabled = true;\n this.render();\n }\n\n return this.element;\n },\n\n /**\n * Calculates the size (in pixel units) to represent an individual module within the QR code based on the\n * <code>frame</code> provided.\n *\n * Any configured padding will be excluded from the returned size.\n *\n * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.\n * This is done so that the inevitable clipping is handled more gracefully since this way at least something is\n * displayed instead of just a blank space filled by the background color.\n *\n * @param {Frame} frame - the {@link Frame} from which the module size is to be derived\n * @return {number} The pixel size for each module in the QR code which will be no less than one.\n * @protected\n * @memberof Renderer#\n */\n getModuleSize: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding || 0;\n var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);\n\n return Math.max(1, pixels);\n },\n\n /**\n * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the <code>frame</code>\n * provided.\n *\n * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its\n * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally\n * and it is not clipped from all directions.\n *\n * @param {Frame} frame - the {@link Frame} from which the offset is to be derived\n * @return {number} The pixel offset for the QR code which will be no less than zero.\n * @protected\n * @memberof Renderer#\n */\n getOffset: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding;\n\n if (padding != null) {\n return padding;\n }\n\n var moduleSize = this.getModuleSize(frame);\n var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);\n\n return Math.max(0, offset);\n },\n\n /**\n * Renders a QR code on the underlying element based on the <code>frame</code> provided.\n *\n * @param {Frame} frame - the {@link Frame} to be rendered\n * @return {void}\n * @public\n * @memberof Renderer#\n */\n render: function(frame) {\n if (this.enabled) {\n this.resize();\n this.reset();\n this.draw(frame);\n }\n },\n\n /**\n * Resets the underlying element, effectively clearing any previously rendered QR code.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n reset: function() {},\n\n /**\n * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.\n *\n * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n resize: function() {}\n\n});\n\nmodule.exports = Renderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with <code>canvas</code> elements.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar CanvasRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function(frame) {\n var i, j;\n var qrious = this.qrious;\n var moduleSize = this.getModuleSize(frame);\n var offset = this.getOffset(frame);\n var context = this.element.getContext('2d');\n\n context.fillStyle = qrious.foreground;\n context.globalAlpha = qrious.foregroundAlpha;\n\n for (i = 0; i < frame.width; i++) {\n for (j = 0; j < frame.width; j++) {\n if (frame.buffer[(j * frame.width) + i]) {\n context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);\n }\n }\n }\n },\n\n /**\n * @override\n */\n reset: function() {\n var qrious = this.qrious;\n var context = this.element.getContext('2d');\n var size = qrious.size;\n\n context.lineWidth = 1;\n context.clearRect(0, 0, size, size);\n context.fillStyle = qrious.background;\n context.globalAlpha = qrious.backgroundAlpha;\n context.fillRect(0, 0, size, size);\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = CanvasRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains alignment pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Alignment = Nevis.extend(null, {\n\n /**\n * The alignment pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Alignment\n */\n BLOCK: [\n 0, 11, 15, 19, 23, 27, 31,\n 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n ]\n\n});\n\nmodule.exports = Alignment;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains error correction information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ErrorCorrection = Nevis.extend(null, {\n\n /**\n * The error correction blocks.\n *\n * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally\n * the ECC width.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n BLOCKS: [\n 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,\n 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,\n 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,\n 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,\n 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,\n 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,\n 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,\n 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,\n 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,\n 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,\n 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,\n 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,\n 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,\n 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,\n 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,\n 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,\n 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,\n 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,\n 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,\n 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,\n 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,\n 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,\n 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,\n 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,\n 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,\n 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,\n 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,\n 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,\n 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,\n 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,\n 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,\n 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,\n 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,\n 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,\n 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,\n 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,\n 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,\n 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,\n 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,\n 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30\n ],\n\n /**\n * The final format bits with mask (level << 3 | mask).\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n FINAL_FORMAT: [\n // L\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n // M\n 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,\n // Q\n 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,\n // H\n 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b\n ],\n\n /**\n * A map of human-readable ECC levels.\n *\n * @public\n * @static\n * @type {Object.<string, number>}\n * @memberof ErrorCorrection\n */\n LEVELS: {\n L: 1,\n M: 2,\n Q: 3,\n H: 4\n }\n\n});\n\nmodule.exports = ErrorCorrection;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains Galois field information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Galois = Nevis.extend(null, {\n\n /**\n * The Galois field exponent table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n EXPONENT: [\n 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n ],\n\n /**\n * The Galois field log table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n LOG: [\n 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n ]\n\n});\n\nmodule.exports = Galois;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains version pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Version = Nevis.extend(null, {\n\n /**\n * The version pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Version\n */\n BLOCK: [\n 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,\n 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,\n 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69\n ]\n\n});\n\nmodule.exports = Version;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Alignment = require('./Alignment');\nvar ErrorCorrection = require('./ErrorCorrection');\nvar Galois = require('./Galois');\nvar Version = require('./Version');\n\n/**\n * Generates information for a QR code frame based on a specific value to be encoded.\n *\n * @param {Frame~Options} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Frame = Nevis.extend(function(options) {\n var dataBlock, eccBlock, index, neccBlock1, neccBlock2;\n var valueLength = options.value.length;\n\n this._badness = [];\n this._level = ErrorCorrection.LEVELS[options.level];\n this._polynomial = [];\n this._value = options.value;\n this._version = 0;\n this._stringBuffer = [];\n\n while (this._version < 40) {\n this._version++;\n\n index = ((this._level - 1) * 4) + ((this._version - 1) * 16);\n\n neccBlock1 = ErrorCorrection.BLOCKS[index++];\n neccBlock2 = ErrorCorrection.BLOCKS[index++];\n dataBlock = ErrorCorrection.BLOCKS[index++];\n eccBlock = ErrorCorrection.BLOCKS[index];\n\n index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);\n\n if (valueLength <= index) {\n break;\n }\n }\n\n this._dataBlock = dataBlock;\n this._eccBlock = eccBlock;\n this._neccBlock1 = neccBlock1;\n this._neccBlock2 = neccBlock2;\n\n /**\n * The data width is based on version.\n *\n * @public\n * @type {number}\n * @memberof Frame#\n */\n // FIXME: Ensure that it fits instead of being truncated.\n var width = this.width = 17 + (4 * this._version);\n\n /**\n * The image buffer.\n *\n * @public\n * @type {number[]}\n * @memberof Frame#\n */\n this.buffer = Frame._createArray(width * width);\n\n this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);\n this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);\n\n this._insertFinders();\n this._insertAlignments();\n\n // Insert single foreground cell.\n this.buffer[8 + (width * (width - 8))] = 1;\n\n this._insertTimingGap();\n this._reverseMask();\n this._insertTimingRowAndColumn();\n this._insertVersion();\n this._syncMask();\n this._convertBitStream(valueLength);\n this._calculatePolynomial();\n this._appendEccToData();\n this._interleaveBlocks();\n this._pack();\n this._finish();\n}, {\n\n _addAlignment: function(x, y) {\n var i;\n var buffer = this.buffer;\n var width = this.width;\n\n buffer[x + (width * y)] = 1;\n\n for (i = -2; i < 2; i++) {\n buffer[x + i + (width * (y - 2))] = 1;\n buffer[x - 2 + (width * (y + i + 1))] = 1;\n buffer[x + 2 + (width * (y + i))] = 1;\n buffer[x + i + 1 + (width * (y + 2))] = 1;\n }\n\n for (i = 0; i < 2; i++) {\n this._setMask(x - 1, y + i);\n this._setMask(x + 1, y - i);\n this._setMask(x - i, y - 1);\n this._setMask(x + i, y + 1);\n }\n },\n\n _appendData: function(data, dataLength, ecc, eccLength) {\n var bit, i, j;\n var polynomial = this._polynomial;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < eccLength; i++) {\n stringBuffer[ecc + i] = 0;\n }\n\n for (i = 0; i < dataLength; i++) {\n bit = Galois.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];\n\n if (bit !== 255) {\n for (j = 1; j < eccLength; j++) {\n stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^\n Galois.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];\n }\n } else {\n for (j = ecc; j < ecc + eccLength; j++) {\n stringBuffer[j] = stringBuffer[j + 1];\n }\n }\n\n stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois.EXPONENT[Frame._modN(bit + polynomial[0])];\n }\n },\n\n _appendEccToData: function() {\n var i;\n var data = 0;\n var dataBlock = this._dataBlock;\n var ecc = this._calculateMaxLength();\n var eccBlock = this._eccBlock;\n\n for (i = 0; i < this._neccBlock1; i++) {\n this._appendData(data, dataBlock, ecc, eccBlock);\n\n data += dataBlock;\n ecc += eccBlock;\n }\n\n for (i = 0; i < this._neccBlock2; i++) {\n this._appendData(data, dataBlock + 1, ecc, eccBlock);\n\n data += dataBlock + 1;\n ecc += eccBlock;\n }\n },\n\n _applyMask: function(mask) {\n var r3x, r3y, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n switch (mask) {\n case 0:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!((x + y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 1:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!(y & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 2:\n for (y = 0; y < width; y++) {\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 3:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 4:\n for (y = 0; y < width; y++) {\n for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n r3y = !r3y;\n }\n\n if (!r3y && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 5:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 6:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 7:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n }\n },\n\n _calculateMaxLength: function() {\n return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n },\n\n _calculatePolynomial: function() {\n var i, j;\n var eccBlock = this._eccBlock;\n var polynomial = this._polynomial;\n\n polynomial[0] = 1;\n\n for (i = 0; i < eccBlock; i++) {\n polynomial[i + 1] = 1;\n\n for (j = i; j > 0; j--) {\n polynomial[j] = polynomial[j] ? polynomial[j - 1] ^\n Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[j]] + i)] : polynomial[j - 1];\n }\n\n polynomial[0] = Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[0]] + i)];\n }\n\n // Use logs for generator polynomial to save calculation step.\n for (i = 0; i <= eccBlock; i++) {\n polynomial[i] = Galois.LOG[polynomial[i]];\n }\n },\n\n _checkBadness: function() {\n var b, b1, h, x, y;\n var bad = 0;\n var badness = this._badness;\n var buffer = this.buffer;\n var width = this.width;\n\n // Blocks of same colour.\n for (y = 0; y < width - 1; y++) {\n for (x = 0; x < width - 1; x++) {\n // All foreground colour.\n if ((buffer[x + (width * y)] &&\n buffer[x + 1 + (width * y)] &&\n buffer[x + (width * (y + 1))] &&\n buffer[x + 1 + (width * (y + 1))]) ||\n // All background colour.\n !(buffer[x + (width * y)] ||\n buffer[x + 1 + (width * y)] ||\n buffer[x + (width * (y + 1))] ||\n buffer[x + 1 + (width * (y + 1))])) {\n bad += Frame.N2;\n }\n }\n }\n\n var bw = 0;\n\n // X runs.\n for (y = 0; y < width; y++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, x = 0; x < width; x++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n bw += b ? 1 : -1;\n }\n\n bad += this._getBadness(h);\n }\n\n if (bw < 0) {\n bw = -bw;\n }\n\n var count = 0;\n var big = bw;\n big += big << 2;\n big <<= 1;\n\n while (big > width * width) {\n big -= width * width;\n count++;\n }\n\n bad += count * Frame.N4;\n\n // Y runs.\n for (x = 0; x < width; x++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, y = 0; y < width; y++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n }\n\n bad += this._getBadness(h);\n }\n\n return bad;\n },\n\n _convertBitStream: function(length) {\n var bit, i;\n var ecc = this._ecc;\n var version = this._version;\n\n // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).\n for (i = 0; i < length; i++) {\n ecc[i] = this._value.charCodeAt(i);\n }\n\n var stringBuffer = this._stringBuffer = ecc.slice();\n var maxLength = this._calculateMaxLength();\n\n if (length >= maxLength - 2) {\n length = maxLength - 2;\n\n if (version > 9) {\n length--;\n }\n }\n\n // Shift and re-pack to insert length prefix.\n var index = length;\n\n if (version > 9) {\n stringBuffer[index + 2] = 0;\n stringBuffer[index + 3] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 3] |= 255 & (bit << 4);\n stringBuffer[index + 2] = bit >> 4;\n }\n\n stringBuffer[2] |= 255 & (length << 4);\n stringBuffer[1] = length >> 4;\n stringBuffer[0] = 0x40 | (length >> 12);\n } else {\n stringBuffer[index + 1] = 0;\n stringBuffer[index + 2] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 2] |= 255 & (bit << 4);\n stringBuffer[index + 1] = bit >> 4;\n }\n\n stringBuffer[1] |= 255 & (length << 4);\n stringBuffer[0] = 0x40 | (length >> 4);\n }\n\n // Fill to end with pad pattern.\n index = length + 3 - (version < 10);\n\n while (index < maxLength) {\n stringBuffer[index++] = 0xec;\n stringBuffer[index++] = 0x11;\n }\n },\n\n _getBadness: function(length) {\n var i;\n var badRuns = 0;\n var badness = this._badness;\n\n for (i = 0; i <= length; i++) {\n if (badness[i] >= 5) {\n badRuns += Frame.N1 + badness[i] - 5;\n }\n }\n\n // FBFFFBF as in finder.\n for (i = 3; i < length - 1; i += 2) {\n if (badness[i - 2] === badness[i + 2] &&\n badness[i + 2] === badness[i - 1] &&\n badness[i - 1] === badness[i + 1] &&\n badness[i - 1] * 3 === badness[i] &&\n // Background around the foreground pattern? Not part of the specs.\n (badness[i - 3] === 0 || i + 3 > length ||\n badness[i - 3] * 3 >= badness[i] * 4 ||\n badness[i + 3] * 3 >= badness[i] * 4)) {\n badRuns += Frame.N3;\n }\n }\n\n return badRuns;\n },\n\n _finish: function() {\n // Save pre-mask copy of frame.\n this._stringBuffer = this.buffer.slice();\n\n var currentMask, i;\n var bit = 0;\n var mask = 30000;\n\n /*\n * Using for instead of while since in original Arduino code if an early mask was \"good enough\" it wouldn't try for\n * a better one since they get more complex and take longer.\n */\n for (i = 0; i < 8; i++) {\n // Returns foreground-background imbalance.\n this._applyMask(i);\n\n currentMask = this._checkBadness();\n\n // Is current mask better than previous best?\n if (currentMask < mask) {\n mask = currentMask;\n bit = i;\n }\n\n // Don't increment \"i\" to a void redoing mask.\n if (bit === 7) {\n break;\n }\n\n // Reset for next pass.\n this.buffer = this._stringBuffer.slice();\n }\n\n // Redo best mask as none were \"good enough\" (i.e. last wasn't bit).\n if (bit !== i) {\n this._applyMask(bit);\n }\n\n // Add in final mask/ECC level bytes.\n mask = ErrorCorrection.FINAL_FORMAT[bit + (this._level - 1 << 3)];\n\n var buffer = this.buffer;\n var width = this.width;\n\n // Low byte.\n for (i = 0; i < 8; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[width - 1 - i + (width * 8)] = 1;\n\n if (i < 6) {\n buffer[8 + (width * i)] = 1;\n } else {\n buffer[8 + (width * (i + 1))] = 1;\n }\n }\n }\n\n // High byte.\n for (i = 0; i < 7; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[8 + (width * (width - 7 + i))] = 1;\n\n if (i) {\n buffer[6 - i + (width * 8)] = 1;\n } else {\n buffer[7 + (width * 8)] = 1;\n }\n }\n }\n },\n\n _interleaveBlocks: function() {\n var i, j;\n var dataBlock = this._dataBlock;\n var ecc = this._ecc;\n var eccBlock = this._eccBlock;\n var k = 0;\n var maxLength = this._calculateMaxLength();\n var neccBlock1 = this._neccBlock1;\n var neccBlock2 = this._neccBlock2;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < dataBlock; i++) {\n for (j = 0; j < neccBlock1; j++) {\n ecc[k++] = stringBuffer[i + (j * dataBlock)];\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n\n for (i = 0; i < eccBlock; i++) {\n for (j = 0; j < neccBlock1 + neccBlock2; j++) {\n ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];\n }\n }\n\n this._stringBuffer = ecc;\n },\n\n _insertAlignments: function() {\n var i, x, y;\n var version = this._version;\n var width = this.width;\n\n if (version > 1) {\n i = Alignment.BLOCK[version];\n y = width - 7;\n\n for (;;) {\n x = width - 7;\n\n while (x > i - 3) {\n this._addAlignment(x, y);\n\n if (x < i) {\n break;\n }\n\n x -= i;\n }\n\n if (y <= i + 9) {\n break;\n }\n\n y -= i;\n\n this._addAlignment(6, y);\n this._addAlignment(y, 6);\n }\n }\n },\n\n _insertFinders: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n for (i = 0; i < 3; i++) {\n j = 0;\n y = 0;\n\n if (i === 1) {\n j = width - 7;\n }\n if (i === 2) {\n y = width - 7;\n }\n\n buffer[y + 3 + (width * (j + 3))] = 1;\n\n for (x = 0; x < 6; x++) {\n buffer[y + x + (width * j)] = 1;\n buffer[y + (width * (j + x + 1))] = 1;\n buffer[y + 6 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 6))] = 1;\n }\n\n for (x = 1; x < 5; x++) {\n this._setMask(y + x, j + 1);\n this._setMask(y + 1, j + x + 1);\n this._setMask(y + 5, j + x);\n this._setMask(y + x + 1, j + 5);\n }\n\n for (x = 2; x < 4; x++) {\n buffer[y + x + (width * (j + 2))] = 1;\n buffer[y + 2 + (width * (j + x + 1))] = 1;\n buffer[y + 4 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 4))] = 1;\n }\n }\n },\n\n _insertTimingGap: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < 7; y++) {\n this._setMask(7, y);\n this._setMask(width - 8, y);\n this._setMask(7, y + width - 7);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x, 7);\n this._setMask(x + width - 8, 7);\n this._setMask(x, width - 8);\n }\n },\n\n _insertTimingRowAndColumn: function() {\n var x;\n var buffer = this.buffer;\n var width = this.width;\n\n for (x = 0; x < width - 14; x++) {\n if (x & 1) {\n this._setMask(8 + x, 6);\n this._setMask(6, 8 + x);\n } else {\n buffer[8 + x + (width * 6)] = 1;\n buffer[6 + (width * (8 + x))] = 1;\n }\n }\n },\n\n _insertVersion: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var version = this._version;\n var width = this.width;\n\n if (version > 6) {\n i = Version.BLOCK[version - 7];\n j = 17;\n\n for (x = 0; x < 6; x++) {\n for (y = 0; y < 3; y++, j--) {\n if (1 & (j > 11 ? version >> j - 12 : i >> j)) {\n buffer[5 - x + (width * (2 - y + width - 11))] = 1;\n buffer[2 - y + width - 11 + (width * (5 - x))] = 1;\n } else {\n this._setMask(5 - x, 2 - y + width - 11);\n this._setMask(2 - y + width - 11, 5 - x);\n }\n }\n }\n }\n },\n\n _isMasked: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n return this._mask[bit] === 1;\n },\n\n _pack: function() {\n var bit, i, j;\n var k = 1;\n var v = 1;\n var width = this.width;\n var x = width - 1;\n var y = width - 1;\n\n // Interleaved data and ECC codes.\n var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n\n for (i = 0; i < length; i++) {\n bit = this._stringBuffer[i];\n\n for (j = 0; j < 8; j++, bit <<= 1) {\n if (0x80 & bit) {\n this.buffer[x + (width * y)] = 1;\n }\n\n // Find next fill position.\n do {\n if (v) {\n x--;\n } else {\n x++;\n\n if (k) {\n if (y !== 0) {\n y--;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y = 9;\n }\n }\n } else if (y !== width - 1) {\n y++;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y -= 8;\n }\n }\n }\n\n v = !v;\n } while (this._isMasked(x, y));\n }\n }\n },\n\n _reverseMask: function() {\n var x, y;\n var width = this.width;\n\n for (x = 0; x < 9; x++) {\n this._setMask(x, 8);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x + width - 8, 8);\n this._setMask(8, x);\n }\n\n for (y = 0; y < 7; y++) {\n this._setMask(8, y + width - 7);\n }\n },\n\n _setMask: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n this._mask[bit] = 1;\n },\n\n _syncMask: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < width; y++) {\n for (x = 0; x <= y; x++) {\n if (this.buffer[x + (width * y)]) {\n this._setMask(x, y);\n }\n }\n }\n }\n\n}, {\n\n _createArray: function(length) {\n var i;\n var array = [];\n\n for (i = 0; i < length; i++) {\n array[i] = 0;\n }\n\n return array;\n },\n\n _getMaskBit: function(x, y) {\n var bit;\n\n if (x > y) {\n bit = x;\n x = y;\n y = bit;\n }\n\n bit = y;\n bit += y * y;\n bit >>= 1;\n bit += x;\n\n return bit;\n },\n\n _modN: function(x) {\n while (x >= 255) {\n x -= 255;\n x = (x >> 8) + (x & 255);\n }\n\n return x;\n },\n\n // *Badness* coefficients.\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n\n});\n\nmodule.exports = Frame;\n\n/**\n * The options used by {@link Frame}.\n *\n * @typedef {Object} Frame~Options\n * @property {string} level - The ECC level to be used.\n * @property {string} value - The value to be encoded.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with <code>img</code> elements.\n *\n * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from\n * the rendered <code>canvas</code> element as the <code>src</code> for the <code>img</code> element being rendered.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar ImageRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function() {\n this.element.src = this.qrious.toDataURL();\n },\n\n /**\n * @override\n */\n reset: function() {\n this.element.src = '';\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = ImageRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines an available option while also configuring how values are applied to the target object.\n *\n * Optionally, a default value can be specified as well a value transformer for greater control over how the option\n * value is applied.\n *\n * If no value transformer is specified, then any specified option will be applied directly. All values are maintained\n * on the target object itself as a field using the option name prefixed with a single underscore.\n *\n * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the\n * property that is defined on the target object that uses the option name.\n *\n * @param {string} name - the name to be used\n * @param {boolean} [modifiable] - <code>true</code> if the property defined on target objects should include a setter;\n * otherwise <code>false</code>\n * @param {*} [defaultValue] - the default value to be used\n * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Option = Nevis.extend(function(name, modifiable, defaultValue, valueTransformer) {\n /**\n * The name for this {@link Option}.\n *\n * @public\n * @type {string}\n * @memberof Option#\n */\n this.name = name;\n\n /**\n * Whether a setter should be included on the property defined on target objects for this {@link Option}.\n *\n * @public\n * @type {boolean}\n * @memberof Option#\n */\n this.modifiable = Boolean(modifiable);\n\n /**\n * The default value for this {@link Option}.\n *\n * @public\n * @type {*}\n * @memberof Option#\n */\n this.defaultValue = defaultValue;\n\n this._valueTransformer = valueTransformer;\n}, {\n\n /**\n * Transforms the specified <code>value</code> so that it can be applied for this {@link Option}.\n *\n * If a value transformer has been specified for this {@link Option}, it will be called upon to transform\n * <code>value</code>. Otherwise, <code>value</code> will be returned directly.\n *\n * @param {*} value - the value to be transformed\n * @return {*} The transformed value or <code>value</code> if no value transformer is specified.\n * @public\n * @memberof Option#\n */\n transform: function(value) {\n var transformer = this._valueTransformer;\n if (typeof transformer === 'function') {\n return transformer(value, this);\n }\n\n return value;\n }\n\n});\n\nmodule.exports = Option;\n\n/**\n * Returns a transformed value for the specified <code>value</code> to be applied for the <code>option</code> provided.\n *\n * @callback Option~ValueTransformer\n * @param {*} value - the value to be transformed\n * @param {Option} option - the {@link Option} for which <code>value</code> is being transformed\n * @return {*} The transform value.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains utility methods that are useful throughout the library.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Utilities = Nevis.extend(null, {\n\n /**\n * Returns the absolute value of a given number.\n *\n * This method is simply a convenient shorthand for <code>Math.abs</code> while ensuring that nulls are returned as\n * <code>null</code> instead of zero.\n *\n * @param {number} value - the number whose absolute value is to be returned\n * @return {number} The absolute value of <code>value</code> or <code>null</code> if <code>value</code> is\n * <code>null</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n abs: function(value) {\n return value != null ? Math.abs(value) : null;\n },\n\n /**\n * Returns whether the specified <code>object</code> has a property with the specified <code>name</code> as an own\n * (not inherited) property.\n *\n * @param {Object} object - the object on which the property is to be checked\n * @param {string} name - the name of the property to be checked\n * @return {boolean} <code>true</code> if <code>object</code> has an own property with <code>name</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n hasOwn: function(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n },\n\n /**\n * A non-operation method that does absolutely nothing.\n *\n * @return {void}\n * @public\n * @static\n * @memberof Utilities\n */\n noop: function() {},\n\n /**\n * Transforms the specified <code>string</code> to upper case while remaining null-safe.\n *\n * @param {string} string - the string to be transformed to upper case\n * @return {string} <code>string</code> transformed to upper case if <code>string</code> is not <code>null</code>.\n * @public\n * @static\n * @memberof Utilities\n */\n toUpperCase: function(string) {\n return string != null ? string.toUpperCase() : null;\n }\n\n});\n\nmodule.exports = Utilities;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Utilities = require('../util/Utilities');\n\n/**\n * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.\n *\n * Although the option definitions are shared between targets, the values are maintained on the targets themselves.\n *\n * @param {Option[]} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar OptionManager = Nevis.extend(function(options) {\n /**\n * The available options for this {@link OptionManager}.\n *\n * @public\n * @type {Object.<string, Option>}\n * @memberof OptionManager#\n */\n this.options = {};\n\n options.forEach(function(option) {\n this.options[option.name] = option;\n }, this);\n}, {\n\n /**\n * Returns whether an option with the specified <code>name</code> is available.\n *\n * @param {string} name - the name of the {@link Option} whose existence is to be checked\n * @return {boolean} <code>true</code> if an {@link Option} exists with <code>name</code>; otherwise\n * <code>false</code>.\n * @public\n * @memberof OptionManager#\n */\n exists: function(name) {\n return this.options[name] != null;\n },\n\n /**\n * Returns the value of the option with the specified <code>name</code> on the <code>target</code> object provided.\n *\n * @param {string} name - the name of the {@link Option} whose value on <code>target</code> is to be returned\n * @param {Object} target - the object from which the value of the named {@link Option} is to be returned\n * @return {*} The value of the {@link Option} with <code>name</code> on <code>target</code>.\n * @public\n * @memberof OptionManager#\n */\n get: function(name, target) {\n return OptionManager._get(this.options[name], target);\n },\n\n /**\n * Returns a copy of all of the available options on the <code>target</code> object provided.\n *\n * @param {Object} target - the object from which the option name/value pairs are to be returned\n * @return {Object.<string, *>} A hash containing the name/value pairs of all options on <code>target</code>.\n * @public\n * @memberof OptionManager#\n */\n getAll: function(target) {\n var name;\n var options = this.options;\n var result = {};\n\n for (name in options) {\n if (Utilities.hasOwn(options, name)) {\n result[name] = OptionManager._get(options[name], target);\n }\n }\n\n return result;\n },\n\n /**\n * Initializes the available options for the <code>target</code> object provided and then applies the initial values\n * within the speciifed <code>options</code>.\n *\n * This method will throw an error if any of the names within <code>options</code> does not match an available option.\n *\n * This involves setting the default values and defining properties for all of the available options on\n * <code>target</code> before finally calling {@link OptionMananger#setAll} with <code>options</code> and\n * <code>target</code>. Any options that are configured to be modifiable will have a setter included in their defined\n * property that will allow its corresponding value to be modified.\n *\n * If a change handler is specified, it will be called whenever the value changes on <code>target</code> for a\n * modifiable option, but only when done so via the defined property's setter.\n *\n * @param {Object.<string, *>} options - the name/value pairs of the initial options to be set\n * @param {Object} target - the object on which the options are to be initialized\n * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on\n * <code>target</code>\n * @return {void}\n * @throws {Error} If <code>options</code> contains an invalid option name.\n * @public\n * @memberof OptionManager#\n */\n init: function(options, target, changeHandler) {\n if (typeof changeHandler !== 'function') {\n changeHandler = Utilities.noop;\n }\n\n var name, option;\n\n for (name in this.options) {\n if (Utilities.hasOwn(this.options, name)) {\n option = this.options[name];\n\n OptionManager._set(option, option.defaultValue, target);\n OptionManager._createAccessor(option, target, changeHandler);\n }\n }\n\n this._setAll(options, target, true);\n },\n\n /**\n * Sets the value of the option with the specified <code>name</code> on the <code>target</code> object provided to\n * <code>value</code>.\n *\n * This method will throw an error if <code>name</code> does not match an available option or matches an option that\n * cannot be modified.\n *\n * If <code>value</code> is <code>null</code> and the {@link Option} has a default value configured, then that default\n * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to\n * transform whichever value was determined to be used.\n *\n * This method returns whether the value of the underlying field on <code>target</code> was changed as a result.\n *\n * @param {string} name - the name of the {@link Option} whose value is to be set\n * @param {*} value - the value to be set for the named {@link Option} on <code>target</code>\n * @param {Object} target - the object on which <code>value</code> is to be set for the named {@link Option}\n * @return {boolean} <code>true</code> if the underlying field on <code>target</code> was changed; otherwise\n * <code>false</code>.\n * @throws {Error} If <code>name</code> is invalid or is for an option that cannot be modified.\n * @public\n * @memberof OptionManager#\n */\n set: function(name, value, target) {\n return this._set(name, value, target);\n },\n\n /**\n * Sets all of the specified <code>options</code> on the <code>target</code> object provided to their corresponding\n * values.\n *\n * This method will throw an error if any of the names within <code>options</code> does not match an available option\n * or matches an option that cannot be modified.\n *\n * If any value within <code>options</code> is <code>null</code> and the corresponding {@link Option} has a default\n * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer\n * configured, it will be used to transform whichever value was determined to be used.\n *\n * This method returns whether the value for any of the underlying fields on <code>target</code> were changed as a\n * result.\n *\n * @param {Object.<string, *>} options - the name/value pairs of options to be set\n * @param {Object} target - the object on which the options are to be set\n * @return {boolean} <code>true</code> if any of the underlying fields on <code>target</code> were changed; otherwise\n * <code>false</code>.\n * @throws {Error} If <code>options</code> contains an invalid option name or an option that cannot be modiifed.\n * @public\n * @memberof OptionManager#\n */\n setAll: function(options, target) {\n return this._setAll(options, target);\n },\n\n _set: function(name, value, target, allowUnmodifiable) {\n var option = this.options[name];\n if (!option) {\n throw new Error('Invalid option: ' + name);\n }\n if (!option.modifiable && !allowUnmodifiable) {\n throw new Error('Option cannot be modified: ' + name);\n }\n\n return OptionManager._set(option, value, target);\n },\n\n _setAll: function(options, target, allowUnmodifiable) {\n if (!options) {\n return false;\n }\n\n var name;\n var changed = false;\n\n for (name in options) {\n if (Utilities.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {\n changed = true;\n }\n }\n\n return changed;\n }\n\n}, {\n\n _createAccessor: function(option, target, changeHandler) {\n var descriptor = {\n get: function() {\n return OptionManager._get(option, target);\n }\n };\n\n if (option.modifiable) {\n descriptor.set = function(value) {\n if (OptionManager._set(option, value, target)) {\n changeHandler(value, option);\n }\n };\n }\n\n Object.defineProperty(target, option.name, descriptor);\n },\n\n _get: function(option, target) {\n return target['_' + option.name];\n },\n\n _set: function(option, value, target) {\n var fieldName = '_' + option.name;\n var oldValue = target[fieldName];\n var newValue = option.transform(value != null ? value : option.defaultValue);\n\n target[fieldName] = newValue;\n\n return newValue !== oldValue;\n }\n\n});\n\nmodule.exports = OptionManager;\n\n/**\n * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's\n * setter.\n *\n * @callback OptionManager~ChangeHandler\n * @param {*} value - the new value for <code>option</code> on the target object\n * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.\n * @return {void}\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * A basic manager for {@link Service} implementations that are mapped to simple names.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ServiceManager = Nevis.extend(function() {\n this._services = {};\n}, {\n\n /**\n * Returns the {@link Service} being managed with the specified <code>name</code>.\n *\n * @param {string} name - the name of the {@link Service} to be returned\n * @return {Service} The {@link Service} is being managed with <code>name</code>.\n * @throws {Error} If no {@link Service} is being managed with <code>name</code>.\n * @public\n * @memberof ServiceManager#\n */\n getService: function(name) {\n var service = this._services[name];\n if (!service) {\n throw new Error('Service is not being managed with name: ' + name);\n }\n\n return service;\n },\n\n /**\n * Sets the {@link Service} implementation to be managed for the specified <code>name</code> to the\n * <code>service</code> provided.\n *\n * @param {string} name - the name of the {@link Service} to be managed with <code>name</code>\n * @param {Service} service - the {@link Service} implementation to be managed\n * @return {void}\n * @throws {Error} If a {@link Service} is already being managed with the same <code>name</code>.\n * @public\n * @memberof ServiceManager#\n */\n setService: function(name, service) {\n if (this._services[name]) {\n throw new Error('Service is already managed with name: ' + name);\n }\n\n if (service) {\n this._services[name] = service;\n }\n }\n\n});\n\nmodule.exports = ServiceManager;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar CanvasRenderer = require('./renderer/CanvasRenderer');\nvar Frame = require('./Frame');\nvar ImageRenderer = require('./renderer/ImageRenderer');\nvar Option = require('./option/Option');\nvar OptionManager = require('./option/OptionManager');\nvar ServiceManager = require('./service/ServiceManager');\nvar Utilities = require('./util/Utilities');\n\nvar optionManager = new OptionManager([\n new Option('background', true, 'white'),\n new Option('backgroundAlpha', true, 1, Utilities.abs),\n new Option('element'),\n new Option('foreground', true, 'black'),\n new Option('foregroundAlpha', true, 1, Utilities.abs),\n new Option('level', true, 'L', Utilities.toUpperCase),\n new Option('mime', true, 'image/png'),\n new Option('padding', true, null, Utilities.abs),\n new Option('size', true, 100, Utilities.abs),\n new Option('value', true, '')\n]);\nvar serviceManager = new ServiceManager();\n\n/**\n * Enables configuration of a QR code generator which uses HTML5 <code>canvas</code> for rendering.\n *\n * @param {QRious~Options} [options] - the options to be used\n * @throws {Error} If any <code>options</code> are invalid.\n * @public\n * @class\n * @extends Nevis\n */\nvar QRious = Nevis.extend(function(options) {\n optionManager.init(options, this, this.update.bind(this));\n\n var element = optionManager.get('element', this);\n var elementService = serviceManager.getService('element');\n var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();\n var image = element && elementService.isImage(element) ? element : elementService.createImage();\n\n this._canvasRenderer = new CanvasRenderer(this, canvas, true);\n this._imageRenderer = new ImageRenderer(this, image, image === element);\n\n this.update();\n}, {\n\n /**\n * Returns all of the options configured for this {@link QRious}.\n *\n * Any changes made to the returned object will not be reflected in the options themselves or their corresponding\n * underlying fields.\n *\n * @return {Object.<string, *>} A copy of the applied options.\n * @public\n * @memberof QRious#\n */\n get: function() {\n return optionManager.getAll(this);\n },\n\n /**\n * Sets all of the specified <code>options</code> and automatically updates this {@link QRious} if any of the\n * underlying fields are changed as a result.\n *\n * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between\n * changes.\n *\n * @param {QRious~Options} options - the options to be set\n * @return {void}\n * @throws {Error} If any <code>options</code> are invalid or cannot be modified.\n * @public\n * @memberof QRious#\n */\n set: function(options) {\n if (optionManager.setAll(options, this)) {\n this.update();\n }\n },\n\n /**\n * Returns the image data URI for the generated QR code using the <code>mime</code> provided.\n *\n * @param {string} [mime] - the MIME type for the image\n * @return {string} The image data URI for the QR code.\n * @public\n * @memberof QRious#\n */\n toDataURL: function(mime) {\n return this.canvas.toDataURL(mime || this.mime);\n },\n\n /**\n * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.\n *\n * @return {void}\n * @protected\n * @memberof QRious#\n */\n update: function() {\n var frame = new Frame({\n level: this.level,\n value: this.value\n });\n\n this._canvasRenderer.render(frame);\n this._imageRenderer.render(frame);\n }\n\n}, {\n\n /**\n * Configures the <code>service</code> provided to be used by all {@link QRious} instances.\n *\n * @param {Service} service - the {@link Service} to be configured\n * @return {void}\n * @throws {Error} If a {@link Service} has already been configured with the same name.\n * @public\n * @static\n * @memberof QRious\n */\n use: function(service) {\n serviceManager.setService(service.getName(), service);\n }\n\n});\n\nObject.defineProperties(QRious.prototype, {\n\n canvas: {\n /**\n * Returns the <code>canvas</code> element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The <code>canvas</code> element.\n * @public\n * @memberof QRious#\n * @alias canvas\n */\n get: function() {\n return this._canvasRenderer.getElement();\n }\n },\n\n image: {\n /**\n * Returns the <code>img</code> element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The <code>img</code> element.\n * @public\n * @memberof QRious#\n * @alias image\n */\n get: function() {\n return this._imageRenderer.getElement();\n }\n }\n\n});\n\nmodule.exports = QRious;\n\n/**\n * The options used by {@link QRious}.\n *\n * @typedef {Object} QRious~Options\n * @property {string} [background=\"white\"] - The background color to be applied to the QR code.\n * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.\n * @property {*} [element] - The element to be used to render the QR code which may either be an <code>canvas</code> or\n * <code>img</code>. The element(s) will be created if needed.\n * @property {string} [foreground=\"black\"] - The foreground color to be applied to the QR code.\n * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.\n * @property {string} [level=\"L\"] - The error correction level to be applied to the QR code.\n * @property {string} [mime=\"image/png\"] - The MIME type to be used to render the image for the QR code.\n * @property {number} [padding] - The padding for the QR code in pixels.\n * @property {number} [size=100] - The size of the QR code in pixels.\n * @property {string} [value=\"\"] - The value to be encoded within the QR code.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines a service contract that must be met by all implementations.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Service = Nevis.extend({\n\n /**\n * Returns the name of this {@link Service}.\n *\n * @return {string} The service name.\n * @public\n * @abstract\n * @memberof Service#\n */\n getName: function() {}\n\n});\n\nmodule.exports = Service;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar Service = require('../Service');\n\n/**\n * A service for working with elements.\n *\n * @public\n * @class\n * @extends Service\n */\nvar ElementService = Service.extend({\n\n /**\n * Creates an instance of a canvas element.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @return {*} The newly created canvas element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createCanvas: function() {},\n\n /**\n * Creates an instance of a image element.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @return {*} The newly created image element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createImage: function() {},\n\n /**\n * @override\n */\n getName: function() {\n return 'element';\n },\n\n /**\n * Returns whether the specified <code>element</code> is a canvas.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} <code>true</code> if <code>element</code> is a canvas; otherwise <code>false</code>.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isCanvas: function(element) {},\n\n /**\n * Returns whether the specified <code>element</code> is an image.\n *\n * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} <code>true</code> if <code>element</code> is an image; otherwise <code>false</code>.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isImage: function(element) {}\n\n});\n\nmodule.exports = ElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar ElementService = require('qrious-core/src/service/element/ElementService');\n\n/**\n * An implementation of {@link ElementService} intended for use within a browser environment.\n *\n * @public\n * @class\n * @extends ElementService\n */\nvar BrowserElementService = ElementService.extend({\n\n /**\n * @override\n */\n createCanvas: function() {\n return document.createElement('canvas');\n },\n\n /**\n * @override\n */\n createImage: function() {\n return document.createElement('img');\n },\n\n /**\n * @override\n */\n isCanvas: function(element) {\n return element instanceof HTMLCanvasElement;\n },\n\n /**\n * @override\n */\n isImage: function(element) {\n return element instanceof HTMLImageElement;\n }\n\n});\n\nmodule.exports = BrowserElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n'use strict';\n\nvar QRious = require('qrious-core');\n\nvar BrowserElementService = require('./service/element/BrowserElementService');\n\nQRious.use(new BrowserElementService());\n\nmodule.exports = QRious;\n"],"names":["createObject","prototype","properties","result","Object","create","Constructor","extendObject","extend","name","constructor","statics","superConstructor","this","apply","arguments","class_","super_","own","target","sources","property","source","i","length","slice","call","hasOwnProperty","Nevis","Array","qrious","element","enabled","Boolean","draw","frame","getElement","render","getModuleSize","padding","pixels","Math","floor","size","width","max","getOffset","moduleSize","offset","resize","reset","Renderer","j","context","getContext","fillStyle","foreground","globalAlpha","foregroundAlpha","buffer","fillRect","lineWidth","clearRect","background","backgroundAlpha","height","BLOCK","BLOCKS","FINAL_FORMAT","LEVELS","L","M","Q","H","EXPONENT","LOG","Frame","options","dataBlock","eccBlock","index","neccBlock1","neccBlock2","valueLength","value","_badness","_level","ErrorCorrection","level","_polynomial","_value","_version","_stringBuffer","_dataBlock","_eccBlock","_neccBlock1","_neccBlock2","_createArray","_ecc","_mask","_insertFinders","_insertAlignments","_insertTimingGap","_reverseMask","_insertTimingRowAndColumn","_insertVersion","_syncMask","_convertBitStream","_calculatePolynomial","_appendEccToData","_interleaveBlocks","_pack","_finish","_addAlignment","x","y","_setMask","_appendData","data","dataLength","ecc","eccLength","bit","polynomial","stringBuffer","Galois","_modN","_calculateMaxLength","_applyMask","mask","r3x","r3y","_isMasked","_checkBadness","b","b1","h","bad","badness","N2","bw","_getBadness","count","big","N4","version","charCodeAt","maxLength","badRuns","N1","N3","currentMask","k","Alignment","Version","_getMaskBit","v","array","src","toDataURL","modifiable","defaultValue","valueTransformer","_valueTransformer","transform","transformer","abs","hasOwn","object","noop","toUpperCase","string","OptionManager","forEach","option","exists","get","_get","getAll","Utilities","init","changeHandler","_set","_createAccessor","_setAll","set","setAll","allowUnmodifiable","Error","changed","descriptor","defineProperty","fieldName","oldValue","newValue","_services","getService","service","setService","optionManager","Option","serviceManager","ServiceManager","QRious","update","bind","elementService","canvas","isCanvas","createCanvas","image","isImage","createImage","_canvasRenderer","CanvasRenderer","_imageRenderer","ImageRenderer","mime","use","getName","defineProperties","document","createElement","HTMLCanvasElement","HTMLImageElement","BrowserElementService"],"mappings":"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O,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,GAAI,IAAK,GAAO,EAA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,IAAM,EAC1F,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAC1F,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAW5FC,KACE,IAAM,EAAM,EAAM,GAAM,EAAM,GAAM,GAAM,IAAM,EAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAC1F,EAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAM,GAAM,IAC1F,EAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAM,IAAM,GAAM,IAAM,IAAM,IAC1F,EAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,GAC1F,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC1F,EAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAC1F,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAC1F,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAC1F,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAC1F,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAC1F,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,SCrDhF/C,EAAMpB,OAAO,MAUzB0D,OACE,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KACpF,KAAO,KAAO,KAAO,KAAO,KAAO,IAAO,KAAO,IAAO,KAAO,IAAO,KAAO,IAAO,KACpF,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,QCPjDU,EAAQhD,EAAMpB,OAAO,SAASqE,GAChC,IAAIC,EAAWC,EAAUC,EAAOC,EAAYC,EACxCC,EAAcN,EAAQO,MAAM5D,OAShC,IAPAX,KAAKwE,YACLxE,KAAKyE,OAASC,EAAgBlB,OAAOQ,EAAQW,OAC7C3E,KAAK4E,eACL5E,KAAK6E,OAASb,EAAQO,MACtBvE,KAAK8E,SAAW,EAChB9E,KAAK+E,iBAEE/E,KAAK8E,SAAW,KACrB9E,KAAK8E,WAELX,EAA6B,GAAnBnE,KAAKyE,OAAS,GAAiC,IAArBzE,KAAK8E,SAAW,GAEpDV,EAAaM,EAAgBpB,OAAOa,KACpCE,EAAaK,EAAgBpB,OAAOa,KACpCF,EAAYS,EAAgBpB,OAAOa,KACnCD,EAAWQ,EAAgBpB,OAAOa,GAElCA,EAASF,GAAaG,EAAaC,GAAeA,EAAa,GAAKrE,KAAK8E,UAAY,KAEjFR,GAAeH,MAKrBnE,KAAKgF,WAAaf,EAClBjE,KAAKiF,UAAYf,EACjBlE,KAAKkF,YAAcd,EACnBpE,KAAKmF,YAAcd,EAUnB,IAAItC,EAAQ/B,KAAK+B,MAAQ,GAAM,EAAI/B,KAAK8E,SASxC9E,KAAK8C,OAASiB,EAAMqB,aAAarD,EAAQA,GAEzC/B,KAAKqF,KAAOtB,EAAMqB,aAAanB,GAAcA,EAAYC,IAAaE,EAAaC,GAAeA,GAClGrE,KAAKsF,MAAQvB,EAAMqB,cAAerD,GAASA,EAAQ,GAAM,GAAK,GAE9D/B,KAAKuF,iBACLvF,KAAKwF,oBAGLxF,KAAK8C,OAAO,EAAKf,GAASA,EAAQ,IAAO,EAEzC/B,KAAKyF,mBACLzF,KAAK0F,eACL1F,KAAK2F,4BACL3F,KAAK4F,iBACL5F,KAAK6F,YACL7F,KAAK8F,kBAAkBxB,GACvBtE,KAAK+F,uBACL/F,KAAKgG,mBACLhG,KAAKiG,oBACLjG,KAAKkG,QACLlG,KAAKmG,YAGLC,cAAe,SAASC,EAAGC,GACzB,IAAI5F,EACAoC,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAIjB,IAFAe,EAAOuD,EAAKtE,EAAQuE,GAAM,EAErB5F,GAAK,EAAGA,EAAI,EAAGA,IAClBoC,EAAOuD,EAAI3F,EAAKqB,GAASuE,EAAI,IAAO,EACpCxD,EAAOuD,EAAI,EAAKtE,GAASuE,EAAI5F,EAAI,IAAO,EACxCoC,EAAOuD,EAAI,EAAKtE,GAASuE,EAAI5F,IAAO,EACpCoC,EAAOuD,EAAI3F,EAAI,EAAKqB,GAASuE,EAAI,IAAO,EAG1C,IAAK5F,EAAI,EAAGA,EAAI,EAAGA,IACjBV,KAAKuG,SAASF,EAAI,EAAGC,EAAI5F,GACzBV,KAAKuG,SAASF,EAAI,EAAGC,EAAI5F,GACzBV,KAAKuG,SAASF,EAAI3F,EAAG4F,EAAI,GACzBtG,KAAKuG,SAASF,EAAI3F,EAAG4F,EAAI,IAI7BE,YAAa,SAASC,EAAMC,EAAYC,EAAKC,GAC3C,IAAIC,EAAKnG,EAAG6B,EACRuE,EAAa9G,KAAK4E,YAClBmC,EAAe/G,KAAK+E,cAExB,IAAKrE,EAAI,EAAGA,EAAIkG,EAAWlG,IACzBqG,EAAaJ,EAAMjG,GAAK,EAG1B,IAAKA,EAAI,EAAGA,EAAIgG,EAAYhG,IAAK,CAG/B,GAAY,OAFZmG,EAAMG,EAAOlD,IAAIiD,EAAaN,EAAO/F,GAAKqG,EAAaJ,KAGrD,IAAKpE,EAAI,EAAGA,EAAIqE,EAAWrE,IACzBwE,EAAaJ,EAAMpE,EAAI,GAAKwE,EAAaJ,EAAMpE,GAC7CyE,EAAOnD,SAASE,EAAMkD,MAAMJ,EAAMC,EAAWF,EAAYrE,UAG7D,IAAKA,EAAIoE,EAAKpE,EAAIoE,EAAMC,EAAWrE,IACjCwE,EAAaxE,GAAKwE,EAAaxE,EAAI,GAIvCwE,EAAaJ,EAAMC,EAAY,GAAa,MAARC,EAAc,EAAIG,EAAOnD,SAASE,EAAMkD,MAAMJ,EAAMC,EAAW,OAIvGd,iBAAkB,WAChB,IAAItF,EACA+F,EAAO,EACPxC,EAAYjE,KAAKgF,WACjB2B,EAAM3G,KAAKkH,sBACXhD,EAAWlE,KAAKiF,UAEpB,IAAKvE,EAAI,EAAGA,EAAIV,KAAKkF,YAAaxE,IAChCV,KAAKwG,YAAYC,EAAMxC,EAAW0C,EAAKzC,GAEvCuC,GAAQxC,EACR0C,GAAOzC,EAGT,IAAKxD,EAAI,EAAGA,EAAIV,KAAKmF,YAAazE,IAChCV,KAAKwG,YAAYC,EAAMxC,EAAY,EAAG0C,EAAKzC,GAE3CuC,GAAQxC,EAAY,EACpB0C,GAAOzC,GAIXiD,WAAY,SAASC,GACnB,IAAIC,EAAKC,EAAKjB,EAAGC,EACbxD,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAEjB,OAAQqF,GACR,KAAK,EACH,IAAKd,EAAI,EAAGA,EAAIvE,EAAOuE,IACrB,IAAKD,EAAI,EAAGA,EAAItE,EAAOsE,IACdA,EAAIC,EAAK,GAAOtG,KAAKuH,UAAUlB,EAAGC,KACvCxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuE,EAAI,EAAGA,EAAIvE,EAAOuE,IACrB,IAAKD,EAAI,EAAGA,EAAItE,EAAOsE,IACX,EAAJC,GAAWtG,KAAKuH,UAAUlB,EAAGC,KACjCxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuE,EAAI,EAAGA,EAAIvE,EAAOuE,IACrB,IAAKe,EAAM,EAAGhB,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IACvB,IAARA,IACFA,EAAM,GAGHA,GAAQrH,KAAKuH,UAAUlB,EAAGC,KAC7BxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuF,EAAM,EAAGhB,EAAI,EAAGA,EAAIvE,EAAOuE,IAAKgB,IAKnC,IAJY,IAARA,IACFA,EAAM,GAGHD,EAAMC,EAAKjB,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IACzB,IAARA,IACFA,EAAM,GAGHA,GAAQrH,KAAKuH,UAAUlB,EAAGC,KAC7BxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuE,EAAI,EAAGA,EAAIvE,EAAOuE,IACrB,IAAKe,EAAM,EAAGC,EAAOhB,GAAK,EAAK,EAAGD,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IAC3C,IAARA,IACFA,EAAM,EACNC,GAAOA,GAGJA,GAAQtH,KAAKuH,UAAUlB,EAAGC,KAC7BxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuF,EAAM,EAAGhB,EAAI,EAAGA,EAAIvE,EAAOuE,IAAKgB,IAKnC,IAJY,IAARA,IACFA,EAAM,GAGHD,EAAM,EAAGhB,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IACvB,IAARA,IACFA,EAAM,IAGDhB,EAAIC,EAAI,MAAQe,GAAOC,IAAUtH,KAAKuH,UAAUlB,EAAGC,KACxDxD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuF,EAAM,EAAGhB,EAAI,EAAGA,EAAIvE,EAAOuE,IAAKgB,IAKnC,IAJY,IAARA,IACFA,EAAM,GAGHD,EAAM,EAAGhB,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IACvB,IAARA,IACFA,EAAM,IAGDhB,EAAIC,EAAI,IAAMe,GAAOA,IAAQC,GAAO,GAAOtH,KAAKuH,UAAUlB,EAAGC,KAClExD,EAAOuD,EAAKC,EAAIvE,IAAW,GAKjC,MACF,KAAK,EACH,IAAKuF,EAAM,EAAGhB,EAAI,EAAGA,EAAIvE,EAAOuE,IAAKgB,IAKnC,IAJY,IAARA,IACFA,EAAM,GAGHD,EAAM,EAAGhB,EAAI,EAAGA,EAAItE,EAAOsE,IAAKgB,IACvB,IAARA,IACFA,EAAM,IAGDA,GAAOA,IAAQC,IAAQjB,EAAIC,EAAI,GAAK,GAAOtG,KAAKuH,UAAUlB,EAAGC,KAClExD,EAAOuD,EAAKC,EAAIvE,IAAW,KASrCmF,oBAAqB,WACnB,OAAQlH,KAAKgF,YAAchF,KAAKkF,YAAclF,KAAKmF,aAAgBnF,KAAKmF,aAG1EY,qBAAsB,WACpB,IAAIrF,EAAG6B,EACH2B,EAAWlE,KAAKiF,UAChB6B,EAAa9G,KAAK4E,YAItB,IAFAkC,EAAW,GAAK,EAEXpG,EAAI,EAAGA,EAAIwD,EAAUxD,IAAK,CAG7B,IAFAoG,EAAWpG,EAAI,GAAK,EAEf6B,EAAI7B,EAAG6B,EAAI,EAAGA,IACjBuE,EAAWvE,GAAKuE,EAAWvE,GAAKuE,EAAWvE,EAAI,GAC7CyE,EAAOnD,SAASE,EAAMkD,MAAMD,EAAOlD,IAAIgD,EAAWvE,IAAM7B,IAAMoG,EAAWvE,EAAI,GAGjFuE,EAAW,GAAKE,EAAOnD,SAASE,EAAMkD,MAAMD,EAAOlD,IAAIgD,EAAW,IAAMpG,IAI1E,IAAKA,EAAI,EAAGA,GAAKwD,EAAUxD,IACzBoG,EAAWpG,GAAKsG,EAAOlD,IAAIgD,EAAWpG,KAI1C8G,cAAe,WACb,IAAIC,EAAGC,EAAIC,EAAGtB,EAAGC,EACbsB,EAAM,EACNC,EAAU7H,KAAKwE,SACf1B,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAGjB,IAAKuE,EAAI,EAAGA,EAAIvE,EAAQ,EAAGuE,IACzB,IAAKD,EAAI,EAAGA,EAAItE,EAAQ,EAAGsE,KAEpBvD,EAAOuD,EAAKtE,EAAQuE,IACvBxD,EAAOuD,EAAI,EAAKtE,EAAQuE,IACxBxD,EAAOuD,EAAKtE,GAASuE,EAAI,KACzBxD,EAAOuD,EAAI,EAAKtE,GAASuE,EAAI,OAE3BxD,EAAOuD,EAAKtE,EAAQuE,IACtBxD,EAAOuD,EAAI,EAAKtE,EAAQuE,IACxBxD,EAAOuD,EAAKtE,GAASuE,EAAI,KACzBxD,EAAOuD,EAAI,EAAKtE,GAASuE,EAAI,QAC7BsB,GAAO7D,EAAM+D,IAKnB,IAAIC,EAAK,EAGT,IAAKzB,EAAI,EAAGA,EAAIvE,EAAOuE,IAAK,CAK1B,IAJAqB,EAAI,EAEJE,EAAQ,GAAK,EAERJ,EAAI,EAAGpB,EAAI,EAAGA,EAAItE,EAAOsE,IAGxBoB,KAFJC,EAAK5E,EAAOuD,EAAKtE,EAAQuE,IAGvBuB,EAAQF,KAERE,IAAUF,GAAK,EAIjBI,IADAN,EAAIC,GACM,GAAK,EAGjBE,GAAO5H,KAAKgI,YAAYL,GAGtBI,EAAK,IACPA,GAAMA,GAGR,IAAIE,EAAQ,EACRC,EAAMH,EAIV,IAHAG,GAAOA,GAAO,EACdA,IAAQ,EAEDA,EAAMnG,EAAQA,GACnBmG,GAAOnG,EAAQA,EACfkG,IAMF,IAHAL,GAAOK,EAAQlE,EAAMoE,GAGhB9B,EAAI,EAAGA,EAAItE,EAAOsE,IAAK,CAK1B,IAJAsB,EAAI,EAEJE,EAAQ,GAAK,EAERJ,EAAI,EAAGnB,EAAI,EAAGA,EAAIvE,EAAOuE,IAGxBmB,KAFJC,EAAK5E,EAAOuD,EAAKtE,EAAQuE,IAGvBuB,EAAQF,KAERE,IAAUF,GAAK,EAGjBF,EAAIC,EAGNE,GAAO5H,KAAKgI,YAAYL,GAG1B,OAAOC,GAGT9B,kBAAmB,SAASnF,GAC1B,IAAIkG,EAAKnG,EACLiG,EAAM3G,KAAKqF,KACX+C,EAAUpI,KAAK8E,SAGnB,IAAKpE,EAAI,EAAGA,EAAIC,EAAQD,IACtBiG,EAAIjG,GAAKV,KAAK6E,OAAOwD,WAAW3H,GAGlC,IAAIqG,EAAe/G,KAAK+E,cAAgB4B,EAAI/F,QACxC0H,EAAYtI,KAAKkH,sBAEjBvG,GAAU2H,EAAY,IACxB3H,EAAS2H,EAAY,EAEjBF,EAAU,GACZzH,KAKJ,IAAIwD,EAAQxD,EAEZ,GAAIyH,EAAU,EAAG,CAIf,IAHArB,EAAa5C,EAAQ,GAAK,EAC1B4C,EAAa5C,EAAQ,GAAK,EAEnBA,KACL0C,EAAME,EAAa5C,GAEnB4C,EAAa5C,EAAQ,IAAM,IAAO0C,GAAO,EACzCE,EAAa5C,EAAQ,GAAK0C,GAAO,EAGnCE,EAAa,IAAM,IAAOpG,GAAU,EACpCoG,EAAa,GAAKpG,GAAU,EAC5BoG,EAAa,GAAK,GAAQpG,GAAU,OAC/B,CAIL,IAHAoG,EAAa5C,EAAQ,GAAK,EAC1B4C,EAAa5C,EAAQ,GAAK,EAEnBA,KACL0C,EAAME,EAAa5C,GAEnB4C,EAAa5C,EAAQ,IAAM,IAAO0C,GAAO,EACzCE,EAAa5C,EAAQ,GAAK0C,GAAO,EAGnCE,EAAa,IAAM,IAAOpG,GAAU,EACpCoG,EAAa,GAAK,GAAQpG,GAAU,EAMtC,IAFAwD,EAAQxD,EAAS,GAAKyH,EAAU,IAEzBjE,EAAQmE,GACbvB,EAAa5C,KAAW,IACxB4C,EAAa5C,KAAW,IAI5B6D,YAAa,SAASrH,GACpB,IAAID,EACA6H,EAAU,EACVV,EAAU7H,KAAKwE,SAEnB,IAAK9D,EAAI,EAAGA,GAAKC,EAAQD,IACnBmH,EAAQnH,IAAM,IAChB6H,GAAWxE,EAAMyE,GAAKX,EAAQnH,GAAK,GAKvC,IAAKA,EAAI,EAAGA,EAAIC,EAAS,EAAGD,GAAK,EAC3BmH,EAAQnH,EAAI,KAAOmH,EAAQnH,EAAI,IACjCmH,EAAQnH,EAAI,KAAOmH,EAAQnH,EAAI,IAC/BmH,EAAQnH,EAAI,KAAOmH,EAAQnH,EAAI,IACd,EAAjBmH,EAAQnH,EAAI,KAAWmH,EAAQnH,KAEX,IAAnBmH,EAAQnH,EAAI,IAAYA,EAAI,EAAIC,GAChB,EAAjBkH,EAAQnH,EAAI,IAAuB,EAAbmH,EAAQnH,IACb,EAAjBmH,EAAQnH,EAAI,IAAuB,EAAbmH,EAAQnH,MAC9B6H,GAAWxE,EAAM0E,IAIrB,OAAOF,GAGTpC,QAAS,WAEPnG,KAAK+E,cAAgB/E,KAAK8C,OAAOlC,QAEjC,IAAI8H,EAAahI,EACbmG,EAAM,EACNO,EAAO,IAMX,IAAK1G,EAAI,EAAGA,EAAI,IAEdV,KAAKmH,WAAWzG,IAEhBgI,EAAc1I,KAAKwH,iBAGDJ,IAChBA,EAAOsB,EACP7B,EAAMnG,GAII,IAARmG,GAbanG,IAkBjBV,KAAK8C,OAAS9C,KAAK+E,cAAcnE,QAI/BiG,IAAQnG,GACVV,KAAKmH,WAAWN,GAIlBO,EAAO1C,EAAgBnB,aAAasD,GAAO7G,KAAKyE,OAAS,GAAK,IAE9D,IAAI3B,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAGjB,IAAKrB,EAAI,EAAGA,EAAI,EAAGA,IAAK0G,IAAS,EACpB,EAAPA,IACFtE,EAAOf,EAAQ,EAAIrB,EAAa,EAARqB,GAAc,EAElCrB,EAAI,EACNoC,EAAO,EAAKf,EAAQrB,GAAM,EAE1BoC,EAAO,EAAKf,GAASrB,EAAI,IAAO,GAMtC,IAAKA,EAAI,EAAGA,EAAI,EAAGA,IAAK0G,IAAS,EACpB,EAAPA,IACFtE,EAAO,EAAKf,GAASA,EAAQ,EAAIrB,IAAO,EAEpCA,EACFoC,EAAO,EAAIpC,EAAa,EAARqB,GAAc,EAE9Be,EAAO,EAAa,EAARf,GAAc,IAMlCkE,kBAAmB,WACjB,IAAIvF,EAAG6B,EACH0B,EAAYjE,KAAKgF,WACjB2B,EAAM3G,KAAKqF,KACXnB,EAAWlE,KAAKiF,UAChB0D,EAAI,EACJL,EAAYtI,KAAKkH,sBACjB9C,EAAapE,KAAKkF,YAClBb,EAAarE,KAAKmF,YAClB4B,EAAe/G,KAAK+E,cAExB,IAAKrE,EAAI,EAAGA,EAAIuD,EAAWvD,IAAK,CAC9B,IAAK6B,EAAI,EAAGA,EAAI6B,EAAY7B,IAC1BoE,EAAIgC,KAAO5B,EAAarG,EAAK6B,EAAI0B,GAGnC,IAAK1B,EAAI,EAAGA,EAAI8B,EAAY9B,IAC1BoE,EAAIgC,KAAO5B,EAAc3C,EAAaH,EAAavD,EAAK6B,GAAK0B,EAAY,IAI7E,IAAK1B,EAAI,EAAGA,EAAI8B,EAAY9B,IAC1BoE,EAAIgC,KAAO5B,EAAc3C,EAAaH,EAAavD,EAAK6B,GAAK0B,EAAY,IAG3E,IAAKvD,EAAI,EAAGA,EAAIwD,EAAUxD,IACxB,IAAK6B,EAAI,EAAGA,EAAI6B,EAAaC,EAAY9B,IACvCoE,EAAIgC,KAAO5B,EAAauB,EAAY5H,EAAK6B,EAAI2B,GAIjDlE,KAAK+E,cAAgB4B,GAGvBnB,kBAAmB,WACjB,IAAI9E,EAAG2F,EAAGC,EACN8B,EAAUpI,KAAK8E,SACf/C,EAAQ/B,KAAK+B,MAEjB,GAAIqG,EAAU,EAIZ,IAHA1H,EAAIkI,EAAUvF,MAAM+E,GACpB9B,EAAIvE,EAAQ,IAEH,CAGP,IAFAsE,EAAItE,EAAQ,EAELsE,EAAI3F,EAAI,IACbV,KAAKoG,cAAcC,EAAGC,KAElBD,EAAI3F,KAIR2F,GAAK3F,EAGP,GAAI4F,GAAK5F,EAAI,EACX,MAGF4F,GAAK5F,EAELV,KAAKoG,cAAc,EAAGE,GACtBtG,KAAKoG,cAAcE,EAAG,KAK5Bf,eAAgB,WACd,IAAI7E,EAAG6B,EAAG8D,EAAGC,EACTxD,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAEjB,IAAKrB,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAatB,IAZA6B,EAAI,EACJ+D,EAAI,EAEM,IAAN5F,IACF6B,EAAIR,EAAQ,GAEJ,IAANrB,IACF4F,EAAIvE,EAAQ,GAGde,EAAOwD,EAAI,EAAKvE,GAASQ,EAAI,IAAO,EAE/B8D,EAAI,EAAGA,EAAI,EAAGA,IACjBvD,EAAOwD,EAAID,EAAKtE,EAAQQ,GAAM,EAC9BO,EAAOwD,EAAKvE,GAASQ,EAAI8D,EAAI,IAAO,EACpCvD,EAAOwD,EAAI,EAAKvE,GAASQ,EAAI8D,IAAO,EACpCvD,EAAOwD,EAAID,EAAI,EAAKtE,GAASQ,EAAI,IAAO,EAG1C,IAAK8D,EAAI,EAAGA,EAAI,EAAGA,IACjBrG,KAAKuG,SAASD,EAAID,EAAG9D,EAAI,GACzBvC,KAAKuG,SAASD,EAAI,EAAG/D,EAAI8D,EAAI,GAC7BrG,KAAKuG,SAASD,EAAI,EAAG/D,EAAI8D,GACzBrG,KAAKuG,SAASD,EAAID,EAAI,EAAG9D,EAAI,GAG/B,IAAK8D,EAAI,EAAGA,EAAI,EAAGA,IACjBvD,EAAOwD,EAAID,EAAKtE,GAASQ,EAAI,IAAO,EACpCO,EAAOwD,EAAI,EAAKvE,GAASQ,EAAI8D,EAAI,IAAO,EACxCvD,EAAOwD,EAAI,EAAKvE,GAASQ,EAAI8D,IAAO,EACpCvD,EAAOwD,EAAID,EAAI,EAAKtE,GAASQ,EAAI,IAAO,IAK9CkD,iBAAkB,WAChB,IAAIY,EAAGC,EACHvE,EAAQ/B,KAAK+B,MAEjB,IAAKuE,EAAI,EAAGA,EAAI,EAAGA,IACjBtG,KAAKuG,SAAS,EAAGD,GACjBtG,KAAKuG,SAASxE,EAAQ,EAAGuE,GACzBtG,KAAKuG,SAAS,EAAGD,EAAIvE,EAAQ,GAG/B,IAAKsE,EAAI,EAAGA,EAAI,EAAGA,IACjBrG,KAAKuG,SAASF,EAAG,GACjBrG,KAAKuG,SAASF,EAAItE,EAAQ,EAAG,GAC7B/B,KAAKuG,SAASF,EAAGtE,EAAQ,IAI7B4D,0BAA2B,WACzB,IAAIU,EACAvD,EAAS9C,KAAK8C,OACdf,EAAQ/B,KAAK+B,MAEjB,IAAKsE,EAAI,EAAGA,EAAItE,EAAQ,GAAIsE,IAClB,EAAJA,GACFrG,KAAKuG,SAAS,EAAIF,EAAG,GACrBrG,KAAKuG,SAAS,EAAG,EAAIF,KAErBvD,EAAO,EAAIuD,EAAa,EAARtE,GAAc,EAC9Be,EAAO,EAAKf,GAAS,EAAIsE,IAAO,IAKtCT,eAAgB,WACd,IAAIlF,EAAG6B,EAAG8D,EAAGC,EACTxD,EAAS9C,KAAK8C,OACdsF,EAAUpI,KAAK8E,SACf/C,EAAQ/B,KAAK+B,MAEjB,GAAIqG,EAAU,EAIZ,IAHA1H,EAAImI,EAAQxF,MAAM+E,EAAU,GAC5B7F,EAAI,GAEC8D,EAAI,EAAGA,EAAI,EAAGA,IACjB,IAAKC,EAAI,EAAGA,EAAI,EAAGA,IAAK/D,IAClB,GAAKA,EAAI,GAAK6F,GAAW7F,EAAI,GAAK7B,GAAK6B,IACzCO,EAAO,EAAIuD,EAAKtE,GAAS,EAAIuE,EAAIvE,EAAQ,KAAQ,EACjDe,EAAO,EAAIwD,EAAIvE,EAAQ,GAAMA,GAAS,EAAIsE,IAAO,IAEjDrG,KAAKuG,SAAS,EAAIF,EAAG,EAAIC,EAAIvE,EAAQ,IACrC/B,KAAKuG,SAAS,EAAID,EAAIvE,EAAQ,GAAI,EAAIsE,KAOhDkB,UAAW,SAASlB,EAAGC,GACrB,IAAIO,EAAM9C,EAAM+E,YAAYzC,EAAGC,GAE/B,OAA2B,IAApBtG,KAAKsF,MAAMuB,IAGpBX,MAAO,WACL,IAAIW,EAAKnG,EAAG6B,EACRoG,EAAI,EACJI,EAAI,EACJhH,EAAQ/B,KAAK+B,MACbsE,EAAItE,EAAQ,EACZuE,EAAIvE,EAAQ,EAGZpB,GAAWX,KAAKgF,WAAahF,KAAKiF,YAAcjF,KAAKkF,YAAclF,KAAKmF,aAAgBnF,KAAKmF,YAEjG,IAAKzE,EAAI,EAAGA,EAAIC,EAAQD,IAGtB,IAFAmG,EAAM7G,KAAK+E,cAAcrE,GAEpB6B,EAAI,EAAGA,EAAI,EAAGA,IAAKsE,IAAQ,EAAG,CAC7B,IAAOA,IACT7G,KAAK8C,OAAOuD,EAAKtE,EAAQuE,GAAM,GAIjC,GACMyC,EACF1C,KAEAA,IAEIsC,EACQ,IAANrC,EACFA,KAGAqC,GAAKA,EAEK,KAHVtC,GAAK,KAIHA,IACAC,EAAI,IAGCA,IAAMvE,EAAQ,EACvBuE,KAGAqC,GAAKA,EAEK,KAHVtC,GAAK,KAIHA,IACAC,GAAK,KAKXyC,GAAKA,QACE/I,KAAKuH,UAAUlB,EAAGC,MAKjCZ,aAAc,WACZ,IAAIW,EAAGC,EACHvE,EAAQ/B,KAAK+B,MAEjB,IAAKsE,EAAI,EAAGA,EAAI,EAAGA,IACjBrG,KAAKuG,SAASF,EAAG,GAGnB,IAAKA,EAAI,EAAGA,EAAI,EAAGA,IACjBrG,KAAKuG,SAASF,EAAItE,EAAQ,EAAG,GAC7B/B,KAAKuG,SAAS,EAAGF,GAGnB,IAAKC,EAAI,EAAGA,EAAI,EAAGA,IACjBtG,KAAKuG,SAAS,EAAGD,EAAIvE,EAAQ,IAIjCwE,SAAU,SAASF,EAAGC,GACpB,IAAIO,EAAM9C,EAAM+E,YAAYzC,EAAGC,GAE/BtG,KAAKsF,MAAMuB,GAAO,GAGpBhB,UAAW,WACT,IAAIQ,EAAGC,EACHvE,EAAQ/B,KAAK+B,MAEjB,IAAKuE,EAAI,EAAGA,EAAIvE,EAAOuE,IACrB,IAAKD,EAAI,EAAGA,GAAKC,EAAGD,IACdrG,KAAK8C,OAAOuD,EAAKtE,EAAQuE,IAC3BtG,KAAKuG,SAASF,EAAGC,MAQzBlB,aAAc,SAASzE,GACrB,IAAID,EACAsI,KAEJ,IAAKtI,EAAI,EAAGA,EAAIC,EAAQD,IACtBsI,EAAMtI,GAAK,EAGb,OAAOsI,GAGTF,YAAa,SAASzC,EAAGC,GACvB,IAAIO,EAaJ,OAXIR,EAAIC,IACNO,EAAMR,EACNA,EAAIC,EACJA,EAAIO,GAGNA,EAAMP,EACNO,GAAOP,EAAIA,EACXO,IAAQ,EACRA,GAAOR,GAKTY,MAAO,SAASZ,GACd,KAAOA,GAAK,KAEVA,IADAA,GAAK,MACK,IAAU,IAAJA,GAGlB,OAAOA,GAITmC,GAAI,EACJV,GAAI,EACJW,GAAI,GACJN,GAAI,OAIWpE,ICr2BGzB,EAAS3C,QAK3B0B,KAAM,WACJrB,KAAKkB,QAAQ+H,IAAMjJ,KAAKiB,OAAOiI,aAMjC7G,MAAO,WACLrC,KAAKkB,QAAQ+H,IAAM,IAMrB7G,OAAQ,WACN,IAAIlB,EAAUlB,KAAKkB,QAEnBA,EAAQa,MAAQb,EAAQkC,OAASpD,KAAKiB,OAAOa,UCXpCf,EAAMpB,OAAO,SAASC,EAAMuJ,EAAYC,EAAcC,GAQjErJ,KAAKJ,KAAOA,EASZI,KAAKmJ,WAAa/H,QAAQ+H,GAS1BnJ,KAAKoJ,aAAeA,EAEpBpJ,KAAKsJ,kBAAoBD,IAczBE,UAAW,SAAShF,GAClB,IAAIiF,EAAcxJ,KAAKsJ,kBACvB,MAA2B,mBAAhBE,EACFA,EAAYjF,EAAOvE,MAGrBuE,OC9DKxD,EAAMpB,OAAO,MAe3B8J,IAAK,SAASlF,GACZ,OAAgB,MAATA,EAAgB3C,KAAK6H,IAAIlF,GAAS,MAc3CmF,OAAQ,SAASC,EAAQ/J,GACvB,OAAOL,OAAOH,UAAU0B,eAAeD,KAAK8I,EAAQ/J,IAWtDgK,KAAM,aAWNC,YAAa,SAASC,GACpB,OAAiB,MAAVA,EAAiBA,EAAOD,cAAgB,QCjD/CE,EAAgBhJ,EAAMpB,OAAO,SAASqE,GAQxChE,KAAKgE,WAELA,EAAQgG,QAAQ,SAASC,GACvBjK,KAAKgE,QAAQiG,EAAOrK,MAAQqK,GAC3BjK,QAYHkK,OAAQ,SAAStK,GACf,OAA6B,MAAtBI,KAAKgE,QAAQpE,IAYtBuK,IAAK,SAASvK,EAAMU,GAClB,OAAOyJ,EAAcK,KAAKpK,KAAKgE,QAAQpE,GAAOU,IAWhD+J,OAAQ,SAAS/J,GACf,IAAIV,EACAoE,EAAUhE,KAAKgE,QACf1E,KAEJ,IAAKM,KAAQoE,EACPsG,EAAUZ,OAAO1F,EAASpE,KAC5BN,EAAOM,GAAQmK,EAAcK,KAAKpG,EAAQpE,GAAOU,IAIrD,OAAOhB,GA0BTiL,KAAM,SAASvG,EAAS1D,EAAQkK,GACD,mBAAlBA,IACTA,EAAgBF,EAAUV,MAG5B,IAAIhK,EAAMqK,EAEV,IAAKrK,KAAQI,KAAKgE,QACZsG,EAAUZ,OAAO1J,KAAKgE,QAASpE,KACjCqK,EAASjK,KAAKgE,QAAQpE,GAEtBmK,EAAcU,KAAKR,EAAQA,EAAOb,aAAc9I,GAChDyJ,EAAcW,gBAAgBT,EAAQ3J,EAAQkK,IAIlDxK,KAAK2K,QAAQ3G,EAAS1D,GAAQ,IAyBhCsK,IAAK,SAAShL,EAAM2E,EAAOjE,GACzB,OAAON,KAAKyK,KAAK7K,EAAM2E,EAAOjE,IAyBhCuK,OAAQ,SAAS7G,EAAS1D,GACxB,OAAON,KAAK2K,QAAQ3G,EAAS1D,IAG/BmK,KAAM,SAAS7K,EAAM2E,EAAOjE,EAAQwK,GAClC,IAAIb,EAASjK,KAAKgE,QAAQpE,GAC1B,IAAKqK,EACH,MAAM,IAAIc,MAAM,mBAAqBnL,GAEvC,IAAKqK,EAAOd,aAAe2B,EACzB,MAAM,IAAIC,MAAM,8BAAgCnL,GAGlD,OAAOmK,EAAcU,KAAKR,EAAQ1F,EAAOjE,IAG3CqK,QAAS,SAAS3G,EAAS1D,EAAQwK,GACjC,IAAK9G,EACH,OAAO,EAGT,IAAIpE,EACAoL,GAAU,EAEd,IAAKpL,KAAQoE,EACPsG,EAAUZ,OAAO1F,EAASpE,IAASI,KAAKyK,KAAK7K,EAAMoE,EAAQpE,GAAOU,EAAQwK,KAC5EE,GAAU,GAId,OAAOA,KAKTN,gBAAiB,SAAST,EAAQ3J,EAAQkK,GACxC,IAAIS,GACFd,IAAK,WACH,OAAOJ,EAAcK,KAAKH,EAAQ3J,KAIlC2J,EAAOd,aACT8B,EAAWL,IAAM,SAASrG,GACpBwF,EAAcU,KAAKR,EAAQ1F,EAAOjE,IACpCkK,EAAcjG,EAAO0F,KAK3B1K,OAAO2L,eAAe5K,EAAQ2J,EAAOrK,KAAMqL,IAG7Cb,KAAM,SAASH,EAAQ3J,GACrB,OAAOA,EAAO,IAAM2J,EAAOrK,OAG7B6K,KAAM,SAASR,EAAQ1F,EAAOjE,GAC5B,IAAI6K,EAAY,IAAMlB,EAAOrK,KACzBwL,EAAW9K,EAAO6K,GAClBE,EAAWpB,EAAOV,UAAmB,MAAThF,EAAgBA,EAAQ0F,EAAOb,cAI/D,OAFA9I,EAAO6K,GAAaE,EAEbA,IAAaD,OAKPrB,ICnOIhJ,EAAMpB,OAAO,WAChCK,KAAKsL,eAYLC,WAAY,SAAS3L,GACnB,IAAI4L,EAAUxL,KAAKsL,UAAU1L,GAC7B,IAAK4L,EACH,MAAM,IAAIT,MAAM,2CAA6CnL,GAG/D,OAAO4L,GAcTC,WAAY,SAAS7L,EAAM4L,GACzB,GAAIxL,KAAKsL,UAAU1L,GACjB,MAAM,IAAImL,MAAM,yCAA2CnL,GAGzD4L,IACFxL,KAAKsL,UAAU1L,GAAQ4L,MCtCzBE,EAAgB,IAAI3B,GACtB,IAAI4B,EAAO,cAAc,EAAM,SAC/B,IAAIA,EAAO,mBAAmB,EAAM,EAAGrB,EAAUb,KACjD,IAAIkC,EAAO,WACX,IAAIA,EAAO,cAAc,EAAM,SAC/B,IAAIA,EAAO,mBAAmB,EAAM,EAAGrB,EAAUb,KACjD,IAAIkC,EAAO,SAAS,EAAM,IAAKrB,EAAUT,aACzC,IAAI8B,EAAO,QAAQ,EAAM,aACzB,IAAIA,EAAO,WAAW,EAAM,KAAMrB,EAAUb,KAC5C,IAAIkC,EAAO,QAAQ,EAAM,IAAKrB,EAAUb,KACxC,IAAIkC,EAAO,SAAS,EAAM,MAExBC,EAAiB,IAAIC,EAWrBC,EAAS/K,EAAMpB,OAAO,SAASqE,GACjC0H,EAAcnB,KAAKvG,EAAShE,KAAMA,KAAK+L,OAAOC,KAAKhM,OAEnD,IAAIkB,EAAUwK,EAAcvB,IAAI,UAAWnK,MACvCiM,EAAiBL,EAAeL,WAAW,WAC3CW,EAAShL,GAAW+K,EAAeE,SAASjL,GAAWA,EAAU+K,EAAeG,eAChFC,EAAQnL,GAAW+K,EAAeK,QAAQpL,GAAWA,EAAU+K,EAAeM,cAElFvM,KAAKwM,gBAAkB,IAAIC,EAAezM,KAAMkM,GAAQ,GACxDlM,KAAK0M,eAAiB,IAAIC,EAAc3M,KAAMqM,EAAOA,IAAUnL,GAE/DlB,KAAK+L,WAaL5B,IAAK,WACH,OAAOuB,EAAcrB,OAAOrK,OAgB9B4K,IAAK,SAAS5G,GACR0H,EAAcb,OAAO7G,EAAShE,OAChCA,KAAK+L,UAYT7C,UAAW,SAAS0D,GAClB,OAAO5M,KAAKkM,OAAOhD,UAAU0D,GAAQ5M,KAAK4M,OAU5Cb,OAAQ,WACN,IAAIzK,EAAQ,IAAIyC,GACdY,MAAO3E,KAAK2E,MACZJ,MAAOvE,KAAKuE,QAGdvE,KAAKwM,gBAAgBhL,OAAOF,GAC5BtB,KAAK0M,eAAelL,OAAOF,MAe7BuL,IAAK,SAASrB,GACZI,EAAeH,WAAWD,EAAQsB,UAAWtB,MAKjDjM,OAAOwN,iBAAiBjB,EAAO1M,WAE7B8M,QASE/B,IAAK,WACH,OAAOnK,KAAKwM,gBAAgBjL,eAIhC8K,OASElC,IAAK,WACH,OAAOnK,KAAK0M,eAAenL,uBAMhBuK,ICtJH/K,EAAMpB,QAUlBmN,QAAS,eCVkBnN,QAY3ByM,aAAc,aAYdG,YAAa,aAKbO,QAAS,WACP,MAAO,WAcTX,SAAU,SAASjL,KAanBoL,QAAS,SAASpL,OCzDuBvB,QAKzCyM,aAAc,WACZ,OAAOY,SAASC,cAAc,WAMhCV,YAAa,WACX,OAAOS,SAASC,cAAc,QAMhCd,SAAU,SAASjL,GACjB,OAAOA,aAAmBgM,mBAM5BZ,QAAS,SAASpL,GAChB,OAAOA,aAAmBiM,6BChCvBN,IAAI,IAAIO,GAEEtB"} \ No newline at end of file
diff --git a/template/index.html.j2 b/template/index.html.j2
index ba86785..aec0808 100644
--- a/template/index.html.j2
+++ b/template/index.html.j2
@@ -1,7 +1,9 @@
<!DOCTYPE html>
-<html lang="{{ lang }}"> <head> <meta charset="utf-8"/> <title>{{ _("{curr}
- Auditor").format(curr=conf['currency']) }}</title>
- <script> /* @licstart The following is the entire license
+<html lang="{{ lang }}">
+ <head>
+ <meta charset="utf-8"/>
+ <title>{{ _("{curr} Auditor").format(curr=conf['currency']) }}</title>
+ <script> /* @licstart The following is the entire license
notice for the JavaScript code in this page.
Copyright (C) 2014, 2015, 2016, 2020, 2021 Taler Systems SA
@@ -21,9 +23,10 @@
recipients can access the Corresponding Source.
@licend The above is the entire license notice for the JavaScript code
- in this page. */ </script> <link rel="alternate" hreflang="en"
- href="{{ self_localized('en') }}" /> <link rel="alternate"
- hreflang="de" href="{{ self_localized('de') }}" />
+ in this page. */
+ </script>
+ <link rel="alternate" hreflang="en" href="{{ self_localized('en') }}" />
+ <link rel="alternate" hreflang="de" href="{{ self_localized('de') }}" />
<!--
<link rel="alternate" hreflang="ar" href="{{ self_localized('ar') }}" />
<link rel="alternate" hreflang="zh-hant" href="{{ self_localized('zh_Hant')
@@ -43,14 +46,15 @@
self_localized('tr') }}" />
-->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="author" content="">
<!-- Bootstrap core CSS -->
- <link href="{{ url_dist('bootstrap@4.6.0/bootstrap.min.css') }}"
- rel="stylesheet">
+ <link href="{{ url_dist('bootstrap@4.6.0/bootstrap.min.css') }}" rel="stylesheet">
<!-- Custom styles for this template -->
- <link href="{{ url_static('styles.css') }}" rel="stylesheet"> <script
- src="{{ url_dist('bootstrap@4.6.0/jquery-3.5.1.slim.min.js')
- }}"></script> <script src="{{
- url_dist('bootstrap@4.6.0/bootstrap.bundle.min.js') }}"></script>
+ <link href="{{ url_static('styles.css') }}" rel="stylesheet">
+ <script src="{{ url_dist('bootstrap@4.6.0/jquery-3.5.1.slim.min.js') }}"></script>
+ <script src="{{ url_dist('bootstrap@4.6.0/bootstrap.bundle.min.js') }}"></script>
+ <script src="{{ url_dist('qrious@4.0.2/qrious.min.js') }}"></script>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media
queries -->
<!--[if lt IE 9]>
@@ -61,18 +65,11 @@
<![endif]-->
</head>
-<body>
- <header class="demobar" style="display: flex; flex-direction: row; justify-content: space-between;">
- <div style="max-width: 50em; margin-left: 2em;">
- <h1><span class="it">{{ _("{curr} Auditor").format(curr=conf['currency']) }}</span></h1>
- <p>
- {{ _("This is an auditor for the {curr} currency.").format(curr=conf['currency']) }}
- </p>
- </div>
- </header>
-
- <nav class="demolist">
- <div class="nav-item dropdown">
+<body id="mybody">
+ <nav class="navbar navbar-expand-lg navbar-light">
+ <div class="navbar-nav mr-auto">
+ </div>
+ <div class="nav-item dropdown">
<button class="btn btn-dark dropdown-toggle"
type="button"
id="dropdownMenu1"
@@ -134,30 +131,64 @@
</div>
</nav>
- <section id="main" class="content">
- <p>
- {{ _("This is the Web site of the auditor for the {curr} currency.").format(curr=conf['currency']) }}
- {% trans %}
- In the GNU Taler system, an auditor is responsible for verifying
- that an exchange operates correctly. If you trust us to do a good
- job auditing, please click here:
- {% endtrans %}
- </p>
- <div style="text-align: center;">
- <button class="pure-button pure-button-primary" style="text-allign: center;">{{ _("Add Auditor") }}</button>
+ <div id="body_content">
+ <div class="container">
+ <div class="row justify-content-center">
+ <div>
+ <h1><span class="it">{{ _("{curr} Auditor").format(curr=conf['currency']) }}</span></h1>
+ </div>
+ </div>
+ <div class="row justify-content-center">
+ <div>
+ <p>
+ {{ _("This is an auditor for the {curr} currency.").format(curr=conf['currency']) }}
+ </p>
+ </div>
+ </div>
+ <div class="row mt-1">
</div>
- <p>
- {{ _("This will tell your wallet that you are willing to trust exchanges that we audit to handle the {curr} currency properly.").format(curr=conf['currency']) }}
- </p>
- <p>
- {% trans %}
- If you do not have a Taler wallet installed, please
- first install the wallet from <a href="https://wallet.taler.net/">wallet installation page</a>.
- It only takes one click.
- {% endtrans %}
- </p>
</div>
-</section>
+
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-24">
+ <p>
+ {{ _("This is the Web site of the auditor for the {curr} currency.").format(curr=conf['currency']) }}
+ {% trans %}
+ In the GNU Taler system, an auditor is responsible for verifying
+ that an exchange operates correctly. If you trust us to do a good
+ job auditing, please scan the following QR code or open the link:
+ {% endtrans %}
+ </p>
+
+ <div style="text-align: center;">
+ <canvas id="qr"></canvas>
+ </div>
+ <div style="text-align: center;">
+ <a href="{{ "{uri}".format(uri=conf['auditor_uri']) }}">
+ {{ "{uri}".format(uri=conf['auditor_uri']) }}
+ </a>
+ </div>
+ <p>
+ {{ _("This will tell your wallet that you are willing to trust exchanges that we audit to handle the {curr} currency properly.").format(curr=conf['currency']) }}
+ </p>
+ <p>
+ {% trans %}
+ If you do not have a Taler wallet installed, please
+ first install the wallet from <a href="https://wallet.taler.net/">wallet installation page</a>.
+ It only takes one click.
+ {% endtrans %}
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script>
+ var qr = new QRious({
+ element: document.getElementById('qr'),
+ value: '{auditor_uri}'
+ });
+ </script>
<footer id="footer">
<div class="container">
diff --git a/www.yml b/www.yml
index b82224a..d4e4d14 100644
--- a/www.yml
+++ b/www.yml
@@ -1,6 +1,6 @@
currency: KUDOS
auditor_url: https://auditor.taler.net/
-auditor_pub: KEY
+auditor_uri: taler://auditor/auditor.taler.net/
siteconf:
- baseurl: auditor.taler.net
langs_full: &langs