You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wownero.org-website/wownero-wallet-generator.html

11137 lines
813 KiB

2 years ago
<html>
<!--
/*
JavaScript BigInteger library version 0.9
http://silentmatt.com/biginteger/
Copyright (c) 2009 Matthew Crumley <email@matthewcrumley.com>
Copyright (c) 2010,2011 by John Tobey <John.Tobey@gmail.com>
Licensed under the MIT license.
Support for arbitrary internal representation base was added by
Vitaly Magerya.
*/
// Copyright (c) 2014-2015, MyMonero.com
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Original Author: Lucas Jones
/*!
* Waves v0.6.0
* http://fian.my.id/Waves
*
* Copyright 2014 Alfiana E. Sibuea and other contributors
* Released under the MIT license
* https://github.com/fians/Waves/blob/master/LICENSE
*/
/*
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
/*
* js-sha3 v0.5.1
* https://github.com/emn178/js-sha3
*
* Copyright 2015, emn178@gmail.com
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
/* Wallet generator modifications: Copyright 2015 moneromooo */
-->
<head>
<title>Wownero wallet generator</title>
<meta charset="UTF-8">
<style type="text/css">
html {
line-height: 1.3;
}
.private {
background-color: #FF8080
}
.public {
background-color: #80FF80
}
.card {
margin: 0.5rem 0px 0.5rem !important;
}
.card .card-content {
padding: 10px !important;
}
.row {
margin-bottom: 10px !important;
}
pre { margin:0px;}
</style>
<style>
.materialize-red.lighten-5 {
background-color: #fdeaeb !important;
}
.materialize-red-text.text-lighten-5 {
color: #fdeaeb !important;
}
.materialize-red.lighten-4 {
background-color: #f8c1c3 !important;
}
.materialize-red-text.text-lighten-4 {
color: #f8c1c3 !important;
}
.materialize-red.lighten-3 {
background-color: #f3989b !important;
}
.materialize-red-text.text-lighten-3 {
color: #f3989b !important;
}
.materialize-red.lighten-2 {
background-color: #ee6e73 !important;
}
.materialize-red-text.text-lighten-2 {
color: #ee6e73 !important;
}
.materialize-red.lighten-1 {
background-color: #ea454b !important;
}
.materialize-red-text.text-lighten-1 {
color: #ea454b !important;
}
.materialize-red {
background-color: #e51c23 !important;
}
.materialize-red-text {
color: #e51c23 !important;
}
.materialize-red.darken-1 {
background-color: #d0181e !important;
}
.materialize-red-text.text-darken-1 {
color: #d0181e !important;
}
.materialize-red.darken-2 {
background-color: #b9151b !important;
}
.materialize-red-text.text-darken-2 {
color: #b9151b !important;
}
.materialize-red.darken-3 {
background-color: #a21318 !important;
}
.materialize-red-text.text-darken-3 {
color: #a21318 !important;
}
.materialize-red.darken-4 {
background-color: #8b1014 !important;
}
.materialize-red-text.text-darken-4 {
color: #8b1014 !important;
}
.red.lighten-5 {
background-color: #FFEBEE !important;
}
.red-text.text-lighten-5 {
color: #FFEBEE !important;
}
.red.lighten-4 {
background-color: #FFCDD2 !important;
}
.red-text.text-lighten-4 {
color: #FFCDD2 !important;
}
.red.lighten-3 {
background-color: #EF9A9A !important;
}
.red-text.text-lighten-3 {
color: #EF9A9A !important;
}
.red.lighten-2 {
background-color: #E57373 !important;
}
.red-text.text-lighten-2 {
color: #E57373 !important;
}
.red.lighten-1 {
background-color: #EF5350 !important;
}
.red-text.text-lighten-1 {
color: #EF5350 !important;
}
.red {
background-color: #F44336 !important;
}
.red-text {
color: #F44336 !important;
}
.red.darken-1 {
background-color: #E53935 !important;
}
.red-text.text-darken-1 {
color: #E53935 !important;
}
.red.darken-2 {
background-color: #D32F2F !important;
}
.red-text.text-darken-2 {
color: #D32F2F !important;
}
.red.darken-3 {
background-color: #C62828 !important;
}
.red-text.text-darken-3 {
color: #C62828 !important;
}
.red.darken-4 {
background-color: #B71C1C !important;
}
.red-text.text-darken-4 {
color: #B71C1C !important;
}
.red.accent-1 {
background-color: #FF8A80 !important;
}
.red-text.text-accent-1 {
color: #FF8A80 !important;
}
.red.accent-2 {
background-color: #FF5252 !important;
}
.red-text.text-accent-2 {
color: #FF5252 !important;
}
.red.accent-3 {
background-color: #FF1744 !important;
}
.red-text.text-accent-3 {
color: #FF1744 !important;
}
.red.accent-4 {
background-color: #D50000 !important;
}
.red-text.text-accent-4 {
color: #D50000 !important;
}
.pink.lighten-5 {
background-color: #fce4ec !important;
}
.pink-text.text-lighten-5 {
color: #fce4ec !important;
}
.pink.lighten-4 {
background-color: #f8bbd0 !important;
}
.pink-text.text-lighten-4 {
color: #f8bbd0 !important;
}
.pink.lighten-3 {
background-color: #f48fb1 !important;
}
.pink-text.text-lighten-3 {
color: #f48fb1 !important;
}
.pink.lighten-2 {
background-color: #f06292 !important;
}
.pink-text.text-lighten-2 {
color: #f06292 !important;
}
.pink.lighten-1 {
background-color: #ec407a !important;
}
.pink-text.text-lighten-1 {
color: #ec407a !important;
}
.pink {
background-color: #e91e63 !important;
}
.pink-text {
color: #e91e63 !important;
}
.pink.darken-1 {
background-color: #d81b60 !important;
}
.pink-text.text-darken-1 {
color: #d81b60 !important;
}
.pink.darken-2 {
background-color: #c2185b !important;
}
.pink-text.text-darken-2 {
color: #c2185b !important;
}
.pink.darken-3 {
background-color: #ad1457 !important;
}
.pink-text.text-darken-3 {
color: #ad1457 !important;
}
.pink.darken-4 {
background-color: #880e4f !important;
}
.pink-text.text-darken-4 {
color: #880e4f !important;
}
.pink.accent-1 {
background-color: #ff80ab !important;
}
.pink-text.text-accent-1 {
color: #ff80ab !important;
}
.pink.accent-2 {
background-color: #ff4081 !important;
}
.pink-text.text-accent-2 {
color: #ff4081 !important;
}
.pink.accent-3 {
background-color: #f50057 !important;
}
.pink-text.text-accent-3 {
color: #f50057 !important;
}
.pink.accent-4 {
background-color: #c51162 !important;
}
.pink-text.text-accent-4 {
color: #c51162 !important;
}
.purple.lighten-5 {
background-color: #f3e5f5 !important;
}
.purple-text.text-lighten-5 {
color: #f3e5f5 !important;
}
.purple.lighten-4 {
background-color: #e1bee7 !important;
}
.purple-text.text-lighten-4 {
color: #e1bee7 !important;
}
.purple.lighten-3 {
background-color: #ce93d8 !important;
}
.purple-text.text-lighten-3 {
color: #ce93d8 !important;
}
.purple.lighten-2 {
background-color: #ba68c8 !important;
}
.purple-text.text-lighten-2 {
color: #ba68c8 !important;
}
.purple.lighten-1 {
background-color: #ab47bc !important;
}
.purple-text.text-lighten-1 {
color: #ab47bc !important;
}
.purple {
background-color: #9c27b0 !important;
}
.purple-text {
color: #9c27b0 !important;
}
.purple.darken-1 {
background-color: #8e24aa !important;
}
.purple-text.text-darken-1 {
color: #8e24aa !important;
}
.purple.darken-2 {
background-color: #7b1fa2 !important;
}
.purple-text.text-darken-2 {
color: #7b1fa2 !important;
}
.purple.darken-3 {
background-color: #6a1b9a !important;
}
.purple-text.text-darken-3 {
color: #6a1b9a !important;
}
.purple.darken-4 {
background-color: #4a148c !important;
}
.purple-text.text-darken-4 {
color: #4a148c !important;
}
.purple.accent-1 {
background-color: #ea80fc !important;
}
.purple-text.text-accent-1 {
color: #ea80fc !important;
}
.purple.accent-2 {
background-color: #e040fb !important;
}
.purple-text.text-accent-2 {
color: #e040fb !important;
}
.purple.accent-3 {
background-color: #d500f9 !important;
}
.purple-text.text-accent-3 {
color: #d500f9 !important;
}
.purple.accent-4 {
background-color: #aa00ff !important;
}
.purple-text.text-accent-4 {
color: #aa00ff !important;
}
.deep-purple.lighten-5 {
background-color: #ede7f6 !important;
}
.deep-purple-text.text-lighten-5 {
color: #ede7f6 !important;
}
.deep-purple.lighten-4 {
background-color: #d1c4e9 !important;
}
.deep-purple-text.text-lighten-4 {
color: #d1c4e9 !important;
}
.deep-purple.lighten-3 {
background-color: #b39ddb !important;
}
.deep-purple-text.text-lighten-3 {
color: #b39ddb !important;
}
.deep-purple.lighten-2 {
background-color: #9575cd !important;
}
.deep-purple-text.text-lighten-2 {
color: #9575cd !important;
}
.deep-purple.lighten-1 {
background-color: #7e57c2 !important;
}
.deep-purple-text.text-lighten-1 {
color: #7e57c2 !important;
}
.deep-purple {
background-color: #673ab7 !important;
}
.deep-purple-text {
color: #673ab7 !important;
}
.deep-purple.darken-1 {
background-color: #5e35b1 !important;
}
.deep-purple-text.text-darken-1 {
color: #5e35b1 !important;
}
.deep-purple.darken-2 {
background-color: #512da8 !important;
}
.deep-purple-text.text-darken-2 {
color: #512da8 !important;
}
.deep-purple.darken-3 {
background-color: #4527a0 !important;
}
.deep-purple-text.text-darken-3 {
color: #4527a0 !important;
}
.deep-purple.darken-4 {
background-color: #311b92 !important;
}
.deep-purple-text.text-darken-4 {
color: #311b92 !important;
}
.deep-purple.accent-1 {
background-color: #b388ff !important;
}
.deep-purple-text.text-accent-1 {
color: #b388ff !important;
}
.deep-purple.accent-2 {
background-color: #7c4dff !important;
}
.deep-purple-text.text-accent-2 {
color: #7c4dff !important;
}
.deep-purple.accent-3 {
background-color: #651fff !important;
}
.deep-purple-text.text-accent-3 {
color: #651fff !important;
}
.deep-purple.accent-4 {
background-color: #6200ea !important;
}
.deep-purple-text.text-accent-4 {
color: #6200ea !important;
}
.indigo.lighten-5 {
background-color: #e8eaf6 !important;
}
.indigo-text.text-lighten-5 {
color: #e8eaf6 !important;
}
.indigo.lighten-4 {
background-color: #c5cae9 !important;
}
.indigo-text.text-lighten-4 {
color: #c5cae9 !important;
}
.indigo.lighten-3 {
background-color: #9fa8da !important;
}
.indigo-text.text-lighten-3 {
color: #9fa8da !important;
}
.indigo.lighten-2 {
background-color: #7986cb !important;
}
.indigo-text.text-lighten-2 {
color: #7986cb !important;
}
.indigo.lighten-1 {
background-color: #5c6bc0 !important;
}
.indigo-text.text-lighten-1 {
color: #5c6bc0 !important;
}
.indigo {
background-color: #3f51b5 !important;
}
.indigo-text {
color: #3f51b5 !important;
}
.indigo.darken-1 {
background-color: #3949ab !important;
}
.indigo-text.text-darken-1 {
color: #3949ab !important;
}
.indigo.darken-2 {
background-color: #303f9f !important;
}
.indigo-text.text-darken-2 {
color: #303f9f !important;
}
.indigo.darken-3 {
background-color: #283593 !important;
}
.indigo-text.text-darken-3 {
color: #283593 !important;
}
.indigo.darken-4 {
background-color: #1a237e !important;
}
.indigo-text.text-darken-4 {
color: #1a237e !important;
}
.indigo.accent-1 {
background-color: #8c9eff !important;
}
.indigo-text.text-accent-1 {
color: #8c9eff !important;
}
.indigo.accent-2 {
background-color: #536dfe !important;
}
.indigo-text.text-accent-2 {
color: #536dfe !important;
}
.indigo.accent-3 {
background-color: #3d5afe !important;
}
.indigo-text.text-accent-3 {
color: #3d5afe !important;
}
.indigo.accent-4 {
background-color: #304ffe !important;
}
.indigo-text.text-accent-4 {
color: #304ffe !important;
}
.blue.lighten-5 {
background-color: #E3F2FD !important;
}
.blue-text.text-lighten-5 {
color: #E3F2FD !important;
}
.blue.lighten-4 {
background-color: #BBDEFB !important;
}
.blue-text.text-lighten-4 {
color: #BBDEFB !important;
}
.blue.lighten-3 {
background-color: #90CAF9 !important;
}
.blue-text.text-lighten-3 {
color: #90CAF9 !important;
}
.blue.lighten-2 {
background-color: #64B5F6 !important;
}
.blue-text.text-lighten-2 {
color: #64B5F6 !important;
}
.blue.lighten-1 {
background-color: #42A5F5 !important;
}
.blue-text.text-lighten-1 {
color: #42A5F5 !important;
}
.blue {
background-color: #2196F3 !important;
}
.blue-text {
color: #2196F3 !important;
}
.blue.darken-1 {
background-color: #1E88E5 !important;
}
.blue-text.text-darken-1 {
color: #1E88E5 !important;
}
.blue.darken-2 {
background-color: #1976D2 !important;
}
.blue-text.text-darken-2 {
color: #1976D2 !important;
}
.blue.darken-3 {
background-color: #1565C0 !important;
}
.blue-text.text-darken-3 {
color: #1565C0 !important;
}
.blue.darken-4 {
background-color: #0D47A1 !important;
}
.blue-text.text-darken-4 {
color: #0D47A1 !important;
}
.blue.accent-1 {
background-color: #82B1FF !important;
}
.blue-text.text-accent-1 {
color: #82B1FF !important;
}
.blue.accent-2 {
background-color: #448AFF !important;
}
.blue-text.text-accent-2 {
color: #448AFF !important;
}
.blue.accent-3 {
background-color: #2979FF !important;
}
.blue-text.text-accent-3 {
color: #2979FF !important;
}
.blue.accent-4 {
background-color: #2962FF !important;
}
.blue-text.text-accent-4 {
color: #2962FF !important;
}
.light-blue.lighten-5 {
background-color: #e1f5fe !important;
}
.light-blue-text.text-lighten-5 {
color: #e1f5fe !important;
}
.light-blue.lighten-4 {
background-color: #b3e5fc !important;
}
.light-blue-text.text-lighten-4 {
color: #b3e5fc !important;
}
.light-blue.lighten-3 {
background-color: #81d4fa !important;
}
.light-blue-text.text-lighten-3 {
color: #81d4fa !important;
}
.light-blue.lighten-2 {
background-color: #4fc3f7 !important;
}
.light-blue-text.text-lighten-2 {
color: #4fc3f7 !important;
}
.light-blue.lighten-1 {
background-color: #29b6f6 !important;
}
.light-blue-text.text-lighten-1 {
color: #29b6f6 !important;
}
.light-blue {
background-color: #03a9f4 !important;
}
.light-blue-text {
color: #03a9f4 !important;
}
.light-blue.darken-1 {
background-color: #039be5 !important;
}
.light-blue-text.text-darken-1 {
color: #039be5 !important;
}
.light-blue.darken-2 {
background-color: #0288d1 !important;
}
.light-blue-text.text-darken-2 {
color: #0288d1 !important;
}
.light-blue.darken-3 {
background-color: #0277bd !important;
}
.light-blue-text.text-darken-3 {
color: #0277bd !important;
}
.light-blue.darken-4 {
background-color: #01579b !important;
}
.light-blue-text.text-darken-4 {
color: #01579b !important;
}
.light-blue.accent-1 {
background-color: #80d8ff !important;
}
.light-blue-text.text-accent-1 {
color: #80d8ff !important;
}
.light-blue.accent-2 {
background-color: #40c4ff !important;
}
.light-blue-text.text-accent-2 {
color: #40c4ff !important;
}
.light-blue.accent-3 {
background-color: #00b0ff !important;
}
.light-blue-text.text-accent-3 {
color: #00b0ff !important;
}
.light-blue.accent-4 {
background-color: #0091ea !important;
}
.light-blue-text.text-accent-4 {
color: #0091ea !important;
}
.cyan.lighten-5 {
background-color: #e0f7fa !important;
}
.cyan-text.text-lighten-5 {
color: #e0f7fa !important;
}
.cyan.lighten-4 {
background-color: #b2ebf2 !important;
}
.cyan-text.text-lighten-4 {
color: #b2ebf2 !important;
}
.cyan.lighten-3 {
background-color: #80deea !important;
}
.cyan-text.text-lighten-3 {
color: #80deea !important;
}
.cyan.lighten-2 {
background-color: #4dd0e1 !important;
}
.cyan-text.text-lighten-2 {
color: #4dd0e1 !important;
}
.cyan.lighten-1 {
background-color: #26c6da !important;
}
.cyan-text.text-lighten-1 {
color: #26c6da !important;
}
.cyan {
background-color: #00bcd4 !important;
}
.cyan-text {
color: #00bcd4 !important;
}
.cyan.darken-1 {
background-color: #00acc1 !important;
}
.cyan-text.text-darken-1 {
color: #00acc1 !important;
}
.cyan.darken-2 {
background-color: #0097a7 !important;
}
.cyan-text.text-darken-2 {
color: #0097a7 !important;
}
.cyan.darken-3 {
background-color: #00838f !important;
}
.cyan-text.text-darken-3 {
color: #00838f !important;
}
.cyan.darken-4 {
background-color: #006064 !important;
}
.cyan-text.text-darken-4 {
color: #006064 !important;
}
.cyan.accent-1 {
background-color: #84ffff !important;
}
.cyan-text.text-accent-1 {
color: #84ffff !important;
}
.cyan.accent-2 {
background-color: #18ffff !important;
}
.cyan-text.text-accent-2 {
color: #18ffff !important;
}
.cyan.accent-3 {
background-color: #00e5ff !important;
}
.cyan-text.text-accent-3 {
color: #00e5ff !important;
}
.cyan.accent-4 {
background-color: #00b8d4 !important;
}
.cyan-text.text-accent-4 {
color: #00b8d4 !important;
}
.teal.lighten-5 {
background-color: #e0f2f1 !important;
}
.teal-text.text-lighten-5 {
color: #e0f2f1 !important;
}
.teal.lighten-4 {
background-color: #b2dfdb !important;
}
.teal-text.text-lighten-4 {
color: #b2dfdb !important;
}
.teal.lighten-3 {
background-color: #80cbc4 !important;
}
.teal-text.text-lighten-3 {
color: #80cbc4 !important;
}
.teal.lighten-2 {
background-color: #4db6ac !important;
}
.teal-text.text-lighten-2 {
color: #4db6ac !important;
}
.teal.lighten-1 {
background-color: #26a69a !important;
}
.teal-text.text-lighten-1 {
color: #26a69a !important;
}
.teal {
background-color: #009688 !important;
}
.teal-text {
color: #009688 !important;
}
.teal.darken-1 {
background-color: #00897b !important;
}
.teal-text.text-darken-1 {
color: #00897b !important;
}
.teal.darken-2 {
background-color: #00796b !important;
}
.teal-text.text-darken-2 {
color: #00796b !important;
}
.teal.darken-3 {
background-color: #00695c !important;
}
.teal-text.text-darken-3 {
color: #00695c !important;
}
.teal.darken-4 {
background-color: #004d40 !important;
}
.teal-text.text-darken-4 {
color: #004d40 !important;
}
.teal.accent-1 {
background-color: #a7ffeb !important;
}
.teal-text.text-accent-1 {
color: #a7ffeb !important;
}
.teal.accent-2 {
background-color: #64ffda !important;
}
.teal-text.text-accent-2 {
color: #64ffda !important;
}
.teal.accent-3 {
background-color: #1de9b6 !important;
}
.teal-text.text-accent-3 {
color: #1de9b6 !important;
}
.teal.accent-4 {
background-color: #00bfa5 !important;
}
.teal-text.text-accent-4 {
color: #00bfa5 !important;
}
.green.lighten-5 {
background-color: #E8F5E9 !important;
}
.green-text.text-lighten-5 {
color: #E8F5E9 !important;
}
.green.lighten-4 {
background-color: #C8E6C9 !important;
}
.green-text.text-lighten-4 {
color: #C8E6C9 !important;
}
.green.lighten-3 {
background-color: #A5D6A7 !important;
}
.green-text.text-lighten-3 {
color: #A5D6A7 !important;
}
.green.lighten-2 {
background-color: #81C784 !important;
}
.green-text.text-lighten-2 {
color: #81C784 !important;
}
.green.lighten-1 {
background-color: #66BB6A !important;
}
.green-text.text-lighten-1 {
color: #66BB6A !important;
}
.green {
background-color: #4CAF50 !important;
}
.green-text {
color: #4CAF50 !important;
}
.green.darken-1 {
background-color: #43A047 !important;
}
.green-text.text-darken-1 {
color: #43A047 !important;
}
.green.darken-2 {
background-color: #388E3C !important;
}
.green-text.text-darken-2 {
color: #388E3C !important;
}
.green.darken-3 {
background-color: #2E7D32 !important;
}
.green-text.text-darken-3 {
color: #2E7D32 !important;
}
.green.darken-4 {
background-color: #1B5E20 !important;
}
.green-text.text-darken-4 {
color: #1B5E20 !important;
}
.green.accent-1 {
background-color: #B9F6CA !important;
}
.green-text.text-accent-1 {
color: #B9F6CA !important;
}
.green.accent-2 {
background-color: #69F0AE !important;
}
.green-text.text-accent-2 {
color: #69F0AE !important;
}
.green.accent-3 {
background-color: #00E676 !important;
}
.green-text.text-accent-3 {
color: #00E676 !important;
}
.green.accent-4 {
background-color: #00C853 !important;
}
.green-text.text-accent-4 {
color: #00C853 !important;
}
.light-green.lighten-5 {
background-color: #f1f8e9 !important;
}
.light-green-text.text-lighten-5 {
color: #f1f8e9 !important;
}
.light-green.lighten-4 {
background-color: #dcedc8 !important;
}
.light-green-text.text-lighten-4 {
color: #dcedc8 !important;
}
.light-green.lighten-3 {
background-color: #c5e1a5 !important;
}
.light-green-text.text-lighten-3 {
color: #c5e1a5 !important;
}
.light-green.lighten-2 {
background-color: #aed581 !important;
}
.light-green-text.text-lighten-2 {
color: #aed581 !important;
}
.light-green.lighten-1 {
background-color: #9ccc65 !important;
}
.light-green-text.text-lighten-1 {
color: #9ccc65 !important;
}
.light-green {
background-color: #8bc34a !important;
}
.light-green-text {
color: #8bc34a !important;
}
.light-green.darken-1 {
background-color: #7cb342 !important;
}
.light-green-text.text-darken-1 {
color: #7cb342 !important;
}
.light-green.darken-2 {
background-color: #689f38 !important;
}
.light-green-text.text-darken-2 {
color: #689f38 !important;
}
.light-green.darken-3 {
background-color: #558b2f !important;
}
.light-green-text.text-darken-3 {
color: #558b2f !important;
}
.light-green.darken-4 {
background-color: #33691e !important;
}
.light-green-text.text-darken-4 {
color: #33691e !important;
}
.light-green.accent-1 {
background-color: #ccff90 !important;
}
.light-green-text.text-accent-1 {
color: #ccff90 !important;
}
.light-green.accent-2 {
background-color: #b2ff59 !important;
}
.light-green-text.text-accent-2 {
color: #b2ff59 !important;
}
.light-green.accent-3 {
background-color: #76ff03 !important;
}
.light-green-text.text-accent-3 {
color: #76ff03 !important;
}
.light-green.accent-4 {
background-color: #64dd17 !important;
}
.light-green-text.text-accent-4 {
color: #64dd17 !important;
}
.lime.lighten-5 {
background-color: #f9fbe7 !important;
}
.lime-text.text-lighten-5 {
color: #f9fbe7 !important;
}
.lime.lighten-4 {
background-color: #f0f4c3 !important;
}
.lime-text.text-lighten-4 {
color: #f0f4c3 !important;
}
.lime.lighten-3 {
background-color: #e6ee9c !important;
}
.lime-text.text-lighten-3 {
color: #e6ee9c !important;
}
.lime.lighten-2 {
background-color: #dce775 !important;
}
.lime-text.text-lighten-2 {
color: #dce775 !important;
}
.lime.lighten-1 {
background-color: #d4e157 !important;
}
.lime-text.text-lighten-1 {
color: #d4e157 !important;
}
.lime {
background-color: #cddc39 !important;
}
.lime-text {
color: #cddc39 !important;
}
.lime.darken-1 {
background-color: #c0ca33 !important;
}
.lime-text.text-darken-1 {
color: #c0ca33 !important;
}
.lime.darken-2 {
background-color: #afb42b !important;
}
.lime-text.text-darken-2 {
color: #afb42b !important;
}
.lime.darken-3 {
background-color: #9e9d24 !important;
}
.lime-text.text-darken-3 {
color: #9e9d24 !important;
}
.lime.darken-4 {
background-color: #827717 !important;
}
.lime-text.text-darken-4 {
color: #827717 !important;
}
.lime.accent-1 {
background-color: #f4ff81 !important;
}
.lime-text.text-accent-1 {
color: #f4ff81 !important;
}
.lime.accent-2 {
background-color: #eeff41 !important;
}
.lime-text.text-accent-2 {
color: #eeff41 !important;
}
.lime.accent-3 {
background-color: #c6ff00 !important;
}
.lime-text.text-accent-3 {
color: #c6ff00 !important;
}
.lime.accent-4 {
background-color: #aeea00 !important;
}
.lime-text.text-accent-4 {
color: #aeea00 !important;
}
.yellow.lighten-5 {
background-color: #fffde7 !important;
}
.yellow-text.text-lighten-5 {
color: #fffde7 !important;
}
.yellow.lighten-4 {
background-color: #fff9c4 !important;
}
.yellow-text.text-lighten-4 {
color: #fff9c4 !important;
}
.yellow.lighten-3 {
background-color: #fff59d !important;
}
.yellow-text.text-lighten-3 {
color: #fff59d !important;
}
.yellow.lighten-2 {
background-color: #fff176 !important;
}
.yellow-text.text-lighten-2 {
color: #fff176 !important;
}
.yellow.lighten-1 {
background-color: #ffee58 !important;
}
.yellow-text.text-lighten-1 {
color: #ffee58 !important;
}
.yellow {
background-color: #ffeb3b !important;
}
.yellow-text {
color: #ffeb3b !important;
}
.yellow.darken-1 {
background-color: #fdd835 !important;
}
.yellow-text.text-darken-1 {
color: #fdd835 !important;
}
.yellow.darken-2 {
background-color: #fbc02d !important;
}
.yellow-text.text-darken-2 {
color: #fbc02d !important;
}
.yellow.darken-3 {
background-color: #f9a825 !important;
}
.yellow-text.text-darken-3 {
color: #f9a825 !important;
}
.yellow.darken-4 {
background-color: #f57f17 !important;
}
.yellow-text.text-darken-4 {
color: #f57f17 !important;
}
.yellow.accent-1 {
background-color: #ffff8d !important;
}
.yellow-text.text-accent-1 {
color: #ffff8d !important;
}
.yellow.accent-2 {
background-color: #ffff00 !important;
}
.yellow-text.text-accent-2 {
color: #ffff00 !important;
}
.yellow.accent-3 {
background-color: #ffea00 !important;
}
.yellow-text.text-accent-3 {
color: #ffea00 !important;
}
.yellow.accent-4 {
background-color: #ffd600 !important;
}
.yellow-text.text-accent-4 {
color: #ffd600 !important;
}
.amber.lighten-5 {
background-color: #fff8e1 !important;
}
.amber-text.text-lighten-5 {
color: #fff8e1 !important;
}
.amber.lighten-4 {
background-color: #ffecb3 !important;
}
.amber-text.text-lighten-4 {
color: #ffecb3 !important;
}
.amber.lighten-3 {
background-color: #ffe082 !important;
}
.amber-text.text-lighten-3 {
color: #ffe082 !important;
}
.amber.lighten-2 {
background-color: #ffd54f !important;
}
.amber-text.text-lighten-2 {
color: #ffd54f !important;
}
.amber.lighten-1 {
background-color: #ffca28 !important;
}
.amber-text.text-lighten-1 {
color: #ffca28 !important;
}
.amber {
background-color: #ffc107 !important;
}
.amber-text {
color: #ffc107 !important;
}
.amber.darken-1 {
background-color: #ffb300 !important;
}
.amber-text.text-darken-1 {
color: #ffb300 !important;
}
.amber.darken-2 {
background-color: #ffa000 !important;
}
.amber-text.text-darken-2 {
color: #ffa000 !important;
}
.amber.darken-3 {
background-color: #ff8f00 !important;
}
.amber-text.text-darken-3 {
color: #ff8f00 !important;
}
.amber.darken-4 {
background-color: #ff6f00 !important;
}
.amber-text.text-darken-4 {
color: #ff6f00 !important;
}
.amber.accent-1 {
background-color: #ffe57f !important;
}
.amber-text.text-accent-1 {
color: #ffe57f !important;
}
.amber.accent-2 {
background-color: #ffd740 !important;
}
.amber-text.text-accent-2 {
color: #ffd740 !important;
}
.amber.accent-3 {
background-color: #ffc400 !important;
}
.amber-text.text-accent-3 {
color: #ffc400 !important;
}
.amber.accent-4 {
background-color: #ffab00 !important;
}
.amber-text.text-accent-4 {
color: #ffab00 !important;
}
.orange.lighten-5 {
background-color: #fff3e0 !important;
}
.orange-text.text-lighten-5 {
color: #fff3e0 !important;
}
.orange.lighten-4 {
background-color: #ffe0b2 !important;
}
.orange-text.text-lighten-4 {
color: #ffe0b2 !important;
}
.orange.lighten-3 {
background-color: #ffcc80 !important;
}
.orange-text.text-lighten-3 {
color: #ffcc80 !important;
}
.orange.lighten-2 {
background-color: #ffb74d !important;
}
.orange-text.text-lighten-2 {
color: #ffb74d !important;
}
.orange.lighten-1 {
background-color: #ffa726 !important;
}
.orange-text.text-lighten-1 {
color: #ffa726 !important;
}
.orange {
background-color: #ff9800 !important;
}
.orange-text {
color: #ff9800 !important;
}
.orange.darken-1 {
background-color: #fb8c00 !important;
}
.orange-text.text-darken-1 {
color: #fb8c00 !important;
}
.orange.darken-2 {
background-color: #f57c00 !important;
}
.orange-text.text-darken-2 {
color: #f57c00 !important;
}
.orange.darken-3 {
background-color: #ef6c00 !important;
}
.orange-text.text-darken-3 {
color: #ef6c00 !important;
}
.orange.darken-4 {
background-color: #e65100 !important;
}
.orange-text.text-darken-4 {
color: #e65100 !important;
}
.orange.accent-1 {
background-color: #ffd180 !important;
}
.orange-text.text-accent-1 {
color: #ffd180 !important;
}
.orange.accent-2 {
background-color: #ffab40 !important;
}
.orange-text.text-accent-2 {
color: #ffab40 !important;
}
.orange.accent-3 {
background-color: #ff9100 !important;
}
.orange-text.text-accent-3 {
color: #ff9100 !important;
}
.orange.accent-4 {
background-color: #ff6d00 !important;
}
.orange-text.text-accent-4 {
color: #ff6d00 !important;
}
.deep-orange.lighten-5 {
background-color: #fbe9e7 !important;
}
.deep-orange-text.text-lighten-5 {
color: #fbe9e7 !important;
}
.deep-orange.lighten-4 {
background-color: #ffccbc !important;
}
.deep-orange-text.text-lighten-4 {
color: #ffccbc !important;
}
.deep-orange.lighten-3 {
background-color: #ffab91 !important;
}
.deep-orange-text.text-lighten-3 {
color: #ffab91 !important;
}
.deep-orange.lighten-2 {
background-color: #ff8a65 !important;
}
.deep-orange-text.text-lighten-2 {
color: #ff8a65 !important;
}
.deep-orange.lighten-1 {
background-color: #ff7043 !important;
}
.deep-orange-text.text-lighten-1 {
color: #ff7043 !important;
}
.deep-orange {
background-color: #ff5722 !important;
}
.deep-orange-text {
color: #ff5722 !important;
}
.deep-orange.darken-1 {
background-color: #f4511e !important;
}
.deep-orange-text.text-darken-1 {
color: #f4511e !important;
}
.deep-orange.darken-2 {
background-color: #e64a19 !important;
}
.deep-orange-text.text-darken-2 {
color: #e64a19 !important;
}
.deep-orange.darken-3 {
background-color: #d84315 !important;
}
.deep-orange-text.text-darken-3 {
color: #d84315 !important;
}
.deep-orange.darken-4 {
background-color: #bf360c !important;
}
.deep-orange-text.text-darken-4 {
color: #bf360c !important;
}
.deep-orange.accent-1 {
background-color: #ff9e80 !important;
}
.deep-orange-text.text-accent-1 {
color: #ff9e80 !important;
}
.deep-orange.accent-2 {
background-color: #ff6e40 !important;
}
.deep-orange-text.text-accent-2 {
color: #ff6e40 !important;
}
.deep-orange.accent-3 {
background-color: #ff3d00 !important;
}
.deep-orange-text.text-accent-3 {
color: #ff3d00 !important;
}
.deep-orange.accent-4 {
background-color: #dd2c00 !important;
}
.deep-orange-text.text-accent-4 {
color: #dd2c00 !important;
}
.brown.lighten-5 {
background-color: #efebe9 !important;
}
.brown-text.text-lighten-5 {
color: #efebe9 !important;
}
.brown.lighten-4 {
background-color: #d7ccc8 !important;
}
.brown-text.text-lighten-4 {
color: #d7ccc8 !important;
}
.brown.lighten-3 {
background-color: #bcaaa4 !important;
}
.brown-text.text-lighten-3 {
color: #bcaaa4 !important;
}
.brown.lighten-2 {
background-color: #a1887f !important;
}
.brown-text.text-lighten-2 {
color: #a1887f !important;
}
.brown.lighten-1 {
background-color: #8d6e63 !important;
}
.brown-text.text-lighten-1 {
color: #8d6e63 !important;
}
.brown {
background-color: #795548 !important;
}
.brown-text {
color: #795548 !important;
}
.brown.darken-1 {
background-color: #6d4c41 !important;
}
.brown-text.text-darken-1 {
color: #6d4c41 !important;
}
.brown.darken-2 {
background-color: #5d4037 !important;
}
.brown-text.text-darken-2 {
color: #5d4037 !important;
}
.brown.darken-3 {
background-color: #4e342e !important;
}
.brown-text.text-darken-3 {
color: #4e342e !important;
}
.brown.darken-4 {
background-color: #3e2723 !important;
}
.brown-text.text-darken-4 {
color: #3e2723 !important;
}
.blue-grey.lighten-5 {
background-color: #eceff1 !important;
}
.blue-grey-text.text-lighten-5 {
color: #eceff1 !important;
}
.blue-grey.lighten-4 {
background-color: #cfd8dc !important;
}
.blue-grey-text.text-lighten-4 {
color: #cfd8dc !important;
}
.blue-grey.lighten-3 {
background-color: #b0bec5 !important;
}
.blue-grey-text.text-lighten-3 {
color: #b0bec5 !important;
}
.blue-grey.lighten-2 {
background-color: #90a4ae !important;
}
.blue-grey-text.text-lighten-2 {
color: #90a4ae !important;
}
.blue-grey.lighten-1 {
background-color: #78909c !important;
}
.blue-grey-text.text-lighten-1 {
color: #78909c !important;
}
.blue-grey {
background-color: #607d8b !important;
}
.blue-grey-text {
color: #607d8b !important;
}
.blue-grey.darken-1 {
background-color: #546e7a !important;
}
.blue-grey-text.text-darken-1 {
color: #546e7a !important;
}
.blue-grey.darken-2 {
background-color: #455a64 !important;
}
.blue-grey-text.text-darken-2 {
color: #455a64 !important;
}
.blue-grey.darken-3 {
background-color: #37474f !important;
}
.blue-grey-text.text-darken-3 {
color: #37474f !important;
}
.blue-grey.darken-4 {
background-color: #263238 !important;
}
.blue-grey-text.text-darken-4 {
color: #263238 !important;
}
.grey.lighten-5 {
background-color: #fafafa !important;
}
.grey-text.text-lighten-5 {
color: #fafafa !important;
}
.grey.lighten-4 {
background-color: #f5f5f5 !important;
}
.grey-text.text-lighten-4 {
color: #f5f5f5 !important;
}
.grey.lighten-3 {
background-color: #eeeeee !important;
}
.grey-text.text-lighten-3 {
color: #eeeeee !important;
}
.grey.lighten-2 {
background-color: #e0e0e0 !important;
}
.grey-text.text-lighten-2 {
color: #e0e0e0 !important;
}
.grey.lighten-1 {
background-color: #bdbdbd !important;
}
.grey-text.text-lighten-1 {
color: #bdbdbd !important;
}
.grey {
background-color: #9e9e9e !important;
}
.grey-text {
color: #9e9e9e !important;
}
.grey.darken-1 {
background-color: #757575 !important;
}
.grey-text.text-darken-1 {
color: #757575 !important;
}
.grey.darken-2 {
background-color: #616161 !important;
}
.grey-text.text-darken-2 {
color: #616161 !important;
}
.grey.darken-3 {
background-color: #424242 !important;
}
.grey-text.text-darken-3 {
color: #424242 !important;
}
.grey.darken-4 {
background-color: #212121 !important;
}
.grey-text.text-darken-4 {
color: #212121 !important;
}
.shades.black {
background-color: #000000 !important;
}
.shades-text.text-black {
color: #000000 !important;
}
.shades.white {
background-color: #FFFFFF !important;
}
.shades-text.text-white {
color: #FFFFFF !important;
}
.shades.transparent {
background-color: transparent !important;
}
.shades-text.text-transparent {
color: transparent !important;
}
.black {
background-color: #000000 !important;
}
.black-text {
color: #000000 !important;
}
.white {
background-color: #FFFFFF !important;
}
.white-text {
color: #FFFFFF !important;
}
.transparent {
background-color: transparent !important;
}
.transparent-text {
color: transparent !important;
}
/*** Colors ***/
/*** Badges ***/
/*** Buttons ***/
/*** Cards ***/
/*** Collapsible ***/
/*** Dropdown ***/
/*** Fonts ***/
/*** Forms ***/
/*** Global ***/
/*** Navbar ***/
/*** SideNav ***/
/*** Tabs ***/
/*** Tables ***/
/*** Toasts ***/
/*** Typography ***/
/*** Collections ***/
/* Progress Bar */
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif;
/* 1 */
-ms-text-size-adjust: 100%;
/* 2 */
-webkit-text-size-adjust: 100%;
/* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11
* and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/
article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio, canvas, progress, video {
display: inline-block;
/* 1 */
vertical-align: baseline;
/* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9/10.
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/
[hidden], template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active, a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/
b, strong {
font-weight: bold;
}
/**
* Address styling not present in Safari and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9/10.
*/
img {
border: 0;
}
/**
* Correct overflow not hidden in IE 9/10/11.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code, kbd, pre, samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/
button, input, optgroup, select, textarea {
color: inherit;
/* 1 */
font: inherit;
/* 2 */
margin: 0;
/* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10/11.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/
button, select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
/* 1 */
html input[type="button"], button, input[type="reset"], input[type="submit"] {
-webkit-appearance: button;
/* 2 */
cursor: pointer;
/* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled], html input[disabled] {
cursor: default;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner, input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"], input[type="radio"] {
box-sizing: border-box;
/* 1 */
padding: 0;
/* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield;
/* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
/* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0;
/* 1 */
padding: 0;
/* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9/10/11.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td, th {
padding: 0;
}
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
ul {
list-style-type: none;
}
a {
color: #039be5;
text-decoration: none;
-webkit-tap-highlight-color: transparent;
}
.valign-wrapper {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
}
.valign-wrapper .valign {
display: block;
}
ul {
padding: 0;
}
ul li {
list-style-type: none;
}
.clearfix {
clear: both;
}
.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible, .side-nav {
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
-moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover {
-webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
-moz-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
}
.z-depth-2 {
-webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-moz-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
.z-depth-3 {
-webkit-box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
-moz-box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
}
.z-depth-4, .modal {
-webkit-box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);
-moz-box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);
box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);
}
.z-depth-5 {
-webkit-box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2), 0 40px 77px 0 rgba(0, 0, 0, 0.22);
-moz-box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2), 0 40px 77px 0 rgba(0, 0, 0, 0.22);
box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2), 0 40px 77px 0 rgba(0, 0, 0, 0.22);
}
.divider {
height: 1px;
overflow: hidden;
background-color: #e0e0e0;
}
blockquote {
margin: 20px 0;
padding-left: 1.5rem;
border-left: 5px solid #EF9A9A;
}
i {
line-height: inherit;
}
i.left {
float: left;
margin-right: 15px;
}
i.right {
float: right;
margin-left: 15px;
}
i.tiny {
font-size: 1rem;
}
i.small {
font-size: 2rem;
}
i.medium {
font-size: 4rem;
}
i.large {
font-size: 6rem;
}
img.responsive-img, video.responsive-video {
max-width: 100%;
height: auto;
}
.pagination li {
font-size: 1.2rem;
float: left;
width: 30px;
height: 30px;
margin: 0 10px;
border-radius: 2px;
text-align: center;
}
.pagination li a {
color: #444;
}
.pagination li.active a {
color: #fff;
}
.pagination li.active {
background-color: #ee6e73;
}
.pagination li.disabled a {
color: #999;
}
.pagination li i {
font-size: 2rem;
line-height: 1.8rem;
}
.parallax-container {
position: relative;
overflow: hidden;
height: 500px;
}
.parallax {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
}
.parallax img {
display: none;
position: absolute;
left: 50%;
bottom: 0;
min-width: 100%;
min-height: 100%;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
transform: translateX(-50%);
}
.pin-top, .pin-bottom {
position: relative;
}
.pinned {
position: fixed !important;
}
/*********************
Transition Classes
**********************/
ul.staggered-list li {
opacity: 0;
}
.fade-in {
opacity: 0;
transform-origin: 0 50%;
}
/*********************
Media Query Classes
**********************/
@media only screen and (max-width: 600px) {
.hide-on-small-only, .hide-on-small-and-down {
display: none !important;
}
}
@media only screen and (max-width: 992px) {
.hide-on-med-and-down {
display: none !important;
}
}
@media only screen and (min-width: 601px) {
.hide-on-med-and-up {
display: none !important;
}
}
@media only screen and (min-width: 600px) and (max-width: 992px) {
.hide-on-med-only {
display: none !important;
}
}
@media only screen and (min-width: 993px) {
.hide-on-large-only {
display: none !important;
}
}
@media only screen and (min-width: 993px) {
.show-on-large {
display: initial !important;
}
}
@media only screen and (min-width: 600px) and (max-width: 992px) {
.show-on-medium {
display: initial !important;
}
}
@media only screen and (max-width: 600px) {
.show-on-small {
display: initial !important;
}
}
@media only screen and (min-width: 601px) {
.show-on-medium-and-up {
display: initial !important;
}
}
@media only screen and (max-width: 992px) {
.show-on-medium-and-down {
display: initial !important;
}
}
@media only screen and (max-width: 600px) {
.center-on-small-only {
text-align: center;
}
}
footer.page-footer {
margin-top: 20px;
padding-top: 20px;
background-color: #ee6e73;
}
footer.page-footer .footer-copyright {
overflow: hidden;
height: 50px;
line-height: 50px;
color: rgba(255, 255, 255, 0.8);
background-color: rgba(51, 51, 51, 0.08);
}
table, th, td {
border: none;
}
table {
width: 100%;
display: table;
}
table.bordered tr {
border-bottom: 1px solid #d0d0d0;
}
table.striped tbody tr:nth-child(odd) {
background-color: #f2f2f2;
}
table.hoverable tbody tr {
-webkit-transition: background-color .25s ease;
-moz-transition: background-color .25s ease;
-o-transition: background-color .25s ease;
-ms-transition: background-color .25s ease;
transition: background-color .25s ease;
}
table.hoverable tbody tr:hover {
background-color: #f2f2f2;
}
table.centered thead tr th, table.centered tbody tr td {
text-align: center;
}
thead {
border-bottom: 1px solid #d0d0d0;
}
td, th {
padding: 15px 5px;
display: table-cell;
text-align: left;
vertical-align: middle;
border-radius: 2px;
}
@media only screen and (max-width: 992px) {
table.responsive-table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
display: block;
position: relative;
/* sort out borders */
}
table.responsive-table th, table.responsive-table td {
margin: 0;
vertical-align: top;
}
table.responsive-table th {
text-align: left;
}
table.responsive-table thead {
display: block;
float: left;
}
table.responsive-table thead tr {
display: block;
padding: 0 10px 0 0;
}
table.responsive-table thead tr th::before {
content: "\00a0";
}
table.responsive-table tbody {
display: block;
width: auto;
position: relative;
overflow-x: auto;
white-space: nowrap;
}
table.responsive-table tbody tr {
display: inline-block;
vertical-align: top;
}
table.responsive-table th {
display: block;
text-align: right;
}
table.responsive-table td {
display: block;
min-height: 1.25em;
text-align: left;
}
table.responsive-table tr {
padding: 0 10px;
}
table.responsive-table thead {
border: 0;
border-right: 1px solid #d0d0d0;
}
table.responsive-table.bordered th {
border-bottom: 0;
border-left: 0;
}
table.responsive-table.bordered td {
border-left: 0;
border-right: 0;
border-bottom: 0;
}
table.responsive-table.bordered tr {
border: 0;
}
table.responsive-table.bordered tbody tr {
border-right: 1px solid #d0d0d0;
}
}
.collection {
margin: 0.5rem 0 1rem 0;
border: 1px solid #e0e0e0;
border-radius: 2px;
overflow: hidden;
position: relative;
}
.collection .collection-item {
background-color: #fff;
line-height: 1.5rem;
padding: 10px 20px;
margin: 0;
border-bottom: 1px solid #e0e0e0;
}
.collection .collection-item.avatar {
height: 84px;
padding-left: 72px;
position: relative;
}
.collection .collection-item.avatar .circle {
position: absolute;
width: 42px;
height: 42px;
overflow: hidden;
left: 15px;
display: inline-block;
vertical-align: middle;
}
.collection .collection-item.avatar i.circle {
font-size: 18px;
line-height: 42px;
color: #fff;
background-color: #999;
text-align: center;
}
.collection .collection-item.avatar .title {
font-size: 16px;
}
.collection .collection-item.avatar p {
margin: 0;
}
.collection .collection-item.avatar .secondary-content {
position: absolute;
top: 16px;
right: 16px;
}
.collection .collection-item:last-child {
border-bottom: none;
}
.collection .collection-item.active {
background-color: #26a69a;
color: #eafaf9;
}
.collection a.collection-item {
display: block;
-webkit-transition: 0.25s;
-moz-transition: 0.25s;
-o-transition: 0.25s;
-ms-transition: 0.25s;
transition: 0.25s;
color: #26a69a;
}
.collection a.collection-item:not(.active):hover {
background-color: #ddd;
}
.collection.with-header .collection-header {
background-color: #fff;
border-bottom: 1px solid #e0e0e0;
padding: 10px 20px;
}
.collection.with-header .collection-item {
padding-left: 30px;
}
.secondary-content {
float: right;
color: #26a69a;
}
span.badge {
min-width: 3rem;
padding: 0 6px;
text-align: center;
font-size: 1rem;
line-height: inherit;
color: #757575;
position: absolute;
right: 15px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
span.badge.new {
font-weight: 300;
font-size: 0.8rem;
color: #fff;
background-color: #26a69a;
border-radius: 2px;
}
span.badge.new:after {
content: " new";
}
.video-container {
position: relative;
padding-bottom: 56.25%;
padding-top: 30px;
height: 0;
overflow: hidden;
}
.video-container.no-controls {
padding-top: 0;
}
.video-container iframe, .video-container object, .video-container embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.progress {
position: relative;
height: 4px;
display: block;
width: 100%;
background-color: #acece6;
border-radius: 2px;
margin: 0.5rem 0 1rem 0;
overflow: hidden;
}
.progress .determinate {
position: absolute;
background-color: inherit;
top: 0;
bottom: 0;
background-color: #26a69a;
-webkit-transition: width .3s linear;
-moz-transition: width .3s linear;
-o-transition: width .3s linear;
-ms-transition: width .3s linear;
transition: width .3s linear;
}
.progress .indeterminate {
background-color: #26a69a;
}
.progress .indeterminate:before {
content: '';
position: absolute;
background-color: inherit;
top: 0;
left: 0;
bottom: 0;
will-change: left, right;
-webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
-moz-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
-ms-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
-o-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
}
.progress .indeterminate:after {
content: '';
position: absolute;
background-color: inherit;
top: 0;
left: 0;
bottom: 0;
will-change: left, right;
-webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-moz-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-ms-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-o-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-webkit-animation-delay: 1.15s;
-moz-animation-delay: 1.15s;
-ms-animation-delay: 1.15s;
-o-animation-delay: 1.15s;
animation-delay: 1.15s;
}
@-webkit-keyframes indeterminate {
0% {
left: -35%;
right: 100%;
}
60% {
left: 100%;
right: -90%;
}
100% {
left: 100%;
right: -90%;
}
}
@-moz-keyframes indeterminate {
0% {
left: -35%;
right: 100%;
}
60% {
left: 100%;
right: -90%;
}
100% {
left: 100%;
right: -90%;
}
}
@keyframes indeterminate {
0% {
left: -35%;
right: 100%;
}
60% {
left: 100%;
right: -90%;
}
100% {
left: 100%;
right: -90%;
}
}
@-webkit-keyframes indeterminate-short {
0% {
left: -200%;
right: 100%;
}
60% {
left: 107%;
right: -8%;
}
100% {
left: 107%;
right: -8%;
}
}
@-moz-keyframes indeterminate-short {
0% {
left: -200%;
right: 100%;
}
60% {
left: 107%;
right: -8%;
}
100% {
left: 107%;
right: -8%;
}
}
@keyframes indeterminate-short {
0% {
left: -200%;
right: 100%;
}
60% {
left: 107%;
right: -8%;
}
100% {
left: 107%;
right: -8%;
}
}
/*******************
Utility Classes
*******************/
.hide {
display: none !important;
}
.left-align {
text-align: left;
}
.right-align {
text-align: right;
}
.center, .center-align {
text-align: center;
}
.left {
float: left !important;
}
.right {
float: right !important;
}
.no-select, input[type=range], input[type=range] + .thumb {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.circle {
border-radius: 50%;
}
.center-block {
display: block;
margin-left: auto;
margin-right: auto;
}
.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.no-padding {
padding: 0 !important;
}
.container {
padding: 0 1.5rem;
margin: 0 auto;
max-width: 1280px;
width: 90%;
}
@media only screen and (min-width: 601px) {
.container {
width: 85%;
}
}
@media only screen and (min-width: 993px) {
.container {
width: 70%;
}
}
.container .row {
margin-left: -0.75rem;
margin-right: -0.75rem;
}
.section {
padding-top: 1rem;
padding-bottom: 1rem;
}
.section.no-pad {
padding: 0;
}
.section.no-pad-bot {
padding-bottom: 0;
}
.section.no-pad-top {
padding-top: 0;
}
.row {
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
}
.row:after {
content: "";
display: table;
clear: both;
}
.row .col {
float: left;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0 0.75rem;
}
.row .col.s1 {
width: 8.33333%;
margin-left: 0;
}
.row .col.s2 {
width: 16.66667%;
margin-left: 0;
}
.row .col.s3 {
width: 25%;
margin-left: 0;
}
.row .col.s4 {
width: 33.33333%;
margin-left: 0;
}
.row .col.s5 {
width: 41.66667%;
margin-left: 0;
}
.row .col.s6 {
width: 50%;
margin-left: 0;
}
.row .col.s7 {
width: 58.33333%;
margin-left: 0;
}
.row .col.s8 {
width: 66.66667%;
margin-left: 0;
}
.row .col.s9 {
width: 75%;
margin-left: 0;
}
.row .col.s10 {
width: 83.33333%;
margin-left: 0;
}
.row .col.s11 {
width: 91.66667%;
margin-left: 0;
}
.row .col.s12 {
width: 100%;
margin-left: 0;
}
.row .col.offset-s1 {
margin-left: 8.33333%;
}
.row .col.offset-s2 {
margin-left: 16.66667%;
}
.row .col.offset-s3 {
margin-left: 25%;
}
.row .col.offset-s4 {
margin-left: 33.33333%;
}
.row .col.offset-s5 {
margin-left: 41.66667%;
}
.row .col.offset-s6 {
margin-left: 50%;
}
.row .col.offset-s7 {
margin-left: 58.33333%;
}
.row .col.offset-s8 {
margin-left: 66.66667%;
}
.row .col.offset-s9 {
margin-left: 75%;
}
.row .col.offset-s10 {
margin-left: 83.33333%;
}
.row .col.offset-s11 {
margin-left: 91.66667%;
}
.row .col.offset-s12 {
margin-left: 100%;
}
@media only screen and (min-width: 601px) {
.row .col.m1 {
width: 8.33333%;
margin-left: 0;
}
.row .col.m2 {
width: 16.66667%;
margin-left: 0;
}
.row .col.m3 {
width: 25%;
margin-left: 0;
}
.row .col.m4 {
width: 33.33333%;
margin-left: 0;
}
.row .col.m5 {
width: 41.66667%;
margin-left: 0;
}
.row .col.m6 {
width: 50%;
margin-left: 0;
}
.row .col.m7 {
width: 58.33333%;
margin-left: 0;
}
.row .col.m8 {
width: 66.66667%;
margin-left: 0;
}
.row .col.m9 {
width: 75%;
margin-left: 0;
}
.row .col.m10 {
width: 83.33333%;
margin-left: 0;
}
.row .col.m11 {
width: 91.66667%;
margin-left: 0;
}
.row .col.m12 {
width: 100%;
margin-left: 0;
}
.row .col.offset-m1 {
margin-left: 8.33333%;
}
.row .col.offset-m2 {
margin-left: 16.66667%;
}
.row .col.offset-m3 {
margin-left: 25%;
}
.row .col.offset-m4 {
margin-left: 33.33333%;
}
.row .col.offset-m5 {
margin-left: 41.66667%;
}
.row .col.offset-m6 {
margin-left: 50%;
}
.row .col.offset-m7 {
margin-left: 58.33333%;
}
.row .col.offset-m8 {
margin-left: 66.66667%;
}
.row .col.offset-m9 {
margin-left: 75%;
}
.row .col.offset-m10 {
margin-left: 83.33333%;
}
.row .col.offset-m11 {
margin-left: 91.66667%;
}
.row .col.offset-m12 {
margin-left: 100%;
}
}
@media only screen and (min-width: 993px) {
.row .col.l1 {
width: 8.33333%;
margin-left: 0;
}
.row .col.l2 {
width: 16.66667%;
margin-left: 0;
}
.row .col.l3 {
width: 25%;
margin-left: 0;
}
.row .col.l4 {
width: 33.33333%;
margin-left: 0;
}
.row .col.l5 {
width: 41.66667%;
margin-left: 0;
}
.row .col.l6 {
width: 50%;
margin-left: 0;
}
.row .col.l7 {
width: 58.33333%;
margin-left: 0;
}
.row .col.l8 {
width: 66.66667%;
margin-left: 0;
}
.row .col.l9 {
width: 75%;
margin-left: 0;
}
.row .col.l10 {
width: 83.33333%;
margin-left: 0;
}
.row .col.l11 {
width: 91.66667%;
margin-left: 0;
}
.row .col.l12 {
width: 100%;
margin-left: 0;
}
.row .col.offset-l1 {
margin-left: 8.33333%;
}
.row .col.offset-l2 {
margin-left: 16.66667%;
}
.row .col.offset-l3 {
margin-left: 25%;
}
.row .col.offset-l4 {
margin-left: 33.33333%;
}
.row .col.offset-l5 {
margin-left: 41.66667%;
}
.row .col.offset-l6 {
margin-left: 50%;
}
.row .col.offset-l7 {
margin-left: 58.33333%;
}
.row .col.offset-l8 {
margin-left: 66.66667%;
}
.row .col.offset-l9 {
margin-left: 75%;
}
.row .col.offset-l10 {
margin-left: 83.33333%;
}
.row .col.offset-l11 {
margin-left: 91.66667%;
}
.row .col.offset-l12 {
margin-left: 100%;
}
}
nav {
color: #fff;
background-color: #ee6e73;
width: 100%;
height: 56px;
line-height: 56px;
}
nav a {
color: #fff;
}
nav .nav-wrapper {
position: relative;
height: 100%;
}
nav .nav-wrapper i {
display: block;
font-size: 2rem;
}
@media only screen and (min-width: 993px) {
nav a.button-collapse {
display: none;
}
}
nav .button-collapse {
float: left;
position: relative;
z-index: 1;
height: 56px;
}
nav .button-collapse i {
font-size: 2.7rem;
height: 56px;
line-height: 56px;
}
nav .brand-logo {
position: absolute;
color: #fff;
display: inline-block;
font-size: 2.1rem;
padding: 0;
}
nav .brand-logo.center {
left: 50%;
-webkit-transform: translateX(-50%);
-moz-transform: translateX(-50%);
-ms-transform: translateX(-50%);
-o-transform: translateX(-50%);
transform: translateX(-50%);
}
@media only screen and (max-width: 992px) {
nav .brand-logo {
left: 50%;
-webkit-transform: translateX(-50%);
-moz-transform: translateX(-50%);
-ms-transform: translateX(-50%);
-o-transform: translateX(-50%);
transform: translateX(-50%);
}
}
nav .brand-logo.right {
right: 0.5rem;
padding: 0;
}
nav ul {
margin: 0;
}
nav ul li {
-webkit-transition: background-color .3s;
-moz-transition: background-color .3s;
-o-transition: background-color .3s;
-ms-transition: background-color .3s;
transition: background-color .3s;
float: left;
padding: 0;
}
nav ul li:hover, nav ul li.active {
background-color: rgba(0, 0, 0, 0.1);
}
nav ul a {
font-size: 1rem;
color: #fff;
display: block;
padding: 0 15px;
}
nav ul.left {
float: left;
}
nav .input-field {
margin: 0;
}
nav .input-field input {
height: 100%;
font-size: 1.2rem;
border: none;
padding-left: 2rem;
}
nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid {
border: none;
box-shadow: none;
}
nav .input-field label {
top: 0;
left: 0;
}
nav .input-field label i {
color: rgba(255, 255, 255, 0.7);
-webkit-transition: color .3s;
-moz-transition: color .3s;
-o-transition: color .3s;
-ms-transition: color .3s;
transition: color .3s;
}
nav .input-field label.active i {
color: #fff;
}
nav .input-field label.active {
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0);
transform: translateY(0);
}
.navbar-fixed {
position: relative;
height: 56px;
z-index: 998;
}
.navbar-fixed nav {
position: fixed;
}
@media only screen and (min-width: 601px) {
nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i {
height: 64px;
line-height: 64px;
}
.navbar-fixed {
height: 64px;
}
}
a {
text-decoration: none;
}
html {
line-height: 1.5;
font-family: "Helvetica Neue","Helvetica","Arial", sans-serif;
font-weight: normal;
color: rgba(0, 0, 0, 0.87);
}
@media only screen and (min-width: 0) {
html {
font-size: 14px;
}
}
@media only screen and (min-width: 992px) {
html {
font-size: 14.5px;
}
}
@media only screen and (min-width: 1200px) {
html {
font-size: 15px;
}
}
h1, h2, h3, h4, h5, h6 {
font-weight: 400;
}
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
font-weight: inherit;
}
h1 {
font-size: 4.2rem;
line-height: 4.62rem;
margin: 2.1rem 0 1.68rem 0;
}
h2 {
font-size: 3.56rem;
line-height: 3.916rem;
margin: 1.78rem 0 1.424rem 0;
}
h3 {
font-size: 2.92rem;
line-height: 3.212rem;
margin: 1.46rem 0 1.168rem 0;
}
h4 {
font-size: 2.28rem;
line-height: 2.508rem;
margin: 1.14rem 0 0.912rem 0;
}
h5 {
font-size: 1.64rem;
line-height: 1.804rem;
margin: 0.82rem 0 0.656rem 0;
}
h6 {
font-size: 1rem;
line-height: 1.1rem;
margin: 0.5rem 0 0.4rem 0;
}
em {
font-style: italic;
}
strong {
font-weight: 500;
}
small {
font-size: 75%;
}
.light, footer.page-footer .footer-copyright {
font-weight: 300;
}
.thin {
font-weight: 200;
}
.flow-text {
font-weight: 300;
}
@media only screen and (min-width: 360px) {
.flow-text {
font-size: 1.2rem;
}
}
@media only screen and (min-width: 0px) {
.flow-text {
line-height: .8rem;
}
}
@media only screen and (min-width: 390px) {
.flow-text {
font-size: 1.224rem;
}
}
@media only screen and (min-width: 30px) {
.flow-text {
line-height: .904rem;
}
}
@media only screen and (min-width: 420px) {
.flow-text {
font-size: 1.248rem;
}
}
@media only screen and (min-width: 60px) {
.flow-text {
line-height: 1.008rem;
}
}
@media only screen and (min-width: 450px) {
.flow-text {
font-size: 1.272rem;
}
}
@media only screen and (min-width: 90px) {
.flow-text {
line-height: 1.112rem;
}
}
@media only screen and (min-width: 480px) {
.flow-text {
font-size: 1.296rem;
}
}
@media only screen and (min-width: 120px) {
.flow-text {
line-height: 1.216rem;
}
}
@media only screen and (min-width: 510px) {
.flow-text {
font-size: 1.32rem;
}
}
@media only screen and (min-width: 150px) {
.flow-text {
line-height: 1.32rem;
}
}
@media only screen and (min-width: 540px) {
.flow-text {
font-size: 1.344rem;
}
}
@media only screen and (min-width: 180px) {
.flow-text {
line-height: 1.424rem;
}
}
@media only screen and (min-width: 570px) {
.flow-text {
font-size: 1.368rem;
}
}
@media only screen and (min-width: 210px) {
.flow-text {
line-height: 1.528rem;
}
}
@media only screen and (min-width: 600px) {
.flow-text {
font-size: 1.392rem;
}
}
@media only screen and (min-width: 240px) {
.flow-text {
line-height: 1.632rem;
}
}
@media only screen and (min-width: 630px) {
.flow-text {
font-size: 1.416rem;
}
}
@media only screen and (min-width: 270px) {
.flow-text {
line-height: 1.736rem;
}
}
@media only screen and (min-width: 660px) {
.flow-text {
font-size: 1.44rem;
}
}
@media only screen and (min-width: 300px) {
.flow-text {
line-height: 1.84rem;
}
}
@media only screen and (min-width: 690px) {
.flow-text {
font-size: 1.464rem;
}
}
@media only screen and (min-width: 330px) {
.flow-text {
line-height: 1.944rem;
}
}
@media only screen and (min-width: 720px) {
.flow-text {
font-size: 1.488rem;
}
}
@media only screen and (min-width: 360px) {
.flow-text {
line-height: 2.048rem;
}
}
@media only screen and (min-width: 750px) {
.flow-text {
font-size: 1.512rem;
}
}
@media only screen and (min-width: 390px) {
.flow-text {
line-height: 2.152rem;
}
}
@media only screen and (min-width: 780px) {
.flow-text {
font-size: 1.536rem;
}
}
@media only screen and (min-width: 420px) {
.flow-text {
line-height: 2.256rem;
}
}
@media only screen and (min-width: 810px) {
.flow-text {
font-size: 1.56rem;
}
}
@media only screen and (min-width: 450px) {
.flow-text {
line-height: 2.36rem;
}
}
@media only screen and (min-width: 840px) {
.flow-text {
font-size: 1.584rem;
}
}
@media only screen and (min-width: 480px) {
.flow-text {
line-height: 2.464rem;
}
}
@media only screen and (min-width: 870px) {
.flow-text {
font-size: 1.608rem;
}
}
@media only screen and (min-width: 510px) {
.flow-text {
line-height: 2.568rem;
}
}
@media only screen and (min-width: 900px) {
.flow-text {
font-size: 1.632rem;
}
}
@media only screen and (min-width: 540px) {
.flow-text {
line-height: 2.672rem;
}
}
@media only screen and (min-width: 930px) {
.flow-text {
font-size: 1.656rem;
}
}
@media only screen and (min-width: 570px) {
.flow-text {
line-height: 2.776rem;
}
}
@media only screen and (min-width: 960px) {
.flow-text {
font-size: 1.68rem;
}
}
@media only screen and (min-width: 600px) {
.flow-text {
line-height: 2.88rem;
}
}
.card-panel {
padding: 20px;
margin: 0.5rem 0 1rem 0;
border-radius: 2px;
background-color: #fff;
}
.card {
position: relative;
overflow: hidden;
margin: 0.5rem 0 1rem 0;
background-color: #fff;
border-radius: 2px;
}
.card .card-title {
color: #fff;
font-size: 24px;
font-weight: 300;
}
.card .card-title.activator {
cursor: pointer;
}
.card.small, .card.medium, .card.large {
position: relative;
}
.card.small .card-image, .card.medium .card-image, .card.large .card-image {
overflow: hidden;
}
.card.small .card-content, .card.medium .card-content, .card.large .card-content {
overflow: hidden;
}
.card.small .card-action, .card.medium .card-action, .card.large .card-action {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
.card.small {
height: 300px;
}
.card.small .card-image {
height: 150px;
}
.card.small .card-content {
height: 150px;
}
.card.medium {
height: 400px;
}
.card.medium .card-image {
height: 250px;
}
.card.medium .card-content {
height: 150px;
}
.card.large {
height: 500px;
}
.card.large .card-image {
height: 330px;
}
.card.large .card-content {
height: 170px;
}
.card .card-image {
position: relative;
}
.card .card-image img {
border-radius: 2px 2px 0 0;
position: relative;
left: 0;
right: 0;
top: 0;
bottom: 0;
width: 100%;
}
.card .card-image .card-title {
position: absolute;
bottom: 0;
left: 0;
padding: 20px;
}
.card .card-content {
padding: 20px;
border-radius: 0 0 2px 2px;
}
.card .card-content p {
margin: 0;
color: inherit;
}
.card .card-content .card-title {
line-height: 48px;
}
.card .card-action {
border-top: 1px solid rgba(160, 160, 160, 0.2);
padding: 20px;
}
.card .card-action a {
color: #ffab40;
margin-right: 20px;
-webkit-transition: color .3s ease;
-moz-transition: color .3s ease;
-o-transition: color .3s ease;
-ms-transition: color .3s ease;
transition: color .3s ease;
text-transform: uppercase;
}
.card .card-action a:hover {
color: #ffd8a6;
}
.card .card-reveal {
padding: 20px;
position: absolute;
background-color: #FFF;
width: 100%;
overflow-y: auto;
top: 100%;
height: 100%;
z-index: 1;
display: none;
}
.card .card-reveal .card-title {
cursor: pointer;
display: block;
}
#toast-container {
display: block;
position: fixed;
z-index: 1001;
}
@media only screen and (max-width: 600px) {
#toast-container {
min-width: 100%;
bottom: 0%;
}
}
@media only screen and (min-width: 601px) and (max-width: 992px) {
#toast-container {
min-width: 30%;
left: 5%;
bottom: 7%;
}
}
@media only screen and (min-width: 993px) {
#toast-container {
min-width: 8%;
top: 10%;
right: 7%;
}
}
.toast {
border-radius: 2px;
top: 0;
width: auto;
clear: both;
margin-top: 10px;
position: relative;
max-width: 100%;
height: 48px;
line-height: 48px;
background-color: #323232;
padding: 0 25px;
font-size: 1.1rem;
font-weight: 300;
color: #fff;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: space-between;
justify-content: space-between;
}
.toast .btn, .toast .btn-large, .toast .btn-flat {
margin: 0;
margin-left: 3rem;
}
.toast.rounded {
border-radius: 24px;
}
@media only screen and (max-width: 600px) {
.toast {
width: 100%;
border-radius: 0;
}
}
@media only screen and (min-width: 601px) and (max-width: 992px) {
.toast {
float: left;
}
}
@media only screen and (min-width: 993px) {
.toast {
float: right;
}
}
.tabs {
position: relative;
height: 48px;
background-color: #fff;
margin: 0 auto;
width: 100%;
white-space: nowrap;
}
.tabs .tab {
display: block;
float: left;
text-align: center;
line-height: 48px;
height: 48px;
padding: 0 20px;
margin: 0;
text-transform: uppercase;
letter-spacing: .8px;
width: 15%;
}
.tabs .tab a {
color: #ee6e73;
display: block;
width: 100%;
height: 100%;
-webkit-transition: color .28s ease;
-moz-transition: color .28s ease;
-o-transition: color .28s ease;
-ms-transition: color .28s ease;
transition: color .28s ease;
}
.tabs .tab a:hover {
color: #f9c9cb;
}
.tabs .indicator {
position: absolute;
bottom: 0;
height: 2px;
background-color: #f6b2b5;
will-change: left, right;
}
.tabs .tab {
padding: 0;
}
.material-tooltip {
padding: 10px 8px;
font-size: 1rem;
z-index: 1000;
background-color: transparent;
border-radius: 2px;
color: #fff;
min-height: 36px;
line-height: 1rem;
opacity: 0;
display: none;
position: absolute;
text-align: center;
overflow: hidden;
left: 0;
top: 0;
will-change: top, left;
}
.backdrop {
position: absolute;
opacity: 0;
display: none;
height: 7px;
width: 14px;
border-radius: 0 0 14px 14px;
background-color: #323232;
z-index: -1;
-webkit-transform-origin: 50% 10%;
-moz-transform-origin: 50% 10%;
-ms-transform-origin: 50% 10%;
-o-transform-origin: 50% 10%;
transform-origin: 50% 10%;
will-change: transform, opacity;
}
.btn, .btn-large, .btn-flat {
border: none;
border-radius: 2px;
display: inline-block;
height: 36px;
line-height: 36px;
outline: 0;
padding: 0 2rem;
text-transform: uppercase;
vertical-align: middle;
-webkit-tap-highlight-color: transparent;
}
.btn.disabled, .disabled.btn-large, .btn-floating.disabled, .btn-large.disabled, .btn:disabled, .btn-large:disabled, .btn-large:disabled, .btn-floating:disabled {
background-color: #DFDFDF;
box-shadow: none;
color: #9F9F9F;
cursor: default;
}
.btn.disabled *, .disabled.btn-large *, .btn-floating.disabled *, .btn-large.disabled *, .btn:disabled *, .btn-large:disabled *, .btn-large:disabled *, .btn-floating:disabled * {
pointer-events: none;
}
.btn.disabled:hover, .disabled.btn-large:hover, .btn-floating.disabled:hover, .btn-large.disabled:hover, .btn:disabled:hover, .btn-large:disabled:hover, .btn-large:disabled:hover, .btn-floating:disabled:hover {
background-color: #DFDFDF;
color: #9F9F9F;
}
.btn i, .btn-large i, .btn-floating i, .btn-large i, .btn-flat i {
font-size: 1.3rem;
line-height: inherit;
}
.btn, .btn-large {
text-decoration: none;
color: #FFF;
background-color: #26a69a;
text-align: center;
letter-spacing: .5px;
-webkit-transition: .2s ease-out;
-moz-transition: .2s ease-out;
-o-transition: .2s ease-out;
-ms-transition: .2s ease-out;
transition: .2s ease-out;
cursor: pointer;
}
.btn:hover, .btn-large:hover {
background-color: #2bbbad;
}
.btn-floating {
display: inline-block;
color: #FFF;
position: relative;
overflow: hidden;
z-index: 1;
width: 37px;
height: 37px;
line-height: 37px;
padding: 0;
background-color: #26a69a;
border-radius: 50%;
transition: .3s;
cursor: pointer;
vertical-align: middle;
}
.btn-floating i {
width: inherit;
display: inline-block;
text-align: center;
color: #FFF;
font-size: 1.6rem;
line-height: 37px;
}
.btn-floating:before {
border-radius: 0;
}
.btn-floating.btn-large {
width: 55.5px;
height: 55.5px;
}
.btn-floating.btn-large i {
line-height: 55.5px;
}
button.btn-floating {
border: none;
}
.fixed-action-btn {
position: fixed;
right: 23px;
bottom: 23px;
padding-top: 15px;
margin-bottom: 0;
z-index: 998;
}
.fixed-action-btn ul {
left: 0;
right: 0;
text-align: center;
position: absolute;
bottom: 64px;
}
.fixed-action-btn ul li {
margin-bottom: 15px;
}
.fixed-action-btn ul a.btn-floating {
opacity: 0;
}
.btn-flat {
box-shadow: none;
background-color: transparent;
color: #343434;
cursor: pointer;
}
.btn-flat.disabled {
color: #b3b3b3;
cursor: default;
}
.btn-large {
height: 54px;
line-height: 56px;
}
.btn-large i {
font-size: 1.6rem;
}
.dropdown-content {
background-color: #FFFFFF;
margin: 0;
display: none;
min-width: 100px;
max-height: 650px;
overflow-y: auto;
opacity: 0;
position: absolute;
white-space: nowrap;
z-index: 1;
will-change: width, height;
}
.dropdown-content li {
clear: both;
color: rgba(0, 0, 0, 0.87);
cursor: pointer;
line-height: 1.5rem;
width: 100%;
text-align: left;
text-transform: none;
}
.dropdown-content li:hover, .dropdown-content li.active {
background-color: #eee;
}
.dropdown-content li > a, .dropdown-content li > span {
font-size: 1.2rem;
color: #26a69a;
display: block;
padding: 1rem 1rem;
}
.waves-effect {
position: relative;
cursor: pointer;
display: inline-block;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
vertical-align: middle;
z-index: 1;
will-change: opacity, transform;
-webkit-transition: all .3s ease-out;
-moz-transition: all .3s ease-out;
-o-transition: all .3s ease-out;
-ms-transition: all .3s ease-out;
transition: all .3s ease-out;
}
.waves-effect .waves-ripple {
position: absolute;
border-radius: 50%;
width: 20px;
height: 20px;
margin-top: -10px;
margin-left: -10px;
opacity: 0;
background: rgba(0, 0, 0, 0.2);
-webkit-transition: all 0.7s ease-out;
-moz-transition: all 0.7s ease-out;
-o-transition: all 0.7s ease-out;
-ms-transition: all 0.7s ease-out;
transition: all 0.7s ease-out;
-webkit-transition-property: -webkit-transform, opacity;
-moz-transition-property: -moz-transform, opacity;
-o-transition-property: -o-transform, opacity;
transition-property: transform, opacity;
-webkit-transform: scale(0);
-moz-transform: scale(0);
-ms-transform: scale(0);
-o-transform: scale(0);
transform: scale(0);
pointer-events: none;
}
.waves-effect.waves-light .waves-ripple {
background-color: rgba(255, 255, 255, 0.45);
}
.waves-effect.waves-red .waves-ripple {
background-color: rgba(244, 67, 54, 0.7);
}
.waves-effect.waves-yellow .waves-ripple {
background-color: rgba(255, 235, 59, 0.7);
}
.waves-effect.waves-orange .waves-ripple {
background-color: rgba(255, 152, 0, 0.7);
}
.waves-effect.waves-purple .waves-ripple {
background-color: rgba(156, 39, 176, 0.7);
}
.waves-effect.waves-green .waves-ripple {
background-color: rgba(76, 175, 80, 0.7);
}
.waves-effect.waves-teal .waves-ripple {
background-color: rgba(0, 150, 136, 0.7);
}
.waves-notransition {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
-ms-transition: none !important;
transition: none !important;
}
.waves-circle {
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
}
.waves-input-wrapper {
border-radius: 0.2em;
vertical-align: bottom;
}
.waves-input-wrapper .waves-button-input {
position: relative;
top: 0;
left: 0;
z-index: 1;
}
.waves-circle {
text-align: center;
width: 2.5em;
height: 2.5em;
line-height: 2.5em;
border-radius: 50%;
-webkit-mask-image: none;
}
.waves-block {
display: block;
}
/* Firefox Bug: link not triggered */
a.waves-effect .waves-ripple {
z-index: -1;
}
.modal {
display: none;
position: fixed;
left: 0;
right: 0;
background-color: #fafafa;
padding: 0;
max-height: 70%;
width: 55%;
margin: auto;
overflow-y: auto;
z-index: 1000;
border-radius: 2px;
-webkit-transform: translate(0);
-moz-transform: translate(0);
-ms-transform: translate(0);
-o-transform: translate(0);
transform: translate(0);
will-change: top, opacity;
}
@media only screen and (max-width: 992px) {
.modal {
width: 80%;
}
}
.modal h1, .modal h2, .modal h3, .modal h4 {
margin-top: 0;
}
.modal .modal-content {
padding: 24px;
}
.modal .modal-footer {
border-radius: 0 0 2px 2px;
background-color: #fafafa;
padding: 4px 6px;
height: 56px;
width: 100%;
}
.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-flat {
float: right;
margin: 6px 0;
}
#lean-overlay {
position: fixed;
z-index: 999;
top: 0;
left: 0;
bottom: 0;
right: 0;
height: 115%;
width: 100%;
background: #000;
display: none;
will-change: opacity;
}
.modal.modal-fixed-footer {
padding: 0;
height: 70%;
}
.modal.modal-fixed-footer .modal-content {
position: fixed;
max-height: 100%;
padding-bottom: 64px;
width: 100%;
overflow-y: auto;
}
.modal.modal-fixed-footer .modal-footer {
border-top: 1px solid rgba(0, 0, 0, 0.1);
position: fixed;
bottom: 0;
}
.modal.bottom-sheet {
top: auto;
bottom: -100%;
margin: 0;
width: 100%;
max-height: 45%;
border-radius: 0;
will-change: bottom, opacity;
}
.collapsible {
border-top: 1px solid #ddd;
border-right: 1px solid #ddd;
border-left: 1px solid #ddd;
margin: 0.5rem 0 1rem 0;
}
.collapsible-header {
display: block;
cursor: pointer;
height: 3rem;
line-height: 3rem;
padding: 0 1rem;
background-color: #fff;
border-bottom: 1px solid #ddd;
}
.collapsible-header i {
width: 2rem;
font-size: 1.6rem;
line-height: 3rem;
display: block;
float: left;
text-align: center;
margin-right: 1rem;
}
.collapsible-body {
overflow: hidden;
display: none;
border-bottom: 1px solid #ddd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.collapsible-body p {
margin: 0;
padding: 2rem;
}
.side-nav .collapsible {
border: none;
box-shadow: none;
}
.side-nav .collapsible li {
padding: 0;
}
.side-nav .collapsible-header {
background-color: transparent;
border: none;
line-height: inherit;
height: inherit;
margin: 0 1rem;
}
.side-nav .collapsible-header i {
line-height: inherit;
}
.side-nav .collapsible-body {
border: 0;
background-color: #FFF;
}
.side-nav .collapsible-body li a {
margin: 0 1rem 0 2rem;
}
.collapsible.popout {
border: none;
box-shadow: none;
}
.collapsible.popout > li {
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
transform: scaleX(.92) translate3d(0, 0, 0);
transition: margin .35s cubic-bezier(0.25, 0.46, 0.45, 0.94), transform .35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.collapsible.popout > li:hover {
will-change: margin, transform;
}
.collapsible.popout > li.active {
box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
margin: 16px 0;
transform: scaleX(1) translate3d(0, 0, 0);
}
.materialboxed {
cursor: zoom-in;
position: relative;
-webkit-transition: opacity .4s;
-moz-transition: opacity .4s;
-o-transition: opacity .4s;
-ms-transition: opacity .4s;
transition: opacity .4s;
}
.materialboxed:hover {
will-change: left, top, width, height;
}
.materialboxed:hover:not(.active) {
opacity: .8;
}
.materialboxed.active {
cursor: zoom-out;
}
#materialbox-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #292929;
z-index: 999;
will-change: opacity;
}
.materialbox-caption {
position: fixed;
display: none;
color: #fff;
line-height: 50px;
bottom: 0;
width: 100%;
text-align: center;
padding: 0% 15%;
height: 50px;
z-index: 1000;
-webkit-font-smoothing: antialiased;
}
/* Remove Focus Boxes */
select:focus {
outline: 1px solid #c9f3ef;
}
button:focus {
outline: none;
background-color: #2ab7a9;
}
label {
font-size: 0.8rem;
color: #9e9e9e;
}
/***************************
Text Inputs + Textarea
****************************/
::-webkit-input-placeholder {
color: #d1d1d1;
}
:-moz-placeholder {
/* Firefox 18- */
color: #d1d1d1;
}
::-moz-placeholder {
/* Firefox 19+ */
color: #d1d1d1;
}
:-ms-input-placeholder {
color: #d1d1d1;
}
input[type=text], input[type=password], input[type=email], input[type=url], input[type=time], input[type=date], input[type=datetime-local], input[type=tel], input[type=number], input[type=search], textarea.materialize-textarea {
background-color: transparent;
border: none;
border-bottom: 1px solid #9e9e9e;
border-radius: 0;
outline: none;
height: 3rem;
width: 100%;
font-size: 1rem;
margin: 0 0 15px 0;
padding: 0;
box-shadow: none;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
transition: all .3s;
}
input[type=text]:disabled, input[type=text][readonly="readonly"], input[type=password]:disabled, input[type=password][readonly="readonly"], input[type=email]:disabled, input[type=email][readonly="readonly"], input[type=url]:disabled, input[type=url][readonly="readonly"], input[type=time]:disabled, input[type=time][readonly="readonly"], input[type=date]:disabled, input[type=date][readonly="readonly"], input[type=datetime-local]:disabled, input[type=datetime-local][readonly="readonly"], input[type=tel]:disabled, input[type=tel][readonly="readonly"], input[type=number]:disabled, input[type=number][readonly="readonly"], input[type=search]:disabled, input[type=search][readonly="readonly"], textarea.materialize-textarea:disabled, textarea.materialize-textarea[readonly="readonly"] {
color: rgba(0, 0, 0, 0.26);
border-bottom: 1px dotted rgba(0, 0, 0, 0.26);
}
input[type=text]:disabled + label, input[type=text][readonly="readonly"] + label, input[type=password]:disabled + label, input[type=password][readonly="readonly"] + label, input[type=email]:disabled + label, input[type=email][readonly="readonly"] + label, input[type=url]:disabled + label, input[type=url][readonly="readonly"] + label, input[type=time]:disabled + label, input[type=time][readonly="readonly"] + label, input[type=date]:disabled + label, input[type=date][readonly="readonly"] + label, input[type=datetime-local]:disabled + label, input[type=datetime-local][readonly="readonly"] + label, input[type=tel]:disabled + label, input[type=tel][readonly="readonly"] + label, input[type=number]:disabled + label, input[type=number][readonly="readonly"] + label, input[type=search]:disabled + label, input[type=search][readonly="readonly"] + label, textarea.materialize-textarea:disabled + label, textarea.materialize-textarea[readonly="readonly"] + label {
color: rgba(0, 0, 0, 0.26);
}
input[type=text]:focus:not([readonly]), input[type=password]:focus:not([readonly]), input[type=email]:focus:not([readonly]), input[type=url]:focus:not([readonly]), input[type=time]:focus:not([readonly]), input[type=date]:focus:not([readonly]), input[type=datetime-local]:focus:not([readonly]), input[type=tel]:focus:not([readonly]), input[type=number]:focus:not([readonly]), input[type=search]:focus:not([readonly]), textarea.materialize-textarea:focus:not([readonly]) {
border-bottom: 1px solid #26a69a;
box-shadow: 0 1px 0 0 #26a69a;
}
input[type=text]:focus:not([readonly]) + label, input[type=password]:focus:not([readonly]) + label, input[type=email]:focus:not([readonly]) + label, input[type=url]:focus:not([readonly]) + label, input[type=time]:focus:not([readonly]) + label, input[type=date]:focus:not([readonly]) + label, input[type=datetime-local]:focus:not([readonly]) + label, input[type=tel]:focus:not([readonly]) + label, input[type=number]:focus:not([readonly]) + label, input[type=search]:focus:not([readonly]) + label, textarea.materialize-textarea:focus:not([readonly]) + label {
color: #26a69a;
}
input[type=text].valid, input[type=text]:focus.valid, input[type=password].valid, input[type=password]:focus.valid, input[type=email].valid, input[type=email]:focus.valid, input[type=url].valid, input[type=url]:focus.valid, input[type=time].valid, input[type=time]:focus.valid, input[type=date].valid, input[type=date]:focus.valid, input[type=datetime-local].valid, input[type=datetime-local]:focus.valid, input[type=tel].valid, input[type=tel]:focus.valid, input[type=number].valid, input[type=number]:focus.valid, input[type=search].valid, input[type=search]:focus.valid, textarea.materialize-textarea.valid, textarea.materialize-textarea:focus.valid {
border-bottom: 1px solid #4CAF50;
box-shadow: 0 1px 0 0 #4CAF50;
}
input[type=text].invalid, input[type=text]:focus.invalid, input[type=password].invalid, input[type=password]:focus.invalid, input[type=email].invalid, input[type=email]:focus.invalid, input[type=url].invalid, input[type=url]:focus.invalid, input[type=time].invalid, input[type=time]:focus.invalid, input[type=date].invalid, input[type=date]:focus.invalid, input[type=datetime-local].invalid, input[type=datetime-local]:focus.invalid, input[type=tel].invalid, input[type=tel]:focus.invalid, input[type=number].invalid, input[type=number]:focus.invalid, input[type=search].invalid, input[type=search]:focus.invalid, textarea.materialize-textarea.invalid, textarea.materialize-textarea:focus.invalid {
border-bottom: 1px solid #F44336;
box-shadow: 0 1px 0 0 #F44336;
}
.input-field {
position: relative;
margin-top: 1rem;
}
.input-field label {
color: #9e9e9e;
position: absolute;
top: 0.8rem;
left: 0.75rem;
font-size: 1rem;
cursor: text;
-webkit-transition: .2s ease-out;
-moz-transition: .2s ease-out;
-o-transition: .2s ease-out;
-ms-transition: .2s ease-out;
transition: .2s ease-out;
}
.input-field label.active {
font-size: 0.8rem;
-webkit-transform: translateY(-140%);
-moz-transform: translateY(-140%);
-ms-transform: translateY(-140%);
-o-transform: translateY(-140%);
transform: translateY(-140%);
}
.input-field .prefix {
position: absolute;
width: 3rem;
font-size: 2rem;
-webkit-transition: color .2s;
-moz-transition: color .2s;
-o-transition: color .2s;
-ms-transition: color .2s;
transition: color .2s;
}
.input-field .prefix.active {
color: #26a69a;
}
.input-field .prefix ~ input, .input-field .prefix ~ textarea {
margin-left: 3rem;
width: 92%;
width: calc(100% - 3rem);
}
.input-field .prefix ~ textarea {
padding-top: .8rem;
}
.input-field .prefix ~ label {
margin-left: 3rem;
}
@media only screen and (max-width: 992px) {
.input-field .prefix ~ input {
width: 86%;
width: calc(100% - 3rem);
}
}
@media only screen and (max-width: 600px) {
.input-field .prefix ~ input {
width: 80%;
width: calc(100% - 3rem);
}
}
.input-field input[type=search] {
display: block;
line-height: inherit;
padding-left: 4rem;
width: calc(100% - 4rem);
}
.input-field input[type=search]:focus {
background-color: #FFF;
border: 0;
box-shadow: none;
color: #444;
}
.input-field input[type=search]:focus + label i, .input-field input[type=search]:focus ~ .mdi-navigation-close {
color: #444;
}
.input-field input[type=search] + label {
left: 1rem;
}
.input-field input[type=search] ~ .mdi-navigation-close {
position: absolute;
top: 0;
right: 1rem;
color: transparent;
cursor: pointer;
font-size: 2rem;
transition: .3s color;
}
textarea {
width: 100%;
height: 3rem;
background-color: transparent;
}
textarea.materialize-textarea {
overflow-y: hidden;
/* prevents scroll bar flash */
padding: 1.6rem 0;
/* prevents text jump on Enter keypress */
resize: none;
min-height: 3rem;
}
.hiddendiv {
display: none;
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
/* future version of deprecated 'word-wrap' */
padding-top: 1.2rem;
/* prevents text jump on Enter keypress */
}
/***************
Radio Buttons
***************/
/* Remove default Radio Buttons */
[type="radio"]:not(:checked), [type="radio"]:checked {
position: absolute;
left: -9999px;
visibility: hidden;
}
[type="radio"]:not(:checked) + label, [type="radio"]:checked + label {
position: relative;
padding-left: 35px;
cursor: pointer;
display: inline-block;
height: 25px;
line-height: 25px;
font-size: 1rem;
-webkit-transition: .28s ease;
-moz-transition: .28s ease;
-o-transition: .28s ease;
-ms-transition: .28s ease;
transition: .28s ease;
-webkit-user-select: none;
/* webkit (safari, chrome) browsers */
-moz-user-select: none;
/* mozilla browsers */
-khtml-user-select: none;
/* webkit (konqueror) browsers */
-ms-user-select: none;
/* IE10+ */
}
[type="radio"] + label:before, [type="radio"] + label:after {
content: '';
position: absolute;
left: 0;
top: 0;
margin: 4px;
width: 16px;
height: 16px;
z-index: 0;
-webkit-transition: .28s ease;
-moz-transition: .28s ease;
-o-transition: .28s ease;
-ms-transition: .28s ease;
transition: .28s ease;
}
/* Unchecked styles */
[type="radio"]:not(:checked) + label:before {
border-radius: 50%;
border: 2px solid #5a5a5a;
}
[type="radio"]:not(:checked) + label:after {
border-radius: 50%;
border: 2px solid #5a5a5a;
z-index: -1;
-webkit-transform: scale(0);
-moz-transform: scale(0);
-ms-transform: scale(0);
-o-transform: scale(0);
transform: scale(0);
}
/* Checked styles */
[type="radio"]:checked + label:before {
border-radius: 50%;
border: 2px solid transparent;
}
[type="radio"]:checked + label:after {
border-radius: 50%;
border: 2px solid #26a69a;
background-color: #26a69a;
z-index: 0;
-webkit-transform: scale(1.02);
-moz-transform: scale(1.02);
-ms-transform: scale(1.02);
-o-transform: scale(1.02);
transform: scale(1.02);
}
/* Radio With gap */
[type="radio"].with-gap:checked + label:before {
border-radius: 50%;
border: 2px solid #26a69a;
}
[type="radio"].with-gap:checked + label:after {
border-radius: 50%;
border: 2px solid #26a69a;
background-color: #26a69a;
z-index: 0;
-webkit-transform: scale(.5);
-moz-transform: scale(.5);
-ms-transform: scale(.5);
-o-transform: scale(.5);
transform: scale(.5);
}
/* Disabled style */
[type="radio"]:disabled:not(:checked) + label:before, [type="radio"]:disabled:checked + label:before {
background-color: transparent;
border-color: rgba(0, 0, 0, 0.26);
}
[type="radio"]:disabled + label {
color: rgba(0, 0, 0, 0.26);
}
[type="radio"]:disabled:not(:checked) + label:hover:before {
border-color: rgba(0, 0, 0, 0.26);
}
/***************
Checkboxes
***************/
/* CUSTOM CSS CHECKBOXES */
form p {
margin-bottom: 10px;
text-align: left;
}
form p:last-child {
margin-bottom: 0;
}
/* Remove default checkbox */
[type="checkbox"]:not(:checked), [type="checkbox"]:checked {
position: absolute;
left: -9999px;
}
[type="checkbox"] {
/* checkbox aspect */
}
[type="checkbox"] + label {
position: relative;
padding-left: 35px;
cursor: pointer;
display: inline-block;
height: 25px;
line-height: 25px;
font-size: 1rem;
-webkit-user-select: none;
/* webkit (safari, chrome) browsers */
-moz-user-select: none;
/* mozilla browsers */
-khtml-user-select: none;
/* webkit (konqueror) browsers */
-ms-user-select: none;
/* IE10+ */
}
[type="checkbox"] + label:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 18px;
height: 18px;
z-index: 0;
border: 2px solid #5a5a5a;
border-radius: 1px;
margin-top: 2px;
-webkit-transition: 0.2s;
-moz-transition: 0.2s;
-o-transition: 0.2s;
-ms-transition: 0.2s;
transition: 0.2s;
}
[type="checkbox"]:not(:checked):disabled + label:before {
border: none;
background-color: rgba(0, 0, 0, 0.26);
}
[type="checkbox"]:checked + label:before {
top: -4px;
left: -3px;
width: 12px;
height: 22px;
border-top: 2px solid transparent;
border-left: 2px solid transparent;
border-right: 2px solid #26a69a;
border-bottom: 2px solid #26a69a;
-webkit-transform: rotate(40deg);
-moz-transform: rotate(40deg);
-ms-transform: rotate(40deg);
-o-transform: rotate(40deg);
transform: rotate(40deg);
-webkit-backface-visibility: hidden;
-webkit-transform-origin: 100% 100%;
-moz-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
-o-transform-origin: 100% 100%;
transform-origin: 100% 100%;
}
[type="checkbox"]:checked:disabled + label:before {
border-right: 2px solid rgba(0, 0, 0, 0.26);
border-bottom: 2px solid rgba(0, 0, 0, 0.26);
}
/* Indeterminate checkbox */
[type="checkbox"]:indeterminate + label:before {
left: -10px;
top: -11px;
width: 10px;
height: 22px;
border-top: none;
border-left: none;
border-right: 2px solid #26a69a;
border-bottom: none;
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
-webkit-backface-visibility: hidden;
-webkit-transform-origin: 100% 100%;
-moz-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
-o-transform-origin: 100% 100%;
transform-origin: 100% 100%;
}
[type="checkbox"]:indeterminate:disabled + label:before {
border-right: 2px solid rgba(0, 0, 0, 0.26);
background-color: transparent;
}
[type="checkbox"].filled-in + label:after {
border-radius: 2px;
}
[type="checkbox"].filled-in + label:before, [type="checkbox"].filled-in + label:after {
content: '';
left: 0;
position: absolute;
/* .1s delay is for check animation */
transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s;
z-index: 1;
}
[type="checkbox"].filled-in:not(:checked) + label:before {
width: 0;
height: 0;
border: 3px solid transparent;
left: 6px;
top: 10px;
-webkit-transform: rotateZ(37deg);
transform: rotateZ(37deg);
-webkit-transform-origin: 20% 40%;
transform-origin: 100% 100%;
}
[type="checkbox"].filled-in:not(:checked) + label:after {
height: 20px;
width: 20px;
background-color: transparent;
border: 2px solid #5a5a5a;
top: 0px;
z-index: 0;
}
[type="checkbox"].filled-in:checked + label:before {
top: 0;
left: 1px;
width: 8px;
height: 13px;
border-top: 2px solid transparent;
border-left: 2px solid transparent;
border-right: 2px solid #fff;
border-bottom: 2px solid #fff;
-webkit-transform: rotateZ(37deg);
transform: rotateZ(37deg);
-webkit-transform-origin: 100% 100%;
transform-origin: 100% 100%;
}
[type="checkbox"].filled-in:checked + label:after {
top: 0px;
width: 20px;
height: 20px;
border: 2px solid #26a69a;
background-color: #26a69a;
z-index: 0;
}
[type="checkbox"].filled-in:disabled:not(:checked) + label:before {
background-color: transparent;
border: 2px solid transparent;
}
[type="checkbox"].filled-in:disabled:not(:checked) + label:after {
border-color: transparent;
background-color: #BDBDBD;
}
[type="checkbox"].filled-in:disabled:checked + label:before {
background-color: transparent;
}
[type="checkbox"].filled-in:disabled:checked + label:after {
background-color: #BDBDBD;
border-color: #BDBDBD;
}
/***************
Switch
***************/
.switch, .switch * {
-webkit-user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-ms-user-select: none;
}
.switch label {
cursor: pointer;
}
.switch label input[type=checkbox] {
opacity: 0;
width: 0;
height: 0;
}
.switch label input[type=checkbox]:checked + .lever {
background-color: #84c7c1;
}
.switch label input[type=checkbox]:checked + .lever:after {
background-color: #26a69a;
}
.switch label .lever {
content: "";
display: inline-block;
position: relative;
width: 40px;
height: 15px;
background-color: #818181;
border-radius: 15px;
margin-right: 10px;
transition: background 0.3s ease;
vertical-align: middle;
margin: 0 16px;
}
.switch label .lever:after {
content: "";
position: absolute;
display: inline-block;
width: 21px;
height: 21px;
background-color: #F1F1F1;
border-radius: 21px;
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4);
left: -5px;
top: -3px;
transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease;
}
input[type=checkbox]:checked:not(:disabled) ~ .lever:active:after {
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(38, 166, 154, 0.1);
}
input[type=checkbox]:not(:disabled) ~ .lever:active:after {
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.08);
}
.switch label input[type=checkbox]:checked + .lever:after {
left: 24px;
}
.switch input[type=checkbox][disabled] + .lever {
cursor: default;
}
.switch label input[type=checkbox][disabled] + .lever:after, .switch label input[type=checkbox][disabled]:checked + .lever:after {
background-color: #BDBDBD;
}
/***************
Select Field
***************/
.select-label {
position: absolute;
}
.select-wrapper {
position: relative;
}
.select-wrapper input.select-dropdown {
position: relative;
cursor: pointer;
background-color: transparent;
border: none;
border-bottom: 1px solid #9e9e9e;
outline: none;
height: 3rem;
line-height: 3rem;
width: 100%;
font-size: 1rem;
margin: 0 0 15px 0;
padding: 0;
display: block;
}
.select-wrapper .mdi-navigation-arrow-drop-down {
color: initial;
position: absolute;
right: 0;
top: 0;
font-size: 23px;
}
.select-wrapper .mdi-navigation-arrow-drop-down.disabled {
color: rgba(0, 0, 0, 0.26);
}
.select-wrapper + label {
position: absolute;
top: -14px;
font-size: 0.8rem;
}
select {
display: none;
}
select.browser-default {
display: block;
}
select:disabled {
color: rgba(0, 0, 0, 0.3);
}
.select-wrapper input.select-dropdown:disabled {
color: rgba(0, 0, 0, 0.3);
cursor: default;
-webkit-user-select: none;
/* webkit (safari, chrome) browsers */
-moz-user-select: none;
/* mozilla browsers */
-ms-user-select: none;
/* IE10+ */
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
}
.select-wrapper i {
color: rgba(0, 0, 0, 0.3);
}
.select-dropdown li.disabled {
color: rgba(0, 0, 0, 0.3);
background-color: transparent;
}
/***************************
Text Inputs + Textarea
****************************/
select {
background-color: rgba(255, 255, 255, 0.9);
width: 100%;
padding: 5px;
border: 1px solid #f2f2f2;
border-radius: 2px;
height: 3rem;
}
/***************
Nav List
***************/
.table-of-contents.fixed {
position: fixed;
}
.table-of-contents li {
padding: 2px 0;
}
.table-of-contents a {
display: inline-block;
font-weight: 300;
color: #757575;
padding-left: 20px;
height: 1.5rem;
line-height: 1.5rem;
letter-spacing: .4;
display: inline-block;
}
.table-of-contents a:hover {
color: #a8a8a8;
padding-left: 19px;
border-left: 1px solid #ea4a4f;
}
.table-of-contents a.active {
font-weight: 500;
padding-left: 18px;
border-left: 2px solid #ea4a4f;
}
.side-nav {
position: fixed;
width: 240px;
left: -105%;
top: 0;
margin: 0;
height: 100%;
height: calc(100% + 60px);
height: -moz-calc(100%);
padding-bottom: 60px;
background-color: #FFF;
z-index: 999;
overflow-y: auto;
will-change: left;
}
.side-nav.right-aligned {
will-change: right;
right: -105%;
left: auto;
}
.side-nav .collapsible {
margin: 0;
}
.side-nav li {
float: none;
padding: 0 15px;
}
.side-nav li:hover, .side-nav li.active {
background-color: #ddd;
}
.side-nav a {
color: #444;
display: block;
font-size: 1rem;
height: 64px;
line-height: 64px;
padding: 0 15px;
}
.drag-target {
height: 100%;
width: 10px;
position: fixed;
top: 0;
z-index: 998;
}
.side-nav.fixed a {
display: block;
padding: 0 15px;
color: #444;
}
.side-nav.fixed {
left: 0;
position: fixed;
}
.side-nav.fixed.right-aligned {
right: 0;
left: auto;
}
@media only screen and (max-width: 992px) {
.side-nav.fixed {
left: -105%;
}
.side-nav.fixed.right-aligned {
right: -105%;
left: auto;
}
}
.side-nav .collapsible-body li.active, .side-nav.fixed .collapsible-body li.active {
background-color: #ee6e73;
}
.side-nav .collapsible-body li.active a, .side-nav.fixed .collapsible-body li.active a {
color: #fff;
}
#sidenav-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 120vh;
background-color: rgba(0, 0, 0, 0.5);
z-index: 997;
will-change: opacity;
}
/**************************/
/* STYLES FOR THE SPINNER */
/**************************/
/*
* Constants:
* STROKEWIDTH = 3px
* ARCSIZE = 270 degrees (amount of circle the arc takes up)
* ARCTIME = 1333ms (time it takes to expand and contract arc)
* ARCSTARTROT = 216 degrees (how much the start location of the arc
* should rotate each time, 216 gives us a
* 5 pointed star shape (it's 360/5 * 3).
* For a 7 pointed star, we might do
* 360/7 * 3 = 154.286)
* CONTAINERWIDTH = 28px
* SHRINK_TIME = 400ms
*/
.preloader-wrapper {
display: inline-block;
position: relative;
width: 48px;
height: 48px;
}
.preloader-wrapper.small {
width: 36px;
height: 36px;
}
.preloader-wrapper.big {
width: 64px;
height: 64px;
}
.preloader-wrapper.active {
/* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */
-webkit-animation: container-rotate 1568ms linear infinite;
animation: container-rotate 1568ms linear infinite;
}
@-webkit-keyframes container-rotate {
to {
-webkit-transform: rotate(360deg);
}
}
@keyframes container-rotate {
to {
transform: rotate(360deg);
}
}
.spinner-layer {
position: absolute;
width: 100%;
height: 100%;
opacity: 0;
}
.spinner-blue, .spinner-blue-only {
border-color: #4285f4;
}
.spinner-red, .spinner-red-only {
border-color: #db4437;
}
.spinner-yellow, .spinner-yellow-only {
border-color: #f4b400;
}
.spinner-green, .spinner-green-only {
border-color: #0f9d58;
}
/**
* IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):
*
* iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't
* guarantee that the animation will start _exactly_ after that value. So we avoid using
* animation-delay and instead set custom keyframes for each color (as redundant as it
* seems).
*
* We write out each animation in full (instead of separating animation-name,
* animation-duration, etc.) because under the polyfill, Safari does not recognize those
* specific properties properly, treats them as -webkit-animation, and overrides the
* other animation rules. See https://github.com/Polymer/platform/issues/53.
*/
.active .spinner-layer.spinner-blue {
/* durations: 4 * ARCTIME */
-webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
.active .spinner-layer.spinner-red {
/* durations: 4 * ARCTIME */
-webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
.active .spinner-layer.spinner-yellow {
/* durations: 4 * ARCTIME */
-webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
.active .spinner-layer.spinner-green {
/* durations: 4 * ARCTIME */
-webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
.active .spinner-layer.spinner-blue-only, .active .spinner-layer.spinner-red-only, .active .spinner-layer.spinner-yellow-only, .active .spinner-layer.spinner-green-only {
/* durations: 4 * ARCTIME */
opacity: 1;
-webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
@-webkit-keyframes fill-unfill-rotate {
/* 0.5 * ARCSIZE */
/* 1 * ARCSIZE */
/* 1.5 * ARCSIZE */
/* 2 * ARCSIZE */
/* 2.5 * ARCSIZE */
/* 3 * ARCSIZE */
/* 3.5 * ARCSIZE */
/* 4 * ARCSIZE */
12.5% {
-webkit-transform: rotate(135deg);
}
25% {
-webkit-transform: rotate(270deg);
}
37.5% {
-webkit-transform: rotate(405deg);
}
50% {
-webkit-transform: rotate(540deg);
}
62.5% {
-webkit-transform: rotate(675deg);
}
75% {
-webkit-transform: rotate(810deg);
}
87.5% {
-webkit-transform: rotate(945deg);
}
to {
-webkit-transform: rotate(1080deg);
}
}
@keyframes fill-unfill-rotate {
/* 0.5 * ARCSIZE */
/* 1 * ARCSIZE */
/* 1.5 * ARCSIZE */
/* 2 * ARCSIZE */
/* 2.5 * ARCSIZE */
/* 3 * ARCSIZE */
/* 3.5 * ARCSIZE */
/* 4 * ARCSIZE */
12.5% {
transform: rotate(135deg);
}
25% {
transform: rotate(270deg);
}
37.5% {
transform: rotate(405deg);
}
50% {
transform: rotate(540deg);
}
62.5% {
transform: rotate(675deg);
}
75% {
transform: rotate(810deg);
}
87.5% {
transform: rotate(945deg);
}
to {
transform: rotate(1080deg);
}
}
@-webkit-keyframes blue-fade-in-out {
from {
opacity: 1;
}
25% {
opacity: 1;
}
26% {
opacity: 0;
}
89% {
opacity: 0;
}
90% {
opacity: 1;
}
100% {
opacity: 1;
}
}
@keyframes blue-fade-in-out {
from {
opacity: 1;
}
25% {
opacity: 1;
}
26% {
opacity: 0;
}
89% {
opacity: 0;
}
90% {
opacity: 1;
}
100% {
opacity: 1;
}
}
@-webkit-keyframes red-fade-in-out {
from {
opacity: 0;
}
15% {
opacity: 0;
}
25% {
opacity: 1;
}
50% {
opacity: 1;
}
51% {
opacity: 0;
}
}
@keyframes red-fade-in-out {
from {
opacity: 0;
}
15% {
opacity: 0;
}
25% {
opacity: 1;
}
50% {
opacity: 1;
}
51% {
opacity: 0;
}
}
@-webkit-keyframes yellow-fade-in-out {
from {
opacity: 0;
}
40% {
opacity: 0;
}
50% {
opacity: 1;
}
75% {
opacity: 1;
}
76% {
opacity: 0;
}
}
@keyframes yellow-fade-in-out {
from {
opacity: 0;
}
40% {
opacity: 0;
}
50% {
opacity: 1;
}
75% {
opacity: 1;
}
76% {
opacity: 0;
}
}
@-webkit-keyframes green-fade-in-out {
from {
opacity: 0;
}
65% {
opacity: 0;
}
75% {
opacity: 1;
}
90% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes green-fade-in-out {
from {
opacity: 0;
}
65% {
opacity: 0;
}
75% {
opacity: 1;
}
90% {
opacity: 1;
}
100% {
opacity: 0;
}
}
/**
* Patch the gap that appear between the two adjacent div.circle-clipper while the
* spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11).
*/
.gap-patch {
position: absolute;
top: 0;
left: 45%;
width: 10%;
height: 100%;
overflow: hidden;
border-color: inherit;
}
.gap-patch .circle {
width: 1000%;
left: -450%;
}
.circle-clipper {
display: inline-block;
position: relative;
width: 50%;
height: 100%;
overflow: hidden;
border-color: inherit;
}
.circle-clipper .circle {
width: 200%;
height: 100%;
border-width: 3px;
/* STROKEWIDTH */
border-style: solid;
border-color: inherit;
border-bottom-color: transparent !important;
border-radius: 50%;
-webkit-animation: none;
animation: none;
position: absolute;
top: 0;
right: 0;
bottom: 0;
}
.circle-clipper.left .circle {
left: 0;
border-right-color: transparent !important;
-webkit-transform: rotate(129deg);
transform: rotate(129deg);
}
.circle-clipper.right .circle {
left: -100%;
border-left-color: transparent !important;
-webkit-transform: rotate(-129deg);
transform: rotate(-129deg);
}
.active .circle-clipper.left .circle {
/* duration: ARCTIME */
-webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
.active .circle-clipper.right .circle {
/* duration: ARCTIME */
-webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
}
@-webkit-keyframes left-spin {
from {
-webkit-transform: rotate(130deg);
}
50% {
-webkit-transform: rotate(-5deg);
}
to {
-webkit-transform: rotate(130deg);
}
}
@keyframes left-spin {
from {
transform: rotate(130deg);
}
50% {
transform: rotate(-5deg);
}
to {
transform: rotate(130deg);
}
}
@-webkit-keyframes right-spin {
from {
-webkit-transform: rotate(-130deg);
}
50% {
-webkit-transform: rotate(5deg);
}
to {
-webkit-transform: rotate(-130deg);
}
}
@keyframes right-spin {
from {
transform: rotate(-130deg);
}
50% {
transform: rotate(5deg);
}
to {
transform: rotate(-130deg);
}
}
#spinnerContainer.cooldown {
/* duration: SHRINK_TIME */
-webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);
animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);
}
@-webkit-keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.slider {
position: relative;
height: 440px;
width: 100%;
}
.slider.fullscreen {
height: 100%;
width: 100%;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.slider.fullscreen ul.slides {
height: 100%;
}
.slider.fullscreen ul.indicators {
z-index: 2;
bottom: 30px;
}
.slider .slides {
background-color: #9e9e9e;
margin: 0;
height: 400px;
}
.slider .slides li {
opacity: 0;
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 100%;
height: inherit;
overflow: hidden;
}
.slider .slides li img {
height: 100%;
width: 100%;
background-size: cover;
background-position: center;
}
.slider .slides li .caption {
color: #fff;
position: absolute;
top: 15%;
left: 15%;
width: 70%;
opacity: 0;
}
.slider .slides li .caption p {
color: #e0e0e0;
}
.slider .slides li.active {
z-index: 2;
}
.slider .indicators {
position: absolute;
text-align: center;
left: 0;
right: 0;
bottom: 0;
margin: 0;
}
.slider .indicators .indicator-item {
display: inline-block;
position: relative;
cursor: pointer;
height: 16px;
width: 16px;
margin: 0 12px;
background-color: #e0e0e0;
-webkit-transition: background-color .3s;
-moz-transition: background-color .3s;
-o-transition: background-color .3s;
-ms-transition: background-color .3s;
transition: background-color .3s;
border-radius: 50%;
}
.slider .indicators .indicator-item.active {
background-color: #4CAF50;
}
</style>
</head>
<body>
<script>
var JSBigInt = (function () {
"use strict";
/*
Class: BigInteger
An arbitrarily-large integer.
<BigInteger> objects should be considered immutable. None of the "built-in"
methods modify *this* or their arguments. All properties should be
considered private.
All the methods of <BigInteger> instances can be called "statically". The
static versions are convenient if you don't already have a <BigInteger>
object.
As an example, these calls are equivalent.
> BigInteger(4).multiply(5); // returns BigInteger(20);
> BigInteger.multiply(4, 5); // returns BigInteger(20);
> var a = 42;
> var a = BigInteger.toJSValue("0b101010"); // Not completely useless...
*/
var CONSTRUCT = {}; // Unique token to call "private" version of constructor
/*
Constructor: BigInteger()
Convert a value to a <BigInteger>.
Although <BigInteger()> is the constructor for <BigInteger> objects, it is
best not to call it as a constructor. If *n* is a <BigInteger> object, it is
simply returned as-is. Otherwise, <BigInteger()> is equivalent to <parse>
without a radix argument.
> var n0 = BigInteger(); // Same as <BigInteger.ZERO>
> var n1 = BigInteger("123"); // Create a new <BigInteger> with value 123
> var n2 = BigInteger(123); // Create a new <BigInteger> with value 123
> var n3 = BigInteger(n2); // Return n2, unchanged
The constructor form only takes an array and a sign. *n* must be an
array of numbers in little-endian order, where each digit is between 0
and BigInteger.base. The second parameter sets the sign: -1 for
negative, +1 for positive, or 0 for zero. The array is *not copied and
may be modified*. If the array contains only zeros, the sign parameter
is ignored and is forced to zero.
> new BigInteger([5], -1): create a new BigInteger with value -5
Parameters:
n - Value to convert to a <BigInteger>.
Returns:
A <BigInteger> value.
See Also:
<parse>, <BigInteger>
*/
function BigInteger(n, s, token) {
if (token !== CONSTRUCT) {
if (n instanceof BigInteger) {
return n;
} else if (typeof n === "undefined") {
return ZERO;
}
return BigInteger.parse(n);
}
n = n || []; // Provide the nullary constructor for subclasses.
while (n.length && !n[n.length - 1]) {
--n.length;
}
this._d = n;
this._s = n.length ? (s || 1) : 0;
}
BigInteger._construct = function (n, s) {
return new BigInteger(n, s, CONSTRUCT);
};
// Base-10 speedup hacks in parse, toString, exp10 and log functions
// require base to be a power of 10. 10^7 is the largest such power
// that won't cause a precision loss when digits are multiplied.
var BigInteger_base = 10000000;
var BigInteger_base_log10 = 7;
BigInteger.base = BigInteger_base;
BigInteger.base_log10 = BigInteger_base_log10;
var ZERO = new BigInteger([], 0, CONSTRUCT);
// Constant: ZERO
// <BigInteger> 0.
BigInteger.ZERO = ZERO;
var ONE = new BigInteger([1], 1, CONSTRUCT);
// Constant: ONE
// <BigInteger> 1.
BigInteger.ONE = ONE;
var M_ONE = new BigInteger(ONE._d, -1, CONSTRUCT);
// Constant: M_ONE
// <BigInteger> -1.
BigInteger.M_ONE = M_ONE;
// Constant: _0
// Shortcut for <ZERO>.
BigInteger._0 = ZERO;
// Constant: _1
// Shortcut for <ONE>.
BigInteger._1 = ONE;
/*
Constant: small
Array of <BigIntegers> from 0 to 36.
These are used internally for parsing, but useful when you need a "small"
<BigInteger>.
See Also:
<ZERO>, <ONE>, <_0>, <_1>
*/
BigInteger.small = [
ZERO,
ONE,
/* Assuming BigInteger_base > 36 */
new BigInteger([2], 1, CONSTRUCT),
new BigInteger([3], 1, CONSTRUCT),
new BigInteger([4], 1, CONSTRUCT),
new BigInteger([5], 1, CONSTRUCT),
new BigInteger([6], 1, CONSTRUCT),
new BigInteger([7], 1, CONSTRUCT),
new BigInteger([8], 1, CONSTRUCT),
new BigInteger([9], 1, CONSTRUCT),
new BigInteger([10], 1, CONSTRUCT),
new BigInteger([11], 1, CONSTRUCT),
new BigInteger([12], 1, CONSTRUCT),
new BigInteger([13], 1, CONSTRUCT),
new BigInteger([14], 1, CONSTRUCT),
new BigInteger([15], 1, CONSTRUCT),
new BigInteger([16], 1, CONSTRUCT),
new BigInteger([17], 1, CONSTRUCT),
new BigInteger([18], 1, CONSTRUCT),
new BigInteger([19], 1, CONSTRUCT),
new BigInteger([20], 1, CONSTRUCT),
new BigInteger([21], 1, CONSTRUCT),
new BigInteger([22], 1, CONSTRUCT),
new BigInteger([23], 1, CONSTRUCT),
new BigInteger([24], 1, CONSTRUCT),
new BigInteger([25], 1, CONSTRUCT),
new BigInteger([26], 1, CONSTRUCT),
new BigInteger([27], 1, CONSTRUCT),
new BigInteger([28], 1, CONSTRUCT),
new BigInteger([29], 1, CONSTRUCT),
new BigInteger([30], 1, CONSTRUCT),
new BigInteger([31], 1, CONSTRUCT),
new BigInteger([32], 1, CONSTRUCT),
new BigInteger([33], 1, CONSTRUCT),
new BigInteger([34], 1, CONSTRUCT),
new BigInteger([35], 1, CONSTRUCT),
new BigInteger([36], 1, CONSTRUCT)
];
// Used for parsing/radix conversion
BigInteger.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
/*
Method: toString
Convert a <BigInteger> to a string.
When *base* is greater than 10, letters are upper case.
Parameters:
base - Optional base to represent the number in (default is base 10).
Must be between 2 and 36 inclusive, or an Error will be thrown.
Returns:
The string representation of the <BigInteger>.
*/
BigInteger.prototype.toString = function (base) {
base = +base || 10;
if (base < 2 || base > 36) {
throw new Error("illegal radix " + base + ".");
}
if (this._s === 0) {
return "0";
}
if (base === 10) {
var str = this._s < 0 ? "-" : "";
str += this._d[this._d.length - 1].toString();
for (var i = this._d.length - 2; i >= 0; i--) {
var group = this._d[i].toString();
while (group.length < BigInteger_base_log10) group = '0' + group;
str += group;
}
return str;
} else {
var numerals = BigInteger.digits;
base = BigInteger.small[base];
var sign = this._s;
var n = this.abs();
var digits = [];
var digit;
while (n._s !== 0) {
var divmod = n.divRem(base);
n = divmod[0];
digit = divmod[1];
// TODO: This could be changed to unshift instead of reversing at the end.
// Benchmark both to compare speeds.
digits.push(numerals[digit.valueOf()]);
}
return (sign < 0 ? "-" : "") + digits.reverse().join("");
}
};
// Verify strings for parsing
BigInteger.radixRegex = [
/^$/,
/^$/,
/^[01]*$/,
/^[012]*$/,
/^[0-3]*$/,
/^[0-4]*$/,
/^[0-5]*$/,
/^[0-6]*$/,
/^[0-7]*$/,
/^[0-8]*$/,
/^[0-9]*$/,
/^[0-9aA]*$/,
/^[0-9abAB]*$/,
/^[0-9abcABC]*$/,
/^[0-9a-dA-D]*$/,
/^[0-9a-eA-E]*$/,
/^[0-9a-fA-F]*$/,
/^[0-9a-gA-G]*$/,
/^[0-9a-hA-H]*$/,
/^[0-9a-iA-I]*$/,
/^[0-9a-jA-J]*$/,
/^[0-9a-kA-K]*$/,
/^[0-9a-lA-L]*$/,
/^[0-9a-mA-M]*$/,
/^[0-9a-nA-N]*$/,
/^[0-9a-oA-O]*$/,
/^[0-9a-pA-P]*$/,
/^[0-9a-qA-Q]*$/,
/^[0-9a-rA-R]*$/,
/^[0-9a-sA-S]*$/,
/^[0-9a-tA-T]*$/,
/^[0-9a-uA-U]*$/,
/^[0-9a-vA-V]*$/,
/^[0-9a-wA-W]*$/,
/^[0-9a-xA-X]*$/,
/^[0-9a-yA-Y]*$/,
/^[0-9a-zA-Z]*$/
];
/*
Function: parse
Parse a string into a <BigInteger>.
*base* is optional but, if provided, must be from 2 to 36 inclusive. If
*base* is not provided, it will be guessed based on the leading characters
of *s* as follows:
- "0x" or "0X": *base* = 16
- "0c" or "0C": *base* = 8
- "0b" or "0B": *base* = 2
- else: *base* = 10
If no base is provided, or *base* is 10, the number can be in exponential
form. For example, these are all valid:
> BigInteger.parse("1e9"); // Same as "1000000000"
> BigInteger.parse("1.234*10^3"); // Same as 1234
> BigInteger.parse("56789 * 10 ** -2"); // Same as 567
If any characters fall outside the range defined by the radix, an exception
will be thrown.
Parameters:
s - The string to parse.
base - Optional radix (default is to guess based on *s*).
Returns:
a <BigInteger> instance.
*/
BigInteger.parse = function (s, base) {
// Expands a number in exponential form to decimal form.
// expandExponential("-13.441*10^5") === "1344100";
// expandExponential("1.12300e-1") === "0.112300";
// expandExponential(1000000000000000000000000000000) === "1000000000000000000000000000000";
function expandExponential(str) {
str = str.replace(/\s*[*xX]\s*10\s*(\^|\*\*)\s*/, "e");
return str.replace(/^([+\-])?(\d+)\.?(\d*)[eE]([+\-]?\d+)$/, function (x, s, n, f, c) {
c = +c;
var l = c < 0;
var i = n.length + c;
x = (l ? n : f).length;
c = ((c = Math.abs(c)) >= x ? c - x + l : 0);
var z = (new Array(c + 1)).join("0");
var r = n + f;
return (s || "") + (l ? r = z + r : r += z).substr(0, i += l ? z.length : 0) + (i < r.length ? "." + r.substr(i) : "");
});
}
s = s.toString();
if (typeof base === "undefined" || +base === 10) {
s = expandExponential(s);
}
var prefixRE;
if (typeof base === "undefined") {
prefixRE = '0[xcb]';
} else if (base == 16) {
prefixRE = '0x';
} else if (base == 8) {
prefixRE = '0c';
} else if (base == 2) {
prefixRE = '0b';
} else {
prefixRE = '';
}
var parts = new RegExp('^([+\\-]?)(' + prefixRE + ')?([0-9a-z]*)(?:\\.\\d*)?$', 'i').exec(s);
if (parts) {
var sign = parts[1] || "+";
var baseSection = parts[2] || "";
var digits = parts[3] || "";
if (typeof base === "undefined") {
// Guess base
if (baseSection === "0x" || baseSection === "0X") { // Hex
base = 16;
} else if (baseSection === "0c" || baseSection === "0C") { // Octal
base = 8;
} else if (baseSection === "0b" || baseSection === "0B") { // Binary
base = 2;
} else {
base = 10;
}
} else if (base < 2 || base > 36) {
throw new Error("Illegal radix " + base + ".");
}
base = +base;
// Check for digits outside the range
if (!(BigInteger.radixRegex[base].test(digits))) {
throw new Error("Bad digit for radix " + base);
}
// Strip leading zeros, and convert to array
digits = digits.replace(/^0+/, "").split("");
if (digits.length === 0) {
return ZERO;
}
// Get the sign (we know it's not zero)
sign = (sign === "-") ? -1 : 1;
// Optimize 10
if (base == 10) {
var d = [];
while (digits.length >= BigInteger_base_log10) {
d.push(parseInt(digits.splice(digits.length - BigInteger.base_log10, BigInteger.base_log10).join(''), 10));
}
d.push(parseInt(digits.join(''), 10));
return new BigInteger(d, sign, CONSTRUCT);
}
// Do the conversion
var d = ZERO;
base = BigInteger.small[base];
var small = BigInteger.small;
for (var i = 0; i < digits.length; i++) {
d = d.multiply(base).add(small[parseInt(digits[i], 36)]);
}
return new BigInteger(d._d, sign, CONSTRUCT);
} else {
throw new Error("Invalid BigInteger format: " + s);
}
};
/*
Function: add
Add two <BigIntegers>.
Parameters:
n - The number to add to *this*. Will be converted to a <BigInteger>.
Returns:
The numbers added together.
See Also:
<subtract>, <multiply>, <quotient>, <next>
*/
BigInteger.prototype.add = function (n) {
if (this._s === 0) {
return BigInteger(n);
}
n = BigInteger(n);
if (n._s === 0) {
return this;
}
if (this._s !== n._s) {
n = n.negate();
return this.subtract(n);
}
var a = this._d;
var b = n._d;
var al = a.length;
var bl = b.length;
var sum = new Array(Math.max(al, bl) + 1);
var size = Math.min(al, bl);
var carry = 0;
var digit;
for (var i = 0; i < size; i++) {
digit = a[i] + b[i] + carry;
sum[i] = digit % BigInteger_base;
carry = (digit / BigInteger_base) | 0;
}
if (bl > al) {
a = b;
al = bl;
}
for (i = size; carry && i < al; i++) {
digit = a[i] + carry;
sum[i] = digit % BigInteger_base;
carry = (digit / BigInteger_base) | 0;
}
if (carry) {
sum[i] = carry;
}
for (; i < al; i++) {
sum[i] = a[i];
}
return new BigInteger(sum, this._s, CONSTRUCT);
};
/*
Function: negate
Get the additive inverse of a <BigInteger>.
Returns:
A <BigInteger> with the same magnatude, but with the opposite sign.
See Also:
<abs>
*/
BigInteger.prototype.negate = function () {
return new BigInteger(this._d, (-this._s) | 0, CONSTRUCT);
};
/*
Function: abs
Get the absolute value of a <BigInteger>.
Returns:
A <BigInteger> with the same magnatude, but always positive (or zero).
See Also:
<negate>
*/
BigInteger.prototype.abs = function () {
return (this._s < 0) ? this.negate() : this;
};
/*
Function: subtract
Subtract two <BigIntegers>.
Parameters:
n - The number to subtract from *this*. Will be converted to a <BigInteger>.
Returns:
The *n* subtracted from *this*.
See Also:
<add>, <multiply>, <quotient>, <prev>
*/
BigInteger.prototype.subtract = function (n) {
if (this._s === 0) {
return BigInteger(n).negate();
}
n = BigInteger(n);
if (n._s === 0) {
return this;
}
if (this._s !== n._s) {
n = n.negate();
return this.add(n);
}
var m = this;
// negative - negative => -|a| - -|b| => -|a| + |b| => |b| - |a|
if (this._s < 0) {
m = new BigInteger(n._d, 1, CONSTRUCT);
n = new BigInteger(this._d, 1, CONSTRUCT);
}
// Both are positive => a - b
var sign = m.compareAbs(n);
if (sign === 0) {
return ZERO;
} else if (sign < 0) {
// swap m and n
var t = n;
n = m;
m = t;
}
// a > b
var a = m._d;
var b = n._d;
var al = a.length;
var bl = b.length;
var diff = new Array(al); // al >= bl since a > b
var borrow = 0;
var i;
var digit;
for (i = 0; i < bl; i++) {
digit = a[i] - borrow - b[i];
if (digit < 0) {
digit += BigInteger_base;
borrow = 1;
} else {
borrow = 0;
}
diff[i] = digit;
}
for (i = bl; i < al; i++) {
digit = a[i] - borrow;
if (digit < 0) {
digit += BigInteger_base;
} else {
diff[i++] = digit;
break;
}
diff[i] = digit;
}
for (; i < al; i++) {
diff[i] = a[i];
}
return new BigInteger(diff, sign, CONSTRUCT);
};
(function () {
function addOne(n, sign) {
var a = n._d;
var sum = a.slice();
var carry = true;
var i = 0;
while (true) {
var digit = (a[i] || 0) + 1;
sum[i] = digit % BigInteger_base;
if (digit <= BigInteger_base - 1) {
break;
}
++i;
}
return new BigInteger(sum, sign, CONSTRUCT);
}
function subtractOne(n, sign) {
var a = n._d;
var sum = a.slice();
var borrow = true;
var i = 0;
while (true) {
var digit = (a[i] || 0) - 1;
if (digit < 0) {
sum[i] = digit + BigInteger_base;
} else {
sum[i] = digit;
break;
}
++i;
}
return new BigInteger(sum, sign, CONSTRUCT);
}
/*
Function: next
Get the next <BigInteger> (add one).
Returns:
*this* + 1.
See Also:
<add>, <prev>
*/
BigInteger.prototype.next = function () {
switch (this._s) {
case 0:
return ONE;
case -1:
return subtractOne(this, -1);
// case 1:
default:
return addOne(this, 1);
}
};
/*
Function: prev
Get the previous <BigInteger> (subtract one).
Returns:
*this* - 1.
See Also:
<next>, <subtract>
*/
BigInteger.prototype.prev = function () {
switch (this._s) {
case 0:
return M_ONE;
case -1:
return addOne(this, -1);
// case 1:
default:
return subtractOne(this, 1);
}
};
})();
/*
Function: compareAbs
Compare the absolute value of two <BigIntegers>.
Calling <compareAbs> is faster than calling <abs> twice, then <compare>.
Parameters:
n - The number to compare to *this*. Will be converted to a <BigInteger>.
Returns:
-1, 0, or +1 if *|this|* is less than, equal to, or greater than *|n|*.
See Also:
<compare>, <abs>
*/
BigInteger.prototype.compareAbs = function (n) {
if (this === n) {
return 0;
}
if (!(n instanceof BigInteger)) {
if (!isFinite(n)) {
return (isNaN(n) ? n : -1);
}
n = BigInteger(n);
}
if (this._s === 0) {
return (n._s !== 0) ? -1 : 0;
}
if (n._s === 0) {
return 1;
}
var l = this._d.length;
var nl = n._d.length;
if (l < nl) {
return -1;
} else if (l > nl) {
return 1;
}
var a = this._d;
var b = n._d;
for (var i = l - 1; i >= 0; i--) {
if (a[i] !== b[i]) {
return a[i] < b[i] ? -1 : 1;
}
}
return 0;
};
/*
Function: compare
Compare two <BigIntegers>.
Parameters:
n - The number to compare to *this*. Will be converted to a <BigInteger>.
Returns:
-1, 0, or +1 if *this* is less than, equal to, or greater than *n*.
See Also:
<compareAbs>, <isPositive>, <isNegative>, <isUnit>
*/
BigInteger.prototype.compare = function (n) {
if (this === n) {
return 0;
}
n = BigInteger(n);
if (this._s === 0) {
return -n._s;
}
if (this._s === n._s) { // both positive or both negative
var cmp = this.compareAbs(n);
return cmp * this._s;
} else {
return this._s;
}
};
/*
Function: isUnit
Return true iff *this* is either 1 or -1.
Returns:
true if *this* compares equal to <BigInteger.ONE> or <BigInteger.M_ONE>.
See Also:
<isZero>, <isNegative>, <isPositive>, <compareAbs>, <compare>,
<BigInteger.ONE>, <BigInteger.M_ONE>
*/
BigInteger.prototype.isUnit = function () {
return this === ONE ||
this === M_ONE ||
(this._d.length === 1 && this._d[0] === 1);
};
/*
Function: multiply
Multiply two <BigIntegers>.
Parameters:
n - The number to multiply *this* by. Will be converted to a
<BigInteger>.
Returns:
The numbers multiplied together.
See Also:
<add>, <subtract>, <quotient>, <square>
*/
BigInteger.prototype.multiply = function (n) {
// TODO: Consider adding Karatsuba multiplication for large numbers
if (this._s === 0) {
return ZERO;
}
n = BigInteger(n);
if (n._s === 0) {
return ZERO;
}
if (this.isUnit()) {
if (this._s < 0) {
return n.negate();
}
return n;
}
if (n.isUnit()) {
if (n._s < 0) {
return this.negate();
}
return this;
}
if (this === n) {
return this.square();
}
var r = (this._d.length >= n._d.length);
var a = (r ? this : n)._d; // a will be longer than b
var b = (r ? n : this)._d;
var al = a.length;
var bl = b.length;
var pl = al + bl;
var partial = new Array(pl);
var i;
for (i = 0; i < pl; i++) {
partial[i] = 0;
}
for (i = 0; i < bl; i++) {
var carry = 0;
var bi = b[i];
var jlimit = al + i;
var digit;
for (var j = i; j < jlimit; j++) {
digit = partial[j] + bi * a[j - i] + carry;
carry = (digit / BigInteger_base) | 0;
partial[j] = (digit % BigInteger_base) | 0;
}
if (carry) {
digit = partial[j] + carry;
carry = (digit / BigInteger_base) | 0;
partial[j] = digit % BigInteger_base;
}
}
return new BigInteger(partial, this._s * n._s, CONSTRUCT);
};
// Multiply a BigInteger by a single-digit native number
// Assumes that this and n are >= 0
// This is not really intended to be used outside the library itself
BigInteger.prototype.multiplySingleDigit = function (n) {
if (n === 0 || this._s === 0) {
return ZERO;
}
if (n === 1) {
return this;
}
var digit;
if (this._d.length === 1) {
digit = this._d[0] * n;
if (digit >= BigInteger_base) {
return new BigInteger([(digit % BigInteger_base) | 0,
(digit / BigInteger_base) | 0], 1, CONSTRUCT);
}
return new BigInteger([digit], 1, CONSTRUCT);
}
if (n === 2) {
return this.add(this);
}
if (this.isUnit()) {
return new BigInteger([n], 1, CONSTRUCT);
}
var a = this._d;
var al = a.length;
var pl = al + 1;
var partial = new Array(pl);
for (var i = 0; i < pl; i++) {
partial[i] = 0;
}
var carry = 0;
for (var j = 0; j < al; j++) {
digit = n * a[j] + carry;
carry = (digit / BigInteger_base) | 0;
partial[j] = (digit % BigInteger_base) | 0;
}
if (carry) {
partial[j] = carry;
}
return new BigInteger(partial, 1, CONSTRUCT);
};
/*
Function: square
Multiply a <BigInteger> by itself.
This is slightly faster than regular multiplication, since it removes the
duplicated multiplcations.
Returns:
> this.multiply(this)
See Also:
<multiply>
*/
BigInteger.prototype.square = function () {
// Normally, squaring a 10-digit number would take 100 multiplications.
// Of these 10 are unique diagonals, of the remaining 90 (100-10), 45 are repeated.
// This procedure saves (N*(N-1))/2 multiplications, (e.g., 45 of 100 multiplies).
// Based on code by Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org
if (this._s === 0) {
return ZERO;
}
if (this.isUnit()) {
return ONE;
}
var digits = this._d;
var length = digits.length;
var imult1 = new Array(length + length + 1);
var product, carry, k;
var i;
// Calculate diagonal
for (i = 0; i < length; i++) {
k = i * 2;
product = digits[i] * digits[i];
carry = (product / BigInteger_base) | 0;
imult1[k] = product % BigInteger_base;
imult1[k + 1] = carry;
}
// Calculate repeating part
for (i = 0; i < length; i++) {
carry = 0;
k = i * 2 + 1;
for (var j = i + 1; j < length; j++, k++) {
product = digits[j] * digits[i] * 2 + imult1[k] + carry;
carry = (product / BigInteger_base) | 0;
imult1[k] = product % BigInteger_base;
}
k = length + i;
var digit = carry + imult1[k];
carry = (digit / BigInteger_base) | 0;
imult1[k] = digit % BigInteger_base;
imult1[k + 1] += carry;
}
return new BigInteger(imult1, 1, CONSTRUCT);
};
/*
Function: quotient
Divide two <BigIntegers> and truncate towards zero.
<quotient> throws an exception if *n* is zero.
Parameters:
n - The number to divide *this* by. Will be converted to a <BigInteger>.
Returns:
The *this* / *n*, truncated to an integer.
See Also:
<add>, <subtract>, <multiply>, <divRem>, <remainder>
*/
BigInteger.prototype.quotient = function (n) {
return this.divRem(n)[0];
};
/*
Function: divide
Deprecated synonym for <quotient>.
*/
BigInteger.prototype.divide = BigInteger.prototype.quotient;
/*
Function: remainder
Calculate the remainder of two <BigIntegers>.
<remainder> throws an exception if *n* is zero.
Parameters:
n - The remainder after *this* is divided *this* by *n*. Will be
converted to a <BigInteger>.
Returns:
*this* % *n*.
See Also:
<divRem>, <quotient>
*/
BigInteger.prototype.remainder = function (n) {
return this.divRem(n)[1];
};
/*
Function: divRem
Calculate the integer quotient and remainder of two <BigIntegers>.
<divRem> throws an exception if *n* is zero.
Parameters:
n - The number to divide *this* by. Will be converted to a <BigInteger>.
Returns:
A two-element array containing the quotient and the remainder.
> a.divRem(b)
is exactly equivalent to
> [a.quotient(b), a.remainder(b)]
except it is faster, because they are calculated at the same time.
See Also:
<quotient>, <remainder>
*/
BigInteger.prototype.divRem = function (n) {
n = BigInteger(n);
if (n._s === 0) {
throw new Error("Divide by zero");
}
if (this._s === 0) {
return [ZERO, ZERO];
}
if (n._d.length === 1) {
return this.divRemSmall(n._s * n._d[0]);
}
// Test for easy cases -- |n1| <= |n2|
switch (this.compareAbs(n)) {
case 0: // n1 == n2
return [this._s === n._s ? ONE : M_ONE, ZERO];
case -1: // |n1| < |n2|
return [ZERO, this];
}
var sign = this._s * n._s;
var a = n.abs();
var b_digits = this._d;
var b_index = b_digits.length;
var digits = n._d.length;
var quot = [];
var guess;
var part = new BigInteger([], 0, CONSTRUCT);
part._s = 1;
while (b_index) {
part._d.unshift(b_digits[--b_index]);
if (part.compareAbs(n) < 0) {
quot.push(0);
continue;
}
if (part._s === 0) {
guess = 0;
} else {
var xlen = part._d.length,
ylen = a._d.length;
var highx = part._d[xlen - 1] * BigInteger_base + part._d[xlen - 2];
var highy = a._d[ylen - 1] * BigInteger_base + a._d[ylen - 2];
if (part._d.length > a._d.length) {
// The length of part._d can either match a._d length,
// or exceed it by one.
highx = (highx + 1) * BigInteger_base;
}
guess = Math.ceil(highx / highy);
}
do {
var check = a.multiplySingleDigit(guess);
if (check.compareAbs(part) <= 0) {
break;
}
guess--;
} while (guess);
quot.push(guess);
if (!guess) {
continue;
}
var diff = part.subtract(check);
part._d = diff._d.slice();
if (part._d.length === 0) {
part._s = 0;
}
}
return [new BigInteger(quot.reverse(), sign, CONSTRUCT),
new BigInteger(part._d, this._s, CONSTRUCT)];
};
// Throws an exception if n is outside of (-BigInteger.base, -1] or
// [1, BigInteger.base). It's not necessary to call this, since the
// other division functions will call it if they are able to.
BigInteger.prototype.divRemSmall = function (n) {
var r;
n = +n;
if (n === 0) {
throw new Error("Divide by zero");
}
var n_s = n < 0 ? -1 : 1;
var sign = this._s * n_s;
n = Math.abs(n);
if (n < 1 || n >= BigInteger_base) {
throw new Error("Argument out of range");
}
if (this._s === 0) {
return [ZERO, ZERO];
}
if (n === 1 || n === -1) {
return [(sign === 1) ? this.abs() : new BigInteger(this._d, sign, CONSTRUCT), ZERO];
}
// 2 <= n < BigInteger_base
// divide a single digit by a single digit
if (this._d.length === 1) {
var q = new BigInteger([(this._d[0] / n) | 0], 1, CONSTRUCT);
r = new BigInteger([(this._d[0] % n) | 0], 1, CONSTRUCT);
if (sign < 0) {
q = q.negate();
}
if (this._s < 0) {
r = r.negate();
}
return [q, r];
}
var digits = this._d.slice();
var quot = new Array(digits.length);
var part = 0;
var diff = 0;
var i = 0;
var guess;
while (digits.length) {
part = part * BigInteger_base + digits[digits.length - 1];
if (part < n) {
quot[i++] = 0;
digits.pop();
diff = BigInteger_base * diff + part;
continue;
}
if (part === 0) {
guess = 0;
} else {
guess = (part / n) | 0;
}
var check = n * guess;
diff = part - check;
quot[i++] = guess;
if (!guess) {
digits.pop();
continue;
}
digits.pop();
part = diff;
}
r = new BigInteger([diff], 1, CONSTRUCT);
if (this._s < 0) {
r = r.negate();
}
return [new BigInteger(quot.reverse(), sign, CONSTRUCT), r];
};
/*
Function: isEven
Return true iff *this* is divisible by two.
Note that <BigInteger.ZERO> is even.
Returns:
true if *this* is even, false otherwise.
See Also:
<isOdd>
*/
BigInteger.prototype.isEven = function () {
var digits = this._d;
return this._s === 0 || digits.length === 0 || (digits[0] % 2) === 0;
};
/*
Function: isOdd
Return true iff *this* is not divisible by two.
Returns:
true if *this* is odd, false otherwise.
See Also:
<isEven>
*/
BigInteger.prototype.isOdd = function () {
return !this.isEven();
};
/*
Function: sign
Get the sign of a <BigInteger>.
Returns:
* -1 if *this* < 0
* 0 if *this* == 0
* +1 if *this* > 0
See Also:
<isZero>, <isPositive>, <isNegative>, <compare>, <BigInteger.ZERO>
*/
BigInteger.prototype.sign = function () {
return this._s;
};
/*
Function: isPositive
Return true iff *this* > 0.
Returns:
true if *this*.compare(<BigInteger.ZERO>) == 1.
See Also:
<sign>, <isZero>, <isNegative>, <isUnit>, <compare>, <BigInteger.ZERO>
*/
BigInteger.prototype.isPositive = function () {
return this._s > 0;
};
/*
Function: isNegative
Return true iff *this* < 0.
Returns:
true if *this*.compare(<BigInteger.ZERO>) == -1.
See Also:
<sign>, <isPositive>, <isZero>, <isUnit>, <compare>, <BigInteger.ZERO>
*/
BigInteger.prototype.isNegative = function () {
return this._s < 0;
};
/*
Function: isZero
Return true iff *this* == 0.
Returns:
true if *this*.compare(<BigInteger.ZERO>) == 0.
See Also:
<sign>, <isPositive>, <isNegative>, <isUnit>, <BigInteger.ZERO>
*/
BigInteger.prototype.isZero = function () {
return this._s === 0;
};
/*
Function: exp10
Multiply a <BigInteger> by a power of 10.
This is equivalent to, but faster than
> if (n >= 0) {
> return this.multiply(BigInteger("1e" + n));
> }
> else { // n <= 0
> return this.quotient(BigInteger("1e" + -n));
> }
Parameters:
n - The power of 10 to multiply *this* by. *n* is converted to a
javascipt number and must be no greater than <BigInteger.MAX_EXP>
(0x7FFFFFFF), or an exception will be thrown.
Returns:
*this* * (10 ** *n*), truncated to an integer if necessary.
See Also:
<pow>, <multiply>
*/
BigInteger.prototype.exp10 = function (n) {
n = +n;
if (n === 0) {
return this;
}
if (Math.abs(n) > Number(MAX_EXP)) {
throw new Error("exponent too large in BigInteger.exp10");
}
if (n > 0) {
var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT);
for (; n >= BigInteger_base_log10; n -= BigInteger_base_log10) {
k._d.unshift(0);
}
if (n == 0)
return k;
k._s = 1;
k = k.multiplySingleDigit(Math.pow(10, n));
return (this._s < 0 ? k.negate() : k);
} else if (-n >= this._d.length * BigInteger_base_log10) {
return ZERO;
} else {
var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT);
for (n = -n; n >= BigInteger_base_log10; n -= BigInteger_base_log10) {
k._d.shift();
}
return (n == 0) ? k : k.divRemSmall(Math.pow(10, n))[0];
}
};
/*
Function: pow
Raise a <BigInteger> to a power.
In this implementation, 0**0 is 1.
Parameters:
n - The exponent to raise *this* by. *n* must be no greater than
<BigInteger.MAX_EXP> (0x7FFFFFFF), or an exception will be thrown.
Returns:
*this* raised to the *nth* power.
See Also:
<modPow>
*/
BigInteger.prototype.pow = function (n) {
if (this.isUnit()) {
if (this._s > 0) {
return this;
} else {
return BigInteger(n).isOdd() ? this : this.negate();
}
}
n = BigInteger(n);
if (n._s === 0) {
return ONE;
} else if (n._s < 0) {
if (this._s === 0) {
throw new Error("Divide by zero");
} else {
return ZERO;
}
}
if (this._s === 0) {
return ZERO;
}
if (n.isUnit()) {
return this;
}
if (n.compareAbs(MAX_EXP) > 0) {
throw new Error("exponent too large in BigInteger.pow");
}
var x = this;
var aux = ONE;
var two = BigInteger.small[2];
while (n.isPositive()) {
if (n.isOdd()) {
aux = aux.multiply(x);
if (n.isUnit()) {
return aux;
}
}
x = x.square();
n = n.quotient(two);
}
return aux;
};
/*
Function: modPow
Raise a <BigInteger> to a power (mod m).
Because it is reduced by a modulus, <modPow> is not limited by
<BigInteger.MAX_EXP> like <pow>.
Parameters:
exponent - The exponent to raise *this* by. Must be positive.
modulus - The modulus.
Returns:
*this* ^ *exponent* (mod *modulus*).
See Also:
<pow>, <mod>
*/
BigInteger.prototype.modPow = function (exponent, modulus) {
var result = ONE;
var base = this;
while (exponent.isPositive()) {
if (exponent.isOdd()) {
result = result.multiply(base).remainder(modulus);
}
exponent = exponent.quotient(BigInteger.small[2]);
if (exponent.isPositive()) {
base = base.square().remainder(modulus);
}
}
return result;
};
/*
Function: log
Get the natural logarithm of a <BigInteger> as a native JavaScript number.
This is equivalent to
> Math.log(this.toJSValue())
but handles values outside of the native number range.
Returns:
log( *this* )
See Also:
<toJSValue>
*/
BigInteger.prototype.log = function () {
switch (this._s) {
case 0:
return -Infinity;
case -1:
return NaN;
default: // Fall through.
}
var l = this._d.length;
if (l * BigInteger_base_log10 < 30) {
return Math.log(this.valueOf());
}
var N = Math.ceil(30 / BigInteger_base_log10);
var firstNdigits = this._d.slice(l - N);
return Math.log((new BigInteger(firstNdigits, 1, CONSTRUCT)).valueOf()) + (l - N) * Math.log(BigInteger_base);
};
/*
Function: valueOf
Convert a <BigInteger> to a native JavaScript integer.
This is called automatically by JavaScipt to convert a <BigInteger> to a
native value.
Returns:
> parseInt(this.toString(), 10)
See Also:
<toString>, <toJSValue>
*/
BigInteger.prototype.valueOf = function () {
return parseInt(this.toString(), 10);
};
/*
Function: toJSValue
Convert a <BigInteger> to a native JavaScript integer.
This is the same as valueOf, but more explicitly named.
Returns:
> parseInt(this.toString(), 10)
See Also:
<toString>, <valueOf>
*/
BigInteger.prototype.toJSValue = function () {
return parseInt(this.toString(), 10);
};
/*
Function: lowVal
Author: Lucas Jones
*/
BigInteger.prototype.lowVal = function () {
return this._d[0] || 0;
};
var MAX_EXP = BigInteger(0x7FFFFFFF);
// Constant: MAX_EXP
// The largest exponent allowed in <pow> and <exp10> (0x7FFFFFFF or 2147483647).
BigInteger.MAX_EXP = MAX_EXP;
(function () {
function makeUnary(fn) {
return function (a) {
return fn.call(BigInteger(a));
};
}
function makeBinary(fn) {
return function (a, b) {
return fn.call(BigInteger(a), BigInteger(b));
};
}
function makeTrinary(fn) {
return function (a, b, c) {
return fn.call(BigInteger(a), BigInteger(b), BigInteger(c));
};
}
(function () {
var i, fn;
var unary = "toJSValue,isEven,isOdd,sign,isZero,isNegative,abs,isUnit,square,negate,isPositive,toString,next,prev,log".split(",");
var binary = "compare,remainder,divRem,subtract,add,quotient,divide,multiply,pow,compareAbs".split(",");
var trinary = ["modPow"];
for (i = 0; i < unary.length; i++) {
fn = unary[i];
BigInteger[fn] = makeUnary(BigInteger.prototype[fn]);
}
for (i = 0; i < binary.length; i++) {
fn = binary[i];
BigInteger[fn] = makeBinary(BigInteger.prototype[fn]);
}
for (i = 0; i < trinary.length; i++) {
fn = trinary[i];
BigInteger[fn] = makeTrinary(BigInteger.prototype[fn]);
}
BigInteger.exp10 = function (x, n) {
return BigInteger(x).exp10(n);
};
})();
})();
return BigInteger;
})();
var cnBase58 = (function () {
var b58 = {};
var alphabet_str = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
var alphabet = [];
for (var i = 0; i < alphabet_str.length; i++) {
alphabet.push(alphabet_str.charCodeAt(i));
}
var encoded_block_sizes = [0, 2, 3, 5, 6, 7, 9, 10, 11];
var alphabet_size = alphabet.length;
var full_block_size = 8;
var full_encoded_block_size = 11;
var UINT64_MAX = new JSBigInt(2).pow(64);
function hextobin(hex) {
if (hex.length % 2 !== 0) throw "Hex string has invalid length!";
var res = new Uint8Array(hex.length / 2);
for (var i = 0; i < hex.length / 2; ++i) {
res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
}
return res;
}
this.hextobin = hextobin;
b58.hextobin = hextobin;
function bintohex(bin) {
var out = [];
for (var i = 0; i < bin.length; ++i) {
out.push(("0" + bin[i].toString(16)).slice(-2));
}
return out.join("");
}
this.bintohex = bintohex;
b58.bintohex = bintohex;
function strtobin(str) {
var res = new Uint8Array(str.length);
for (var i = 0; i < str.length; i++) {
res[i] = str.charCodeAt(i);
}
return res;
}
this.strtobin = strtobin;
b58.strtobin = strtobin;
function bintostr(bin) {
var out = [];
for (var i = 0; i < bin.length; i++) {
out.push(String.fromCharCode(bin[i]));
}
return out.join("");
}
function uint8_be_to_64(data) {
if (data.length < 1 || data.length > 8) {
throw "Invalid input length";
}
var res = JSBigInt.ZERO;
var twopow8 = new JSBigInt(2).pow(8);
var i = 0;
switch (9 - data.length) {
case 1:
res = res.add(data[i++]);
case 2:
res = res.multiply(twopow8).add(data[i++]);
case 3:
res = res.multiply(twopow8).add(data[i++]);
case 4:
res = res.multiply(twopow8).add(data[i++]);
case 5:
res = res.multiply(twopow8).add(data[i++]);
case 6:
res = res.multiply(twopow8).add(data[i++]);
case 7:
res = res.multiply(twopow8).add(data[i++]);
case 8:
res = res.multiply(twopow8).add(data[i++]);
break;
default:
throw "Impossible condition";
}
return res;
}
function uint64_to_8be(num, size) {
var res = new Uint8Array(size);
if (size < 1 || size > 8) {
throw "Invalid input length";
}
var twopow8 = new JSBigInt(2).pow(8);
for (var i = size - 1; i >= 0; i--) {
res[i] = num.remainder(twopow8).toJSValue();
num = num.divide(twopow8);
}
return res;
}
b58.encode_block = function (data, buf, index) {
if (data.length < 1 || data.length > full_encoded_block_size) {
throw "Invalid block length: " + data.length;
}
var num = uint8_be_to_64(data);
var i = encoded_block_sizes[data.length] - 1;
// while num > 0
while (num.compare(0) === 1) {
var div = num.divRem(alphabet_size);
// remainder = num % alphabet_size
var remainder = div[1];
// num = num / alphabet_size
num = div[0];
buf[index + i] = alphabet[remainder.toJSValue()];
i--;
}
return buf;
};
b58.encode = function (hex) {
var data = hextobin(hex);
if (data.length === 0) {
return "";
}
var full_block_count = Math.floor(data.length / full_block_size);
var last_block_size = data.length % full_block_size;
var res_size = full_block_count * full_encoded_block_size + encoded_block_sizes[last_block_size];
var res = new Uint8Array(res_size);
var i;
for (i = 0; i < res_size; ++i) {
res[i] = alphabet[0];
}
for (i = 0; i < full_block_count; i++) {
res = b58.encode_block(data.subarray(i * full_block_size, i * full_block_size + full_block_size), res, i * full_encoded_block_size);
}
if (last_block_size > 0) {
res = b58.encode_block(data.subarray(full_block_count * full_block_size, full_block_count * full_block_size + last_block_size), res, full_block_count * full_encoded_block_size)
}
return bintostr(res);
};
b58.decode_block = function (data, buf, index) {
if (data.length < 1 || data.length > full_encoded_block_size) {
throw "Invalid block length: " + data.length;
}
var res_size = encoded_block_sizes.indexOf(data.length);
if (res_size <= 0) {
throw "Invalid block size";
}
var res_num = new JSBigInt(0);
var order = new JSBigInt(1);
for (var i = data.length - 1; i >= 0; i--) {
var digit = alphabet.indexOf(data[i]);
if (digit < 0) {
throw "Invalid symbol";
}
var product = order.multiply(digit).add(res_num);
// if product > UINT64_MAX
if (product.compare(UINT64_MAX) === 1) {
throw "Overflow";
}
res_num = product;
order = order.multiply(alphabet_size);
}
if (res_size < full_block_size && (new JSBigInt(2).pow(8 * res_size).compare(res_num) <= 0)) {
throw "Overflow 2";
}
buf.set(uint64_to_8be(res_num, res_size), index);
return buf;
};
b58.decode = function (enc) {
enc = strtobin(enc);
if (enc.length === 0) {
return "";
}
var full_block_count = Math.floor(enc.length / full_encoded_block_size);
var last_block_size = enc.length % full_encoded_block_size;
var last_block_decoded_size = encoded_block_sizes.indexOf(last_block_size);
if (last_block_decoded_size < 0) {
throw "Invalid encoded length";
}
var data_size = full_block_count * full_block_size + last_block_decoded_size;
var data = new Uint8Array(data_size);
for (var i = 0; i < full_block_count; i++) {
data = b58.decode_block(enc.subarray(i * full_encoded_block_size, i * full_encoded_block_size + full_encoded_block_size), data, i * full_block_size);
}
if (last_block_size > 0) {
data = b58.decode_block(enc.subarray(full_block_count * full_encoded_block_size, full_block_count * full_encoded_block_size + last_block_size), data, full_block_count * full_block_size);
}
return bintohex(data);
};
return b58;
})();
var crc32 = (function () {
'use strict';
var crc32 = {};
crc32.Utf8Encode = function (string) {
return unescape(encodeURIComponent(string));
};
crc32.run = function (str) {
var crc = new crc32.Type();
crc.processString(str);
return crc.checksum();
};
crc32.table = [
0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035,
249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049,
498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639,
325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317,
997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443,
901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665,
651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303,
671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565,
1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059,
2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297,
1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223,
1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405,
1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995,
1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649,
1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015,
1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989,
3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523,
3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377,
4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879,
4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637,
3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859,
3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161,
3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815,
3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221,
2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371,
2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881,
2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567,
2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701,
2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035,
2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897,
3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431,
3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117
];
crc32.Type = function () {
this.rem_ = 0xFFFFFFFF;
this.checksum = function () {
return ((this.rem_ ^ 0xFFFFFFFF) >>> 0);
};
this.processString = function (str) {
str = crc32.Utf8Encode(str);
for (var i = 0; i < str.length; i++) {
var byte_index = ((str.charCodeAt(i) ^ this.rem_) >>> 0) & 0xFF;
this.rem_ = ((this.rem_ >>> 8) ^ crc32.table[byte_index]) >>> 0;
}
};
return this;
};
return crc32;
})();
var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function";var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){return Module["read"](filename,true)};Module["load"]=function load(f){globalEval(read(f))};Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/");Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){return read(f,"binary")};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}this["Module"]=Module}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WEB){window["Module"]=Module}else{Module["load"]=importScripts}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]=="undefined"&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),forceAlign:(function(target,quantum){quantum=quantum||4;if(quantum==1)return target;if(isNumber(target)&&isNumber(quantum)){return Math.ceil(target/quantum)*quantum}else if(isNumber(quantum)&&isPowerOfTwo(quantum)){return"((("+target+")+"+(quantum-1)+")&"+ -quantum+")"}return"Math.ceil(("+target+")/"+quantum+")*"+quantum}),isNumberType:(function(type){return type in Runtime.INT_TYPES||type in Runtime.FLOAT_TYPES}),isPointerType:function isPointerType(type){return type[type.length-1]=="*"},isStructType:function isStructType(type){if(isPointerType(type))return false;if(isArrayType(type))return true;if(/<?\{ ?[^}]* ?\}>?/.test(type))return true;return type[0]=="%"},INT_TYPES:{"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},FLOAT_TYPES:{"float":0,"double":0},or64:(function(x,y){var l=x|0|(y
// EMSCRIPTEN_START_ASM
"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=+env.NaN,t=+env.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=global.Math.floor;var O=global.Math.abs;var P=global.Math.sqrt;var Q=global.Math.pow;var R=global.Math.cos;var S=global.Math.sin;var T=global.Math.tan;var U=global.Math.acos;var V=global.Math.asin;var W=global.Math.atan;var X=global.Math.atan2;var Y=global.Math.exp;var Z=global.Math.log;var _=global.Math.ceil;var $=global.Math.imul;var aa=env.abort;var ba=env.assert;var ca=env.asmPrintInt;var da=env.asmPrintFloat;var ea=env.min;var fa=env.SAFE_HEAP_LOAD;var ga=env.SAFE_HEAP_STORE;var ha=env.SAFE_FT_MASK;var ia=env._free;var ja=env.___setErrNo;var ka=env._malloc;var la=env._emscripten_memcpy_big;var ma=env._fflush;var na=env.___assert_fail;var oa=0.0;
// EMSCRIPTEN_START_FUNCS
function pa(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function qa(){return i|0}function ra(a){a=a|0;i=a}function sa(a,b){a=a|0;b=b|0;if((o|0)==0){o=a;p=b}}function ta(a){a=a|0;ga(k>>0|0,fa(a>>0|0,1,0,0)|0|0,1,0);ga(k+1>>0|0,fa(a+1>>0|0,1,0,0)|0|0,1,0);ga(k+2>>0|0,fa(a+2>>0|0,1,0,0)|0|0,1,0);ga(k+3>>0|0,fa(a+3>>0|0,1,0,0)|0|0,1,0)}function ua(a){a=a|0;ga(k>>0|0,fa(a>>0|0,1,0,0)|0|0,1,0);ga(k+1>>0|0,fa(a+1>>0|0,1,0,0)|0|0,1,0);ga(k+2>>0|0,fa(a+2>>0|0,1,0,0)|0|0,1,0);ga(k+3>>0|0,fa(a+3>>0|0,1,0,0)|0|0,1,0);ga(k+4>>0|0,fa(a+4>>0|0,1,0,0)|0|0,1,0);ga(k+5>>0|0,fa(a+5>>0|0,1,0,0)|0|0,1,0);ga(k+6>>0|0,fa(a+6>>0|0,1,0,0)|0|0,1,0);ga(k+7>>0|0,fa(a+7>>0|0,1,0,0)|0|0,1,0)}function va(a){a=a|0;D=a}function wa(){return D|0}function xa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0;d=i;Y=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;F=b+76|0;V=b+4|0;S=b+8|0;Q=b+12|0;h=b+16|0;n=b+20|0;r=b+24|0;w=b+28|0;A=b+32|0;P=b+36|0;ja=(fa(V|0,4,0,0)|0|0)+(fa(j|0,4,0,0)|0|0)|0;ia=(fa(S|0,4,0,0)|0|0)+(fa(m|0,4,0,0)|0|0)|0;ha=(fa(Q|0,4,0,0)|0|0)+(fa(p|0,4,0,0)|0|0)|0;ea=(fa(h|0,4,0,0)|0|0)+(fa(s|0,4,0,0)|0|0)|0;da=(fa(n|0,4,0,0)|0|0)+(fa(v|0,4,0,0)|0|0)|0;ca=(fa(r|0,4,0,0)|0|0)+(fa(y|0,4,0,0)|0|0)|0;ba=(fa(w|0,4,0,0)|0|0)+(fa(B|0,4,0,0)|0|0)|0;aa=(fa(A|0,4,0,0)|0|0)+(fa(E|0,4,0,0)|0|0)|0;$=(fa(P|0,4,0,0)|0|0)+(fa(F|0,4,0,0)|0|0)|0;ga(a|0,(fa(b|0,4,0,0)|0|0)+(fa(Y|0,4,0,0)|0|0)|0,4,0);ka=a+4|0;ga(ka|0,ja|0,4,0);ja=a+8|0;ga(ja|0,ia|0,4,0);ia=a+12|0;ga(ia|0,ha|0,4,0);ha=a+16|0;ga(ha|0,ea|0,4,0);ea=a+20|0;ga(ea|0,da|0,4,0);da=a+24|0;ga(da|0,ca|0,4,0);ca=a+28|0;ga(ca|0,ba|0,4,0);ba=a+32|0;ga(ba|0,aa|0,4,0);aa=a+36|0;ga(aa|0,$|0,4,0);$=a+40|0;V=(fa(j|0,4,0,0)|0|0)-(fa(V|0,4,0,0)|0|0)|0;S=(fa(m|0,4,0,0)|0|0)-(fa(S|0,4,0,0)|0|0)|0;Q=(fa(p|0,4,0,0)|0|0)-(fa(Q|0,4,0,0)|0|0)|0;h=(fa(s|0,4,0,0)|0|0)-(fa(h|0,4,0,0)|0|0)|0;n=(fa(v|0,4,0,0)|0|0)-(fa(n|0,4,0,0)|0|0)|0;r=(fa(y|0,4,0,0)|0|0)-(fa(r|0,4,0,0)|0|0)|0;w=(fa(B|0,4,0,0)|0|0)-(fa(w|0,4,0,0)|0|0)|0;A=(fa(E|0,4,0,0)|0|0)-(fa(A|0,4,0,0)|0|0)|0;P=(fa(F|0,4,0,0)|0|0)-(fa(P|0,4,0,0)|0|0)|0;ga($|0,(fa(Y|0,4,0,0)|0|0)-(fa(b|0,4,0,0)|0|0)|0,4,0);Y=a+44|0;ga(Y|0,V|0,4,0);V=a+48|0;ga(V|0,S|0,4,0);S=a+52|0;ga(S|0,Q|0,4,0);Q=a+56|0;ga(Q|0,h|0,4,0);h=a+60|0;ga(h|0,n|0,4,0);n=a+64|0;ga(n|0,r|0,4,0);r=a+68|0;ga(r|0,w|0,4,0);w=a+72|0;ga(w|0,A|0,4,0);A=a+76|0;ga(A|0,P|0,4,0);P=a+80|0;ya(P,a,c);ya($,$,c+40|0);F=a+120|0;ya(F,c+120|0,b+120|0);ya(a,b+80|0,c+80|0);E=(fa(a|0,4,0,0)|0)<<1;B=(fa(ka|0,4,0,0)|0)<<1;y=(fa(ja|0,4,0,0)|0)<<1;v=(fa(ia|0,4,0,0)|0)<<1;s=(fa(ha|0,4,0,0)|0)<<1;p=(fa(ea|0,4,0,0)|0)<<1;m=(fa(da|0,4,0,0)|0)<<1;j=(fa(ca|0,4,0,0)|0)<<1;f=(fa(ba|0,4,0,0)|0)<<1;c=(fa(aa|0,4,0,0)|0)<<1;Z=fa(P|0,4,0,0)|0|0;O=a+84|0;W=fa(O|0,4,0,0)|0|0;N=a+88|0;T=fa(N|0,4,0,0)|0|0;M=a+92|0;b=fa(M|0,4,0,0)|0|0;L=a+96|0;g=fa(L|0,4,0,0)|0|0;K=a+100|0;l=fa(K|0,4,0,0)|0|0;J=a+104|0;q=fa(J|0,4,0,0)|0|0;I=a+108|0;u=fa(I|0,4,0,0)|0|0;H=a+112|0;z=fa(H|0,4,0,0)|0|0;G=a+116|0;D=fa(G|0,4,0,0)|0|0;_=fa($|0,4,0,0)|0|0;X=fa(Y|0,4,0,0)|0|0;U=fa(V|0,4,0,0)|0|0;R=fa(S|0,4,0,0)|0|0;e=fa(Q|0,4,0,0)|0|0;k=fa(h|0,4,0,0)|0|0;o=fa(n|0,4,0,0)|0|0;t=fa(r|0,4,0,0)|0|0;x=fa(w|0,4,0,0)|0|0;C=fa(A|0,4,0,0)|0|0;ga(a|0,Z-_|0,4,0);ga(ka|0,W-X|0,4,0);ga(ja|0,T-U|0,4,0);ga(ia|0,b-R|0,4,0);ga(ha|0,g-e|0,4,0);ga(ea|0,l-k|0,4,0);ga(da|0,q-o|0,4,0);ga(ca|0,u-t|0,4,0);ga(ba|0,z-x|0,4,0);ga(aa|0,D-C|0,4,0);ga($|0,_+Z|0,4,0);ga(Y|0,X+W|0,4,0);ga(V|0,U+T|0,4,0);ga(S|0,R+b|0,4,0);ga(Q|0,e+g|0,4,0);ga(h|0,k+l|0,4,0);ga(n|0,o+q|0,4,0);ga(r|0,t+u|0,4,0);ga(w|0,x+z|0,4,0);ga(A|0,C+D|0,4,0);D=fa(F|0,4,0,0)|0|0;C=a+124|0;A=fa(C|0,4,0,0)|0|0;z=a+128|0;x=fa(z|0,4,0,0)|0|0;w=a+132|0;u=fa(w|0,4,0,0)|0|0;t=a+136|0;r=fa(t|0,4,0,0)|0|0;q=a+140|0;o=fa(q|0,4,0,0)|0|0;n=a+144|0;l=fa(n|0,4,0,0)|0|0;k=a+148|0;h=fa(k|0,4,0,0)|0|0;g=a+152|0;e=fa(g|0,4,0,0)|0|0;a=a+156|0;b=fa(a|0,4,0,0)|0|0;ga(P|0,D+E|0,4,0);ga(O|0,A+B|0,4,0);ga(N|0,x+y|0,
function $a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,ib=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0;e=i;q=fa(b+2>>0|0,1,0,0)|0|0;Qa=fa(b>>0|0,1,0,1)|0|0;Ab=kb(fa(b+1>>0|0,1,0,1)|0|0|0,0,8)|0;zb=D;q=q&255;_=kb(q|0,0,16)|0;_=Ab|Qa|_&2031616;Qa=kb(fa(b+3>>0|0,1,0,1)|0|0|0,0,8)|0;Ab=D;o=kb(fa(b+4>>0|0,1,0,1)|0|0|0,0,16)|0;Ab=Ab|D;u=fa(b+5>>0|0,1,0,1)|0|0;Z=kb(u|0,0,24)|0;Ab=jb(Qa|q|o|Z|0,Ab|D|0,5)|0;Ab=Ab&2097151;Z=fa(b+7>>0|0,1,0,0)|0|0;o=kb(fa(b+6>>0|0,1,0,1)|0|0|0,0,8)|0;q=D;Z=Z&255;Qa=kb(Z|0,0,16)|0;q=jb(o|u|Qa|0,q|D|0,2)|0;q=q&2097151;Qa=kb(fa(b+8>>0|0,1,0,1)|0|0|0,0,8)|0;u=D;o=kb(fa(b+9>>0|0,1,0,1)|0|0|0,0,16)|0;u=u|D;j=fa(b+10>>0|0,1,0,1)|0|0;w=kb(j|0,0,24)|0;u=jb(Qa|Z|o|w|0,u|D|0,7)|0;u=u&2097151;w=kb(fa(b+11>>0|0,1,0,1)|0|0|0,0,8)|0;o=D;Z=kb(fa(b+12>>0|0,1,0,1)|0|0|0,0,16)|0;o=o|D;Qa=fa(b+13>>0|0,1,0,1)|0|0;na=kb(Qa|0,0,24)|0;o=jb(w|j|Z|na|0,o|D|0,4)|0;o=o&2097151;na=fa(b+15>>0|0,1,0,0)|0|0;Z=kb(fa(b+14>>0|0,1,0,1)|0|0|0,0,8)|0;j=D;na=na&255;w=kb(na|0,0,16)|0;j=jb(Z|Qa|w|0,j|D|0,1)|0;j=j&2097151;w=kb(fa(b+16>>0|0,1,0,1)|0|0|0,0,8)|0;Qa=D;Z=kb(fa(b+17>>0|0,1,0,1)|0|0|0,0,16)|0;Qa=Qa|D;Ga=fa(b+18>>0|0,1,0,1)|0|0;ya=kb(Ga|0,0,24)|0;Qa=jb(w|na|Z|ya|0,Qa|D|0,6)|0;Qa=Qa&2097151;ya=fa(b+20>>0|0,1,0,0)|0|0;Z=kb(fa(b+19>>0|0,1,0,1)|0|0|0,0,8)|0;na=D;ya=kb(ya&255|0,0,16)|0;na=jb(Z|Ga|ya|0,na|D|0,3)|0;ya=D;Ga=fa(b+23>>0|0,1,0,0)|0|0;Z=fa(b+21>>0|0,1,0,1)|0|0;w=kb(fa(b+22>>0|0,1,0,1)|0|0|0,0,8)|0;qb=D;Ga=Ga&255;Na=kb(Ga|0,0,16)|0;Na=w|Z|Na&2031616;Z=kb(fa(b+24>>0|0,1,0,1)|0|0|0,0,8)|0;w=D;mb=kb(fa(b+25>>0|0,1,0,1)|0|0|0,0,16)|0;w=w|D;x=fa(b+26>>0|0,1,0,1)|0|0;Ua=kb(x|0,0,24)|0;w=jb(Z|Ga|mb|Ua|0,w|D|0,5)|0;w=w&2097151;Ua=fa(b+28>>0|0,1,0,0)|0|0;mb=kb(fa(b+27>>0|0,1,0,1)|0|0|0,0,8)|0;Ga=D;Ua=Ua&255;Z=kb(Ua|0,0,16)|0;Ga=jb(mb|x|Z|0,Ga|D|0,2)|0;Ga=Ga&2097151;Z=kb(fa(b+29>>0|0,1,0,1)|0|0|0,0,8)|0;x=D;mb=kb(fa(b+30>>0|0,1,0,1)|0|0|0,0,16)|0;x=x|D;Ha=kb(fa(b+31>>0|0,1,0,1)|0|0|0,0,24)|0;x=jb(Z|Ua|mb|Ha|0,x|D|0,7)|0;Ha=D;mb=fa(c+2>>0|0,1,0,0)|0|0;Ua=fa(c>>0|0,1,0,1)|0|0;Z=kb(fa(c+1>>0|0,1,0,1)|0|0|0,0,8)|0;Fb=D;mb=mb&255;Eb=kb(mb|0,0,16)|0;Eb=Z|Ua|Eb&2031616;Ua=kb(fa(c+3>>0|0,1,0,1)|0|0|0,0,8)|0;Z=D;la=kb(fa(c+4>>0|0,1,0,1)|0|0|0,0,16)|0;Z=Z|D;r=fa(c+5>>0|0,1,0,1)|0|0;zc=kb(r|0,0,24)|0;Z=jb(Ua|mb|la|zc|0,Z|D|0,5)|0;Z=Z&2097151;zc=fa(c+7>>0|0,1,0,0)|0|0;la=kb(fa(c+6>>0|0,1,0,1)|0|0|0,0,8)|0;mb=D;zc=zc&255;Ua=kb(zc|0,0,16)|0;mb=jb(la|r|Ua|0,mb|D|0,2)|0;mb=mb&2097151;Ua=kb(fa(c+8>>0|0,1,0,1)|0|0|0,0,8)|0;r=D;la=kb(fa(c+9>>0|0,1,0,1)|0|0|0,0,16)|0;r=r|D;t=fa(c+10>>0|0,1,0,1)|0|0;X=kb(t|0,0,24)|0;r=jb(Ua|zc|la|X|0,r|D|0,7)|0;r=r&2097151;X=kb(fa(c+11>>0|0,1,0,1)|0|0|0,0,8)|0;la=D;zc=kb(fa(c+12>>0|0,1,0,1)|0|0|0,0,16)|0;la=la|D;Ua=fa(c+13>>0|0,1,0,1)|0|0;Bc=kb(Ua|0,0,24)|0;la=jb(X|t|zc|Bc|0,la|D|0,4)|0;la=la&2097151;Bc=fa(c+15>>0|0,1,0,0)|0|0;zc=kb(fa(c+14>>0|0,1,0,1)|0|0|0,0,8)|0;t=D;Bc=Bc&255;X=kb(Bc|0,0,16)|0;t=jb(zc|Ua|X|0,t|D|0,1)|0;t=t&2097151;X=kb(fa(c+16>>0|0,1,0,1)|0|0|0,0,8)|0;Ua=D;zc=kb(fa(c+17>>0|0,1,0,1)|0|0|0,0,16)|0;Ua=Ua|D;F=fa(c+18>>0|0,1,0,1)|0|0;A=kb(F|0,0,24)|0;Ua=jb(X|Bc|zc|A|0,Ua|D|0,6)|0;Ua=Ua&2097151;A=fa(c+20>>0|0,1,0,0)|0|0;zc=kb(fa(c+19>>0|0,1,0,1)|0|0|0,0,8)|0;Bc=D;A=kb(A&255|0,0,16)|0;Bc=jb(zc|F|A|0,Bc|D|0,3)|0;A=D;F=fa(c+23>>0|0,1,0,0)|0|0;zc=fa(c+21>>0|0,1,0,1)|0|0;X=kb(fa(c+22>>0|0,1,0,1)|0|0|0,0,8)|0;ob=D;F=F&255;za=kb(F|0,0,16)|0;za=X|zc|za&2
// EMSCRIPTEN_END_FUNCS
return{_strlen:lb,_ge_mul8:Va,_keccak:db,_ge_scalarmult:Ta,_ge_fromfe_frombytes_vartime:Wa,_sc_mulsub:$a,_sc_reduce32:Ya,_bitshift64Lshr:jb,_bitshift64Shl:kb,_sc_add:Za,_bitshift64Ashr:fb,_memset:ib,_i64Add:hb,_memcpy:mb,_ge_double_scalarmult_base_vartime:Ca,_ge_p3_tobytes:Ma,_ge_double_scalarmult_precomp_vartime:Ua,_i64Subtract:gb,_ge_scalarmult_base:Pa,_ge_p1p1_to_p3:Ba,_ge_p1p1_to_p2:Ha,_ge_dsm_precomp:za,_ge_frombytes_vartime:Ia,_ge_tobytes:Ra,_sc_0:Xa,_sc_sub:_a,_sc_reduce:Sa,_ge_p3_to_cached:Aa,_sc_check:ab,_ge_add:xa,runPostSets:eb,stackAlloc:pa,stackSave:qa,stackRestore:ra,setThrew:sa,setTempRet0:va,getTempRet0:wa}
// EMSCRIPTEN_END_ASM
})({"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array},{"abort":abort,"assert":assert,"asmPrintInt":asmPrintInt,"asmPrintFloat":asmPrintFloat,"min":Math_min,"SAFE_HEAP_LOAD":SAFE_HEAP_LOAD,"SAFE_HEAP_STORE":SAFE_HEAP_STORE,"SAFE_FT_MASK":SAFE_FT_MASK,"_free":_free,"___setErrNo":___setErrNo,"_malloc":_malloc,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_fflush":_fflush,"___assert_fail":___assert_fail,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"cttz_i8":cttz_i8,"ctlz_i8":ctlz_i8,"NaN":NaN,"Infinity":Infinity},buffer);var _strlen=Module["_strlen"]=asm["_strlen"];var _ge_mul8=Module["_ge_mul8"]=asm["_ge_mul8"];var _keccak=Module["_keccak"]=asm["_keccak"];var _ge_scalarmult=Module["_ge_scalarmult"]=asm["_ge_scalarmult"];var _ge_fromfe_frombytes_vartime=Module["_ge_fromfe_frombytes_vartime"]=asm["_ge_fromfe_frombytes_vartime"];var _sc_mulsub=Module["_sc_mulsub"]=asm["_sc_mulsub"];var _sc_reduce32=Module["_sc_reduce32"]=asm["_sc_reduce32"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _sc_add=Module["_sc_add"]=asm["_sc_add"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _memset=Module["_memset"]=asm["_memset"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _ge_double_scalarmult_base_vartime=Module["_ge_double_scalarmult_base_vartime"]=asm["_ge_double_scalarmult_base_vartime"];var _ge_p3_tobytes=Module["_ge_p3_tobytes"]=asm["_ge_p3_tobytes"];var _ge_double_scalarmult_precomp_vartime=Module["_ge_double_scalarmult_precomp_vartime"]=asm["_ge_double_scalarmult_precomp_vartime"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _ge_scalarmult_base=Module["_ge_scalarmult_base"]=asm["_ge_scalarmult_base"];var _ge_p1p1_to_p3=Module["_ge_p1p1_to_p3"]=asm["_ge_p1p1_to_p3"];var _ge_p1p1_to_p2=Module["_ge_p1p1_to_p2"]=asm["_ge_p1p1_to_p2"];var _ge_dsm_precomp=Module["_ge_dsm_precomp"]=asm["_ge_dsm_precomp"];var _ge_frombytes_vartime=Module["_ge_frombytes_vartime"]=asm["_ge_frombytes_vartime"];var _ge_tobytes=Module["_ge_tobytes"]=asm["_ge_tobytes"];var _sc_0=Module["_sc_0"]=asm["_sc_0"];var _sc_sub=Module["_sc_sub"]=asm["_sc_sub"];var _sc_reduce=Module["_sc_reduce"]=asm["_sc_reduce"];var _ge_p3_to_cached=Module["_ge_p3_to_cached"]=asm["_ge_p3_to_cached"];var _sc_check=Module["_sc_check"]=asm["_sc_check"];var _ge_add=Module["_ge_add"]=asm["_ge_add"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];var i64Math=(function(){var goog={math:{}};goog.math.Long=(function(low,high){this.low_=low|0;this.high_=high|0});goog.math.Long.IntCache_={};goog.math.Long.fromInt=(function(value){if(-128<=value&&value<128){var cachedObj=goog.math.Long.IntCache_[value];if(cachedObj){return cachedObj}}var obj=new goog.math.Long(value|0,value<0?-1:0);if(-128<=value&&value<128){goog.math.Long.IntCache_[value]=obj}return obj});goog.math.Long.fromNumber=(function(value){if(isNaN(value)||!isFinite(value)){return goog.math.Long.ZERO}else if(value<=-goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MIN_VALUE}else if(value+1>=goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MAX_VALUE}else if(value<0){return goog.math.Long.fromNumber(-value).negate()}else{return new goog.math.Long(value%goog.math.Long.TWO_PWR_32_DBL_|0,value/goog.math.Long.TWO_PWR_32_DBL_|0)}});goog.math.Long.fromBits=(function(lowBits,highBits){return new goog.math.Long(lowBits,highBits)});goog.math.Long.fromString=(function(str,opt_radix){if(str.length==0){throw Error("number format error: empty string")}var radix=opt_radix||10;if(radix<2||36<radix){throw Error("radix out of range: "+radix)}if(str.charAt(0)=="-"){r
var wowConfig = {
coinUnitPlaces: 11,
coinSymbol: 'WOW',
coinName: 'Wownero',
coinUriPrefix: 'wownero:',
addressPrefix: 4146
};
var cnUtilGen = function(initConfig) {
//var config = $.extend({}, initConfig);
var config = initConfig;
config.coinUnits = new JSBigInt(10).pow(config.coinUnitPlaces);
var HASH_STATE_BYTES = 200;
var HASH_SIZE = 32;
var ADDRESS_CHECKSUM_SIZE = 4;
var CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = config.addressPrefix;
var UINT64_MAX = new JSBigInt(2).pow(64);
var CURRENT_TX_VERSION = 1;
var TX_EXTRA_NONCE_MAX_COUNT = 255;
var TX_EXTRA_TAGS = {
PADDING: '00',
PUBKEY: '01',
NONCE: '02',
MERGE_MINING: '03'
};
var TX_EXTRA_NONCE_TAGS = {
PAYMENT_ID: '00'
};
var KEY_SIZE = 32;
var STRUCT_SIZES = {
GE_P3: 160,
GE_P2: 120,
GE_P1P1: 160,
GE_CACHED: 160,
EC_SCALAR: 32,
EC_POINT: 32,
KEY_IMAGE: 32,
GE_DSMP: 160 * 8, // ge_cached * 8
SIGNATURE: 64 // ec_scalar * 2
};
this.valid_hex = function(hex) {
return /[0-9a-fA-F]+/.test(hex);
};
function hextobin(hex) {
if (hex.length % 2 !== 0) throw "Hex string has invalid length!";
var res = new Uint8Array(hex.length / 2);
for (var i = 0; i < hex.length / 2; ++i) {
res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
}
return res;
}
this.hextobin = hextobin;
function bintohex(bin) {
var out = [];
for (var i = 0; i < bin.length; ++i) {
out.push(("0" + bin[i].toString(16)).slice(-2));
}
return out.join("");
}
this.sc_reduce = function(hex) {
var input = hextobin(hex);
if (input.length !== 64) {
throw "Invalid input length";
}
var mem = Module._malloc(64);
Module.HEAPU8.set(input, mem);
Module.ccall('sc_reduce', 'void', ['number'], [mem]);
var output = Module.HEAPU8.subarray(mem, mem + 64);
Module._free(mem);
return bintohex(output);
};
this.sc_reduce32 = function(hex) {
var input = hextobin(hex);
if (input.length !== 32) {
throw "Invalid input length";
}
var mem = Module._malloc(32);
Module.HEAPU8.set(input, mem);
Module.ccall('sc_reduce32', 'void', ['number'], [mem]);
var output = Module.HEAPU8.subarray(mem, mem + 32);
Module._free(mem);
return bintohex(output);
};
this.ge_scalarmult_base = function(hex) {
var input = hextobin(hex);
if (input.length !== 32) {
throw "Invalid input length";
}
var input_mem = Module._malloc(32);
Module.HEAPU8.set(input, input_mem);
var ge_p3 = Module._malloc(STRUCT_SIZES.GE_P3);
Module.ccall('ge_scalarmult_base', 'void', ['number', 'number'], [ge_p3, input_mem]);
var output = Module.HEAPU8.subarray(ge_p3, ge_p3 + STRUCT_SIZES.GE_P3);
Module._free(input_mem);
Module._free(ge_p3);
return bintohex(output);
};
this.ge_p3_tobytes = function(hex) {
var input = hextobin(hex);
if (input.length !== STRUCT_SIZES.GE_P3) {
throw "Invalid input length";
}
var ge_p3 = Module._malloc(STRUCT_SIZES.GE_P3);
Module.HEAPU8.set(input, ge_p3);
var out_mem = Module._malloc(32);
Module.ccall('ge_p3_tobytes', 'void', ['number', 'number'], [out_mem, ge_p3]);
var output = Module.HEAPU8.subarray(out_mem, out_mem + 32);
Module._free(ge_p3);
Module._free(out_mem);
return bintohex(output);
};
this.cn_fast_hash = function(input, inlen) {
if (inlen === undefined || !inlen) {
inlen = Math.floor(input.length / 2);
}
if (input.length !== inlen * 2) {
console.log("Input length not equal to specified");
}
var state = this.keccak(input, inlen, HASH_STATE_BYTES);
return state.substr(0, HASH_SIZE * 2);
};
this.encode_varint = function(i) {
i = new JSBigInt(i);
var out = '';
// While i >= b10000000
while (i.compare(0x80) >= 0) {
// out.append i & b01111111 | b10000000
out += ("0" + ((i.lowVal() & 0x7f) | 0x80).toString(16)).slice(-2);
i = i.divide(new JSBigInt(2).pow(7));
}
out += ("0" + i.toJSValue().toString(16)).slice(-2);
return out;
};
this.pubkeys_to_string = function(spend, view) {
var prefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX);
var data = prefix + spend + view;
var checksum = this.cn_fast_hash(data);
return cnBase58.encode(data + checksum.slice(0, ADDRESS_CHECKSUM_SIZE * 2));
};
// Generate keypair from seed
this.generate_keys = function(seed) {
if (seed.length !== 64) throw "Invalid input length!";
var sec = this.sc_reduce32(seed);
var point = this.ge_scalarmult_base(sec);
var pub = this.ge_p3_tobytes(point);
return {
'sec': sec,
'pub': pub
};
};
this.sec_key_to_pub = function(sec) {
var point = this.ge_scalarmult_base(sec);
var pub = this.ge_p3_tobytes(point);
return pub;
};
this.keccak = function(hex, inlen, outlen) {
var input = hextobin(hex);
if (input.length !== inlen) {
throw "Invalid input length";
}
if (outlen <= 0) {
throw "Invalid output length";
}
var input_mem = Module._malloc(inlen);
Module.HEAPU8.set(input, input_mem);
var out_mem = Module._malloc(outlen);
Module._keccak(input_mem, inlen | 0, out_mem, outlen | 0);
var output = Module.HEAPU8.subarray(out_mem, out_mem + outlen);
Module._free(input_mem);
Module._free(out_mem);
return bintohex(output);
};
this.create_address = function(seed) {
var keys = {};
var first;
if (seed.length !== 64) {
first = this.keccak(seed, seed.length / 2, 32);
} else {
first = seed;
}
keys.spend = this.generate_keys(first);
var second = this.keccak(keys.spend.sec, 32, 32);
keys.view = this.generate_keys(second);
keys.public_addr = this.pubkeys_to_string(keys.spend.pub, keys.view.pub);
return keys;
};
this.create_address_if_prefix = function(seed, prefix) {
var keys = {};
var first;
if (seed.length !== 64) {
first = this.keccak(seed, seed.length / 2, 32);
} else {
first = seed;
}
keys.spend = this.generate_keys(first);
public_addr = this.pubkeys_to_string(keys.spend.pub, "");
if (public_addr.toUpperCase().slice(0, prefix.length) != prefix.toUpperCase())
return null;
var second = this.keccak(keys.spend.sec, 32, 32);
keys.view = this.generate_keys(second);
keys.public_addr = this.pubkeys_to_string(keys.spend.pub, keys.view.pub);
return keys;
};
this.create_addr_prefix = function(seed) {
var first;
if (seed.length !== 64) {
first = this.keccak(seed, seed.length / 2, 32);
} else {
first = seed;
}
var spend = this.generate_keys(first);
var prefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX);
return cnBase58.encode(prefix + spend.pub).slice(0, 44);
};
this.hash_to_ec = function(key) {
if (key.length !== (KEY_SIZE * 2)) {
throw "Invalid input length";
}
var h_m = Module._malloc(HASH_SIZE);
var point_m = Module._malloc(STRUCT_SIZES.GE_P2);
var point2_m = Module._malloc(STRUCT_SIZES.GE_P1P1);
var res_m = Module._malloc(STRUCT_SIZES.GE_P3);
var hash = hextobin(this.cn_fast_hash(key, KEY_SIZE));
Module.HEAPU8.set(hash, h_m);
Module.ccall("ge_fromfe_frombytes_vartime", "void", ["number", "number"], [point_m, h_m]);
Module.ccall("ge_mul8", "void", ["number", "number"], [point2_m, point_m]);
Module.ccall("ge_p1p1_to_p3", "void", ["number", "number"], [res_m, point2_m]);
var res = Module.HEAPU8.subarray(res_m, res_m + STRUCT_SIZES.GE_P3);
Module._free(h_m);
Module._free(point_m);
Module._free(point2_m);
Module._free(res_m);
return bintohex(res);
};
this.decode_address = function(address) {
var dec = cnBase58.decode(address);
var expectedPrefix = this.encode_varint(CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX);
var prefix = dec.slice(0, expectedPrefix.length);
if (prefix !== expectedPrefix) {
throw "Invalid address prefix";
}
dec = dec.slice(expectedPrefix.length);
var spend = dec.slice(0, 64);
var view = dec.slice(64, 128);
var checksum = dec.slice(128, 128 + (ADDRESS_CHECKSUM_SIZE * 2));
var expectedChecksum = this.cn_fast_hash(prefix + spend + view).slice(0, ADDRESS_CHECKSUM_SIZE * 2);
if (checksum !== expectedChecksum) {
throw "Invalid checksum";
}
return {
spend: spend,
view: view
};
};
// Generate a 256-bit crypto random
this.rand_32 = function() {
return mn_random(256);
};
// Generate a 128-bit crypto random
this.rand_16 = function() {
return mn_random(128);
};
this.random_keypair = function() {
return this.generate_keys(this.rand_32());
};
this.generate_key_derivation = function(pub, sec) {
if (pub.length !== 64 || sec.length !== 64) {
throw "Invalid input length";
}
var pub_b = hextobin(pub);
var sec_b = hextobin(sec);
var pub_m = Module._malloc(KEY_SIZE);
Module.HEAPU8.set(pub_b, pub_m);
var sec_m = Module._malloc(KEY_SIZE);
Module.HEAPU8.set(sec_b, sec_m);
var ge_p3_m = Module._malloc(STRUCT_SIZES.GE_P3);
var ge_p2_m = Module._malloc(STRUCT_SIZES.GE_P2);
var ge_p1p1_m = Module._malloc(STRUCT_SIZES.GE_P1P1);
if (Module.ccall("ge_frombytes_vartime", "bool", ["number", "number"], [ge_p3_m, pub_m]) !== 0) {
throw "ge_frombytes_vartime returned non-zero error code";
}
Module.ccall("ge_scalarmult", "void", ["number", "number", "number"], [ge_p2_m, sec_m, ge_p3_m]);
Module.ccall("ge_mul8", "void", ["number", "number"], [ge_p1p1_m, ge_p2_m]);
Module.ccall("ge_p1p1_to_p2", "void", ["number", "number"], [ge_p2_m, ge_p1p1_m]);
var derivation_m = Module._malloc(KEY_SIZE);
Module.ccall("ge_tobytes", "void", ["number", "number"], [derivation_m, ge_p2_m]);
var res = Module.HEAPU8.subarray(derivation_m, derivation_m + KEY_SIZE);
Module._free(pub_m);
Module._free(sec_m);
Module._free(ge_p3_m);
Module._free(ge_p2_m);
Module._free(ge_p1p1_m);
Module._free(derivation_m);
return bintohex(res);
};
this.hash_to_scalar = function(buf) {
var hash = this.cn_fast_hash(buf);
var scalar = this.sc_reduce32(hash);
return scalar;
};
this.derivation_to_scalar = function(derivation, output_index) {
var buf = "";
if (derivation.length !== (STRUCT_SIZES.EC_POINT * 2)) {
throw "Invalid derivation length!";
}
buf += derivation;
var enc = encode_varint(output_index);
if (enc.length > 10 * 2) {
throw "output_index didn't fit in 64-bit varint";
}
buf += enc;
return this.hash_to_scalar(buf);
};
this.derive_public_key = function(derivation, out_index, pub) {
if (derivation.length !== 64 || pub.length !== 64) {
throw "Invalid input length!";
}
var derivation_m = Module._malloc(KEY_SIZE);
var derivation_b = hextobin(derivation);
Module.HEAPU8.set(derivation_b, derivation_m);
var base_m = Module._malloc(KEY_SIZE);
var base_b = hextobin(pub);
Module.HEAPU8.set(base_b, base_m);
var point1_m = Module._malloc(STRUCT_SIZES.GE_P3);
var point2_m = Module._malloc(STRUCT_SIZES.GE_P3);
var point3_m = Module._malloc(STRUCT_SIZES.GE_CACHED);
var point4_m = Module._malloc(STRUCT_SIZES.GE_P1P1);
var point5_m = Module._malloc(STRUCT_SIZES.GE_P2);
var derived_key_m = Module._malloc(KEY_SIZE);
if (Module.ccall("ge_frombytes_vartime", "bool", ["number", "number"], [point1_m, base_m]) !== 0) {
throw "ge_frombytes_vartime returned non-zero error code";
}
var scalar_m = Module._malloc(STRUCT_SIZES.EC_SCALAR);
var scalar_b = hextobin(this.derivation_to_scalar(
bintohex(Module.HEAPU8.subarray(derivation_m, derivation_m + STRUCT_SIZES.EC_POINT)), out_index));
Module.HEAPU8.set(scalar_b, scalar_m);
Module.ccall("ge_scalarmult_base", "void", ["number", "number"], [point2_m, scalar_m]);
Module.ccall("ge_p3_to_cached", "void", ["number", "number"], [point3_m, point2_m]);
Module.ccall("ge_add", "void", ["number", "number", "number"], [point4_m, point1_m, point3_m]);
Module.ccall("ge_p1p1_to_p2", "void", ["number", "number"], [point5_m, point4_m]);
Module.ccall("ge_tobytes", "void", ["number", "number"], [derived_key_m, point5_m]);
var res = Module.HEAPU8.subarray(derived_key_m, derived_key_m + KEY_SIZE);
Module._free(derivation_m);
Module._free(base_m);
Module._free(scalar_m);
Module._free(point1_m);
Module._free(point2_m);
Module._free(point3_m);
Module._free(point4_m);
Module._free(point5_m);
Module._free(derived_key_m);
return bintohex(res);
};
this.derive_secret_key = function(derivation, out_index, sec) {
if (derivation.length !== 64 || sec.length !== 64) {
throw "Invalid input length!";
}
var scalar_m = Module._malloc(STRUCT_SIZES.EC_SCALAR);
var scalar_b = hextobin(this.derivation_to_scalar(derivation, out_index));
Module.HEAPU8.set(scalar_b, scalar_m);
var base_m = Module._malloc(KEY_SIZE);
Module.HEAPU8.set(hextobin(sec), base_m);
var derived_m = Module._malloc(STRUCT_SIZES.EC_POINT);
Module.ccall("sc_add", "void", ["number", "number", "number"], [derived_m, base_m, scalar_m]);
var res = Module.HEAPU8.subarray(derived_m, derived_m + STRUCT_SIZES.EC_POINT);
Module._free(scalar_m);
Module._free(base_m);
Module._free(derived_m);
return bintohex(res);
};
// Random 32-byte ec scalar
this.random_scalar = function() {
var rand = this.sc_reduce(mn_random(64 * 8));
return rand.slice(0, STRUCT_SIZES.EC_SCALAR * 2);
};
this.valid_keys = function(view_pub, view_sec, spend_pub, spend_sec) {
var expected_view_pub = this.sec_key_to_pub(view_sec);
var expected_spend_pub = this.sec_key_to_pub(spend_sec);
return (expected_spend_pub === spend_pub) && (expected_view_pub === view_pub);
};
function trimRight(str, char) {
while (str[str.length - 1] == char) str = str.slice(0, -1);
return str;
}
function padLeft(str, len, char) {
while (str.length < len) {
str = char + str;
}
return str;
}
function assert(stmt, val) {
if (!stmt) {
throw "assert failed" + (val !== undefined ? ': ' + val : '');
}
}
return this;
};
var cnUtil = cnUtilGen(wowConfig);
/*
mnemonic.js : Converts between 4-byte aligned strings and a human-readable
sequence of words. Uses 1626 common words taken from wikipedia article:
http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/Contemporary_poetry
Originally written in python special for Electrum (lightweight Bitcoin client).
This version has been reimplemented in javascript and placed in public domain.
*/
var mn_default_wordset = 'english';
function mn_get_checksum_index(words, prefix_len) {
var trimmed_words = "";
for (var i = 0; i < words.length; i++) {
trimmed_words += words[i].slice(0, prefix_len);
}
var checksum = crc32.run(trimmed_words);
var index = checksum % words.length;
return index;
}
function mn_encode(str, wordset_name) {
'use strict';
wordset_name = wordset_name || mn_default_wordset;
var wordset = mn_words[wordset_name];
var out = [];
var n = wordset.words.length;
for (var j = 0; j < str.length; j += 8) {
str = str.slice(0, j) + mn_swap_endian_4byte(str.slice(j, j + 8)) + str.slice(j + 8);
}
for (var i = 0; i < str.length; i += 8) {
var x = parseInt(str.substr(i, 8), 16);
var w1 = (x % n);
var w2 = (Math.floor(x / n) + w1) % n;
var w3 = (Math.floor(Math.floor(x / n) / n) + w2) % n;
out = out.concat([wordset.words[w1], wordset.words[w2], wordset.words[w3]]);
}
if (wordset.prefix_len > 0) {
out.push(out[mn_get_checksum_index(out, wordset.prefix_len)]);
}
return out.join(' ');
}
function mn_swap_endian_4byte(str) {
'use strict';
if (str.length !== 8) throw 'Invalid input length: ' + str.length;
return str.slice(6, 8) + str.slice(4, 6) + str.slice(2, 4) + str.slice(0, 2);
}
function mn_decode(str, wordset_name) {
'use strict';
wordset_name = wordset_name || mn_default_wordset;
var wordset = mn_words[wordset_name];
var out = '';
var n = wordset.words.length;
var wlist = str.split(' ');
var checksum_word = '';
if (wlist.length < 12) throw "You've entered too few words, please try again";
if ((wordset.prefix_len === 0 && (wlist.length % 3 !== 0)) ||
(wordset.prefix_len > 0 && (wlist.length % 3 === 2))) throw "You've entered too few words, please try again";
if (wordset.prefix_len > 0 && (wlist.length % 3 === 0)) throw "You seem to be missing the last word in your private key, please try again";
if (wordset.prefix_len > 0) {
// Pop checksum from mnemonic
checksum_word = wlist.pop();
}
// Decode mnemonic
for (var i = 0; i < wlist.length; i += 3) {
var w1, w2, w3;
if (wordset.prefix_len === 0) {
w1 = wordset.words.indexOf(wlist[i]);
w2 = wordset.words.indexOf(wlist[i + 1]);
w3 = wordset.words.indexOf(wlist[i + 2]);
} else {
w1 = wordset.trunc_words.indexOf(wlist[i].slice(0, wordset.prefix_len));
w2 = wordset.trunc_words.indexOf(wlist[i + 1].slice(0, wordset.prefix_len));
w3 = wordset.trunc_words.indexOf(wlist[i + 2].slice(0, wordset.prefix_len));
}
if (w1 === -1 || w2 === -1 || w3 === -1) {
throw "invalid word in mnemonic";
}
var x = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n);
if (x % n != w1) throw 'Something went wrong when decoding your private key, please try again';
out += mn_swap_endian_4byte(('0000000' + x.toString(16)).slice(-8));
}
// Verify checksum
if (wordset.prefix_len > 0) {
var index = mn_get_checksum_index(wlist, wordset.prefix_len);
var expected_checksum_word = wlist[index];
if (expected_checksum_word.slice(0, wordset.prefix_len) !== checksum_word.slice(0, wordset.prefix_len)) {
throw "Your private key could not be verified, please try again";
}
}
return out;
}
function mn_random(bits) {
'use strict';
if (bits % 32 !== 0) throw "Something weird went wrong: Invalid number of bits - " + bits;
var array = new Uint32Array(bits / 32);
if (!window.crypto) throw "Unfortunately MyMonero only runs on browsers that support the JavaScript Crypto API";
var i = 0;
function arr_is_zero() {
for (var j = 0; j < bits / 32; ++j) {
if (array[j] !== 0) return false;
}
return true;
}
do {
window.crypto.getRandomValues(array);
++i;
} while (i < 5 && arr_is_zero());
if (arr_is_zero()) {
throw "Something went wrong and we could not securely generate random data for your account";
}
// Convert to hex
var out = '';
for (var j = 0; j < bits / 32; ++j) {
out += ('0000000' + array[j].toString(16)).slice(-8);
}
return out;
}
var mn_words = {
'electrum': {
prefix_len: 0,
words: [
"like", "just", "love", "know", "never", "want", "time", "out", "there",
"make", "look", "eye", "down", "only", "think", "heart", "back", "then",
"into", "about", "more", "away", "still", "them", "take", "thing", "even",
"through", "long", "always", "world", "too", "friend", "tell", "try",
"hand", "thought", "over", "here", "other", "need", "smile", "again",
"much", "cry", "been", "night", "ever", "little", "said", "end", "some",
"those", "around", "mind", "people", "girl", "leave", "dream", "left",
"turn", "myself", "give", "nothing", "really", "off", "before",
"something", "find", "walk", "wish", "good", "once", "place", "ask",
"stop", "keep", "watch", "seem", "everything", "wait", "got", "yet",
"made", "remember", "start", "alone", "run", "hope", "maybe", "believe",
"body", "hate", "after", "close", "talk", "stand", "own", "each", "hurt",
"help", "home", "god", "soul", "new", "many", "two", "inside", "should",
"true", "first", "fear", "mean", "better", "play", "another", "gone",
"change", "use", "wonder", "someone", "hair", "cold", "open", "best",
"any", "behind", "happen", "water", "dark", "laugh", "stay", "forever",
"name", "work", "show", "sky", "break", "came", "deep", "door", "put",
"black", "together", "upon", "happy", "such", "great", "white", "matter",
"fill", "past", "please", "burn", "cause", "enough", "touch", "moment",
"soon", "voice", "scream", "anything", "stare", "sound", "red", "everyone",
"hide", "kiss", "truth", "death", "beautiful", "mine", "blood", "broken",
"very", "pass", "next", "forget", "tree", "wrong", "air", "mother",
"understand", "lip", "hit", "wall", "memory", "sleep", "free", "high",
"realize", "school", "might", "skin", "sweet", "perfect", "blue", "kill",
"breath", "dance", "against", "fly", "between", "grow", "strong", "under",
"listen", "bring", "sometimes", "speak", "pull", "person", "become",
"family", "begin", "ground", "real", "small", "father", "sure", "feet",
"rest", "young", "finally", "land", "across", "today", "different", "guy",
"line", "fire", "reason", "reach", "second", "slowly", "write", "eat",
"smell", "mouth", "step", "learn", "three", "floor", "promise", "breathe",
"darkness", "push", "earth", "guess", "save", "song", "above", "along",
"both", "color", "house", "almost", "sorry", "anymore", "brother", "okay",
"dear", "game", "fade", "already", "apart", "warm", "beauty", "heard",
"notice", "question", "shine", "began", "piece", "whole", "shadow",
"secret", "street", "within", "finger", "point", "morning", "whisper",
"child", "moon", "green", "story", "glass", "kid", "silence", "since",
"soft", "yourself", "empty", "shall", "angel", "answer", "baby", "bright",
"dad", "path", "worry", "hour", "drop", "follow", "power", "war", "half",
"flow", "heaven", "act", "chance", "fact", "least", "tired", "children",
"near", "quite", "afraid", "rise", "sea", "taste", "window", "cover",
"nice", "trust", "lot", "sad", "cool", "force", "peace", "return", "blind",
"easy", "ready", "roll", "rose", "drive", "held", "music", "beneath",
"hang", "mom", "paint", "emotion", "quiet", "clear", "cloud", "few",
"pretty", "bird", "outside", "paper", "picture", "front", "rock", "simple",
"anyone", "meant", "reality", "road", "sense", "waste", "bit", "leaf",
"thank", "happiness", "meet", "men", "smoke", "truly", "decide", "self",
"age", "book", "form", "alive", "carry", "escape", "damn", "instead",
"able", "ice", "minute", "throw", "catch", "leg", "ring", "course",
"goodbye", "lead", "poem", "sick", "corner", "desire", "known", "problem",
"remind", "shoulder", "suppose", "toward", "wave", "drink", "jump",
"woman", "pretend", "sister", "week", "human", "joy", "crack", "grey",
"pray", "surprise", "dry", "knee", "less", "search", "bleed", "caught",
"clean", "embrace", "future", "king", "son", "sorrow", "chest", "hug",
"remain", "sat", "worth", "blow", "daddy", "final", "parent", "tight",
"also", "create", "lonely", "safe", "cross", "dress", "evil", "silent",
"bone", "fate", "perhaps", "anger", "class", "scar", "snow", "tiny",
"tonight", "continue", "control", "dog", "edge", "mirror", "month",
"suddenly", "comfort", "given", "loud", "quickly", "gaze", "plan", "rush",
"stone", "town", "battle", "ignore", "spirit", "stood", "stupid", "yours",
"brown", "build", "dust", "hey", "kept", "pay", "phone", "twist",
"although", "ball", "beyond", "hidden", "nose", "taken", "fail", "float",
"pure", "somehow", "wash", "wrap", "angry", "cheek", "creature",
"forgotten", "heat", "rip", "single", "space", "special", "weak",
"whatever", "yell", "anyway", "blame", "job", "choose", "country", "curse",
"drift", "echo", "figure", "grew", "laughter", "neck", "suffer", "worse",
"yeah", "disappear", "foot", "forward", "knife", "mess", "somewhere",
"stomach", "storm", "beg", "idea", "lift", "offer", "breeze", "field",
"five", "often", "simply", "stuck", "win", "allow", "confuse", "enjoy",
"except", "flower", "seek", "strength", "calm", "grin", "gun", "heavy",
"hill", "large", "ocean", "shoe", "sigh", "straight", "summer", "tongue",
"accept", "crazy", "everyday", "exist", "grass", "mistake", "sent", "shut",
"surround", "table", "ache", "brain", "destroy", "heal", "nature", "shout",
"sign", "stain", "choice", "doubt", "glance", "glow", "mountain", "queen",
"stranger", "throat", "tomorrow", "city", "either", "fish", "flame",
"rather", "shape", "spin", "spread", "ash", "distance", "finish", "image",
"imagine", "important", "nobody", "shatter", "warmth", "became", "feed",
"flesh", "funny", "lust", "shirt", "trouble", "yellow", "attention",
"bare", "bite", "money", "protect", "amaze", "appear", "born", "choke",
"completely", "daughter", "fresh", "friendship", "gentle", "probably",
"six", "deserve", "expect", "grab", "middle", "nightmare", "river",
"thousand", "weight", "worst", "wound", "barely", "bottle", "cream",
"regret", "relationship", "stick", "test", "crush", "endless", "fault",
"itself", "rule", "spill", "art", "circle", "join", "kick", "mask",
"master", "passion", "quick", "raise", "smooth", "unless", "wander",
"actually", "broke", "chair", "deal", "favorite", "gift", "note", "number",
"sweat", "box", "chill", "clothes", "lady", "mark", "park", "poor",
"sadness", "tie", "animal", "belong", "brush", "consume", "dawn", "forest",
"innocent", "pen", "pride", "stream", "thick", "clay", "complete", "count",
"draw", "faith", "press", "silver", "struggle", "surface", "taught",
"teach", "wet", "bless", "chase", "climb", "enter", "letter", "melt",
"metal", "movie", "stretch", "swing", "vision", "wife", "beside", "crash",
"forgot", "guide", "haunt", "joke", "knock", "plant", "pour", "prove",
"reveal", "steal", "stuff", "trip", "wood", "wrist", "bother", "bottom",
"crawl", "crowd", "fix", "forgive", "frown", "grace", "loose", "lucky",
"party", "release", "surely", "survive", "teacher", "gently", "grip",
"speed", "suicide", "travel", "treat", "vein", "written", "cage", "chain",
"conversation", "date", "enemy", "however", "interest", "million", "page",
"pink", "proud", "sway", "themselves", "winter", "church", "cruel", "cup",
"demon", "experience", "freedom", "pair", "pop", "purpose", "respect",
"shoot", "softly", "state", "strange", "bar", "birth", "curl", "dirt",
"excuse", "lord", "lovely", "monster", "order", "pack", "pants", "pool",
"scene", "seven", "shame", "slide", "ugly", "among", "blade", "blonde",
"closet", "creek", "deny", "drug", "eternity", "gain", "grade", "handle",
"key", "linger", "pale", "prepare", "swallow", "swim", "tremble", "wheel",
"won", "cast", "cigarette", "claim", "college", "direction", "dirty",
"gather", "ghost", "hundred", "loss", "lung", "orange", "present", "swear",
"swirl", "twice", "wild", "bitter", "blanket", "doctor", "everywhere",
"flash", "grown", "knowledge", "numb", "pressure", "radio", "repeat",
"ruin", "spend", "unknown", "buy", "clock", "devil", "early", "false",
"fantasy", "pound", "precious", "refuse", "sheet", "teeth", "welcome",
"add", "ahead", "block", "bury", "caress", "content", "depth", "despite",
"distant", "marry", "purple", "threw", "whenever", "bomb", "dull",
"easily", "grasp", "hospital", "innocence", "normal", "receive", "reply",
"rhyme", "shade", "someday", "sword", "toe", "visit", "asleep", "bought",
"center", "consider", "flat", "hero", "history", "ink", "insane", "muscle",
"mystery", "pocket", "reflection", "shove", "silently", "smart", "soldier",
"spot", "stress", "train", "type", "view", "whether", "bus", "energy",
"explain", "holy", "hunger", "inch", "magic", "mix", "noise", "nowhere",
"prayer", "presence", "shock", "snap", "spider", "study", "thunder",
"trail", "admit", "agree", "bag", "bang", "bound", "butterfly", "cute",
"exactly", "explode", "familiar", "fold", "further", "pierce", "reflect",
"scent", "selfish", "sharp", "sink", "spring", "stumble", "universe",
"weep", "women", "wonderful", "action", "ancient", "attempt", "avoid",
"birthday", "branch", "chocolate", "core", "depress", "drunk",
"especially", "focus", "fruit", "honest", "match", "palm", "perfectly",
"pillow", "pity", "poison", "roar", "shift", "slightly", "thump", "truck",
"tune", "twenty", "unable", "wipe", "wrote", "coat", "constant", "dinner",
"drove", "egg", "eternal", "flight", "flood", "frame", "freak", "gasp",
"glad", "hollow", "motion", "peer", "plastic", "root", "screen", "season",
"sting", "strike", "team", "unlike", "victim", "volume", "warn", "weird",
"attack", "await", "awake", "built", "charm", "crave", "despair", "fought",
"grant", "grief", "horse", "limit", "message", "ripple", "sanity",
"scatter", "serve", "split", "string", "trick", "annoy", "blur", "boat",
"brave", "clearly", "cling", "connect", "fist", "forth", "imagination",
"iron", "jock", "judge", "lesson", "milk", "misery", "nail", "naked",
"ourselves", "poet", "possible", "princess", "sail", "size", "snake",
"society", "stroke", "torture", "toss", "trace", "wise", "bloom", "bullet",
"cell", "check", "cost", "darling", "during", "footstep", "fragile",
"hallway", "hardly", "horizon", "invisible", "journey", "midnight", "mud",
"nod", "pause", "relax", "shiver", "sudden", "value", "youth", "abuse",
"admire", "blink", "breast", "bruise", "constantly", "couple", "creep",
"curve", "difference", "dumb", "emptiness", "gotta", "honor", "plain",
"planet", "recall", "rub", "ship", "slam", "soar", "somebody", "tightly",
"weather", "adore", "approach", "bond", "bread", "burst", "candle",
"coffee", "cousin", "crime", "desert", "flutter", "frozen", "grand",
"heel", "hello", "language", "level", "movement", "pleasure", "powerful",
"random", "rhythm", "settle", "silly", "slap", "sort", "spoken", "steel",
"threaten", "tumble", "upset", "aside", "awkward", "bee", "blank", "board",
"button", "card", "carefully", "complain", "crap", "deeply", "discover",
"drag", "dread", "effort", "entire", "fairy", "giant", "gotten", "greet",
"illusion", "jeans", "leap", "liquid", "march", "mend", "nervous", "nine",
"replace", "rope", "spine", "stole", "terror", "accident", "apple",
"balance", "boom", "childhood", "collect", "demand", "depression",
"eventually", "faint", "glare", "goal", "group", "honey", "kitchen",
"laid", "limb", "machine", "mere", "mold", "murder", "nerve", "painful",
"poetry", "prince", "rabbit", "shelter", "shore", "shower", "soothe",
"stair", "steady", "sunlight", "tangle", "tease", "treasure", "uncle",
"begun", "bliss", "canvas", "cheer", "claw", "clutch", "commit", "crimson",
"crystal", "delight", "doll", "existence", "express", "fog", "football",
"gay", "goose", "guard", "hatred", "illuminate", "mass", "math", "mourn",
"rich", "rough", "skip", "stir", "student", "style", "support", "thorn",
"tough", "yard", "yearn", "yesterday", "advice", "appreciate", "autumn",
"bank", "beam", "bowl", "capture", "carve", "collapse", "confusion",
"creation", "dove", "feather", "girlfriend", "glory", "government",
"harsh", "hop", "inner", "loser", "moonlight", "neighbor", "neither",
"peach", "pig", "praise", "screw", "shield", "shimmer", "sneak", "stab",
"subject", "throughout", "thrown", "tower", "twirl", "wow", "army",
"arrive", "bathroom", "bump", "cease", "cookie", "couch", "courage", "dim",
"guilt", "howl", "hum", "husband", "insult", "led", "lunch", "mock",
"mostly", "natural", "nearly", "needle", "nerd", "peaceful", "perfection",
"pile", "price", "remove", "roam", "sanctuary", "serious", "shiny",
"shook", "sob", "stolen", "tap", "vain", "void", "warrior", "wrinkle",
"affection", "apologize", "blossom", "bounce", "bridge", "cheap",
"crumble", "decision", "descend", "desperately", "dig", "dot", "flip",
"frighten", "heartbeat", "huge", "lazy", "lick", "odd", "opinion",
"process", "puzzle", "quietly", "retreat", "score", "sentence", "separate",
"situation", "skill", "soak", "square", "stray", "taint", "task", "tide",
"underneath", "veil", "whistle", "anywhere", "bedroom", "bid", "bloody",
"burden", "careful", "compare", "concern", "curtain", "decay", "defeat",
"describe", "double", "dreamer", "driver", "dwell", "evening", "flare",
"flicker", "grandma", "guitar", "harm", "horrible", "hungry", "indeed",
"lace", "melody", "monkey", "nation", "object", "obviously", "rainbow",
"salt", "scratch", "shown", "shy", "stage", "stun", "third", "tickle",
"useless", "weakness", "worship", "worthless", "afternoon", "beard",
"boyfriend", "bubble", "busy", "certain", "chin", "concrete", "desk",
"diamond", "doom", "drawn", "due", "felicity", "freeze", "frost", "garden",
"glide", "harmony", "hopefully", "hunt", "jealous", "lightning", "mama",
"mercy", "peel", "physical", "position", "pulse", "punch", "quit", "rant",
"respond", "salty", "sane", "satisfy", "savior", "sheep", "slept",
"social", "sport", "tuck", "utter", "valley", "wolf", "aim", "alas",
"alter", "arrow", "awaken", "beaten", "belief", "brand", "ceiling",
"cheese", "clue", "confidence", "connection", "daily", "disguise", "eager",
"erase", "essence", "everytime", "expression", "fan", "flag", "flirt",
"foul", "fur", "giggle", "glorious", "ignorance", "law", "lifeless",
"measure", "mighty", "muse", "north", "opposite", "paradise", "patience",
"patient", "pencil", "petal", "plate", "ponder", "possibly", "practice",
"slice", "spell", "stock", "strife", "strip", "suffocate", "suit",
"tender", "tool", "trade", "velvet", "verse", "waist", "witch", "aunt",
"bench", "bold", "cap", "certainly", "click", "companion", "creator",
"dart", "delicate", "determine", "dish", "dragon", "drama", "drum", "dude",
"everybody", "feast", "forehead", "former", "fright", "fully", "gas",
"hook", "hurl", "invite", "juice", "manage", "moral", "possess", "raw",
"rebel", "royal", "scale", "scary", "several", "slight", "stubborn",
"swell", "talent", "tea", "terrible", "thread", "torment", "trickle",
"usually", "vast", "violence", "weave", "acid", "agony", "ashamed", "awe",
"belly", "blend", "blush", "character", "cheat", "common", "company",
"coward", "creak", "danger", "deadly", "defense", "define", "depend",
"desperate", "destination", "dew", "duck", "dusty", "embarrass", "engine",
"example", "explore", "foe", "freely", "frustrate", "generation", "glove",
"guilty", "health", "hurry", "idiot", "impossible", "inhale", "jaw",
"kingdom", "mention", "mist", "moan", "mumble", "mutter", "observe", "ode",
"pathetic", "pattern", "pie", "prefer", "puff", "rape", "rare", "revenge",
"rude", "scrape", "spiral", "squeeze", "strain", "sunset", "suspend",
"sympathy", "thigh", "throne", "total", "unseen", "weapon", "weary"
]
},
'english': {
prefix_len: 3,
words: [
"abbey", "abducts", "ability", "ablaze", "abnormal", "abort", "abrasive", "absorb",
"abyss", "academy", "aces", "aching", "acidic", "acoustic", "acquire", "across",
"actress", "acumen", "adapt", "addicted", "adept", "adhesive", "adjust", "adopt",
"adrenalin", "adult", "adventure", "aerial", "afar", "affair", "afield", "afloat",
"afoot", "afraid", "after", "against", "agenda", "aggravate", "agile", "aglow",
"agnostic", "agony", "agreed", "ahead", "aided", "ailments", "aimless", "airport",
"aisle", "ajar", "akin", "alarms", "album", "alchemy", "alerts", "algebra",
"alkaline", "alley", "almost", "aloof", "alpine", "already", "also", "altitude",
"alumni", "always", "amaze", "ambush", "amended", "amidst", "ammo", "amnesty",
"among", "amply", "amused", "anchor", "android", "anecdote", "angled", "ankle",
"annoyed", "answers", "antics", "anvil", "anxiety", "anybody", "apart", "apex",
"aphid", "aplomb", "apology", "apply", "apricot", "aptitude", "aquarium", "arbitrary",
"archer", "ardent", "arena", "argue", "arises", "army", "around", "arrow",
"arsenic", "artistic", "ascend", "ashtray", "aside", "asked", "asleep", "aspire",
"assorted", "asylum", "athlete", "atlas", "atom", "atrium", "attire", "auburn",
"auctions", "audio", "august", "aunt", "austere", "autumn", "avatar", "avidly",
"avoid", "awakened", "awesome", "awful", "awkward", "awning", "awoken", "axes",
"axis", "axle", "aztec", "azure", "baby", "bacon", "badge", "baffles",
"bagpipe", "bailed", "bakery", "balding", "bamboo", "banjo", "baptism", "basin",
"batch", "bawled", "bays", "because", "beer", "befit", "begun", "behind",
"being", "below", "bemused", "benches", "berries", "bested", "betting", "bevel",
"beware", "beyond", "bias", "bicycle", "bids", "bifocals", "biggest", "bikini",
"bimonthly", "binocular", "biology", "biplane", "birth", "biscuit", "bite", "biweekly",
"blender", "blip", "bluntly", "boat", "bobsled", "bodies", "bogeys", "boil",
"boldly", "bomb", "border", "boss", "both", "bounced", "bovine", "bowling",
"boxes", "boyfriend", "broken", "brunt", "bubble", "buckets", "budget", "buffet",
"bugs", "building", "bulb", "bumper", "bunch", "business", "butter", "buying",
"buzzer", "bygones", "byline", "bypass", "cabin", "cactus", "cadets", "cafe",
"cage", "cajun", "cake", "calamity", "camp", "candy", "casket", "catch",
"cause", "cavernous", "cease", "cedar", "ceiling", "cell", "cement", "cent",
"certain", "chlorine", "chrome", "cider", "cigar", "cinema", "circle", "cistern",
"citadel", "civilian", "claim", "click", "clue", "coal", "cobra", "cocoa",
"code", "coexist", "coffee", "cogs", "cohesive", "coils", "colony", "comb",
"cool", "copy", "corrode", "costume", "cottage", "cousin", "cowl", "criminal",
"cube", "cucumber", "cuddled", "cuffs", "cuisine", "cunning", "cupcake", "custom",
"cycling", "cylinder", "cynical", "dabbing", "dads", "daft", "dagger", "daily",
"damp", "dangerous", "dapper", "darted", "dash", "dating", "dauntless", "dawn",
"daytime", "dazed", "debut", "decay", "dedicated", "deepest", "deftly", "degrees",
"dehydrate", "deity", "dejected", "delayed", "demonstrate", "dented", "deodorant", "depth",
"desk", "devoid", "dewdrop", "dexterity", "dialect", "dice", "diet", "different",
"digit", "dilute", "dime", "dinner", "diode", "diplomat", "directed", "distance",
"ditch", "divers", "dizzy", "doctor", "dodge", "does", "dogs", "doing",
"dolphin", "domestic", "donuts", "doorway", "dormant", "dosage", "dotted", "double",
"dove", "down", "dozen", "dreams", "drinks", "drowning", "drunk", "drying",
"dual", "dubbed", "duckling", "dude", "duets", "duke", "dullness", "dummy",
"dunes", "duplex", "duration", "dusted", "duties", "dwarf", "dwelt", "dwindling",
"dying", "dynamite", "dyslexic", "each", "eagle", "earth", "easy", "eating",
"eavesdrop", "eccentric", "echo", "eclipse", "economics", "ecstatic", "eden", "edgy",
"edited", "educated", "eels", "efficient", "eggs", "egotistic", "eight", "either",
"eject", "elapse", "elbow", "eldest", "eleven", "elite", "elope", "else",
"eluded", "emails", "ember", "emerge", "emit", "emotion", "empty", "emulate",
"energy", "enforce", "enhanced", "enigma", "enjoy", "enlist", "enmity", "enough",
"enraged", "ensign", "entrance", "envy", "epoxy", "equip", "erase", "erected",
"erosion", "error", "eskimos", "espionage", "essential", "estate", "etched", "eternal",
"ethics", "etiquette", "evaluate", "evenings", "evicted", "evolved", "examine", "excess",
"exhale", "exit", "exotic", "exquisite", "extra", "exult", "fabrics", "factual",
"fading", "fainted", "faked", "fall", "family", "fancy", "farming", "fatal",
"faulty", "fawns", "faxed", "fazed", "feast", "february", "federal", "feel",
"feline", "females", "fences", "ferry", "festival", "fetches", "fever", "fewest",
"fiat", "fibula", "fictional", "fidget", "fierce", "fifteen", "fight", "films",
"firm", "fishing", "fitting", "five", "fixate", "fizzle", "fleet", "flippant",
"flying", "foamy", "focus", "foes", "foggy", "foiled", "folding", "fonts",
"foolish", "fossil", "fountain", "fowls", "foxes", "foyer", "framed", "friendly",
"frown", "fruit", "frying", "fudge", "fuel", "fugitive", "fully", "fuming",
"fungal", "furnished", "fuselage", "future", "fuzzy", "gables", "gadget", "gags",
"gained", "galaxy", "gambit", "gang", "gasp", "gather", "gauze", "gave",
"gawk", "gaze", "gearbox", "gecko", "geek", "gels", "gemstone", "general",
"geometry", "germs", "gesture", "getting", "geyser", "ghetto", "ghost", "giant",
"giddy", "gifts", "gigantic", "gills", "gimmick", "ginger", "girth", "giving",
"glass", "gleeful", "glide", "gnaw", "gnome", "goat", "goblet", "godfather",
"goes", "goggles", "going", "goldfish", "gone", "goodbye", "gopher", "gorilla",
"gossip", "gotten", "gourmet", "governing", "gown", "greater", "grunt", "guarded",
"guest", "guide", "gulp", "gumball", "guru", "gusts", "gutter", "guys",
"gymnast", "gypsy", "gyrate", "habitat", "hacksaw", "haggled", "hairy", "hamburger",
"happens", "hashing", "hatchet", "haunted", "having", "hawk", "haystack", "hazard",
"hectare", "hedgehog", "heels", "hefty", "height", "hemlock", "hence", "heron",
"hesitate", "hexagon", "hickory", "hiding", "highway", "hijack", "hiker", "hills",
"himself", "hinder", "hippo", "hire", "history", "hitched", "hive", "hoax",
"hobby", "hockey", "hoisting", "hold", "honked", "hookup", "hope", "hornet",
"hospital", "hotel", "hounded", "hover", "howls", "hubcaps", "huddle", "huge",
"hull", "humid", "hunter", "hurried", "husband", "huts", "hybrid", "hydrogen",
"hyper", "iceberg", "icing", "icon", "identity", "idiom", "idled", "idols",
"igloo", "ignore", "iguana", "illness", "imagine", "imbalance", "imitate", "impel",
"inactive", "inbound", "incur", "industrial", "inexact", "inflamed", "ingested", "initiate",
"injury", "inkling", "inline", "inmate", "innocent", "inorganic", "input", "inquest",
"inroads", "insult", "intended", "inundate", "invoke", "inwardly", "ionic", "irate",
"iris", "irony", "irritate", "island", "isolated", "issued", "italics", "itches",
"items", "itinerary", "itself", "ivory", "jabbed", "jackets", "jaded", "jagged",
"jailed", "jamming", "january", "jargon", "jaunt", "javelin", "jaws", "jazz",
"jeans", "jeers", "jellyfish", "jeopardy", "jerseys", "jester", "jetting", "jewels",
"jigsaw", "jingle", "jittery", "jive", "jobs", "jockey", "jogger", "joining",
"joking", "jolted", "jostle", "journal", "joyous", "jubilee", "judge", "juggled",
"juicy", "jukebox", "july", "jump", "junk", "jury", "justice", "juvenile",
"kangaroo", "karate", "keep", "kennel", "kept", "kernels", "kettle", "keyboard",
"kickoff", "kidneys", "king", "kiosk", "kisses", "kitchens", "kiwi", "knapsack",
"knee", "knife", "knowledge", "knuckle", "koala", "laboratory", "ladder", "lagoon",
"lair", "lakes", "lamb", "language", "laptop", "large", "last", "later",
"launching", "lava", "lawsuit", "layout", "lazy", "lectures", "ledge", "leech",
"left", "legion", "leisure", "lemon", "lending", "leopard", "lesson", "lettuce",
"lexicon", "liar", "library", "licks", "lids", "lied", "lifestyle", "light",
"likewise", "lilac", "limits", "linen", "lion", "lipstick", "liquid", "listen",
"lively", "loaded", "lobster", "locker", "lodge", "lofty", "logic", "loincloth",
"long", "looking", "lopped", "lordship", "losing", "lottery", "loudly", "love",
"lower", "loyal", "lucky", "luggage", "lukewarm", "lullaby", "lumber", "lunar",
"lurk", "lush", "luxury", "lymph", "lynx", "lyrics", "macro", "madness",
"magically", "mailed", "major", "makeup", "malady", "mammal", "maps", "masterful",
"match", "maul", "maverick", "maximum", "mayor", "maze", "meant", "mechanic",
"medicate", "meeting", "megabyte", "melting", "memoir", "menu", "merger", "mesh",
"metro", "mews", "mice", "midst", "mighty", "mime", "mirror", "misery",
"mittens", "mixture", "moat", "mobile", "mocked", "mohawk", "moisture", "molten",
"moment", "money", "moon", "mops", "morsel", "mostly", "motherly", "mouth",
"movement", "mowing", "much", "muddy", "muffin", "mugged", "mullet", "mumble",
"mundane", "muppet", "mural", "musical", "muzzle", "myriad", "mystery", "myth",
"nabbing", "nagged", "nail", "names", "nanny", "napkin", "narrate", "nasty",
"natural", "nautical", "navy", "nearby", "necklace", "needed", "negative", "neither",
"neon", "nephew", "nerves", "nestle", "network", "neutral", "never", "newt",
"nexus", "nibs", "niche", "niece", "nifty", "nightly", "nimbly", "nineteen",
"nirvana", "nitrogen", "nobody", "nocturnal", "nodes", "noises", "nomad", "noodles",
"northern", "nostril", "noted", "nouns", "novelty", "nowhere", "nozzle", "nuance",
"nucleus", "nudged", "nugget", "nuisance", "null", "number", "nuns", "nurse",
"nutshell", "nylon", "oaks", "oars", "oasis", "oatmeal", "obedient", "object",
"obliged", "obnoxious", "observant", "obtains", "obvious", "occur", "ocean", "october",
"odds", "odometer", "offend", "often", "oilfield", "ointment", "okay", "older",
"olive", "olympics", "omega", "omission", "omnibus", "onboard", "oncoming", "oneself",
"ongoing", "onion", "online", "onslaught", "onto", "onward", "oozed", "opacity",
"opened", "opposite", "optical", "opus", "orange", "orbit", "orchid", "orders",
"organs", "origin", "ornament", "orphans", "oscar", "ostrich", "otherwise", "otter",
"ouch", "ought", "ounce", "ourselves", "oust", "outbreak", "oval", "oven",
"owed", "owls", "owner", "oxidant", "oxygen", "oyster", "ozone", "pact",
"paddles", "pager", "pairing", "palace", "pamphlet", "pancakes", "paper", "paradise",
"pastry", "patio", "pause", "pavements", "pawnshop", "payment", "peaches", "pebbles",
"peculiar", "pedantic", "peeled", "pegs", "pelican", "pencil", "people", "pepper",
"perfect", "pests", "petals", "phase", "pheasants", "phone", "phrases", "physics",
"piano", "picked", "pierce", "pigment", "piloted", "pimple", "pinched", "pioneer",
"pipeline", "pirate", "pistons", "pitched", "pivot", "pixels", "pizza", "playful",
"pledge", "pliers", "plotting", "plus", "plywood", "poaching", "pockets", "podcast",
"poetry", "point", "poker", "polar", "ponies", "pool", "popular", "portents",
"possible", "potato", "pouch", "poverty", "powder", "pram", "present", "pride",
"problems", "pruned", "prying", "psychic", "public", "puck", "puddle", "puffin",
"pulp", "pumpkins", "punch", "puppy", "purged", "push", "putty", "puzzled",
"pylons", "pyramid", "python", "queen", "quick", "quote", "rabbits", "racetrack",
"radar", "rafts", "rage", "railway", "raking", "rally", "ramped", "randomly",
"rapid", "rarest", "rash", "rated", "ravine", "rays", "razor", "react",
"rebel", "recipe", "reduce", "reef", "refer", "regular", "reheat", "reinvest",
"rejoices", "rekindle", "relic", "remedy", "renting", "reorder", "repent", "request",
"reruns", "rest", "return", "reunion", "revamp", "rewind", "rhino", "rhythm",
"ribbon", "richly", "ridges", "rift", "rigid", "rims", "ringing", "riots",
"ripped", "rising", "ritual", "river", "roared", "robot", "rockets", "rodent",
"rogue", "roles", "romance", "roomy", "roped", "roster", "rotate", "rounded",
"rover", "rowboat", "royal", "ruby", "rudely", "ruffled", "rugged", "ruined",
"ruling", "rumble", "runway", "rural", "rustled", "ruthless", "sabotage", "sack",
"sadness", "safety", "saga", "sailor", "sake", "salads", "sample", "sanity",
"sapling", "sarcasm", "sash", "satin", "saucepan", "saved", "sawmill", "saxophone",
"sayings", "scamper", "scenic", "school", "science", "scoop", "scrub", "scuba",
"seasons", "second", "sedan", "seeded", "segments", "seismic", "selfish", "semifinal",
"sensible", "september", "sequence", "serving", "session", "setup", "seventh", "sewage",
"shackles", "shelter", "shipped", "shocking", "shrugged", "shuffled", "shyness", "siblings",
"sickness", "sidekick", "sieve", "sifting", "sighting", "silk", "simplest", "sincerely",
"sipped", "siren", "situated", "sixteen", "sizes", "skater", "skew", "skirting",
"skulls", "skydive", "slackens", "sleepless", "slid", "slower", "slug", "smash",
"smelting", "smidgen", "smog", "smuggled", "snake", "sneeze", "sniff", "snout",
"snug", "soapy", "sober", "soccer", "soda", "software", "soggy", "soil",
"solved", "somewhere", "sonic", "soothe", "soprano", "sorry", "southern", "sovereign",
"sowed", "soya", "space", "speedy", "sphere", "spiders", "splendid", "spout",
"sprig", "spud", "spying", "square", "stacking", "stellar", "stick", "stockpile",
"strained", "stunning", "stylishly", "subtly", "succeed", "suddenly", "suede", "suffice",
"sugar", "suitcase", "sulking", "summon", "sunken", "superior", "surfer", "sushi",
"suture", "swagger", "swept", "swiftly", "sword", "swung", "syllabus", "symptoms",
"syndrome", "syringe", "system", "taboo", "tacit", "tadpoles", "tagged", "tail",
"taken", "talent", "tamper", "tanks", "tapestry", "tarnished", "tasked", "tattoo",
"taunts", "tavern", "tawny", "taxi", "teardrop", "technical", "tedious", "teeming",
"tell", "template", "tender", "tepid", "tequila", "terminal", "testing", "tether",
"textbook", "thaw", "theatrics", "thirsty", "thorn", "threaten", "thumbs", "thwart",
"ticket", "tidy", "tiers", "tiger", "tilt", "timber", "tinted", "tipsy",
"tirade", "tissue", "titans", "toaster", "tobacco", "today", "toenail", "toffee",
"together", "toilet", "token", "tolerant", "tomorrow", "tonic", "toolbox", "topic",
"torch", "tossed", "total", "touchy", "towel", "toxic", "toyed", "trash",
"trendy", "tribal", "trolling", "truth", "trying", "tsunami", "tubes", "tucks",
"tudor", "tuesday", "tufts", "tugs", "tuition", "tulips", "tumbling", "tunnel",
"turnip", "tusks", "tutor", "tuxedo", "twang", "tweezers", "twice", "twofold",
"tycoon", "typist", "tyrant", "ugly", "ulcers", "ultimate", "umbrella", "umpire",
"unafraid", "unbending", "uncle", "under", "uneven", "unfit", "ungainly", "unhappy",
"union", "unjustly", "unknown", "unlikely", "unmask", "unnoticed", "unopened", "unplugs",
"unquoted", "unrest", "unsafe", "until", "unusual", "unveil", "unwind", "unzip",
"upbeat", "upcoming", "update", "upgrade", "uphill", "upkeep", "upload", "upon",
"upper", "upright", "upstairs", "uptight", "upwards", "urban", "urchins", "urgent",
"usage", "useful", "usher", "using", "usual", "utensils", "utility", "utmost",
"utopia", "uttered", "vacation", "vague", "vain", "value", "vampire", "vane",
"vapidly", "vary", "vastness", "vats", "vaults", "vector", "veered", "vegan",
"vehicle", "vein", "velvet", "venomous", "verification", "vessel", "veteran", "vexed",
"vials", "vibrate", "victim", "video", "viewpoint", "vigilant", "viking", "village",
"vinegar", "violin", "vipers", "virtual", "visited", "vitals", "vivid", "vixen",
"vocal", "vogue", "voice", "volcano", "vortex", "voted", "voucher", "vowels",
"voyage", "vulture", "wade", "waffle", "wagtail", "waist", "waking", "wallets",
"wanted", "warped", "washing", "water", "waveform", "waxing", "wayside", "weavers",
"website", "wedge", "weekday", "weird", "welders", "went", "wept", "were",
"western", "wetsuit", "whale", "when", "whipped", "whole", "wickets", "width",
"wield", "wife", "wiggle", "wildly", "winter", "wipeout", "wiring", "wise",
"withdrawn", "wives", "wizard", "wobbly", "woes", "woken", "wolf", "womanly",
"wonders", "woozy", "worry", "wounded", "woven", "wrap", "wrist", "wrong",
"yacht", "yahoo", "yanks", "yard", "yawning", "yearbook", "yellow", "yesterday",
"yeti", "yields", "yodel", "yoga", "younger", "yoyo", "zapped", "zeal",
"zebra", "zero", "zesty", "zigzags", "zinger", "zippers", "zodiac", "zombie",
"zones", "zoom"
]
},
'spanish': {
prefix_len: 4,
words: [
"ábaco", "abdomen", "abeja", "abierto", "abogado", "abono", "aborto", "abrazo",
"abrir", "abuelo", "abuso", "acabar", "academia", "acceso", "acción", "aceite",
"acelga", "acento", "aceptar", "ácido", "aclarar", "acné", "acoger", "acoso",
"activo", "acto", "actriz", "actuar", "acudir", "acuerdo", "acusar", "adicto",
"admitir", "adoptar", "adorno", "aduana", "adulto", "aéreo", "afectar", "afición",
"afinar", "afirmar", "ágil", "agitar", "agonía", "agosto", "agotar", "agregar",
"agrio", "agua", "agudo", "águila", "aguja", "ahogo", "ahorro", "aire",
"aislar", "ajedrez", "ajeno", "ajuste", "alacrán", "alambre", "alarma", "alba",
"álbum", "alcalde", "aldea", "alegre", "alejar", "alerta", "aleta", "alfiler",
"alga", "algodón", "aliado", "aliento", "alivio", "alma", "almeja", "almíbar",
"altar", "alteza", "altivo", "alto", "altura", "alumno", "alzar", "amable",
"amante", "amapola", "amargo", "amasar", "ámbar", "ámbito", "ameno", "amigo",
"amistad", "amor", "amparo", "amplio", "ancho", "anciano", "ancla", "andar",
"andén", "anemia", "ángulo", "anillo", "ánimo", "anís", "anotar", "antena",
"antiguo", "antojo", "anual", "anular", "anuncio", "añadir", "añejo", "año",
"apagar", "aparato", "apetito", "apio", "aplicar", "apodo", "aporte", "apoyo",
"aprender", "aprobar", "apuesta", "apuro", "arado", "araña", "arar", "árbitro",
"árbol", "arbusto", "archivo", "arco", "arder", "ardilla", "arduo", "área",
"árido", "aries", "armonía", "arnés", "aroma", "arpa", "arpón", "arreglo",
"arroz", "arruga", "arte", "artista", "asa", "asado", "asalto", "ascenso",
"asegurar", "aseo", "asesor", "asiento", "asilo", "asistir", "asno", "asombro",
"áspero", "astilla", "astro", "astuto", "asumir", "asunto", "atajo", "ataque",
"atar", "atento", "ateo", "ático", "atleta", "átomo", "atraer", "atroz",
"atún", "audaz", "audio", "auge", "aula", "aumento", "ausente", "autor",
"aval", "avance", "avaro", "ave", "avellana", "avena", "avestruz", "avión",
"aviso", "ayer", "ayuda", "ayuno", "azafrán", "azar", "azote", "azúcar",
"azufre", "azul", "baba", "babor", "bache", "bahía", "baile", "bajar",
"balanza", "balcón", "balde", "bambú", "banco", "banda", "baño", "barba",
"barco", "barniz", "barro", "báscula", "bastón", "basura", "batalla", "batería",
"batir", "batuta", "baúl", "bazar", "bebé", "bebida", "bello", "besar",
"beso", "bestia", "bicho", "bien", "bingo", "blanco", "bloque", "blusa",
"boa", "bobina", "bobo", "boca", "bocina", "boda", "bodega", "boina",
"bola", "bolero", "bolsa", "bomba", "bondad", "bonito", "bono", "bonsái",
"borde", "borrar", "bosque", "bote", "botín", "bóveda", "bozal", "bravo",
"brazo", "brecha", "breve", "brillo", "brinco", "brisa", "broca", "broma",
"bronce", "brote", "bruja", "brusco", "bruto", "buceo", "bucle", "bueno",
"buey", "bufanda", "bufón", "búho", "buitre", "bulto", "burbuja", "burla",
"burro", "buscar", "butaca", "buzón", "caballo", "cabeza", "cabina", "cabra",
"cacao", "cadáver", "cadena", "caer", "café", "caída", "caimán", "caja",
"cajón", "cal", "calamar", "calcio", "caldo", "calidad", "calle", "calma",
"calor", "calvo", "cama", "cambio", "camello", "camino", "campo", "cáncer",
"candil", "canela", "canguro", "canica", "canto", "caña", "cañón", "caoba",
"caos", "capaz", "capitán", "capote", "captar", "capucha", "cara", "carbón",
"cárcel", "careta", "carga", "cariño", "carne", "carpeta", "carro", "carta",
"casa", "casco", "casero", "caspa", "castor", "catorce", "catre", "caudal",
"causa", "cazo", "cebolla", "ceder", "cedro", "celda", "célebre", "celoso",
"célula", "cemento", "ceniza", "centro", "cerca", "cerdo", "cereza", "cero",
"cerrar", "certeza", "césped", "cetro", "chacal", "chaleco", "champú", "chancla",
"chapa", "charla", "chico", "chiste", "chivo", "choque", "choza", "chuleta",
"chupar", "ciclón", "ciego", "cielo", "cien", "cierto", "cifra", "cigarro",
"cima", "cinco", "cine", "cinta", "ciprés", "circo", "ciruela", "cisne",
"cita", "ciudad", "clamor", "clan", "claro", "clase", "clave", "cliente",
"clima", "clínica", "cobre", "cocción", "cochino", "cocina", "coco", "código",
"codo", "cofre", "coger", "cohete", "cojín", "cojo", "cola", "colcha",
"colegio", "colgar", "colina", "collar", "colmo", "columna", "combate", "comer",
"comida", "cómodo", "compra", "conde", "conejo", "conga", "conocer", "consejo",
"contar", "copa", "copia", "corazón", "corbata", "corcho", "cordón", "corona",
"correr", "coser", "cosmos", "costa", "cráneo", "cráter", "crear", "crecer",
"creído", "crema", "cría", "crimen", "cripta", "crisis", "cromo", "crónica",
"croqueta", "crudo", "cruz", "cuadro", "cuarto", "cuatro", "cubo", "cubrir",
"cuchara", "cuello", "cuento", "cuerda", "cuesta", "cueva", "cuidar", "culebra",
"culpa", "culto", "cumbre", "cumplir", "cuna", "cuneta", "cuota", "cupón",
"cúpula", "curar", "curioso", "curso", "curva", "cutis", "dama", "danza",
"dar", "dardo", "dátil", "deber", "débil", "década", "decir", "dedo",
"defensa", "definir", "dejar", "delfín", "delgado", "delito", "demora", "denso",
"dental", "deporte", "derecho", "derrota", "desayuno", "deseo", "desfile", "desnudo",
"destino", "desvío", "detalle", "detener", "deuda", "día", "diablo", "diadema",
"diamante", "diana", "diario", "dibujo", "dictar", "diente", "dieta", "diez",
"difícil", "digno", "dilema", "diluir", "dinero", "directo", "dirigir", "disco",
"diseño", "disfraz", "diva", "divino", "doble", "doce", "dolor", "domingo",
"don", "donar", "dorado", "dormir", "dorso", "dos", "dosis", "dragón",
"droga", "ducha", "duda", "duelo", "dueño", "dulce", "dúo", "duque",
"durar", "dureza", "duro", "ébano", "ebrio", "echar", "eco", "ecuador",
"edad", "edición", "edificio", "editor", "educar", "efecto", "eficaz", "eje",
"ejemplo", "elefante", "elegir", "elemento", "elevar", "elipse", "élite", "elixir",
"elogio", "eludir", "embudo", "emitir", "emoción", "empate", "empeño", "empleo",
"empresa", "enano", "encargo", "enchufe", "encía", "enemigo", "enero", "enfado",
"enfermo", "engaño", "enigma", "enlace", "enorme", "enredo", "ensayo", "enseñar",
"entero", "entrar", "envase", "envío", "época", "equipo", "erizo", "escala",
"escena", "escolar", "escribir", "escudo", "esencia", "esfera", "esfuerzo", "espada",
"espejo", "espía", "esposa", "espuma", "esquí", "estar", "este", "estilo",
"estufa", "etapa", "eterno", "ética", "etnia", "evadir", "evaluar", "evento",
"evitar", "exacto", "examen", "exceso", "excusa", "exento", "exigir", "exilio",
"existir", "éxito", "experto", "explicar", "exponer", "extremo", "fábrica", "fábula",
"fachada", "fácil", "factor", "faena", "faja", "falda", "fallo", "falso",
"faltar", "fama", "familia", "famoso", "faraón", "farmacia", "farol", "farsa",
"fase", "fatiga", "fauna", "favor", "fax", "febrero", "fecha", "feliz",
"feo", "feria", "feroz", "fértil", "fervor", "festín", "fiable", "fianza",
"fiar", "fibra", "ficción", "ficha", "fideo", "fiebre", "fiel", "fiera",
"fiesta", "figura", "fijar", "fijo", "fila", "filete", "filial", "filtro",
"fin", "finca", "fingir", "finito", "firma", "flaco", "flauta", "flecha",
"flor", "flota", "fluir", "flujo", "flúor", "fobia", "foca", "fogata",
"fogón", "folio", "folleto", "fondo", "forma", "forro", "fortuna", "forzar",
"fosa", "foto", "fracaso", "frágil", "franja", "frase", "fraude", "freír",
"freno", "fresa", "frío", "frito", "fruta", "fuego", "fuente", "fuerza",
"fuga", "fumar", "función", "funda", "furgón", "furia", "fusil", "fútbol",
"futuro", "gacela", "gafas", "gaita", "gajo", "gala", "galería", "gallo",
"gamba", "ganar", "gancho", "ganga", "ganso", "garaje", "garza", "gasolina",
"gastar", "gato", "gavilán", "gemelo", "gemir", "gen", "género", "genio",
"gente", "geranio", "gerente", "germen", "gesto", "gigante", "gimnasio", "girar",
"giro", "glaciar", "globo", "gloria", "gol", "golfo", "goloso", "golpe",
"goma", "gordo", "gorila", "gorra", "gota", "goteo", "gozar", "grada",
"gráfico", "grano", "grasa", "gratis", "grave", "grieta", "grillo", "gripe",
"gris", "grito", "grosor", "grúa", "grueso", "grumo", "grupo", "guante",
"guapo", "guardia", "guerra", "guía", "guiño", "guion", "guiso", "guitarra",
"gusano", "gustar", "haber", "hábil", "hablar", "hacer", "hacha", "hada",
"hallar", "hamaca", "harina", "haz", "hazaña", "hebilla", "hebra", "hecho",
"helado", "helio", "hembra", "herir", "hermano", "héroe", "hervir", "hielo",
"hierro", "hígado", "higiene", "hijo", "himno", "historia", "hocico", "hogar",
"hoguera", "hoja", "hombre", "hongo", "honor", "honra", "hora", "hormiga",
"horno", "hostil", "hoyo", "hueco", "huelga", "huerta", "hueso", "huevo",
"huida", "huir", "humano", "húmedo", "humilde", "humo", "hundir", "huracán",
"hurto", "icono", "ideal", "idioma", "ídolo", "iglesia", "iglú", "igual",
"ilegal", "ilusión", "imagen", "imán", "imitar", "impar", "imperio", "imponer",
"impulso", "incapaz", "índice", "inerte", "infiel", "informe", "ingenio", "inicio",
"inmenso", "inmune", "innato", "insecto", "instante", "interés", "íntimo", "intuir",
"inútil", "invierno", "ira", "iris", "ironía", "isla", "islote", "jabalí",
"jabón", "jamón", "jarabe", "jardín", "jarra", "jaula", "jazmín", "jefe",
"jeringa", "jinete", "jornada", "joroba", "joven", "joya", "juerga", "jueves",
"juez", "jugador", "jugo", "juguete", "juicio", "junco", "jungla", "junio",
"juntar", "júpiter", "jurar", "justo", "juvenil", "juzgar", "kilo", "koala",
"labio", "lacio", "lacra", "lado", "ladrón", "lagarto", "lágrima", "laguna",
"laico", "lamer", "lámina", "lámpara", "lana", "lancha", "langosta", "lanza",
"lápiz", "largo", "larva", "lástima", "lata", "látex", "latir", "laurel",
"lavar", "lazo", "leal", "lección", "leche", "lector", "leer", "legión",
"legumbre", "lejano", "lengua", "lento", "leña", "león", "leopardo", "lesión",
"letal", "letra", "leve", "leyenda", "libertad", "libro", "licor", "líder",
"lidiar", "lienzo", "liga", "ligero", "lima", "límite", "limón", "limpio",
"lince", "lindo", "línea", "lingote", "lino", "linterna", "líquido", "liso",
"lista", "litera", "litio", "litro", "llaga", "llama", "llanto", "llave",
"llegar", "llenar", "llevar", "llorar", "llover", "lluvia", "lobo", "loción",
"loco", "locura", "lógica", "logro", "lombriz", "lomo", "lonja", "lote",
"lucha", "lucir", "lugar", "lujo", "luna", "lunes", "lupa", "lustro",
"luto", "luz", "maceta", "macho", "madera", "madre", "maduro", "maestro",
"mafia", "magia", "mago", "maíz", "maldad", "maleta", "malla", "malo",
"mamá", "mambo", "mamut", "manco", "mando", "manejar", "manga", "maniquí",
"manjar", "mano", "manso", "manta", "mañana", "mapa", "máquina", "mar",
"marco", "marea", "marfil", "margen", "marido", "mármol", "marrón", "martes",
"marzo", "masa", "máscara", "masivo", "matar", "materia", "matiz", "matriz",
"máximo", "mayor", "mazorca", "mecha", "medalla", "medio", "médula", "mejilla",
"mejor", "melena", "melón", "memoria", "menor", "mensaje", "mente", "menú",
"mercado", "merengue", "mérito", "mes", "mesón", "meta", "meter", "método",
"metro", "mezcla", "miedo", "miel", "miembro", "miga", "mil", "milagro",
"militar", "millón", "mimo", "mina", "minero", "mínimo", "minuto", "miope",
"mirar", "misa", "miseria", "misil", "mismo", "mitad", "mito", "mochila",
"moción", "moda", "modelo", "moho", "mojar", "molde", "moler", "molino",
"momento", "momia", "monarca", "moneda", "monja", "monto", "moño", "morada",
"morder", "moreno", "morir", "morro", "morsa", "mortal", "mosca", "mostrar",
"motivo", "mover", "móvil", "mozo", "mucho", "mudar", "mueble", "muela",
"muerte", "muestra", "mugre", "mujer", "mula", "muleta", "multa", "mundo",
"muñeca", "mural", "muro", "músculo", "museo", "musgo", "música", "muslo",
"nácar", "nación", "nadar", "naipe", "naranja", "nariz", "narrar", "nasal",
"natal", "nativo", "natural", "náusea", "naval", "nave", "navidad", "necio",
"néctar", "negar", "negocio", "negro", "neón", "nervio", "neto", "neutro",
"nevar", "nevera", "nicho", "nido", "niebla", "nieto", "niñez", "niño",
"nítido", "nivel", "nobleza", "noche", "nómina", "noria", "norma", "norte",
"nota", "noticia", "novato", "novela", "novio", "nube", "nuca", "núcleo",
"nudillo", "nudo", "nuera", "nueve", "nuez", "nulo", "número", "nutria",
"oasis", "obeso", "obispo", "objeto", "obra", "obrero", "observar", "obtener",
"obvio", "oca", "ocaso", "océano", "ochenta", "ocho", "ocio", "ocre",
"octavo", "octubre", "oculto", "ocupar", "ocurrir", "odiar", "odio", "odisea",
"oeste", "ofensa", "oferta", "oficio", "ofrecer", "ogro", "oído", "oír",
"ojo", "ola", "oleada", "olfato", "olivo", "olla", "olmo", "olor",
"olvido", "ombligo", "onda", "onza", "opaco", "opción", "ópera", "opinar",
"oponer", "optar", "óptica", "opuesto", "oración", "orador", "oral", "órbita",
"orca", "orden", "oreja", "órgano", "orgía", "orgullo", "oriente", "origen",
"orilla", "oro", "orquesta", "oruga", "osadía", "oscuro", "osezno", "oso",
"ostra", "otoño", "otro", "oveja", "óvulo", "óxido", "oxígeno", "oyente",
"ozono", "pacto", "padre", "paella", "página", "pago", "país", "pájaro",
"palabra", "palco", "paleta", "pálido", "palma", "paloma", "palpar", "pan",
"panal", "pánico", "pantera", "pañuelo", "papá", "papel", "papilla", "paquete",
"parar", "parcela", "pared", "parir", "paro", "párpado", "parque", "párrafo",
"parte", "pasar", "paseo", "pasión", "paso", "pasta", "pata", "patio",
"patria", "pausa", "pauta", "pavo", "payaso", "peatón", "pecado", "pecera",
"pecho", "pedal", "pedir", "pegar", "peine", "pelar", "peldaño", "pelea",
"peligro", "pellejo", "pelo", "peluca", "pena", "pensar", "peñón", "peón",
"peor", "pepino", "pequeño", "pera", "percha", "perder", "pereza", "perfil",
"perico", "perla", "permiso", "perro", "persona", "pesa", "pesca", "pésimo",
"pestaña", "pétalo", "petróleo", "pez", "pezuña", "picar", "pichón", "pie",
"piedra", "pierna", "pieza", "pijama", "pilar", "piloto", "pimienta", "pino",
"pintor", "pinza", "piña", "piojo", "pipa", "pirata", "pisar", "piscina",
"piso", "pista", "pitón", "pizca", "placa", "plan", "plata", "playa",
"plaza", "pleito", "pleno", "plomo", "pluma", "plural", "pobre", "poco",
"poder", "podio", "poema", "poesía", "poeta", "polen", "policía", "pollo",
"polvo", "pomada", "pomelo", "pomo", "pompa", "poner", "porción", "portal",
"posada", "poseer", "posible", "poste", "potencia", "potro", "pozo", "prado",
"precoz", "pregunta", "premio", "prensa", "preso", "previo", "primo", "príncipe",
"prisión", "privar", "proa", "probar", "proceso", "producto", "proeza", "profesor",
"programa", "prole", "promesa", "pronto", "propio", "próximo", "prueba", "público",
"puchero", "pudor", "pueblo", "puerta", "puesto", "pulga", "pulir", "pulmón",
"pulpo", "pulso", "puma", "punto", "puñal", "puño", "pupa", "pupila",
"puré", "quedar", "queja", "quemar", "querer", "queso", "quieto", "química",
"quince", "quitar", "rábano", "rabia", "rabo", "ración", "radical", "raíz",
"rama", "rampa", "rancho", "rango", "rapaz", "rápido", "rapto", "rasgo",
"raspa", "rato", "rayo", "raza", "razón", "reacción", "realidad", "rebaño",
"rebote", "recaer", "receta", "rechazo", "recoger", "recreo", "recto", "recurso",
"red", "redondo", "reducir", "reflejo", "reforma", "refrán", "refugio", "regalo",
"regir", "regla", "regreso", "rehén", "reino", "reír", "reja", "relato",
"relevo", "relieve", "relleno", "reloj", "remar", "remedio", "remo", "rencor",
"rendir", "renta", "reparto", "repetir", "reposo", "reptil", "res", "rescate",
"resina", "respeto", "resto", "resumen", "retiro", "retorno", "retrato", "reunir",
"revés", "revista", "rey", "rezar", "rico", "riego", "rienda", "riesgo",
"rifa", "rígido", "rigor", "rincón", "riñón", "río", "riqueza", "risa",
"ritmo", "rito"
]
},
'portuguese': {
prefix_len: 3,
words: [
"abaular", "abdominal", "abeto", "abissinio", "abjeto", "ablucao", "abnegar", "abotoar",
"abrutalhar", "absurdo", "abutre", "acautelar", "accessorios", "acetona", "achocolatado", "acirrar",
"acne", "acovardar", "acrostico", "actinomicete", "acustico", "adaptavel", "adeus", "adivinho",
"adjunto", "admoestar", "adnominal", "adotivo", "adquirir", "adriatico", "adsorcao", "adutora",
"advogar", "aerossol", "afazeres", "afetuoso", "afixo", "afluir", "afortunar", "afrouxar",
"aftosa", "afunilar", "agentes", "agito", "aglutinar", "aiatola", "aimore", "aino",
"aipo", "airoso", "ajeitar", "ajoelhar", "ajudante", "ajuste", "alazao", "albumina",
"alcunha", "alegria", "alexandre", "alforriar", "alguns", "alhures", "alivio", "almoxarife",
"alotropico", "alpiste", "alquimista", "alsaciano", "altura", "aluviao", "alvura", "amazonico",
"ambulatorio", "ametodico", "amizades", "amniotico", "amovivel", "amurada", "anatomico", "ancorar",
"anexo", "anfora", "aniversario", "anjo", "anotar", "ansioso", "anturio", "anuviar",
"anverso", "anzol", "aonde", "apaziguar", "apito", "aplicavel", "apoteotico", "aprimorar",
"aprumo", "apto", "apuros", "aquoso", "arauto", "arbusto", "arduo", "aresta",
"arfar", "arguto", "aritmetico", "arlequim", "armisticio", "aromatizar", "arpoar", "arquivo",
"arrumar", "arsenio", "arturiano", "aruaque", "arvores", "asbesto", "ascorbico", "aspirina",
"asqueroso", "assustar", "astuto", "atazanar", "ativo", "atletismo", "atmosferico", "atormentar",
"atroz", "aturdir", "audivel", "auferir", "augusto", "aula", "aumento", "aurora",
"autuar", "avatar", "avexar", "avizinhar", "avolumar", "avulso", "axiomatico", "azerbaijano",
"azimute", "azoto", "azulejo", "bacteriologista", "badulaque", "baforada", "baixote", "bajular",
"balzaquiana", "bambuzal", "banzo", "baoba", "baqueta", "barulho", "bastonete", "batuta",
"bauxita", "bavaro", "bazuca", "bcrepuscular", "beato", "beduino", "begonia", "behaviorista",
"beisebol", "belzebu", "bemol", "benzido", "beocio", "bequer", "berro", "besuntar",
"betume", "bexiga", "bezerro", "biatlon", "biboca", "bicuspide", "bidirecional", "bienio",
"bifurcar", "bigorna", "bijuteria", "bimotor", "binormal", "bioxido", "bipolarizacao", "biquini",
"birutice", "bisturi", "bituca", "biunivoco", "bivalve", "bizarro", "blasfemo", "blenorreia",
"blindar", "bloqueio", "blusao", "boazuda", "bofete", "bojudo", "bolso", "bombordo",
"bonzo", "botina", "boquiaberto", "bostoniano", "botulismo", "bourbon", "bovino", "boximane",
"bravura", "brevidade", "britar", "broxar", "bruno", "bruxuleio", "bubonico", "bucolico",
"buda", "budista", "bueiro", "buffer", "bugre", "bujao", "bumerangue", "burundines",
"busto", "butique", "buzios", "caatinga", "cabuqui", "cacunda", "cafuzo", "cajueiro",
"camurca", "canudo", "caquizeiro", "carvoeiro", "casulo", "catuaba", "cauterizar", "cebolinha",
"cedula", "ceifeiro", "celulose", "cerzir", "cesto", "cetro", "ceus", "cevar",
"chavena", "cheroqui", "chita", "chovido", "chuvoso", "ciatico", "cibernetico", "cicuta",
"cidreira", "cientistas", "cifrar", "cigarro", "cilio", "cimo", "cinzento", "cioso",
"cipriota", "cirurgico", "cisto", "citrico", "ciumento", "civismo", "clavicula", "clero",
"clitoris", "cluster", "coaxial", "cobrir", "cocota", "codorniz", "coexistir", "cogumelo",
"coito", "colusao", "compaixao", "comutativo", "contentamento", "convulsivo", "coordenativa", "coquetel",
"correto", "corvo", "costureiro", "cotovia", "covil", "cozinheiro", "cretino", "cristo",
"crivo", "crotalo", "cruzes", "cubo", "cucuia", "cueiro", "cuidar", "cujo",
"cultural", "cunilingua", "cupula", "curvo", "custoso", "cutucar", "czarismo", "dablio",
"dacota", "dados", "daguerreotipo", "daiquiri", "daltonismo", "damista", "dantesco", "daquilo",
"darwinista", "dasein", "dativo", "deao", "debutantes", "decurso", "deduzir", "defunto",
"degustar", "dejeto", "deltoide", "demover", "denunciar", "deputado", "deque", "dervixe",
"desvirtuar", "deturpar", "deuteronomio", "devoto", "dextrose", "dezoito", "diatribe", "dicotomico",
"didatico", "dietista", "difuso", "digressao", "diluvio", "diminuto", "dinheiro", "dinossauro",
"dioxido", "diplomatico", "dique", "dirimivel", "disturbio", "diurno", "divulgar", "dizivel",
"doar", "dobro", "docura", "dodoi", "doer", "dogue", "doloso", "domo",
"donzela", "doping", "dorsal", "dossie", "dote", "doutro", "doze", "dravidico",
"dreno", "driver", "dropes", "druso", "dubnio", "ducto", "dueto", "dulija",
"dundum", "duodeno", "duquesa", "durou", "duvidoso", "duzia", "ebano", "ebrio",
"eburneo", "echarpe", "eclusa", "ecossistema", "ectoplasma", "ecumenismo", "eczema", "eden",
"editorial", "edredom", "edulcorar", "efetuar", "efigie", "efluvio", "egiptologo", "egresso",
"egua", "einsteiniano", "eira", "eivar", "eixos", "ejetar", "elastomero", "eldorado",
"elixir", "elmo", "eloquente", "elucidativo", "emaranhar", "embutir", "emerito", "emfa",
"emitir", "emotivo", "empuxo", "emulsao", "enamorar", "encurvar", "enduro", "enevoar",
"enfurnar", "enguico", "enho", "enigmista", "enlutar", "enormidade", "enpreendimento", "enquanto",
"enriquecer", "enrugar", "entusiastico", "enunciar", "envolvimento", "enxuto", "enzimatico", "eolico",
"epiteto", "epoxi", "epura", "equivoco", "erario", "erbio", "ereto", "erguido",
"erisipela", "ermo", "erotizar", "erros", "erupcao", "ervilha", "esburacar", "escutar",
"esfuziante", "esguio", "esloveno", "esmurrar", "esoterismo", "esperanca", "espirito", "espurio",
"essencialmente", "esturricar", "esvoacar", "etario", "eterno", "etiquetar", "etnologo", "etos",
"etrusco", "euclidiano", "euforico", "eugenico", "eunuco", "europio", "eustaquio", "eutanasia",
"evasivo", "eventualidade", "evitavel", "evoluir", "exaustor", "excursionista", "exercito", "exfoliado",
"exito", "exotico", "expurgo", "exsudar", "extrusora", "exumar", "fabuloso", "facultativo",
"fado", "fagulha", "faixas", "fajuto", "faltoso", "famoso", "fanzine", "fapesp",
"faquir", "fartura", "fastio", "faturista", "fausto", "favorito", "faxineira", "fazer",
"fealdade", "febril", "fecundo", "fedorento", "feerico", "feixe", "felicidade", "felipe",
"feltro", "femur", "fenotipo", "fervura", "festivo", "feto", "feudo", "fevereiro",
"fezinha", "fiasco", "fibra", "ficticio", "fiduciario", "fiesp", "fifa", "figurino",
"fijiano", "filtro", "finura", "fiorde", "fiquei", "firula", "fissurar", "fitoteca",
"fivela", "fixo", "flavio", "flexor", "flibusteiro", "flotilha", "fluxograma", "fobos",
"foco", "fofura", "foguista", "foie", "foliculo", "fominha", "fonte", "forum",
"fosso", "fotossintese", "foxtrote", "fraudulento", "frevo", "frivolo", "frouxo", "frutose",
"fuba", "fucsia", "fugitivo", "fuinha", "fujao", "fulustreco", "fumo", "funileiro",
"furunculo", "fustigar", "futurologo", "fuxico", "fuzue", "gabriel", "gado", "gaelico",
"gafieira", "gaguejo", "gaivota", "gajo", "galvanoplastico", "gamo", "ganso", "garrucha",
"gastronomo", "gatuno", "gaussiano", "gaviao", "gaxeta", "gazeteiro", "gear", "geiser",
"geminiano", "generoso", "genuino", "geossinclinal", "gerundio", "gestual", "getulista", "gibi",
"gigolo", "gilete", "ginseng", "giroscopio", "glaucio", "glacial", "gleba", "glifo",
"glote", "glutonia", "gnostico", "goela", "gogo", "goitaca", "golpista", "gomo",
"gonzo", "gorro", "gostou", "goticula", "gourmet", "governo", "gozo", "graxo",
"grevista", "grito", "grotesco", "gruta", "guaxinim", "gude", "gueto", "guizo",
"guloso", "gume", "guru", "gustativo", "gustavo", "gutural", "habitue", "haitiano",
"halterofilista", "hamburguer", "hanseniase", "happening", "harpista", "hastear", "haveres", "hebreu",
"hectometro", "hedonista", "hegira", "helena", "helminto", "hemorroidas", "henrique", "heptassilabo",
"hertziano", "hesitar", "heterossexual", "heuristico", "hexagono", "hiato", "hibrido", "hidrostatico",
"hieroglifo", "hifenizar", "higienizar", "hilario", "himen", "hino", "hippie", "hirsuto",
"historiografia", "hitlerista", "hodometro", "hoje", "holograma", "homus", "honroso", "hoquei",
"horto", "hostilizar", "hotentote", "huguenote", "humilde", "huno", "hurra", "hutu",
"iaia", "ialorixa", "iambico", "iansa", "iaque", "iara", "iatista", "iberico",
"ibis", "icar", "iceberg", "icosagono", "idade", "ideologo", "idiotice", "idoso",
"iemenita", "iene", "igarape", "iglu", "ignorar", "igreja", "iguaria", "iidiche",
"ilativo", "iletrado", "ilharga", "ilimitado", "ilogismo", "ilustrissimo", "imaturo", "imbuzeiro",
"imerso", "imitavel", "imovel", "imputar", "imutavel", "inaveriguavel", "incutir", "induzir",
"inextricavel", "infusao", "ingua", "inhame", "iniquo", "injusto", "inning", "inoxidavel",
"inquisitorial", "insustentavel", "intumescimento", "inutilizavel", "invulneravel", "inzoneiro", "iodo", "iogurte",
"ioio", "ionosfera", "ioruba", "iota", "ipsilon", "irascivel", "iris", "irlandes",
"irmaos", "iroques", "irrupcao", "isca", "isento", "islandes", "isotopo", "isqueiro",
"israelita", "isso", "isto", "iterbio", "itinerario", "itrio", "iuane", "iugoslavo",
"jabuticabeira", "jacutinga", "jade", "jagunco", "jainista", "jaleco", "jambo", "jantarada",
"japones", "jaqueta", "jarro", "jasmim", "jato", "jaula", "javel", "jazz",
"jegue", "jeitoso", "jejum", "jenipapo", "jeova", "jequitiba", "jersei", "jesus",
"jetom", "jiboia", "jihad", "jilo", "jingle", "jipe", "jocoso", "joelho",
"joguete", "joio", "jojoba", "jorro", "jota", "joule", "joviano", "jubiloso",
"judoca", "jugular", "juizo", "jujuba", "juliano", "jumento", "junto", "jururu",
"justo", "juta", "juventude", "labutar", "laguna", "laico", "lajota", "lanterninha",
"lapso", "laquear", "lastro", "lauto", "lavrar", "laxativo", "lazer", "leasing",
"lebre", "lecionar", "ledo", "leguminoso", "leitura", "lele", "lemure", "lento",
"leonardo", "leopardo", "lepton", "leque", "leste", "letreiro", "leucocito", "levitico",
"lexicologo", "lhama", "lhufas", "liame", "licoroso", "lidocaina", "liliputiano", "limusine",
"linotipo", "lipoproteina", "liquidos", "lirismo", "lisura", "liturgico", "livros", "lixo",
"lobulo", "locutor", "lodo", "logro", "lojista", "lombriga", "lontra", "loop",
"loquaz", "lorota", "losango", "lotus", "louvor", "luar", "lubrificavel", "lucros",
"lugubre", "luis", "luminoso", "luneta", "lustroso", "luto", "luvas", "luxuriante",
"luzeiro", "maduro", "maestro", "mafioso", "magro", "maiuscula", "majoritario", "malvisto",
"mamute", "manutencao", "mapoteca", "maquinista", "marzipa", "masturbar", "matuto", "mausoleu",
"mavioso", "maxixe", "mazurca", "meandro", "mecha", "medusa", "mefistofelico", "megera",
"meirinho", "melro", "memorizar", "menu", "mequetrefe", "mertiolate", "mestria", "metroviario",
"mexilhao", "mezanino", "miau", "microssegundo", "midia", "migratorio", "mimosa", "minuto",
"miosotis", "mirtilo", "misturar", "mitzvah", "miudos", "mixuruca", "mnemonico", "moagem",
"mobilizar", "modulo", "moer", "mofo", "mogno", "moita", "molusco", "monumento",
"moqueca", "morubixaba", "mostruario", "motriz", "mouse", "movivel", "mozarela", "muarra",
"muculmano", "mudo", "mugir", "muitos", "mumunha", "munir", "muon", "muquira",
"murros", "musselina", "nacoes", "nado", "naftalina", "nago", "naipe", "naja",
"nalgum", "namoro", "nanquim", "napolitano", "naquilo", "nascimento", "nautilo", "navios",
"nazista", "nebuloso", "nectarina", "nefrologo", "negus", "nelore", "nenufar", "nepotismo",
"nervura", "neste", "netuno", "neutron", "nevoeiro", "newtoniano", "nexo", "nhenhenhem",
"nhoque", "nigeriano", "niilista", "ninho", "niobio", "niponico", "niquelar", "nirvana",
"nisto", "nitroglicerina", "nivoso", "nobreza", "nocivo", "noel", "nogueira", "noivo",
"nojo", "nominativo", "nonuplo", "noruegues", "nostalgico", "noturno", "nouveau", "nuanca",
"nublar", "nucleotideo", "nudista", "nulo", "numismatico", "nunquinha", "nupcias", "nutritivo",
"nuvens", "oasis", "obcecar", "obeso", "obituario", "objetos", "oblongo", "obnoxio",
"obrigatorio", "obstruir", "obtuso", "obus", "obvio", "ocaso", "occipital", "oceanografo",
"ocioso", "oclusivo", "ocorrer", "ocre", "octogono", "odalisca", "odisseia", "odorifico",
"oersted", "oeste", "ofertar", "ofidio", "oftalmologo", "ogiva", "ogum", "oigale",
"oitavo", "oitocentos", "ojeriza", "olaria", "oleoso", "olfato", "olhos", "oliveira",
"olmo", "olor", "olvidavel", "ombudsman", "omeleteira", "omitir", "omoplata", "onanismo",
"ondular", "oneroso", "onomatopeico", "ontologico", "onus", "onze", "opalescente", "opcional",
"operistico", "opio", "oposto", "oprobrio", "optometrista", "opusculo", "oratorio", "orbital",
"orcar", "orfao", "orixa", "orla", "ornitologo", "orquidea", "ortorrombico", "orvalho",
"osculo", "osmotico", "ossudo", "ostrogodo", "otario", "otite", "ouro", "ousar",
"outubro", "ouvir", "ovario", "overnight", "oviparo", "ovni", "ovoviviparo", "ovulo",
"oxala", "oxente", "oxiuro", "oxossi", "ozonizar", "paciente", "pactuar", "padronizar",
"paete", "pagodeiro", "paixao", "pajem", "paludismo", "pampas", "panturrilha", "papudo",
"paquistanes", "pastoso", "patua", "paulo", "pauzinhos", "pavoroso", "paxa", "pazes",
"peao", "pecuniario", "pedunculo", "pegaso", "peixinho", "pejorativo", "pelvis", "penuria",
"pequno", "petunia", "pezada", "piauiense", "pictorico", "pierro", "pigmeu", "pijama",
"pilulas", "pimpolho", "pintura", "piorar", "pipocar", "piqueteiro", "pirulito", "pistoleiro",
"pituitaria", "pivotar", "pixote", "pizzaria", "plistoceno", "plotar", "pluviometrico", "pneumonico",
"poco", "podridao", "poetisa", "pogrom", "pois", "polvorosa", "pomposo", "ponderado",
"pontudo", "populoso", "poquer", "porvir", "posudo", "potro", "pouso", "povoar",
"prazo", "prezar", "privilegios", "proximo", "prussiano", "pseudopode", "psoriase", "pterossauros",
"ptialina", "ptolemaico", "pudor", "pueril", "pufe", "pugilista", "puir", "pujante",
"pulverizar", "pumba", "punk", "purulento", "pustula", "putsch", "puxe", "quatrocentos",
"quetzal", "quixotesco", "quotizavel", "rabujice", "racista", "radonio", "rafia", "ragu",
"rajado", "ralo", "rampeiro", "ranzinza", "raptor", "raquitismo", "raro", "rasurar",
"ratoeira", "ravioli", "razoavel", "reavivar", "rebuscar", "recusavel", "reduzivel", "reexposicao",
"refutavel", "regurgitar", "reivindicavel", "rejuvenescimento", "relva", "remuneravel", "renunciar", "reorientar",
"repuxo", "requisito", "resumo", "returno", "reutilizar", "revolvido", "rezonear", "riacho",
"ribossomo", "ricota", "ridiculo", "rifle", "rigoroso", "rijo", "rimel", "rins",
"rios", "riqueza", "riquixa", "rissole", "ritualistico", "rivalizar", "rixa", "robusto",
"rococo", "rodoviario", "roer", "rogo", "rojao", "rolo", "rompimento", "ronronar",
"roqueiro", "rorqual", "rosto", "rotundo", "rouxinol", "roxo", "royal", "ruas",
"rucula", "rudimentos", "ruela", "rufo", "rugoso", "ruivo", "rule", "rumoroso",
"runico", "ruptura", "rural", "rustico", "rutilar", "saariano", "sabujo", "sacudir",
"sadomasoquista", "safra", "sagui", "sais", "samurai", "santuario", "sapo", "saquear",
"sartriano", "saturno", "saude", "sauva", "saveiro", "saxofonista", "sazonal", "scherzo",
"script", "seara", "seborreia", "secura", "seduzir", "sefardim", "seguro", "seja",
"selvas", "sempre", "senzala", "sepultura", "sequoia", "sestercio", "setuplo", "seus",
"seviciar", "sezonismo", "shalom", "siames", "sibilante", "sicrano", "sidra", "sifilitico",
"signos", "silvo", "simultaneo", "sinusite", "sionista", "sirio", "sisudo", "situar",
"sivan", "slide", "slogan", "soar", "sobrio", "socratico", "sodomizar", "soerguer",
"software", "sogro", "soja", "solver", "somente", "sonso", "sopro", "soquete",
"sorveteiro", "sossego", "soturno", "sousafone", "sovinice", "sozinho", "suavizar", "subverter",
"sucursal", "sudoriparo", "sufragio", "sugestoes", "suite", "sujo", "sultao", "sumula",
"suntuoso", "suor", "supurar", "suruba", "susto", "suturar", "suvenir", "tabuleta",
"taco", "tadjique", "tafeta", "tagarelice", "taitiano", "talvez", "tampouco", "tanzaniano",
"taoista", "tapume", "taquion", "tarugo", "tascar", "tatuar", "tautologico", "tavola",
"taxionomista", "tchecoslovaco", "teatrologo", "tectonismo", "tedioso", "teflon", "tegumento", "teixo",
"telurio", "temporas", "tenue", "teosofico", "tepido", "tequila", "terrorista", "testosterona",
"tetrico", "teutonico", "teve", "texugo", "tiara", "tibia", "tiete", "tifoide",
"tigresa", "tijolo", "tilintar", "timpano", "tintureiro", "tiquete", "tiroteio", "tisico",
"titulos", "tive", "toar", "toboga", "tofu", "togoles", "toicinho", "tolueno",
"tomografo", "tontura", "toponimo", "toquio", "torvelinho", "tostar", "toto", "touro",
"toxina", "trazer", "trezentos", "trivialidade", "trovoar", "truta", "tuaregue", "tubular",
"tucano", "tudo", "tufo", "tuiste", "tulipa", "tumultuoso", "tunisino", "tupiniquim",
"turvo", "tutu", "ucraniano", "udenista", "ufanista", "ufologo", "ugaritico", "uiste",
"uivo", "ulceroso", "ulema", "ultravioleta", "umbilical", "umero", "umido", "umlaut",
"unanimidade", "unesco", "ungulado", "unheiro", "univoco", "untuoso", "urano", "urbano",
"urdir", "uretra", "urgente", "urinol", "urna", "urologo", "urro", "ursulina",
"urtiga", "urupe", "usavel", "usbeque", "usei", "usineiro", "usurpar", "utero",
"utilizar", "utopico", "uvular", "uxoricidio", "vacuo", "vadio", "vaguear", "vaivem",
"valvula", "vampiro", "vantajoso", "vaporoso", "vaquinha", "varziano", "vasto", "vaticinio",
"vaudeville", "vazio", "veado", "vedico", "veemente", "vegetativo", "veio", "veja",
"veludo", "venusiano", "verdade", "verve", "vestuario", "vetusto", "vexatorio", "vezes",
"viavel", "vibratorio", "victor", "vicunha", "vidros", "vietnamita", "vigoroso", "vilipendiar",
"vime", "vintem", "violoncelo", "viquingue", "virus", "visualizar", "vituperio", "viuvo",
"vivo", "vizir", "voar", "vociferar", "vodu", "vogar", "voile", "volver",
"vomito", "vontade", "vortice", "vosso", "voto", "vovozinha", "voyeuse", "vozes",
"vulva", "vupt", "western", "xadrez", "xale", "xampu", "xango", "xarope",
"xaual", "xavante", "xaxim", "xenonio", "xepa", "xerox", "xicara", "xifopago",
"xiita", "xilogravura", "xinxim", "xistoso", "xixi", "xodo", "xogum", "xucro",
"zabumba", "zagueiro", "zambiano", "zanzar", "zarpar", "zebu", "zefiro", "zeloso",
"zenite", "zumbi"
]
},
'japanese': {
prefix_len: 4,
words: [
"あいこくしん", "あいさつ", "あいだ", "あおぞら", "あかちゃん", "あきる", "あけがた", "あける",
"あこがれる", "あさい", "あさひ", "あしあと", "あじわう", "あずかる", "あずき", "あそぶ",
"あたえる", "あたためる", "あたりまえ", "あたる", "あつい", "あつかう", "あっしゅく", "あつまり",
"あつめる", "あてな", "あてはまる", "あひる", "あぶら", "あぶる", "あふれる", "あまい",
"あまど", "あまやかす", "あまり", "あみもの", "あめりか", "あやまる", "あゆむ", "あらいぐま",
"あらし", "あらすじ", "あらためる", "あらゆる", "あらわす", "ありがとう", "あわせる", "あわてる",
"あんい", "あんがい", "あんこ", "あんぜん", "あんてい", "あんない", "あんまり", "いいだす",
"いおん", "いがい", "いがく", "いきおい", "いきなり", "いきもの", "いきる", "いくじ",
"いくぶん", "いけばな", "いけん", "いこう", "いこく", "いこつ", "いさましい", "いさん",
"いしき", "いじゅう", "いじょう", "いじわる", "いずみ", "いずれ", "いせい", "いせえび",
"いせかい", "いせき", "いぜん", "いそうろう", "いそがしい", "いだい", "いだく", "いたずら",
"いたみ", "いたりあ", "いちおう", "いちじ", "いちど", "いちば", "いちぶ", "いちりゅう",
"いつか", "いっしゅん", "いっせい", "いっそう", "いったん", "いっち", "いってい", "いっぽう",
"いてざ", "いてん", "いどう", "いとこ", "いない", "いなか", "いねむり", "いのち",
"いのる", "いはつ", "いばる", "いはん", "いびき", "いひん", "いふく", "いへん",
"いほう", "いみん", "いもうと", "いもたれ", "いもり", "いやがる", "いやす", "いよかん",
"いよく", "いらい", "いらすと", "いりぐち", "いりょう", "いれい", "いれもの", "いれる",
"いろえんぴつ", "いわい", "いわう", "いわかん", "いわば", "いわゆる", "いんげんまめ", "いんさつ",
"いんしょう", "いんよう", "うえき", "うえる", "うおざ", "うがい", "うかぶ", "うかべる",
"うきわ", "うくらいな", "うくれれ", "うけたまわる", "うけつけ", "うけとる", "うけもつ", "うける",
"うごかす", "うごく", "うこん", "うさぎ", "うしなう", "うしろがみ", "うすい", "うすぎ",
"うすぐらい", "うすめる", "うせつ", "うちあわせ", "うちがわ", "うちき", "うちゅう", "うっかり",
"うつくしい", "うったえる", "うつる", "うどん", "うなぎ", "うなじ", "うなずく", "うなる",
"うねる", "うのう", "うぶげ", "うぶごえ", "うまれる", "うめる", "うもう", "うやまう",
"うよく", "うらがえす", "うらぐち", "うらない", "うりあげ", "うりきれ", "うるさい", "うれしい",
"うれゆき", "うれる", "うろこ", "うわき", "うわさ", "うんこう", "うんちん", "うんてん",
"うんどう", "えいえん", "えいが", "えいきょう", "えいご", "えいせい", "えいぶん", "えいよう",
"えいわ", "えおり", "えがお", "えがく", "えきたい", "えくせる", "えしゃく", "えすて",
"えつらん", "えのぐ", "えほうまき", "えほん", "えまき", "えもじ", "えもの", "えらい",
"えらぶ", "えりあ", "えんえん", "えんかい", "えんぎ", "えんげき", "えんしゅう", "えんぜつ",
"えんそく", "えんちょう", "えんとつ", "おいかける", "おいこす", "おいしい", "おいつく", "おうえん",
"おうさま", "おうじ", "おうせつ", "おうたい", "おうふく", "おうべい", "おうよう", "おえる",
"おおい", "おおう", "おおどおり", "おおや", "おおよそ", "おかえり", "おかず", "おがむ",
"おかわり", "おぎなう", "おきる", "おくさま", "おくじょう", "おくりがな", "おくる", "おくれる",
"おこす", "おこなう", "おこる", "おさえる", "おさない", "おさめる", "おしいれ", "おしえる",
"おじぎ", "おじさん", "おしゃれ", "おそらく", "おそわる", "おたがい", "おたく", "おだやか",
"おちつく", "おっと", "おつり", "おでかけ", "おとしもの", "おとなしい", "おどり", "おどろかす",
"おばさん", "おまいり", "おめでとう", "おもいで", "おもう", "おもたい", "おもちゃ", "おやつ",
"おやゆび", "およぼす", "おらんだ", "おろす", "おんがく", "おんけい", "おんしゃ", "おんせん",
"おんだん", "おんちゅう", "おんどけい", "かあつ", "かいが", "がいき", "がいけん", "がいこう",
"かいさつ", "かいしゃ", "かいすいよく", "かいぜん", "かいぞうど", "かいつう", "かいてん", "かいとう",
"かいふく", "がいへき", "かいほう", "かいよう", "がいらい", "かいわ", "かえる", "かおり",
"かかえる", "かがく", "かがし", "かがみ", "かくご", "かくとく", "かざる", "がぞう",
"かたい", "かたち", "がちょう", "がっきゅう", "がっこう", "がっさん", "がっしょう", "かなざわし",
"かのう", "がはく", "かぶか", "かほう", "かほご", "かまう", "かまぼこ", "かめれおん",
"かゆい", "かようび", "からい", "かるい", "かろう", "かわく", "かわら", "がんか",
"かんけい", "かんこう", "かんしゃ", "かんそう", "かんたん", "かんち", "がんばる", "きあい",
"きあつ", "きいろ", "ぎいん", "きうい", "きうん", "きえる", "きおう", "きおく",
"きおち", "きおん", "きかい", "きかく", "きかんしゃ", "ききて", "きくばり", "きくらげ",
"きけんせい", "きこう", "きこえる", "きこく", "きさい", "きさく", "きさま", "きさらぎ",
"ぎじかがく", "ぎしき", "ぎじたいけん", "ぎじにってい", "ぎじゅつしゃ", "きすう", "きせい", "きせき",
"きせつ", "きそう", "きぞく", "きぞん", "きたえる", "きちょう", "きつえん", "ぎっちり",
"きつつき", "きつね", "きてい", "きどう", "きどく", "きない", "きなが", "きなこ",
"きぬごし", "きねん", "きのう", "きのした", "きはく", "きびしい", "きひん", "きふく",
"きぶん", "きぼう", "きほん", "きまる", "きみつ", "きむずかしい", "きめる", "きもだめし",
"きもち", "きもの", "きゃく", "きやく", "ぎゅうにく", "きよう", "きょうりゅう", "きらい",
"きらく", "きりん", "きれい", "きれつ", "きろく", "ぎろん", "きわめる", "ぎんいろ",
"きんかくじ", "きんじょ", "きんようび", "ぐあい", "くいず", "くうかん", "くうき", "くうぐん",
"くうこう", "ぐうせい", "くうそう", "ぐうたら", "くうふく", "くうぼ", "くかん", "くきょう",
"くげん", "ぐこう", "くさい", "くさき", "くさばな", "くさる", "くしゃみ", "くしょう",
"くすのき", "くすりゆび", "くせげ", "くせん", "ぐたいてき", "くださる", "くたびれる", "くちこみ",
"くちさき", "くつした", "ぐっすり", "くつろぐ", "くとうてん", "くどく", "くなん", "くねくね",
"くのう", "くふう", "くみあわせ", "くみたてる", "くめる", "くやくしょ", "くらす", "くらべる",
"くるま", "くれる", "くろう", "くわしい", "ぐんかん", "ぐんしょく", "ぐんたい", "ぐんて",
"けあな", "けいかく", "けいけん", "けいこ", "けいさつ", "げいじゅつ", "けいたい", "げいのうじん",
"けいれき", "けいろ", "けおとす", "けおりもの", "げきか", "げきげん", "げきだん", "げきちん",
"げきとつ", "げきは", "げきやく", "げこう", "げこくじょう", "げざい", "けさき", "げざん",
"けしき", "けしごむ", "けしょう", "げすと", "けたば", "けちゃっぷ", "けちらす", "けつあつ",
"けつい", "けつえき", "けっこん", "けつじょ", "けっせき", "けってい", "けつまつ", "げつようび",
"げつれい", "けつろん", "げどく", "けとばす", "けとる", "けなげ", "けなす", "けなみ",
"けぬき", "げねつ", "けねん", "けはい", "げひん", "けぶかい", "げぼく", "けまり",
"けみかる", "けむし", "けむり", "けもの", "けらい", "けろけろ", "けわしい", "けんい",
"けんえつ", "けんお", "けんか", "げんき", "けんげん", "けんこう", "けんさく", "けんしゅう",
"けんすう", "げんそう", "けんちく", "けんてい", "けんとう", "けんない", "けんにん", "げんぶつ",
"けんま", "けんみん", "けんめい", "けんらん", "けんり", "こあくま", "こいぬ", "こいびと",
"ごうい", "こうえん", "こうおん", "こうかん", "ごうきゅう", "ごうけい", "こうこう", "こうさい",
"こうじ", "こうすい", "ごうせい", "こうそく", "こうたい", "こうちゃ", "こうつう", "こうてい",
"こうどう", "こうない", "こうはい", "ごうほう", "ごうまん", "こうもく", "こうりつ", "こえる",
"こおり", "ごかい", "ごがつ", "ごかん", "こくご", "こくさい", "こくとう", "こくない",
"こくはく", "こぐま", "こけい", "こける", "ここのか", "こころ", "こさめ", "こしつ",
"こすう", "こせい", "こせき", "こぜん", "こそだて", "こたい", "こたえる", "こたつ",
"こちょう", "こっか", "こつこつ", "こつばん", "こつぶ", "こてい", "こてん", "ことがら",
"ことし", "ことば", "ことり", "こなごな", "こねこね", "このまま", "このみ", "このよ",
"ごはん", "こひつじ", "こふう", "こふん", "こぼれる", "ごまあぶら", "こまかい", "ごますり",
"こまつな", "こまる", "こむぎこ", "こもじ", "こもち", "こもの", "こもん", "こやく",
"こやま", "こゆう", "こゆび", "こよい", "こよう", "こりる", "これくしょん", "ころっけ",
"こわもて", "こわれる", "こんいん", "こんかい", "こんき", "こんしゅう", "こんすい", "こんだて",
"こんとん", "こんなん", "こんびに", "こんぽん", "こんまけ", "こんや", "こんれい", "こんわく",
"ざいえき", "さいかい", "さいきん", "ざいげん", "ざいこ", "さいしょ", "さいせい", "ざいたく",
"ざいちゅう", "さいてき", "ざいりょう", "さうな", "さかいし", "さがす", "さかな", "さかみち",
"さがる", "さぎょう", "さくし", "さくひん", "さくら", "さこく", "さこつ", "さずかる",
"ざせき", "さたん", "さつえい", "ざつおん", "ざっか", "ざつがく", "さっきょく", "ざっし",
"さつじん", "ざっそう", "さつたば", "さつまいも", "さてい", "さといも", "さとう", "さとおや",
"さとし", "さとる", "さのう", "さばく", "さびしい", "さべつ", "さほう", "さほど",
"さます", "さみしい", "さみだれ", "さむけ", "さめる", "さやえんどう", "さゆう", "さよう",
"さよく", "さらだ", "ざるそば", "さわやか", "さわる", "さんいん", "さんか", "さんきゃく",
"さんこう", "さんさい", "ざんしょ", "さんすう", "さんせい", "さんそ", "さんち", "さんま",
"さんみ", "さんらん", "しあい", "しあげ", "しあさって", "しあわせ", "しいく", "しいん",
"しうち", "しえい", "しおけ", "しかい", "しかく", "じかん", "しごと", "しすう",
"じだい", "したうけ", "したぎ", "したて", "したみ", "しちょう", "しちりん", "しっかり",
"しつじ", "しつもん", "してい", "してき", "してつ", "じてん", "じどう", "しなぎれ",
"しなもの", "しなん", "しねま", "しねん", "しのぐ", "しのぶ", "しはい", "しばかり",
"しはつ", "しはらい", "しはん", "しひょう", "しふく", "じぶん", "しへい", "しほう",
"しほん", "しまう", "しまる", "しみん", "しむける", "じむしょ", "しめい", "しめる",
"しもん", "しゃいん", "しゃうん", "しゃおん", "じゃがいも", "しやくしょ", "しゃくほう", "しゃけん",
"しゃこ", "しゃざい", "しゃしん", "しゃせん", "しゃそう", "しゃたい", "しゃちょう", "しゃっきん",
"じゃま", "しゃりん", "しゃれい", "じゆう", "じゅうしょ", "しゅくはく", "じゅしん", "しゅっせき",
"しゅみ", "しゅらば", "じゅんばん", "しょうかい", "しょくたく", "しょっけん", "しょどう", "しょもつ",
"しらせる", "しらべる", "しんか", "しんこう", "じんじゃ", "しんせいじ", "しんちく", "しんりん",
"すあげ", "すあし", "すあな", "ずあん", "すいえい", "すいか", "すいとう", "ずいぶん",
"すいようび", "すうがく", "すうじつ", "すうせん", "すおどり", "すきま", "すくう", "すくない",
"すける", "すごい", "すこし", "ずさん", "すずしい", "すすむ", "すすめる", "すっかり",
"ずっしり", "ずっと", "すてき", "すてる", "すねる", "すのこ", "すはだ", "すばらしい",
"ずひょう", "ずぶぬれ", "すぶり", "すふれ", "すべて", "すべる", "ずほう", "すぼん",
"すまい", "すめし", "すもう", "すやき", "すらすら", "するめ", "すれちがう", "すろっと",
"すわる", "すんぜん", "すんぽう", "せあぶら", "せいかつ", "せいげん", "せいじ", "せいよう",
"せおう", "せかいかん", "せきにん", "せきむ", "せきゆ", "せきらんうん", "せけん", "せこう",
"せすじ", "せたい", "せたけ", "せっかく", "せっきゃく", "ぜっく", "せっけん", "せっこつ",
"せっさたくま", "せつぞく", "せつだん", "せつでん", "せっぱん", "せつび", "せつぶん", "せつめい",
"せつりつ", "せなか", "せのび", "せはば", "せびろ", "せぼね", "せまい", "せまる",
"せめる", "せもたれ", "せりふ", "ぜんあく", "せんい", "せんえい", "せんか", "せんきょ",
"せんく", "せんげん", "ぜんご", "せんさい", "せんしゅ", "せんすい", "せんせい", "せんぞ",
"せんたく", "せんちょう", "せんてい", "せんとう", "せんぬき", "せんねん", "せんぱい", "ぜんぶ",
"ぜんぽう", "せんむ", "せんめんじょ", "せんもん", "せんやく", "せんゆう", "せんよう", "ぜんら",
"ぜんりゃく", "せんれい", "せんろ", "そあく", "そいとげる", "そいね", "そうがんきょう", "そうき",
"そうご", "そうしん", "そうだん", "そうなん", "そうび", "そうめん", "そうり", "そえもの",
"そえん", "そがい", "そげき", "そこう", "そこそこ", "そざい", "そしな", "そせい",
"そせん", "そそぐ", "そだてる", "そつう", "そつえん", "そっかん", "そつぎょう", "そっけつ",
"そっこう", "そっせん", "そっと", "そとがわ", "そとづら", "そなえる", "そなた", "そふぼ",
"そぼく", "そぼろ", "そまつ", "そまる", "そむく", "そむりえ", "そめる", "そもそも",
"そよかぜ", "そらまめ", "そろう", "そんかい", "そんけい", "そんざい", "そんしつ", "そんぞく",
"そんちょう", "ぞんび", "ぞんぶん", "そんみん", "たあい", "たいいん", "たいうん", "たいえき",
"たいおう", "だいがく", "たいき", "たいぐう", "たいけん", "たいこ", "たいざい", "だいじょうぶ",
"だいすき", "たいせつ", "たいそう", "だいたい", "たいちょう", "たいてい", "だいどころ", "たいない",
"たいねつ", "たいのう", "たいはん", "だいひょう", "たいふう", "たいへん", "たいほ", "たいまつばな",
"たいみんぐ", "たいむ", "たいめん", "たいやき", "たいよう", "たいら", "たいりょく", "たいる",
"たいわん", "たうえ", "たえる", "たおす", "たおる", "たおれる", "たかい", "たかね",
"たきび", "たくさん", "たこく", "たこやき", "たさい", "たしざん", "だじゃれ", "たすける",
"たずさわる", "たそがれ", "たたかう", "たたく", "ただしい", "たたみ", "たちばな", "だっかい",
"だっきゃく", "だっこ", "だっしゅつ", "だったい", "たてる", "たとえる", "たなばた", "たにん",
"たぬき", "たのしみ", "たはつ", "たぶん", "たべる", "たぼう", "たまご", "たまる",
"だむる", "ためいき", "ためす", "ためる", "たもつ", "たやすい", "たよる", "たらす",
"たりきほんがん", "たりょう", "たりる", "たると", "たれる", "たれんと", "たろっと", "たわむれる",
"だんあつ", "たんい", "たんおん", "たんか", "たんき", "たんけん", "たんご", "たんさん",
"たんじょうび", "だんせい", "たんそく", "たんたい", "だんち", "たんてい", "たんとう", "だんな",
"たんにん", "だんねつ", "たんのう", "たんぴん", "だんぼう", "たんまつ", "たんめい", "だんれつ",
"だんろ", "だんわ", "ちあい", "ちあん", "ちいき", "ちいさい", "ちえん", "ちかい",
"ちから", "ちきゅう", "ちきん", "ちけいず", "ちけん", "ちこく", "ちさい", "ちしき",
"ちしりょう", "ちせい", "ちそう", "ちたい", "ちたん", "ちちおや", "ちつじょ", "ちてき",
"ちてん", "ちぬき", "ちぬり", "ちのう", "ちひょう", "ちへいせん", "ちほう", "ちまた",
"ちみつ", "ちみどろ", "ちめいど", "ちゃんこなべ", "ちゅうい", "ちゆりょく", "ちょうし", "ちょさくけん",
"ちらし", "ちらみ", "ちりがみ", "ちりょう", "ちるど", "ちわわ", "ちんたい", "ちんもく",
"ついか", "ついたち", "つうか", "つうじょう", "つうはん", "つうわ", "つかう", "つかれる",
"つくね", "つくる", "つけね", "つける", "つごう", "つたえる", "つづく", "つつじ",
"つつむ", "つとめる", "つながる", "つなみ", "つねづね", "つのる", "つぶす", "つまらない",
"つまる", "つみき", "つめたい", "つもり", "つもる", "つよい", "つるぼ", "つるみく",
"つわもの", "つわり", "てあし", "てあて", "てあみ", "ていおん", "ていか", "ていき",
"ていけい", "ていこく", "ていさつ", "ていし", "ていせい", "ていたい", "ていど", "ていねい",
"ていひょう", "ていへん", "ていぼう", "てうち", "ておくれ", "てきとう", "てくび", "でこぼこ",
"てさぎょう", "てさげ", "てすり", "てそう", "てちがい", "てちょう", "てつがく", "てつづき",
"でっぱ", "てつぼう", "てつや", "でぬかえ", "てぬき", "てぬぐい", "てのひら", "てはい",
"てぶくろ", "てふだ", "てほどき", "てほん", "てまえ", "てまきずし", "てみじか", "てみやげ",
"てらす", "てれび", "てわけ", "てわたし", "でんあつ", "てんいん", "てんかい", "てんき",
"てんぐ", "てんけん", "てんごく", "てんさい", "てんし", "てんすう", "でんち", "てんてき",
"てんとう", "てんない", "てんぷら", "てんぼうだい", "てんめつ", "てんらんかい", "でんりょく", "でんわ",
"どあい", "といれ", "どうかん", "とうきゅう", "どうぐ", "とうし", "とうむぎ", "とおい",
"とおか", "とおく", "とおす", "とおる", "とかい", "とかす", "ときおり", "ときどき",
"とくい", "とくしゅう", "とくてん", "とくに", "とくべつ", "とけい", "とける", "とこや",
"とさか", "としょかん", "とそう", "とたん", "とちゅう", "とっきゅう", "とっくん", "とつぜん",
"とつにゅう", "とどける", "ととのえる", "とない", "となえる", "となり", "とのさま", "とばす",
"どぶがわ", "とほう", "とまる", "とめる", "ともだち", "ともる", "どようび", "とらえる",
"とんかつ", "どんぶり", "ないかく", "ないこう", "ないしょ", "ないす", "ないせん", "ないそう",
"なおす", "ながい", "なくす", "なげる", "なこうど", "なさけ", "なたでここ", "なっとう",
"なつやすみ", "ななおし", "なにごと", "なにもの", "なにわ", "なのか", "なふだ", "なまいき",
"なまえ", "なまみ", "なみだ", "なめらか", "なめる", "なやむ", "ならう", "ならび",
"ならぶ", "なれる", "なわとび", "なわばり", "にあう", "にいがた", "にうけ", "におい",
"にかい", "にがて", "にきび", "にくしみ", "にくまん", "にげる", "にさんかたんそ", "にしき",
"にせもの", "にちじょう", "にちようび", "にっか", "にっき", "にっけい", "にっこう", "にっさん",
"にっしょく", "にっすう", "にっせき", "にってい", "になう", "にほん", "にまめ", "にもつ",
"にやり", "にゅういん", "にりんしゃ", "にわとり", "にんい", "にんか", "にんき", "にんげん",
"にんしき", "にんずう", "にんそう", "にんたい", "にんち", "にんてい", "にんにく", "にんぷ",
"にんまり", "にんむ", "にんめい", "にんよう", "ぬいくぎ", "ぬかす", "ぬぐいとる", "ぬぐう",
"ぬくもり", "ぬすむ", "ぬまえび", "ぬめり", "ぬらす", "ぬんちゃく", "ねあげ", "ねいき",
"ねいる", "ねいろ", "ねぐせ", "ねくたい", "ねくら", "ねこぜ", "ねこむ", "ねさげ",
"ねすごす", "ねそべる", "ねだん", "ねつい", "ねっしん", "ねつぞう", "ねったいぎょ", "ねぶそく",
"ねふだ", "ねぼう", "ねほりはほり", "ねまき", "ねまわし", "ねみみ", "ねむい", "ねむたい",
"ねもと", "ねらう", "ねわざ", "ねんいり", "ねんおし", "ねんかん", "ねんきん", "ねんぐ",
"ねんざ", "ねんし", "ねんちゃく", "ねんど", "ねんぴ", "ねんぶつ", "ねんまつ", "ねんりょう",
"ねんれい", "のいず", "のおづま", "のがす", "のきなみ", "のこぎり", "のこす", "のこる",
"のせる", "のぞく", "のぞむ", "のたまう", "のちほど", "のっく", "のばす", "のはら",
"のべる", "のぼる", "のみもの", "のやま", "のらいぬ", "のらねこ", "のりもの", "のりゆき",
"のれん", "のんき", "ばあい", "はあく", "ばあさん", "ばいか", "ばいく", "はいけん",
"はいご", "はいしん", "はいすい", "はいせん", "はいそう", "はいち", "ばいばい", "はいれつ",
"はえる", "はおる", "はかい", "ばかり", "はかる", "はくしゅ", "はけん", "はこぶ",
"はさみ", "はさん", "はしご", "ばしょ", "はしる", "はせる", "ぱそこん", "はそん",
"はたん", "はちみつ", "はつおん", "はっかく", "はづき", "はっきり", "はっくつ", "はっけん",
"はっこう", "はっさん", "はっしん", "はったつ", "はっちゅう", "はってん", "はっぴょう", "はっぽう",
"はなす", "はなび", "はにかむ", "はぶらし", "はみがき", "はむかう", "はめつ", "はやい",
"はやし", "はらう", "はろうぃん", "はわい", "はんい", "はんえい", "はんおん", "はんかく",
"はんきょう", "ばんぐみ", "はんこ", "はんしゃ", "はんすう", "はんだん", "ぱんち", "ぱんつ",
"はんてい", "はんとし", "はんのう", "はんぱ", "はんぶん", "はんぺん", "はんぼうき", "はんめい",
"はんらん", "はんろん", "ひいき", "ひうん", "ひえる", "ひかく", "ひかり", "ひかる",
"ひかん", "ひくい", "ひけつ", "ひこうき", "ひこく", "ひさい", "ひさしぶり", "ひさん",
"びじゅつかん", "ひしょ"
]
}
};
(function() {
'use strict';
for (var i in mn_words) {
if (mn_words.hasOwnProperty(i)) {
if (mn_words[i].prefix_len === 0) {
continue;
}
mn_words[i].trunc_words = [];
for (var j = 0; j < mn_words[i].words.length; ++j) {
mn_words[i].trunc_words.push(mn_words[i].words[j].slice(0, mn_words[i].prefix_len));
}
}
}
})();
var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function j(a,b){this.totalCount=a,this.dataCount=b}function k(){this.buffer=[],this.length=0}function m(){return"undefined"!=typeof CanvasRenderingContext2D}function n(){var a=!1,b=navigator.userAgent;return/android/i.test(b)&&(a=!0,aMat=b.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(a=parseFloat(aMat[1]))),a}function r(a,b){for(var c=1,e=s(a),f=0,g=l.length;g>=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=0==b%2)},setupPositionAdjustPattern:function(){for(var a=f.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var g=-2;2>=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c
;(function(root, undefined) {
'use strict';
var NODE_JS = typeof(module) != 'undefined';
if(NODE_JS) {
root = global;
if(root.JS_SHA3_TEST) {
root.navigator = { userAgent: 'Chrome'};
}
}
var HEX_CHARS = '0123456789abcdef'.split('');
var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
var KECCAK_PADDING = [1, 256, 65536, 16777216];
var PADDING = [6, 1536, 393216, 100663296];
var SHIFT = [0, 8, 16, 24];
var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649,
0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0,
2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,
2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
var BITS = [224, 256, 384, 512];
var SHAKE_BITS = [128, 256];
var OUTPUT_TYPES = ['hex', 'buffer', 'array'];
var createOutputMethod = function(bits, padding, outputType) {
return function(message) {
return new Keccak(bits, padding, bits).update(message)[outputType]();
}
};
var createShakeOutputMethod = function(bits, padding, outputType) {
return function(message, outputBits) {
return new Keccak(bits, padding, outputBits).update(message)[outputType]();
}
};
var createMethod = function(bits, padding) {
var method = createOutputMethod(bits, padding, 'hex');
method.create = function() {
return new Keccak(bits, padding, bits);
};
method.update = function(message) {
return method.create().update(message);
};
for(var i = 0;i < OUTPUT_TYPES.length;++i) {
var type = OUTPUT_TYPES[i];
method[type] = createOutputMethod(bits, padding, type);
}
return method;
};
var createShakeMethod = function(bits, padding) {
var method = createShakeOutputMethod(bits, padding, 'hex');
method.create = function(outputBits) {
return new Keccak(bits, padding, outputBits);
};
method.update = function(message, outputBits) {
return method.create(outputBits).update(message);
};
for(var i = 0;i < OUTPUT_TYPES.length;++i) {
var type = OUTPUT_TYPES[i];
method[type] = createShakeOutputMethod(bits, padding, type);
}
return method;
};
var algorithms = [
{name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod},
{name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod},
{name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod}
];
var methods = {};
for(var i = 0;i < algorithms.length;++i) {
var algorithm = algorithms[i];
var bits = algorithm.bits;
var createMethod = algorithm.createMethod;
for(var j = 0;j < bits.length;++j) {
var method = algorithm.createMethod(bits[j], algorithm.padding);
methods[algorithm.name +'_' + bits[j]] = method;
}
}
function Keccak(bits, padding, outputBits) {
this.blocks = [];
this.s = [];
this.padding = padding;
this.outputBits = outputBits;
this.reset = true;
this.block = 0;
this.start = 0;
this.blockCount = (1600 - (bits << 1)) >> 5;
this.byteCount = this.blockCount << 2;
this.outputBlocks = outputBits >> 5;
this.extraBytes = (outputBits & 31) >> 3;
for(var i = 0;i < 50;++i) {
this.s[i] = 0;
}
};
Keccak.prototype.update = function(message) {
var notString = typeof(message) != 'string';
if(notString && message.constructor == root.ArrayBuffer) {
message = new Uint8Array(message);
}
var length = message.length, blocks = this.blocks, byteCount = this.byteCount,
blockCount = this.blockCount, index = 0, s = this.s, i, code;
while(index < length) {
if(this.reset) {
this.reset = false;
blocks[0] = this.block;
for(i = 1;i < blockCount + 1;++i) {
blocks[i] = 0;
}
}
if(notString) {
for (i = this.start;index < length && i < byteCount; ++index) {
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
}
} else {
for (i = this.start;index < length && i < byteCount; ++index) {
code = message.charCodeAt(index);
if (code < 0x80) {
blocks[i >> 2] |= code << SHIFT[i++ & 3];
} else if (code < 0x800) {
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
} else if (code < 0xd800 || code >= 0xe000) {
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
} else {
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
}
}
}
this.lastByteIndex = i;
if(i >= byteCount) {
this.start = i - byteCount;
this.block = blocks[blockCount];
for(i = 0;i < blockCount;++i) {
s[i] ^= blocks[i];
}
f(s);
this.reset = true;
} else {
this.start = i;
}
}
return this;
};
Keccak.prototype.finalize = function() {
var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
blocks[i >> 2] |= this.padding[i & 3];
if(this.lastByteIndex == this.byteCount) {
blocks[0] = blocks[blockCount];
for(i = 1;i < blockCount + 1;++i) {
blocks[i] = 0;
}
}
blocks[blockCount - 1] |= 0x80000000;
for(i = 0;i < blockCount;++i) {
s[i] ^= blocks[i];
}
f(s);
};
Keccak.prototype.toString = Keccak.prototype.hex = function() {
this.finalize();
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
extraBytes = this.extraBytes, i = 0, j = 0;
var hex = '', block;
while(j < outputBlocks) {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
block = s[i];
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] +
HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] +
HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] +
HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];
}
if(j % blockCount == 0) {
f(s);
}
}
if(extraBytes) {
block = s[i];
if(extraBytes > 0) {
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
}
if(extraBytes > 1) {
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
}
if(extraBytes > 2) {
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
}
}
return hex;
};
Keccak.prototype.buffer = function() {
this.finalize();
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
extraBytes = this.extraBytes, i = 0, j = 0;
var bytes = this.outputBits >> 3;
var buffer;
if(extraBytes) {
buffer = new ArrayBuffer((outputBlocks + 1) << 2);
} else {
buffer = new ArrayBuffer(bytes);
}
var array = new Uint32Array(buffer);
while(j < outputBlocks) {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
array[j] = s[i];
}
if(j % blockCount == 0) {
f(s);
}
}
if(extraBytes) {
array[i] = s[i];
buffer = buffer.slice(0, bytes);
}
return buffer;
};
Keccak.prototype.digest = Keccak.prototype.array = function() {
this.finalize();
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
extraBytes = this.extraBytes, i = 0, j = 0;
var array = [], offset, block;
while(j < outputBlocks) {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
offset = j << 2;
block = s[i];
array[offset] = block & 0xFF;
array[offset + 1] = (block >> 8) & 0xFF;
array[offset + 2] = (block >> 16) & 0xFF;
array[offset + 3] = (block >> 24) & 0xFF;
}
if(j % blockCount == 0) {
f(s);
}
}
if(extraBytes) {
offset = j << 2;
block = s[i];
if(extraBytes > 0) {
array[offset] = block & 0xFF;
}
if(extraBytes > 1) {
array[offset + 1] = (block >> 8) & 0xFF;
}
if(extraBytes > 2) {
array[offset + 2] = (block >> 16) & 0xFF;
}
}
return array;
};
var f = function(s) {
var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,
b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33,
b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;
for(n = 0; n < 48; n += 2) {
c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
h = c8 ^ ((c2 << 1) | (c3 >>> 31));
l = c9 ^ ((c3 << 1) | (c2 >>> 31));
s[0] ^= h;
s[1] ^= l;
s[10] ^= h;
s[11] ^= l;
s[20] ^= h;
s[21] ^= l;
s[30] ^= h;
s[31] ^= l;
s[40] ^= h;
s[41] ^= l;
h = c0 ^ ((c4 << 1) | (c5 >>> 31));
l = c1 ^ ((c5 << 1) | (c4 >>> 31));
s[2] ^= h;
s[3] ^= l;
s[12] ^= h;
s[13] ^= l;
s[22] ^= h;
s[23] ^= l;
s[32] ^= h;
s[33] ^= l;
s[42] ^= h;
s[43] ^= l;
h = c2 ^ ((c6 << 1) | (c7 >>> 31));
l = c3 ^ ((c7 << 1) | (c6 >>> 31));
s[4] ^= h;
s[5] ^= l;
s[14] ^= h;
s[15] ^= l;
s[24] ^= h;
s[25] ^= l;
s[34] ^= h;
s[35] ^= l;
s[44] ^= h;
s[45] ^= l;
h = c4 ^ ((c8 << 1) | (c9 >>> 31));
l = c5 ^ ((c9 << 1) | (c8 >>> 31));
s[6] ^= h;
s[7] ^= l;
s[16] ^= h;
s[17] ^= l;
s[26] ^= h;
s[27] ^= l;
s[36] ^= h;
s[37] ^= l;
s[46] ^= h;
s[47] ^= l;
h = c6 ^ ((c0 << 1) | (c1 >>> 31));
l = c7 ^ ((c1 << 1) | (c0 >>> 31));
s[8] ^= h;
s[9] ^= l;
s[18] ^= h;
s[19] ^= l;
s[28] ^= h;
s[29] ^= l;
s[38] ^= h;
s[39] ^= l;
s[48] ^= h;
s[49] ^= l;
b0 = s[0];
b1 = s[1];
b32 = (s[11] << 4) | (s[10] >>> 28);
b33 = (s[10] << 4) | (s[11] >>> 28);
b14 = (s[20] << 3) | (s[21] >>> 29);
b15 = (s[21] << 3) | (s[20] >>> 29);
b46 = (s[31] << 9) | (s[30] >>> 23);
b47 = (s[30] << 9) | (s[31] >>> 23);
b28 = (s[40] << 18) | (s[41] >>> 14);
b29 = (s[41] << 18) | (s[40] >>> 14);
b20 = (s[2] << 1) | (s[3] >>> 31);
b21 = (s[3] << 1) | (s[2] >>> 31);
b2 = (s[13] << 12) | (s[12] >>> 20);
b3 = (s[12] << 12) | (s[13] >>> 20);
b34 = (s[22] << 10) | (s[23] >>> 22);
b35 = (s[23] << 10) | (s[22] >>> 22);
b16 = (s[33] << 13) | (s[32] >>> 19);
b17 = (s[32] << 13) | (s[33] >>> 19);
b48 = (s[42] << 2) | (s[43] >>> 30);
b49 = (s[43] << 2) | (s[42] >>> 30);
b40 = (s[5] << 30) | (s[4] >>> 2);
b41 = (s[4] << 30) | (s[5] >>> 2);
b22 = (s[14] << 6) | (s[15] >>> 26);
b23 = (s[15] << 6) | (s[14] >>> 26);
b4 = (s[25] << 11) | (s[24] >>> 21);
b5 = (s[24] << 11) | (s[25] >>> 21);
b36 = (s[34] << 15) | (s[35] >>> 17);
b37 = (s[35] << 15) | (s[34] >>> 17);
b18 = (s[45] << 29) | (s[44] >>> 3);
b19 = (s[44] << 29) | (s[45] >>> 3);
b10 = (s[6] << 28) | (s[7] >>> 4);
b11 = (s[7] << 28) | (s[6] >>> 4);
b42 = (s[17] << 23) | (s[16] >>> 9);
b43 = (s[16] << 23) | (s[17] >>> 9);
b24 = (s[26] << 25) | (s[27] >>> 7);
b25 = (s[27] << 25) | (s[26] >>> 7);
b6 = (s[36] << 21) | (s[37] >>> 11);
b7 = (s[37] << 21) | (s[36] >>> 11);
b38 = (s[47] << 24) | (s[46] >>> 8);
b39 = (s[46] << 24) | (s[47] >>> 8);
b30 = (s[8] << 27) | (s[9] >>> 5);
b31 = (s[9] << 27) | (s[8] >>> 5);
b12 = (s[18] << 20) | (s[19] >>> 12);
b13 = (s[19] << 20) | (s[18] >>> 12);
b44 = (s[29] << 7) | (s[28] >>> 25);
b45 = (s[28] << 7) | (s[29] >>> 25);
b26 = (s[38] << 8) | (s[39] >>> 24);
b27 = (s[39] << 8) | (s[38] >>> 24);
b8 = (s[48] << 14) | (s[49] >>> 18);
b9 = (s[49] << 14) | (s[48] >>> 18);
s[0] = b0 ^ (~b2 & b4);
s[1] = b1 ^ (~b3 & b5);
s[10] = b10 ^ (~b12 & b14);
s[11] = b11 ^ (~b13 & b15);
s[20] = b20 ^ (~b22 & b24);
s[21] = b21 ^ (~b23 & b25);
s[30] = b30 ^ (~b32 & b34);
s[31] = b31 ^ (~b33 & b35);
s[40] = b40 ^ (~b42 & b44);
s[41] = b41 ^ (~b43 & b45);
s[2] = b2 ^ (~b4 & b6);
s[3] = b3 ^ (~b5 & b7);
s[12] = b12 ^ (~b14 & b16);
s[13] = b13 ^ (~b15 & b17);
s[22] = b22 ^ (~b24 & b26);
s[23] = b23 ^ (~b25 & b27);
s[32] = b32 ^ (~b34 & b36);
s[33] = b33 ^ (~b35 & b37);
s[42] = b42 ^ (~b44 & b46);
s[43] = b43 ^ (~b45 & b47);
s[4] = b4 ^ (~b6 & b8);
s[5] = b5 ^ (~b7 & b9);
s[14] = b14 ^ (~b16 & b18);
s[15] = b15 ^ (~b17 & b19);
s[24] = b24 ^ (~b26 & b28);
s[25] = b25 ^ (~b27 & b29);
s[34] = b34 ^ (~b36 & b38);
s[35] = b35 ^ (~b37 & b39);
s[44] = b44 ^ (~b46 & b48);
s[45] = b45 ^ (~b47 & b49);
s[6] = b6 ^ (~b8 & b0);
s[7] = b7 ^ (~b9 & b1);
s[16] = b16 ^ (~b18 & b10);
s[17] = b17 ^ (~b19 & b11);
s[26] = b26 ^ (~b28 & b20);
s[27] = b27 ^ (~b29 & b21);
s[36] = b36 ^ (~b38 & b30);
s[37] = b37 ^ (~b39 & b31);
s[46] = b46 ^ (~b48 & b40);
s[47] = b47 ^ (~b49 & b41);
s[8] = b8 ^ (~b0 & b2);
s[9] = b9 ^ (~b1 & b3);
s[18] = b18 ^ (~b10 & b12);
s[19] = b19 ^ (~b11 & b13);
s[28] = b28 ^ (~b20 & b22);
s[29] = b29 ^ (~b21 & b23);
s[38] = b38 ^ (~b30 & b32);
s[39] = b39 ^ (~b31 & b33);
s[48] = b48 ^ (~b40 & b42);
s[49] = b49 ^ (~b41 & b43);
s[0] ^= RC[n];
s[1] ^= RC[n + 1];
}
}
if(!root.JS_SHA3_TEST && NODE_JS) {
module.exports = methods;
} else if(root) {
for(var key in methods) {
root[key] = methods[key];
}
}
}(this));
</script>
<style type="text/css">
html { font-family: sans-serif }
.private { background-color: #FF8080 }
.public { background-color: #80FF80 }
.qrcode {
position: fixed;
background: none repeat #FFF;
top: 50%; left: 50%;
width: 312px; height: 312px;
margin: -128px 0px 0px -128px;
padding: 24px;
border: 2px solid;
box-shadow: 0px 0px 10px rgba(0,0,0,0.25);
z-index: 1007;
display: none;
}
</style>
<nav class="grey lighten-3"><div class="nav-wrapper"><a href="#"class="brand-logo center">
<img style="height:50px;" src="data:image
/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAA8CAYAAADc3IdaAAAACXBIWXMAAAsTAAALEwEA
mpwYAAAAB3RJTUUH4gQFCRI27ZmYHgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcA
ABM0SURBVHja7Z15lB1Vncc/v6rX773uTjobgQQIRJIgihgQkUOCjrLpIHIcRcdlZHE7I5Iw4wzL4Ioe
HbMwAnELMDLocMbxeMTB8cAJ43COkoCiTtiEzkJCME1I6Czd6X5Lvbq/+aPqdb9uqt579Xp9nfvtU0l3
Vd2qW/f+7rd+v9/93V/BJEGp21xQ6jI6sL3s/x4LCwuLCshE3DT/bEHNNsFsUfztgtkjmINAX0WVWhSZ
DjIHnGMV52TBfZ3BPUHILEiL7ToLC0tYY4biEyUt/lrxHlNKTwu6T9C8IiqAoKKgIBVVUjT8W8EFmW5w
FgjumUrLMiW9zKXluJQlLwsLS1ijg8P/nVf/AQfvN4rZ7YJKsIW3F1G0siqqAzUTrayeBsQW/kjW4J6q
tFwILe9SWpdmLHFZWFjCagz9DxS1cB+UNjhwSEJtyQnJCUQav7WqhvqXIg44SwyZSyF9GWROtuaihYUl
rDqRezavhXsV7ycuZp+DI+6YPoCqovgginuWIfsRYdoVVtuysLCEVcv8+3leC3cq/qYU4I5Yk6qPsUDF
hGamIm2G9IcNmU8K2VOstmVhYQkrAj3rClpYL+ifBXUEB4eJmIRUNSg+qfMNmc/AtPOzlrQsLCxhDaL3
5qLm1juQcwauKhMTMYESzDaCwV3qk1mpTHufJS0LC0tYQM/nPc3fAfjuhJFUNHEZUB9niZK5Xpl+mSUt
C4tmhzOSwoe+WtD8HYKUJhdZBYwlQAp/m0vhFoe+XxTVdreFxRFKWL3rPM1/X8B3QCaf8iIiA/qjec6h
sA76H81b0rKwONIIq/e+gubXC5J3J/XDCYLggDiUHnco3AHF3VbTsrBoVqSSFsg9l9f+6xTdDcikMwQj
SUvDKPni/SlkiW973cLiSNGwij8S/EcGQxYGY85f/YOG/48lVKn1E9qIOMbBu1fof7BgtSwLi6muYeV2
5rV4t5D5sBOGLlQf96bX4G0ALbijH0Cq4UxguyFzkQOt9fKbYnK24y0smhFjatHlnynq4Q8qpstFaizR
UVVEJFwnWDtCXlEwPs5rlY7/FNILW2zYgoWFNQlHcPF2QTK1I97LJFVe1Aw6sC+WaVUQcZAWwWl1/mC7
0sLCEtbI1Le0QEYSKHKKM1cBU69ViGRAUnLjOLXXiwOMOnS7sEa5c2LK1VP2wphyuxLWfR7wMeBu4I9h
+f5w2xXuuxu4HJg/xdpEq2yfrd8JEbnRwD2TbCO9vgccDNvmYWAdcDGQGYXxMFYyNTGERQuryNZrlxpS
F3tkPu/jnm5qU5yE/ZEGd47zP+NEWBtj9i+rUW55lWONlt1UZ51PAu4MBeiHwJXAGcACAs9fa/j7GeGx
e4AXwjInTdE2qcQNQHoKKyUpYEbYx28HrgF+CWwDPtLgNcdapiaGsFrmpm6UbPUXRXkmz13uk10J06/I
SGYlyGIfg4ktqiHTScu4dv7GBgbfSAfnsoR1qcTlwDPAJ4EkLdUSlnkmvMZUapPhWAB8/Ai0ro4H7gX+
KWG58ZCpicOB93u6d7av+2Zr5LZ3lq/dby1q/4ahoQZ9Pyzq3pOLuneWiS432+jeWb4e+EBpPEMU3hSj
dvdQzqcTjZerqOyHqrw4nPDaUeXOrFHXr4+iWfL1Jm+TWs/3Qh2Dr1lNwlpbKezDejBeMlVVXayJ0sEn
FNX4JTiqpGadHnlQ2jVY1yevLgPgnGDIrlDaLhqadK/98rQcWlfQwmofPewEaxUr76/BP1LF5Cwd2Kxh
/EW8fue00dJxcr1OtieAw8C0YfunA6cBmyPKLAaOrvi7FygCc8K/O4A3AE9GlD0tvPZw9IV1icMVwE2j
SNQ3Ac8BP2riNqmGE4CrgDuOQE3LBf4W+HSN88ZTphonrELXA1rYdBla6o3nq9Q0Cnt+pZl557/qDJkh
kWYgosjMEpkVSvsHozMpzFiRkUPfKGjhW0DJZQhpht+mkLbol1Bhxw8098jFiJoqPCvI7HMo5bovSLXO
qccP5gO/Bc6PMVM212G+PAYUgEuGmUdPJjCbfhe+GaOwCPh+DdL9DoEDtitsyWOBd4T+jdNiyq0PTa7n
m7BN6h1AdxM4qccSMo7Xd8IXySLgUuBGiPQqv6PGNcdbphr3YZmeZ9G+59HCHkzMprk/g9cTfYEOHdKE
qgpqkLQhc7Uy/ZPV077MuCkj6U8YjPgD0fOVTixpjyGj4n608FLVepvCHvyeJzBe90Nj6Mcavn9TxDWW
jaKv5qYYoQS4OVT/7wydrv2hZrI11C5Or6Kqt1bxd0z2Nol9H1f8fmKoRUwlmNB8/r+w7+O0qFozeBMh
U40RFrmdgE85+UHkpj7q90bT/TQqTHENFCPHkP6UoeMf68tR1bpCyHzIRzBlS3BgYZC0xRTyenDQ6vVG
keJBKOxjDAlrWUT5jQ0O7MoBHid4H4s5divwFarHjBjgC8C3q5gF85qsTarhzoiBmWLq4r4GLK2JkqkG
NaxcV83VgIoP3qHoG7SFC6Q1CAY14pP5G2i9RuoO9swcl5bMSnDfbQAfLRMXAq3RnGe8/XWtYhQ/D4X9
STr9sZgOOhE4briCCJw6rPMeAx4fZnq8JqLT5gMLY5ytj8bU7SKincd7Er7Jrgf2RuxvITpGajK3STV8
A8gPu+flU5iw4sZ7V5UyEyVTyQnLy++7gWJ3Tatb1KCF7hgNq8LprT4t7/HJXqOkj0m/OUlLt56SlcwK
SJ07OHkiQrzTvXiwLmeBahEtHUxSlR7gqTo1h3OG+RSeInAw5wmC6qqVjTN9/kQQCEgCX8TdwwZmTb06
LFPvPSZzm1TDSxG+mamsZb0/Zv8jVcpMlEwlJyw1Zjl+jjpULPBitJRpCo5BKZF6u6F1hUN2SfRnuIp9
uzX/wo/Vy+37ZtTx9rMzklmhuG80QClY/By36LnUV7veErzgxeSTdny9JtDyKmbLxoRl6/HVLI3Z/78N
CHdcmdObrE1q4Zuh36WMRcBHx5A0RiOkoV4IwYzqGaGv6Xsx531/kspUUpNQXkRrt5sKqBf9gnPaBVKC
e7qQXenQ+uboT2+V8t0XeJ1r8B6/Em/Lmhvi7tV+UUay1yrua0Dd+FlC9Q/X36fJRaPewbmsSrlNDWoT
1Xw1R8Xsf6YB4Xo64T0ma5vUwssEM1yV+DzVY8gmMyoJr+x0/yPwJaKX49w6iWUqKWGZ5Sq152FFQWN8
WJo1OIsN2RU+befFfyfQ23rrQ/7z61FTpLTtNvqf+lIsjbS/LyOZFQaZa9AWjSC/Vz5NqR+tdwI5eeqb
jVXeFOVpgBRwdgJt4k0MzsRkiQ/mqyZcc2L2H2hAuA4kvMdkbZN6sJoglqyMJTS+bKVZUCBwhn+uxnkT
KVNJCcv9D0m11zfwvRiN5hhD5nOG9iqf2so9u1pL225FNI+IgilS2nYruT+tjiWtaVdlpfUakA6NMGUL
69Xvr+3DKq/vcRKvA30B2B2xPwW8pUKVbh/mL9lR8fcehsafpIGyX+8soh2dewmmi6sauXFP2sCbOsk9
Jmub1INXCBYFV+ILTaxl1cKeUPP9OnU6TiZIppIRVrpt7ipJz66van4fpfzenwzf3XZaVqb9VRWy2vod
LW25BUqHgzAD0SAxYOkw3ta15LbcHnv36VdnpP09Ef4w44Gfr6snRFrQ1MxGOn1TDRNoWR3nb4opG+er
qTUT1h2zf1YDzzeryuBupjapF2tD86mMk4EPTVHCmkcQ5HleHedOtEwl0bBAsvPrspi0lAO/9IEktc9v
v0f9LbdAcS8VwVUDq2mk+Ap+52oK2+9KxOZqimDyQUKHWnTvtiKZ2Y10ei2fzfI6zo8Llmw0ODKu409t
4PnekFCAJ2ub1Iv9wG0RWtZoJwiQBNtYYjpwf0jMk1mmkhEW7SehODVXYWL60QS5hwu7fqqlrasx/TsD
zepVPWoQDCbXhde5mvyOe+snLT8HfqG+c9OzcTJHjyZhlaft69EmNsaUPadBX03cWrrzGni+uDKbm6xN
kuBfGBoecQrw102mPZXJLkuQyuVK4kNO2okP6JwsMpWMsNzprwd3OmiVDO5CEEZQ58xc4aUH1du6Bu39
U/BNm6j3SbjPEUX7tuJtWUX+xfvqIy2/P9Cy6nhHSfuJSGbOogYafzNDp8PLmAm8kyBtyYDly6tjjCCY
aamcrZhLsJ4uatakAPy+Rp0ejtl/FckStmWJT7nycJO1SRIcBL41bN8XGeu8cWODAoF/8B4C/9+GmPMu
BN42iWUqGWE505Yg2eOC7J5aXasxXm/NGxb3bVKv8xZ0/+Mw4LOqxihhyuSepyl1rqbQ9UBN0lK/D7RY
T0QGMmMpbmb28w0IRIlg0W8Urh/29++JXlRbjvKuxHUx1/wjQ9e+RWED0QuA55Msncc3GZpNoQwPeKjJ
2iQpbg3NwzJeB3yA5kaBILYszry7bhLLVDLCSk0/SZxZS6n2jRxRwJSQUl/1VjuwWb3O1ei+X4GYRFa6
YNADv6PUuZbC3t9UpyKvB/xibd+bm0VmnjUSQYgzgd6RwM8y/NhbR+Cr6QL+PebYP4Q+GakhD18Bro05
/iOCmb1mapOk6AFuidCymh2vVCGYdxOEckxWmUrgwwKco85FxK06v6nqQelQvGbVs1W9ztWYrvsBk8ir
KGEqLMGg+x6m9Nxq8t2Px1uoXm+wIJvqjjdpW4Q7+8yxIKwkfpZNo3CNSnyjitbxNeAPwCcIIrpbCWKk
FgOfCjWWL1d5S/9zk7ZJUtw+TBs5lamBu4aZ25UOmGsnsUwlJKw55yLtC2sQgI+JSTFT7N+zv9S5Fv3z
jxExNP6JQkUdg9nzS0qdqygefDqySqZ0OExFE3MVBVUXd+55pDuWjGQ25lFqfzFDawys3xLklBotItgK
XF3l+Bmh4EalAllapdxnwjLN2CZJcRhYM0bXHq2Mo40+110xx64k8DVORplKRljpWUvFPfqCwCzUGH5G
Y3Ni+VvWzPJf+AGoGdlkrQxqXLr755Q6V1Ps3R4R6t4TjJlq92rpQI65aKQCcIjaSxS2UH3a9jC1M2Vu
J3qlexx+QBC9PVpYTfzC1WZpk6T49hhff6KwLuZl0B5qRJNRppIRFoAz71JIHx37zlA1kctz+p/8opa2
fxtRf1QCSwRQCRY/+7vuxe9ci9ffNYS0tNRT9eUkgHPMBWSPf89oVGnjCI/XY9o0okncEKrpI3FKFwhm
dm6YIm2SBP3AqilIWC8AP4s5dg3Vo/snUqaSEVbmuL8UZ94lsc8jCnhDlwrlnlur/rbbEFMMThilUDgJ
/1EM3s678DrX4uX3D3w+SIo9RK4n0iAtsknNwDn2vaMlABtHOPBG6xpxb8U3kDz1bwn4N4LUtndPsTZJ
gu+RwCHcRPhWzP4TiE9BM9EyBSTM++MuuAyzbwPkXoyMm6rM2JDf+h31nr0ZMb3UDDlv2DpURD1Kz38X
3NbtA8ZpOR5MB81ILf+uDu78S0nNe9eFRwBhEfoIPk6QgeAiguC9pQQLTsuLTrvD7QmCmJgNVE/qdqQQ
Vo7AKXz7FCOsRwn8hGdHHPt74CeTUKYqvUIJevDJG9XrXIOEaZMHNBccnPmX0H7u/ZLf8UP1n/kSJrdz
BA72OhHeG7eV1Ck30vr6L0r/pverv/s+YNDBr+WFzq0n0fKm75I99p2ChYVFUyFxBK+78CqcsgN+kDOC
tMXFbvqf/1f1Oldh+neOzxMIiBjw+/C23ELu6a+qegcHzMZy/YIT07gLr7BkZWHRpGho4BZ2/Uy9p65D
+3dQjqlSAVKzkPQx6OHOAZ/VeDGDavCJC2npAFMCvz9IVVMmVBXcBR8l88Y1pNrmW8KysDgSNCyAzAnv
E2fxZ8HtCAihTEzeAfRwJyraOBs2yrzhukMpHUJM/xBzFQVn7ttJLV5pycrC4kgjLIC2135O3CXXok4r
qs5gfJajYZ6piXyscP0hodY180xaTr6OzFFvsWRlYXEkEhZA22k3S2rxyiEZOyeerCo5S3BmLiV1yk1k
jr3YkpWFRZNjVAZx/1NfVrPtdrR0CMQwKfgq/Ax96rXXkz3+vZasLCwsYVWQ1pbb1N+2Dvq2DV54HGlC
K+JSFcGZ/15Si/+OzLy/sGRlYWEJ69UovPhz9Xasx7z8EA6lcScscJCWmTgnXkXLoqtp6VhkycrCwhJW
PIo9W9TfeQ/+rnsg1zXo+h7lOwUJBQUN3OqopJCj3kZq4eVkF15hicrCwhJW/ch3Pahm90/xX/oFFF4O
YrVgMGYr4c21YpmNhL+rOqi4OB1LcY+/DHfBZaSnL7ZkZWFhCatBM7HrQfVf+i/M3l+hfTtR9SpuWp/m
NbCsZqDKiqSmwcwzcee9m5ZjLyE143WWqCwsLGGNkql44Ck13Y/gv/JrzMHNSK4L9XsRNYHGFcZxVa79
G9TGBKEFTc9G2hbhzDmb1Ny3weyzSLcdZ4nKwsIS1tjB692mfu8WtPdZtG8HmtsNxW7ULyKYgL2kBVId
SOYopH0BTvsSpOP1uO0n4rbaaHULC0tYEwgvv+8G9c3yQMOSF4NJv9SqdHb2LttNFhYWFhYWFk2F/wf3
p8tA8S8/8wAAAABJRU5ErkJggg=="></a>
</div>
</nav>
<div class="row">&nbsp;</div>
<div class="row center-align">
<div class="col s12">
<h4 style="color: #555;">Offline wallet generator</h4>
</div>
</div>
<div class="row">
<div class="col s12">
<p>
This page generates a new
<select onchange="js:setCoin(this.selectedIndex);" class="waves-effect waves-light btn" style="max-width: 20%">
<option>Wownero</option>
</select>
wallet. It is self contained and
does all the necessary calculations locally, so is suitable for generating a new wallet on a machine
that is not connected to the network, and may even never be. This way, you can create
a Monero/Aeon wallet without risking the keys. This file is GPG signed with Fingerprint: 61E3 EA3F 7D2A 6C27 96F1 89FA 24DC BE76 2DE9 C111.
You can check for up to date versions of this page
<a href="https://github.com/wowario/wownero-wallet-generator">here</a>.
</p>
</div>
</div>
<div class="row valign-wrapper">
<div class="col s4 right-align ">
<input class="btn orange" type="button" onclick="js:genwallet(null);"
value="Generate wallet" id="gen_with_custom_entropy_button" action=""/>
<p>Custom entropy for deterministic wallet (leave empty to use the browser's PRNG)</p>
<input type="text" value="" id="user_entropy_widget" oninput="js:checkEntropy();" />
<div style="color: red; display: none" id="user_entropy_warning_widget">WARNING: entropy is way too low for the wallet to be secure: aim for 256 bits (about a hundred dice throws)</div>
</div>
<div class="col s1 offset-s1"><h4>or</h4></div>
<div class="col s5 offset-s1">
<form>
<input class="btn deep-orange" type="button" onclick="js:genwallet_prefix();" value="Generate wallet with prefix" action="" id="gen_prefix_widget"/>
<p>(very slow for more than a few characters)</p>
<input type="text" value="W" id="prefix_widget" oninput="js:check_prefix_validity()"; />
</form>
</div>
</div>
<div class="row center-align">
<div class="col s12">
<form>
<input class="waves-effect waves-light btn" type="button" onclick="js:genwallet('english');" value="English" action=""/ id=lang_en>
<input class="waves-effect waves-light btn" type="button" onclick="js:genwallet('spanish');" value="Spanish" action=""/ id=lang_es>
<!-- portuguese word list has a few prefix collisions
<input type="button" onclick="js:genwallet('portuguese');" value="Portuguese" action=""/ id=lang_pt>
-->
<input class="waves-effect waves-light btn" type="button" onclick="js:genwallet('japanese');" value="Japanese" action=""/ id=lang_jp>
<br>
<font size="-1">(restoring non English language seeds needs a recent simplewallet)</font>
</form>
</div>
</div>
<div class="row">
<div class="col s12">
<div class="card purple lighten-4">
<div class="card-content purple-text text-darken-1">
<span class="card-title purple-text text-darken-1">
Public address
<input type="button" class="waves-effect waves-light btn" onclick="js:toggle_qr();" value="Show QR code" action=""
style="line-height: 25px; height: 25px; font-size: 60%; padding: 0px 1.5rem;"/ id="show_qr_code">
</span>
<p>This is the address you give to third parties to send wownero to you.
<br><b>It is the only information here that's meant to be public.</b>
</p>
</div>
<div class="card-action center-align">
<pre class="center-align" id="address_widget">generating...</pre>
<span class="qrcode" id="address_qr_widget" onclick="js:toggle_qr();"></span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col s12">
<div class="card orange">
<div class="card-content white-text">
<span class="card-title white-text">Mnemonic seed</span>
<p>
The mnemonic seed is a string that 25 words and allows you to recreate your
private keys. <b>Keep it secure!</b>
</p>
</div>
<div class="card-action center-align">
<h5 class="grey-text text-darken-4" id="mnemonic_widget">Generating... </h5>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col s12">
<div class="card indigo lighten-5">
<div class="card-content indigo-text text-darken-4">
<span class="card-title indigo-text text-darken-4">Private keys (optional)</span>
<p>
The spend key and view key are the raw private keys for the
new wallet.
<b>They are here for your information, since they can be recovered using the mnemonic
seed in the above box</b>.
If you decide to keep them, keep them secure.
</p>
<br>
<table>
<tbody>
<tr>
<td><pre>Spend key:</pre></td>
<td><pre id="spend_key_widget">Generating...</pre></td>
</tr>
<tr>
<td><pre>View key:</pre></td>
<td><pre id="view_key_widget">Generating...</pre></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="row">&nbsp;</div>
<footer class="page-footer grey lighten-3 grey-text text-darken-4">
<div class="container">
<div class="row">
<div class="col l12">
<h5>Credits</h5>
<p>
Portions made by moneromooo, antanst, luigi1111 based on code from <a href="https://mymonero.com/">MyMonero</a>. <a href="https://github.com/wowario/wownero-wallet-generator">Source code</a>.
</p>
</div>
</div>
</div>
</footer>
<script>
window.onbeforeunload = function(e) {
return '';
};
function poor_mans_kdf(str)
{
var hex = cnBase58.bintohex(cnBase58.strtobin(str));
for (var n = 0; n < 10000; ++n)
hex = keccak_256(cnBase58.hextobin(hex));
return hex;
}
current_lang='english';
keys = null;
function genwallet(lang)
{
if(keys && !confirm('Are you sure? This wallet cannot be recovered once a new wallet is generated.')) {
return;
}
spend_key_widget = document.getElementById("spend_key_widget");
view_key_widget = document.getElementById("view_key_widget");
address_widget = document.getElementById("address_widget");
address_qr_widget = document.getElementById("address_qr_widget");
mnemonic_widget = document.getElementById("mnemonic_widget");
user_entropy_widget = document.getElementById("user_entropy_widget")
if (lang!=null) {
current_lang = lang;
}
else {
var user_entropy = user_entropy_widget.value;
if (user_entropy === "") {
seed = cnUtil.sc_reduce32(cnUtil.rand_32());
}
else {
seed = cnUtil.sc_reduce32(poor_mans_kdf(user_entropy));
}
keys = cnUtil.create_address(seed);
}
mnemonic = mn_encode(seed,current_lang);
spend_key_widget.innerHTML = keys.spend.sec;
view_key_widget.innerHTML = keys.view.sec;
address_widget.innerHTML = cnUtil.pubkeys_to_string(keys.spend.pub, keys.view.pub);
address_qr_widget.innerHTML = "";
mnemonic_widget.innerHTML = mnemonic;
// only monero has the URI scheme
if (prefix_widget.value == "W") {
qr=new QRCode(address_qr_widget, {correctLevel:QRCode.CorrectLevel.L});
qr.makeCode("wownero:"+keys.public_addr);
}
else {
qr = null;
}
}
previous_button_text = "";
prefix = "";
function genwallet_prefix_worker()
{
attempts = 0;
while (true) {
attempts++;
seed = cnUtil.sc_reduce32(cnUtil.rand_32());
keys = cnUtil.create_address_if_prefix(seed,prefix);
if (keys != null) {
gen_prefix_widget = document.getElementById("gen_prefix_widget");
prefix_widget = document.getElementById("prefix_widget");
gen_prefix_widget.value = previous_button_text;
prefix_widget.disabled = false;
generating = false;
break;
}
if (attempts == 10) {
if (generating)
setTimeout(genwallet_prefix_worker, 0);
return;
}
}
mnemonic = mn_encode(seed,current_lang);
spend_key_widget = document.getElementById("spend_key_widget");
view_key_widget = document.getElementById("view_key_widget");
address_widget = document.getElementById("address_widget");
mnemonic_widget = document.getElementById("mnemonic_widget");
spend_key_widget.innerHTML = keys.spend.sec;
view_key_widget.innerHTML = keys.view.sec;
address_widget.innerHTML = keys.public_addr;
address_qr_widget.innerHTML = "";
mnemonic_widget.innerHTML = mnemonic;
qr=new QRCode(address_qr_widget, {correctLevel:QRCode.CorrectLevel.L});
qr.makeCode("wownero:"+keys.public_addr);
}
var zerohex="0000000000000000000000000000000000000000000000000000000000000000";
var ffhex="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
function is_valid_prefix(prefix)
{
if (prefix.length <= 0 || prefix.length >= 95)
return false;
var lowest_address=cnUtil.pubkeys_to_string(zerohex,zerohex);
var highest_address=cnUtil.pubkeys_to_string(ffhex,ffhex);
var lowest=lowest_address.substr(0,prefix.length);
var highest=highest_address.substr(0,prefix.length);
if (prefix<lowest)
return false;
if (prefix>highest)
return false;
return true;
}
function check_prefix_validity()
{
gen_prefix_widget = document.getElementById("gen_prefix_widget");
prefix_widget = document.getElementById("prefix_widget");
if (gen_prefix_widget.value == "STOP")
return;
prefix=prefix_widget.value;
if (is_valid_prefix(prefix)) {
gen_prefix_widget.value = "Generate wallet with prefix";
gen_prefix_widget.disabled = false;
}
else {
gen_prefix_widget.value = "Invalid prefix";
gen_prefix_widget.disabled = true;
}
}
generating = false;
function genwallet_prefix()
{
gen_prefix_widget = document.getElementById("gen_prefix_widget");
prefix_widget = document.getElementById("prefix_widget");
if (generating) {
generating = false;
gen_prefix_widget.value = previous_button_text;
prefix_widget.disabled = false;
}
else {
prefix_widget = document.getElementById("prefix_widget");
prefix = prefix_widget.value;
prefix.trim();
if (prefix.length < 2) {
alert("Bad prefix should be at least two characters");
return;
}
if (!is_valid_prefix(prefix)) {
alert("Bad prefix "+prefix+" is not a valid address prefix");
return;
}
generating = true;
previous_button_text = gen_prefix_widget.value;
gen_prefix_widget.value = "STOP";
prefix_widget.disabled = true;
setTimeout(genwallet_prefix_worker, 0);
}
}
function checkEntropy()
{
var good = true;
var button = document.getElementById("gen_with_custom_entropy_button")
var user_entropy_widget = document.getElementById("user_entropy_widget")
var user_entropy = user_entropy_widget.value;
var user_entropy_warning_widget = document.getElementById("user_entropy_warning_widget")
if (user_entropy.length === 0) {
user_entropy_warning_widget.style.display = "none"
return
}
var count = new Int32Array(256);
for (var n = 0; n < 256; ++n)
count[n] = 0
for (var n = 0; n < user_entropy.length; ++n)
count[user_entropy.charCodeAt(n)]++;
var e = 0
for (var n = 0; n < 256; ++n) {
if (count[n] > 0) {
var p = count[n] / user_entropy.length
p *= Math.log(p) / Math.log(2)
e -= p
}
}
e *= user_entropy.length
if (e < 128)
good = false
if (good)
user_entropy_warning_widget.style.display = "none"
else
user_entropy_warning_widget.style.display = "block"
}
function toggle_qr()
{
address_qr_widget = document.getElementById("address_qr_widget");
spend_key_widget = document.getElementById("spend_key_widget");
view_key_widget = document.getElementById("view_key_widget");
mnemonic_widget = document.getElementById("mnemonic_widget");
if (address_qr_widget.style.display=="block") {
address_qr_widget.style.display="none";
spend_key_widget.style.display = "block";
view_key_widget.style.display = "block";
mnemonic_widget.style.display = "block";
}
else {
address_qr_widget.style.display="block";
spend_key_widget.style.display = "none";
view_key_widget.style.display = "none";
mnemonic_widget.style.display = "none";
}
}
function enableElement(id, enable)
{
var el = document.getElementById(id)
if (el) {
if (enable)
el.disabled = false;
else
el.disabled = true;
}
}
function enableLanguage(code, enable)
{
enableElement("lang_" + code, enable)
}
function setCoin(index)
{
var enable
var language
prefix_widget = document.getElementById("prefix_widget");
if (index == 0) {
cnUtil = cnUtilGen(wowConfig);
prefix_widget.value = "W";
enable = true
language = "english"
}
enableLanguage("en", enable)
enableLanguage("es", enable)
enableLanguage("pt", enable)
enableLanguage("jp", enable)
enableElement("show_qr_code", enable)
genwallet(language);
}
genwallet();
</script>
</body>
</html>