flowallet/FLO_webWallet_minified.html
2019-10-28 18:18:37 +05:30

486 lines
146 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<title>FLO web wallet</title>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta charset="UTF-8">
<meta name="description" content="This webapp allows monitoring FLO addresses and performing transactions based on blockchain.">
<style>
@font-face{font-family:'Roboto',sans-serif;src:url(https://fonts.googleapis.com/css?family=Roboto&display=swap)}:root{--sidenav-color:#f0f0f0;--accent-color:#D40E1E;--back-color:#ebebeb;--body-color:#fff;--sec-color:#ccc;--bw:#000;--opac-accent-color:rgba(210,13,29,.1)}*{-webkit-box-sizing:border-box;box-sizing:border-box}::-moz-selection{color:#fff;background:var(--accent-color)}::selection{color:#fff;background:var(--accent-color)}svg{overflow:visible}body{font-family:'Roboto',sans-serif;background-color:var(--body-color);font-size:16px;color:var(--bw);margin:0;height:100vh}button,textarea{-ms-flex-item-align:start;align-self:flex-start;display:flexbox;width:100%;padding:1em;background:transparent;border-radius:.25em;border:1px solid var(--sec-color);margin:1em 0;font-family:'Roboto',sans-serif}button{width:100%;font-weight:700;color:var(--accent-color);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;-webkit-transition:color 0.2s ease,background-color 0.2s ease,border 0.2s ease;transition:color 0.2s ease,background-color 0.2s ease,border 0.2s ease;font-size:.8em}button:hover{background-color:var(--opac-accent-color);border:1px transparent solid}.primaryButton{background:var(--accent-color)!important;color:white!important;border:1px solid var(--accent-color)}.primaryButton:hover{opacity:.8}button:disabled,button[disabled]{color:var(--sec-color)!important;pointer-events:none;background:transparent!important;border:1px solid transparent!important}button:focus,input:focus,textarea:focus{outline:none}::-moz-focus-inner{border:none}.icons:active,#addNewAddress:active,monitor:active,button:active,svg:active{-webkit-tap-highlight-color:transparent}.input,.text-area{width:100%;margin:1em 0;-ms-flex-item-align:start;align-self:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.input label,.text-area label{position:absolute;pointer-events:none;opacity:.6;padding:0 .4em;margin:1.05em 1em 1em .8em;-webkit-transition:color 0.2s ease,padding 0.2s ease,opacity 0.2s ease,-webkit-transform 0.2s ease;transition:color 0.2s ease,padding 0.2s ease,opacity 0.2s ease,-webkit-transform 0.2s ease;transition:transform 0.2s ease,color 0.2s ease,padding 0.2s ease,opacity 0.2s ease;transition:transform 0.2s ease,color 0.2s ease,padding 0.2s ease,opacity 0.2s ease,-webkit-transform 0.2s ease;background:var(--body-color);z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform-origin:left;transform-origin:left;will-change:transform}.input .label-active,.text-area .label-active{-webkit-transform:translateY(-1.7em) scale(.8);transform:translateY(-1.7em) scale(.8);opacity:1!important}.input input:focus{border:var(--accent-color) 1px solid}.input input:focus~label{color:var(--accent-color)}.text-area textarea:focus{border:var(--accent-color) 1px solid}.text-area textarea:focus~label{color:var(--accent-color)}textarea,input{color:inherit;width:100%;font-size:1em;display:flexbox;background-color:transparent;padding:1em;border-radius:.25em;margin:0;border:1px solid var(--sec-color);font-family:'Roboto',sans-serif;-webkit-transition:border 0.2s ease;transition:border 0.2s ease}#overlay{opacity:0;pointer-events:none;position:fixed;z-index:6;background:rgba(0,0,0,.2);height:100vh;width:100vw;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease}#overlay #popup{display:-webkit-box;display:-ms-flexbox;display:flex;bottom:0;position:absolute;width:100vw;padding:1em 2em;-ms-flex-wrap:wrap;flex-wrap:wrap;background:var(--body-color);-webkit-transition:-webkit-transform 0.2s ease;transition:-webkit-transform 0.2s ease;transition:transform 0.2s ease;transition:transform 0.2s ease,-webkit-transform 0.2s ease;-webkit-transform:translateY(1em);transform:translateY(1em)}#overlay #popup .input{width:100%!important;margin:1em 0!important}#overlay #popup button{border:none;width:auto;margin:.5em 0!important}#overlay #popup button:first-of-type{margin-left:auto!important}#overlay #popup button:last-of-type{margin-left:0.5em!important;width:4em!important}#overlay #popup h4,#overlay #popup h5{margin:1em 0;opacity:.8;width:100%}#textCopied{font-weight:400;padding:1em;border-radius:2em;background:var(--sec-color);position:absolute;bottom:0;pointer-events:none;margin:2em 0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:0.2s opacity ease;transition:0.2s opacity ease;opacity:0;z-index:10}#main-card #header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:400;display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;z-index:3;top:0;right:0;left:0}#main-card #header span{margin-right:1em;font-weight:700}#main-card #header svg{fill:var(--accent-color);height:2em;width:2em}#main-card #header svg:first-of-type{margin:1em .4em 1em 1em}#main-card #header svg:last-of-type{margin:1em .5em 1em auto}#main-card .right{display:-ms-grid;display:grid;left:0;position:absolute;top:48px;right:0;bottom:54px}#sendData #sdleft{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:start;align-content:flex-start;width:100%;margin:.5em 0;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-transition:width 0.2s ease;transition:width 0.2s ease}#sendData #sdleft .input{-webkit-transition:border 0.2s ease;transition:border 0.2s ease;border:1px solid var(--sec-color);margin:1em 0!important;border-radius:.25em;width:100%!important}#sendData #sdleft .input input{height:auto;border:none;padding:1em 0 1em 1em;-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}#sendData #sdleft .input button{margin:.5em .5em .5em 0!important;height:auto;border:none;width:9em}#sendData #sdleft .input:focus-within{border:1px solid var(--accent-color)}#sendData #sdleft #loadBalance{opacity:0;position:absolute;top:0;right:0;width:2em;height:2em;padding:.3em;margin:2em 1em}#sendData #sdleft #loadBalance #p1{fill:none}#sendData #sdleft #loadBalance #p2{fill:var(--accent-color)}#sendData #sdright{opacity:.6;-ms-flex-wrap:wrap;flex-wrap:wrap;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;pointer-events:none}#sendData #sdright .input,#sendData #sdright .text-area{margin:.5em 0}#sendData #dispBal{position:relative;width:100%;border:1px solid var(--sec-color);padding:1em 2em;-ms-flex-item-align:start;align-self:flex-start;overflow-wrap:break-word;border-radius:.25em;margin:auto}#sendData #dispBal #dispBalInt{font-size:3em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}#sendData #dispBal #dispBalFloat{font-size:1em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}#sendData #dispBal h5:last-of-type{opacity:.8;font-weight:400}#bottom-nav{overflow:hidden;position:fixed;height:54px;-ms-flex-line-pack:center;align-content:center;text-align:center;left:0;right:0;display:-webkit-box;display:-ms-flexbox;display:flex;bottom:0;z-index:4;background:var(--body-color);border-top:1px solid var(--sec-color)}#bottom-nav #indicator{display:none}#bottom-nav .icons{opacity:.8;position:relative;width:100%;z-index:2;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-ms-grid-column-align:center;justify-self:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.4em;cursor:pointer}#bottom-nav .icons svg{fill:var(--bw);height:1.1em;margin:0 0 4px 0;stroke:none}#bottom-nav .icons h6{margin:0;font-weight:400}#bottom-nav .icons span{display:none}.activeButton{opacity:1!important;color:var(--accent-color)!important}.activeButton svg{fill:var(--accent-color)!important}.reveal{width:16em!important}.reveal span{opacity:1!important}#overlay2{position:absolute;opacity:0;pointer-events:none;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,.2);z-index:3;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease}.show{opacity:1!important;pointer-events:all!important}.hide{opacity:0;pointer-events:none}#menu{display:none}#addrGen card{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1em 0;border:solid 1px var(--sec-color);border-radius:.25em}#addrGen card h5{margin:.5em 0 1em 0;font-weight:400}#addrGen card h4{font-weight:400}#addrGen card div{position:relative;display:flexbox;padding:1em;word-break:break-all;width:100%}#addrGen card div:nth-of-type(1){border-bottom:1px solid var(--sec-color)}#addrGen card svg{cursor:pointer;position:absolute;right:0;top:0;padding:.6em;height:2.5em;width:2.5em;margin:.8em;fill:var(--bw);opacity:.5;border-radius:2em;-webkit-transition:0.2s ease background;transition:0.2s ease background}#addrGen card svg:hover{background:var(--sec-color);opacity:1}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.innerPage{position:fixed;overflow-y:auto;display:-ms-grid;display:grid;top:0;bottom:0;left:0;right:0;-ms-flex-line-pack:start;align-content:flex-start;z-index:4;background:var(--body-color)}.title-bar{top:0;position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:auto;-ms-flex-line-pack:center;align-content:center;background:var(--body-color);border-bottom:1px solid var(--sec-color)}.title-bar svg{display:flexbox;height:3em;width:3em;padding:.9em;fill:var(--bw)!important;cursor:pointer;-ms-flex-item-align:center;align-self:center}.title-bar span{padding:.5em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-box-flex:1;-ms-flex:1;flex:1;text-overflow:ellipsis;font-weight:700;line-height:1.5em}.title-bar h5{margin:0;font-weight:400}.title-bar h3{margin:0}#dispMsg trans-container{position:absolute;overflow-y:auto;width:100%;bottom:0;top:65px;padding:.5em 0;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;background:var(--back-color)}#dispMsg trans-container transaction-card{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;width:calc(100% - 1em);-ms-flex-wrap:wrap;flex-wrap:wrap;margin:.5em 1em;border-radius:.25em;background:var(--body-color)}#dispMsg trans-container transaction-card svg{display:flexbox;-ms-flex-item-align:center;align-self:center;margin-right:.5em;height:1em;width:1em;fill:var(--accent-color)}#dispMsg trans-container transaction-card div{display:flexbox;width:100%;line-height:1.4em;padding:1em;overflow-wrap:break-word;word-wrap:break-word}#dispMsg trans-container transaction-card div:nth-of-type(1){display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;opacity:.8;font-size:.9em;padding-bottom:.5em}#dispMsg trans-container transaction-card div:nth-of-type(2){padding-top:.5em}#dispMsg trans-container transaction-card div:nth-of-type(3){text-align:right;font-size:.8em;opacity:.8}loading{position:absolute;display:-ms-grid;display:grid;height:calc(100% - 1.6em);width:calc(100% - 1.1em);place-items:center;z-index:10}loading svg{position:relative;height:2.5em;width:2.5em}loading #p1{fill:none}loading #p2{fill:var(--accent-color)}#addNewAddress{position:fixed;cursor:pointer;bottom:54px;width:3.5em;height:3.5em;right:0;margin:1em;padding:1.2em;border-radius:50%;background:var(--accent-color);-webkit-box-shadow:.1em .2em .3em rgba(0,0,0,.4);box-shadow:.1em .2em .3em rgba(0,0,0,.4);-webkit-transition:right 0.2s ease,bottom 0.2s ease;transition:right 0.2s ease,bottom 0.2s ease;z-index:2;fill:#fff}#edit-container,#add-container{position:fixed;top:0;left:0;right:0;bottom:0;z-index:4;background:rgba(0,0,0,.2);-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease}#add,#edit{position:absolute;bottom:0;width:100vw;height:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-transform:translateY(1em);transform:translateY(1em);padding:1em 2em;background:var(--body-color);-webkit-transition:-webkit-transform 0.2s ease;transition:-webkit-transform 0.2s ease;transition:transform 0.2s ease;transition:transform 0.2s ease,-webkit-transform 0.2s ease}#add button,#edit button{border:none;width:auto;margin:.5em 0!important}#add button:last-of-type,#edit button:last-of-type{margin-left:1em!important}#add h4,#edit h4{margin:1em 0;opacity:.8}#add .input,#edit .input{margin:1em 0!important;width:100%!important}#edit-container #edit svg{top:0;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:.6;fill:var(--bw);position:absolute;right:0;height:2em;width:2em;padding:.5em;margin:4.8em 1.5em 1em 1.5em;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease;z-index:2;border-radius:2em;cursor:pointer}#edit-container #edit svg:hover{background:var(--sec-color)}#edit-container #edit button:nth-of-type(2){margin-left:auto!important}#edit-container #edit div:first-of-type{word-break:break-all;opacity:.6;margin:1em 0;padding-right:2em}#edit-container #edit h3,#edit-container #edit h4,#edit-container #edit h5{display:flexbox;width:100%}#add-container #add button:first-of-type{margin-left:auto!important}#monitor-list{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;padding-bottom:5em}#monitor-list monitor{height:auto;border-radius:.25em;border:1px solid var(--sec-color);margin:.5em 0;-ms-flex-item-align:start;align-self:flex-start;width:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#monitor-list monitor div{padding:1em;overflow-wrap:break-word;word-wrap:break-word}#monitor-list monitor div:nth-of-type(1){padding:1em 4em 1em .8em;font-size:1.2em;font-weight:700}#monitor-list monitor div:nth-of-type(2){font-size:.8em;padding-top:0;opacity:.8}#monitor-list monitor div:nth-of-type(3){position:absolute;top:0;height:100%;width:100%;z-index:1}#monitor-list monitor svg{top:0;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:.6;fill:var(--bw);position:absolute;right:0;height:2em;width:2em;padding:.5em;margin:.5em;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease;z-index:2;border-radius:2em}#monitor-list monitor svg:hover{background:var(--sec-color)}#monitor-list monitor badge{position:absolute;pointer-events:none;color:#fff;background:var(--accent-color);border-radius:2em;padding:.5em;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease;bottom:0;right:0;margin:.5em;line-height:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#monitor-list monitor badge::after{content:"";display:block;padding-bottom:100%}#settings-page section{width:100%;border-bottom:1px solid var(--sec-color);display:-ms-grid;display:grid;padding-bottom:1em}#settings-page section:last-of-type{border:none}#settings-page h3,#settings-page h4{display:flexbox;width:100%;-ms-flex-item-align:center;align-self:center}#settings-page h5{margin:0;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;font-weight:400;opacity:.9}#settings-page div{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;padding:1em 0;-ms-flex-line-pack:center;align-content:center}#settings-page .row{-webkit-box-flex:1;-ms-flex:1;flex:1}#settings-page .row span{font-size:.8em}#settings-page .border-card{color:inherit;text-decoration:none;display:-webkit-box;display:-ms-flexbox;display:flex;padding:.5em 0;width:auto}#settings-page .border-card svg{fill:var(--accent-color);display:flexbox;height:2em;-ms-flex-item-align:center;align-self:center;margin:.5em}.slide-up{opacity:1;-webkit-transform:none!important;transform:none!important;pointer-events:all}.switch{display:flexbox;width:2em;-ms-flex-line-pack:center;align-content:center;position:relative;height:1.5em;z-index:1;margin-right:1em;-ms-flex-item-align:center;align-self:center;-webkit-tap-highlight-color:transparent}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;width:3em;background-color:var(--sec-color);-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;content:"";height:1.6em;width:1.6em;background-color:white;-webkit-transform:translateY(-1px);transform:translateY(-1px);-webkit-transition:.4s;transition:.4s;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.24);box-shadow:0 2px 4px rgba(0,0,0,.24)}input:checked + .slider{background-color:var(--accent-color)}input:checked + .slider:before{-webkit-transform:translate(1.4em,-1px);transform:translate(1.4em,-1px)}.slider.round{border-radius:2em}.slider.round:before{border-radius:50%}.page{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;overflow-y:auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;top:0;bottom:0;left:0;right:0;width:100%;height:100%;padding:0 1em}#transaction-complete{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;-ms-flex-line-pack:center;align-content:center}#transaction-complete h3{text-align:center;width:100%}#transaction-complete svg{-ms-grid-column-align:center;justify-self:center;fill:green;width:20vw}#transaction-complete button{position:absolute;bottom:0}#enterPrivKey{width:100%;position:absolute;overflow-y:auto;display:-ms-grid;display:grid;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:1em;top:49px}#enterPrivKey .input{width:100%!important;margin:1em 0!important}#enterPrivKey h4{margin:.5em 0}#noInternet{pointer-events:none;opacity:0;position:fixed;top:0;left:0;right:0;padding:1em;z-index:11;background:khaki}.spin{-webkit-animation:spin 1s infinite ease;animation:spin 1s infinite ease}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.highlight{-webkit-animation:highlightElement 0.6s ease forwards;animation:highlightElement 0.6s ease forwards}@-webkit-keyframes highlightElement{0%{opacity:0;background:var(--accent-color)}100%{opacity:1;background:transparent}}@keyframes highlightElement{0%{opacity:0;background:var(--accent-color)}100%{opacity:1;background:transparent}}.fade{-webkit-animation:fade 0.2s ease forwards;animation:fade 0.2s ease forwards}@-webkit-keyframes fade{0%{opacity:0}100%{opacity:1}}@keyframes fade{0%{opacity:0}100%{opacity:1}}@media screen and (min-width:768px){#enterPrivKey{border:1px solid var(--sec-color);width:400px;padding:2em;left:50%;margin:2em 0;-webkit-transform:translateX(-50%);transform:translateX(-50%)}#enterPrivKey .title-bar{position:relative;border:none}#enterPrivKey button{margin:.5em 0 .5em auto!important}#transaction-complete svg{width:8em}#transaction-complete button{position:relative;bottom:auto}.innerPage{position:absolute;overflow-y:auto;padding:0 1em;top:0;bottom:0;width:100%}#dispMsg trans-container transaction-card div:nth-of-type(2){font-size:1.1em!important}#settings-page h4{text-align:left}#settings-page div{padding:.5em 0;-ms-flex-line-pack:center;align-content:center}#settings-page #deleteDB button{margin-left:0!important;margin-right:auto!important;width:auto}#monitor-list{padding-bottom:6em}#monitor-list monitor{-ms-flex-item-align:auto;align-self:auto;width:16em;display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}#monitor-list monitor div:first-of-type{padding:1.5em 2em 1.5em .8em;-webkit-box-flex:1;-ms-flex:1;flex:1}#monitor-list monitor div:nth-of-type(2){padding:1em 4em 1em 1em}#monitor-list monitor svg{top:auto;bottom:0;opacity:0}#monitor-list monitor svg:hover{opacity:1!important}#monitor-list monitor badge{top:0;bottom:auto}#monitor-list monitor:hover svg{opacity:.6}#add-container,#edit-container{display:-ms-grid;display:grid;place-content:center}#add,#edit{-webkit-box-shadow:0 1em 2em rgba(0,0,0,.16);box-shadow:0 1em 2em rgba(0,0,0,.16);border-radius:.25em;position:relative;width:400px!important}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--sec-color);opacity:.4;border-radius:1em}::-webkit-scrollbar-thumb:hover{background:#555}::-webkit-scrollbar-corner{background:transparent}.input:hover label,.text-area:hover label{opacity:.8}card{margin:1em!important}body{background-color:var(--back-color)!important;display:-ms-grid;display:grid;place-items:center!important}button,.input,.text-area{margin:1em!important}#main-card{margin:0!important;position:relative;width:80vw!important;height:90vh!important;border-radius:.25em;overflow:hidden;-webkit-box-shadow:0 1em 2em rgba(0,0,0,.16);box-shadow:0 1em 2em rgba(0,0,0,.16);background:var(--body-color);-webkit-transition:width 0.2s ease,height 0.2s ease;transition:width 0.2s ease,height 0.2s ease}#main-card #bottom-nav{display:-ms-grid;display:grid;border-top:none;opacity:1!important;pointer-events:all!important;position:absolute!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;top:0;width:64px;text-align:left!important;height:100%;background:var(--sidenav-color);-webkit-transition:width 0.2s ease;transition:width 0.2s ease}#main-card #bottom-nav #indicator{position:absolute;display:inline-block;left:0;width:4px;height:2em;background:var(--accent-color);border-radius:0 4px 4px 0;-webkit-transition:-webkit-transform 0.2s ease;transition:-webkit-transform 0.2s ease;transition:transform 0.2s ease;transition:transform 0.2s ease,-webkit-transform 0.2s ease}#main-card #bottom-nav #menu{position:absolute;top:0;display:inline-block!important;opacity:.8}#main-card #bottom-nav #settingsBtn{position:absolute;bottom:0}#main-card #bottom-nav .icons{padding:1.2em;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease}#main-card #bottom-nav .icons h6{display:none}#main-card #bottom-nav .icons span{opacity:0;display:inline-block;-webkit-transition:opacity 0.2s ease;transition:opacity 0.2s ease;margin-left:1em;line-height:1.2em}#main-card #bottom-nav .icons svg{height:1.2em;display:flexbox;-ms-flex-item-align:center!important;align-self:center!important;margin:0}#main-card #bottom-nav .icons:hover{opacity:1}#main-card .right{top:64px;left:64px;right:0;bottom:0}#header{opacity:1!important;pointer-events:all!important;z-index:2;width:calc(100% - 64px);left:64px!important;height:64px!important}#overlay{display:-ms-grid;display:grid;place-content:center}#overlay #popup{-webkit-box-shadow:0 1em 2em rgba(0,0,0,.16);box-shadow:0 1em 2em rgba(0,0,0,.16);border-radius:.25em;width:400px!important;position:relative}.input,button{width:auto!important}#sendData #sdleft{width:40%;padding:0 .5em}#sendData #sdright{opacity:.6;width:60%;display:flexbox;-ms-flex-item-align:start;align-self:flex-start}#sendData #sdright .input,#sendData #sdright button,#sendData #sdright .text-area{width:100%!important;margin:0.5em!important}}@media screen and (min-width:1280px){#main-card{width:60%!important;height:80vh!important}}@media screen and (min-width:1600px){#main-card{width:50%!important}}@media all and (device-width:768px) and (device-height:1024px) and (orientation:portrait){#main-card{width:80%!important;height:60vh!important}monitor svg{opacity:1!important}}@media all and (device-width:1024px) and (device-height:768px) and (orientation:landscape){#main-card{width:80%!important;height:70vh!important}monitor svg{opacity:1!important}}@media screen and (max-width:380px){button{font-size:.8em}}@media screen and (max-width:360px){body{font-size:12px!important}#bottom-nav{height:48px}trans-container{top:48px!important}#header{height:4em}.right{bottom:48px!important}}
</style>
</head>
<body onload="onLoadStartUp()">
<script>
const floGlobals={blockchain:"FLO",apiURL:{FLO:'https://explorer.mediciland.com',FLO_TEST:'https://testnet-flosight.duckdns.org'},fee:0.0005}
</script>
<div id="main-card"><div id="noInternet"> There seems to be a problem connecting to the internet.</div><div id="overlay2"></div> <header id="header"> <svg viewBox="0 0 96 108" style="enable-background:new 0 0 90.5 106.3;" xml:space="preserve"> <path d="M90.2,102.5c-2.4-8.2-9.9-14.5-27.4-23.1c-7.1-3.5-11.8-6.2-14-8.3c-1.7-1.6-3.5-4-4.2-5.5c-0.7-1.7-0.7-5.5,0-7.5 c1.3-3.6,2.6-5.2,12.9-15.1c6.2-5.9,9.3-10.3,11.1-15.5c0.7-2.1,0.8-7.6,0.2-9.4C66.5,12,61.7,6.7,53.7,1.6c-3-1.9-4.3-2.1-4.3-0.8 c0,0.3-0.5,1.4-1,2.4l-1,1.8l-2.8-1.9c-1.5-1.1-3.4-2.2-4.1-2.6c-1.3-0.7-2.4-0.6-2.4,0.2c0,0.3-1.4,3.4-2,4.4 c0,0.1-0.4-0.1-0.9-0.4c-6.1-4.4-8.7-5.5-8.7-3.9c0,0.7-1.8,4.2-4,7.9C16,19.5,9.4,24.9,2.6,24.9c-3,0-2.9-0.1-2,3.4 c0.7,2.8,1.1,3.1,3.6,2.3c2.3-0.7,3.9-1.5,5.8-2.9c0.8-0.6,1.5-0.9,1.6-0.9c0.1,0.1,0.5,1,0.7,2.1s0.7,2,0.9,2.1 c0.8,0.3,5.1-1.3,7.5-2.9l2.3-1.5l0.5,1.8c0.6,2.4,1,2.7,3.3,2.1c3.9-1,7.7-3.7,11.5-8.2l2-2.4l-0.2,2.1c-0.6,5.4-4.3,11.4-11.3,18 c-1.8,1.7-4.7,4.5-6.5,6.2c-10.7,10.2-10,18.6,2,26.5c2.7,1.8,10.3,5.8,15.3,8c0.9,0.4,3.3,1.7,5.3,2.9c11,6.5,16.4,13.1,16.4,19.7 c0,1.3,0.1,2.4,0.2,2.6l0,0c0.3,0.3,0.1,0.3,3-0.5c1.4-0.4,2.6-0.9,2.8-1.1c0.4-0.6-0.6-3.7-1.8-6.1c-1.3-2.5-5.6-7-8.9-9.4 c-3.8-2.8-9.3-5.9-17-9.7c-8.5-4.2-11.8-6.2-14.7-9.1c-2.6-2.6-3.9-5.3-3.9-8.2c0-4.6,2.3-8.6,8.3-14.1c9.4-8.7,13-13,15.5-18.8 c1.3-3,1.4-3.4,1.4-6.7c0-3.1-0.1-3.8-1.1-6l-1.1-2.4l1-1.6c0.5-0.9,1.2-2.1,1.5-2.6l0.5-1l1.5,2.1c1.8,2.6,3.2,6.8,3.2,9.3 c0,1.7-0.6,4.7-1.4,6.4c-0.2,0.4-0.4,1-0.5,1.3c-0.1,0.3-1.1,2-2.2,3.7c-2,3-5.2,6.4-13.4,14.2c-5.7,5.4-7.6,8.6-7.8,13.1 c-0.2,3.7,0.7,5.9,3.7,9.2c3.2,3.4,6.9,5.8,17.4,11c12.1,6,17.3,9.6,21.3,14.5c2.5,3.2,3.7,5.8,3.9,9.3c0.1,1.6,0.3,3,0.5,3 c0.1,0.1,0.8,0,1.4-0.2s1.9-0.5,2.7-0.7l1.5-0.4l-0.2-1.5c-0.7-5.1-5.4-10.8-13.1-16c-4.4-2.9-5.8-3.7-17.3-9.4 c-5.7-2.8-9.2-5.1-11.8-7.6c-4.3-4.2-5.1-8.8-2.7-13.9c1.4-2.8,2.7-4.4,12.5-13.8c8-7.7,11.4-13.7,11.4-20.1c0-5.1-2.3-9.9-6.9-14.3 c-1.1-1-2-2-2.1-2.2c-0.2-0.4,1.5-3.9,1.9-3.9c1.2,0,7.8,6.3,9.7,9.2c2,3.3,2.5,5,2.5,8.9c0,3.9-0.6,5.9-2.9,9.8 c-2.4,4.1-4.2,6-14.2,15.5c-3.4,3.2-5.7,6.1-6.9,8.7c-0.9,2-1.1,2.7-1.1,5.1c0,2.3,0.2,3.2,1,4.9c1.9,4,7.4,8.5,15.4,12.4 c12.5,6.1,15.1,7.6,19.4,10.7c7.2,5.3,10.6,10.5,10.6,16c0,1.3,0.1,2.4,0.3,2.5c0.4,0.3,4.8-0.8,5.5-1.3 C90.7,104.4,90.7,104.3,90.2,102.5z M20.3,23.3L20.3,23.3c-2,1-3.3,1.4-4.8,1.5L13.3,25l2.3-2.8c3.7-4.5,6.4-8.9,10-16 c0.9-1.8,1.8-3.5,2-3.6c0.4-0.4,2.6,1.1,5.1,3.4l2.1,1.9l-1.9,2.8C28.2,17.5,24.5,21.2,20.3,23.3z M39.3,17.4 c-1.2,1.7-6.5,5.7-8.6,6.5v0c-1.1,0.4-2.8,0.8-3.9,0.9L24.9,25l2.1-2.6c2.5-3.1,5.1-7,7-10.4c0.7-1.4,1.4-2.5,1.5-2.6 c0.3-0.4,1.7,1.4,3,4.1l1.5,3L39.3,17.4z M44.6,10c-0.7,1.2-1.4,2.1-1.5,2.1c-0.1,0-1.5-1.4-3-3l-2.8-3l0.6-1.5 c1.1-2.6,1.3-2.7,3.4-1c1.9,1.5,4.5,3.8,4.5,4.1C45.8,7.8,45.3,8.9,44.6,10z"/> </svg> <span>RanchiMall</span> <svg viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve"> <g> <path d="M18,4v12c0,1.1-0.9,2-2,2H1c-0.6,0-1-0.4-1-1V3c0-0.6,0.4-1,1-1h15C17.1,2,18,2.9,18,4z M16,10 c0-1.4-1.1-2.5-2.5-2.5S11,8.6,11,10s1.1,2.5,2.5,2.5S16,11.4,16,10z"/> <path d="M16,2H1l13-2C15.1,0,16,0.9,16,2z" style="fill: #9e0915"/> <circle cx="13.5" cy="10" r="1.5"/> </g> </svg> <span>FLO web wallet</span> </header><div id="bottom-nav"><div id="indicator"></div><div class="icons" id="menu" title='Expand side navigation bar'> <svg role="img" viewBox="0 0 20 16"> <g> <path d="M19,2H1C0.4,2,0,1.6,0,1v0c0-0.6,0.4-1,1-1l18,0c0.6,0,1,0.4,1,1v0C20,1.6,19.6,2,19,2z"/> <path d="M12,10H1c-0.6,0-1-0.4-1-1v0c0-0.6,0.4-1,1-1h11c0.6,0,1,0.4,1,1v0C13,9.6,12.6,10,12,10z"/> </g> </svg> <span></span></div><div class="icons tabs activeButton" title='Monitor FLO data' id="getDataBtn" onclick="showPage(this.id, 'getData')"> <svg role="img" viewBox="0 0 20 16"> <path d="M18,0H2C0.9,0,0,0.9,0,2v14c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M16.4,6.9l-4.2,4.2 c-0.4,0.4-1,0.4-1.4,0L8.6,9l-3.5,3.5c-0.4,0.4-1,0.4-1.4,0c-0.4-0.4-0.4-1,0-1.4l4.2-4.2c0.4-0.4,1-0.4,1.4,0L11.4,9l3.5-3.5 c0.4-0.4,1-0.4,1.4,0C16.8,5.9,16.8,6.5,16.4,6.9z"/> </svg><h6>Monitor</h6> <span>Monitor FLO data</span></div><div class="icons tabs" title='Send FLO data' id="sendDataBtn" onclick="showPage(this.id, 'sendData')"> <svg role="img" viewBox="0 0 20 16"> <g> <path d="M0.3,9.1l6.2,2.2c0.2,0.1,0.4,0,0.5-0.1L19.1,0L0.3,8.2C-0.1,8.4-0.1,9,0.3,9.1z"/> <path d="M10,18.8l-2.2-6.2c-0.1-0.2,0-0.4,0.1-0.5L19.1,0l-8.2,18.8C10.7,19.2,10.1,19.2,10,18.8z"/> </g> </svg><h6>Send</h6> <span>Send FLO data</span></div><div class="icons tabs" title='Generate or recover FLO address' id="addrGenBtn" onclick="showPage(this.id, 'addrGen')"> <svg role="img" viewBox="0 0 20 16"> <g> <circle cx="9" cy="9" r="3"/> <path d="M12,14v1c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V3c0-0.6,0.4-1,1-1h8c0.6,0,1,0.4,1,1v1c0,0.6,0.4,1,1,1h0c0.6,0,1-0.4,1-1V2 c0-1.1-0.9-2-2-2H2C0.9,0,0,0.9,0,2v14c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2v-2c0-0.6-0.4-1-1-1h0C12.4,13,12,13.4,12,14z"/> <circle cx="17" cy="9" r="3"/> </g> </svg><h6>Generate</h6> <span>Generate address</span></div><div class="icons tabs" title="Settings" id="settingsBtn" onclick="showPage(this.id, 'settings-page')"> <svg role="img" x='0' y='0' viewBox="0 0 20 16"><title>Settings</title> <g> <circle cx="9.6" cy="8.7" r="4"/> <path d="M18.8,7.3l-3.4-5.9C14.9,0.5,14,0,13,0H6.2c-1,0-1.9,0.5-2.4,1.4L0.4,7.3c-0.5,0.9-0.5,1.9,0,2.8l3.4,5.9 c0.5,0.9,1.4,1.4,2.4,1.4H13c1,0,1.9-0.5,2.4-1.4l3.4-5.9C19.3,9.2,19.3,8.1,18.8,7.3z M9.6,14.7c-3.3,0-6-2.7-6-6s2.7-6,6-6 s6,2.7,6,6S12.9,14.7,9.6,14.7z"/> </g> </svg><h6>Settings</h6> <span>Settings</span></div></div><div class="right"><h5 id="textCopied"> Copied</h5><div id="getData" class="page"><div id="add-container" class="hide"><div id="add"><h4>Add new address to monitoring list</h4><div class="input"> <input aria-label="FLO address" type="text" oninput="checkAddress(this)" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="floAddr" autocomplete="new-password"/> <label>FLO Address</label></div><div class="input"> <input aria-label="Label" type="text" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="addrLabel" autocomplete="new-password"/> <label>Label</label></div> <button onclick="closeAdd()">Cancel</button> <button id="addAddressToMonitor" onclick="addAddressToMonitoringList()" disabled>Add</button></div></div><div id="edit-container" class="hide"><div id="edit"><h4>Edit display card</h4><div> Flo address</div><div class="input"> <input aria-label="Label" autocomplete="new-password" type="text" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="newAddrLabel"/> <label>Label</label></div> <svg onclick="copyToClipboard(this.parentNode, '1')" viewBox="0 0 13 16" style="enable-background:new 0 0 13 16;" xml:space="preserve"><title>Copy FLO address</title> <path d="M12,0H4C3.4,0,3,0.4,3,1v3H1C0.4,4,0,4.4,0,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1v-3h2c0.6,0,1-0.4,1-1V1 C13,0.4,12.6,0,12,0z M8,13c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V13z M11,9c0,0.6-0.4,1-1,1V5 c0-0.6-0.4-1-1-1H5V3c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V9z"/> </svg> <button onclick="removedata()" id="removeAddr">Remove</button> <button onclick="closeEdit()">Cancel</button> <button id="editdata" onclick="editdata()">Save</button></div></div><div id="monitor-list"></div> <svg id="addNewAddress" viewBox="0 0 17 17"><title>Add new address to monitor</title> <path id="Union_1" data-name="Union 1" d="M7.5-3701v-6.5H1a1,1,0,0,1-1-1,1,1,0,0,1,1-1H7.5v-6.5a1,1,0,0,1,1-1,1,1,0,0,1,1,1v6.5H16a1,1,0,0,1,1,1,1,1,0,0,1-1,1H9.5v6.5a1,1,0,0,1-1,1A1,1,0,0,1,7.5-3701Z" transform="translate(0 3717)"/> </svg></div><div id="dispMsg" class="hide innerPage"><div class='title-bar'> <svg onclick="showPage('getDataBtn', 'getData')" viewBox="0 0 16 16"><title>Go back to monitoring page</title> <path d="M14.9,6.5h-11L8.4,2c0.4-0.4,0.4-1.2,0-1.6C8-0.1,7.2-0.1,6.8,0.3L0.3,6.8C0.2,6.9,0.1,7,0.1,7.2C0,7.5,0,7.8,0.1,8 c0.1,0.1,0.1,0.3,0.2,0.4l6.5,6.5c0.4,0.4,1.2,0.4,1.6,0c0.4-0.4,0.4-1.2,0-1.6L3.9,8.8h11c0.6,0,1.1-0.5,1.1-1.1 C16,7,15.5,6.5,14.9,6.5z"/> </svg> <span><h3 id="addressLabel"></h3><h5 id="fullAddress"></h5></span> <svg onclick="refreshdata()" viewBox="0 0 16 16" style="enable-background:new 0 0 19.9 21.5;" xml:space="preserve"><title>Refresh transactions</title> <path d="M10,6h4.7c0.4,0,0.7-0.3,0.7-0.7V0.7C15.3,0.3,15,0,14.6,0c-0.1,0-0.9,0.7-1.9,1.6c-2.2-1.7-5.3-2.2-8.5-0.8 C2.8,1.5,1.6,2.7,0.9,4.3C-1.9,10.2,2.4,16,8,16c3.2,0,5.9-1.9,7.2-4.6c0.3-0.7-0.2-1.4-0.9-1.4c-0.4,0-0.7,0.2-0.9,0.5 c-1.3,2.8-4.7,4.4-8.1,2.9c-1.2-0.5-2.2-1.5-2.7-2.7C0.6,6.3,3.8,2,8,2c1.2,0,2.4,0.4,3.3,1c-1.1,1.1-2,2.1-2,2.3 C9.3,5.7,9.6,6,10,6z"/> </svg></div> <trans-container id="transactions-container"></trans-container></div><div id="sendData" class="page hide"><div id="sdleft"><div id="dispBal"> <svg id="loadBalance" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve"> <g> <path id='p1' d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z"/> <path id='p2' d="M6.5,13.8c-2.2-0.5-3.9-2.3-4.4-4.5c-0.7-3.6,1.7-6.8,5-7.2C7.6,2,8,1.6,8,1.1v0c0-0.6-0.5-1.1-1.1-1 C2.5,0.7-0.8,4.9,0.2,9.6c0.6,3.1,2.9,5.5,6,6.2c4.8,1.1,9.1-2.2,9.8-6.7C16,8.5,15.5,8,14.9,8h0c-0.5,0-0.9,0.4-1,0.9 C13.5,12.2,10.2,14.7,6.5,13.8z"/> </g> </svg><h5>Available balance</h5> <span id="dispBalInt">0</span> <span id="dispBalFloat"></span><h5>To send FLO data, make sure you have enough balance.</h5></div><div class="input"> <input aria-label="FLO address" autocomplete="new-password" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" type="text" id="getBal_addr" oninput="checkBalAddress(this)"/> <label>FLO address</label> <button id="getBal_btn" onclick="getBal()" disabled>Check balance</button></div></div><div id="sdright"><div class="input"> <input aria-label="Receiver's address" oninput="validateInfo(this)" autocomplete="new-password" type="text" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="receiver"/> <label>Receiver's address</label></div><div class="input"> <input aria-label="Amount" autocomplete="new-password" type="number" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="amount"/> <label>Amount</label></div><div class="text-area"><textarea aria-label="FLO data" data-gramm_editor="false" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" rows="8" id="flotextdata"></textarea><label>FLO data</label></div> <button class="primaryButton" id="sendBtn" onclick="showPrivKeyPage()" disabled>Send</button></div></div><div class="innerPage hide" id="privKeyPage"><div class='title-bar'> <svg onclick="showPage('sendDataBtn', 'sendData')" viewBox="0 0 16 16"><title>Go back to monitoring page</title> <path d="M14.9,6.5h-11L8.4,2c0.4-0.4,0.4-1.2,0-1.6C8-0.1,7.2-0.1,6.8,0.3L0.3,6.8C0.2,6.9,0.1,7,0.1,7.2C0,7.5,0,7.8,0.1,8 c0.1,0.1,0.1,0.3,0.2,0.4l6.5,6.5c0.4,0.4,1.2,0.4,1.6,0c0.4-0.4,0.4-1.2,0-1.6L3.9,8.8h11c0.6,0,1.1-0.5,1.1-1.1 C16,7,15.5,6.5,14.9,6.5z"/> </svg> <span><h3>Send</h3></span></div><div id="enterPrivKey"><div class="input"> <input aria-label="private key" autocomplete="new-password" type="number" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="privKey"/> <label>Private key</label></div> <button onclick="sendMessage()">continue</button></div></div><div id="transaction-complete" class="innerPage hide"> <svg viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve"> <g> <path d="M14.3,2.4L7.9,8.7L5.8,6.6c-0.4-0.4-1-0.4-1.4,0S4,7.6,4.4,8l2.8,2.8c0.4,0.4,1,0.4,1.4,0l7.1-7.1 c0.4-0.4,0.4-1,0-1.4C15.3,2,14.7,2,14.3,2.4z"/> <path d="M13.9,7C14,7.3,14,7.7,14,8c0,3.3-2.7,6-6,6s-6-2.7-6-6s2.7-6,6-6c1.5,0,2.8,0.5,3.9,1.4L13.3,2 C11.9,0.8,10,0,8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8c0-0.9-0.2-1.8-0.4-2.6L13.9,7z"/> </g> </svg><h3>Transaction successful</h3><h4 id="transactionId"></h4> <button class="primaryButton" onclick="showPage('sendDataBtn', 'sendData')">Done</button></div><div id="addrGen" class="page hide"> <button id="GenNewAddrBtn" class="primaryButton">Generate new address</button> <button id="showRecoveryModal">Recover FLO address</button><br/><br/><div id="addrDisp"></div></div><div id="settings-page" class="page hide"> <section><h4>Dark mode</h4><div> <span class="row"> Automatic<br> <span>Dark mode active : 6pm - 6am</span> </span> <label class="switch"> <input aria-label="Toggle automatic dark theme" autocomplete="new-password" type="checkbox" id="auto-mode" type="checkbox" onclick="autoMode()"/> <span class="slider round"></span> </label></div><div> <span class="row">Manual<br> <span>Dark mode</span> </span> <label class="switch"> <input aria-label="Toggle manual dark theme" autocomplete="new-password" type="checkbox" id="manual-mode" type="checkbox" onclick="theme()"/> <span class="slider round"></span> </label></div> </section> <section id="deleteDB"><h4>Clear all local data</h4><h5>This will delete all local Web Wallet data like added addresses and locally stored transactions.After clearing local data you may experience slow loading of newly added address, please proceed cautiously!</h5> <button class="primaryButton" onclick="deleteDB()">Clear data</button> </section> <section><h4>About</h4><h5>Version 2.6</h5> <a class="border-card" href="https://flo.cash/" target="_blank" rel="noopener noreferrer"><h5>Powered by</h5> <svg viewBox="0 0 108 48" style="enable-background:new 0 0 107.65 47.07;" xml:space="preserve"> <g> <path class="flo-logo" d="M34.2,32.4c0,0,3.75-0.18,7.41-3.86c2.96-2.98,3.65-6.66,3.99-8.52c-11.04-0.63-12.36,0.99-13.71,1.68 c-1.19,0.61-5.33,4.55-5.33,4.55s3.06-3.13,3.2-9.94c0.09-4.54-1.02-7.39-2.72-10.64C25.29,2.33,22.79,0,22.79,0l0.01,4.97 c0,0,4.35,2.84,4.35,11.84c0,6.52-4.35,11.02-4.35,11.02s-4.35-4.5-4.35-11.02c0-9.01,4.35-11.84,4.35-11.84L22.79,0 c0,0-2.48,2.33-4.23,5.67c-1.7,3.25-2.81,6.1-2.72,10.64c0.13,6.81,3.2,9.94,3.2,9.94s-4.14-3.95-5.33-4.55 c-1.35-0.69-2.67-2.31-13.71-1.68c0.34,1.86,1.03,5.54,3.99,8.52c3.66,3.68,7.41,3.86,7.41,3.86s-5.05-2.03-7.15-9.45 c0,0,5.76-0.7,9.63,1.87c2.52,1.67,4.86,4.26,6.79,6.01c0,0-2.58-0.04-6.81,1.88c-2.54,1.15-3.92,2.84-4.44,4.38 c-0.36,1.06-0.2,2.27-0.2,2.27s3.31,0.31,5.94,0c1.99-0.23,3.42-2.16,3.42-2.16s-2,0.78-3.95,0.78c-2.06,0-2.67-0.66-2.67-0.66 c0.98-3.64,8.68-5.19,8.68-5.19s-1.34,2.6-1.42,6.5c-0.1,4.79,3.57,8.52,3.57,8.45c0,0.07,3.67-3.66,3.57-8.45 c-0.08-3.9-1.42-6.5-1.42-6.5s7.71,1.55,8.68,5.19c0,0-0.61,0.66-2.67,0.66c-1.95,0-3.95-0.78-3.95-0.78s1.43,1.93,3.42,2.16 c2.63,0.31,5.94,0,5.94,0s0.16-1.21-0.2-2.27c-0.52-1.54-1.9-3.23-4.44-4.38c-4.23-1.92-6.81-1.88-6.81-1.88 c1.93-1.76,4.27-4.34,6.79-6.01c3.87-2.57,9.63-1.87,9.63-1.87C39.26,30.38,34.2,32.4,34.2,32.4z M22.8,43.06 c-0.95-1.37-1.47-2.13-1.47-4.26c0-2.4,1.12-4.61,1.47-5.14c0.35,0.52,1.47,2.74,1.47,5.14C24.27,40.92,23.75,41.69,22.8,43.06z"/> <g> <polygon class="flo-logo" points="73.53,36.36 73.53,20.01 70.53,20.01 70.53,36.36 70.53,39.35 84,39.35 84,36.36 "/> <g> <rect x="52.75" y="20.01" class="flo-logo" width="13.47" height="2.93"/> <polygon class="flo-logo" points="63.74,28.36 55.74,28.36 52.75,28.36 52.75,31.35 52.75,39.35 55.74,39.35 55.74,31.35 63.74,31.35 "/> </g> <path class="flo-logo" d="M97.99,20.01c-5.34,0-9.67,4.33-9.67,9.67s4.33,9.67,9.67,9.67s9.67-4.33,9.67-9.67S103.33,20.01,97.99,20.01 z M97.99,35.85c-3.41,0-6.17-2.76-6.17-6.17c0-3.41,2.76-6.17,6.17-6.17c3.41,0,6.17,2.76,6.17,6.17 C104.15,33.09,101.39,35.85,97.99,35.85z"/> </g> </g> </svg> </a> </section></div></div></div><div id="overlay"><div id="popup"><h4>Recover FLO address</h4><h5>Please enter your private key.</h5><div class="input"> <input aria-label="Private key" autocomplete="new-password" type="text" onfocus="animateInput(this.parentNode)" onblur="revertBack(this.parentNode)" id="pop" oninput="checkPrivateKey(this)"/> <label>Private key</label></div> <button onclick="fadeout()">Cancel</button> <button id="ok" onclick="RecoverAddr()" disabled>Ok</button></div></div>
<script>
let bottomNav=document.getElementById('bottom-nav'),floAddr=document.getElementById('floAddr'),addrLabel=document.getElementById('addrLabel'),newAddrLabel=document.getElementById('newAddrLabel'),recentPage='getDataBtn',mode,activeAddress,lastClickedAddress;window.addEventListener('offline',()=>{document.getElementById('noInternet').classList.add('show')})
window.addEventListener('online',()=>{document.getElementById('noInternet').classList.remove('show')})
const html=document.querySelector('html');if(localStorage.dark==='yes')
{nightlight();document.getElementById('manual-mode').checked=!0;clearInterval(mode)}
else if(localStorage.dark==='auto'){document.getElementById('auto-mode').checked=!0;document.getElementById('manual-mode').checked=!1;autoMode();mode=setInterval(()=>{let d=new Date(),t=d.getHours();console.log(t);if(t>6&&t<18){daylight()}
else{nightlight()}},60000)}
else{daylight();document.getElementById('manual-mode').checked=!1;clearInterval(mode)}
function daylight(){html.setAttribute("style",`--bw: #000;--back-color: #EBEBEB;--body-color: #fff;--sidenav-color:#f0f0f0;--sec-color: #ccc;--opac-accent-color: rgb(210, 13, 29, 0.1);`)}
function nightlight(){html.setAttribute("style",`--bw: #fff;--back-color: #222;--body-color: #2a2a2a;--sidenav-color:#313131;--sec-color: #555;--opac-accent-color: rgb(210, 13, 29, 0.2);`)}
function autoMode()
{let x=document.getElementById('auto-mode');if(x.checked){localStorage.setItem('dark','auto');document.getElementById('manual-mode').checked=!1;let d=new Date();let t=d.getHours();if(t>6&&t<18){daylight()}
else{nightlight()}}
else{localStorage.setItem('dark','no');daylight();clearInterval(mode)}}
function theme(){let x=document.getElementById('manual-mode');if(!x.checked){daylight();localStorage.setItem('dark','no')}
else{nightlight();localStorage.setItem('dark','yes');document.getElementById('auto-mode').checked=!1}}
document.getElementById('showRecoveryModal').onclick=function(){document.getElementById('overlay').classList.add('show');document.getElementById('popup').classList.add('slide-up');if(window.innerWidth>768)
document.getElementById('pop').focus();let y=document.addEventListener("click",function(event){if(event.target.closest('#popup')||event.target.closest('#showRecoveryModal'))return;fadeout();document.removeEventListener('click',y)})}
document.getElementById('pop').addEventListener('keypress',function(event){if(event.keyCode==13)
document.getElementById('ok').click()});document.getElementById('getBal_addr').addEventListener('keypress',function(event){if(event.keyCode==13)
document.getElementById('getBal_btn').click()});addrLabel.addEventListener('keypress',function(event){if(event.keyCode==13)
document.getElementById('addAddressToMonitor').click()});floAddr.addEventListener('keypress',function(event){if(event.keyCode==13)
document.getElementById('addAddressToMonitor').click()});newAddrLabel.addEventListener('keypress',(event)=>{if(event.keyCode==13)
editdata()});function closeSidePanel(){if(window.innerWidth>768)
{bottomNav.classList.remove('reveal');document.getElementById('overlay2').classList.remove('show')}}
function fadeout(){document.getElementById('overlay').classList.remove('show');document.getElementById('popup').classList.remove('slide-up');document.getElementById('pop').value=''}
document.getElementById('menu').addEventListener('click',function(){if(window.innerWidth>768){bottomNav.classList.toggle('reveal')}
document.getElementById('overlay2').classList.toggle('show');let y=document.addEventListener("click",function(event){if(event.target.closest('#menu')||event.target.closest('#bottom-nav'))return;closeSidePanel();document.removeEventListener('click',y)})});function animateInput(thisInput){thisInput.children[1].classList.add('label-active')}
function revertBack(thisInput){if(thisInput.children[0].value=='')
thisInput.children[1].classList.remove('label-active')}
function clickedAddress(thisCard){let address=thisCard.children[1].textContent,label=thisCard.children[0].textContent;if(lastClickedAddress!==address)
monitorData(address,label);showInnerPage('dispMsg');lastClickedAddress=address;setTimeout(()=>{lastClickedAddress=''},30000)}
function showAdd(){document.getElementById('add-container').classList.add('show');document.getElementById('add').classList.add('slide-up');if(window.innerWidth>768)
floAddr.focus()}
function closeAdd(){document.getElementById('add-container').classList.remove('show');document.getElementById('add').classList.remove('slide-up');floAddr.value='';addrLabel.value='';document.getElementById('addAddressToMonitor').disabled=!0}
document.getElementById('addNewAddress').onclick=function(){showAdd();let y=document.addEventListener("click",function(event){if(event.target.closest('#add')||event.target.closest('#addNewAddress'))return;closeAdd();document.removeEventListener('click',y)})}
function checkAddress(thisInput){let x=document.getElementById('addAddressToMonitor');if(floCrypto.validateAddr(thisInput.value))
x.disabled=!1;else{x.disabled=!0}}
function addAddressToMonitoringList(){let label=addrLabel.value;if(label=='')
label='Unknown'
compactIDB.addData('labels',label,floAddr.value).then((resolve)=>{createAddressCards(floAddr.value,label);floWebWallet.syncTransactions(floAddr.value);closeAdd()}).catch((error)=>{alert(error)})}
document.getElementById(recentPage).click();function showPage(element,page){let allPages=document.querySelectorAll('.page'),allTabs=document.querySelectorAll('.tabs'),allInnerPages=document.querySelectorAll('.innerPage');bottomNav.classList.remove('hide');document.getElementById('header').classList.remove('hide');allPages.forEach(function(pages){pages.classList.add('hide')});allTabs.forEach(function(tab){tab.classList.remove('activeButton')});allInnerPages.forEach(function(Ipage){Ipage.classList.add('hide')});let pageBtn=document.getElementById(element);pageBtn.classList.add('activeButton');if(window.innerWidth>768){let topDistance=pageBtn.offsetTop-16,height=pageBtn.getBoundingClientRect().height;document.getElementById('indicator').setAttribute('style','transform: translateY('+(topDistance+(height/2))+'px')}
let x=document.getElementById(page);x.classList.remove('hide');if(!(recentPage==element)){x.classList.add('fade');x.addEventListener('animationEnd',function(){x.classList.remove('fade')});x.addEventListener('webkitAnimationEnd',function(){x.classList.remove('fade')})}
recentPage=element}
let resizeComplete;window.addEventListener('resize',()=>{clearTimeout(resizeComplete);resizeComplete=setTimeout(()=>{setElements()},200)});function setElements(){let pageBtn=document.getElementById(recentPage),indicator=document.getElementById('indicator'),addNewAddress=document.getElementById('addNewAddress');if(window.innerWidth<768){bottomNav.classList.remove('reveal');document.getElementById('overlay2').classList.remove('show');addNewAddress.setAttribute('style',`bottom: 54px; right: 0`)}
else{let mainCard=document.getElementById('main-card').getBoundingClientRect(),bottom=((window.innerHeight-mainCard.height)/2)+16,right=((window.innerWidth-mainCard.width)/2)+16;addNewAddress.setAttribute('style',`bottom: ${bottom}px; right: ${right}px`);let topDistance=pageBtn.offsetTop-16,height=pageBtn.getBoundingClientRect().height;indicator.setAttribute('style','transform: translateY('+(topDistance+(height/2))+'px')}}
function showInnerPage(page){let allMainPages=document.querySelectorAll('.page'),allInnerPages=document.querySelectorAll('.innerPage');allMainPages.forEach(function(pages){pages.classList.add('hide')});allInnerPages.forEach(function(Ipage){Ipage.classList.add('hide')});bottomNav.classList.add('hide');document.getElementById('header').classList.add('hide');let x=document.getElementById(page);x.classList.remove('hide');x.classList.add('fade');x.addEventListener('animationEnd',function(){x.classList.remove('fade')});x.addEventListener('webkitAnimationEnd',function(){x.classList.remove('fade')})}
function checkBalAddress(thisInput){let x=document.getElementById('getBal_btn');if(floCrypto.validateAddr(thisInput.value))
x.disabled=!1;else{x.disabled=!0}}
function getBal(){let x=document.getElementById("getBal_addr"),loading=document.getElementById('loadBalance'),intPartText=document.getElementById('dispBalInt'),floatPartText=document.getElementById('dispBalFloat');loading.classList.add('show','spin');floBlockchainAPI.getBalance(x.value).then((retrievedBal)=>{let parts=retrievedBal.split("."),floatPart=parts.pop(),intPart=parts.pop();if(intPart===undefined){intPartText.textContent='0'}
else{if(parseFloat(retrievedBal)<0.005){intPartText.textContent=`Insufficient Balance`;floatPartText.textContent=''}
else{intPartText.textContent=intPart;floatPartText.innerHTML=`.${floatPart} FLOs`;document.getElementById('sdright').setAttribute('style','pointer-events: all; opacity: 1')}}
loading.classList.remove('show','spin')}).catch((error)=>{console.log(error);loading.classList.remove('show','spin')})}
document.getElementById('GenNewAddrBtn').addEventListener('click',()=>{let x=floCrypto.generateNewID(),par=document.getElementById('addrDisp'),card=document.createElement('card');card.classList.add('highlight');card.innerHTML=`<div>
<h5>New FLO Address</h5>
<h4>${x.floID}</h4>
<svg onclick="copyToClipboard(this.parentNode, '1')" viewBox="0 0 13 16" style="enable-background:new 0 0 13 16;" xml:space="preserve">
<title>Copy FLO address</title>
<path d="M12,0H4C3.4,0,3,0.4,3,1v3H1C0.4,4,0,4.4,0,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1v-3h2c0.6,0,1-0.4,1-1V1
C13,0.4,12.6,0,12,0z M8,13c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V13z M11,9c0,0.6-0.4,1-1,1V5
c0-0.6-0.4-1-1-1H5V3c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V9z"/>
</svg>
</div>
<div><h5>Private Key</h5>
<h4>${x.privKey}</h4>
<svg onclick="copyToClipboard(this.parentNode, '1')" viewBox="0 0 13 16" style="enable-background:new 0 0 13 16;" xml:space="preserve">
<title>Copy private key</title>
<path d="M12,0H4C3.4,0,3,0.4,3,1v3H1C0.4,4,0,4.4,0,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1v-3h2c0.6,0,1-0.4,1-1V1
C13,0.4,12.6,0,12,0z M8,13c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V13z M11,9c0,0.6-0.4,1-1,1V5
c0-0.6-0.4-1-1-1H5V3c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V9z"/>
</svg>
</div>`;par.insertBefore(card,par.firstChild);card.addEventListener('animationEnd',function(){card.classList.remove('highlight')});card.addEventListener('webkitAnimationEnd',function(){card.classList.remove('highlight')})});function checkPrivateKey(thisInput){if(thisInput.value===''||thisInput.value.length<52)
document.getElementById('ok').disabled=!0;else{document.getElementById('ok').disabled=!1}}
function RecoverAddr(){let wif=document.getElementById('pop');floWebWallet.recoverAddr(wif.value).then((recoverAddr)=>{let par=document.getElementById('addrDisp'),card=document.createElement('card');card.classList.add('highlight');card.innerHTML=`<div>
<h5>Recovered FLO Address</h5>
<h4>${recoverAddr.floID}</h4>
<svg onclick="copyToClipboard(this.parentNode, '1')" viewBox="0 0 13 16" style="enable-background:new 0 0 13 16;" xml:space="preserve">
<title>Copy FLO address</title>
<path d="M12,0H4C3.4,0,3,0.4,3,1v3H1C0.4,4,0,4.4,0,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1v-3h2c0.6,0,1-0.4,1-1V1
C13,0.4,12.6,0,12,0z M8,13c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V13z M11,9c0,0.6-0.4,1-1,1V5
c0-0.6-0.4-1-1-1H5V3c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V9z"/>
</svg>
</div>
<div>
<h5>Private Key</h5>
<h4>${recoverAddr.privKey}</h4>
<svg onclick="copyToClipboard(this.parentNode, '1')" viewBox="0 0 13 16" style="enable-background:new 0 0 13 16;" xml:space="preserve">
<title>Copy private key</title>
<path d="M12,0H4C3.4,0,3,0.4,3,1v3H1C0.4,4,0,4.4,0,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1v-3h2c0.6,0,1-0.4,1-1V1
C13,0.4,12.6,0,12,0z M8,13c0,0.6-0.4,1-1,1H3c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V13z M11,9c0,0.6-0.4,1-1,1V5
c0-0.6-0.4-1-1-1H5V3c0-0.6,0.4-1,1-1h4c0.6,0,1,0.4,1,1V9z"/>
</svg>
</div>`;par.insertBefore(card,par.firstChild);fadeout()}).catch((error)=>{alert('invalid private key');console.log(error)})}
function monitorData(address,label){let dispMsg=document.getElementById("dispMsg"),dbLabels=floWebWallet.getLabels(),tCont=document.getElementById('transactions-container'),frag=document.createDocumentFragment();tCont.innerHTML=`<loading>
<svg viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<g>
<path id='p1' d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6
S11.3,14,8,14z"/>
<path id='p2' d="M6.5,13.8c-2.2-0.5-3.9-2.3-4.4-4.5c-0.7-3.6,1.7-6.8,5-7.2C7.6,2,8,1.6,8,1.1v0c0-0.6-0.5-1.1-1.1-1
C2.5,0.7-0.8,4.9,0.2,9.6c0.6,3.1,2.9,5.5,6,6.2c4.8,1.1,9.1-2.2,9.8-6.7C16,8.5,15.5,8,14.9,8h0c-0.5,0-0.9,0.4-1,0.9
C13.5,12.2,10.2,14.7,6.5,13.8z"/>
</g>
</svg>
</loading>`;document.querySelector('loading').children[0].classList.add('spin');document.getElementById('addressLabel').textContent=label;document.getElementById('fullAddress').textContent=address;floWebWallet.readTransactions(address).then((receivedData)=>{if(receivedData.length===0){tCont.innerHTML=`<div style='display:flex; align-content: center;width: 100%;height:100%'><h3 style='display:flexbox;align-self:center;text-align: center;width:100%'>There are no transactions to show.</h3></div>`}
else{document.querySelector('loading').children[0].classList.remove('spin');tCont.innerHTML='';receivedData.forEach(tx=>{let date=new Date(tx.time*1000).toLocaleDateString(),time=new Date(tx.time*1000).toLocaleTimeString(),tCard=document.createElement('transaction-card');if(tx.sender===address){tCard.innerHTML=`<div>
<svg viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<path d="M14.7,0H3.9C3.2,0,2.6,0.6,2.6,1.3s0.6,1.3,1.3,1.3h7.5l-11,11c-0.5,0.5-0.5,1.4,0,1.9c0.5,0.5,1.4,0.5,1.9,0
l11-11v7.5c0,0.7,0.6,1.3,1.3,1.3s1.3-0.6,1.3-1.3V1.3C16,0.6,15.4,0,14.7,0z"/>
</svg>
${tx.receiver}</div><div> ${tx.floData}</div><div>${time} ${date}</div>`}
else{tCard.innerHTML=`<div>
<svg viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<path d="M16,14.7V3.9c0-0.7-0.6-1.3-1.3-1.3s-1.3,0.6-1.3,1.3v7.5l-11-11c-0.5-0.5-1.4-0.5-1.9,0
c-0.5,0.5-0.5,1.4,0,1.9l11,11H3.9c-0.7,0-1.3,0.6-1.3,1.3S3.2,16,3.9,16h10.7C15.4,16,16,15.4,16,14.7z"/>
</svg>
${tx.sender}</div><div> ${tx.floData}</div><div> ${time} ${date}</div>`}
frag.insertBefore(tCard,frag.firstChild)})
tCont.appendChild(frag)}})}
function refreshdata(){floWebWallet.syncTransactions(document.getElementById('fullAddress').textContent);monitorData(document.getElementById('fullAddress').textContent,document.getElementById('addressLabel').textContent)}
function createAddressCards(address,label){let parentConatainer=document.getElementById('monitor-list');if(parentConatainer.innerHTML===`<h3 style="text-align: center;width: 100%;">Add a FLO address to start monitoring</h3>`)
parentConatainer.innerHTML='';let monitorCard=document.createElement('monitor');monitorCard.id=address;monitorCard.innerHTML=`<div>${label}</div>
<div>${address}</div>
<div onclick="clickedAddress(this.parentNode)"></div>
<svg class='edit-options' onclick="showEdit(this.parentNode)" viewBox="0 0 4 16" style="enable-background:new 0 0 4 16;" xml:space="preserve">
<title>Edit address card</title>
<g>
<circle cx="2" cy="2" r="2"/>
<circle cx="2" cy="14" r="2"/>
<circle cx="2" cy="8" r="2"/>
</g>
</svg>`;parentConatainer.appendChild(monitorCard)}
function showEdit(parent){activeAddress=parent;newAddrLabel=document.getElementById('newAddrLabel');document.getElementById('edit-container').classList.add('show');let x=document.getElementById('edit');x.classList.add('slide-up');newAddrLabel.focus();x.children[1].textContent=parent.children[1].textContent;newAddrLabel.value=parent.children[0].textContent;let y=document.addEventListener("click",function(event){if(event.target.closest('#edit')||event.target.closest('.edit-options'))return;closeEdit();document.removeEventListener('click',y)})}
function editdata(){let x=document.getElementById('edit'),label=newAddrLabel.value;if(label=='')
label='Unknown';compactIDB.writeData('labels',label,x.children[1].textContent).then((resolve)=>{activeAddress.children[0].textContent=label;closeEdit()}).catch((error)=>{console.log(error)})}
function removedata(){if(confirm('Do you want to delete this address?'))
{activeAddress.remove();compactIDB.removeData('labels',activeAddress.children[1].textContent)}
closeEdit()}
function closeEdit(){document.getElementById('edit-container').classList.remove('show');document.getElementById('edit').classList.remove('slide-up');newAddrLabel.value=''}
function createAllCards(){floWebWallet.getLabels().then((labelAddr)=>{if(Object.entries(labelAddr).length===0)
document.getElementById('monitor-list').innerHTML=`<h3 style="text-align: center;width: 100%;">Add a FLO address to start monitoring</h3>`;else Object.keys(labelAddr).forEach((address)=>{createAddressCards(address,labelAddr[address]);floWebWallet.syncTransactions(address).then((array)=>{if(array.length>0){let badge=document.createElement('badge'),notifications=array.length
if(notifications>99)
notifications='99+'
badge.textContent=notifications
document.getElementById(address).appendChild(badge)}}).catch((error)=>{console.log(error)})})}).catch((error)=>{console.log(error)})}
function validateInfo(thisInput){if(floCrypto.validateAddr(thisInput.value))
document.getElementById('sendBtn').disabled=!1;else document.getElementById('sendBtn').disabled=!0}
function showPrivKeyPage(){document.getElementById('privKey').focus();showInnerPage('privKeyPage')}
function sendMessage(){let sender=document.getElementById('getBal_addr').value,amount=document.getElementById('amount').value,receiver=document.getElementById('receiver').value,floData=document.getElementById('flotextdata').value,privKey=document.getElementById('privKey').value;floWebWallet.sendTransaction(sender,receiver,amount,floData,privKey).then((transactionid)=>{document.getElementById('transactionId').textContent=`transaction ID : ${transactionid}`;showInnerPage('transaction-complete')}).catch((error)=>{alert(error)})}
function deleteDB(){compactIDB.deleteDB().then((message)=>{alert(message)
onLoadStartUp()}).catch((error)=>{alert(error)})}
function copyToClipboard(parent,childIndex){let input=document.createElement('textarea'),toast=document.getElementById('textCopied');input.setAttribute('readonly','');input.setAttribute('style','position: absolute; left: -9999px');document.body.appendChild(input);input.value=parent.children[childIndex].textContent;input.select();document.execCommand('copy');document.body.removeChild(input);toast.classList.add('show');setTimeout(()=>{toast.classList.remove('show')},1000)}
if(typeof Crypto=="undefined"||!Crypto.util){(function(){var base64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var Crypto=window.Crypto={};var util=Crypto.util={rotl:function(n,b){return(n<<b)|(n>>>(32-b))},rotr:function(n,b){return(n<<(32-b))|(n>>>b)},endian:function(n){if(n.constructor==Number){return util.rotl(n,8)&0x00FF00FF|util.rotl(n,24)&0xFF00FF00}
for(var i=0;i<n.length;i++)
n[i]=util.endian(n[i]);return n},randomBytes:function(n){for(var bytes=[];n>0;n--)
bytes.push(Math.floor(Math.random()*256));return bytes},bytesToWords:function(bytes){for(var words=[],i=0,b=0;i<bytes.length;i++,b+=8)
words[b>>>5]|=(bytes[i]&0xFF)<<(24-b%32);return words},wordsToBytes:function(words){for(var bytes=[],b=0;b<words.length*32;b+=8)
bytes.push((words[b>>>5]>>>(24-b%32))&0xFF);return bytes},bytesToHex:function(bytes){for(var hex=[],i=0;i<bytes.length;i++){hex.push((bytes[i]>>>4).toString(16));hex.push((bytes[i]&0xF).toString(16))}
return hex.join("")},hexToBytes:function(hex){for(var bytes=[],c=0;c<hex.length;c+=2)
bytes.push(parseInt(hex.substr(c,2),16));return bytes},bytesToBase64:function(bytes){for(var base64=[],i=0;i<bytes.length;i+=3){var triplet=(bytes[i]<<16)|(bytes[i+1]<<8)|bytes[i+2];for(var j=0;j<4;j++){if(i*8+j*6<=bytes.length*8)
base64.push(base64map.charAt((triplet>>>6*(3-j))&0x3F));else base64.push("=")}}
return base64.join("")},base64ToBytes:function(base64){base64=base64.replace(/[^A-Z0-9+\/]/ig,"");for(var bytes=[],i=0,imod4=0;i<base64.length;imod4=++i%4){if(imod4==0)continue;bytes.push(((base64map.indexOf(base64.charAt(i-1))&(Math.pow(2,-2*imod4+8)-1))<<(imod4*2))|(base64map.indexOf(base64.charAt(i))>>>(6-imod4*2)))}
return bytes}};var charenc=Crypto.charenc={};var UTF8=charenc.UTF8={stringToBytes:function(str){return Binary.stringToBytes(unescape(encodeURIComponent(str)))},bytesToString:function(bytes){return decodeURIComponent(escape(Binary.bytesToString(bytes)))}};var Binary=charenc.Binary={stringToBytes:function(str){for(var bytes=[],i=0;i<str.length;i++)
bytes.push(str.charCodeAt(i)&0xFF);return bytes},bytesToString:function(bytes){for(var str=[],i=0;i<bytes.length;i++)
str.push(String.fromCharCode(bytes[i]));return str.join("")}}})()}(function(){var C=Crypto,util=C.util,charenc=C.charenc,UTF8=charenc.UTF8,Binary=charenc.Binary;var SHA1=C.SHA1=function(message,options){var digestbytes=util.wordsToBytes(SHA1._sha1(message));return options&&options.asBytes?digestbytes:options&&options.asString?Binary.bytesToString(digestbytes):util.bytesToHex(digestbytes)};SHA1._sha1=function(message){if(message.constructor==String)message=UTF8.stringToBytes(message);var m=util.bytesToWords(message),l=message.length*8,w=[],H0=1732584193,H1=-271733879,H2=-1732584194,H3=271733878,H4=-1009589776;m[l>>5]|=0x80<<(24-l%32);m[((l+64>>>9)<<4)+15]=l;for(var i=0;i<m.length;i+=16){var a=H0,b=H1,c=H2,d=H3,e=H4;for(var j=0;j<80;j++){if(j<16)w[j]=m[i+j];else{var n=w[j-3]^w[j-8]^w[j-14]^w[j-16];w[j]=(n<<1)|(n>>>31)}
var t=((H0<<5)|(H0>>>27))+H4+(w[j]>>>0)+(j<20?(H1&H2|~H1&H3)+1518500249:j<40?(H1^H2^H3)+1859775393:j<60?(H1&H2|H1&H3|H2&H3)-1894007588:(H1^H2^H3)-899497514);H4=H3;H3=H2;H2=(H1<<30)|(H1>>>2);H1=H0;H0=t}
H0+=a;H1+=b;H2+=c;H3+=d;H4+=e}
return[H0,H1,H2,H3,H4]};SHA1._blocksize=16;SHA1._digestsize=20})();(function(){var C=Crypto,util=C.util,charenc=C.charenc,UTF8=charenc.UTF8,Binary=charenc.Binary;C.HMAC=function(hasher,message,key,options){if(message.constructor==String)message=UTF8.stringToBytes(message);if(key.constructor==String)key=UTF8.stringToBytes(key);if(key.length>hasher._blocksize*4)
key=hasher(key,{asBytes:!0});var okey=key.slice(0),ikey=key.slice(0);for(var i=0;i<hasher._blocksize*4;i++){okey[i]^=0x5C;ikey[i]^=0x36}
var hmacbytes=hasher(okey.concat(hasher(ikey.concat(message),{asBytes:!0})),{asBytes:!0});return options&&options.asBytes?hmacbytes:options&&options.asString?Binary.bytesToString(hmacbytes):util.bytesToHex(hmacbytes)}})();function ascii_to_hexa(str){var arr1=[];for(var n=0,l=str.length;n<l;n++){var hex=Number(str.charCodeAt(n)).toString(16);arr1.push(hex)}
return arr1.join('')}(typeof Crypto=="undefined"||!Crypto.util)&&function(){var d=window.Crypto={},k=d.util={rotl:function(b,a){return b<<a|b>>>32-a},rotr:function(b,a){return b<<32-a|b>>>a},endian:function(b){if(b.constructor==Number)return k.rotl(b,8)&16711935|k.rotl(b,24)&4278255360;for(var a=0;a<b.length;a++)b[a]=k.endian(b[a]);return b},randomBytes:function(b){for(var a=[];b>0;b--)a.push(Math.floor(Math.random()*256));return a},bytesToWords:function(b){for(var a=[],c=0,e=0;c<b.length;c++,e+=8)a[e>>>5]|=(b[c]&255)<<24-e%32;return a},wordsToBytes:function(b){for(var a=[],c=0;c<b.length*32;c+=8)a.push(b[c>>>5]>>>24-c%32&255);return a},bytesToHex:function(b){for(var a=[],c=0;c<b.length;c++)a.push((b[c]>>>4).toString(16)),a.push((b[c]&15).toString(16));return a.join("")},hexToBytes:function(b){for(var a=[],c=0;c<b.length;c+=2)a.push(parseInt(b.substr(c,2),16));return a},bytesToBase64:function(b){for(var a=[],c=0;c<b.length;c+=3)
for(var e=b[c]<<16|b[c+1]<<8|b[c+2],p=0;p<4;p++)c*8+p*6<=b.length*8?a.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e>>>6*(3-p)&63)):a.push("=");return a.join("")},base64ToBytes:function(b){for(var b=b.replace(/[^A-Z0-9+\/]/ig,""),a=[],c=0,e=0;c<b.length;e=++c%4)e!=0&&a.push(("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(b.charAt(c-1))&Math.pow(2,-2*e+8)-1)<<e*2|"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(b.charAt(c))>>>6-e*2);return a}},d=d.charenc={};d.UTF8={stringToBytes:function(b){return g.stringToBytes(unescape(encodeURIComponent(b)))},bytesToString:function(b){return decodeURIComponent(escape(g.bytesToString(b)))}};var g=d.Binary={stringToBytes:function(b){for(var a=[],c=0;c<b.length;c++)a.push(b.charCodeAt(c)&255);return a},bytesToString:function(b){for(var a=[],c=0;c<b.length;c++)a.push(String.fromCharCode(b[c]));return a.join("")}}}();(function(){var d=Crypto,k=d.util,g=d.charenc,b=g.UTF8,a=g.Binary,c=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],e=d.SHA256=function(b,c){var f=k.wordsToBytes(e._sha256(b));return c&&c.asBytes?f:c&&c.asString?a.bytesToString(f):k.bytesToHex(f)};e._sha256=function(a){a.constructor==String&&(a=b.stringToBytes(a));var e=k.bytesToWords(a),f=a.length*8,a=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=[],g,m,r,i,n,o,s,t,h,l,j;e[f>>5]|=128<<24-f%32;e[(f+64>>9<<4)+15]=f;for(t=0;t<e.length;t+=16){f=a[0];g=a[1];m=a[2];r=a[3];i=a[4];n=a[5];o=a[6];s=a[7];for(h=0;h<64;h++){h<16?d[h]=e[h+t]:(l=d[h-15],j=d[h-2],d[h]=((l<<25|l>>>7)^(l<<14|l>>>18)^l>>>3)+(d[h-7]>>>0)+((j<<15|j>>>17)^(j<<13|j>>>19)^j>>>10)+(d[h-16]>>>0));j=f&g^f&m^g&m;var u=(f<<30|f>>>2)^(f<<19|f>>>13)^(f<<10|f>>>22);l=(s>>>0)+((i<<26|i>>>6)^(i<<21|i>>>11)^(i<<7|i>>>25))+(i&n^~i&o)+c[h]+(d[h]>>>0);j=u+j;s=o;o=n;n=i;i=r+l>>>0;r=m;m=g;g=f;f=l+j>>>0}
a[0]+=f;a[1]+=g;a[2]+=m;a[3]+=r;a[4]+=i;a[5]+=n;a[6]+=o;a[7]+=s}
return a};e._blocksize=16;e._digestsize=32})();(function(){var d=Crypto,k=d.util,g=d.charenc,b=g.UTF8,a=g.Binary;d.HMAC=function(c,e,d,g){e.constructor==String&&(e=b.stringToBytes(e));d.constructor==String&&(d=b.stringToBytes(d));d.length>c._blocksize*4&&(d=c(d,{asBytes:!0}));for(var f=d.slice(0),d=d.slice(0),q=0;q<c._blocksize*4;q++)f[q]^=92,d[q]^=54;c=c(f.concat(c(d.concat(e),{asBytes:!0})),{asBytes:!0});return g&&g.asBytes?c:g&&g.asString?a.bytesToString(c):k.bytesToHex(c)}})();(function(){var sr=window.SecureRandom=function(){};sr.state;sr.pool;sr.pptr;sr.poolCopyOnInit;sr.poolSize=256;sr.prototype.nextBytes=function(ba){var i;if(window.crypto&&window.crypto.getRandomValues&&window.Uint8Array){try{var rvBytes=new Uint8Array(ba.length);window.crypto.getRandomValues(rvBytes);for(i=0;i<ba.length;++i)
ba[i]=sr.getByte()^rvBytes[i];return}catch(e){alert(e)}}
for(i=0;i<ba.length;++i)ba[i]=sr.getByte();};sr.seedTime=function(){sr.seedInt(new Date().getTime())}
sr.getByte=function(){if(sr.state==null){sr.seedTime();sr.state=sr.ArcFour();sr.state.init(sr.pool);sr.poolCopyOnInit=[];for(sr.pptr=0;sr.pptr<sr.pool.length;++sr.pptr)
sr.poolCopyOnInit[sr.pptr]=sr.pool[sr.pptr];sr.pptr=0}
return sr.state.next()}
sr.seedInt=function(x){sr.seedInt8(x);sr.seedInt8((x>>8));sr.seedInt8((x>>16));sr.seedInt8((x>>24))}
sr.seedInt16=function(x){sr.seedInt8(x);sr.seedInt8((x>>8))}
sr.seedInt8=function(x){sr.pool[sr.pptr++]^=x&255;if(sr.pptr>=sr.poolSize)sr.pptr-=sr.poolSize}
sr.ArcFour=function(){function Arcfour(){this.i=0;this.j=0;this.S=new Array()}
function ARC4init(key){var i,j,t;for(i=0;i<256;++i)
this.S[i]=i;j=0;for(i=0;i<256;++i){j=(j+this.S[i]+key[i%key.length])&255;t=this.S[i];this.S[i]=this.S[j];this.S[j]=t}
this.i=0;this.j=0}
function ARC4next(){var t;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;t=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=t;return this.S[(t+this.S[this.i])&255]}
Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;return new Arcfour()};if(sr.pool==null){sr.pool=new Array();sr.pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues&&window.Uint8Array){try{var ua=new Uint8Array(sr.poolSize);window.crypto.getRandomValues(ua);for(t=0;t<sr.poolSize;++t)
sr.pool[sr.pptr++]=ua[t]}catch(e){alert(e)}}
while(sr.pptr<sr.poolSize){t=Math.floor(65536*Math.random());sr.pool[sr.pptr++]=t>>>8;sr.pool[sr.pptr++]=t&255}
sr.pptr=Math.floor(sr.poolSize*Math.random());sr.seedTime();var entropyStr="";entropyStr+=(window.screen.height*window.screen.width*window.screen.colorDepth);entropyStr+=(window.screen.availHeight*window.screen.availWidth*window.screen.pixelDepth);var dateObj=new Date();var timeZoneOffset=dateObj.getTimezoneOffset();entropyStr+=timeZoneOffset;entropyStr+=navigator.userAgent;var pluginsStr="";for(var i=0;i<navigator.plugins.length;i++){pluginsStr+=navigator.plugins[i].name+" "+navigator.plugins[i].filename+" "+navigator.plugins[i].description+" "+navigator.plugins[i].version+", "}
var mimeTypesStr="";for(var i=0;i<navigator.mimeTypes.length;i++){mimeTypesStr+=navigator.mimeTypes[i].description+" "+navigator.mimeTypes[i].type+" "+navigator.mimeTypes[i].suffixes+", "}
entropyStr+=pluginsStr+mimeTypesStr;entropyStr+=navigator.cookieEnabled+typeof(sessionStorage)+typeof(localStorage);entropyStr+=navigator.language;entropyStr+=window.history.length;entropyStr+=window.location;var entropyBytes=Crypto.SHA256(entropyStr,{asBytes:!0});for(var i=0;i<entropyBytes.length;i++){sr.seedInt8(entropyBytes[i])}}})();var zl=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13];var zr=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11];var sl=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6];var sr=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11];var hl=[0x00000000,0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xA953FD4E];var hr=[0x50A28BE6,0x5C4DD124,0x6D703EF3,0x7A6D76E9,0x00000000];var bytesToWords=function(bytes){var words=[];for(var i=0,b=0;i<bytes.length;i++,b+=8){words[b>>>5]|=bytes[i]<<(24-b%32)}
return words};var wordsToBytes=function(words){var bytes=[];for(var b=0;b<words.length*32;b+=8){bytes.push((words[b>>>5]>>>(24-b%32))&0xFF)}
return bytes};var processBlock=function(H,M,offset){for(var i=0;i<16;i++){var offset_i=offset+i;var M_offset_i=M[offset_i];M[offset_i]=((((M_offset_i<<8)|(M_offset_i>>>24))&0x00ff00ff)|(((M_offset_i<<24)|(M_offset_i>>>8))&0xff00ff00))}
var al,bl,cl,dl,el;var ar,br,cr,dr,er;ar=al=H[0];br=bl=H[1];cr=cl=H[2];dr=dl=H[3];er=el=H[4];var t;for(var i=0;i<80;i+=1){t=(al+M[offset+zl[i]])|0;if(i<16){t+=f1(bl,cl,dl)+hl[0]}else if(i<32){t+=f2(bl,cl,dl)+hl[1]}else if(i<48){t+=f3(bl,cl,dl)+hl[2]}else if(i<64){t+=f4(bl,cl,dl)+hl[3]}else{t+=f5(bl,cl,dl)+hl[4]}
t=t|0;t=rotl(t,sl[i]);t=(t+el)|0;al=el;el=dl;dl=rotl(cl,10);cl=bl;bl=t;t=(ar+M[offset+zr[i]])|0;if(i<16){t+=f5(br,cr,dr)+hr[0]}else if(i<32){t+=f4(br,cr,dr)+hr[1]}else if(i<48){t+=f3(br,cr,dr)+hr[2]}else if(i<64){t+=f2(br,cr,dr)+hr[3]}else{t+=f1(br,cr,dr)+hr[4]}
t=t|0;t=rotl(t,sr[i]);t=(t+er)|0;ar=er;er=dr;dr=rotl(cr,10);cr=br;br=t}
t=(H[1]+cl+dr)|0;H[1]=(H[2]+dl+er)|0;H[2]=(H[3]+el+ar)|0;H[3]=(H[4]+al+br)|0;H[4]=(H[0]+bl+cr)|0;H[0]=t};function f1(x,y,z){return((x)^(y)^(z))}
function f2(x,y,z){return(((x)&(y))|((~x)&(z)))}
function f3(x,y,z){return(((x)|(~(y)))^(z))}
function f4(x,y,z){return(((x)&(z))|((y)&(~(z))))}
function f5(x,y,z){return((x)^((y)|(~(z))))}
function rotl(x,n){return(x<<n)|(x>>>(32-n))}
function ripemd160(message){var H=[0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0];var m=bytesToWords(message);var nBitsLeft=message.length*8;var nBitsTotal=message.length*8;m[nBitsLeft>>>5]|=0x80<<(24-nBitsLeft%32);m[(((nBitsLeft+64)>>>9)<<4)+14]=((((nBitsTotal<<8)|(nBitsTotal>>>24))&0x00ff00ff)|(((nBitsTotal<<24)|(nBitsTotal>>>8))&0xff00ff00));for(var i=0;i<m.length;i+=16){processBlock(H,m,i)}
for(var i=0;i<5;i++){var H_i=H[i];H[i]=(((H_i<<8)|(H_i>>>24))&0x00ff00ff)|(((H_i<<24)|(H_i>>>8))&0xff00ff00)}
var digestbytes=wordsToBytes(H);return digestbytes}(function(){var BigInteger=window.BigInteger=function BigInteger(a,b,c){if(!(this instanceof BigInteger))
return new BigInteger(a,b,c);if(a!=null)
if("number"==typeof a)this.fromNumber(a,b,c);else if(b==null&&"string"!=typeof a)this.fromString(a,256);else this.fromString(a,b)};var dbits;var canary=0xdeadbeefcafe;var j_lm=((canary&0xffffff)==0xefcafe);function nbi(){return new BigInteger(null)}
function am1(i,x,w,j,c,n){while(--n>=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/0x4000000);w[j++]=v&0x3ffffff}
return c}
function am2(i,x,w,j,c,n){var xl=x&0x7fff,xh=x>>15;while(--n>=0){var l=this[i]&0x7fff;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&0x3fffffff}
return c}
function am3(i,x,w,j,c,n){var xl=x&0x3fff,xh=x>>14;while(--n>=0){var l=this[i]&0x3fff;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&0x3fff)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&0xfffffff}
return c}
if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}
BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<<dbits)-1);BigInteger.prototype.DV=(1<<dbits);var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz";var BI_RC=new Array();var rr,vv;rr="0".charCodeAt(0);for(vv=0;vv<=9;++vv)BI_RC[rr++]=vv;rr="a".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;rr="A".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;function int2char(n){return BI_RM.charAt(n)}
function intAt(s,i){var c=BI_RC[s.charCodeAt(i)];return(c==null)?-1:c}
function nbv(i){var r=nbi();r.fromInt(i);return r}
function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16}
if((t=x>>8)!=0){x=t;r+=8}
if((t=x>>4)!=0){x=t;r+=4}
if((t=x>>2)!=0){x=t;r+=2}
if((t=x>>1)!=0){x=t;r+=1}
return r}
BigInteger.prototype.copyTo=function(r){for(var i=this.t-1;i>=0;--i)r[i]=this[i];r.t=this.t;r.s=this.s};BigInteger.prototype.fromInt=function(x){this.t=1;this.s=(x<0)?-1:0;if(x>0)this[0]=x;else if(x<-1)this[0]=x+this.DV;else this.t=0};BigInteger.prototype.fromString=function(s,b){var k;if(b==16)k=4;else if(b==8)k=3;else if(b==256)k=8;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else{this.fromRadix(s,b);return}
this.t=0;this.s=0;var i=s.length,mi=!1,sh=0;while(--i>=0){var x=(k==8)?s[i]&0xff:intAt(s,i);if(x<0){if(s.charAt(i)=="-")mi=!0;continue}
mi=!1;if(sh==0)
this[this.t++]=x;else if(sh+k>this.DB){this[this.t-1]|=(x&((1<<(this.DB-sh))-1))<<sh;this[this.t++]=(x>>(this.DB-sh))}else this[this.t-1]|=x<<sh;sh+=k;if(sh>=this.DB)sh-=this.DB}
if(k==8&&(s[0]&0x80)!=0){this.s=-1;if(sh>0)this[this.t-1]|=((1<<(this.DB-sh))-1)<<sh}
this.clamp();if(mi)BigInteger.ZERO.subTo(this,this)};BigInteger.prototype.clamp=function(){var c=this.s&this.DM;while(this.t>0&&this[this.t-1]==c)--this.t};BigInteger.prototype.dlShiftTo=function(n,r){var i;for(i=this.t-1;i>=0;--i)r[i+n]=this[i];for(i=n-1;i>=0;--i)r[i]=0;r.t=this.t+n;r.s=this.s};BigInteger.prototype.drShiftTo=function(n,r){for(var i=n;i<this.t;++i)r[i-n]=this[i];r.t=Math.max(this.t-n,0);r.s=this.s};BigInteger.prototype.lShiftTo=function(n,r){var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<cbs)-1;var ds=Math.floor(n/this.DB),c=(this.s<<bs)&this.DM,i;for(i=this.t-1;i>=0;--i){r[i+ds+1]=(this[i]>>cbs)|c;c=(this[i]&bm)<<bs}
for(i=ds-1;i>=0;--i)r[i]=0;r[ds]=c;r.t=this.t+ds+1;r.s=this.s;r.clamp()};BigInteger.prototype.rShiftTo=function(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=0;return}
var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<bs)-1;r[0]=this[ds]>>bs;for(var i=ds+1;i<this.t;++i){r[i-ds-1]|=(this[i]&bm)<<cbs;r[i-ds]=this[i]>>bs}
if(bs>0)r[this.t-ds-1]|=(this.s&bm)<<cbs;r.t=this.t-ds;r.clamp()};BigInteger.prototype.subTo=function(a,r){var i=0,c=0,m=Math.min(a.t,this.t);while(i<m){c+=this[i]-a[i];r[i++]=c&this.DM;c>>=this.DB}
if(a.t<this.t){c-=a.s;while(i<this.t){c+=this[i];r[i++]=c&this.DM;c>>=this.DB}
c+=this.s}else{c+=this.s;while(i<a.t){c-=a[i];r[i++]=c&this.DM;c>>=this.DB}
c-=a.s}
r.s=(c<0)?-1:0;if(c<-1)r[i++]=this.DV+c;else if(c>0)r[i++]=c;r.t=i;r.clamp()};BigInteger.prototype.multiplyTo=function(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+y.t;while(--i>=0)r[i]=0;for(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.clamp();if(this.s!=a.s)BigInteger.ZERO.subTo(r,r)};BigInteger.prototype.squareTo=function(r){var x=this.abs();var i=r.t=2*x.t;while(--i>=0)r[i]=0;for(i=0;i<x.t-1;++i){var c=x.am(i,x[i],r,2*i,0,1);if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=1}}
if(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.clamp()};BigInteger.prototype.divRemTo=function(m,q,r){var pm=m.abs();if(pm.t<=0)return;var pt=this.abs();if(pt.t<pm.t){if(q!=null)q.fromInt(0);if(r!=null)this.copyTo(r);return}
if(r==null)r=nbi();var y=nbi(),ts=this.s,ms=m.s;var nsh=this.DB-nbits(pm[pm.t-1]);if(nsh>0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r)}else{pm.copyTo(y);pt.copyTo(r)}
var ys=y.t;var y0=y[ys-1];if(y0==0)return;var yt=y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<<this.F1)/yt,e=1<<this.F2;var i=r.t,j=i-ys,t=(q==null)?nbi():q;y.dlShiftTo(j,t);if(r.compareTo(t)>=0){r[r.t++]=1;r.subTo(t,r)}
BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t<ys)y[y.t++]=0;while(--j>=0){var qd=(r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd,r,j,0,ys))<qd){y.dlShiftTo(j,t);r.subTo(t,r);while(r[i]<--qd)r.subTo(t,r);}}
if(q!=null){r.drShiftTo(ys,q);if(ts!=ms)BigInteger.ZERO.subTo(q,q)}
r.t=ys;r.clamp();if(nsh>0)r.rShiftTo(nsh,r);if(ts<0)BigInteger.ZERO.subTo(r,r)};BigInteger.prototype.invDigit=function(){if(this.t<1)return 0;var x=this[0];if((x&1)==0)return 0;var y=x&3;y=(y*(2-(x&0xf)*y))&0xf;y=(y*(2-(x&0xff)*y))&0xff;y=(y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;y=(y*(2-x*y%this.DV))%this.DV;return(y>0)?this.DV-y:-y};BigInteger.prototype.isEven=function(){return((this.t>0)?(this[0]&1):this.s)==0};BigInteger.prototype.exp=function(e,z){if(e>0xffffffff||e<1)return BigInteger.ONE;var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&(1<<i))>0)z.mulTo(r2,g,r);else{var t=r;r=r2;r2=t}}
return z.revert(r)};BigInteger.prototype.toString=function(b){if(this.s<0)return"-"+this.negate().toString(b);var k;if(b==16)k=4;else if(b==8)k=3;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else return this.toRadix(b);var km=(1<<k)-1,d,m=!1,r="",i=this.t;var p=this.DB-(i*this.DB)%k;if(i-->0){if(p<this.DB&&(d=this[i]>>p)>0){m=!0;r=int2char(d)}
while(i>=0){if(p<k){d=(this[i]&((1<<p)-1))<<(k-p);d|=this[--i]>>(p+=this.DB-k)}else{d=(this[i]>>(p-=k))&km;if(p<=0){p+=this.DB;--i}}
if(d>0)m=!0;if(m)r+=int2char(d)}}
return m?r:"0"};BigInteger.prototype.negate=function(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r};BigInteger.prototype.abs=function(){return(this.s<0)?this.negate():this};BigInteger.prototype.compareTo=function(a){var r=this.s-a.s;if(r!=0)return r;var i=this.t;r=i-a.t;if(r!=0)return(this.s<0)?-r:r;while(--i>=0)
if((r=this[i]-a[i])!=0)return r;return 0}
BigInteger.prototype.bitLength=function(){if(this.t<=0)return 0;return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))};BigInteger.prototype.mod=function(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0)a.subTo(r,r);return r}
BigInteger.prototype.modPowInt=function(e,m){var z;if(e<256||m.isEven())z=new Classic(m);else z=new Montgomery(m);return this.exp(e,z)};BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function lbit(x){if(x==0)return-1;var r=0;if((x&0xffff)==0){x>>=16;r+=16}
if((x&0xff)==0){x>>=8;r+=8}
if((x&0xf)==0){x>>=4;r+=4}
if((x&3)==0){x>>=2;r+=2}
if((x&1)==0)++r;return r}
function cbit(x){var r=0;while(x!=0){x&=x-1;++r}
return r}
var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];BigInteger.prototype.chunkSize=function(r){return Math.floor(Math.LN2*this.DB/Math.log(r))};BigInteger.prototype.toRadix=function(b){if(b==null)b=10;if(this.signum()==0||b<2||b>36)return"0";var cs=this.chunkSize(b);var a=Math.pow(b,cs);var d=nbv(a),y=nbi(),z=nbi(),r="";this.divRemTo(d,y,z);while(y.signum()>0){r=(a+z.intValue()).toString(b).substr(1)+r;y.divRemTo(d,y,z)}
return z.intValue().toString(b)+r};BigInteger.prototype.fromRadix=function(s,b){this.fromInt(0);if(b==null)b=10;var cs=this.chunkSize(b);var d=Math.pow(b,cs),mi=!1,j=0,w=0;for(var i=0;i<s.length;++i){var x=intAt(s,i);if(x<0){if(s.charAt(i)=="-"&&this.signum()==0)mi=!0;continue}
w=b*w+x;if(++j>=cs){this.dMultiply(d);this.dAddOffset(w,0);j=0;w=0}}
if(j>0){this.dMultiply(Math.pow(b,j));this.dAddOffset(w,0)}
if(mi)BigInteger.ZERO.subTo(this,this)};BigInteger.prototype.fromNumber=function(a,b,c){if("number"==typeof b){if(a<2)this.fromInt(1);else{this.fromNumber(a,c);if(!this.testBit(a-1))
this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);if(this.isEven())this.dAddOffset(1,0);while(!this.isProbablePrime(b)){this.dAddOffset(2,0);if(this.bitLength()>a)this.subTo(BigInteger.ONE.shiftLeft(a-1),this)}}}else{var x=new Array(),t=a&7;x.length=(a>>3)+1;b.nextBytes(x);if(t>0)x[0]&=((1<<t)-1);else x[0]=0;this.fromString(x,256)}};BigInteger.prototype.bitwiseTo=function(a,op,r){var i,f,m=Math.min(a.t,this.t);for(i=0;i<m;++i)r[i]=op(this[i],a[i]);if(a.t<this.t){f=a.s&this.DM;for(i=m;i<this.t;++i)r[i]=op(this[i],f);r.t=this.t}else{f=this.s&this.DM;for(i=m;i<a.t;++i)r[i]=op(f,a[i]);r.t=a.t}
r.s=op(this.s,a.s);r.clamp()};BigInteger.prototype.changeBit=function(n,op){var r=BigInteger.ONE.shiftLeft(n);this.bitwiseTo(r,op,r);return r};BigInteger.prototype.addTo=function(a,r){var i=0,c=0,m=Math.min(a.t,this.t);while(i<m){c+=this[i]+a[i];r[i++]=c&this.DM;c>>=this.DB}
if(a.t<this.t){c+=a.s;while(i<this.t){c+=this[i];r[i++]=c&this.DM;c>>=this.DB}
c+=this.s}else{c+=this.s;while(i<a.t){c+=a[i];r[i++]=c&this.DM;c>>=this.DB}
c+=a.s}
r.s=(c<0)?-1:0;if(c>0)r[i++]=c;else if(c<-1)r[i++]=this.DV+c;r.t=i;r.clamp()};BigInteger.prototype.dMultiply=function(n){this[this.t]=this.am(0,n-1,this,0,0,this.t);++this.t;this.clamp()};BigInteger.prototype.dAddOffset=function(n,w){if(n==0)return;while(this.t<=w)this[this.t++]=0;this[w]+=n;while(this[w]>=this.DV){this[w]-=this.DV;if(++w>=this.t)this[this.t++]=0;++this[w]}};BigInteger.prototype.multiplyLowerTo=function(a,n,r){var i=Math.min(this.t+a.t,n);r.s=0;r.t=i;while(i>0)r[--i]=0;var j;for(j=r.t-this.t;i<j;++i)r[i+this.t]=this.am(0,a[i],r,i,0,this.t);for(j=Math.min(a.t,n);i<j;++i)this.am(0,a[i],r,i,0,n-i);r.clamp()};BigInteger.prototype.multiplyUpperTo=function(a,n,r){--n;var i=r.t=this.t+a.t-n;r.s=0;while(--i>=0)r[i]=0;for(i=Math.max(n-this.t,0);i<a.t;++i)
r[this.t+i-n]=this.am(n-i,a[i],r,0,0,this.t+i-n);r.clamp();r.drShiftTo(1,r)};BigInteger.prototype.modInt=function(n){if(n<=0)return 0;var d=this.DV%n,r=(this.s<0)?n-1:0;if(this.t>0)
if(d==0)r=this[0]%n;else for(var i=this.t-1;i>=0;--i)r=(d*r+this[i])%n;return r};BigInteger.prototype.millerRabin=function(t){var n1=this.subtract(BigInteger.ONE);var k=n1.getLowestSetBit();if(k<=0)return!1;var r=n1.shiftRight(k);t=(t+1)>>1;if(t>lowprimes.length)t=lowprimes.length;var a=nbi();for(var i=0;i<t;++i){a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);var y=a.modPow(r,this);if(y.compareTo(BigInteger.ONE)!=0&&y.compareTo(n1)!=0){var j=1;while(j++<k&&y.compareTo(n1)!=0){y=y.modPowInt(2,this);if(y.compareTo(BigInteger.ONE)==0)return!1}
if(y.compareTo(n1)!=0)return!1}}
return!0};BigInteger.prototype.clone=function(){var r=nbi();this.copyTo(r);return r};BigInteger.prototype.intValue=function(){if(this.s<0){if(this.t==1)return this[0]-this.DV;else if(this.t==0)return-1}else if(this.t==1)return this[0];else if(this.t==0)return 0;return((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0]};BigInteger.prototype.byteValue=function(){return(this.t==0)?this.s:(this[0]<<24)>>24};BigInteger.prototype.shortValue=function(){return(this.t==0)?this.s:(this[0]<<16)>>16};BigInteger.prototype.signum=function(){if(this.s<0)return-1;else if(this.t<=0||(this.t==1&&this[0]<=0))return 0;else return 1};BigInteger.prototype.toByteArray=function(){var i=this.t,r=new Array();r[0]=this.s;var p=this.DB-(i*this.DB)%8,d,k=0;if(i-->0){if(p<this.DB&&(d=this[i]>>p)!=(this.s&this.DM)>>p)
r[k++]=d|(this.s<<(this.DB-p));while(i>=0){if(p<8){d=(this[i]&((1<<p)-1))<<(8-p);d|=this[--i]>>(p+=this.DB-8)}else{d=(this[i]>>(p-=8))&0xff;if(p<=0){p+=this.DB;--i}}
if((d&0x80)!=0)d|=-256;if(k==0&&(this.s&0x80)!=(d&0x80))++k;if(k>0||d!=this.s)r[k++]=d}}
return r};BigInteger.prototype.equals=function(a){return(this.compareTo(a)==0)};BigInteger.prototype.min=function(a){return(this.compareTo(a)<0)?this:a};BigInteger.prototype.max=function(a){return(this.compareTo(a)>0)?this:a};function op_and(x,y){return x&y}
BigInteger.prototype.and=function(a){var r=nbi();this.bitwiseTo(a,op_and,r);return r};function op_or(x,y){return x|y}
BigInteger.prototype.or=function(a){var r=nbi();this.bitwiseTo(a,op_or,r);return r};function op_xor(x,y){return x^y}
BigInteger.prototype.xor=function(a){var r=nbi();this.bitwiseTo(a,op_xor,r);return r};function op_andnot(x,y){return x&~y}
BigInteger.prototype.andNot=function(a){var r=nbi();this.bitwiseTo(a,op_andnot,r);return r};BigInteger.prototype.not=function(){var r=nbi();for(var i=0;i<this.t;++i)r[i]=this.DM&~this[i];r.t=this.t;r.s=~this.s;return r};BigInteger.prototype.shiftLeft=function(n){var r=nbi();if(n<0)this.rShiftTo(-n,r);else this.lShiftTo(n,r);return r};BigInteger.prototype.shiftRight=function(n){var r=nbi();if(n<0)this.lShiftTo(-n,r);else this.rShiftTo(n,r);return r};BigInteger.prototype.getLowestSetBit=function(){for(var i=0;i<this.t;++i)
if(this[i]!=0)return i*this.DB+lbit(this[i]);if(this.s<0)return this.t*this.DB;return-1};BigInteger.prototype.bitCount=function(){var r=0,x=this.s&this.DM;for(var i=0;i<this.t;++i)r+=cbit(this[i]^x);return r};BigInteger.prototype.testBit=function(n){var j=Math.floor(n/this.DB);if(j>=this.t)return(this.s!=0);return((this[j]&(1<<(n%this.DB)))!=0)};BigInteger.prototype.setBit=function(n){return this.changeBit(n,op_or)};BigInteger.prototype.clearBit=function(n){return this.changeBit(n,op_andnot)};BigInteger.prototype.flipBit=function(n){return this.changeBit(n,op_xor)};BigInteger.prototype.add=function(a){var r=nbi();this.addTo(a,r);return r};BigInteger.prototype.subtract=function(a){var r=nbi();this.subTo(a,r);return r};BigInteger.prototype.multiply=function(a){var r=nbi();this.multiplyTo(a,r);return r};BigInteger.prototype.divide=function(a){var r=nbi();this.divRemTo(a,r,null);return r};BigInteger.prototype.remainder=function(a){var r=nbi();this.divRemTo(a,null,r);return r};BigInteger.prototype.divideAndRemainder=function(a){var q=nbi(),r=nbi();this.divRemTo(a,q,r);return new Array(q,r)};BigInteger.prototype.modPow=function(e,m){var i=e.bitLength(),k,r=nbv(1),z;if(i<=0)return r;else if(i<18)k=1;else if(i<48)k=3;else if(i<144)k=4;else if(i<768)k=5;else k=6;if(i<8)
z=new Classic(m);else if(m.isEven())
z=new Barrett(m);else z=new Montgomery(m);var g=new Array(),n=3,k1=k-1,km=(1<<k)-1;g[1]=z.convert(this);if(k>1){var g2=nbi();z.sqrTo(g[1],g2);while(n<=km){g[n]=nbi();z.mulTo(g2,g[n-2],g[n]);n+=2}}
var j=e.t-1,w,is1=!0,r2=nbi(),t;i=nbits(e[j])-1;while(j>=0){if(i>=k1)w=(e[j]>>(i-k1))&km;else{w=(e[j]&((1<<(i+1))-1))<<(k1-i);if(j>0)w|=e[j-1]>>(this.DB+i-k1)}
n=k;while((w&1)==0){w>>=1;--n}
if((i-=n)<0){i+=this.DB;--j}
if(is1){g[w].copyTo(r);is1=!1}else{while(n>1){z.sqrTo(r,r2);z.sqrTo(r2,r);n-=2}
if(n>0)z.sqrTo(r,r2);else{t=r;r=r2;r2=t}
z.mulTo(r2,g[w],r)}
while(j>=0&&(e[j]&(1<<i))==0){z.sqrTo(r,r2);t=r;r=r2;r2=t;if(--i<0){i=this.DB-1;--j}}}
return z.revert(r)};BigInteger.prototype.modInverse=function(m){var ac=m.isEven();if(this.signum()===0)throw new Error('division by zero');if((this.isEven()&&ac)||m.signum()==0)return BigInteger.ZERO;var u=m.clone(),v=this.clone();var a=nbv(1),b=nbv(0),c=nbv(0),d=nbv(1);while(u.signum()!=0){while(u.isEven()){u.rShiftTo(1,u);if(ac){if(!a.isEven()||!b.isEven()){a.addTo(this,a);b.subTo(m,b)}
a.rShiftTo(1,a)}else if(!b.isEven())b.subTo(m,b);b.rShiftTo(1,b)}
while(v.isEven()){v.rShiftTo(1,v);if(ac){if(!c.isEven()||!d.isEven()){c.addTo(this,c);d.subTo(m,d)}
c.rShiftTo(1,c)}else if(!d.isEven())d.subTo(m,d);d.rShiftTo(1,d)}
if(u.compareTo(v)>=0){u.subTo(v,u);if(ac)a.subTo(c,a);b.subTo(d,b)}else{v.subTo(u,v);if(ac)c.subTo(a,c);d.subTo(b,d)}}
if(v.compareTo(BigInteger.ONE)!=0)return BigInteger.ZERO;while(d.compareTo(m)>=0)d.subTo(m,d);while(d.signum()<0)d.addTo(m,d);return d};BigInteger.prototype.pow=function(e){return this.exp(e,new NullExp())};BigInteger.prototype.gcd=function(a){var x=(this.s<0)?this.negate():this.clone();var y=(a.s<0)?a.negate():a.clone();if(x.compareTo(y)<0){var t=x;x=y;y=t}
var i=x.getLowestSetBit(),g=y.getLowestSetBit();if(g<0)return x;if(i<g)g=i;if(g>0){x.rShiftTo(g,x);y.rShiftTo(g,y)}
while(x.signum()>0){if((i=x.getLowestSetBit())>0)x.rShiftTo(i,x);if((i=y.getLowestSetBit())>0)y.rShiftTo(i,y);if(x.compareTo(y)>=0){x.subTo(y,x);x.rShiftTo(1,x)}else{y.subTo(x,y);y.rShiftTo(1,y)}}
if(g>0)y.lShiftTo(g,y);return y};BigInteger.prototype.isProbablePrime=function(t){var i,x=this.abs();if(x.t==1&&x[0]<=lowprimes[lowprimes.length-1]){for(i=0;i<lowprimes.length;++i)
if(x[0]==lowprimes[i])return!0;return!1}
if(x.isEven())return!1;i=1;while(i<lowprimes.length){var m=lowprimes[i],j=i+1;while(j<lowprimes.length&&m<lplim)m*=lowprimes[j++];m=x.modInt(m);while(i<j)
if(m%lowprimes[i++]==0)return!1}
return x.millerRabin(t)};BigInteger.prototype.square=function(){var r=nbi();this.squareTo(r);return r};BigInteger.valueOf=nbv;BigInteger.prototype.toByteArrayUnsigned=function(){var ba=this.abs().toByteArray();if(ba.length){if(ba[0]==0){ba=ba.slice(1)}
return ba.map(function(v){return(v<0)?v+256:v})}else{return ba}};BigInteger.fromByteArrayUnsigned=function(ba){if(!ba.length){return ba.valueOf(0)}else if(ba[0]&0x80){return new BigInteger([0].concat(ba))}else{return new BigInteger(ba)}};BigInteger.prototype.toByteArraySigned=function(){var val=this.abs().toByteArrayUnsigned();var neg=this.compareTo(BigInteger.ZERO)<0;if(neg){if(val[0]&0x80){val.unshift(0x80)}else{val[0]|=0x80}}else{if(val[0]&0x80){val.unshift(0x00)}}
return val};BigInteger.fromByteArraySigned=function(ba){if(ba[0]&0x80){ba[0]&=0x7f;return BigInteger.fromByteArrayUnsigned(ba).negate()}else{return BigInteger.fromByteArrayUnsigned(ba)}};var Classic=window.Classic=function Classic(m){this.m=m}
Classic.prototype.convert=function(x){if(x.s<0||x.compareTo(this.m)>=0)return x.mod(this.m);else return x};Classic.prototype.revert=function(x){return x};Classic.prototype.reduce=function(x){x.divRemTo(this.m,null,x)};Classic.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r);this.reduce(r)};Classic.prototype.sqrTo=function(x,r){x.squareTo(r);this.reduce(r)};var Montgomery=window.Montgomery=function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&0x7fff;this.mph=this.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*m.t}
Montgomery.prototype.convert=function(x){var r=nbi();x.abs().dlShiftTo(this.m.t,r);r.divRemTo(this.m,null,r);if(x.s<0&&r.compareTo(BigInteger.ZERO)>0)this.m.subTo(r,r);return r}
Montgomery.prototype.revert=function(x){var r=nbi();x.copyTo(r);this.reduce(r);return r};Montgomery.prototype.reduce=function(x){while(x.t<=this.mt2)
x[x.t++]=0;for(var i=0;i<this.m.t;++i){var j=x[i]&0x7fff;var u0=(j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;j=i+this.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=x.DV){x[j]-=x.DV;x[++j]++}}
x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0)x.subTo(this.m,x)};Montgomery.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r);this.reduce(r)};Montgomery.prototype.sqrTo=function(x,r){x.squareTo(r);this.reduce(r)};var NullExp=window.NullExp=function NullExp(){}
NullExp.prototype.convert=function(x){return x};NullExp.prototype.revert=function(x){return x};NullExp.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r)};NullExp.prototype.sqrTo=function(x,r){x.squareTo(r)};var Barrett=window.Barrett=function Barrett(m){this.r2=nbi();this.q3=nbi();BigInteger.ONE.dlShiftTo(2*m.t,this.r2);this.mu=this.r2.divide(m);this.m=m}
Barrett.prototype.convert=function(x){if(x.s<0||x.t>2*this.m.t)return x.mod(this.m);else if(x.compareTo(this.m)<0)return x;else{var r=nbi();x.copyTo(r);this.reduce(r);return r}};Barrett.prototype.revert=function(x){return x};Barrett.prototype.reduce=function(x){x.drShiftTo(this.m.t-1,this.r2);if(x.t>this.m.t+1){x.t=this.m.t+1;x.clamp()}
this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(x.compareTo(this.r2)<0)x.dAddOffset(1,this.m.t+1);x.subTo(this.r2,x);while(x.compareTo(this.m)>=0)x.subTo(this.m,x);};Barrett.prototype.mulTo=function(x,y,r){x.multiplyTo(y,r);this.reduce(r)};Barrett.prototype.sqrTo=function(x,r){x.squareTo(r);this.reduce(r)}})();(function(){var ec=window.EllipticCurve=function(){};ec.FieldElementFp=function(q,x){this.x=x;this.q=q};ec.FieldElementFp.prototype.equals=function(other){if(other==this)return!0;return(this.q.equals(other.q)&&this.x.equals(other.x))};ec.FieldElementFp.prototype.toBigInteger=function(){return this.x};ec.FieldElementFp.prototype.negate=function(){return new ec.FieldElementFp(this.q,this.x.negate().mod(this.q))};ec.FieldElementFp.prototype.add=function(b){return new ec.FieldElementFp(this.q,this.x.add(b.toBigInteger()).mod(this.q))};ec.FieldElementFp.prototype.subtract=function(b){return new ec.FieldElementFp(this.q,this.x.subtract(b.toBigInteger()).mod(this.q))};ec.FieldElementFp.prototype.multiply=function(b){return new ec.FieldElementFp(this.q,this.x.multiply(b.toBigInteger()).mod(this.q))};ec.FieldElementFp.prototype.square=function(){return new ec.FieldElementFp(this.q,this.x.square().mod(this.q))};ec.FieldElementFp.prototype.divide=function(b){return new ec.FieldElementFp(this.q,this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q))};ec.FieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ec.FieldElementFp.prototype.sqrt=function(){if(!this.q.testBit(0))throw new Error("even value of q");if(this.q.testBit(1)){var z=new ec.FieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q));return z.square().equals(this)?z:null}
var qMinusOne=this.q.subtract(BigInteger.ONE);var legendreExponent=qMinusOne.shiftRight(1);if(!(this.x.modPow(legendreExponent,this.q).equals(BigInteger.ONE)))return null;var u=qMinusOne.shiftRight(2);var k=u.shiftLeft(1).add(BigInteger.ONE);var Q=this.x;var fourQ=Q.shiftLeft(2).mod(this.q);var U,V;do{var rand=new SecureRandom();var P;do{P=new BigInteger(this.q.bitLength(),rand)}
while(P.compareTo(this.q)>=0||!(P.multiply(P).subtract(fourQ).modPow(legendreExponent,this.q).equals(qMinusOne)));var result=ec.FieldElementFp.fastLucasSequence(this.q,P,Q,k);U=result[0];V=result[1];if(V.multiply(V).mod(this.q).equals(fourQ)){if(V.testBit(0)){V=V.add(this.q)}
V=V.shiftRight(1);return new ec.FieldElementFp(this.q,V)}}
while(U.equals(BigInteger.ONE)||U.equals(qMinusOne));return null};ec.FieldElementFp.fastLucasSequence=function(p,P,Q,k){var n=k.bitLength();var s=k.getLowestSetBit();var Uh=BigInteger.ONE;var Vl=BigInteger.TWO;var Vh=P;var Ql=BigInteger.ONE;var Qh=BigInteger.ONE;for(var j=n-1;j>=s+1;--j){Ql=Ql.multiply(Qh).mod(p);if(k.testBit(j)){Qh=Ql.multiply(Q).mod(p);Uh=Uh.multiply(Vh).mod(p);Vl=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);Vh=Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p)}else{Qh=Ql;Uh=Uh.multiply(Vl).subtract(Ql).mod(p);Vh=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);Vl=Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p)}}
Ql=Ql.multiply(Qh).mod(p);Qh=Ql.multiply(Q).mod(p);Uh=Uh.multiply(Vl).subtract(Ql).mod(p);Vl=Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);Ql=Ql.multiply(Qh).mod(p);for(var j=1;j<=s;++j){Uh=Uh.multiply(Vl).mod(p);Vl=Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);Ql=Ql.multiply(Ql).mod(p)}
return[Uh,Vl]};ec.PointFp=function(curve,x,y,z,compressed){this.curve=curve;this.x=x;this.y=y;if(z==null){this.z=BigInteger.ONE}else{this.z=z}
this.zinv=null;this.compressed=!!compressed};ec.PointFp.prototype.getX=function(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}
var r=this.x.toBigInteger().multiply(this.zinv);this.curve.reduce(r);return this.curve.fromBigInteger(r)};ec.PointFp.prototype.getY=function(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}
var r=this.y.toBigInteger().multiply(this.zinv);this.curve.reduce(r);return this.curve.fromBigInteger(r)};ec.PointFp.prototype.equals=function(other){if(other==this)return!0;if(this.isInfinity())return other.isInfinity();if(other.isInfinity())return this.isInfinity();var u,v;u=other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);if(!u.equals(BigInteger.ZERO))return!1;v=other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);return v.equals(BigInteger.ZERO)};ec.PointFp.prototype.isInfinity=function(){if((this.x==null)&&(this.y==null))return!0;return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)};ec.PointFp.prototype.negate=function(){return new ec.PointFp(this.curve,this.x,this.y.negate(),this.z)};ec.PointFp.prototype.add=function(b){if(this.isInfinity())return b;if(b.isInfinity())return this;var u=b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);var v=b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(v)){if(BigInteger.ZERO.equals(u)){return this.twice()}
return this.curve.getInfinity()}
var THREE=new BigInteger("3");var x1=this.x.toBigInteger();var y1=this.y.toBigInteger();var x2=b.x.toBigInteger();var y2=b.y.toBigInteger();var v2=v.square();var v3=v2.multiply(v);var x1v2=x1.multiply(v2);var zu2=u.square().multiply(this.z);var x3=zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);var y3=x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);var z3=v3.multiply(this.z).multiply(b.z).mod(this.curve.q);return new ec.PointFp(this.curve,this.curve.fromBigInteger(x3),this.curve.fromBigInteger(y3),z3)};ec.PointFp.prototype.twice=function(){if(this.isInfinity())return this;if(this.y.toBigInteger().signum()==0)return this.curve.getInfinity();var THREE=new BigInteger("3");var x1=this.x.toBigInteger();var y1=this.y.toBigInteger();var y1z1=y1.multiply(this.z);var y1sqz1=y1z1.multiply(y1).mod(this.curve.q);var a=this.curve.a.toBigInteger();var w=x1.square().multiply(THREE);if(!BigInteger.ZERO.equals(a)){w=w.add(this.z.square().multiply(a))}
w=w.mod(this.curve.q);var x3=w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);var y3=w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);var z3=y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);return new ec.PointFp(this.curve,this.curve.fromBigInteger(x3),this.curve.fromBigInteger(y3),z3)};ec.PointFp.prototype.multiply=function(k){if(this.isInfinity())return this;if(k.signum()==0)return this.curve.getInfinity();var e=k;var h=e.multiply(new BigInteger("3"));var neg=this.negate();var R=this;var i;for(i=h.bitLength()-2;i>0;--i){R=R.twice();var hBit=h.testBit(i);var eBit=e.testBit(i);if(hBit!=eBit){R=R.add(hBit?this:neg)}}
return R};ec.PointFp.prototype.multiplyTwo=function(j,x,k){var i;if(j.bitLength()>k.bitLength())
i=j.bitLength()-1;else i=k.bitLength()-1;var R=this.curve.getInfinity();var both=this.add(x);while(i>=0){R=R.twice();if(j.testBit(i)){if(k.testBit(i)){R=R.add(both)}else{R=R.add(this)}}else{if(k.testBit(i)){R=R.add(x)}}
--i}
return R};ec.PointFp.prototype.getEncoded=function(compressed){var x=this.getX().toBigInteger();var y=this.getY().toBigInteger();var len=32;var enc=ec.integerToBytes(x,len);if(compressed){if(y.isEven()){enc.unshift(0x02)}else{enc.unshift(0x03)}}else{enc.unshift(0x04);enc=enc.concat(ec.integerToBytes(y,len))}
return enc};ec.PointFp.decodeFrom=function(curve,enc){var type=enc[0];var dataLen=enc.length-1;var xBa=enc.slice(1,1+dataLen/2);var yBa=enc.slice(1+dataLen/2,1+dataLen);xBa.unshift(0);yBa.unshift(0);var x=new BigInteger(xBa);var y=new BigInteger(yBa);return new ec.PointFp(curve,curve.fromBigInteger(x),curve.fromBigInteger(y))};ec.PointFp.prototype.add2D=function(b){if(this.isInfinity())return b;if(b.isInfinity())return this;if(this.x.equals(b.x)){if(this.y.equals(b.y)){return this.twice()}
return this.curve.getInfinity()}
var x_x=b.x.subtract(this.x);var y_y=b.y.subtract(this.y);var gamma=y_y.divide(x_x);var x3=gamma.square().subtract(this.x).subtract(b.x);var y3=gamma.multiply(this.x.subtract(x3)).subtract(this.y);return new ec.PointFp(this.curve,x3,y3)};ec.PointFp.prototype.twice2D=function(){if(this.isInfinity())return this;if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}
var TWO=this.curve.fromBigInteger(BigInteger.valueOf(2));var THREE=this.curve.fromBigInteger(BigInteger.valueOf(3));var gamma=this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO));var x3=gamma.square().subtract(this.x.multiply(TWO));var y3=gamma.multiply(this.x.subtract(x3)).subtract(this.y);return new ec.PointFp(this.curve,x3,y3)};ec.PointFp.prototype.multiply2D=function(k){if(this.isInfinity())return this;if(k.signum()==0)return this.curve.getInfinity();var e=k;var h=e.multiply(new BigInteger("3"));var neg=this.negate();var R=this;var i;for(i=h.bitLength()-2;i>0;--i){R=R.twice();var hBit=h.testBit(i);var eBit=e.testBit(i);if(hBit!=eBit){R=R.add2D(hBit?this:neg)}}
return R};ec.PointFp.prototype.isOnCurve=function(){var x=this.getX().toBigInteger();var y=this.getY().toBigInteger();var a=this.curve.getA().toBigInteger();var b=this.curve.getB().toBigInteger();var n=this.curve.getQ();var lhs=y.multiply(y).mod(n);var rhs=x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n);return lhs.equals(rhs)};ec.PointFp.prototype.toString=function(){return'('+this.getX().toBigInteger().toString()+','+this.getY().toBigInteger().toString()+')'};ec.PointFp.prototype.validate=function(){var n=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}
var x=this.getX().toBigInteger();var y=this.getY().toBigInteger();if(x.compareTo(BigInteger.ONE)<0||x.compareTo(n.subtract(BigInteger.ONE))>0){throw new Error('x coordinate out of bounds')}
if(y.compareTo(BigInteger.ONE)<0||y.compareTo(n.subtract(BigInteger.ONE))>0){throw new Error('y coordinate out of bounds')}
if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}
if(this.multiply(n).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}
return!0};ec.CurveFp=function(q,a,b){this.q=q;this.a=this.fromBigInteger(a);this.b=this.fromBigInteger(b);this.infinity=new ec.PointFp(this,null,null);this.reducer=new Barrett(this.q)}
ec.CurveFp.prototype.getQ=function(){return this.q};ec.CurveFp.prototype.getA=function(){return this.a};ec.CurveFp.prototype.getB=function(){return this.b};ec.CurveFp.prototype.equals=function(other){if(other==this)return!0;return(this.q.equals(other.q)&&this.a.equals(other.a)&&this.b.equals(other.b))};ec.CurveFp.prototype.getInfinity=function(){return this.infinity};ec.CurveFp.prototype.fromBigInteger=function(x){return new ec.FieldElementFp(this.q,x)};ec.CurveFp.prototype.reduce=function(x){this.reducer.reduce(x)};ec.CurveFp.prototype.decodePointHex=function(s){var firstByte=parseInt(s.substr(0,2),16);switch(firstByte){case 0:return this.infinity;case 2:case 3:var yTilde=firstByte&1;var xHex=s.substr(2,s.length-2);var X1=new BigInteger(xHex,16);return this.decompressPoint(yTilde,X1);case 4:case 6:case 7:var len=(s.length-2)/2;var xHex=s.substr(2,len);var yHex=s.substr(len+2,len);return new ec.PointFp(this,this.fromBigInteger(new BigInteger(xHex,16)),this.fromBigInteger(new BigInteger(yHex,16)));default:return null}};ec.CurveFp.prototype.encodePointHex=function(p){if(p.isInfinity())return"00";var xHex=p.getX().toBigInteger().toString(16);var yHex=p.getY().toBigInteger().toString(16);var oLen=this.getQ().toString(16).length;if((oLen%2)!=0)oLen++;while(xHex.length<oLen){xHex="0"+xHex}
while(yHex.length<oLen){yHex="0"+yHex}
return"04"+xHex+yHex};ec.CurveFp.prototype.decompressPoint=function(yTilde,X1){var x=this.fromBigInteger(X1);var alpha=x.multiply(x.square().add(this.getA())).add(this.getB());var beta=alpha.sqrt();if(beta==null)throw new Error("Invalid point compression");var betaValue=beta.toBigInteger();var bit0=betaValue.testBit(0)?1:0;if(bit0!=yTilde){beta=this.fromBigInteger(this.getQ().subtract(betaValue))}
return new ec.PointFp(this,x,beta,null,!0)};ec.fromHex=function(s){return new BigInteger(s,16)};ec.integerToBytes=function(i,len){var bytes=i.toByteArrayUnsigned();if(len<bytes.length){bytes=bytes.slice(bytes.length-len)}else while(len>bytes.length){bytes.unshift(0)}
return bytes};ec.X9Parameters=function(curve,g,n,h){this.curve=curve;this.g=g;this.n=n;this.h=h}
ec.X9Parameters.prototype.getCurve=function(){return this.curve};ec.X9Parameters.prototype.getG=function(){return this.g};ec.X9Parameters.prototype.getN=function(){return this.n};ec.X9Parameters.prototype.getH=function(){return this.h};ec.secNamedCurves={"secp256k1":function(){var p=ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");var a=BigInteger.ZERO;var b=ec.fromHex("7");var n=ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");var h=BigInteger.ONE;var curve=new ec.CurveFp(p,a,b);var G=curve.decodePointHex("04"+"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"+"483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");return new ec.X9Parameters(curve,G,n,h)}};ec.getSECCurveByName=function(name){if(ec.secNamedCurves[name]==undefined)return null;return ec.secNamedCurves[name]()}})();(function(){var bitjs=window.bitjs=function(){};bitjs.pub=0x23;bitjs.priv=0xa3;bitjs.compressed=!1;bitjs.privkey2wif=function(h){var r=Crypto.util.hexToBytes(h);if(bitjs.compressed==!0){r.push(0x01)}
r.unshift(bitjs.priv);var hash=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0});var checksum=hash.slice(0,4);return B58.encode(r.concat(checksum))}
bitjs.wif2privkey=function(wif){var compressed=!1;var decode=B58.decode(wif);var key=decode.slice(0,decode.length-4);key=key.slice(1,key.length);if(key.length>=33&&key[key.length-1]==0x01){key=key.slice(0,key.length-1);compressed=!0}
return{'privkey':Crypto.util.bytesToHex(key),'compressed':compressed}}
bitjs.wif2pubkey=function(wif){var compressed=bitjs.compressed;var r=bitjs.wif2privkey(wif);bitjs.compressed=r.compressed;var pubkey=bitjs.newPubkey(r.privkey);bitjs.compressed=compressed;return{'pubkey':pubkey,'compressed':r.compressed}}
bitjs.wif2address=function(wif){var r=bitjs.wif2pubkey(wif);return{'address':bitjs.pubkey2address(r.pubkey),'compressed':r.compressed}}
bitjs.newPubkey=function(hash){var privateKeyBigInt=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(hash));var curve=EllipticCurve.getSECCurveByName("secp256k1");var curvePt=curve.getG().multiply(privateKeyBigInt);var x=curvePt.getX().toBigInteger();var y=curvePt.getY().toBigInteger();var publicKeyBytes=EllipticCurve.integerToBytes(x,32);publicKeyBytes=publicKeyBytes.concat(EllipticCurve.integerToBytes(y,32));publicKeyBytes.unshift(0x04);if(bitjs.compressed==!0){var publicKeyBytesCompressed=EllipticCurve.integerToBytes(x,32)
if(y.isEven()){publicKeyBytesCompressed.unshift(0x02)}else{publicKeyBytesCompressed.unshift(0x03)}
return Crypto.util.bytesToHex(publicKeyBytesCompressed)}else{return Crypto.util.bytesToHex(publicKeyBytes)}}
bitjs.pubkey2address=function(h,byte){var r=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(h),{asBytes:!0}));r.unshift(byte||bitjs.pub);var hash=Crypto.SHA256(Crypto.SHA256(r,{asBytes:!0}),{asBytes:!0});var checksum=hash.slice(0,4);return B58.encode(r.concat(checksum))}
bitjs.transaction=function(){var btrx={};btrx.version=2;btrx.inputs=[];btrx.outputs=[];btrx.locktime=0;btrx.floData="";btrx.addinput=function(txid,index,scriptPubKey,sequence){var o={};o.outpoint={'hash':txid,'index':index};o.script=Crypto.util.hexToBytes(scriptPubKey);o.sequence=sequence||((btrx.locktime==0)?4294967295:0);return this.inputs.push(o)}
btrx.addoutput=function(address,value){var o={};var buf=[];var addrDecoded=btrx.addressDecode(address);o.value=new BigInteger(''+Math.round((value*1)*1e8),10);buf.push(118);buf.push(169);buf.push(addrDecoded.length);buf=buf.concat(addrDecoded);buf.push(136);buf.push(172);o.script=buf;return this.outputs.push(o)}
btrx.addflodata=function(txcomments){this.floData=txcomments;return this.floData}
btrx.addressDecode=function(address){var bytes=B58.decode(address);var front=bytes.slice(0,bytes.length-4);var back=bytes.slice(bytes.length-4);var checksum=Crypto.SHA256(Crypto.SHA256(front,{asBytes:!0}),{asBytes:!0}).slice(0,4);if(checksum+""==back+""){return front.slice(1)}}
btrx.transactionHash=function(index,sigHashType){var clone=bitjs.clone(this);var shType=sigHashType||1;for(var i=0;i<clone.inputs.length;i++){if(index!=i){clone.inputs[i].script=[]}}
if((clone.inputs)&&clone.inputs[index]){if(shType==1){}else if(shType==2){clone.outputs=[];for(var i=0;i<clone.inputs.length;i++){if(index!=i){clone.inputs[i].sequence=0}}}else if(shType==3){clone.outputs.length=index+1;for(var i=0;i<index;i++){clone.outputs[i].value=-1;clone.outputs[i].script=[]}
for(var i=0;i<clone.inputs.length;i++){if(index!=i){clone.inputs[i].sequence=0}}}else if(shType>=128){clone.inputs=[clone.inputs[index]];if(shType==129){}else if(shType==130){clone.outputs=[]}else if(shType==131){clone.outputs.length=index+1;for(var i=0;i<index;i++){clone.outputs[i].value=-1;clone.outputs[i].script=[]}}}
var buffer=Crypto.util.hexToBytes(clone.serialize());buffer=buffer.concat(bitjs.numToBytes(parseInt(shType),4));var hash=Crypto.SHA256(buffer,{asBytes:!0});var r=Crypto.util.bytesToHex(Crypto.SHA256(hash,{asBytes:!0}));return r}else{return!1}}
btrx.transactionSig=function(index,wif,sigHashType,txhash){function serializeSig(r,s){var rBa=r.toByteArraySigned();var sBa=s.toByteArraySigned();var sequence=[];sequence.push(0x02);sequence.push(rBa.length);sequence=sequence.concat(rBa);sequence.push(0x02);sequence.push(sBa.length);sequence=sequence.concat(sBa);sequence.unshift(sequence.length);sequence.unshift(0x30);return sequence}
var shType=sigHashType||1;var hash=txhash||Crypto.util.hexToBytes(this.transactionHash(index,shType));if(hash){var curve=EllipticCurve.getSECCurveByName("secp256k1");var key=bitjs.wif2privkey(wif);var priv=BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(key.privkey));var n=curve.getN();var e=BigInteger.fromByteArrayUnsigned(hash);var badrs=0
do{var k=this.deterministicK(wif,hash,badrs);var G=curve.getG();var Q=G.multiply(k);var r=Q.getX().toBigInteger().mod(n);var s=k.modInverse(n).multiply(e.add(priv.multiply(r))).mod(n);badrs++}while(r.compareTo(BigInteger.ZERO)<=0||s.compareTo(BigInteger.ZERO)<=0);var halfn=n.shiftRight(1);if(s.compareTo(halfn)>0){s=n.subtract(s)};var sig=serializeSig(r,s);sig.push(parseInt(shType,10));return Crypto.util.bytesToHex(sig)}else{return!1}}
btrx.deterministicK=function(wif,hash,badrs){badrs=badrs||0;var key=bitjs.wif2privkey(wif);var x=Crypto.util.hexToBytes(key.privkey)
var curve=EllipticCurve.getSECCurveByName("secp256k1");var N=curve.getN();var v=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];var k=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];k=Crypto.HMAC(Crypto.SHA256,v.concat([0]).concat(x).concat(hash),k,{asBytes:!0});v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});k=Crypto.HMAC(Crypto.SHA256,v.concat([1]).concat(x).concat(hash),k,{asBytes:!0});v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});var T=[];v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});T=v;var KBigInt=BigInteger.fromByteArrayUnsigned(T);var i=0
while(KBigInt.compareTo(N)>=0||KBigInt.compareTo(BigInteger.ZERO)<=0||i<badrs){k=Crypto.HMAC(Crypto.SHA256,v.concat([0]),k,{asBytes:!0});v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});v=Crypto.HMAC(Crypto.SHA256,v,k,{asBytes:!0});T=v;KBigInt=BigInteger.fromByteArrayUnsigned(T);i++};return KBigInt};btrx.signinput=function(index,wif,sigHashType){var key=bitjs.wif2pubkey(wif);var shType=sigHashType||1;var signature=this.transactionSig(index,wif,shType);var buf=[];var sigBytes=Crypto.util.hexToBytes(signature);buf.push(sigBytes.length);buf=buf.concat(sigBytes);var pubKeyBytes=Crypto.util.hexToBytes(key.pubkey);buf.push(pubKeyBytes.length);buf=buf.concat(pubKeyBytes);this.inputs[index].script=buf;return!0}
btrx.sign=function(wif,sigHashType){var shType=sigHashType||1;for(var i=0;i<this.inputs.length;i++){this.signinput(i,wif,shType)}
return this.serialize()}
btrx.serialize=function(){var buffer=[];buffer=buffer.concat(bitjs.numToBytes(parseInt(this.version),4));buffer=buffer.concat(bitjs.numToVarInt(this.inputs.length));for(var i=0;i<this.inputs.length;i++){var txin=this.inputs[i];buffer=buffer.concat(Crypto.util.hexToBytes(txin.outpoint.hash).reverse());buffer=buffer.concat(bitjs.numToBytes(parseInt(txin.outpoint.index),4));var scriptBytes=txin.script;buffer=buffer.concat(bitjs.numToVarInt(scriptBytes.length));buffer=buffer.concat(scriptBytes);buffer=buffer.concat(bitjs.numToBytes(parseInt(txin.sequence),4))}
buffer=buffer.concat(bitjs.numToVarInt(this.outputs.length));for(var i=0;i<this.outputs.length;i++){var txout=this.outputs[i];buffer=buffer.concat(bitjs.numToBytes(txout.value,8));var scriptBytes=txout.script;buffer=buffer.concat(bitjs.numToVarInt(scriptBytes.length));buffer=buffer.concat(scriptBytes)}
buffer=buffer.concat(bitjs.numToBytes(parseInt(this.locktime),4));flohex=ascii_to_hexa(this.floData);floDataCount=this.floData.length;if(floDataCount<=16){floDataCountString=floDataCount.toString(16);floDataCountString="0"+floDataCountString}else if(floDataCount<253){floDataCountString=floDataCount.toString(16)}else if(floDataCount<=1023){floDataCountAdjusted=(floDataCount-253)+parseInt("0xfd00fd");floDataCountStringAdjusted=floDataCountAdjusted.toString(16);floDataCountString=floDataCountStringAdjusted.substr(0,2)+floDataCountStringAdjusted.substr(4,2)+floDataCountStringAdjusted.substr(2,2)}else{floDataCountString="Character Limit Exceeded"}
return Crypto.util.bytesToHex(buffer)+floDataCountString+flohex}
return btrx}
bitjs.numToBytes=function(num,bytes){if(typeof bytes==="undefined")bytes=8;if(bytes==0){return[]}else if(num==-1){return Crypto.util.hexToBytes("ffffffffffffffff")}else{return[num%256].concat(bitjs.numToBytes(Math.floor(num/256),bytes-1))}}
bitjs.numToByteArray=function(num){if(num<=256){return[num]}else{return[num%256].concat(bitjs.numToByteArray(Math.floor(num/256)))}}
bitjs.numToVarInt=function(num){if(num<253){return[num]}else if(num<65536){return[253].concat(bitjs.numToBytes(num,2))}else if(num<4294967296){return[254].concat(bitjs.numToBytes(num,4))}else{return[255].concat(bitjs.numToBytes(num,8))}}
bitjs.bytesToNum=function(bytes){if(bytes.length==0)return 0;else return bytes[0]+256*bitjs.bytesToNum(bytes.slice(1))}
bitjs.clone=function(obj){if(obj==null||typeof(obj)!='object')return obj;var temp=new obj.constructor();for(var key in obj){if(obj.hasOwnProperty(key)){temp[key]=bitjs.clone(obj[key])}}
return temp}
var B58=bitjs.Base58={alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",validRegex:/^[1-9A-HJ-NP-Za-km-z]+$/,base:BigInteger.valueOf(58),encode:function(input){var bi=BigInteger.fromByteArrayUnsigned(input);var chars=[];while(bi.compareTo(B58.base)>=0){var mod=bi.mod(B58.base);chars.unshift(B58.alphabet[mod.intValue()]);bi=bi.subtract(mod).divide(B58.base)}
chars.unshift(B58.alphabet[bi.intValue()]);for(var i=0;i<input.length;i++){if(input[i]==0x00){chars.unshift(B58.alphabet[0])}else break}
return chars.join('')},decode:function(input){var bi=BigInteger.valueOf(0);var leadingZerosNum=0;for(var i=input.length-1;i>=0;i--){var alphaIndex=B58.alphabet.indexOf(input[i]);if(alphaIndex<0){throw "Invalid character"}
bi=bi.add(BigInteger.valueOf(alphaIndex).multiply(B58.base.pow(input.length-1-i)));if(input[i]=="1")leadingZerosNum++;else leadingZerosNum=0}
var bytes=bi.toByteArrayUnsigned();while(leadingZerosNum-->0)bytes.unshift(0);return bytes}}
return bitjs})();(function(exports){var Bitcoin=exports})('object'===typeof module?module.exports:(window.Bitcoin={}));(function(Bitcoin){Bitcoin.Base58={alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",validRegex:/^[1-9A-HJ-NP-Za-km-z]+$/,base:BigInteger.valueOf(58),encode:function(input){var bi=BigInteger.fromByteArrayUnsigned(input);var chars=[];while(bi.compareTo(B58.base)>=0){var mod=bi.mod(B58.base);chars.unshift(B58.alphabet[mod.intValue()]);bi=bi.subtract(mod).divide(B58.base)}
chars.unshift(B58.alphabet[bi.intValue()]);for(var i=0;i<input.length;i++){if(input[i]==0x00){chars.unshift(B58.alphabet[0])}else break}
return chars.join('')},decode:function(input){var bi=BigInteger.valueOf(0);var leadingZerosNum=0;for(var i=input.length-1;i>=0;i--){var alphaIndex=B58.alphabet.indexOf(input[i]);if(alphaIndex<0){throw "Invalid character"}
bi=bi.add(BigInteger.valueOf(alphaIndex).multiply(B58.base.pow(input.length-1-i)));if(input[i]=="1")leadingZerosNum++;else leadingZerosNum=0}
var bytes=bi.toByteArrayUnsigned();while(leadingZerosNum-->0)bytes.unshift(0);return bytes}};var B58=Bitcoin.Base58})('undefined'!=typeof Bitcoin?Bitcoin:module.exports);Bitcoin.Address=function(bytes){if(floGlobals.blockchain=="FLO")
this.version=0x23;else if(floGlobals.blockchain=="FLO_TEST")
this.version=0x73;if("string"==typeof bytes){bytes=Bitcoin.Address.decodeString(bytes,this.version)}
this.hash=bytes};Bitcoin.Address.networkVersion=0x23;Bitcoin.Address.prototype.toString=function(){var hash=this.hash.slice(0);hash.unshift(this.version);var checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});var bytes=hash.concat(checksum.slice(0,4));return Bitcoin.Base58.encode(bytes)};Bitcoin.Address.prototype.getHashBase64=function(){return Crypto.util.bytesToBase64(this.hash)};Bitcoin.Address.decodeString=function(string,version){var bytes=Bitcoin.Base58.decode(string);var hash=bytes.slice(0,21);var checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[21]||checksum[1]!=bytes[22]||checksum[2]!=bytes[23]||checksum[3]!=bytes[24]){throw "Checksum validation failed!"}
if(version!=hash.shift()){throw "Version "+hash.shift()+" not supported!"}
return hash};Bitcoin.ECDSA=(function(){var ecparams=EllipticCurve.getSECCurveByName("secp256k1");var rng=new SecureRandom();var P_OVER_FOUR=null;function implShamirsTrick(P,k,Q,l){var m=Math.max(k.bitLength(),l.bitLength());var Z=P.add2D(Q);var R=P.curve.getInfinity();for(var i=m-1;i>=0;--i){R=R.twice2D();R.z=BigInteger.ONE;if(k.testBit(i)){if(l.testBit(i)){R=R.add2D(Z)}else{R=R.add2D(P)}}else{if(l.testBit(i)){R=R.add2D(Q)}}}
return R};var ECDSA={getBigRandom:function(limit){return new BigInteger(limit.bitLength(),rng).mod(limit.subtract(BigInteger.ONE)).add(BigInteger.ONE)},sign:function(hash,priv){var d=priv;var n=ecparams.getN();var e=BigInteger.fromByteArrayUnsigned(hash);do{var k=ECDSA.getBigRandom(n);var G=ecparams.getG();var Q=G.multiply(k);var r=Q.getX().toBigInteger().mod(n)}while(r.compareTo(BigInteger.ZERO)<=0);var s=k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);return ECDSA.serializeSig(r,s)},verify:function(hash,sig,pubkey){var r,s;if(Bitcoin.Util.isArray(sig)){var obj=ECDSA.parseSig(sig);r=obj.r;s=obj.s}else if("object"===typeof sig&&sig.r&&sig.s){r=sig.r;s=sig.s}else{throw "Invalid value for signature"}
var Q;if(pubkey instanceof ec.PointFp){Q=pubkey}else if(Bitcoin.Util.isArray(pubkey)){Q=EllipticCurve.PointFp.decodeFrom(ecparams.getCurve(),pubkey)}else{throw "Invalid format for pubkey value, must be byte array or ec.PointFp"}
var e=BigInteger.fromByteArrayUnsigned(hash);return ECDSA.verifyRaw(e,r,s,Q)},verifyRaw:function(e,r,s,Q){var n=ecparams.getN();var G=ecparams.getG();if(r.compareTo(BigInteger.ONE)<0||r.compareTo(n)>=0)
return!1;if(s.compareTo(BigInteger.ONE)<0||s.compareTo(n)>=0)
return!1;var c=s.modInverse(n);var u1=e.multiply(c).mod(n);var u2=r.multiply(c).mod(n);var point=G.multiply(u1).add(Q.multiply(u2));var v=point.getX().toBigInteger().mod(n);return v.equals(r)},serializeSig:function(r,s){var rBa=r.toByteArraySigned();var sBa=s.toByteArraySigned();var sequence=[];sequence.push(0x02);sequence.push(rBa.length);sequence=sequence.concat(rBa);sequence.push(0x02);sequence.push(sBa.length);sequence=sequence.concat(sBa);sequence.unshift(sequence.length);sequence.unshift(0x30);return sequence},parseSig:function(sig){var cursor;if(sig[0]!=0x30)
throw new Error("Signature not a valid DERSequence");cursor=2;if(sig[cursor]!=0x02)
throw new Error("First element in signature must be a DERInteger");var rBa=sig.slice(cursor+2,cursor+2+sig[cursor+1]);cursor+=2+sig[cursor+1];if(sig[cursor]!=0x02)
throw new Error("Second element in signature must be a DERInteger");var sBa=sig.slice(cursor+2,cursor+2+sig[cursor+1]);cursor+=2+sig[cursor+1];var r=BigInteger.fromByteArrayUnsigned(rBa);var s=BigInteger.fromByteArrayUnsigned(sBa);return{r:r,s:s}},parseSigCompact:function(sig){if(sig.length!==65){throw "Signature has the wrong length"}
var i=sig[0]-27;if(i<0||i>7){throw "Invalid signature type"}
var n=ecparams.getN();var r=BigInteger.fromByteArrayUnsigned(sig.slice(1,33)).mod(n);var s=BigInteger.fromByteArrayUnsigned(sig.slice(33,65)).mod(n);return{r:r,s:s,i:i}},recoverPubKey:function(r,s,hash,i){i=i&3;var isYEven=i&1;var isSecondKey=i>>1;var n=ecparams.getN();var G=ecparams.getG();var curve=ecparams.getCurve();var p=curve.getQ();var a=curve.getA().toBigInteger();var b=curve.getB().toBigInteger();if(!P_OVER_FOUR){P_OVER_FOUR=p.add(BigInteger.ONE).divide(BigInteger.valueOf(4))}
var x=isSecondKey?r.add(n):r;var alpha=x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p);var beta=alpha.modPow(P_OVER_FOUR,p);var xorOdd=beta.isEven()?(i%2):((i+1)%2);var y=(beta.isEven()?!isYEven:isYEven)?beta:p.subtract(beta);var R=new EllipticCurve.PointFp(curve,curve.fromBigInteger(x),curve.fromBigInteger(y));R.validate();var e=BigInteger.fromByteArrayUnsigned(hash);var eNeg=BigInteger.ZERO.subtract(e).mod(n);var rInv=r.modInverse(n);var Q=implShamirsTrick(R,s,G,eNeg).multiply(rInv);Q.validate();if(!ECDSA.verifyRaw(e,r,s,Q)){throw "Pubkey recovery unsuccessful"}
var pubKey=new Bitcoin.ECKey();pubKey.pub=Q;return pubKey},calcPubkeyRecoveryParam:function(address,r,s,hash){for(var i=0;i<4;i++){try{var pubkey=Bitcoin.ECDSA.recoverPubKey(r,s,hash,i);if(pubkey.getBitcoinAddress().toString()==address){return i}}catch(e){}}
throw "Unable to find valid recovery factor"}};return ECDSA})();Bitcoin.KeyPool=(function(){var KeyPool=function(){this.keyArray=[];this.push=function(item){if(item==null||item.priv==null)return;var doAdd=!0;for(var index in this.keyArray){var currentItem=this.keyArray[index];if(currentItem!=null&&currentItem.priv!=null&&item.getBitcoinAddress()==currentItem.getBitcoinAddress()){doAdd=!1;break}}
if(doAdd)this.keyArray.push(item)};this.reset=function(){this.keyArray=[]};this.getArray=function(){return this.keyArray.slice(0)};this.setArray=function(ka){this.keyArray=ka};this.length=function(){return this.keyArray.length};this.toString=function(){var keyPoolString="# = "+this.length()+"\n";var pool=this.getArray();for(var index in pool){var item=pool[index];if(Bitcoin.Util.hasMethods(item,'getBitcoinAddress','toString')){if(item!=null){keyPoolString+="\""+item.getBitcoinAddress()+"\""+", \""+item.toString("wif")+"\"\n"}}}
return keyPoolString};return this};return new KeyPool()})();Bitcoin.Bip38Key=(function(){var Bip38=function(address,encryptedKey){this.address=address;this.priv=encryptedKey};Bip38.prototype.getBitcoinAddress=function(){return this.address};Bip38.prototype.toString=function(){return this.priv};return Bip38})();Bitcoin.ECKey=(function(){var ECDSA=Bitcoin.ECDSA;var KeyPool=Bitcoin.KeyPool;var ecparams=EllipticCurve.getSECCurveByName("secp256k1");var ECKey=function(input){if(!input){var n=ecparams.getN();this.priv=ECDSA.getBigRandom(n)}else if(input instanceof BigInteger){this.priv=input}else if(Bitcoin.Util.isArray(input)){this.priv=BigInteger.fromByteArrayUnsigned(input)}else if("string"==typeof input){var bytes=null;try{if(((floGlobals.blockchain=="FLO")&&/^R[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(input))||((floGlobals.blockchain=="FLO_TEST")&&/^c[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(input))){bytes=ECKey.decodeCompressedWalletImportFormat(input);this.compressed=!0}else if(ECKey.isHexFormat(input)){bytes=Crypto.util.hexToBytes(input)}}catch(exc1){this.setError(exc1)}
if(ECKey.isBase6Format(input)){this.priv=new BigInteger(input,6)}else if(bytes==null||bytes.length!=32){this.priv=null}else{this.priv=BigInteger.fromByteArrayUnsigned(bytes)}}
this.compressed=(this.compressed==undefined)?!!ECKey.compressByDefault:this.compressed;try{if(this.priv!=null&&BigInteger.ZERO.compareTo(this.priv)==0)this.setError("Error: BigInteger equal to zero.");var hexKeyRangeLimit="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140";var rangeLimitBytes=Crypto.util.hexToBytes(hexKeyRangeLimit);var limitBigInt=BigInteger.fromByteArrayUnsigned(rangeLimitBytes);if(this.priv!=null&&limitBigInt.compareTo(this.priv)<0)this.setError("Error: BigInteger outside of curve range.")
if(this.priv!=null){KeyPool.push(this)}}catch(exc2){this.setError(exc2)}};if(floGlobals.blockchain=="FLO")
ECKey.privateKeyPrefix=0xA3;else if(floGlobals.blockchain=="FLO_TEST")
ECKey.privateKeyPrefix=0xEF;ECKey.compressByDefault=!1;ECKey.prototype.setError=function(err){this.error=err;this.priv=null;return this};ECKey.prototype.setCompressed=function(v){this.compressed=!!v;if(this.pubPoint)this.pubPoint.compressed=this.compressed;return this};ECKey.prototype.getPub=function(){if(this.compressed){if(this.pubComp)return this.pubComp;return this.pubComp=this.getPubPoint().getEncoded(1)}else{if(this.pubUncomp)return this.pubUncomp;return this.pubUncomp=this.getPubPoint().getEncoded(0)}};ECKey.prototype.getPubPoint=function(){if(!this.pubPoint){this.pubPoint=ecparams.getG().multiply(this.priv);this.pubPoint.compressed=this.compressed}
return this.pubPoint};ECKey.prototype.getPubKeyHex=function(){if(this.compressed){if(this.pubKeyHexComp)return this.pubKeyHexComp;return this.pubKeyHexComp=Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase()}else{if(this.pubKeyHexUncomp)return this.pubKeyHexUncomp;return this.pubKeyHexUncomp=Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase()}};ECKey.prototype.getPubKeyHash=function(){if(this.compressed){if(this.pubKeyHashComp)return this.pubKeyHashComp;return this.pubKeyHashComp=Bitcoin.Util.sha256ripe160(this.getPub())}else{if(this.pubKeyHashUncomp)return this.pubKeyHashUncomp;return this.pubKeyHashUncomp=Bitcoin.Util.sha256ripe160(this.getPub())}};ECKey.prototype.getBitcoinAddress=function(){var hash=this.getPubKeyHash();var addr=new Bitcoin.Address(hash);return addr.toString()};ECKey.prototype.setPub=function(pub){if(Bitcoin.Util.isArray(pub)){pub=Crypto.util.bytesToHex(pub).toString().toUpperCase()}
var ecPoint=ecparams.getCurve().decodePointHex(pub);this.setCompressed(ecPoint.compressed);this.pubPoint=ecPoint;return this};ECKey.prototype.getBitcoinWalletImportFormat=function(){var bytes=this.getBitcoinPrivateKeyByteArray();if(bytes==null)return"";bytes.unshift(ECKey.privateKeyPrefix);if(this.compressed)bytes.push(0x01);var checksum=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0});bytes=bytes.concat(checksum.slice(0,4));var privWif=Bitcoin.Base58.encode(bytes);return privWif};ECKey.prototype.getBitcoinHexFormat=function(){return Crypto.util.bytesToHex(this.getBitcoinPrivateKeyByteArray()).toString().toUpperCase()};ECKey.prototype.getBitcoinBase64Format=function(){return Crypto.util.bytesToBase64(this.getBitcoinPrivateKeyByteArray())};ECKey.prototype.getBitcoinPrivateKeyByteArray=function(){if(this.priv==null)return null;var bytes=this.priv.toByteArrayUnsigned();while(bytes.length<32)bytes.unshift(0x00);return bytes};ECKey.prototype.toString=function(format){format=format||"";if(format.toString().toLowerCase()=="base64"||format.toString().toLowerCase()=="b64"){return this.getBitcoinBase64Format()}
else if(format.toString().toLowerCase()=="wif"){return this.getBitcoinWalletImportFormat()}
else{return this.getBitcoinHexFormat()}};ECKey.prototype.sign=function(hash){return ECDSA.sign(hash,this.priv)};ECKey.prototype.verify=function(hash,sig){return ECDSA.verify(hash,sig,this.getPub())};ECKey.decodeWalletImportFormat=function(privStr){var bytes=Bitcoin.Base58.decode(privStr);var hash=bytes.slice(0,33);var checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[33]||checksum[1]!=bytes[34]||checksum[2]!=bytes[35]||checksum[3]!=bytes[36]){throw "Checksum validation failed!"}
var version=hash.shift();if(version!=ECKey.privateKeyPrefix){throw "Version "+version+" not supported!"}
return hash};ECKey.decodeCompressedWalletImportFormat=function(privStr){var bytes=Bitcoin.Base58.decode(privStr);var hash=bytes.slice(0,34);var checksum=Crypto.SHA256(Crypto.SHA256(hash,{asBytes:!0}),{asBytes:!0});if(checksum[0]!=bytes[34]||checksum[1]!=bytes[35]||checksum[2]!=bytes[36]||checksum[3]!=bytes[37]){throw "Checksum validation failed!"}
var version=hash.shift();if(version!=ECKey.privateKeyPrefix){throw "Version "+version+" not supported!"}
hash.pop();return hash};ECKey.isHexFormat=function(key){key=key.toString();return/^[A-Fa-f0-9]{64}$/.test(key)};ECKey.isWalletImportFormat=function(key){key=key.toString();return(ECKey.privateKeyPrefix==0x80)?(/^5[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key)):(/^R[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key))};ECKey.isCompressedWalletImportFormat=function(key){key=key.toString();return(ECKey.privateKeyPrefix==0x80)?(/^[LK][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key)):(/^R[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key))};ECKey.isBase64Format=function(key){key=key.toString();return(/^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=+\/]{44}$/.test(key))};ECKey.isBase6Format=function(key){key=key.toString();return(/^[012345]{99}$/.test(key))};ECKey.isMiniFormat=function(key){key=key.toString();var validChars22=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}$/.test(key);var validChars26=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}$/.test(key);var validChars30=/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}$/.test(key);var testBytes=Crypto.SHA256(key+"?",{asBytes:!0});return((testBytes[0]===0x00||testBytes[0]===0x01)&&(validChars22||validChars26||validChars30))};return ECKey})();Bitcoin.Util={isArray:Array.isArray||function(o){return Object.prototype.toString.call(o)==='[object Array]'},makeFilledArray:function(len,val){var array=[];var i=0;while(i<len){array[i++]=val}
return array},numToVarInt:function(i){if(i<0xfd){return[i]}else if(i<=1<<16){return[0xfd,i>>>8,i&255]}else if(i<=1<<32){return[0xfe].concat(Crypto.util.wordsToBytes([i]))}else{return[0xff].concat(Crypto.util.wordsToBytes([i>>>32,i]))}},valueToBigInt:function(valueBuffer){if(valueBuffer instanceof BigInteger)return valueBuffer;return BigInteger.fromByteArrayUnsigned(valueBuffer)},formatValue:function(valueBuffer){var value=this.valueToBigInt(valueBuffer).toString();var integerPart=value.length>8?value.substr(0,value.length-8):'0';var decimalPart=value.length>8?value.substr(value.length-8):value;while(decimalPart.length<8)decimalPart="0"+decimalPart;decimalPart=decimalPart.replace(/0*$/,'');while(decimalPart.length<2)decimalPart+="0";return integerPart+"."+decimalPart},parseValue:function(valueString){var valueComp=valueString.split('.');var integralPart=valueComp[0];var fractionalPart=valueComp[1]||"0";while(fractionalPart.length<8)fractionalPart+="0";fractionalPart=fractionalPart.replace(/^0+/g,'');var value=BigInteger.valueOf(parseInt(integralPart));value=value.multiply(BigInteger.valueOf(100000000));value=value.add(BigInteger.valueOf(parseInt(fractionalPart)));return value},sha256ripe160:function(data){return ripemd160(Crypto.SHA256(data,{asBytes:!0}),{asBytes:!0})},dsha256:function(data){return Crypto.SHA256(Crypto.SHA256(data,{asBytes:!0}),{asBytes:!0})},hasMethods:function(obj){var i=1,methodName;while((methodName=arguments[i++])){if(typeof obj[methodName]!='function'){return!1}}
return!0}}
const floCrypto={generateNewID:function(){try{var key=new Bitcoin.ECKey(!1);key.setCompressed(!0);return{floID:key.getBitcoinAddress(),pubKey:key.getPubKeyHex(),privKey:key.getBitcoinWalletImportFormat()}}catch(e){console.log(e)}},getPubKeyHex:function(privateKeyHex){var key=new Bitcoin.ECKey(privateKeyHex);if(key.priv==null)
return;key.setCompressed(!0);var pubkeyHex=key.getPubKeyHex();return pubkeyHex},getFloIDfromPubkeyHex:function(pubkeyHex){var key=new Bitcoin.ECKey().setPub(pubkeyHex);var floID=key.getBitcoinAddress();return floID},verifyPrivKey:function(privateKeyHex,pubKey_floID,isfloID=!0){try{var key=new Bitcoin.ECKey(privateKeyHex);if(key.priv==null)
return!1;key.setCompressed(!0);if(isfloID&&pubKey_floID==key.getBitcoinAddress())
return!0;else if(!isfloID&&pubKey_floID==key.getPubKeyHex())
return!0;else return!1}catch(e){console.log(e)}},validateAddr:function(inpAddr){try{var addr=new Bitcoin.Address(inpAddr);return!0}catch{return!1}}}
const floBlockchainAPI={promisedAJAX:function(method,uri){return new Promise((resolve,reject)=>{var request=new XMLHttpRequest();var url=`${floGlobals.apiURL[floGlobals.blockchain]}/${uri}`;console.log(url)
request.open(method,url,!0);request.onload=(evt)=>{if(request.readyState==4&&request.status==200)
resolve(request.response);else reject(request.response)};request.send()})},getBalance:function(addr){return new Promise((resolve,reject)=>{this.promisedAJAX("GET",`api/addr/${addr}/balance`).then(balance=>{resolve(balance)}).catch(error=>{reject(error)})})},sendTx:function(senderAddr,receiverAddr,sendAmt,PrivKey,floData=''){return new Promise((resolve,reject)=>{if(!floCrypto.validateAddr(senderAddr))
reject(`Invalid address : ${senderAddr}`);else if(!floCrypto.validateAddr(receiverAddr))
reject(`Invalid address : ${receiverAddr}`);if(PrivKey.length<1||!floCrypto.verifyPrivKey(PrivKey,senderAddr))
reject("Invalid Private key!");else if(typeof sendAmt!=='number'||sendAmt<=0)
reject(`Invalid sendAmt : ${sendAmt}`);else{var trx=bitjs.transaction();var utxoAmt=0.0;var fee=floGlobals.fee;this.promisedAJAX("GET",`api/addr/${senderAddr}/utxo`).then(response=>{var utxos=JSON.parse(response);for(var i=utxos.length-1;(i>=0)&&(utxoAmt<sendAmt+fee);i--){if(utxos[i].confirmations){trx.addinput(utxos[i].txid,utxos[i].vout,utxos[i].scriptPubKey)
utxoAmt+=utxos[i].amount}else break}
if(utxoAmt<sendAmt+fee)
reject("Insufficient balance!");else{trx.addoutput(receiverAddr,sendAmt);var change=utxoAmt-sendAmt-fee;if(change>0)
trx.addoutput(senderAddr,change);trx.addflodata(floData);var signedTxHash=trx.sign(PrivKey,1);this.broadcastTx(signedTxHash).then(txid=>{resolve(txid)}).catch(error=>{reject(error)})}}).catch(error=>{reject(error)})}})},broadcastTx:function(signedTxHash){return new Promise((resolve,reject)=>{var request=new XMLHttpRequest();var url=`${floGlobals.apiURL[floGlobals.blockchain]}/api/tx/send`;if(signedTxHash.length<1)
reject("Empty Signature");else{var params=`{"rawtx":"${signedTxHash}"}`;var result;request.open('POST',url,!1);request.setRequestHeader('Content-type','application/json');request.onload=function(){if(request.readyState==4&&request.status==200){console.log(request.response);resolve(JSON.parse(request.response).txid.result)}else reject(request.responseText)}
request.send(params)}})},getNewTxs:function(addr,ignoreOld){return new Promise((resolve,reject)=>{this.promisedAJAX("GET",`api/addrs/${addr}/txs?from=0&to=1`).then(response=>{var newItems=JSON.parse(response).totalItems-ignoreOld;this.promisedAJAX("GET",`api/addrs/${addr}/txs?from=0&to=${newItems*2}`).then(response=>{response=JSON.parse(response)
var filteredData=[];for(i=response.totalItems-ignoreOld-1;i>=0;i--){if(response.items[i].isCoinBase){var item={time:response.items[i].time,txid:response.items[i].txid,sender:'(mined)'+response.items[i].vin[0].coinbase,receiver:addr,floData:response.items[i].floData}}else{var item={time:response.items[i].time,txid:response.items[i].txid,sender:response.items[i].vin[0].addr,receiver:response.items[i].vout[0].scriptPubKey.addresses[0],floData:response.items[i].floData}}
filteredData.push(item)}
resolve({totalItems:response.totalItems,items:filteredData})}).catch(error=>{reject(error)})}).catch(error=>{reject(error)})})}}
window.indexedDB=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;window.IDBTransaction=window.IDBTransaction||window.webkitIDBTransaction||window.msIDBTransaction;window.IDBKeyRange=window.IDBKeyRange||window.webkitIDBKeyRange||window.msIDBKeyRange;if(!window.indexedDB)
window.alert("Your browser doesn't support a stable version of IndexedDB.")
const compactIDB={setDefaultDB:function(dbName){this.dbName=dbName},initDB:function(dbName,objectStores={}){return new Promise((resolve,reject)=>{this.dbName=this.dbName||dbName;var idb=indexedDB.open(dbName);idb.onerror=(event)=>{reject("Error in opening IndexedDB!")};idb.onupgradeneeded=(event)=>{var db=event.target.result;for(obs in objectStores){var objectStore=db.createObjectStore(obs,objectStores[obs].options||{});if(objectStores[obs].indexes&&typeof objectStores[obs].indexes==='object')
for(i in objectStores[obs].indexes)
objectStore.createIndex(i,i,objectStores[obs].indexes[i]||{})}}
idb.onsuccess=(event)=>{var db=event.target.result;if(JSON.stringify(Object.values(db.objectStoreNames).sort())===JSON.stringify(Object.keys(objectStores).sort()))
resolve("Initiated IndexedDB");else reject("IndexedDB already exist with different ObjectStores!");db.close()}})},openDB:function(dbName=this.dbName){return new Promise((resolve,reject)=>{var idb=indexedDB.open(dbName);idb.onerror=(event)=>reject("Error in opening IndexedDB!");idb.onsuccess=(event)=>resolve(event.target.result)})},deleteDB:function(dbName=this.dbName){return new Promise((resolve,reject)=>{var deleteReq=indexedDB.deleteDatabase(dbName);deleteReq.onerror=(event)=>reject("Error deleting database!");deleteReq.onsuccess=(event)=>resolve("Database deleted successfully")})},writeData:function(obsName,data,key=!1,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readwrite").objectStore(obsName);let writeReq=(key?obs.put(data,key):obs.put(data));writeReq.onsuccess=(evt)=>resolve(`Write data Successful`);writeReq.onerror=(evt)=>reject(`Write data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},addData:function(obsName,data,key=!1,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readwrite").objectStore(obsName);let addReq=(key?obs.add(data,key):obs.add(data));addReq.onsuccess=(evt)=>resolve(`Add data successful`);addReq.onerror=(evt)=>reject(`Add data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},removeData:function(obsName,key,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readwrite").objectStore(obsName);let delReq=obs.delete(key);delReq.onsuccess=(evt)=>resolve(`Removed Data ${key}`);delReq.onerror=(evt)=>reject(`Remove data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},readData:function(obsName,key,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readonly").objectStore(obsName);let getReq=obs.get(key);getReq.onsuccess=(evt)=>resolve(evt.target.result);getReq.onerror=(evt)=>reject(`Read data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},readAllData:function(obsName,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readonly").objectStore(obsName);var tmpResult={}
let curReq=obs.openCursor();curReq.onsuccess=(evt)=>{var cursor=evt.target.result;if(cursor){tmpResult[cursor.primaryKey]=cursor.value;cursor.continue()}else resolve(tmpResult)}
curReq.onerror=(evt)=>reject(`Read-All data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},getAllData:function(obsName,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readonly").objectStore(obsName);let getReq=obs.getAll();getReq.onsuccess=(evt)=>resolve(evt.target.result);getReq.onerror=(evt)=>reject(`Read data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})},searchData:function(obsName,patternEval,dbName=this.dbName){return new Promise((resolve,reject)=>{this.openDB(dbName).then(db=>{var obs=db.transaction(obsName,"readonly").objectStore(obsName);var filteredResult={}
let curReq=obs.openCursor();curReq.onsuccess=(evt)=>{var cursor=evt.target.result;if(cursor){if(patternEval(cursor.primaryKey,cursor.value))
filteredResult[cursor.primaryKey]=cursor.value;cursor.continue()}else resolve(filteredResult)}
curReq.onerror=(evt)=>reject(`Search unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);db.close()}).catch(error=>reject(error))})}}
floWebWallet={generateNewAddr:function(){return new Promise((resolve,reject)=>{try{var triplet=floCrypto.generateNewID();resolve(triplet)}catch(error){reject(error)}})},recoverAddr:function(privKey){return new Promise((resolve,reject)=>{try{var triplet={}
triplet.privKey=privKey;triplet.pubKey=floCrypto.getPubKeyHex(triplet.privKey);triplet.floID=floCrypto.getFloIDfromPubkeyHex(triplet.pubKey);resolve(triplet)}catch(error){reject(error)}})},sendTransaction:function(sender,receiver,amount,floData,privKey){return new Promise((resolve,reject)=>{floBlockchainAPI.sendTx(sender,receiver,amount,privKey,floData).then(txid=>resolve(txid)).catch(error=>reject(error))})},syncTransactions:function(addr){return new Promise((resolve,reject)=>{compactIDB.readData('lastSync',addr).then(lastSync=>{lastSync=lastSync|0;floBlockchainAPI.getNewTxs(addr,lastSync).then(APIresult=>{compactIDB.readData('transactions',addr).then(IDBresult=>{if(IDBresult===undefined)
var promise1=compactIDB.addData('transactions',APIresult.items,addr)
else var promise1=compactIDB.writeData('transactions',IDBresult.concat(APIresult.items),addr)
var promise2=compactIDB.writeData('lastSync',APIresult.totalItems,addr)
Promise.all([promise1,promise2]).then(values=>resolve(APIresult.items))})})}).catch(error=>reject(error))})},readTransactions:function(addr){return new Promise((resolve,reject)=>{compactIDB.readData('transactions',addr).then(IDBresult=>resolve(IDBresult)).catch(error=>reject(error))})},getLabels:function(){return new Promise((resolve,reject)=>{compactIDB.readAllData('labels').then(IDBresult=>resolve(IDBresult)).catch(error=>reject(error))})}}
function onLoadStartUp(){var IDBObjects={lastSync:{},labels:{},transactions:{}}
compactIDB.initDB("FLO_webWallet",IDBObjects).then(result=>console.log(result)).catch(error=>console.log(error))
createAllCards();setElements()}
</script>
</body>
</html>