From cb3f5f8b932156df9078085e77bef493eca1581b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 16 Apr 2017 18:49:06 +0300 Subject: [PATCH 1/4] cmd/faucet: double check user against the GH website --- cmd/faucet/faucet.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index fd34cdec1..c418da818 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -306,7 +306,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { websocket.JSON.Send(conn, map[string]string{"error": "URL doesn't link to GitHub Gists"}) continue } - log.Info("Faucet funds requested", "gist", msg.URL) + log.Info("Faucet funds requested", "addr", conn.RemoteAddr(), "gist", msg.URL) // Retrieve the gist from the GitHub Gist APIs parts := strings.Split(msg.URL, "/") @@ -348,6 +348,17 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { websocket.JSON.Send(conn, map[string]string{"error": "No Ethereum address found to fund"}) continue } + // Validate the user's existence since the API is unhelpful here + if res, err = http.Head("https://github.com/%s", gist.Owner.Login); err != nil { + websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + continue + } + res.Body.Close() + + if res.StatusCode != 200 { + websocket.JSON.Send(conn, map[string]string{"error": "Invalid user... boom!"}) + continue + } // Ensure the user didn't request funds too recently f.lock.Lock() var ( From 03dffe3efdde4fd0d849b9523249d0ad42037dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 16 Apr 2017 19:49:40 +0300 Subject: [PATCH 2/4] cmd/faucet: add optional recaptcha validation support --- cmd/faucet/faucet.go | 47 +++++++++++++++++++++++++++++++++++------- cmd/faucet/faucet.html | 13 +++++++----- cmd/faucet/website.go | 2 +- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index c418da818..f87cfdb72 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -29,6 +29,7 @@ import ( "io/ioutil" "math/big" "net/http" + "net/url" "os" "path/filepath" "strings" @@ -73,6 +74,9 @@ var ( githubUser = flag.String("github.user", "", "GitHub user to authenticate with for Gist access") githubToken = flag.String("github.token", "", "GitHub personal token to access Gists with") + captchaToken = flag.String("captcha.token", "", "Recaptcha site key to authenticate client side") + captchaSecret = flag.String("captcha.secret", "", "Recaptcha secret key to authenticate server side") + logFlag = flag.Int("loglevel", 3, "Log level to use for Ethereum and the faucet") ) @@ -96,9 +100,10 @@ func main() { } website := new(bytes.Buffer) template.Must(template.New("").Parse(string(tmpl))).Execute(website, map[string]interface{}{ - "Network": *netnameFlag, - "Amount": *payoutFlag, - "Period": period, + "Network": *netnameFlag, + "Amount": *payoutFlag, + "Period": period, + "Recaptcha": *captchaToken, }) // Load and parse the genesis block requested by the user blob, err := ioutil.ReadFile(*genesisFlag) @@ -297,7 +302,8 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { for { // Fetch the next funding request and validate against github var msg struct { - URL string `json:"url"` + URL string `json:"url"` + Captcha string `json:"captcha"` } if err := websocket.JSON.Receive(conn, &msg); err != nil { return @@ -306,8 +312,35 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { websocket.JSON.Send(conn, map[string]string{"error": "URL doesn't link to GitHub Gists"}) continue } - log.Info("Faucet funds requested", "addr", conn.RemoteAddr(), "gist", msg.URL) + log.Info("Faucet funds requested", "gist", msg.URL) + // If captcha verifications are enabled, make sure we're not dealing with a robot + if *captchaToken != "" { + form := url.Values{} + form.Add("secret", *captchaSecret) + form.Add("response", msg.Captcha) + + res, err := http.PostForm("https://www.google.com/recaptcha/api/siteverify", form) + if err != nil { + websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + continue + } + var result struct { + Success bool `json:"success"` + Errors json.RawMessage `json:"error-codes"` + } + err = json.NewDecoder(res.Body).Decode(&result) + res.Body.Close() + if err != nil { + websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + continue + } + if !result.Success { + log.Warn("Captcha verification failed", "err", string(result.Errors)) + websocket.JSON.Send(conn, map[string]string{"error": "Beep-boop, you're a robot!"}) + continue + } + } // Retrieve the gist from the GitHub Gist APIs parts := strings.Split(msg.URL, "/") req, _ := http.NewRequest("GET", "https://api.github.com/gists/"+parts[len(parts)-1], nil) @@ -334,7 +367,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { continue } if gist.Owner.Login == "" { - websocket.JSON.Send(conn, map[string]string{"error": "Nice try ;)"}) + websocket.JSON.Send(conn, map[string]string{"error": "Anonymous Gists not allowed"}) continue } // Iterate over all the files and look for Ethereum addresses @@ -349,7 +382,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { continue } // Validate the user's existence since the API is unhelpful here - if res, err = http.Head("https://github.com/%s", gist.Owner.Login); err != nil { + if res, err = http.Head("https://github.com/" + gist.Owner.Login); err != nil { websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) continue } diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index 570145ea2..39fcf77fe 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -51,9 +51,10 @@
- + -
+ {{if .Recaptcha}} +
{{end}}
@@ -89,8 +90,9 @@ var server; // Define the function that submits a gist url to the server - var submit = function() { - server.send(JSON.stringify({url: $("#gist")[0].value})); + var submit = function({{if .Recaptcha}}captcha{{end}}) { + server.send(JSON.stringify({url: $("#gist")[0].value{{if .Recaptcha}}, captcha: captcha{{end}}}));{{if .Recaptcha}} + grecaptcha.reset();{{end}} }; // Define a method to reconnect upon server loss var reconnect = function() { @@ -138,6 +140,7 @@ } // Establish a websocket connection to the API server reconnect(); - + {{if .Recaptcha}} + {{end}} diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index 32650fec4..21c77da29 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\xe1\x72\xdb\x36\x12\xfe\x2d\x3f\xc5\x86\x77\xad\xa5\xb1\x49\xca\x71\x26\xed\xc8\xa4\x3a\x99\x36\x97\xf6\xe6\xa6\xed\x5c\xd3\xb9\xeb\xb4\x9d\x1b\x90\x5c\x8a\xb0\x41\x80\x05\x16\x92\xd5\x8c\xde\xfd\x06\x00\x45\x51\x8a\x9d\xa4\x97\xde\x1f\x5b\x00\x16\xdf\x7e\xd8\x5d\xec\x2e\x98\x3d\xf9\xea\xbb\x2f\x5f\xff\xf4\xfd\x4b\x68\xa8\x15\xcb\xb3\xcc\xfd\x03\xc1\xe4\x2a\x8f\x50\x46\xcb\xb3\x49\xd6\x20\xab\x96\x67\x93\x49\xd6\x22\x31\x28\x1b\xa6\x0d\x52\x1e\x59\xaa\xe3\xcf\xa3\xc3\x42\x43\xd4\xc5\xf8\x9b\xe5\xeb\x3c\xfa\x77\xfc\xe3\x8b\xf8\x4b\xd5\x76\x8c\x78\x21\x30\x82\x52\x49\x42\x49\x79\xf4\xcd\xcb\x1c\xab\x15\x8e\xf6\x49\xd6\x62\x1e\xad\x39\x6e\x3a\xa5\x69\x24\xba\xe1\x15\x35\x79\x85\x6b\x5e\x62\xec\x07\x97\xc0\x25\x27\xce\x44\x6c\x4a\x26\x30\xbf\x8a\x96\x67\x0e\x87\x38\x09\x5c\xbe\x79\x93\x7c\x8b\xb4\x51\xfa\x6e\xb7\x5b\xc0\x2b\x4e\x5f\xdb\x02\xfe\xc6\x6c\x89\x94\xa5\x41\xc4\x4b\x0b\x2e\xef\xa0\xd1\x58\xe7\x91\xe3\x6c\x16\x69\x5a\x56\xf2\xd6\x24\xa5\x50\xb6\xaa\x05\xd3\x98\x94\xaa\x4d\xd9\x2d\xbb\x4f\x05\x2f\x4c\x4a\x1b\x4e\x84\x3a\x2e\x94\x22\x43\x9a\x75\xe9\x75\x72\x9d\x7c\x96\x96\xc6\xa4\xc3\x5c\xd2\x72\x99\x94\xc6\x44\xa0\x51\xe4\x91\xa1\xad\x40\xd3\x20\x52\x04\xe9\xf2\x7f\xd3\x5b\x2b\x49\x31\xdb\xa0\x51\x2d\xa6\xcf\x92\xcf\x92\xb9\x57\x39\x9e\x7e\xb7\x56\xa7\xd6\x94\x9a\x77\x04\x46\x97\x1f\xac\xf7\xf6\x37\x8b\x7a\x9b\x5e\x27\x57\xc9\x55\x3f\xf0\x7a\x6e\x4d\xb4\xcc\xd2\x00\xb8\xfc\x28\xec\x58\x2a\xda\xa6\x4f\x93\x67\xc9\x55\xda\xb1\xf2\x8e\xad\xb0\xda\x6b\x72\x4b\xc9\x7e\xf2\x4f\xd3\xfb\x98\x0f\x6f\x4f\x5d\xf8\x67\x28\x6b\x55\x8b\x92\x92\x5b\x93\x3e\x4d\xae\x3e\x4f\xe6\xfb\x89\xb7\xf1\xbd\x02\xe7\x34\xa7\x6a\x92\xac\x51\x13\x2f\x99\x88\x4b\x94\x84\x1a\xde\xb8\xd9\x49\xcb\x65\xdc\x20\x5f\x35\xb4\x80\xab\xf9\xfc\x93\x9b\x87\x66\xd7\x4d\x98\xae\xb8\xe9\x04\xdb\x2e\xa0\x16\x78\x1f\xa6\x98\xe0\x2b\x19\x73\xc2\xd6\x2c\x20\x20\xfb\x85\x9d\xd7\xd9\x69\xb5\xd2\x68\x4c\xaf\xac\x53\x86\x13\x57\x72\xe1\x22\x8a\x11\x5f\xe3\x43\xb2\xa6\x63\xf2\xad\x0d\xac\x30\x4a\x58\xc2\x13\x22\x85\x50\xe5\x5d\x98\xf3\xd7\x78\x7c\x88\x52\x09\xa5\x17\xb0\x69\x78\xbf\x0d\xbc\x22\xe8\x34\xf6\xf0\xd0\xb1\xaa\xe2\x72\xb5\x80\xe7\x5d\x7f\x1e\x68\x99\x5e\x71\xb9\x80\xf9\x61\x4b\x96\xee\xcd\x98\xa5\x21\x63\x9d\x4d\xb2\x42\x55\x5b\xef\xc3\x8a\xaf\xa1\x14\xcc\x98\x3c\x3a\x31\xb1\xcf\x44\x47\x02\x2e\x01\x31\x2e\xf7\x4b\x47\x6b\x5a\x6d\x22\xf0\x8a\xf2\x28\x90\x88\x0b\x45\xa4\xda\x05\x5c\x39\x7a\xfd\x96\x13\x3c\x11\x8b\x55\x7c\xf5\x74\xbf\x38\xc9\x9a\xab\x3d\x08\xe1\x3d\xc5\xde\x3f\x83\x67\xa2\x65\xc6\xf7\x7b\x6b\x06\x35\x8b\x0b\x46\x4d\x04\x4c\x73\x16\x37\xbc\xaa\x50\xe6\x11\x69\x8b\x2e\x8e\xf8\x12\xc6\x79\x6f\x9f\xf6\x5e\x58\x6a\x50\xba\x73\x12\x56\x7d\x12\x84\x53\xd8\x15\xa7\xc6\x16\x31\x13\xf4\x28\x78\x96\x36\x57\xfb\x23\xa5\x15\x5f\xf7\x16\x19\xfd\x3c\x31\xce\xe3\xe7\xff\x1c\xfa\x1f\xaa\xae\x0d\x52\x3c\x32\xc7\x48\x98\xcb\xce\x52\xbc\xd2\xca\x76\xc3\xfa\x24\xf3\xb3\xc0\xab\x3c\x5a\x71\x43\x11\xd0\xb6\xeb\x6d\x17\x0d\x47\x52\xba\x8d\x9d\xeb\xb4\x12\x11\x74\x82\x95\xd8\x28\x51\xa1\xce\xa3\xde\x26\xaf\xb8\x21\xf8\xf1\x9f\xff\x80\xde\xc1\x5c\xae\x60\xab\xac\x86\x97\xd4\xa0\x46\xdb\x02\xab\x2a\x17\xdc\x49\x92\x8c\x74\xfb\x48\x7f\x9b\x5d\x5c\x90\x3c\x48\x4d\xb2\xc2\x12\xa9\x41\xb0\x20\x09\x05\xc9\xb8\xc2\x9a\x59\x31\x30\x0e\x42\x11\x28\x59\x0a\x5e\xde\xe5\x91\xb1\x45\xcb\x69\x3a\x8b\x96\xaf\xf8\x1a\xa1\xc5\x40\xe6\x49\x96\x06\xd1\x03\x8d\xd4\xf1\x18\x2c\x76\x70\xc0\x07\xfa\xe5\x24\x68\x49\x75\x0b\xb8\x7e\x3a\x8a\xd8\x87\x5c\xf6\xfc\xc4\x65\xd7\x0f\x0a\x77\x4c\xa2\x00\xff\x37\x36\x2d\x13\xfb\xdf\xfb\xb3\x1f\xce\x70\xba\x29\x76\xf7\x73\xa0\x36\xdc\xf3\xf9\x0d\xa8\x35\xea\x5a\xa8\xcd\x02\x98\x25\x75\x03\x2d\xbb\x1f\x72\xdd\xf5\x7c\x3e\xe6\xed\xea\x3f\x2b\x04\xfa\xf0\xd0\xf8\x9b\x45\x43\x66\x08\x8b\xb0\xe4\xff\xba\xe8\xa8\x50\x1a\xac\x4e\xac\xe1\x34\xba\x70\xf7\x52\x23\x8b\x1f\x6c\xfc\x10\xf7\x5a\xa9\x21\x7d\x8c\x69\xf4\xd0\xa3\x4c\x17\x2d\x33\xd2\x07\xb9\x49\x46\xd5\x1f\xba\xfe\xda\x95\xf7\xc7\x6e\x7f\x88\x4f\x77\xf6\x0e\x51\x87\xda\xe2\x22\x05\xfc\x30\x4b\xa9\xfa\x08\xcd\x15\x23\x56\x30\x83\x1f\xa2\xde\x67\xf9\x83\x7a\x3f\xfc\x58\xfd\x0d\x32\x4d\x05\xb2\xc7\x13\xd4\x88\x40\x6d\x65\x35\x3a\xbf\xbf\x48\x1f\x4b\xc0\x4a\xbe\x46\x6d\x38\x6d\x3f\x94\x01\x56\x07\x0a\x61\x7c\x4c\x21\x4b\x49\xbf\x3b\xd6\xfe\x0f\x97\xfb\x7d\xe5\xe8\x7a\xf9\xb5\xda\x40\xa5\xd0\x00\x35\xdc\x80\x2b\x26\x5f\x64\x69\x73\x3d\x88\x74\xcb\xd7\x6e\xc1\x1b\x15\xea\x50\x4f\xb8\x01\x6d\xa5\xcf\xa3\x4a\x02\x35\x78\x5c\x8a\x64\xf8\x95\xc0\x6b\xe5\xca\xf9\x1a\x25\x41\xcb\x04\x2f\xb9\xb2\x06\x58\x49\x4a\x1b\xa8\xb5\x6a\x01\xef\x1b\x66\x0d\x39\x20\x97\x3e\xd8\x9a\x71\xe1\xef\x92\x77\x29\x28\x0d\xac\x2c\x6d\x6b\x5d\x3b\x22\x57\x80\x52\xd9\x55\xd3\x73\x21\x05\xad\xb2\x92\x40\x28\xb9\x1a\xf8\x98\x8e\xb5\xc0\x88\x58\x79\x67\x2e\x61\x9f\x15\x80\x69\x04\xe2\x58\xb9\x5d\x7d\x55\x60\x65\xe9\xb6\x9b\x04\x5e\xc8\xad\x92\x08\x0d\x5b\x7b\x22\x27\x02\xd0\xb2\xed\x1e\xa8\xe7\xb5\xe1\xd4\xf0\x70\xf0\x0e\x75\xeb\xfa\xcb\x0a\x04\x6f\x39\x81\xaa\x21\x33\xa4\x95\x5c\xb9\x67\xc9\x0b\xcf\x70\xb7\x0b\x94\xa7\x66\x06\xa9\x33\xd5\xf7\xa8\xb9\xaa\x76\x3b\xd7\xba\x78\xd1\x24\x4b\xbb\xb1\xc5\xd5\xb1\xc2\x4b\x30\xbc\xed\xc4\x16\x4a\x8d\x8c\x10\x18\x64\xec\xe4\x41\xe1\xca\x63\x12\xea\xba\x6f\x49\x23\x20\xa6\x57\xee\xb9\xf6\x1f\x56\x28\x4b\x8b\x42\x30\x79\xe7\xaa\xcd\x50\x12\xb3\x94\x2d\xfd\x51\x1e\x2e\x86\xd0\x31\xe3\xce\xc5\x25\x29\x7f\xd4\xfe\x7d\x66\x60\xea\x46\x35\x17\xe8\x9f\x70\x3e\x7a\xe4\xb9\xb3\x93\xeb\xb3\x67\x97\x50\xaa\x6e\x1b\x76\xfb\x7d\x8e\x9a\xf1\xf5\x77\x80\x62\x85\x5a\x23\x84\xe2\x5e\xa8\x7b\x60\xb2\x82\x9a\x6b\x04\xb6\x61\xdb\x27\xf0\x93\xb2\x50\x32\x09\xa4\x59\x79\x17\x74\x5b\xad\x5d\x18\x75\x28\x5d\xa9\x38\x38\xb6\x40\xa1\x36\x5e\x24\xa0\xd5\x1c\x85\xf7\xb2\x41\x84\x46\x6d\xa0\xb5\xa5\x3f\xa0\x73\x2f\xba\x85\x0d\xe3\x04\x56\x12\x17\xe1\xdc\x64\xb5\x84\x52\xb5\x68\x46\x5e\x78\xf0\xfa\x0d\xbf\xfa\x1f\x87\x37\x82\x5f\x4e\x53\x78\x25\x54\xc1\x04\xac\x5d\xc6\x28\x84\xbb\x54\x0a\x5c\x33\x72\x74\x06\x43\x8c\xac\x71\x91\xe2\xed\xe8\xaf\x94\xdb\xbf\x66\xda\x45\x2e\xb6\x1d\x41\xde\x77\xb8\x6e\xce\xa0\x5e\xbb\xbe\xbd\xd7\xf1\x15\xd6\x5c\x06\xcb\xd6\x56\x96\xae\x01\x07\x6a\x18\x41\x68\x29\x0c\x30\x6f\x71\xb0\x5a\x40\x6f\xee\x80\x30\xe0\x79\x39\xc8\x87\xed\xd3\x59\xdf\x71\x07\xb9\xc4\xa0\xac\xa6\x7f\xff\xe1\xbb\x6f\x13\x43\x9a\xcb\x15\xaf\xb7\xd3\x37\x56\x8b\x05\xfc\x75\x1a\xfd\xc5\x37\x62\xb3\x9f\xe7\xbf\x26\x6b\x26\x2c\xee\x66\xb3\xf0\x4c\xb8\x39\xe6\xc7\xa0\x45\x6a\x94\xf7\x85\xc6\x52\x49\x89\x25\x81\xed\x94\xec\xe9\x80\x50\xc6\xec\x39\x1d\x24\x1e\xa0\xc5\x6b\x98\xee\x0d\xf3\x09\x3c\x85\x3c\x87\xf9\x7e\xad\xe7\x0c\x39\x48\xdc\xc0\xbf\xb0\xf8\x41\x95\x77\x48\xd3\x68\x63\xdc\xb5\x88\xe0\x02\x84\x2a\x99\xc3\x4b\x1a\x65\x08\x2e\x20\x4a\x59\xc7\xa3\xc0\x7a\xb2\x03\x14\x06\xdf\x0f\xf6\x41\x58\xe1\xcd\x15\x98\x5e\x5c\x04\x8f\xed\x8d\xaa\x64\x8b\xc6\xb0\x15\x8e\x4f\xe8\x73\xe3\x70\x14\x67\x88\xd6\xac\x20\x07\x6f\xfc\x8e\x69\x83\x41\x24\x71\xf5\xb8\xd7\xe2\xcd\xe1\xc5\xf2\x1c\xa4\x15\x62\xd8\x3f\xd1\xe8\x82\xb9\x17\xdb\x9d\x1d\x89\x27\x21\x75\x3d\xc9\x73\x70\xc5\xc9\xf9\xa8\x3a\xec\x74\x8e\x0d\x65\x74\x96\xb8\xfa\x78\xd8\x31\x1b\xe0\xde\x42\xc3\xea\x7d\x70\x58\x9d\xe2\x61\xf5\x08\xa0\xef\x5a\xde\x85\x17\xba\x9c\x11\x9c\x9f\x78\x04\x4d\xda\xb6\x40\xfd\x2e\xb8\xd0\xb5\xf4\x70\xde\xd4\xdf\x48\x1a\xed\xbd\x84\xab\xe7\xb3\x47\xd0\x51\x6b\xf5\x28\xb8\x54\xb4\x9d\xbe\x11\x6c\xeb\xb2\x2e\x9c\x93\xea\xbe\xf4\x4d\xc6\xf9\x25\x38\x5d\x0b\x18\x10\x2e\xfd\xe3\x60\x01\xe7\x7e\x74\xbe\x7b\x44\x9b\xb1\x65\xe9\xf2\xf1\xc7\xe8\xeb\x31\x06\x8d\xfd\xf8\x51\x9d\x43\x7e\x3d\x52\x0a\x9f\x7e\x0a\x6f\xad\x1e\x87\xa0\x8b\xe1\xbe\x50\x40\x0e\x51\xd4\xc3\x4f\x6a\xa5\x61\xea\x16\x79\x3e\xbf\x01\x9e\x8d\x61\x12\x81\x72\x45\xcd\x0d\xf0\x8b\x8b\x03\xd2\x64\x0f\x73\x91\x43\xe4\xfa\xe8\x8c\xaa\xa5\xef\x67\x42\xd3\xf3\x4b\x54\xb0\xf2\xce\x3d\xc9\x64\xb5\x70\xd9\x6e\x7a\x7e\x28\x86\xa3\x3a\x78\x71\x44\xf9\x67\xfe\x6b\x62\x0d\x6a\x5f\xb9\x2e\x20\x4a\x3a\xb9\xfa\xc2\xf0\xdf\x31\x7f\xfe\xec\x7c\x76\x03\x07\xcc\xd8\xcd\x2e\xa0\x74\x2f\x92\x1b\x08\x5d\xbd\xef\xad\x60\x78\x8f\xf8\x51\xa1\x74\x85\x3a\xd6\xac\xe2\xd6\x2c\xe0\x59\x77\x7f\xf3\x8b\xeb\x04\x5d\x89\xf0\x1d\xa0\xe7\xdd\x69\x5c\x3e\xc4\x65\xdf\x64\x5c\x40\x94\xa5\x4e\x68\xbf\x65\x38\xe5\xf8\xcb\x09\x3c\xd0\xbb\xc2\xf0\x5d\xa3\x9f\x6f\x79\x55\x09\x74\x24\xbc\xc2\xf0\x01\xaa\xb2\xda\x27\xae\x69\x18\x4f\x4f\x79\x10\x6f\x71\x96\x58\xc9\xef\xa7\xb3\xb8\x97\xd9\x8f\x2f\xe1\xdc\xb8\xfc\x5c\x99\xf3\x59\xd2\xd8\x96\x49\xfe\x3b\x4e\x5d\x23\x3c\x0b\xbc\x1d\x63\xd7\xdd\x0e\xde\xde\x8d\x2e\xda\xf0\x32\x9b\x25\x0d\xb5\x62\x1a\x65\xe4\xbf\xce\x38\x72\x83\x8b\x3d\x4a\x98\x3e\x8e\xc8\xdd\x71\x0e\x2d\x85\x32\x78\x52\x23\xc0\x20\xbd\xe6\x2d\x2a\x4b\xd3\xa1\x8e\x5c\xba\xd7\xe2\x7c\x76\x03\xa1\x2e\x1d\x10\xc2\xdd\xfd\xe3\x08\xbb\xbe\xbc\xbd\x34\xae\x83\xe7\xa6\x01\x06\x1b\x2c\x8c\xaf\x10\xd0\xef\xf1\xb5\x38\xd4\xdc\x17\xdf\x7f\x33\xaa\xbb\x03\xea\xd4\x1f\x6f\xf4\x99\x31\x4b\xc3\xb7\xaa\x2c\x0d\xdf\xe1\xff\x1b\x00\x00\xff\xff\x97\x3f\x1d\xc4\x98\x17\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xff\x6f\xdb\xb6\xb6\xff\xd9\xfd\x2b\x4e\xf5\xde\x16\x1b\x89\xa4\xa4\x29\xba\xc1\x91\x3c\x14\x5b\x5f\xb7\x87\x8b\x6d\xd8\x3a\xdc\x3b\x6c\xc3\x05\x25\x1d\x49\x4c\x28\x52\x23\x8f\xec\x78\x81\xff\xf7\x0b\x92\x92\x2c\x3b\x4e\xd7\xdd\xee\x97\x54\x24\x0f\x3f\xe7\x2b\xcf\x17\x37\x79\xfe\xd5\x77\x5f\xbe\xfb\xf9\xfb\x37\x50\x53\x23\x56\xcf\x12\xfb\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcd\x92\x1a\x59\xb1\x7a\x36\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x3f\xa8\x89\xda\x10\x7f\xef\xf8\x3a\x0d\xfe\x15\xfe\xf4\x3a\xfc\x52\x35\x2d\x23\x9e\x09\x0c\x20\x57\x92\x50\x52\x1a\x7c\xf3\x26\xc5\xa2\xc2\xc9\x3d\xc9\x1a\x4c\x83\x35\xc7\x4d\xab\x34\x4d\x48\x37\xbc\xa0\x3a\x2d\x70\xcd\x73\x0c\xdd\xe2\x02\xb8\xe4\xc4\x99\x08\x4d\xce\x04\xa6\x57\xc1\xea\x99\xc5\x21\x4e\x02\x57\x0f\x0f\xd1\xb7\x48\x1b\xa5\xef\x76\xbb\x25\xbc\xe5\xf4\x75\x97\xc1\xff\xb1\x2e\x47\x4a\x62\x4f\xe2\xa8\x05\x97\x77\x50\x6b\x2c\xd3\xc0\xca\x6c\x96\x71\x9c\x17\xf2\xd6\x44\xb9\x50\x5d\x51\x0a\xa6\x31\xca\x55\x13\xb3\x5b\x76\x1f\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xbd\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\x7f\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x5f\x46\x9f\x45\x97\x8e\xe5\x74\xfb\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\xdb\xdf\x3b\xd4\xdb\xf8\x3a\xba\x8a\xae\xfa\x85\xe3\x73\x6b\x82\x55\x12\x7b\xc0\xd5\x47\x61\x87\x52\xd1\x36\x7e\x11\xbd\x8c\xae\xe2\x96\xe5\x77\xac\xc2\x62\xe0\x64\x8f\xa2\x61\xf3\x6f\xe3\xfb\x94\x0f\x6f\x8f\x5d\xf8\x77\x30\x6b\x54\x83\x92\xa2\x5b\x13\xbf\x88\xae\x3e\x8f\x2e\x87\x8d\xc7\xf8\x8e\x81\x75\x9a\x65\x35\x8b\xd6\xa8\x89\xe7\x4c\x84\x39\x4a\x42\x0d\x0f\x76\x77\xd6\x70\x19\xd6\xc8\xab\x9a\x96\x70\x75\x79\xf9\xc9\xcd\xa9\xdd\x75\xed\xb7\x0b\x6e\x5a\xc1\xb6\x4b\x28\x05\xde\xfb\x2d\x26\x78\x25\x43\x4e\xd8\x98\x25\x78\x64\x77\xb0\x73\x3c\x5b\xad\x2a\x8d\xc6\xf4\xcc\x5a\x65\x38\x71\x25\x97\x36\xa2\x18\xf1\x35\x9e\xa2\x35\x2d\x93\x8f\x2e\xb0\xcc\x28\xd1\x11\x1e\x09\x92\x09\x95\xdf\xf9\x3d\xf7\x8c\xa7\x4a\xe4\x4a\x28\xbd\x84\x4d\xcd\xfb\x6b\xe0\x18\x41\xab\xb1\x87\x87\x96\x15\x05\x97\xd5\x12\x5e\xb5\xbd\x3e\xd0\x30\x5d\x71\xb9\x84\xcb\xfd\x95\x24\x1e\xcc\x98\xc4\x3e\x63\x3d\x9b\x25\x99\x2a\xb6\xce\x87\x05\x5f\x43\x2e\x98\x31\x69\x70\x64\x62\x97\x89\x0e\x08\x6c\x02\x62\x5c\x0e\x47\x07\x67\x5a\x6d\x02\x70\x8c\xd2\xc0\x0b\x11\x66\x8a\x48\x35\x4b\xb8\xb2\xe2\xf5\x57\x8e\xf0\x44\x28\xaa\xf0\xea\xc5\x70\x38\x4b\xea\xab\x01\x84\xf0\x9e\x42\xe7\x9f\xd1\x33\xc1\x2a\xe1\xc3\xdd\x92\x41\xc9\xc2\x8c\x51\x1d\x00\xd3\x9c\x85\x35\x2f\x0a\x94\x69\x40\xba\x43\x1b\x47\x7c\x05\xd3\xbc\x37\xa4\xbd\xd7\x1d\xd5\x28\xad\x9e\x84\x45\x9f\x04\xe1\x18\xb6\xe2\x54\x77\x59\xc8\x04\x3d\x09\x9e\xc4\xf5\xd5\xa0\x52\x5c\xf0\x75\x6f\x91\xc9\xe7\x91\x71\x9e\xd6\xff\x73\xe8\x3f\x54\x59\x1a\xa4\x70\x62\x8e\x09\x31\x97\x6d\x47\x61\xa5\x55\xd7\x8e\xe7\xb3\xc4\xed\x02\x2f\xd2\xa0\xe2\x86\x02\xa0\x6d\xdb\xdb\x2e\x18\x55\x52\xba\x09\xad\xeb\xb4\x12\x01\xb4\x82\xe5\x58\x2b\x51\xa0\x4e\x83\xde\x26\x6f\xb9\x21\xf8\xe9\x87\x7f\x40\xef\x60\x2e\x2b\xd8\xaa\x4e\xc3\x1b\xaa\x51\x63\xd7\x00\x2b\x0a\x1b\xdc\x51\x14\x4d\x78\xbb\x48\x7f\x2c\x5d\x98\x91\xdc\x53\xcd\x92\xac\x23\x52\x23\x61\x46\x12\x32\x92\x61\x81\x25\xeb\xc4\x28\xb1\x27\x0a\x40\xc9\x5c\xf0\xfc\x2e\x0d\x1e\x1e\x78\x09\xd1\x0f\x98\xb3\x96\xf2\x9a\xed\x76\x95\x1e\xbe\x23\xbc\xc7\xbc\x23\x9c\x2f\x1e\x1e\x50\x18\xdc\xed\x4c\x97\x35\x9c\xdc\x5a\x16\xbb\x5d\xb0\x7a\xcb\xd7\x08\x0d\x7a\x05\x9e\x27\xb1\x87\xdf\x8b\x1e\x5b\xd9\x47\x2b\x3b\xa7\x3d\x62\x78\xc2\x07\x55\x38\x0a\x11\x40\xc1\x88\x85\x86\x13\xde\xe1\xd6\xca\x3b\xbd\xdb\x9f\xe6\x4c\x88\x8c\x59\x75\xbc\x84\xe3\xa5\x3f\xd0\x9a\x6c\xcd\x8d\x6b\x02\x56\x83\x04\x4e\xfa\xbf\x12\x54\x47\x2f\x8e\x54\xbb\x84\xeb\x17\x93\xe7\x76\x2a\xde\x5e\x1d\xc5\xdb\xf5\x49\xe2\x96\x49\x14\xe0\xfe\x86\xa6\x61\x62\xf8\x1e\x1c\xb7\x37\xe6\xf1\xa5\xd0\x26\x97\x51\xb4\x31\x49\x5d\xde\x80\x5a\xa3\x2e\x85\xda\x2c\x81\x75\xa4\x6e\xa0\x61\xf7\x63\xa2\xbe\xbe\xbc\x9c\xca\x6d\x9b\x17\x96\x09\x74\xb1\xad\xf1\xf7\x0e\x0d\x99\x31\xa6\xfd\x91\xfb\x6b\x43\xbb\x40\x69\xb0\x38\xb2\x86\xe5\x68\x4d\xeb\xa8\x26\xae\x1f\x8d\x79\x52\xf6\x52\xa9\x31\xf7\x4d\xc5\xe8\xa1\x27\x69\x3a\x58\x25\xa4\xf7\x74\xb3\x84\x8a\xbf\x94\xbb\xb4\xed\x4d\x9e\x4a\x5d\xfe\x71\x59\xdd\x5b\x44\xed\x0b\xa3\x0d\x59\x70\xcb\x24\xa6\xe2\x23\x38\xdb\x20\xcc\x98\xc1\x0f\x61\xef\x4a\xd4\x9e\xbd\x5b\x7e\x2c\xff\x1a\x99\xa6\x0c\xd9\xd3\xd9\x75\x22\x40\xd9\xc9\x62\xa2\xbf\x7b\xd1\x1f\x2b\x40\x27\xf9\x1a\xb5\xe1\xb4\xfd\x50\x09\xb0\xd8\x8b\xe0\xd7\x87\x22\x24\x31\xe9\xf7\xc7\xda\x74\xf1\x37\x3d\xee\x3f\xab\xa5\xd7\xab\xaf\xd5\x06\x0a\x85\x06\xa8\xe6\x06\x6c\x25\xfc\x22\x89\xeb\xeb\x91\xa4\x5d\xbd\xb3\x07\xce\xa8\x50\xfa\x62\xc8\x0d\xe8\x4e\xba\x22\xa0\x24\x50\x8d\x87\x75\x54\xfa\xaf\x08\xde\x29\xdb\x8b\xac\x51\x12\x34\x4c\xf0\x9c\xab\xce\x00\xcb\x49\x69\x03\xa5\x56\x0d\xe0\x7d\xcd\x3a\x43\x16\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb7\xe4\x5c\x0a\x4a\x03\xcb\xf3\xae\xe9\x6c\x2f\x25\x2b\x40\xa9\xba\xaa\xee\x65\x21\x05\x8d\xea\x24\x81\x50\xb2\x1a\xe5\x31\x2d\x6b\x80\x11\xb1\xfc\xce\x5c\xc0\x90\x15\x80\x69\x04\xe2\x58\xd8\x5b\x7d\x49\x63\x79\x6e\xaf\x9b\x08\x5e\xcb\xad\x92\x08\x35\x5b\x3b\x41\x8e\x08\xa0\x61\xdb\x01\xa8\x97\x6b\xc3\xa9\xe6\x5e\xf1\x16\x75\x63\x9b\xe3\x02\x04\x6f\x38\x81\x2a\x21\x31\xa4\x95\xac\xec\x4c\xf5\xda\x49\xb8\xdb\x79\x91\xe7\x66\x01\xb1\x35\xd5\xf7\xa8\xb9\x2a\x76\x3b\xdb\x77\x39\xd2\x28\x89\xdb\xa9\xc5\xd5\x21\xc3\x0b\x30\xbc\x69\xc5\x16\x72\x8d\x8c\x10\x18\x24\xec\x68\x1a\xb2\xb5\x3d\xf2\x4d\x89\xeb\xa7\x03\x20\xa6\x2b\x3b\x6b\xfe\x9b\x65\xaa\xa3\x65\x26\x98\xbc\xb3\x65\x6f\xac\xe7\x49\xcc\x56\x4e\x95\xd3\x95\x1c\x5a\x66\xac\x5e\x5c\x92\x72\xaa\xf6\xc3\xa5\x81\xb9\x5d\x95\x5c\xa0\x9b\x3f\x5d\xf4\xc8\x33\x6b\x27\x3b\x24\x2c\x2e\x20\x57\xed\xd6\xdf\x76\xf7\xac\x68\xc6\x35\x0f\x23\x14\xcb\xd4\x1a\xc1\x77\x26\x99\xba\x07\x26\x0b\x28\xb9\x46\x60\x1b\xb6\x7d\x0e\x3f\xab\x0e\x72\x26\x81\x34\xcb\xef\x3c\xef\x4e\x6b\x1b\x46\x2d\x4a\x5b\x2a\xf6\x8e\xcd\x50\xa8\x8d\x23\xf1\x68\x25\x47\xe1\xbc\x6c\x10\xa1\x56\x1b\x68\xba\xdc\x29\x68\xdd\x8b\xf6\x60\xc3\x38\x41\x27\x89\x0b\xaf\x37\x75\x5a\x42\xae\x1a\x34\x13\x2f\x9c\x7c\x7e\xe3\x57\xff\xb1\x1f\x70\xdc\x71\x1c\xc3\x5b\xa1\x32\x26\x60\x6d\x33\x46\x26\xec\xa3\x52\x60\x3b\xa9\x03\x1d\x0c\x31\xea\x8c\x8d\x14\x67\x47\xf7\xa4\xec\xfd\x35\xd3\x36\x72\xb1\x69\x09\xd2\xbe\x3d\xb7\x7b\x06\xf5\xda\x0e\x1d\x3d\x8f\xaf\xb0\xe4\xd2\x5b\xb6\xec\x64\x6e\xa7\x07\xa0\x9a\x11\xf8\x06\xc2\x00\x73\x16\x87\x4e\x0b\xe8\xcd\xed\x11\x46\x3c\x47\x07\xe9\x78\x7d\xfe\xa8\xb1\xe9\x3f\xfa\x76\x63\xd1\x4f\x13\x1e\x26\x32\x28\x8b\xf9\xff\xff\xf8\xdd\xb7\x91\x21\xcd\x65\xc5\xcb\xed\xfc\xa1\xd3\x62\x09\xff\x3b\x0f\xfe\xc7\x35\x99\x8b\x5f\x2e\x7f\x8b\xd6\x4c\x74\xf8\x08\xfa\x02\xfa\xcf\x25\x1c\x72\xd9\x2d\x16\x37\xa7\x3b\xac\x49\x5f\xa7\xd1\x20\xcd\x2d\xe1\xd8\x08\xed\x6e\x0e\x0d\xc3\xa0\x41\xaa\x95\x0b\x02\x8d\xb9\x92\x12\x73\x82\xae\x55\xb2\xb7\x03\x08\x65\xcc\x60\x8c\x3d\xc5\xc4\x1e\x83\xc2\xbc\x84\xf9\xe0\x91\x4f\xe0\x05\xa4\x29\x5c\x0e\x67\xbd\x35\x20\x05\x89\x1b\xf8\x27\x66\x3f\xaa\xfc\x0e\x69\x1e\x6c\x8c\x7d\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x73\xd8\x0e\x6c\x63\xfa\xe7\x60\x1f\x84\xe5\x27\x55\x2f\xe9\xf9\xb9\x0f\x95\xc1\x5d\x4a\x36\x68\x0c\xab\x70\xaa\xa1\x4b\xca\xa3\x2a\xd6\x10\x8d\xa9\x20\x05\xe7\xd6\x96\x69\x83\x9e\x24\xb2\x8d\x40\xcf\xc5\x99\xc3\x91\xa5\x29\xc8\x4e\x88\xf1\xfe\x4c\xa3\x7d\x45\x3d\xd9\xee\xd9\x01\x79\xe4\x73\xe6\xf3\x34\x05\x5b\x15\xad\x8f\x8a\xfd\x4d\x1b\x32\xbe\x7e\x2f\x22\x5b\x98\xf7\x37\x16\x23\xdc\x23\x34\x2c\xfe\x0c\x0e\x8b\x63\x3c\x2c\x9e\x00\x74\xed\xd2\xfb\xf0\x7c\x7b\x35\x81\x73\x1b\x4f\xa0\xc9\xae\xc9\x50\xbf\x0f\xce\xb7\x4b\x3d\x9c\x33\xf5\x37\x92\x26\x77\x2f\xe0\xea\xd5\xe2\x09\x74\xd4\x5a\x3d\x09\x2e\x15\x6d\xe7\x0f\x82\x6d\x6d\xba\x87\x33\x52\xed\x97\xae\xbb\x39\xbb\x00\xcb\x6b\x09\x23\xc2\x85\x1b\xa9\x96\x70\xe6\x56\x67\xbb\x27\xb8\x99\x2e\xcf\x6d\x21\xf8\x18\x7e\x3d\xc6\xc8\xb1\x5f\x3f\xc9\x73\x4c\xec\x07\x4c\xe1\xd3\x4f\xe1\xd1\xe9\x61\x08\xda\x18\xee\x2b\x14\xa4\x10\x04\x3d\xfc\xac\x54\x1a\xe6\xf6\x90\xa7\x97\x37\xc0\x93\x29\x4c\x24\x50\x56\x54\xdf\x00\x3f\x3f\xdf\x23\xcd\x06\x98\xf3\x14\x02\xdb\xc0\x27\x54\xac\x5c\x23\xe5\xbb\xad\x5f\x03\x3b\xb0\xd9\x41\x56\x16\x4b\x9b\x66\xe7\x67\xfb\x2a\x3c\x29\xc0\xe7\x07\x22\xff\xc2\x7f\x8b\x3a\x83\xda\x95\xcc\x73\x08\xa2\x56\x56\x5f\xb8\x31\xef\xd5\xcb\xb3\xc5\x0d\xec\x31\xdd\xf0\xb7\x84\xdc\x8e\x42\x37\xe0\xc7\x09\xd7\xd4\xc1\x38\x08\xb9\x55\xa6\x74\x81\x3a\xd4\xac\xe0\x9d\x59\xc2\xcb\xf6\xfe\xe6\xd7\x61\x50\x74\xad\xa7\x93\xbb\xd5\xb8\x3a\x25\xcb\xd0\xdd\x9c\x43\x90\xc4\x96\x68\xb8\x32\x6a\x39\xfd\xbd\x09\x4e\x34\xcd\x30\xfe\x1a\xd4\xef\x37\xbc\x28\x04\x5a\x21\x1c\x43\xff\xb3\x5d\xd1\x69\x97\xb8\xe6\x7e\x3d\x3f\x96\x83\x78\x83\x8b\xa8\x93\xfc\x7e\xbe\x08\x7b\x9a\x61\x7d\x01\x67\xc6\xe6\xe7\xc2\x9c\x2d\xa2\xba\x6b\x98\xe4\x7f\xe0\xdc\x76\xe0\x0b\x2f\xb7\x95\xd8\xb6\xd5\xa3\xb7\x77\x93\x87\x36\x8e\x84\x8b\xa8\xa6\x46\xcc\x83\x84\xdc\x6f\x5a\x56\xb8\xd1\xc5\x0e\xc5\x6f\x1f\x46\xe4\xee\x30\x87\xe6\x42\x19\x3c\xaa\x11\x60\x90\xde\xf1\x06\x55\x47\xf3\xb1\x8e\x5c\xd8\x31\xf5\x72\x71\x03\xbe\x2e\xed\x11\xfc\xdb\xfd\xeb\x08\xbb\xbe\xbc\xbd\x31\x76\x74\xe0\xa6\x06\x06\x1b\xcc\x8c\xab\x10\xd0\xdf\x71\x4d\x80\x2f\xf6\xaf\xbf\xff\x66\x52\xf0\x47\xd4\xb9\x53\x6f\xfc\xf1\xf4\x54\xa5\x3d\xf9\x6b\xed\x66\xb3\x89\x2a\xa5\x2a\xe1\x7f\xa7\x1d\x4b\xb1\xad\x3f\xd1\xad\x9d\x4f\xcd\x56\xe6\x50\x60\x89\x7a\x35\x81\xef\xeb\x73\x12\xfb\xdf\x11\x93\xd8\xff\x1f\xc9\x7f\x02\x00\x00\xff\xff\xe9\xcd\x27\xe5\x34\x19\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( From 80e74fc1e09ccc3cf48a65fd89d2d872dc68fda3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 16 Apr 2017 20:39:42 +0300 Subject: [PATCH 3/4] cmd/faucet: fix websocket double close/reopen --- cmd/faucet/faucet.html | 2 +- cmd/faucet/website.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index 39fcf77fe..fa715560f 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -136,7 +136,7 @@ } } server.onclose = function() { setTimeout(reconnect, 3000); }; - server.onerror = function() { setTimeout(reconnect, 3000); }; + //server.onerror = function() { setTimeout(reconnect, 3000); }; } // Establish a websocket connection to the API server reconnect(); diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index 21c77da29..e85de5bc8 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xff\x6f\xdb\xb6\xb6\xff\xd9\xfd\x2b\x4e\xf5\xde\x16\x1b\x89\xa4\xa4\x29\xba\xc1\x91\x3c\x14\x5b\x5f\xb7\x87\x8b\x6d\xd8\x3a\xdc\x3b\x6c\xc3\x05\x25\x1d\x49\x4c\x28\x52\x23\x8f\xec\x78\x81\xff\xf7\x0b\x92\x92\x2c\x3b\x4e\xd7\xdd\xee\x97\x54\x24\x0f\x3f\xe7\x2b\xcf\x17\x37\x79\xfe\xd5\x77\x5f\xbe\xfb\xf9\xfb\x37\x50\x53\x23\x56\xcf\x12\xfb\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcd\x92\x1a\x59\xb1\x7a\x36\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x3f\xa8\x89\xda\x10\x7f\xef\xf8\x3a\x0d\xfe\x15\xfe\xf4\x3a\xfc\x52\x35\x2d\x23\x9e\x09\x0c\x20\x57\x92\x50\x52\x1a\x7c\xf3\x26\xc5\xa2\xc2\xc9\x3d\xc9\x1a\x4c\x83\x35\xc7\x4d\xab\x34\x4d\x48\x37\xbc\xa0\x3a\x2d\x70\xcd\x73\x0c\xdd\xe2\x02\xb8\xe4\xc4\x99\x08\x4d\xce\x04\xa6\x57\xc1\xea\x99\xc5\x21\x4e\x02\x57\x0f\x0f\xd1\xb7\x48\x1b\xa5\xef\x76\xbb\x25\xbc\xe5\xf4\x75\x97\xc1\xff\xb1\x2e\x47\x4a\x62\x4f\xe2\xa8\x05\x97\x77\x50\x6b\x2c\xd3\xc0\xca\x6c\x96\x71\x9c\x17\xf2\xd6\x44\xb9\x50\x5d\x51\x0a\xa6\x31\xca\x55\x13\xb3\x5b\x76\x1f\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xbd\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\x7f\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x5f\x46\x9f\x45\x97\x8e\xe5\x74\xfb\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\xdb\xdf\x3b\xd4\xdb\xf8\x3a\xba\x8a\xae\xfa\x85\xe3\x73\x6b\x82\x55\x12\x7b\xc0\xd5\x47\x61\x87\x52\xd1\x36\x7e\x11\xbd\x8c\xae\xe2\x96\xe5\x77\xac\xc2\x62\xe0\x64\x8f\xa2\x61\xf3\x6f\xe3\xfb\x94\x0f\x6f\x8f\x5d\xf8\x77\x30\x6b\x54\x83\x92\xa2\x5b\x13\xbf\x88\xae\x3e\x8f\x2e\x87\x8d\xc7\xf8\x8e\x81\x75\x9a\x65\x35\x8b\xd6\xa8\x89\xe7\x4c\x84\x39\x4a\x42\x0d\x0f\x76\x77\xd6\x70\x19\xd6\xc8\xab\x9a\x96\x70\x75\x79\xf9\xc9\xcd\xa9\xdd\x75\xed\xb7\x0b\x6e\x5a\xc1\xb6\x4b\x28\x05\xde\xfb\x2d\x26\x78\x25\x43\x4e\xd8\x98\x25\x78\x64\x77\xb0\x73\x3c\x5b\xad\x2a\x8d\xc6\xf4\xcc\x5a\x65\x38\x71\x25\x97\x36\xa2\x18\xf1\x35\x9e\xa2\x35\x2d\x93\x8f\x2e\xb0\xcc\x28\xd1\x11\x1e\x09\x92\x09\x95\xdf\xf9\x3d\xf7\x8c\xa7\x4a\xe4\x4a\x28\xbd\x84\x4d\xcd\xfb\x6b\xe0\x18\x41\xab\xb1\x87\x87\x96\x15\x05\x97\xd5\x12\x5e\xb5\xbd\x3e\xd0\x30\x5d\x71\xb9\x84\xcb\xfd\x95\x24\x1e\xcc\x98\xc4\x3e\x63\x3d\x9b\x25\x99\x2a\xb6\xce\x87\x05\x5f\x43\x2e\x98\x31\x69\x70\x64\x62\x97\x89\x0e\x08\x6c\x02\x62\x5c\x0e\x47\x07\x67\x5a\x6d\x02\x70\x8c\xd2\xc0\x0b\x11\x66\x8a\x48\x35\x4b\xb8\xb2\xe2\xf5\x57\x8e\xf0\x44\x28\xaa\xf0\xea\xc5\x70\x38\x4b\xea\xab\x01\x84\xf0\x9e\x42\xe7\x9f\xd1\x33\xc1\x2a\xe1\xc3\xdd\x92\x41\xc9\xc2\x8c\x51\x1d\x00\xd3\x9c\x85\x35\x2f\x0a\x94\x69\x40\xba\x43\x1b\x47\x7c\x05\xd3\xbc\x37\xa4\xbd\xd7\x1d\xd5\x28\xad\x9e\x84\x45\x9f\x04\xe1\x18\xb6\xe2\x54\x77\x59\xc8\x04\x3d\x09\x9e\xc4\xf5\xd5\xa0\x52\x5c\xf0\x75\x6f\x91\xc9\xe7\x91\x71\x9e\xd6\xff\x73\xe8\x3f\x54\x59\x1a\xa4\x70\x62\x8e\x09\x31\x97\x6d\x47\x61\xa5\x55\xd7\x8e\xe7\xb3\xc4\xed\x02\x2f\xd2\xa0\xe2\x86\x02\xa0\x6d\xdb\xdb\x2e\x18\x55\x52\xba\x09\xad\xeb\xb4\x12\x01\xb4\x82\xe5\x58\x2b\x51\xa0\x4e\x83\xde\x26\x6f\xb9\x21\xf8\xe9\x87\x7f\x40\xef\x60\x2e\x2b\xd8\xaa\x4e\xc3\x1b\xaa\x51\x63\xd7\x00\x2b\x0a\x1b\xdc\x51\x14\x4d\x78\xbb\x48\x7f\x2c\x5d\x98\x91\xdc\x53\xcd\x92\xac\x23\x52\x23\x61\x46\x12\x32\x92\x61\x81\x25\xeb\xc4\x28\xb1\x27\x0a\x40\xc9\x5c\xf0\xfc\x2e\x0d\x1e\x1e\x78\x09\xd1\x0f\x98\xb3\x96\xf2\x9a\xed\x76\x95\x1e\xbe\x23\xbc\xc7\xbc\x23\x9c\x2f\x1e\x1e\x50\x18\xdc\xed\x4c\x97\x35\x9c\xdc\x5a\x16\xbb\x5d\xb0\x7a\xcb\xd7\x08\x0d\x7a\x05\x9e\x27\xb1\x87\xdf\x8b\x1e\x5b\xd9\x47\x2b\x3b\xa7\x3d\x62\x78\xc2\x07\x55\x38\x0a\x11\x40\xc1\x88\x85\x86\x13\xde\xe1\xd6\xca\x3b\xbd\xdb\x9f\xe6\x4c\x88\x8c\x59\x75\xbc\x84\xe3\xa5\x3f\xd0\x9a\x6c\xcd\x8d\x6b\x02\x56\x83\x04\x4e\xfa\xbf\x12\x54\x47\x2f\x8e\x54\xbb\x84\xeb\x17\x93\xe7\x76\x2a\xde\x5e\x1d\xc5\xdb\xf5\x49\xe2\x96\x49\x14\xe0\xfe\x86\xa6\x61\x62\xf8\x1e\x1c\xb7\x37\xe6\xf1\xa5\xd0\x26\x97\x51\xb4\x31\x49\x5d\xde\x80\x5a\xa3\x2e\x85\xda\x2c\x81\x75\xa4\x6e\xa0\x61\xf7\x63\xa2\xbe\xbe\xbc\x9c\xca\x6d\x9b\x17\x96\x09\x74\xb1\xad\xf1\xf7\x0e\x0d\x99\x31\xa6\xfd\x91\xfb\x6b\x43\xbb\x40\x69\xb0\x38\xb2\x86\xe5\x68\x4d\xeb\xa8\x26\xae\x1f\x8d\x79\x52\xf6\x52\xa9\x31\xf7\x4d\xc5\xe8\xa1\x27\x69\x3a\x58\x25\xa4\xf7\x74\xb3\x84\x8a\xbf\x94\xbb\xb4\xed\x4d\x9e\x4a\x5d\xfe\x71\x59\xdd\x5b\x44\xed\x0b\xa3\x0d\x59\x70\xcb\x24\xa6\xe2\x23\x38\xdb\x20\xcc\x98\xc1\x0f\x61\xef\x4a\xd4\x9e\xbd\x5b\x7e\x2c\xff\x1a\x99\xa6\x0c\xd9\xd3\xd9\x75\x22\x40\xd9\xc9\x62\xa2\xbf\x7b\xd1\x1f\x2b\x40\x27\xf9\x1a\xb5\xe1\xb4\xfd\x50\x09\xb0\xd8\x8b\xe0\xd7\x87\x22\x24\x31\xe9\xf7\xc7\xda\x74\xf1\x37\x3d\xee\x3f\xab\xa5\xd7\xab\xaf\xd5\x06\x0a\x85\x06\xa8\xe6\x06\x6c\x25\xfc\x22\x89\xeb\xeb\x91\xa4\x5d\xbd\xb3\x07\xce\xa8\x50\xfa\x62\xc8\x0d\xe8\x4e\xba\x22\xa0\x24\x50\x8d\x87\x75\x54\xfa\xaf\x08\xde\x29\xdb\x8b\xac\x51\x12\x34\x4c\xf0\x9c\xab\xce\x00\xcb\x49\x69\x03\xa5\x56\x0d\xe0\x7d\xcd\x3a\x43\x16\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb7\xe4\x5c\x0a\x4a\x03\xcb\xf3\xae\xe9\x6c\x2f\x25\x2b\x40\xa9\xba\xaa\xee\x65\x21\x05\x8d\xea\x24\x81\x50\xb2\x1a\xe5\x31\x2d\x6b\x80\x11\xb1\xfc\xce\x5c\xc0\x90\x15\x80\x69\x04\xe2\x58\xd8\x5b\x7d\x49\x63\x79\x6e\xaf\x9b\x08\x5e\xcb\xad\x92\x08\x35\x5b\x3b\x41\x8e\x08\xa0\x61\xdb\x01\xa8\x97\x6b\xc3\xa9\xe6\x5e\xf1\x16\x75\x63\x9b\xe3\x02\x04\x6f\x38\x81\x2a\x21\x31\xa4\x95\xac\xec\x4c\xf5\xda\x49\xb8\xdb\x79\x91\xe7\x66\x01\xb1\x35\xd5\xf7\xa8\xb9\x2a\x76\x3b\xdb\x77\x39\xd2\x28\x89\xdb\xa9\xc5\xd5\x21\xc3\x0b\x30\xbc\x69\xc5\x16\x72\x8d\x8c\x10\x18\x24\xec\x68\x1a\xb2\xb5\x3d\xf2\x4d\x89\xeb\xa7\x03\x20\xa6\x2b\x3b\x6b\xfe\x9b\x65\xaa\xa3\x65\x26\x98\xbc\xb3\x65\x6f\xac\xe7\x49\xcc\x56\x4e\x95\xd3\x95\x1c\x5a\x66\xac\x5e\x5c\x92\x72\xaa\xf6\xc3\xa5\x81\xb9\x5d\x95\x5c\xa0\x9b\x3f\x5d\xf4\xc8\x33\x6b\x27\x3b\x24\x2c\x2e\x20\x57\xed\xd6\xdf\x76\xf7\xac\x68\xc6\x35\x0f\x23\x14\xcb\xd4\x1a\xc1\x77\x26\x99\xba\x07\x26\x0b\x28\xb9\x46\x60\x1b\xb6\x7d\x0e\x3f\xab\x0e\x72\x26\x81\x34\xcb\xef\x3c\xef\x4e\x6b\x1b\x46\x2d\x4a\x5b\x2a\xf6\x8e\xcd\x50\xa8\x8d\x23\xf1\x68\x25\x47\xe1\xbc\x6c\x10\xa1\x56\x1b\x68\xba\xdc\x29\x68\xdd\x8b\xf6\x60\xc3\x38\x41\x27\x89\x0b\xaf\x37\x75\x5a\x42\xae\x1a\x34\x13\x2f\x9c\x7c\x7e\xe3\x57\xff\xb1\x1f\x70\xdc\x71\x1c\xc3\x5b\xa1\x32\x26\x60\x6d\x33\x46\x26\xec\xa3\x52\x60\x3b\xa9\x03\x1d\x0c\x31\xea\x8c\x8d\x14\x67\x47\xf7\xa4\xec\xfd\x35\xd3\x36\x72\xb1\x69\x09\xd2\xbe\x3d\xb7\x7b\x06\xf5\xda\x0e\x1d\x3d\x8f\xaf\xb0\xe4\xd2\x5b\xb6\xec\x64\x6e\xa7\x07\xa0\x9a\x11\xf8\x06\xc2\x00\x73\x16\x87\x4e\x0b\xe8\xcd\xed\x11\x46\x3c\x47\x07\xe9\x78\x7d\xfe\xa8\xb1\xe9\x3f\xfa\x76\x63\xd1\x4f\x13\x1e\x26\x32\x28\x8b\xf9\xff\xff\xf8\xdd\xb7\x91\x21\xcd\x65\xc5\xcb\xed\xfc\xa1\xd3\x62\x09\xff\x3b\x0f\xfe\xc7\x35\x99\x8b\x5f\x2e\x7f\x8b\xd6\x4c\x74\xf8\x08\xfa\x02\xfa\xcf\x25\x1c\x72\xd9\x2d\x16\x37\xa7\x3b\xac\x49\x5f\xa7\xd1\x20\xcd\x2d\xe1\xd8\x08\xed\x6e\x0e\x0d\xc3\xa0\x41\xaa\x95\x0b\x02\x8d\xb9\x92\x12\x73\x82\xae\x55\xb2\xb7\x03\x08\x65\xcc\x60\x8c\x3d\xc5\xc4\x1e\x83\xc2\xbc\x84\xf9\xe0\x91\x4f\xe0\x05\xa4\x29\x5c\x0e\x67\xbd\x35\x20\x05\x89\x1b\xf8\x27\x66\x3f\xaa\xfc\x0e\x69\x1e\x6c\x8c\x7d\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x73\xd8\x0e\x6c\x63\xfa\xe7\x60\x1f\x84\xe5\x27\x55\x2f\xe9\xf9\xb9\x0f\x95\xc1\x5d\x4a\x36\x68\x0c\xab\x70\xaa\xa1\x4b\xca\xa3\x2a\xd6\x10\x8d\xa9\x20\x05\xe7\xd6\x96\x69\x83\x9e\x24\xb2\x8d\x40\xcf\xc5\x99\xc3\x91\xa5\x29\xc8\x4e\x88\xf1\xfe\x4c\xa3\x7d\x45\x3d\xd9\xee\xd9\x01\x79\xe4\x73\xe6\xf3\x34\x05\x5b\x15\xad\x8f\x8a\xfd\x4d\x1b\x32\xbe\x7e\x2f\x22\x5b\x98\xf7\x37\x16\x23\xdc\x23\x34\x2c\xfe\x0c\x0e\x8b\x63\x3c\x2c\x9e\x00\x74\xed\xd2\xfb\xf0\x7c\x7b\x35\x81\x73\x1b\x4f\xa0\xc9\xae\xc9\x50\xbf\x0f\xce\xb7\x4b\x3d\x9c\x33\xf5\x37\x92\x26\x77\x2f\xe0\xea\xd5\xe2\x09\x74\xd4\x5a\x3d\x09\x2e\x15\x6d\xe7\x0f\x82\x6d\x6d\xba\x87\x33\x52\xed\x97\xae\xbb\x39\xbb\x00\xcb\x6b\x09\x23\xc2\x85\x1b\xa9\x96\x70\xe6\x56\x67\xbb\x27\xb8\x99\x2e\xcf\x6d\x21\xf8\x18\x7e\x3d\xc6\xc8\xb1\x5f\x3f\xc9\x73\x4c\xec\x07\x4c\xe1\xd3\x4f\xe1\xd1\xe9\x61\x08\xda\x18\xee\x2b\x14\xa4\x10\x04\x3d\xfc\xac\x54\x1a\xe6\xf6\x90\xa7\x97\x37\xc0\x93\x29\x4c\x24\x50\x56\x54\xdf\x00\x3f\x3f\xdf\x23\xcd\x06\x98\xf3\x14\x02\xdb\xc0\x27\x54\xac\x5c\x23\xe5\xbb\xad\x5f\x03\x3b\xb0\xd9\x41\x56\x16\x4b\x9b\x66\xe7\x67\xfb\x2a\x3c\x29\xc0\xe7\x07\x22\xff\xc2\x7f\x8b\x3a\x83\xda\x95\xcc\x73\x08\xa2\x56\x56\x5f\xb8\x31\xef\xd5\xcb\xb3\xc5\x0d\xec\x31\xdd\xf0\xb7\x84\xdc\x8e\x42\x37\xe0\xc7\x09\xd7\xd4\xc1\x38\x08\xb9\x55\xa6\x74\x81\x3a\xd4\xac\xe0\x9d\x59\xc2\xcb\xf6\xfe\xe6\xd7\x61\x50\x74\xad\xa7\x93\xbb\xd5\xb8\x3a\x25\xcb\xd0\xdd\x9c\x43\x90\xc4\x96\x68\xb8\x32\x6a\x39\xfd\xbd\x09\x4e\x34\xcd\x30\xfe\x1a\xd4\xef\x37\xbc\x28\x04\x5a\x21\x1c\x43\xff\xb3\x5d\xd1\x69\x97\xb8\xe6\x7e\x3d\x3f\x96\x83\x78\x83\x8b\xa8\x93\xfc\x7e\xbe\x08\x7b\x9a\x61\x7d\x01\x67\xc6\xe6\xe7\xc2\x9c\x2d\xa2\xba\x6b\x98\xe4\x7f\xe0\xdc\x76\xe0\x0b\x2f\xb7\x95\xd8\xb6\xd5\xa3\xb7\x77\x93\x87\x36\x8e\x84\x8b\xa8\xa6\x46\xcc\x83\x84\xdc\x6f\x5a\x56\xb8\xd1\xc5\x0e\xc5\x6f\x1f\x46\xe4\xee\x30\x87\xe6\x42\x19\x3c\xaa\x11\x60\x90\xde\xf1\x06\x55\x47\xf3\xb1\x8e\x5c\xd8\x31\xf5\x72\x71\x03\xbe\x2e\xed\x11\xfc\xdb\xfd\xeb\x08\xbb\xbe\xbc\xbd\x31\x76\x74\xe0\xa6\x06\x06\x1b\xcc\x8c\xab\x10\xd0\xdf\x71\x4d\x80\x2f\xf6\xaf\xbf\xff\x66\x52\xf0\x47\xd4\xb9\x53\x6f\xfc\xf1\xf4\x54\xa5\x3d\xf9\x6b\xed\x66\xb3\x89\x2a\xa5\x2a\xe1\x7f\xa7\x1d\x4b\xb1\xad\x3f\xd1\xad\x9d\x4f\xcd\x56\xe6\x50\x60\x89\x7a\x35\x81\xef\xeb\x73\x12\xfb\xdf\x11\x93\xd8\xff\x1f\xc9\x7f\x02\x00\x00\xff\xff\xe9\xcd\x27\xe5\x34\x19\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xff\x6f\xdb\xb6\xb6\xff\xd9\xfd\x2b\x4e\xf5\xde\x16\x1b\x89\xa4\xa4\x29\xba\xc1\x91\x3c\x14\x5b\x5f\xb7\x87\x8b\x6d\xd8\x3a\xdc\x3b\x6c\xc3\x05\x25\x1d\x49\x4c\x28\x52\x23\x8f\xec\x78\x81\xff\xf7\x0b\x92\x92\x2c\x3b\x4e\xd7\xdd\xee\x97\x54\x24\x0f\x3f\xe7\x2b\xcf\x17\x37\x79\xfe\xd5\x77\x5f\xbe\xfb\xf9\xfb\x37\x50\x53\x23\x56\xcf\x12\xfb\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcd\x92\x1a\x59\xb1\x7a\x36\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x3f\xa8\x89\xda\x10\x7f\xef\xf8\x3a\x0d\xfe\x15\xfe\xf4\x3a\xfc\x52\x35\x2d\x23\x9e\x09\x0c\x20\x57\x92\x50\x52\x1a\x7c\xf3\x26\xc5\xa2\xc2\xc9\x3d\xc9\x1a\x4c\x83\x35\xc7\x4d\xab\x34\x4d\x48\x37\xbc\xa0\x3a\x2d\x70\xcd\x73\x0c\xdd\xe2\x02\xb8\xe4\xc4\x99\x08\x4d\xce\x04\xa6\x57\xc1\xea\x99\xc5\x21\x4e\x02\x57\x0f\x0f\xd1\xb7\x48\x1b\xa5\xef\x76\xbb\x25\xbc\xe5\xf4\x75\x97\xc1\xff\xb1\x2e\x47\x4a\x62\x4f\xe2\xa8\x05\x97\x77\x50\x6b\x2c\xd3\xc0\xca\x6c\x96\x71\x9c\x17\xf2\xd6\x44\xb9\x50\x5d\x51\x0a\xa6\x31\xca\x55\x13\xb3\x5b\x76\x1f\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xbd\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\x7f\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x5f\x46\x9f\x45\x97\x8e\xe5\x74\xfb\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\xdb\xdf\x3b\xd4\xdb\xf8\x3a\xba\x8a\xae\xfa\x85\xe3\x73\x6b\x82\x55\x12\x7b\xc0\xd5\x47\x61\x87\x52\xd1\x36\x7e\x11\xbd\x8c\xae\xe2\x96\xe5\x77\xac\xc2\x62\xe0\x64\x8f\xa2\x61\xf3\x6f\xe3\xfb\x94\x0f\x6f\x8f\x5d\xf8\x77\x30\x6b\x54\x83\x92\xa2\x5b\x13\xbf\x88\xae\x3e\x8f\x2e\x87\x8d\xc7\xf8\x8e\x81\x75\x9a\x65\x35\x8b\xd6\xa8\x89\xe7\x4c\x84\x39\x4a\x42\x0d\x0f\x76\x77\xd6\x70\x19\xd6\xc8\xab\x9a\x96\x70\x75\x79\xf9\xc9\xcd\xa9\xdd\x75\xed\xb7\x0b\x6e\x5a\xc1\xb6\x4b\x28\x05\xde\xfb\x2d\x26\x78\x25\x43\x4e\xd8\x98\x25\x78\x64\x77\xb0\x73\x3c\x5b\xad\x2a\x8d\xc6\xf4\xcc\x5a\x65\x38\x71\x25\x97\x36\xa2\x18\xf1\x35\x9e\xa2\x35\x2d\x93\x8f\x2e\xb0\xcc\x28\xd1\x11\x1e\x09\x92\x09\x95\xdf\xf9\x3d\xf7\x8c\xa7\x4a\xe4\x4a\x28\xbd\x84\x4d\xcd\xfb\x6b\xe0\x18\x41\xab\xb1\x87\x87\x96\x15\x05\x97\xd5\x12\x5e\xb5\xbd\x3e\xd0\x30\x5d\x71\xb9\x84\xcb\xfd\x95\x24\x1e\xcc\x98\xc4\x3e\x63\x3d\x9b\x25\x99\x2a\xb6\xce\x87\x05\x5f\x43\x2e\x98\x31\x69\x70\x64\x62\x97\x89\x0e\x08\x6c\x02\x62\x5c\x0e\x47\x07\x67\x5a\x6d\x02\x70\x8c\xd2\xc0\x0b\x11\x66\x8a\x48\x35\x4b\xb8\xb2\xe2\xf5\x57\x8e\xf0\x44\x28\xaa\xf0\xea\xc5\x70\x38\x4b\xea\xab\x01\x84\xf0\x9e\x42\xe7\x9f\xd1\x33\xc1\x2a\xe1\xc3\xdd\x92\x41\xc9\xc2\x8c\x51\x1d\x00\xd3\x9c\x85\x35\x2f\x0a\x94\x69\x40\xba\x43\x1b\x47\x7c\x05\xd3\xbc\x37\xa4\xbd\xd7\x1d\xd5\x28\xad\x9e\x84\x45\x9f\x04\xe1\x18\xb6\xe2\x54\x77\x59\xc8\x04\x3d\x09\x9e\xc4\xf5\xd5\xa0\x52\x5c\xf0\x75\x6f\x91\xc9\xe7\x91\x71\x9e\xd6\xff\x73\xe8\x3f\x54\x59\x1a\xa4\x70\x62\x8e\x09\x31\x97\x6d\x47\x61\xa5\x55\xd7\x8e\xe7\xb3\xc4\xed\x02\x2f\xd2\xa0\xe2\x86\x02\xa0\x6d\xdb\xdb\x2e\x18\x55\x52\xba\x09\xad\xeb\xb4\x12\x01\xb4\x82\xe5\x58\x2b\x51\xa0\x4e\x83\xde\x26\x6f\xb9\x21\xf8\xe9\x87\x7f\x40\xef\x60\x2e\x2b\xd8\xaa\x4e\xc3\x1b\xaa\x51\x63\xd7\x00\x2b\x0a\x1b\xdc\x51\x14\x4d\x78\xbb\x48\x7f\x2c\x5d\x98\x91\xdc\x53\xcd\x92\xac\x23\x52\x23\x61\x46\x12\x32\x92\x61\x81\x25\xeb\xc4\x28\xb1\x27\x0a\x40\xc9\x5c\xf0\xfc\x2e\x0d\x1e\x1e\x78\x09\xd1\x0f\x98\xb3\x96\xf2\x9a\xed\x76\x95\x1e\xbe\x23\xbc\xc7\xbc\x23\x9c\x2f\x1e\x1e\x50\x18\xdc\xed\x4c\x97\x35\x9c\xdc\x5a\x16\xbb\x5d\xb0\x7a\xcb\xd7\x08\x0d\x7a\x05\x9e\x27\xb1\x87\xdf\x8b\x1e\x5b\xd9\x47\x2b\x3b\xa7\x3d\x62\x78\xc2\x07\x55\x38\x0a\x11\x40\xc1\x88\x85\x86\x13\xde\xe1\xd6\xca\x3b\xbd\xdb\x9f\xe6\x4c\x88\x8c\x59\x75\xbc\x84\xe3\xa5\x3f\xd0\x9a\x6c\xcd\x8d\x6b\x02\x56\x83\x04\x4e\xfa\xbf\x12\x54\x47\x2f\x8e\x54\xbb\x84\xeb\x17\x93\xe7\x76\x2a\xde\x5e\x1d\xc5\xdb\xf5\x49\xe2\x96\x49\x14\xe0\xfe\x86\xa6\x61\x62\xf8\x1e\x1c\xb7\x37\xe6\xf1\xa5\xd0\x26\x97\x51\xb4\x31\x49\x5d\xde\x80\x5a\xa3\x2e\x85\xda\x2c\x81\x75\xa4\x6e\xa0\x61\xf7\x63\xa2\xbe\xbe\xbc\x9c\xca\x6d\x9b\x17\x96\x09\x74\xb1\xad\xf1\xf7\x0e\x0d\x99\x31\xa6\xfd\x91\xfb\x6b\x43\xbb\x40\x69\xb0\x38\xb2\x86\xe5\x68\x4d\xeb\xa8\x26\xae\x1f\x8d\x79\x52\xf6\x52\xa9\x31\xf7\x4d\xc5\xe8\xa1\x27\x69\x3a\x58\x25\xa4\xf7\x74\xb3\x84\x8a\xbf\x94\xbb\xb4\xed\x4d\x9e\x4a\x5d\xfe\x71\x59\xdd\x5b\x44\xed\x0b\xa3\x0d\x59\x70\xcb\x24\xa6\xe2\x23\x38\xdb\x20\xcc\x98\xc1\x0f\x61\xef\x4a\xd4\x9e\xbd\x5b\x7e\x2c\xff\x1a\x99\xa6\x0c\xd9\xd3\xd9\x75\x22\x40\xd9\xc9\x62\xa2\xbf\x7b\xd1\x1f\x2b\x40\x27\xf9\x1a\xb5\xe1\xb4\xfd\x50\x09\xb0\xd8\x8b\xe0\xd7\x87\x22\x24\x31\xe9\xf7\xc7\xda\x74\xf1\x37\x3d\xee\x3f\xab\xa5\xd7\xab\xaf\xd5\x06\x0a\x85\x06\xa8\xe6\x06\x6c\x25\xfc\x22\x89\xeb\xeb\x91\xa4\x5d\xbd\xb3\x07\xce\xa8\x50\xfa\x62\xc8\x0d\xe8\x4e\xba\x22\xa0\x24\x50\x8d\x87\x75\x54\xfa\xaf\x08\xde\x29\xdb\x8b\xac\x51\x12\x34\x4c\xf0\x9c\xab\xce\x00\xcb\x49\x69\x03\xa5\x56\x0d\xe0\x7d\xcd\x3a\x43\x16\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb7\xe4\x5c\x0a\x4a\x03\xcb\xf3\xae\xe9\x6c\x2f\x25\x2b\x40\xa9\xba\xaa\xee\x65\x21\x05\x8d\xea\x24\x81\x50\xb2\x1a\xe5\x31\x2d\x6b\x80\x11\xb1\xfc\xce\x5c\xc0\x90\x15\x80\x69\x04\xe2\x58\xd8\x5b\x7d\x49\x63\x79\x6e\xaf\x9b\x08\x5e\xcb\xad\x92\x08\x35\x5b\x3b\x41\x8e\x08\xa0\x61\xdb\x01\xa8\x97\x6b\xc3\xa9\xe6\x5e\xf1\x16\x75\x63\x9b\xe3\x02\x04\x6f\x38\x81\x2a\x21\x31\xa4\x95\xac\xec\x4c\xf5\xda\x49\xb8\xdb\x79\x91\xe7\x66\x01\xb1\x35\xd5\xf7\xa8\xb9\x2a\x76\x3b\xdb\x77\x39\xd2\x28\x89\xdb\xa9\xc5\xd5\x21\xc3\x0b\x30\xbc\x69\xc5\x16\x72\x8d\x8c\x10\x18\x24\xec\x68\x1a\xb2\xb5\x3d\xf2\x4d\x89\xeb\xa7\x03\x20\xa6\x2b\x3b\x6b\xfe\x9b\x65\xaa\xa3\x65\x26\x98\xbc\xb3\x65\x6f\xac\xe7\x49\xcc\x56\x4e\x95\xd3\x95\x1c\x5a\x66\xac\x5e\x5c\x92\x72\xaa\xf6\xc3\xa5\x81\xb9\x5d\x95\x5c\xa0\x9b\x3f\x5d\xf4\xc8\x33\x6b\x27\x3b\x24\x2c\x2e\x20\x57\xed\xd6\xdf\x76\xf7\xac\x68\xc6\x35\x0f\x23\x14\xcb\xd4\x1a\xc1\x77\x26\x99\xba\x07\x26\x0b\x28\xb9\x46\x60\x1b\xb6\x7d\x0e\x3f\xab\x0e\x72\x26\x81\x34\xcb\xef\x3c\xef\x4e\x6b\x1b\x46\x2d\x4a\x5b\x2a\xf6\x8e\xcd\x50\xa8\x8d\x23\xf1\x68\x25\x47\xe1\xbc\x6c\x10\xa1\x56\x1b\x68\xba\xdc\x29\x68\xdd\x8b\xf6\x60\xc3\x38\x41\x27\x89\x0b\xaf\x37\x75\x5a\x42\xae\x1a\x34\x13\x2f\x9c\x7c\x7e\xe3\x57\xff\xb1\x1f\x70\xdc\x71\x1c\xc3\x5b\xa1\x32\x26\x60\x6d\x33\x46\x26\xec\xa3\x52\x60\x3b\xa9\x03\x1d\x0c\x31\xea\x8c\x8d\x14\x67\x47\xf7\xa4\xec\xfd\x35\xd3\x36\x72\xb1\x69\x09\xd2\xbe\x3d\xb7\x7b\x06\xf5\xda\x0e\x1d\x3d\x8f\xaf\xb0\xe4\xd2\x5b\xb6\xec\x64\x6e\xa7\x07\xa0\x9a\x11\xf8\x06\xc2\x00\x73\x16\x87\x4e\x0b\xe8\xcd\xed\x11\x46\x3c\x47\x07\xe9\x78\x7d\xfe\xa8\xb1\xe9\x3f\xfa\x76\x63\xd1\x4f\x13\x1e\x26\x32\x28\x8b\xf9\xff\xff\xf8\xdd\xb7\x91\x21\xcd\x65\xc5\xcb\xed\xfc\xa1\xd3\x62\x09\xff\x3b\x0f\xfe\xc7\x35\x99\x8b\x5f\x2e\x7f\x8b\xd6\x4c\x74\xf8\x08\xfa\x02\xfa\xcf\x25\x1c\x72\xd9\x2d\x16\x37\xa7\x3b\xac\x49\x5f\xa7\xd1\x20\xcd\x2d\xe1\xd8\x08\xed\x6e\x0e\x0d\xc3\xa0\x41\xaa\x95\x0b\x02\x8d\xb9\x92\x12\x73\x82\xae\x55\xb2\xb7\x03\x08\x65\xcc\x60\x8c\x3d\xc5\xc4\x1e\x83\xc2\xbc\x84\xf9\xe0\x91\x4f\xe0\x05\xa4\x29\x5c\x0e\x67\xbd\x35\x20\x05\x89\x1b\xf8\x27\x66\x3f\xaa\xfc\x0e\x69\x1e\x6c\x8c\x7d\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x73\xd8\x0e\x6c\x63\xfa\xe7\x60\x1f\x84\xe5\x27\x55\x2f\xe9\xf9\xb9\x0f\x95\xc1\x5d\x4a\x36\x68\x0c\xab\x70\xaa\xa1\x4b\xca\xa3\x2a\xd6\x10\x8d\xa9\x20\x05\xe7\xd6\x96\x69\x83\x9e\x24\xb2\x8d\x40\xcf\xc5\x99\xc3\x91\xa5\x29\xc8\x4e\x88\xf1\xfe\x4c\xa3\x7d\x45\x3d\xd9\xee\xd9\x01\x79\xe4\x73\xe6\xf3\x34\x05\x5b\x15\xad\x8f\x8a\xfd\x4d\x1b\x32\xbe\x7e\x2f\x22\x5b\x98\xf7\x37\x16\x23\xdc\x23\x34\x2c\xfe\x0c\x0e\x8b\x63\x3c\x2c\x9e\x00\x74\xed\xd2\xfb\xf0\x7c\x7b\x35\x81\x73\x1b\x4f\xa0\xc9\xae\xc9\x50\xbf\x0f\xce\xb7\x4b\x3d\x9c\x33\xf5\x37\x92\x26\x77\x2f\xe0\xea\xd5\xe2\x09\x74\xd4\x5a\x3d\x09\x2e\x15\x6d\xe7\x0f\x82\x6d\x6d\xba\x87\x33\x52\xed\x97\xae\xbb\x39\xbb\x00\xcb\x6b\x09\x23\xc2\x85\x1b\xa9\x96\x70\xe6\x56\x67\xbb\x27\xb8\x99\x2e\xcf\x6d\x21\xf8\x18\x7e\x3d\xc6\xc8\xb1\x5f\x3f\xc9\x73\x4c\xec\x07\x4c\xe1\xd3\x4f\xe1\xd1\xe9\x61\x08\xda\x18\xee\x2b\x14\xa4\x10\x04\x3d\xfc\xac\x54\x1a\xe6\xf6\x90\xa7\x97\x37\xc0\x93\x29\x4c\x24\x50\x56\x54\xdf\x00\x3f\x3f\xdf\x23\xcd\x06\x98\xf3\x14\x02\xdb\xc0\x27\x54\xac\x5c\x23\xe5\xbb\xad\x5f\x03\x3b\xb0\xd9\x41\x56\x16\x4b\x9b\x66\xe7\x67\xfb\x2a\x3c\x29\xc0\xe7\x07\x22\xff\xc2\x7f\x8b\x3a\x83\xda\x95\xcc\x73\x08\xa2\x56\x56\x5f\xb8\x31\xef\xd5\xcb\xb3\xc5\x0d\xec\x31\xdd\xf0\xb7\x84\xdc\x8e\x42\x37\xe0\xc7\x09\xd7\xd4\xc1\x38\x08\xb9\x55\xa6\x74\x81\x3a\xd4\xac\xe0\x9d\x59\xc2\xcb\xf6\xfe\xe6\xd7\x61\x50\x74\xad\xa7\x93\xbb\xd5\xb8\x3a\x25\xcb\xd0\xdd\x9c\x43\x90\xc4\x96\x68\xb8\x32\x6a\x39\xfd\xbd\x09\x4e\x34\xcd\x30\xfe\x1a\xd4\xef\x37\xbc\x28\x04\x5a\x21\x1c\x43\xff\xb3\x5d\xd1\x69\x97\xb8\xe6\x7e\x3d\x3f\x96\x83\x78\x83\x8b\xa8\x93\xfc\x7e\xbe\x08\x7b\x9a\x61\x7d\x01\x67\xc6\xe6\xe7\xc2\x9c\x2d\xa2\xba\x6b\x98\xe4\x7f\xe0\xdc\x76\xe0\x0b\x2f\xb7\x95\xd8\xb6\xd5\xa3\xb7\x77\x93\x87\x36\x8e\x84\x8b\xa8\xa6\x46\xcc\x83\x84\xdc\x6f\x5a\x56\xb8\xd1\xc5\x0e\xc5\x6f\x1f\x46\xe4\xee\x30\x87\xe6\x42\x19\x3c\xaa\x11\x60\x90\xde\xf1\x06\x55\x47\xf3\xb1\x8e\x5c\xd8\x31\xf5\x72\x71\x03\xbe\x2e\xcd\xe2\x78\xc4\xf0\xaf\xf7\xaf\x63\xec\xfa\x02\xf7\xc6\xd8\xe1\x81\x9b\x1a\x18\x6c\x30\x33\xae\x46\x40\x7f\xc7\xb5\x01\xbe\xdc\xbf\xfe\xfe\x9b\x49\xc9\x1f\x51\xe7\x4e\xc1\xf1\xe7\xd3\x53\xb5\xf6\xe4\xef\xb5\x9b\xcd\x26\xaa\x94\xaa\x84\xff\xa5\x76\x2c\xc6\xb6\x02\x45\xb7\x76\x42\x35\x5b\x99\x43\x81\x25\xea\xd5\x04\xbe\xaf\xd0\x49\xec\x7f\x49\x4c\x62\xff\xbf\x24\xff\x09\x00\x00\xff\xff\x93\x31\x5b\xa3\x36\x19\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( From af48a331bf1ec8d30cff7d411afcce37741cbede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 16 Apr 2017 20:53:27 +0300 Subject: [PATCH 4/4] cmd: integrate invisible recaptcha into puppeth --- cmd/faucet/faucet.html | 3 +-- cmd/faucet/website.go | 2 +- cmd/puppeth/module_faucet.go | 41 +++++++++++++++++++++++------------- cmd/puppeth/wizard_faucet.go | 25 +++++++++++++++++++++- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index fa715560f..9e02134b7 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -77,7 +77,7 @@

How does this work?

-

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to GitHub accounts. Anyone having a GitHub account may request funds within the permitted limit of {{.Amount}} Ether(s) / {{.Period}}.

+

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to GitHub accounts. Anyone having a GitHub account may request funds within the permitted limit of {{.Amount}} Ether(s) / {{.Period}}.{{if .Recaptcha}} The faucet is running invisible reCaptcha protection against bots.{{end}}

To request funds, simply create a GitHub Gist with your Ethereum address pasted into the contents (the file name doesn't matter), copy paste the gists URL into the above input box and fire away! You can track the current pending requests below the input field to see how much you have to wait until your turn comes.

@@ -136,7 +136,6 @@ } } server.onclose = function() { setTimeout(reconnect, 3000); }; - //server.onerror = function() { setTimeout(reconnect, 3000); }; } // Establish a websocket connection to the API server reconnect(); diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index e85de5bc8..1a5e2e4c5 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xff\x6f\xdb\xb6\xb6\xff\xd9\xfd\x2b\x4e\xf5\xde\x16\x1b\x89\xa4\xa4\x29\xba\xc1\x91\x3c\x14\x5b\x5f\xb7\x87\x8b\x6d\xd8\x3a\xdc\x3b\x6c\xc3\x05\x25\x1d\x49\x4c\x28\x52\x23\x8f\xec\x78\x81\xff\xf7\x0b\x92\x92\x2c\x3b\x4e\xd7\xdd\xee\x97\x54\x24\x0f\x3f\xe7\x2b\xcf\x17\x37\x79\xfe\xd5\x77\x5f\xbe\xfb\xf9\xfb\x37\x50\x53\x23\x56\xcf\x12\xfb\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcd\x92\x1a\x59\xb1\x7a\x36\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x3f\xa8\x89\xda\x10\x7f\xef\xf8\x3a\x0d\xfe\x15\xfe\xf4\x3a\xfc\x52\x35\x2d\x23\x9e\x09\x0c\x20\x57\x92\x50\x52\x1a\x7c\xf3\x26\xc5\xa2\xc2\xc9\x3d\xc9\x1a\x4c\x83\x35\xc7\x4d\xab\x34\x4d\x48\x37\xbc\xa0\x3a\x2d\x70\xcd\x73\x0c\xdd\xe2\x02\xb8\xe4\xc4\x99\x08\x4d\xce\x04\xa6\x57\xc1\xea\x99\xc5\x21\x4e\x02\x57\x0f\x0f\xd1\xb7\x48\x1b\xa5\xef\x76\xbb\x25\xbc\xe5\xf4\x75\x97\xc1\xff\xb1\x2e\x47\x4a\x62\x4f\xe2\xa8\x05\x97\x77\x50\x6b\x2c\xd3\xc0\xca\x6c\x96\x71\x9c\x17\xf2\xd6\x44\xb9\x50\x5d\x51\x0a\xa6\x31\xca\x55\x13\xb3\x5b\x76\x1f\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xbd\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\x7f\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x5f\x46\x9f\x45\x97\x8e\xe5\x74\xfb\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\xdb\xdf\x3b\xd4\xdb\xf8\x3a\xba\x8a\xae\xfa\x85\xe3\x73\x6b\x82\x55\x12\x7b\xc0\xd5\x47\x61\x87\x52\xd1\x36\x7e\x11\xbd\x8c\xae\xe2\x96\xe5\x77\xac\xc2\x62\xe0\x64\x8f\xa2\x61\xf3\x6f\xe3\xfb\x94\x0f\x6f\x8f\x5d\xf8\x77\x30\x6b\x54\x83\x92\xa2\x5b\x13\xbf\x88\xae\x3e\x8f\x2e\x87\x8d\xc7\xf8\x8e\x81\x75\x9a\x65\x35\x8b\xd6\xa8\x89\xe7\x4c\x84\x39\x4a\x42\x0d\x0f\x76\x77\xd6\x70\x19\xd6\xc8\xab\x9a\x96\x70\x75\x79\xf9\xc9\xcd\xa9\xdd\x75\xed\xb7\x0b\x6e\x5a\xc1\xb6\x4b\x28\x05\xde\xfb\x2d\x26\x78\x25\x43\x4e\xd8\x98\x25\x78\x64\x77\xb0\x73\x3c\x5b\xad\x2a\x8d\xc6\xf4\xcc\x5a\x65\x38\x71\x25\x97\x36\xa2\x18\xf1\x35\x9e\xa2\x35\x2d\x93\x8f\x2e\xb0\xcc\x28\xd1\x11\x1e\x09\x92\x09\x95\xdf\xf9\x3d\xf7\x8c\xa7\x4a\xe4\x4a\x28\xbd\x84\x4d\xcd\xfb\x6b\xe0\x18\x41\xab\xb1\x87\x87\x96\x15\x05\x97\xd5\x12\x5e\xb5\xbd\x3e\xd0\x30\x5d\x71\xb9\x84\xcb\xfd\x95\x24\x1e\xcc\x98\xc4\x3e\x63\x3d\x9b\x25\x99\x2a\xb6\xce\x87\x05\x5f\x43\x2e\x98\x31\x69\x70\x64\x62\x97\x89\x0e\x08\x6c\x02\x62\x5c\x0e\x47\x07\x67\x5a\x6d\x02\x70\x8c\xd2\xc0\x0b\x11\x66\x8a\x48\x35\x4b\xb8\xb2\xe2\xf5\x57\x8e\xf0\x44\x28\xaa\xf0\xea\xc5\x70\x38\x4b\xea\xab\x01\x84\xf0\x9e\x42\xe7\x9f\xd1\x33\xc1\x2a\xe1\xc3\xdd\x92\x41\xc9\xc2\x8c\x51\x1d\x00\xd3\x9c\x85\x35\x2f\x0a\x94\x69\x40\xba\x43\x1b\x47\x7c\x05\xd3\xbc\x37\xa4\xbd\xd7\x1d\xd5\x28\xad\x9e\x84\x45\x9f\x04\xe1\x18\xb6\xe2\x54\x77\x59\xc8\x04\x3d\x09\x9e\xc4\xf5\xd5\xa0\x52\x5c\xf0\x75\x6f\x91\xc9\xe7\x91\x71\x9e\xd6\xff\x73\xe8\x3f\x54\x59\x1a\xa4\x70\x62\x8e\x09\x31\x97\x6d\x47\x61\xa5\x55\xd7\x8e\xe7\xb3\xc4\xed\x02\x2f\xd2\xa0\xe2\x86\x02\xa0\x6d\xdb\xdb\x2e\x18\x55\x52\xba\x09\xad\xeb\xb4\x12\x01\xb4\x82\xe5\x58\x2b\x51\xa0\x4e\x83\xde\x26\x6f\xb9\x21\xf8\xe9\x87\x7f\x40\xef\x60\x2e\x2b\xd8\xaa\x4e\xc3\x1b\xaa\x51\x63\xd7\x00\x2b\x0a\x1b\xdc\x51\x14\x4d\x78\xbb\x48\x7f\x2c\x5d\x98\x91\xdc\x53\xcd\x92\xac\x23\x52\x23\x61\x46\x12\x32\x92\x61\x81\x25\xeb\xc4\x28\xb1\x27\x0a\x40\xc9\x5c\xf0\xfc\x2e\x0d\x1e\x1e\x78\x09\xd1\x0f\x98\xb3\x96\xf2\x9a\xed\x76\x95\x1e\xbe\x23\xbc\xc7\xbc\x23\x9c\x2f\x1e\x1e\x50\x18\xdc\xed\x4c\x97\x35\x9c\xdc\x5a\x16\xbb\x5d\xb0\x7a\xcb\xd7\x08\x0d\x7a\x05\x9e\x27\xb1\x87\xdf\x8b\x1e\x5b\xd9\x47\x2b\x3b\xa7\x3d\x62\x78\xc2\x07\x55\x38\x0a\x11\x40\xc1\x88\x85\x86\x13\xde\xe1\xd6\xca\x3b\xbd\xdb\x9f\xe6\x4c\x88\x8c\x59\x75\xbc\x84\xe3\xa5\x3f\xd0\x9a\x6c\xcd\x8d\x6b\x02\x56\x83\x04\x4e\xfa\xbf\x12\x54\x47\x2f\x8e\x54\xbb\x84\xeb\x17\x93\xe7\x76\x2a\xde\x5e\x1d\xc5\xdb\xf5\x49\xe2\x96\x49\x14\xe0\xfe\x86\xa6\x61\x62\xf8\x1e\x1c\xb7\x37\xe6\xf1\xa5\xd0\x26\x97\x51\xb4\x31\x49\x5d\xde\x80\x5a\xa3\x2e\x85\xda\x2c\x81\x75\xa4\x6e\xa0\x61\xf7\x63\xa2\xbe\xbe\xbc\x9c\xca\x6d\x9b\x17\x96\x09\x74\xb1\xad\xf1\xf7\x0e\x0d\x99\x31\xa6\xfd\x91\xfb\x6b\x43\xbb\x40\x69\xb0\x38\xb2\x86\xe5\x68\x4d\xeb\xa8\x26\xae\x1f\x8d\x79\x52\xf6\x52\xa9\x31\xf7\x4d\xc5\xe8\xa1\x27\x69\x3a\x58\x25\xa4\xf7\x74\xb3\x84\x8a\xbf\x94\xbb\xb4\xed\x4d\x9e\x4a\x5d\xfe\x71\x59\xdd\x5b\x44\xed\x0b\xa3\x0d\x59\x70\xcb\x24\xa6\xe2\x23\x38\xdb\x20\xcc\x98\xc1\x0f\x61\xef\x4a\xd4\x9e\xbd\x5b\x7e\x2c\xff\x1a\x99\xa6\x0c\xd9\xd3\xd9\x75\x22\x40\xd9\xc9\x62\xa2\xbf\x7b\xd1\x1f\x2b\x40\x27\xf9\x1a\xb5\xe1\xb4\xfd\x50\x09\xb0\xd8\x8b\xe0\xd7\x87\x22\x24\x31\xe9\xf7\xc7\xda\x74\xf1\x37\x3d\xee\x3f\xab\xa5\xd7\xab\xaf\xd5\x06\x0a\x85\x06\xa8\xe6\x06\x6c\x25\xfc\x22\x89\xeb\xeb\x91\xa4\x5d\xbd\xb3\x07\xce\xa8\x50\xfa\x62\xc8\x0d\xe8\x4e\xba\x22\xa0\x24\x50\x8d\x87\x75\x54\xfa\xaf\x08\xde\x29\xdb\x8b\xac\x51\x12\x34\x4c\xf0\x9c\xab\xce\x00\xcb\x49\x69\x03\xa5\x56\x0d\xe0\x7d\xcd\x3a\x43\x16\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb7\xe4\x5c\x0a\x4a\x03\xcb\xf3\xae\xe9\x6c\x2f\x25\x2b\x40\xa9\xba\xaa\xee\x65\x21\x05\x8d\xea\x24\x81\x50\xb2\x1a\xe5\x31\x2d\x6b\x80\x11\xb1\xfc\xce\x5c\xc0\x90\x15\x80\x69\x04\xe2\x58\xd8\x5b\x7d\x49\x63\x79\x6e\xaf\x9b\x08\x5e\xcb\xad\x92\x08\x35\x5b\x3b\x41\x8e\x08\xa0\x61\xdb\x01\xa8\x97\x6b\xc3\xa9\xe6\x5e\xf1\x16\x75\x63\x9b\xe3\x02\x04\x6f\x38\x81\x2a\x21\x31\xa4\x95\xac\xec\x4c\xf5\xda\x49\xb8\xdb\x79\x91\xe7\x66\x01\xb1\x35\xd5\xf7\xa8\xb9\x2a\x76\x3b\xdb\x77\x39\xd2\x28\x89\xdb\xa9\xc5\xd5\x21\xc3\x0b\x30\xbc\x69\xc5\x16\x72\x8d\x8c\x10\x18\x24\xec\x68\x1a\xb2\xb5\x3d\xf2\x4d\x89\xeb\xa7\x03\x20\xa6\x2b\x3b\x6b\xfe\x9b\x65\xaa\xa3\x65\x26\x98\xbc\xb3\x65\x6f\xac\xe7\x49\xcc\x56\x4e\x95\xd3\x95\x1c\x5a\x66\xac\x5e\x5c\x92\x72\xaa\xf6\xc3\xa5\x81\xb9\x5d\x95\x5c\xa0\x9b\x3f\x5d\xf4\xc8\x33\x6b\x27\x3b\x24\x2c\x2e\x20\x57\xed\xd6\xdf\x76\xf7\xac\x68\xc6\x35\x0f\x23\x14\xcb\xd4\x1a\xc1\x77\x26\x99\xba\x07\x26\x0b\x28\xb9\x46\x60\x1b\xb6\x7d\x0e\x3f\xab\x0e\x72\x26\x81\x34\xcb\xef\x3c\xef\x4e\x6b\x1b\x46\x2d\x4a\x5b\x2a\xf6\x8e\xcd\x50\xa8\x8d\x23\xf1\x68\x25\x47\xe1\xbc\x6c\x10\xa1\x56\x1b\x68\xba\xdc\x29\x68\xdd\x8b\xf6\x60\xc3\x38\x41\x27\x89\x0b\xaf\x37\x75\x5a\x42\xae\x1a\x34\x13\x2f\x9c\x7c\x7e\xe3\x57\xff\xb1\x1f\x70\xdc\x71\x1c\xc3\x5b\xa1\x32\x26\x60\x6d\x33\x46\x26\xec\xa3\x52\x60\x3b\xa9\x03\x1d\x0c\x31\xea\x8c\x8d\x14\x67\x47\xf7\xa4\xec\xfd\x35\xd3\x36\x72\xb1\x69\x09\xd2\xbe\x3d\xb7\x7b\x06\xf5\xda\x0e\x1d\x3d\x8f\xaf\xb0\xe4\xd2\x5b\xb6\xec\x64\x6e\xa7\x07\xa0\x9a\x11\xf8\x06\xc2\x00\x73\x16\x87\x4e\x0b\xe8\xcd\xed\x11\x46\x3c\x47\x07\xe9\x78\x7d\xfe\xa8\xb1\xe9\x3f\xfa\x76\x63\xd1\x4f\x13\x1e\x26\x32\x28\x8b\xf9\xff\xff\xf8\xdd\xb7\x91\x21\xcd\x65\xc5\xcb\xed\xfc\xa1\xd3\x62\x09\xff\x3b\x0f\xfe\xc7\x35\x99\x8b\x5f\x2e\x7f\x8b\xd6\x4c\x74\xf8\x08\xfa\x02\xfa\xcf\x25\x1c\x72\xd9\x2d\x16\x37\xa7\x3b\xac\x49\x5f\xa7\xd1\x20\xcd\x2d\xe1\xd8\x08\xed\x6e\x0e\x0d\xc3\xa0\x41\xaa\x95\x0b\x02\x8d\xb9\x92\x12\x73\x82\xae\x55\xb2\xb7\x03\x08\x65\xcc\x60\x8c\x3d\xc5\xc4\x1e\x83\xc2\xbc\x84\xf9\xe0\x91\x4f\xe0\x05\xa4\x29\x5c\x0e\x67\xbd\x35\x20\x05\x89\x1b\xf8\x27\x66\x3f\xaa\xfc\x0e\x69\x1e\x6c\x8c\x7d\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x73\xd8\x0e\x6c\x63\xfa\xe7\x60\x1f\x84\xe5\x27\x55\x2f\xe9\xf9\xb9\x0f\x95\xc1\x5d\x4a\x36\x68\x0c\xab\x70\xaa\xa1\x4b\xca\xa3\x2a\xd6\x10\x8d\xa9\x20\x05\xe7\xd6\x96\x69\x83\x9e\x24\xb2\x8d\x40\xcf\xc5\x99\xc3\x91\xa5\x29\xc8\x4e\x88\xf1\xfe\x4c\xa3\x7d\x45\x3d\xd9\xee\xd9\x01\x79\xe4\x73\xe6\xf3\x34\x05\x5b\x15\xad\x8f\x8a\xfd\x4d\x1b\x32\xbe\x7e\x2f\x22\x5b\x98\xf7\x37\x16\x23\xdc\x23\x34\x2c\xfe\x0c\x0e\x8b\x63\x3c\x2c\x9e\x00\x74\xed\xd2\xfb\xf0\x7c\x7b\x35\x81\x73\x1b\x4f\xa0\xc9\xae\xc9\x50\xbf\x0f\xce\xb7\x4b\x3d\x9c\x33\xf5\x37\x92\x26\x77\x2f\xe0\xea\xd5\xe2\x09\x74\xd4\x5a\x3d\x09\x2e\x15\x6d\xe7\x0f\x82\x6d\x6d\xba\x87\x33\x52\xed\x97\xae\xbb\x39\xbb\x00\xcb\x6b\x09\x23\xc2\x85\x1b\xa9\x96\x70\xe6\x56\x67\xbb\x27\xb8\x99\x2e\xcf\x6d\x21\xf8\x18\x7e\x3d\xc6\xc8\xb1\x5f\x3f\xc9\x73\x4c\xec\x07\x4c\xe1\xd3\x4f\xe1\xd1\xe9\x61\x08\xda\x18\xee\x2b\x14\xa4\x10\x04\x3d\xfc\xac\x54\x1a\xe6\xf6\x90\xa7\x97\x37\xc0\x93\x29\x4c\x24\x50\x56\x54\xdf\x00\x3f\x3f\xdf\x23\xcd\x06\x98\xf3\x14\x02\xdb\xc0\x27\x54\xac\x5c\x23\xe5\xbb\xad\x5f\x03\x3b\xb0\xd9\x41\x56\x16\x4b\x9b\x66\xe7\x67\xfb\x2a\x3c\x29\xc0\xe7\x07\x22\xff\xc2\x7f\x8b\x3a\x83\xda\x95\xcc\x73\x08\xa2\x56\x56\x5f\xb8\x31\xef\xd5\xcb\xb3\xc5\x0d\xec\x31\xdd\xf0\xb7\x84\xdc\x8e\x42\x37\xe0\xc7\x09\xd7\xd4\xc1\x38\x08\xb9\x55\xa6\x74\x81\x3a\xd4\xac\xe0\x9d\x59\xc2\xcb\xf6\xfe\xe6\xd7\x61\x50\x74\xad\xa7\x93\xbb\xd5\xb8\x3a\x25\xcb\xd0\xdd\x9c\x43\x90\xc4\x96\x68\xb8\x32\x6a\x39\xfd\xbd\x09\x4e\x34\xcd\x30\xfe\x1a\xd4\xef\x37\xbc\x28\x04\x5a\x21\x1c\x43\xff\xb3\x5d\xd1\x69\x97\xb8\xe6\x7e\x3d\x3f\x96\x83\x78\x83\x8b\xa8\x93\xfc\x7e\xbe\x08\x7b\x9a\x61\x7d\x01\x67\xc6\xe6\xe7\xc2\x9c\x2d\xa2\xba\x6b\x98\xe4\x7f\xe0\xdc\x76\xe0\x0b\x2f\xb7\x95\xd8\xb6\xd5\xa3\xb7\x77\x93\x87\x36\x8e\x84\x8b\xa8\xa6\x46\xcc\x83\x84\xdc\x6f\x5a\x56\xb8\xd1\xc5\x0e\xc5\x6f\x1f\x46\xe4\xee\x30\x87\xe6\x42\x19\x3c\xaa\x11\x60\x90\xde\xf1\x06\x55\x47\xf3\xb1\x8e\x5c\xd8\x31\xf5\x72\x71\x03\xbe\x2e\xcd\xe2\x78\xc4\xf0\xaf\xf7\xaf\x63\xec\xfa\x02\xf7\xc6\xd8\xe1\x81\x9b\x1a\x18\x6c\x30\x33\xae\x46\x40\x7f\xc7\xb5\x01\xbe\xdc\xbf\xfe\xfe\x9b\x49\xc9\x1f\x51\xe7\x4e\xc1\xf1\xe7\xd3\x53\xb5\xf6\xe4\xef\xb5\x9b\xcd\x26\xaa\x94\xaa\x84\xff\xa5\x76\x2c\xc6\xb6\x02\x45\xb7\x76\x42\x35\x5b\x99\x43\x81\x25\xea\xd5\x04\xbe\xaf\xd0\x49\xec\x7f\x49\x4c\x62\xff\xbf\x24\xff\x09\x00\x00\xff\xff\x93\x31\x5b\xa3\x36\x19\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xef\x72\xdb\x36\x12\xff\xac\x3c\xc5\x86\x77\xad\xa5\xb1\x49\xda\x71\x26\xed\xc8\xa4\x3a\x99\x34\x97\xf6\xe6\xa6\xed\xb4\xe9\xdc\x75\xda\xce\x0d\x48\x2e\x49\xc4\x20\xc0\x02\x4b\xc9\xaa\x47\xef\x7e\x03\x80\xa4\x28\x59\x4e\xd3\x4b\xbf\xc8\x04\xb0\xf8\xed\x62\x77\xb1\x7f\xe0\xe4\xe9\x97\xdf\xbe\x7a\xfb\xd3\x77\xaf\xa1\xa6\x46\xac\x9e\x24\xf6\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcc\x92\x1a\x59\xb1\x7a\x32\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x5f\xa8\x89\xda\x10\x7f\xeb\xf8\x3a\x0d\xfe\x13\xfe\xf8\x32\x7c\xa5\x9a\x96\x11\xcf\x04\x06\x90\x2b\x49\x28\x29\x0d\xbe\x7e\x9d\x62\x51\xe1\x64\x9f\x64\x0d\xa6\xc1\x9a\xe3\xa6\x55\x9a\x26\xa4\x1b\x5e\x50\x9d\x16\xb8\xe6\x39\x86\x6e\x70\x01\x5c\x72\xe2\x4c\x84\x26\x67\x02\xd3\xab\x60\xf5\xc4\xe2\x10\x27\x81\xab\xfb\xfb\xe8\x1b\xa4\x8d\xd2\xb7\xbb\xdd\x12\xde\x70\xfa\xaa\xcb\xe0\x1f\xac\xcb\x91\x92\xd8\x93\x38\x6a\xc1\xe5\x2d\xd4\x1a\xcb\x34\xb0\x32\x9b\x65\x1c\xe7\x85\x7c\x67\xa2\x5c\xa8\xae\x28\x05\xd3\x18\xe5\xaa\x89\xd9\x3b\x76\x17\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xb9\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\xff\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x9f\x47\x9f\x45\x97\x8e\xe5\x74\xfa\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\x77\xbf\x75\xa8\xb7\xf1\x75\x74\x15\x5d\xf5\x03\xc7\xe7\x9d\x09\x56\x49\xec\x01\x57\x1f\x85\x1d\x4a\x45\xdb\xf8\x59\xf4\x3c\xba\x8a\x5b\x96\xdf\xb2\x0a\x8b\x81\x93\x5d\x8a\x86\xc9\xbf\x8c\xef\x63\x36\x7c\x77\x6c\xc2\xbf\x82\x59\xa3\x1a\x94\x14\xbd\x33\xf1\xb3\xe8\xea\xf3\xe8\x72\x98\x78\x88\xef\x18\x58\xa3\x59\x56\xb3\x68\x8d\x9a\x78\xce\x44\x98\xa3\x24\xd4\x70\x6f\x67\x67\x0d\x97\x61\x8d\xbc\xaa\x69\x09\x57\x97\x97\x9f\xdc\x9c\x9a\x5d\xd7\x7e\xba\xe0\xa6\x15\x6c\xbb\x84\x52\xe0\x9d\x9f\x62\x82\x57\x32\xe4\x84\x8d\x59\x82\x47\x76\x0b\x3b\xc7\xb3\xd5\xaa\xd2\x68\x4c\xcf\xac\x55\x86\x13\x57\x72\x69\x3d\x8a\x11\x5f\xe3\x29\x5a\xd3\x32\xf9\x60\x03\xcb\x8c\x12\x1d\xe1\x91\x20\x99\x50\xf9\xad\x9f\x73\xd7\x78\x7a\x88\x5c\x09\xa5\x97\xb0\xa9\x79\xbf\x0d\x1c\x23\x68\x35\xf6\xf0\xd0\xb2\xa2\xe0\xb2\x5a\xc2\x8b\xb6\x3f\x0f\x34\x4c\x57\x5c\x2e\xe1\x72\xbf\x25\x89\x07\x35\x26\xb1\x8f\x58\x4f\x66\x49\xa6\x8a\xad\xb3\x61\xc1\xd7\x90\x0b\x66\x4c\x1a\x1c\xa9\xd8\x45\xa2\x03\x02\x1b\x80\x18\x97\xc3\xd2\xc1\x9a\x56\x9b\x00\x1c\xa3\x34\xf0\x42\x84\x99\x22\x52\xcd\x12\xae\xac\x78\xfd\x96\x23\x3c\x11\x8a\x2a\xbc\x7a\x36\x2c\xce\x92\xfa\x6a\x00\x21\xbc\xa3\xd0\xd9\x67\xb4\x4c\xb0\x4a\xf8\xb0\xb7\x64\x50\xb2\x30\x63\x54\x07\xc0\x34\x67\x61\xcd\x8b\x02\x65\x1a\x90\xee\xd0\xfa\x11\x5f\xc1\x34\xee\x0d\x61\xef\x65\x47\x35\x4a\x7b\x4e\xc2\xa2\x0f\x82\x70\x0c\x5b\x71\xaa\xbb\x2c\x64\x82\x1e\x05\x4f\xe2\xfa\x6a\x38\x52\x5c\xf0\x75\xaf\x91\xc9\xe7\x91\x72\x1e\x3f\xff\xe7\xd0\x7f\xa8\xb2\x34\x48\xe1\x44\x1d\x13\x62\x2e\xdb\x8e\xc2\x4a\xab\xae\x1d\xd7\x67\x89\x9b\x05\x5e\xa4\x41\xc5\x0d\x05\x40\xdb\xb6\xd7\x5d\x30\x1e\x49\xe9\x26\xb4\xa6\xd3\x4a\x04\xd0\x0a\x96\x63\xad\x44\x81\x3a\x0d\x7a\x9d\xbc\xe1\x86\xe0\xc7\xef\xff\x05\xbd\x81\xb9\xac\x60\xab\x3a\x0d\xaf\xa9\x46\x8d\x5d\x03\xac\x28\xac\x73\x47\x51\x34\xe1\xed\x3c\xfd\xa1\x74\x61\x46\x72\x4f\x35\x4b\xb2\x8e\x48\x8d\x84\x19\x49\xc8\x48\x86\x05\x96\xac\x13\xa3\xc4\x9e\x28\x00\x25\x73\xc1\xf3\xdb\x34\xb8\xbf\xe7\x25\x44\xdf\x63\xce\x5a\xca\x6b\xb6\xdb\x55\x7a\xf8\x8e\xf0\x0e\xf3\x8e\x70\xbe\xb8\xbf\x47\x61\x70\xb7\x33\x5d\xd6\x70\x72\x63\x59\xec\x76\xc1\xea\x0d\x5f\x23\x34\xe8\x0f\xf0\x34\x89\x3d\xfc\x5e\xf4\xd8\xca\x3e\x6a\xd9\x19\xed\x01\xc3\x13\x36\xa8\xc2\x51\x88\x00\x0a\x46\x2c\x34\x9c\xf0\x16\xb7\x56\xde\xe9\xde\x7e\x35\x67\x42\x64\xcc\x1e\xc7\x4b\x38\x6e\xfa\x1d\xad\xca\xd6\xdc\xb8\x22\x60\x35\x48\xe0\xa4\xff\x33\x4e\x75\x74\xe3\x48\xb5\x4b\xb8\x7e\x36\xb9\x6e\xa7\xfc\xed\xc5\x91\xbf\x5d\x9f\x24\x6e\x99\x44\x01\xee\x37\x34\x0d\x13\xc3\xf7\x60\xb8\xbd\x32\x8f\x37\x85\x36\xb8\x8c\xa2\x8d\x41\xea\xf2\x06\xd4\x1a\x75\x29\xd4\x66\x09\xac\x23\x75\x03\x0d\xbb\x1b\x03\xf5\xf5\xe5\xe5\x54\x6e\x5b\xbc\xb0\x4c\xa0\xf3\x6d\x8d\xbf\x75\x68\xc8\x8c\x3e\xed\x97\xdc\xaf\x75\xed\x02\xa5\xc1\xe2\x48\x1b\x96\xa3\x55\xad\xa3\x9a\x98\x7e\x54\xe6\x49\xd9\x4b\xa5\xc6\xd8\x37\x15\xa3\x87\x9e\x84\xe9\x60\x95\x90\xde\xd3\xcd\x12\x2a\xfe\x54\xec\xd2\xb6\x36\x79\x2c\x74\xf9\xcb\x65\xcf\xde\x22\x6a\x9f\x18\xad\xcb\x82\x1b\x26\x31\x15\x1f\xc1\xd9\x3a\x61\xc6\x0c\x7e\x08\x7b\x97\xa2\xf6\xec\xdd\xf0\x63\xf9\xd7\xc8\x34\x65\xc8\x1e\x8f\xae\x13\x01\xca\x4e\x16\x93\xf3\xbb\x1b\xfd\xb1\x02\x74\x92\xaf\x51\x1b\x4e\xdb\x0f\x95\x00\x8b\xbd\x08\x7e\x7c\x28\x42\x12\x93\x7e\xbf\xaf\x4d\x07\x7f\xd1\xe5\xfe\xa3\x5c\x7a\xbd\xfa\x4a\x6d\xa0\x50\x68\x80\x6a\x6e\xc0\x66\xc2\x2f\x92\xb8\xbe\x1e\x49\xda\xd5\x5b\xbb\xe0\x94\x0a\xa5\x4f\x86\xdc\x80\xee\xa4\x4b\x02\x4a\x02\xd5\x78\x98\x47\xa5\xff\x8a\xe0\xad\xb2\xb5\xc8\x1a\x25\x41\xc3\x04\xcf\xb9\xea\x0c\xb0\x9c\x94\x36\x50\x6a\xd5\x00\xde\xd5\xac\x33\x64\x81\x6c\xf8\x60\x6b\xc6\x85\xbb\x4b\xce\xa4\xa0\x34\xb0\x3c\xef\x9a\xce\xd6\x52\xb2\x02\x94\xaa\xab\xea\x5e\x16\x52\xd0\xa8\x4e\x12\x08\x25\xab\x51\x1e\xd3\xb2\x06\x18\x11\xcb\x6f\xcd\x05\x0c\x51\x01\x98\x46\x20\x8e\x85\xdd\xd5\xa7\x34\x96\xe7\x76\xbb\x89\xe0\xa5\xdc\x2a\x89\x50\xb3\xb5\x13\xe4\x88\x00\x1a\xb6\x1d\x80\x7a\xb9\x36\x9c\x6a\xee\x0f\xde\xa2\x6e\x6c\x71\x5c\x80\xe0\x0d\x27\x50\x25\x24\x86\xb4\x92\x95\xed\xa9\x5e\x3a\x09\x77\x3b\x2f\xf2\xdc\x2c\x20\xb6\xaa\xfa\x0e\x35\x57\xc5\x6e\x67\xeb\x2e\x47\x1a\x3d\x48\x2d\xf0\xb6\xc6\x13\xea\x1e\x33\x02\x68\x7c\xe5\x69\xa1\xd5\x8a\x30\xb7\x55\x24\xb0\x8a\x71\x69\x08\x32\x45\x26\xea\x93\x45\x12\xb7\x53\x63\xaa\xc3\xb3\x5c\x80\xe1\x4d\x2b\xb6\x90\x6b\x64\x84\xc0\x20\x61\x47\x8d\x96\x2d\x1b\x22\x5f\xef\xb8\x52\x3d\x00\x62\xba\xb2\x6d\xec\x7f\x59\xa6\x3a\x5a\x66\x82\xc9\x5b\x9b\x51\xc7\x52\x21\x89\xd9\xca\x69\xe9\x74\x91\x00\x2d\x33\x56\x65\x5c\x92\x72\x5a\xec\xfb\x56\x03\x73\x3b\x2a\xb9\x40\xd7\xda\x3a\xc7\x94\x67\xd6\x04\xb6\xff\x58\x5c\x40\xae\xda\xad\xdf\xed\xf6\x59\xd1\x8c\xab\x4b\x46\x28\x96\xa9\x35\x82\x2f\x7a\x32\x75\x07\x4c\x16\x50\x72\x8d\xc0\x36\x6c\xfb\x14\x7e\x52\x1d\xe4\x4c\x02\x69\x96\xdf\x7a\xde\x9d\xd6\xd6\x43\x5b\x94\x36\x0b\xed\x7d\x26\x43\xa1\x36\x8e\xc4\xa3\x95\x1c\x85\x73\x20\x83\x08\xb5\xda\x40\xd3\xe5\xee\x80\xd6\x73\xd0\x2e\x6c\x18\x27\xe8\x24\x71\xe1\xcf\x4d\x9d\x96\x90\xab\x06\x4d\xb4\xb7\xc2\xc9\x9b\x3d\x7e\xf5\x1f\xfb\xde\xc9\x2d\xc7\x31\xbc\x11\x2a\x63\x02\xd6\x36\x18\x65\xc2\xde\x57\x05\xb6\x48\x3b\x38\x83\x21\x46\x9d\xb1\x4e\x48\xa3\xfb\xd8\xfd\x6b\xa6\xed\xa5\xc0\xa6\x25\x48\xfb\xca\xdf\xce\x19\xd4\x6b\xdb\xcf\xf4\x3c\xbe\xc4\x92\x4b\xaf\xd9\xb2\x93\xde\xa5\xa8\x66\x04\xbe\x36\x31\xc0\x9c\xc6\xa1\xd3\x02\x7a\x75\x7b\x84\x11\xcf\xd1\x41\x3a\x6e\x9f\x3f\x70\xec\xfe\xa3\x77\xce\x45\xdf\xa8\x78\x98\xc8\xa0\x2c\xe6\xff\xfc\xe1\xdb\x6f\x22\x43\x9a\xcb\x8a\x97\xdb\xf9\x7d\xa7\xc5\x12\xfe\x3e\x0f\xfe\xe6\xea\xd7\xc5\xcf\x97\xbf\x46\x6b\x26\x3a\x7c\x00\x7d\x01\xfd\xe7\x12\x0e\xb9\xec\x16\x8b\x9b\xd3\xc5\xdb\xa4\x64\xd4\x68\x90\xe6\x96\x70\xac\xb1\x76\x37\x87\x8a\x61\xd0\x20\xd5\xca\x39\x81\xc6\x5c\x49\x89\x39\x41\xd7\x2a\xd9\xeb\x01\x84\x32\x66\x50\xc6\x9e\x62\xa2\x8f\xe1\xc0\xbc\x84\xf9\x60\x91\x4f\xe0\x19\xa4\x29\x5c\x0e\x6b\xbd\x36\x20\x05\x89\x1b\xf8\x37\x66\x3f\xa8\xfc\x16\x69\x1e\x6c\x8c\xbd\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x2d\xde\x0e\x6c\xcd\xfb\xc7\x60\x1f\x84\xe5\x9b\x60\x2f\xe9\xf9\xb9\x77\x95\xc1\x5c\x4a\x36\x68\x0c\xab\x70\x7a\x42\x17\xef\xc7\xa3\x58\x45\x34\xa6\x82\x14\x9c\x59\x5b\xa6\x0d\x7a\x92\xc8\xd6\x18\x3d\x17\xa7\x0e\x47\x96\xa6\x20\x3b\x21\xc6\xfd\x33\x8d\xf6\x16\xf5\x64\xbb\x27\x07\xe4\x91\x0f\xc7\x4f\xd3\x14\x6c\xc2\xb5\x36\x2a\xf6\x3b\xad\xcb\xf8\xd2\x60\x11\xd9\x9c\xbf\xdf\xb1\x18\xe1\x1e\xa0\x61\xf1\x47\x70\x58\x1c\xe3\x61\xf1\x08\xa0\xab\xc4\xde\x87\xe7\x2b\xb7\x09\x9c\x9b\x78\x04\x4d\x76\x4d\x86\xfa\x7d\x70\xbe\x12\xeb\xe1\x9c\xaa\xbf\x96\x34\xd9\x7b\x01\x57\x2f\x16\x8f\xa0\xa3\xd6\xea\x51\x70\xa9\x68\x3b\xbf\x17\x6c\x6b\xc3\x3d\x9c\x91\x6a\x5f\xb9\xc2\xe9\xec\x02\x2c\xaf\x25\x8c\x08\x17\xae\x5b\x5b\xc2\x99\x1b\x9d\xed\x1e\xe1\x66\xba\x3c\xb7\x89\xe0\x63\xf8\xf5\x18\x23\xc7\x7e\xfc\x28\xcf\x31\xb0\x1f\x30\x85\x4f\x3f\x85\x07\xab\x87\x2e\x68\x7d\xb8\xcf\x50\x90\x42\x10\xf4\xf0\xb3\x52\x69\x98\xdb\x45\x9e\x5e\xde\x00\x4f\xa6\x30\x91\x40\x59\x51\x7d\x03\xfc\xfc\x7c\x8f\x34\x1b\x60\xce\x53\x08\x6c\x6f\x90\x50\xb1\x72\x35\x9a\x2f\xe4\x7e\x09\x6c\x2f\x68\x7b\x64\x59\x2c\x6d\x98\x9d\x9f\xed\xb3\xf0\x24\x01\x9f\x1f\x88\xfc\x33\xff\x35\xea\x0c\x6a\x97\x32\xcf\x21\x88\x5a\x59\x7d\xe1\x3a\xc8\x17\xcf\xcf\x16\x37\xb0\xc7\x74\x7d\xe5\x12\x72\xdb\x65\xdd\x80\xef\x54\x5c\xbd\x08\x63\x8f\xe5\x46\x99\xd2\x05\xea\x50\xb3\x82\x77\x66\x09\xcf\xdb\xbb\x9b\x5f\x86\x1e\xd4\x55\xb5\x4e\xee\x56\xe3\xea\x94\x2c\x43\xe1\x74\x0e\x41\x12\x5b\xa2\x61\xcb\x78\xca\xe9\x53\x16\x9c\xa8\xc7\x61\x7c\x68\xea\xe7\x1b\x5e\x14\x02\xad\x10\x8e\xa1\x7f\x11\x2c\x3a\xed\x02\xd7\xdc\x8f\xe7\xc7\x72\x10\x6f\x70\x11\x75\x92\xdf\xcd\x17\x61\x4f\x33\x8c\x2f\xe0\xcc\xd8\xf8\x5c\x98\xb3\x45\x54\x77\x0d\x93\xfc\x77\x9c\xdb\xe2\x7e\xe1\xe5\xb6\x12\xdb\x8a\x7d\xb4\xf6\x6e\x72\xd1\xc6\x6e\x73\x11\xd5\xd4\x88\x79\x90\x90\x7b\x2e\xb3\xc2\x8d\x26\x76\x28\x7e\xfa\xd0\x23\x77\x87\x31\x34\x17\xca\xe0\x51\x8e\x00\x83\xf4\x96\x37\xa8\x3a\x9a\x8f\x79\xe4\xc2\x76\xc0\x97\x8b\x1b\xd8\xed\x5f\x15\xe3\x18\x5e\x1b\xdb\x53\x70\x53\x03\x83\x0d\x66\xc6\xc5\x77\xe8\xf7\xb8\x14\xee\x53\xf5\xcb\xef\xbe\x9e\xa4\xeb\x11\x75\xee\x84\x1b\x5f\x55\x4f\xe5\xc9\x93\xcf\xb8\x9b\xcd\x26\xaa\x94\xaa\x84\x7f\xc0\x1d\x13\xa9\xcd\x1e\xd1\x3b\xdb\xb8\x9a\xad\xcc\xa1\xc0\x12\xf5\x6a\x02\xdf\x67\xd7\x24\xf6\x0f\x8c\x49\xec\xff\x79\xf2\xbf\x00\x00\x00\xff\xff\x82\x9c\x59\xe7\x4d\x19\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 44016c53e..fc957721d 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -54,6 +54,7 @@ CMD [ \ "/faucet", "--genesis", "/genesis.json", "--network", "{{.NetworkID}}", "--bootnodes", "{{.Bootnodes}}", "--ethstats", "{{.Ethstats}}", \ "--ethport", "{{.EthPort}}", "--faucet.name", "{{.FaucetName}}", "--faucet.amount", "{{.FaucetAmount}}", "--faucet.minutes", "{{.FaucetMinutes}}", \ "--github.user", "{{.GitHubUser}}", "--github.token", "{{.GitHubToken}}", "--account.json", "/account.json", "--account.pass", "/account.pass" \ + {{if .CaptchaToken}}, "--captcha.token", "{{.CaptchaToken}}", "--captcha.secret", "{{.CaptchaSecret}}"{{end}} \ ]` // faucetComposefile is the docker-compose.yml file required to deploy and maintain @@ -75,7 +76,9 @@ services: - FAUCET_AMOUNT={{.FaucetAmount}} - FAUCET_MINUTES={{.FaucetMinutes}} - GITHUB_USER={{.GitHubUser}} - - GITHUB_TOKEN={{.GitHubToken}}{{if .VHost}} + - GITHUB_TOKEN={{.GitHubToken}} + - CAPTCHA_TOKEN={{.CaptchaToken}} + - CAPTCHA_SECRET={{.CaptchaSecret}}{{if .VHost}} - VIRTUAL_HOST={{.VHost}} - VIRTUAL_PORT=8080{{end}} restart: always @@ -97,6 +100,8 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config "EthPort": config.node.portFull, "GitHubUser": config.githubUser, "GitHubToken": config.githubToken, + "CaptchaToken": config.captchaToken, + "CaptchaSecret": config.captchaSecret, "FaucetName": strings.Title(network), "FaucetAmount": config.amount, "FaucetMinutes": config.minutes, @@ -113,6 +118,8 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config "EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")], "GitHubUser": config.githubUser, "GitHubToken": config.githubToken, + "CaptchaToken": config.captchaToken, + "CaptchaSecret": config.captchaSecret, "FaucetAmount": config.amount, "FaucetMinutes": config.minutes, }) @@ -135,18 +142,20 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config // faucetInfos is returned from an faucet status check to allow reporting various // configuration parameters. type faucetInfos struct { - node *nodeInfos - host string - port int - amount int - minutes int - githubUser string - githubToken string + node *nodeInfos + host string + port int + amount int + minutes int + githubUser string + githubToken string + captchaToken string + captchaSecret string } // String implements the stringer interface. func (info *faucetInfos) String() string { - return fmt.Sprintf("host=%s, api=%d, eth=%d, amount=%d, minutes=%d, github=%s, ethstats=%s", info.host, info.port, info.node.portFull, info.amount, info.minutes, info.githubUser, info.node.ethstats) + return fmt.Sprintf("host=%s, api=%d, eth=%d, amount=%d, minutes=%d, github=%s, captcha=%v, ethstats=%s", info.host, info.port, info.node.portFull, info.amount, info.minutes, info.githubUser, info.captchaToken != "", info.node.ethstats) } // checkFaucet does a health-check against an faucet server to verify whether @@ -200,11 +209,13 @@ func checkFaucet(client *sshClient, network string) (*faucetInfos, error) { keyJSON: keyJSON, keyPass: keyPass, }, - host: host, - port: port, - amount: amount, - minutes: minutes, - githubUser: infos.envvars["GITHUB_USER"], - githubToken: infos.envvars["GITHUB_TOKEN"], + host: host, + port: port, + amount: amount, + minutes: minutes, + githubUser: infos.envvars["GITHUB_USER"], + githubToken: infos.envvars["GITHUB_TOKEN"], + captchaToken: infos.envvars["CAPTCHA_TOKEN"], + captchaSecret: infos.envvars["CAPTCHA_SECRET"], }, nil } diff --git a/cmd/puppeth/wizard_faucet.go b/cmd/puppeth/wizard_faucet.go index 71d1c910b..f3fd7c2a1 100644 --- a/cmd/puppeth/wizard_faucet.go +++ b/cmd/puppeth/wizard_faucet.go @@ -71,7 +71,7 @@ func (w *wizard) deployFaucet() { // Accessing GitHub gists requires API authorization, retrieve it if infos.githubUser != "" { fmt.Println() - fmt.Printf("Reused previous (%s) GitHub API authorization (y/n)? (default = yes)\n", infos.githubUser) + fmt.Printf("Reuse previous (%s) GitHub API authorization (y/n)? (default = yes)\n", infos.githubUser) if w.readDefaultString("y") != "y" { infos.githubUser, infos.githubToken = "", "" } @@ -109,6 +109,29 @@ func (w *wizard) deployFaucet() { return } } + // Accessing the reCaptcha service requires API authorizations, request it + if infos.captchaToken != "" { + fmt.Println() + fmt.Println("Reuse previous reCaptcha API authorization (y/n)? (default = yes)") + if w.readDefaultString("y") != "y" { + infos.captchaToken, infos.captchaSecret = "", "" + } + } + if infos.captchaToken == "" { + // No previous authorization (or old one discarded) + fmt.Println() + fmt.Println("Enable reCaptcha protection against robots (y/n)? (default = no)") + if w.readDefaultString("n") == "y" { + // Captcha protection explicitly requested, read the site and secret keys + fmt.Println() + fmt.Printf("What is the reCaptcha site key to authenticate human users?\n") + infos.captchaToken = w.readString() + + fmt.Println() + fmt.Printf("What is the reCaptcha secret key to verify authentications? (won't be echoed)\n") + infos.captchaSecret = w.readPassword() + } + } // Figure out where the user wants to store the persistent data fmt.Println() if infos.node.datadir == "" {