diff --git a/examples/uart-bridge/Makefile b/examples/uart-bridge/Makefile new file mode 100644 index 00000000..5a16e952 --- /dev/null +++ b/examples/uart-bridge/Makefile @@ -0,0 +1,19 @@ +PROG ?= example +SOURCES ?= ../../mongoose.c main.c net.c packed_fs.c +CFLAGS ?= -I../.. -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_LINES=1 $(EXTRA_CFLAGS) +FILES_TO_EMBED ?= $(wildcard web_root/*) +ROOT ?= $(realpath $(CURDIR)/../../..) +DOCKER ?= docker run --rm -e Tmp=. -e WINEDEBUG=-all -v $(ROOT):$(ROOT) -w $(CURDIR) +VC98 ?= $(DOCKER) mdashnet/vc98 wine +MINGW ?= $(DOCKER) mdashnet/mingw + +all: $(PROG) + $(RUN) ./$(PROG) + +$(PROG): $(SOURCES) $(FILES_TO_EMBED) + $(CC) ../../test/pack.c -o pack + ./pack $(FILES_TO_EMBED) > packed_fs.c + $(CC) -W -Wall -Wextra -O0 -g3 $(CFLAGS) -o $(PROG) $(SOURCES) + +clean: + rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb log.txt pack diff --git a/examples/uart-bridge/README.md b/examples/uart-bridge/README.md new file mode 100644 index 00000000..f2a79933 --- /dev/null +++ b/examples/uart-bridge/README.md @@ -0,0 +1,16 @@ +# A UART to network bridge + +This example is a demonstration of how Mongoose Library could be integrated +into an embedded device and provide a UART-to-Network bridge capability: + +- A device opens listening TCP port and Websocket port and waits for connections +- When a client connects, data is exchanged with the device's UART +- Everything that client send, is sent to the UART +- Everything that is read from the UART, gets sent to the client +- Multiple clients are allowed +- Live UART console allows to talk to the UART from the web page +- Web UI is hardcoded into the binary and does not need a filesystem + +# Screenshots + +![](screenshots/dashboard.png) diff --git a/examples/uart-bridge/main.c b/examples/uart-bridge/main.c new file mode 100644 index 00000000..f77f8538 --- /dev/null +++ b/examples/uart-bridge/main.c @@ -0,0 +1,18 @@ +// Copyright (c) 2022 Cesanta Software Limited +// All rights reserved + +#include "mongoose.h" +const char *s_listening_url = "http://0.0.0.0:8000"; + +void uart_bridge_fn(struct mg_connection *, int, void *, void *); + +int main(void) { + struct mg_mgr mgr; + mg_log_set("2"); // Set to 3 for debug, to 4 for very verbose level + mg_mgr_init(&mgr); + mg_http_listen(&mgr, s_listening_url, uart_bridge_fn, &mgr); + MG_INFO(("Listening on %s", s_listening_url)); + while (mgr.conns != NULL) mg_mgr_poll(&mgr, 500); + mg_mgr_free(&mgr); + return 0; +} diff --git a/examples/uart-bridge/net.c b/examples/uart-bridge/net.c new file mode 100644 index 00000000..d7c53fc7 --- /dev/null +++ b/examples/uart-bridge/net.c @@ -0,0 +1,110 @@ +// Copyright (c) 2022 Cesanta Software Limited +// All rights reserved + +#include "mongoose.h" + +static const char *s_tcp_url = "tcp://0.0.0.0:4001"; +static const char *s_ws_url = "ws://0.0.0.0:4002"; +static struct mg_connection *s_tcp_conn; +static struct mg_connection *s_ws_conn; +static int s_rx = 4; +static int s_tx = 5; +static int s_baud = 115200; + +// Let users define their own UART API. If they don't, use a dummy one +#if defined(UART_API_IMPLEMENTED) +#else +void uart_init(int tx, int rx, int baud) { + // We use stdin/stdout as UART. Make stdin non-blocking + fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK); + (void) tx, (void) rx, (void) baud; +} + +void uart_write(const void *buf, size_t len) { + fwrite(buf, 1, len, stdout); // Write to stdout + fflush(stdout); +} + +int uart_read(char *buf, size_t len) { + return read(0, buf, len); // Read from stdin +} +#endif + +// Event handler for a connected Websocket client +static void ws_fn(struct mg_connection *c, int ev, void *evd, void *fnd) { + if (ev == MG_EV_HTTP_MSG) { + mg_ws_upgrade(c, evd, NULL); + } else if (ev == MG_EV_WS_OPEN) { + // c->is_hexdumping = 1; + c->label[0] = 'W'; // When WS handhake is done, mark us as WS client + } else if (ev == MG_EV_WS_MSG) { + struct mg_ws_message *wm = (struct mg_ws_message *) evd; + uart_write(wm->data.ptr, wm->data.len); // Send to UART + c->recv.len = 0; // Discard received data + } else if (ev == MG_EV_CLOSE) { + if (c->is_listening) s_ws_conn = NULL; + } + (void) fnd; +} + +// Event handler for a connected TCP client +static void tcp_fn(struct mg_connection *c, int ev, void *evd, void *fnd) { + if (ev == MG_EV_OPEN) { + // c->is_hexdumping = 1; + c->label[0] = 'T'; // When client is connected, mark us as TCP client + } else if (ev == MG_EV_READ) { + uart_write(c->recv.buf, c->recv.len); // Send to UART + c->recv.len = 0; // Discard received data + } else if (ev == MG_EV_CLOSE) { + if (c->is_listening) s_tcp_conn = NULL; + } + (void) fnd, (void) evd; +} + +// Software timer with a frequency close to the scheduling time slot +static void timer_fn(void *param) { + // Start listeners if they're stopped for any reason + struct mg_mgr *mgr = (struct mg_mgr *) param; + if (s_tcp_conn == NULL) s_tcp_conn = mg_listen(mgr, s_tcp_url, tcp_fn, 0); + if (s_ws_conn == NULL) s_ws_conn = mg_http_listen(mgr, s_ws_url, ws_fn, 0); + + // Read UART + char buf[512]; + int len = uart_read(buf, sizeof(buf)); + if (len > 0) { + // Iterate over all connections. Send data to WS and TCP clients + for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) { + if (c->label[0] == 'W') mg_ws_send(c, buf, len, WEBSOCKET_OP_TEXT); + if (c->label[0] == 'T') mg_send(c, buf, len); + } + } +} + +// HTTP request handler function +void uart_bridge_fn(struct mg_connection *c, int ev, void *ev_data, + void *fn_data) { + if (ev == MG_EV_OPEN && c->is_listening) { + mg_timer_add(c->mgr, 20, MG_TIMER_REPEAT, timer_fn, c->mgr); + uart_init(s_tx, s_rx, s_baud); + } else if (ev == MG_EV_HTTP_MSG) { + struct mg_http_message *hm = (struct mg_http_message *) ev_data; + if (mg_http_match_uri(hm, "/api/hi")) { + mg_http_reply(c, 200, "", "hi\n"); // Testing endpoint + } else if (mg_http_match_uri(hm, "/api/config/get")) { + mg_http_reply( + c, 200, "Content-Type: application/json\r\n", + "{\"tcp\":\"%s\",\"ws\":\"%s\",\"rx\":%d,\"tx\":%d,\"baud\":%d}\n", + s_tcp_url, s_ws_url, s_rx, s_tx, s_baud); + } else { + struct mg_http_serve_opts opts = {0}; +#if 0 + opts.root_dir = "/web_root"; + opts.fs = &mg_fs_packed; +#else + opts.root_dir = "web_root"; +#endif + mg_http_serve_dir(c, ev_data, &opts); + } + } + (void) fn_data; +} diff --git a/examples/uart-bridge/packed_fs.c b/examples/uart-bridge/packed_fs.c new file mode 100644 index 00000000..fd08f9cb --- /dev/null +++ b/examples/uart-bridge/packed_fs.c @@ -0,0 +1,1818 @@ +#include +#include +#include + +static const unsigned char v1[] = { + 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. < + 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>. Device + 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard. . + 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, // . + 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, // . . + 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // . . . + 10, 0 // . +}; +static const unsigned char v2[] = { + 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' + 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co + 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, + 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render + 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect, + 32, 117, 115, 101, 83, 116, 97, 116, 101, 44, 32, 117, // useState, u + 115, 101, 82, 101, 102, 125, 32, 102, 114, 111, 109, 32, // seRef} from + 39, 46, 47, 112, 114, 101, 97, 99, 116, 46, 109, 105, // './preact.mi + 110, 46, 106, 115, 39, 59, 10, 10, 99, 111, 110, 115, // n.js';..cons + 116, 32, 77, 101, 115, 115, 97, 103, 101, 32, 61, 32, // t Message = + 109, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, 115, // m => html`. + 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, 101, // ${m.message + 46, 100, 97, 116, 97, 125, 10, 60, 47, 115, 112, 97, // .data}.`;..const + 65, 112, 112, 32, 61, 32, 102, 117, 110, 99, 116, 105, // App = functi + 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, // on(props) {. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 99, 102, 103, // const [cfg + 44, 32, 115, 101, 116, 67, 102, 103, 93, 32, 61, 32, // , setCfg] = + 117, 115, 101, 83, 116, 97, 116, 101, 40, 123, 116, 99, // useState({tc + 112, 58, 32, 39, 39, 44, 32, 119, 115, 58, 32, 39, // p: '', ws: ' + 39, 125, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, // '});. const + 32, 91, 109, 101, 115, 115, 97, 103, 101, 115, 44, 32, // [messages, + 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 93, // setMessages] + 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, // = useState( + 91, 93, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, // []);. const + 32, 91, 116, 120, 116, 44, 32, 115, 101, 116, 84, 120, // [txt, setTx + 116, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // t] = useStat + 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, // e('');. con + 115, 116, 32, 91, 99, 111, 110, 110, 101, 99, 116, 101, // st [connecte + 100, 44, 32, 115, 101, 116, 67, 111, 110, 110, 101, 99, // d, setConnec + 116, 101, 100, 93, 32, 61, 32, 117, 115, 101, 83, 116, // ted] = useSt + 97, 116, 101, 40, 102, 97, 108, 115, 101, 41, 59, 10, // ate(false);. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 119, 115, 44, // const [ws, + 32, 115, 101, 116, 87, 115, 93, 32, 61, 32, 117, 115, // setWs] = us + 101, 83, 116, 97, 116, 101, 40, 110, 117, 108, 108, 41, // eState(null) + 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 116, // ;.. const t + 99, 112, 95, 112, 111, 114, 116, 32, 61, 32, 99, 102, // cp_port = cf + 103, 46, 116, 99, 112, 46, 115, 112, 108, 105, 116, 40, // g.tcp.split( + 39, 58, 39, 41, 91, 50, 93, 32, 124, 124, 32, 52, // ':')[2] || 4 + 48, 48, 49, 59, 10, 32, 32, 99, 111, 110, 115, 116, // 001;. const + 32, 119, 115, 95, 112, 111, 114, 116, 32, 61, 32, 99, // ws_port = c + 102, 103, 46, 119, 115, 46, 115, 112, 108, 105, 116, 40, // fg.ws.split( + 39, 58, 39, 41, 91, 50, 93, 32, 124, 124, 32, 52, // ':')[2] || 4 + 48, 48, 50, 59, 10, 10, 32, 32, 99, 111, 110, 115, // 002;.. cons + 116, 32, 114, 101, 102, 114, 101, 115, 104, 32, 61, 32, // t refresh = + 40, 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, // () =>. + 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, // fetch('/api/ + 99, 111, 110, 102, 105, 103, 47, 103, 101, 116, 39, 41, // config/get') + 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, // .then(r => r + 46, 106, 115, 111, 110, 40, 41, 41, 46, 116, 104, 101, // .json()).the + 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, 67, 102, // n(r => setCf + 103, 40, 114, 41, 41, 59, 10, 10, 32, 32, 99, 111, // g(r));.. co + 110, 115, 116, 32, 119, 97, 116, 99, 104, 87, 101, 98, // nst watchWeb + 115, 111, 99, 107, 101, 116, 32, 61, 32, 102, 117, 110, // socket = fun + 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {. + 32, 32, 47, 47, 32, 67, 111, 110, 110, 101, 99, 116, // // Connect + 32, 116, 111, 32, 119, 101, 98, 115, 111, 99, 107, 101, // to websocke + 114, 32, 112, 111, 114, 116, 44, 32, 116, 111, 32, 105, // r port, to i + 109, 112, 108, 101, 109, 101, 110, 116, 32, 87, 83, 32, // mplement WS + 99, 111, 110, 115, 111, 108, 101, 10, 32, 32, 32, 32, // console. + 118, 97, 114, 32, 108, 32, 61, 32, 119, 105, 110, 100, // var l = wind + 111, 119, 46, 108, 111, 99, 97, 116, 105, 111, 110, 44, // ow.location, + 32, 112, 114, 111, 116, 111, 32, 61, 32, 108, 46, 112, // proto = l.p + 114, 111, 116, 111, 99, 111, 108, 46, 114, 101, 112, 108, // rotocol.repl + 97, 99, 101, 40, 39, 104, 116, 116, 112, 39, 44, 32, // ace('http', + 39, 119, 115, 39, 41, 59, 10, 32, 32, 32, 32, 118, // 'ws');. v + 97, 114, 32, 116, 105, 100, 44, 32, 117, 114, 108, 32, // ar tid, url + 61, 32, 96, 36, 123, 112, 114, 111, 116, 111, 125, 47, // = `${proto}/ + 47, 36, 123, 108, 46, 104, 111, 115, 116, 110, 97, 109, // /${l.hostnam + 101, 125, 58, 36, 123, 119, 115, 95, 112, 111, 114, 116, // e}:${ws_port + 125, 47, 119, 115, 96, 59, 10, 32, 32, 32, 32, 99, // }/ws`;. c + 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 117, // onsole.log(u + 114, 108, 41, 59, 10, 32, 32, 32, 32, 118, 97, 114, // rl);. var + 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 32, 61, // reconnect = + 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, // function() + 123, 10, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // {. var + 119, 115, 32, 61, 32, 110, 101, 119, 32, 87, 101, 98, // ws = new Web + 83, 111, 99, 107, 101, 116, 40, 117, 114, 108, 41, 59, // Socket(url); + 10, 32, 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, // . ws.on + 111, 112, 101, 110, 32, 61, 32, 40, 41, 32, 61, 62, // open = () => + 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 115, // {. s + 101, 116, 67, 111, 110, 110, 101, 99, 116, 101, 100, 40, // etConnected( + 116, 114, 117, 101, 41, 59, 10, 32, 32, 32, 32, 32, // true);. + 32, 32, 32, 115, 101, 116, 87, 115, 40, 119, 115, 41, // setWs(ws) + 59, 10, 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, // ;. };. + 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, 109, 101, // ws.onme + 115, 115, 97, 103, 101, 32, 61, 32, 101, 118, 32, 61, // ssage = ev = + 62, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // > {. + 47, 47, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // // console.l + 111, 103, 40, 101, 118, 44, 32, 101, 118, 46, 100, 97, // og(ev, ev.da + 116, 97, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, // ta);. + 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, // setMessages + 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, 110, 99, // (x => x.conc + 97, 116, 40, 91, 123, 100, 97, 116, 97, 58, 32, 101, // at([{data: e + 118, 46, 100, 97, 116, 97, 44, 32, 117, 97, 114, 116, // v.data, uart + 58, 32, 116, 114, 117, 101, 125, 93, 41, 41, 59, 10, // : true}]));. + 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // };. + 32, 32, 32, 119, 115, 46, 111, 110, 99, 108, 111, 115, // ws.onclos + 101, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // e = function + 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // () {. + 32, 99, 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, // clearTimeou + 116, 40, 116, 105, 100, 41, 59, 10, 32, 32, 32, 32, // t(tid);. + 32, 32, 32, 32, 116, 105, 100, 32, 61, 32, 115, 101, // tid = se + 116, 84, 105, 109, 101, 111, 117, 116, 40, 114, 101, 99, // tTimeout(rec + 111, 110, 110, 101, 99, 116, 44, 32, 49, 48, 48, 48, // onnect, 1000 + 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 115, // );. s + 101, 116, 67, 111, 110, 110, 101, 99, 116, 101, 100, 40, // etConnected( + 102, 97, 108, 115, 101, 41, 59, 10, 32, 32, 32, 32, // false);. + 32, 32, 32, 32, 115, 101, 116, 87, 115, 40, 110, 117, // setWs(nu + 108, 108, 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, // ll);. } + 59, 10, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // ;. };. + 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, // reconnect() + 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 117, 115, // ;. };.. us + 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, // eEffect(() = + 62, 32, 123, 10, 32, 32, 32, 32, 114, 101, 102, 114, // > {. refr + 101, 115, 104, 40, 41, 59, 10, 32, 32, 32, 32, 119, // esh();. w + 97, 116, 99, 104, 87, 101, 98, 115, 111, 99, 107, 101, // atchWebsocke + 116, 40, 41, 59, 10, 32, 32, 125, 44, 32, 91, 93, // t();. }, [] + 41, 59, 10, 10, 10, 32, 32, 99, 111, 110, 115, 116, // );... const + 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, 101, // sendmessage + 32, 61, 32, 101, 118, 32, 61, 62, 32, 123, 10, 32, // = ev => {. + 32, 32, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, // setMessag + 101, 115, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, // es(x => x.co + 110, 99, 97, 116, 40, 91, 123, 100, 97, 116, 97, 58, // ncat([{data: + 32, 116, 120, 116, 32, 43, 32, 39, 92, 110, 39, 44, // txt + '.n', + 32, 117, 97, 114, 116, 58, 32, 102, 97, 108, 115, 101, // uart: false + 125, 93, 41, 41, 59, 10, 32, 32, 32, 32, 105, 102, // }]));. if + 32, 40, 119, 115, 41, 32, 119, 115, 46, 115, 101, 110, // (ws) ws.sen + 100, 40, 116, 120, 116, 32, 43, 32, 39, 92, 110, 39, // d(txt + '.n' + 41, 59, 10, 32, 32, 32, 32, 115, 101, 116, 84, 120, // );. setTx + 116, 40, 39, 39, 41, 59, 10, 32, 32, 125, 59, 10, // t('');. };. + 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, // . return ht + 109, 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, // ml`.
.

UA + 82, 84, 32, 92, 117, 50, 55, 70, 55, 32, 110, 101, // RT .u27F7 ne + 116, 119, 111, 114, 107, 32, 98, 114, 105, 100, 103, 101, // twork bridge + 32, 60, 47, 104, 49, 62, 10, 32, 32, 60, 104, 51, //

.

UART settin + 103, 115, 60, 47, 104, 51, 62, 10, 32, 32, 60, 112, // gs

.

${JSON + 46, 115, 116, 114, 105, 110, 103, 105, 102, 121, 40, 99, // .stringify(c + 102, 103, 44, 32, 110, 117, 108, 108, 44, 32, 50, 41, // fg, null, 2) + 125, 60, 47, 112, 114, 101, 62, 10, 32, 32, 60, 112, // }.

RX pin ${cf + 103, 46, 114, 120, 125, 44, 32, 84, 88, 32, 112, 105, // g.rx}, TX pi + 110, 32, 36, 123, 99, 102, 103, 46, 116, 120, 125, 44, // n ${cfg.tx}, + 32, 98, 97, 117, 100, 32, 36, 123, 99, 102, 103, 46, // baud ${cfg. + 98, 97, 117, 100, 125, 60, 47, 112, 62, 10, 32, 32, // baud}

. + 60, 104, 51, 62, 84, 67, 80, 32, 108, 105, 115, 116, //

TCP list + 101, 110, 101, 114, 58, 32, 112, 111, 114, 116, 32, 36, // ener: port $ + 123, 116, 99, 112, 95, 112, 111, 114, 116, 125, 60, 47, // {tcp_port}.

Use + 32, 110, 101, 116, 99, 97, 116, 32, 116, 111, 32, 99, // netcat to c + 111, 110, 110, 101, 99, 116, 58, 60, 47, 112, 62, 10, // onnect:

. + 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
$ nc + 32, 36, 123, 108, 111, 99, 97, 116, 105, 111, 110, 46, // ${location. + 104, 111, 115, 116, 110, 97, 109, 101, 125, 32, 36, 123, // hostname} ${ + 116, 99, 112, 95, 112, 111, 114, 116, 125, 32, 60, 47, // tcp_port} .

W + 101, 98, 115, 111, 99, 107, 101, 116, 32, 108, 105, 115, // ebsocket lis + 116, 101, 110, 101, 114, 58, 32, 112, 111, 114, 116, 32, // tener: port + 36, 123, 119, 115, 95, 112, 111, 114, 116, 125, 60, 47, // ${ws_port}.
U + 65, 82, 84, 32, 99, 111, 110, 115, 111, 108, 101, 46, // ART console. + 32, 83, 116, 97, 116, 117, 115, 58, 32, 36, 123, 99, // Status: ${c + 111, 110, 110, 101, 99, 116, 101, 100, 32, 63, 32, 39, // onnected ? ' + 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 32, 58, // connected' : + 32, 39, 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, // 'disconnect + 101, 100, 39, 125, 60, 47, 100, 105, 118, 62, 10, 32, // ed'}
. + 32, 60, 112, 114, 101, 32, 115, 116, 121, 108, 101, 61, //
.   
+  32,  36, 123, 109, 101, 115, 115,  97, 103, 101, 115,  46, //  ${messages.
+ 109,  97, 112,  40, 109, 101, 115, 115,  97, 103, 101,  32, // map(message 
+  61,  62,  32, 104,  40,  77, 101, 115, 115,  97, 103, 101, // => h(Message
+  44,  32, 123, 109, 101, 115, 115,  97, 103, 101, 125,  41, // , {message})
+  41, 125,  10,  32,  32,  60,  47, 112, 114, 101,  62,  10, // )}.  
. + 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. + 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 112, 108, // setTxt(ev + 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu + 101, 41, 125, 32, 47, 62, 10, 32, 32, 60, 47, 100, // e)} />. .
`; + 10, 125, 59, 10, 10, 119, 105, 110, 100, 111, 119, 46, // .};..window. + 111, 110, 108, 111, 97, 100, 32, 61, 32, 40, 41, 32, // onload = () + 61, 62, 32, 114, 101, 110, 100, 101, 114, 40, 104, 40, // => render(h( + 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume + 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);. +}; +static const unsigned char v3[] = { + 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, + 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i + 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit| + 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p + 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid + 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw + 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo + 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/ + 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s + 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va + 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_ + 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur + 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function + 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n= + 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode + 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove + 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun + 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_, + 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u + 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u + 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"== + 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re + 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u] + 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i + 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments. + 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l + 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar + 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng + 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call( + 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2) + 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio + 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n + 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f + 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v + 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u] + 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u + 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p( + 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null + 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p + 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){ + 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type: + 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke + 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__ + 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu + 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e + 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo + 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul + 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c + 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v + 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu + 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u} + 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null + 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n + 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e + 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c + 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func + 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){ + 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e + 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex + 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function + 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n + 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur + 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._ + 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i + 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1) + 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va + 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m. + 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props + 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null, + 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i + 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._ + 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n + 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a + 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key + 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t + 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type + 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0 + 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d= + 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len + 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu + 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[ + 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function + 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return + 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e + 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t= + 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret + 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t. + 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[ + 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo + 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func + 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var + 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0 + 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0] + 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__= + 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]], + 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta + 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t. + 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e + 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j( + 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__ + 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H, + 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e, + 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__ + 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t + 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function + 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t + 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n + 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._ + 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__ + 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N + 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t) + 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q + 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R + 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio + 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c + 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[ + 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function + 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6 + 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function( + 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function" + 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e + 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e. + 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n()) + 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_: + 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e)) + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y( + 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j + 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu + 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H, + 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e( + 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_. + 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e + 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R + 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio + 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e + 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio + 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var + 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[ + 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L + 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return + 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu + 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_ + 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub + 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props + 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__ + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne + 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD + 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n + 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal + 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e) + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e + 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j( + 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G( + 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._ + 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon + 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch| + 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen + 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu + 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n. + 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e), + 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_ + 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function + 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void + 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi + 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo + 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi + 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._ + 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H + 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach + 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._ + 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u + 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h + 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_) + 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[ + 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e. + 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[] + 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct + 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul + 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n + 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio + 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e) + 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=( + 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H + 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f + 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n + 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach + 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[ + 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed + 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e) + 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var + 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&& + 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H + 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length& + 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push + 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r + 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat + 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||(( + 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA + 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram + 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function + 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_= + 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c + 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( + 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance + 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr + 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi + 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t= + 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_ + 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n + 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim + 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_ + 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N= + 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__ + 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e + 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f + 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t + 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for + 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._ + 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil + 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function + 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e + 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)}) + 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_. + 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio + 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&& + 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])}) + 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e( + 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}), + 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n + 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun + 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&& + 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e + 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_ + 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._ + 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac + 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch( + 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_ + 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var + 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function + 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re + 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati + 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func + 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v + 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func + 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo + 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._ + 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun + 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){ + 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__ + 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le + 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return + 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length + 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length| + 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func + 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re + 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_ + 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function + 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret + 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function + 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n? + 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c + 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e + 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var + 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for + 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&& + 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5== + 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push + 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t= + 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus + 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t + 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i + 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1, + 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[ + 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r + 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"' + 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"=== + 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"=== + 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1): + 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n? + 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o=" + 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&& + 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"=== + 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?( + 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&( + 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u, + 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus + 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0 + 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||" + 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n + 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"= + 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2 + 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3=== + 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o + 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0 + 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l( + 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n), + 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[] + 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1? + 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind + 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a + 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as + 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re + 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co + 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as + 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte + 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS + 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us + 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a + 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect, + 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo + 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a + 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a + 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat + 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y + 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z + 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb + 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us + 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne + 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV + 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u + 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound + 97, 114, 121, 125, 59, 10, 0 // ary};. +}; +static const unsigned char v4[] = { + 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi + 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b + 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html, + 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi + 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin + 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height + 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font + 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans- + 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel + 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input, + 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor + 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea + 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n + 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha + 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im + 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor + 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol + 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp + 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 112, 114, // ortant; }.pr + 101, 32, 123, 32, 99, 111, 108, 111, 114, 58, 32, 35, // e { color: # + 51, 55, 51, 59, 32, 102, 111, 110, 116, 45, 102, 97, // 373; font-fa + 109, 105, 108, 121, 58, 32, 109, 111, 110, 111, 115, 112, // mily: monosp + 97, 99, 101, 59, 32, 102, 111, 110, 116, 45, 119, 101, // ace; font-we + 105, 103, 104, 116, 58, 32, 98, 111, 108, 100, 101, 114, // ight: bolder + 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, // ; font-size: + 32, 115, 109, 97, 108, 108, 101, 114, 59, 32, 98, 97, // smaller; ba + 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 100, // ckground: #d + 100, 100, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, // dd; padding: + 32, 49, 101, 109, 59, 32, 98, 111, 114, 100, 101, 114, // 1em; border + 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, 46, 50, // -radius: 0.2 + 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, 97, 114, // em; }.textar + 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, 32, 46, // ea, input, . + 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, 110, 116, // addon { font + 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, 120, 59, // -size: 15px; + 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, // border: 1px + 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, 99, 59, // solid #ccc; + 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, // padding: 0. + 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, 97, 58, // 5em; }.a, a: + 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, 58, 97, // visited, a:a + 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, 108, 111, // ctive { colo + 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, 10, 98, // r: #55f; }.b + 111, 100, 121, 32, 123, 98, 97, 99, 107, 103, 114, 111, // ody {backgro + 117, 110, 100, 58, 32, 35, 52, 53, 53, 59, 32, 125, // und: #455; } + 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba + 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e + 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid + 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b + 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg + 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc; + 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi + 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b + 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co + 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c + 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point + 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa + 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl + 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding + 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em; + 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight + 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}. + 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable + 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity + 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso + 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s + 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran + 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all + 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont + 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg + 105, 110, 58, 32, 50, 101, 109, 32, 97, 117, 116, 111, // in: 2em auto + 59, 32, 109, 97, 120, 45, 119, 105, 100, 116, 104, 58, // ; max-width: + 32, 54, 56, 48, 112, 120, 59, 32, 98, 97, 99, 107, // 680px; back + 103, 114, 111, 117, 110, 100, 58, 32, 119, 104, 105, 116, // ground: whit + 101, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // e; padding: + 49, 101, 109, 59, 32, 98, 111, 114, 100, 101, 114, 45, // 1em; border- + 114, 97, 100, 105, 117, 115, 58, 32, 48, 46, 53, 101, // radius: 0.5e + 109, 59, 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, // m; }..d-flex + 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, // { display: + 102, 108, 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, // flex; }..d-n + 111, 110, 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, // one { displa + 121, 58, 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, // y: none; }.. + 98, 111, 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, // border { bor + 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol + 105, 100, 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, // id #ddd; }.. + 114, 111, 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, // rounded { bo + 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, // rder-radius: + 32, 48, 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, // 0.5em; }..n + 111, 119, 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, // owrap { whit + 101, 45, 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, // e-space: now + 114, 97, 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, // rap; }..msg + 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, // { background + 58, 32, 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, // : #def; bord + 101, 114, 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, // er-left: 5px + 32, 115, 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, // solid #59d; + 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, // padding: 0. + 53, 101, 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, // 5em; font-si + 122, 101, 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, // ze: 90%; mar + 103, 105, 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, // gin: 1em 0; + 125, 10, 46, 105, 110, 112, 117, 116, 32, 123, 32, 98, // }..input { b + 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # + 102, 101, 97, 59, 32, 112, 97, 100, 100, 105, 110, 103, // fea; padding + 58, 32, 48, 46, 50, 101, 109, 32, 49, 101, 109, 59, // : 0.2em 1em; + 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi + 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 125, // us: 0.4em; } + 10, 46, 111, 117, 116, 112, 117, 116, 32, 123, 32, 98, // ..output { b + 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # + 97, 101, 102, 59, 32, 112, 97, 100, 100, 105, 110, 103, // aef; padding + 58, 32, 48, 46, 50, 101, 109, 32, 49, 101, 109, 59, // : 0.2em 1em; + 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi + 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 125, // us: 0.4em; } + 10, 0 // . +}; +static const unsigned char v5[] = { + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, // .PNG........ + 73, 72, 68, 82, 0, 0, 0, 128, 0, 0, 0, 128, // IHDR........ + 8, 6, 0, 0, 0, 195, 62, 97, 203, 0, 0, 0, // ......>a.... + 4, 115, 66, 73, 84, 8, 8, 8, 8, 124, 8, 100, // .sBIT....|.d + 136, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 30, // .....pHYs... + 140, 0, 0, 30, 140, 1, 53, 120, 124, 169, 0, 0, // ......5x|... + 0, 25, 116, 69, 88, 116, 83, 111, 102, 116, 119, 97, // ..tEXtSoftwa + 114, 101, 0, 119, 119, 119, 46, 105, 110, 107, 115, 99, // re.www.inksc + 97, 112, 101, 46, 111, 114, 103, 155, 238, 60, 26, 0, // ape.org..<.. + 0, 14, 141, 73, 68, 65, 84, 120, 218, 237, 157, 125, // ...IDATx...} + 112, 20, 229, 29, 199, 97, 100, 232, 76, 117, 232, 63, // p....ad.Lu.? + 117, 250, 15, 163, 157, 206, 104, 197, 247, 42, 173, 56, // u.....h..*.8 + 19, 234, 12, 180, 82, 35, 32, 160, 132, 18, 94, 242, // ....R# ...^. + 102, 18, 18, 67, 184, 75, 46, 111, 151, 203, 93, 238, // f..C.K.o..]. + 37, 151, 219, 187, 203, 27, 16, 224, 242, 166, 80, 17, // %.........P. + 9, 18, 4, 5, 35, 90, 130, 32, 146, 8, 113, 152, // ....#Z. ..q. + 193, 106, 153, 90, 108, 173, 213, 42, 104, 71, 163, 130, // .j.Zl..*hG.. + 81, 242, 235, 243, 219, 238, 198, 75, 184, 75, 238, 246, // Q......K.K.. + 158, 221, 125, 118, 111, 255, 248, 206, 56, 2, 123, 191, // ..}vo...8.{. + 223, 247, 251, 185, 219, 231, 217, 125, 246, 217, 41, 0, // .......}..). + 48, 69, 111, 186, 169, 199, 55, 131, 104, 54, 209, 170, // 0Eo...7.h6.. + 187, 158, 171, 247, 154, 186, 108, 131, 142, 192, 250, 79, // ......l....O + 157, 174, 252, 175, 92, 213, 217, 195, 181, 165, 171, 175, // ............ + 88, 11, 211, 192, 156, 181, 24, 214, 175, 89, 8, 150, // X........Y.. + 156, 165, 96, 45, 88, 62, 82, 107, 74, 191, 226, 173, // ..`-X>RkJ... + 205, 251, 198, 209, 108, 254, 40, 191, 171, 186, 255, 190, // ....l.(..... + 110, 175, 31, 143, 33, 28, 107, 134, 30, 189, 210, 67, // n...!.k....C + 216, 215, 18, 45, 32, 226, 136, 250, 136, 62, 186, 127, // ...- ....>.. + 167, 19, 138, 55, 150, 130, 179, 58, 27, 74, 178, 150, // ...7...:.J.. + 192, 19, 171, 30, 150, 36, 132, 195, 97, 74, 135, 234, // .....$..aJ.. + 102, 51, 204, 221, 93, 7, 120, 108, 225, 51, 56, 225, // f3..].xl.38. + 51, 175, 53, 0, 80, 62, 240, 233, 68, 243, 136, 60, // 3.5.P>..D..< + 68, 39, 136, 134, 137, 48, 28, 88, 183, 195, 14, 238, // D'...0.X.... + 170, 76, 201, 129, 79, 164, 226, 53, 139, 192, 83, 147, // .L..O..5..S. + 3, 185, 157, 86, 184, 69, 248, 60, 225, 179, 177, 6, // ...V.E.<.... + 183, 80, 211, 116, 3, 0, 249, 130, 159, 67, 212, 74, // .P.t.....C.J + 244, 217, 77, 63, 4, 192, 107, 77, 187, 21, 156, 101, // ..M?..kM...e + 107, 100, 9, 62, 146, 170, 159, 72, 131, 188, 14, 43, // kd.>...H...+ + 140, 175, 67, 168, 13, 107, 156, 99, 0, 64, 39, 244, // ..C..k.c.@'. + 27, 137, 108, 68, 231, 34, 152, 13, 139, 119, 214, 130, // ..lD."...w.. + 205, 156, 174, 88, 240, 227, 229, 182, 102, 195, 31, 158, // ...X....f... + 113, 69, 2, 1, 132, 154, 177, 246, 27, 13, 0, 226, // qE.......... + 15, 30, 7, 93, 61, 68, 35, 145, 204, 253, 37, 81, // ...]=D#...%Q + 93, 171, 5, 76, 25, 139, 85, 11, 95, 212, 134, 140, // ]..L..U._... + 69, 96, 15, 20, 195, 173, 61, 222, 104, 32, 140, 8, // E`....=.h .. + 189, 204, 54, 0, 152, 60, 248, 185, 68, 189, 81, 140, // ..6..<..D.Q. + 228, 245, 235, 221, 110, 242, 205, 203, 82, 61, 248, 241, // ....n...R=.. + 114, 149, 103, 192, 125, 221, 117, 48, 81, 237, 66, 111, // r.g.}.u0Q.Bo + 115, 13, 0, 174, 14, 126, 62, 209, 177, 73, 204, 131, // s....~>..I.. + 212, 237, 118, 176, 228, 46, 99, 46, 252, 240, 177, 193, // ..v...c..... + 195, 207, 56, 39, 131, 0, 132, 94, 231, 39, 61, 0, // ..8'...^.'=. + 196, 132, 153, 68, 123, 98, 48, 12, 214, 144, 243, 61, // ...D{b0....= + 206, 215, 89, 13, 95, 148, 37, 103, 9, 100, 62, 105, // ..Y._.%g.d>i + 139, 5, 2, 16, 122, 159, 153, 116, 0, 144, 166, 167, // ....z..t.... + 17, 149, 18, 13, 197, 98, 212, 202, 167, 93, 80, 166, // .....b...]P. + 129, 240, 195, 199, 5, 171, 159, 178, 199, 10, 193, 144, // ............ + 224, 197, 180, 164, 0, 128, 52, 154, 66, 116, 54, 70, // ......4.Bt6F + 115, 224, 193, 63, 57, 160, 236, 113, 237, 132, 47, 10, // s..?9..q../. + 129, 77, 141, 62, 67, 136, 36, 244, 36, 69, 183, 0, // .M.>C.$.$E.. + 144, 230, 174, 33, 242, 70, 27, 217, 71, 210, 189, 187, // ...!.F..G... + 61, 80, 158, 247, 168, 230, 194, 15, 31, 19, 220, 223, // =P.......... + 237, 141, 7, 130, 17, 193, 163, 107, 116, 5, 128, 112, // .......kt..p + 174, 63, 30, 135, 17, 112, 51, 145, 199, 158, 163, 217, // .?...p3..... + 240, 69, 225, 5, 170, 219, 247, 214, 199, 3, 1, 8, // .E.......... + 94, 205, 212, 5, 0, 164, 145, 84, 162, 139, 113, 26, // ^......T..q. + 0, 174, 182, 74, 205, 135, 47, 202, 214, 104, 142, 23, // ...J../..h.. + 0, 16, 60, 75, 213, 44, 0, 164, 248, 169, 68, 190, // ..9.......;. + 241, 236, 166, 244, 68, 0, 0, 193, 219, 235, 153, 4, // ....D....... + 128, 20, 118, 67, 180, 187, 118, 177, 42, 135, 156, 39, // ..vC..v.*..' + 99, 49, 82, 41, 237, 110, 40, 158, 48, 252, 112, 253, // c1R).n(.0.p. + 253, 80, 16, 26, 202, 39, 63, 117, 165, 237, 112, 36, // .P...'?u..p$ + 10, 1, 122, 124, 3, 83, 0, 8, 223, 252, 115, 9, // ..z|.S....s. + 54, 6, 245, 206, 60, 102, 194, 223, 219, 108, 142, 57, // 6....^_.... + 57, 255, 84, 162, 77, 221, 189, 187, 142, 95, 130, 197, // 9.T.M...._.. + 66, 248, 47, 135, 42, 36, 133, 47, 234, 235, 55, 219, // B./.*$./..7. + 160, 203, 179, 46, 226, 177, 77, 153, 143, 192, 189, 207, // ......M..... + 121, 105, 64, 112, 138, 198, 152, 128, 198, 104, 255, 48, // yi@p.....h.0 + 133, 102, 32, 63, 134, 121, 127, 45, 249, 102, 53, 85, // .f ?.y.-.f5U + 102, 192, 166, 234, 108, 216, 230, 200, 133, 14, 87, 62, // f...l.....W> + 116, 56, 243, 193, 74, 233, 106, 97, 197, 227, 75, 225, // t8..J.ja..K. + 196, 211, 142, 132, 194, 15, 215, 159, 59, 172, 17, 161, // ........;... + 46, 219, 92, 70, 3, 0, 113, 96, 56, 93, 21, 0, // ...F..q`8].. + 132, 121, 254, 46, 74, 141, 128, 187, 174, 32, 98, 40, // .y..J.... b( + 229, 57, 75, 225, 217, 96, 49, 156, 127, 169, 97, 66, // .9K..`1...aB + 179, 255, 249, 114, 19, 255, 205, 109, 169, 202, 140, 107, // ...r...m...k + 100, 142, 170, 204, 91, 6, 135, 67, 149, 240, 245, 64, // d...[..C...@ + 136, 90, 248, 162, 206, 189, 192, 241, 199, 31, 187, 146, // .Z.......... + 40, 139, 22, 0, 226, 20, 113, 170, 26, 0, 248, 104, // (.....q....h + 53, 129, 43, 124, 106, 158, 72, 27, 99, 82, 77, 193, // 5.+|j.H.cRM. + 114, 24, 236, 118, 195, 229, 211, 237, 113, 155, 254, 85, // r..v....q..U + 127, 27, 188, 185, 203, 9, 237, 174, 60, 176, 100, 95, // ........<.d_ + 125, 65, 169, 120, 237, 34, 112, 21, 175, 132, 182, 218, // }A.x."p..... + 92, 56, 210, 105, 133, 111, 200, 79, 54, 237, 224, 195, // .8.i.o.O6... + 117, 241, 88, 43, 4, 44, 63, 172, 89, 44, 207, 93, // u.X+.,?.Y,.] + 70, 19, 0, 148, 79, 81, 0, 132, 203, 187, 35, 180, // F...OQ....#. + 26, 88, 209, 93, 55, 38, 160, 96, 217, 90, 248, 252, // .X.]7&.`.Z.. + 245, 86, 106, 1, 124, 121, 114, 27, 124, 248, 74, 19, // .Vj.|yr.|.J. + 188, 187, 159, 131, 143, 143, 108, 132, 111, 199, 205, 235, // ......l.o... + 149, 16, 66, 233, 43, 89, 61, 218, 35, 94, 237, 164, // ..B.+Y=.#^.. + 8, 192, 136, 212, 203, 198, 82, 111, 236, 92, 164, 73, // ......Ro...I + 176, 169, 203, 54, 106, 204, 83, 228, 84, 112, 233, 205, // ...6j.S.Tp.. + 118, 197, 3, 82, 66, 8, 181, 67, 252, 165, 11, 85, // v..RB..C...U + 209, 254, 21, 184, 40, 229, 6, 146, 148, 91, 186, 199, // ....(....[.. + 41, 23, 14, 190, 87, 91, 96, 179, 45, 7, 14, 110, // )...W[`.-..n + 41, 211, 101, 240, 225, 250, 79, 223, 70, 126, 76, 224, // ).e...O.F~L. + 224, 138, 104, 3, 32, 222, 69, 188, 70, 78, 0, 188, // ..h. .E.FN.. + 50, 20, 13, 93, 71, 55, 203, 126, 30, 102, 73, 239, // 2..]G7.~.fI. + 247, 54, 128, 215, 153, 39, 7, 0, 40, 175, 44, 0, // .6...'..(.,. + 8, 43, 121, 70, 228, 40, 250, 197, 227, 91, 146, 38, // .+yF.(...[.& + 124, 81, 7, 122, 155, 228, 2, 96, 36, 158, 149, 69, // |Q.z...`$..E + 241, 172, 225, 59, 43, 83, 193, 48, 240, 198, 182, 164, // ...;+S.0.... + 3, 224, 216, 137, 173, 114, 1, 32, 46, 47, 155, 70, // .....r. ./.F + 19, 128, 82, 25, 139, 133, 243, 73, 244, 243, 47, 106, // ..R....I../j + 128, 204, 76, 228, 244, 20, 51, 163, 2, 128, 48, 234, // ..L...3...0. + 31, 50, 0, 160, 171, 51, 253, 33, 185, 1, 24, 138, // .2...3.!.... + 101, 86, 16, 11, 0, 123, 100, 46, 20, 6, 79, 38, // eV...{d...O& + 223, 41, 224, 221, 1, 217, 1, 224, 159, 59, 72, 8, // .).......;H. + 0, 225, 137, 29, 217, 11, 125, 149, 156, 15, 147, 13, // ......}..... + 128, 83, 242, 159, 2, 68, 205, 79, 4, 128, 99, 74, // .S...D.O..cJ + 20, 185, 231, 88, 107, 242, 205, 2, 200, 204, 71, 33, // ...Xk.....G! + 0, 142, 73, 2, 64, 120, 80, 83, 145, 34, 219, 142, // ..I.@xPS.".. + 110, 78, 58, 0, 66, 125, 155, 148, 2, 0, 38, 122, // nN:.B}....&z + 32, 117, 34, 0, 122, 149, 42, 176, 246, 213, 150, 164, // u".z.*..... + 3, 0, 123, 86, 16, 128, 222, 184, 0, 16, 158, 207, // ..{V........ + 87, 172, 192, 180, 131, 13, 73, 7, 64, 94, 111, 163, // W.....I.@^o. + 146, 0, 64, 180, 253, 9, 162, 1, 208, 163, 100, 113, // ..@.......dq + 119, 236, 227, 224, 114, 146, 1, 176, 240, 197, 160, 210, // w...r....... + 0, 244, 196, 4, 128, 176, 45, 203, 136, 194, 197, 193, // ......-..... + 95, 7, 146, 231, 90, 192, 215, 131, 29, 112, 59, 129, // _...Z....p;. + 94, 97, 143, 71, 34, 109, 87, 19, 9, 0, 155, 210, // ^a.G"mW..... + 225, 163, 246, 38, 209, 76, 224, 228, 27, 219, 64, 13, // ...&.L....@. + 143, 49, 219, 88, 0, 56, 167, 70, 113, 206, 36, 26, // .1.X.8.Fq.$. + 8, 54, 31, 217, 164, 22, 0, 231, 38, 4, 64, 216, // .6......&.@. + 138, 77, 149, 226, 230, 29, 8, 36, 13, 0, 233, 135, // .M.....$.... + 26, 212, 2, 0, 198, 111, 97, 55, 30, 128, 86, 21, // .....oa7..V. + 11, 131, 191, 244, 135, 116, 31, 254, 87, 228, 252, 127, // .....t..W... + 155, 242, 231, 255, 112, 109, 137, 8, 128, 176, 196, 251, // ....pm...... + 51, 53, 1, 104, 33, 63, 141, 122, 7, 224, 117, 245, // 35.h!?.z..u. + 206, 255, 225, 155, 89, 78, 143, 4, 192, 60, 149, 11, // ....YN...<.. + 131, 69, 100, 106, 164, 119, 0, 188, 202, 94, 0, 138, // .Edj.w...^.. + 166, 121, 145, 0, 240, 48, 80, 24, 188, 175, 227, 91, // .y...0P....[ + 195, 151, 6, 59, 225, 190, 253, 126, 22, 0, 240, 68, // ...;...~...D + 2, 224, 4, 11, 0, 180, 246, 233, 247, 52, 112, 232, // .........4p. + 245, 45, 44, 132, 143, 58, 49, 6, 0, 97, 203, 245, // .-,..:1..a.. + 97, 22, 138, 75, 33, 223, 16, 252, 166, 232, 17, 128, // a..K!....... + 156, 151, 26, 89, 1, 96, 88, 220, 234, 94, 4, 96, // ...Y.`X..^.` + 1, 35, 133, 241, 218, 167, 195, 69, 162, 31, 158, 106, // .#.....E...j + 15, 223, 102, 158, 5, 45, 8, 7, 128, 99, 9, 128, // ..f..-...c.. + 37, 58, 28, 12, 110, 238, 219, 196, 82, 248, 40, 46, // %:..n...R.(. + 28, 128, 62, 198, 138, 131, 126, 29, 173, 20, 30, 34, // ..>...~...." + 115, 255, 148, 3, 126, 214, 0, 232, 11, 7, 224, 35, // s...~......# + 214, 0, 200, 239, 109, 210, 13, 0, 173, 236, 125, 251, // ....m.....}. + 249, 215, 223, 240, 0, 8, 47, 88, 98, 177, 64, 254, // ....../Xb.@. + 166, 137, 214, 195, 255, 148, 156, 251, 127, 245, 60, 7, // ..........<. + 140, 122, 60, 67, 241, 197, 31, 241, 8, 239, 153, 95, // .z../.. + 127, 180, 228, 66, 0, 118, 50, 94, 36, 84, 191, 210, // ...B.v2^$T.. + 172, 185, 240, 119, 189, 214, 202, 122, 248, 168, 157, 8, // ...w...z.... + 192, 65, 13, 20, 170, 169, 39, 136, 241, 182, 246, 29, // .A....'..... + 251, 56, 45, 0, 112, 112, 138, 28, 27, 62, 200, 161, // .8-.pp...>.. + 187, 200, 169, 64, 11, 235, 6, 191, 56, 221, 1, 15, // ...@....8... + 190, 16, 208, 66, 248, 252, 134, 18, 8, 192, 25, 141, // ...B........ + 20, 11, 191, 39, 198, 254, 247, 116, 7, 211, 0, 152, // ...'...t.... + 95, 110, 210, 74, 248, 168, 51, 8, 192, 121, 13, 21, // _n.J..3..y.. + 12, 235, 200, 192, 106, 152, 209, 240, 219, 143, 110, 214, // ....j.....n. + 82, 248, 168, 243, 8, 192, 5, 141, 21, 13, 86, 50, // R.........V2 + 40, 100, 237, 250, 64, 211, 145, 141, 90, 11, 31, 117, // (d..@...Z..u + 1, 1, 248, 86, 131, 133, 67, 110, 111, 35, 127, 141, // ...V..Cno#.. + 93, 237, 224, 191, 37, 194, 89, 138, 22, 61, 196, 236, // ]...%.Y..=.. + 53, 11, 0, 106, 217, 193, 32, 124, 114, 74, 189, 107, // 5..j.. |rJ.k + 4, 248, 128, 71, 97, 111, 147, 86, 195, 31, 5, 224, // ...Gao.V.... + 130, 134, 27, 128, 249, 100, 96, 120, 90, 133, 13, 38, // .....d`xZ..& + 240, 249, 126, 4, 80, 203, 222, 137, 167, 128, 243, 26, // ..~.P....... + 111, 130, 87, 1, 249, 38, 158, 83, 96, 154, 248, 55, // o.W..&.S`..7 + 242, 25, 26, 255, 214, 95, 53, 8, 60, 163, 147, 102, // ....._5.<..f + 248, 21, 55, 85, 228, 124, 252, 177, 12, 167, 5, 188, // ..7U.|...... + 28, 109, 123, 165, 5, 110, 217, 231, 211, 75, 248, 163, // .m{..n...K.. + 211, 192, 227, 58, 106, 136, 215, 156, 253, 126, 126, 23, // ...:j....~~. + 46, 90, 225, 191, 117, 50, 4, 115, 217, 91, 208, 65, // .Z..u2.s.[.A + 237, 66, 208, 65, 29, 54, 6, 11, 94, 160, 247, 168, // .B.A.6..^... + 217, 162, 23, 131, 122, 12, 127, 244, 82, 240, 78, 157, // ....z...R.N. + 54, 7, 255, 160, 240, 140, 1, 30, 67, 175, 254, 136, // 6.......C... + 55, 131, 92, 122, 109, 240, 109, 10, 207, 26, 190, 221, // 7..zm.m..... + 31, 210, 51, 0, 46, 230, 23, 132, 72, 213, 61, 207, // ..3.....H.=. + 115, 252, 141, 25, 26, 55, 119, 238, 121, 158, 211, 43, // s....7w.y..+ + 0, 171, 152, 94, 18, 150, 208, 43, 104, 40, 238, 55, // ...^...+h(.7 + 224, 102, 123, 89, 87, 194, 75, 194, 102, 232, 169, 169, // .f{YW.K.f... + 7, 14, 4, 248, 85, 184, 159, 83, 188, 107, 136, 199, // ....U..S.k.. + 194, 99, 226, 177, 117, 6, 192, 12, 213, 151, 133, 63, // .c..u......? + 176, 155, 131, 194, 173, 126, 176, 4, 57, 40, 243, 248, // .....~..9(.. + 160, 164, 218, 11, 69, 37, 30, 200, 90, 231, 130, 244, // ....E%..Z... + 28, 39, 172, 140, 162, 154, 234, 122, 248, 172, 191, 157, // .'.....z.... + 191, 28, 27, 46, 57, 239, 20, 14, 11, 151, 127, 195, // ....9....... + 133, 53, 96, 45, 209, 234, 196, 30, 176, 23, 236, 9, // .5`-........ + 123, 195, 30, 177, 87, 236, 25, 123, 87, 125, 89, 184, // {...W..{W}Y. + 210, 15, 134, 204, 218, 235, 131, 21, 219, 73, 224, 13, // .........I.. + 28, 20, 149, 214, 193, 242, 204, 90, 201, 178, 89, 235, // .......Z..Y. + 97, 104, 64, 189, 27, 66, 248, 217, 88, 67, 34, 61, // ah@..B..XC"= + 160, 7, 232, 5, 122, 130, 222, 168, 245, 96, 136, 236, // ....z....`.. + 143, 134, 205, 34, 66, 234, 243, 139, 221, 9, 25, 198, // ..."B....... + 10, 4, 52, 194, 31, 47, 244, 6, 61, 154, 165, 194, // ..4../..=... + 163, 97, 11, 228, 12, 190, 96, 27, 253, 224, 213, 132, // .a....`..... + 64, 142, 240, 199, 131, 128, 158, 201, 12, 194, 2, 217, // @........... + 31, 15, 95, 246, 180, 31, 10, 54, 120, 100, 51, 74, // .._....6xd3J + 13, 8, 228, 14, 63, 92, 232, 29, 122, 40, 251, 227, // ....?...z(.. + 225, 114, 108, 16, 177, 190, 213, 207, 15, 130, 148, 48, // .rl........0 + 74, 41, 8, 148, 12, 95, 20, 122, 136, 94, 202, 186, // J)..._.z.^.. + 65, 4, 205, 45, 98, 238, 121, 142, 140, 230, 93, 62, // A..-b.y...]> + 69, 77, 82, 2, 2, 53, 194, 15, 23, 122, 138, 222, // EMR..5...z.. + 202, 185, 69, 76, 194, 155, 68, 165, 224, 148, 206, 228, // ..EL..D..... + 81, 205, 36, 185, 32, 80, 59, 124, 81, 232, 109, 10, // Q.$. P;|Q.m. + 157, 169, 227, 60, 234, 219, 196, 205, 222, 227, 75, 120, // ...<......Kx + 90, 199, 34, 4, 172, 132, 31, 62, 109, 68, 175, 169, // Z."....>mD.. + 111, 19, 151, 200, 70, 145, 119, 146, 159, 38, 83, 165, // o...F.w..&S. + 151, 25, 147, 104, 65, 192, 90, 248, 162, 208, 235, 59, // ...hA.Z....; + 165, 159, 14, 182, 80, 221, 42, 22, 167, 42, 165, 118, // ....P.*..*.v + 246, 76, 74, 20, 2, 86, 195, 23, 133, 158, 75, 156, // .LJ..V....K. + 38, 206, 161, 186, 89, 116, 73, 19, 199, 172, 73, 82, // &...YtI...IR + 33, 96, 61, 124, 81, 232, 61, 213, 205, 162, 227, 221, // !`=|Q.=..... + 46, 254, 161, 103, 56, 197, 167, 122, 114, 67, 160, 149, // ...g8..zrC.. + 240, 197, 41, 34, 102, 64, 123, 187, 248, 152, 94, 24, // ..)"f@{...^. + 113, 51, 145, 185, 202, 171, 9, 163, 98, 133, 64, 75, // q3......b.@K + 225, 139, 194, 12, 110, 166, 249, 194, 136, 88, 95, 25, // ....n....X_. + 131, 215, 172, 181, 100, 212, 100, 16, 104, 49, 252, 209, // ....d.d.h1.. + 233, 225, 214, 152, 46, 20, 245, 80, 123, 105, 212, 29, // .......P{i.. + 123, 57, 254, 22, 167, 22, 205, 138, 4, 129, 150, 195, // {9.......... + 71, 97, 22, 152, 9, 181, 151, 70, 77, 246, 218, 184, // Ga.....FM... + 130, 144, 95, 179, 102, 141, 135, 64, 235, 225, 143, 222, // .._.f..@.... + 55, 8, 249, 233, 189, 54, 110, 178, 23, 71, 154, 42, // 7....6n..G.* + 234, 52, 111, 152, 8, 129, 30, 194, 231, 175, 13, 144, // .4o......... + 76, 168, 190, 56, 50, 218, 171, 99, 23, 237, 244, 235, // L..82..c.... + 194, 48, 61, 10, 179, 161, 246, 234, 216, 104, 47, 143, // .0=......h/. + 46, 227, 124, 134, 217, 140, 10, 179, 161, 250, 242, 232, // ..|......... + 72, 175, 143, 207, 43, 114, 27, 102, 51, 42, 204, 134, // H...+r.f3*.. + 234, 235, 227, 5, 0, 102, 18, 13, 225, 1, 239, 239, // .....f...... + 230, 12, 163, 25, 23, 102, 36, 132, 143, 153, 205, 76, // .....f$....L + 24, 0, 1, 130, 82, 60, 232, 218, 46, 227, 252, 207, // ....R<...... + 186, 48, 35, 1, 128, 210, 88, 178, 141, 21, 128, 105, // .0#...X....i + 68, 103, 75, 154, 141, 95, 0, 230, 239, 15, 52, 243, // DgK.._....4. + 191, 0, 103, 49, 51, 106, 0, 8, 16, 164, 88, 28, // ..g13j....X. + 245, 134, 201, 140, 11, 51, 194, 172, 98, 205, 53, 102, // .....3..b.5f + 0, 80, 53, 126, 238, 3, 195, 100, 182, 133, 25, 197, // .P5~...d.... + 147, 105, 92, 0, 152, 182, 7, 126, 84, 106, 245, 126, // .i.....~Tj.~ + 103, 24, 205, 232, 26, 1, 146, 13, 102, 36, 27, 0, // g.......f$.. + 40, 203, 147, 193, 223, 230, 26, 83, 65, 230, 132, 153, // (......SA... + 96, 54, 241, 230, 25, 55, 0, 168, 202, 182, 64, 179, // `6...7....@. + 212, 117, 0, 143, 173, 173, 129, 37, 233, 21, 99, 180, // .u.....%..c. + 60, 211, 145, 132, 161, 57, 174, 242, 1, 189, 145, 186, // <....9...... + 46, 0, 51, 145, 146, 165, 36, 0, 80, 214, 22, 255, // ..3...$.P... + 59, 82, 138, 125, 100, 101, 57, 204, 75, 205, 28, 163, // ;R.}de9.K... + 71, 37, 54, 174, 101, 97, 207, 227, 125, 64, 111, 164, // G%6.ea..}@o. + 28, 11, 179, 144, 154, 163, 100, 0, 200, 72, 115, 106, // ......d..Hsj + 149, 203, 55, 100, 0, 160, 46, 0, 152, 1, 102, 161, // ..7d......f. + 56, 0, 40, 95, 71, 195, 207, 74, 171, 226, 27, 20, // 8.(_G..J.... + 26, 0, 208, 3, 0, 189, 199, 12, 18, 201, 48, 33, // ..........0! + 0, 248, 83, 65, 87, 240, 231, 230, 74, 239, 247, 6, // ..SAW...J... + 0, 202, 2, 128, 158, 163, 247, 137, 230, 151, 48, 0, // ..........0. + 168, 162, 237, 129, 91, 77, 21, 222, 43, 6, 0, 202, // ....[M..+... + 0, 128, 94, 163, 231, 52, 178, 163, 2, 0, 42, 111, // ..^..4....*o + 71, 224, 55, 27, 202, 235, 174, 24, 0, 200, 11, 0, // G.7......... + 122, 140, 94, 211, 202, 141, 26, 0, 168, 210, 39, 131, // z.^.......'. + 119, 111, 40, 155, 24, 2, 3, 0, 233, 0, 160, 183, // wo(......... + 232, 49, 205, 204, 168, 2, 128, 242, 182, 55, 220, 102, // .1.......7.f + 42, 175, 251, 222, 0, 128, 46, 0, 232, 41, 122, 75, // *........)zK + 59, 47, 234, 0, 160, 156, 157, 193, 159, 90, 221, 190, // ;/.......Z.. + 47, 13, 0, 232, 0, 128, 94, 162, 167, 114, 100, 37, // /.....^..rd% + 11, 0, 226, 117, 2, 188, 64, 241, 199, 108, 167, 1, // ...u..@..l.. + 128, 68, 0, 208, 59, 244, 48, 145, 121, 190, 106, 0, // .D..;.0.y.j. + 136, 170, 10, 5, 54, 229, 20, 186, 13, 0, 226, 4, // ....6....... + 0, 61, 67, 239, 228, 206, 71, 118, 0, 248, 107, 5, // .=C...Gv..k. + 29, 193, 7, 205, 21, 255, 31, 23, 24, 0, 76, 14, // ..........L. + 0, 122, 133, 158, 41, 145, 141, 34, 0, 160, 26, 219, // .z..)..".... + 27, 126, 82, 195, 113, 255, 94, 154, 110, 0, 16, 13, // .~R.q.^.n... + 0, 244, 6, 61, 66, 175, 148, 202, 69, 49, 0, 68, // ...=B...E1.D + 21, 214, 215, 6, 83, 151, 229, 27, 0, 140, 3, 0, // ....S....... + 61, 65, 111, 148, 206, 67, 113, 0, 80, 169, 53, 222, // =Ao..Cq.P.5. + 31, 103, 172, 183, 252, 107, 254, 194, 172, 164, 7, 0, // .g...k...... + 61, 64, 47, 208, 19, 53, 178, 80, 5, 128, 209, 171, // =@/..5.P.... + 135, 30, 123, 218, 163, 171, 139, 190, 75, 86, 0, 176, // ..{.....KV.. + 119, 244, 64, 205, 12, 84, 5, 64, 148, 125, 107, 160, // w.@..T.@.}k. + 181, 164, 42, 121, 150, 154, 97, 175, 216, 51, 11, 222, // ..*y..a..3.. + 51, 1, 128, 40, 91, 40, 224, 43, 183, 215, 95, 78, // 3..([(.+.._N + 203, 210, 95, 232, 216, 19, 246, 134, 61, 178, 228, 57, // .._.....=..9 + 83, 0, 136, 42, 239, 8, 174, 175, 242, 248, 134, 180, // S..*........ + 178, 253, 204, 100, 203, 181, 72, 47, 95, 98, 79, 44, // ...d..H/_bO, + 122, 205, 36, 0, 163, 107, 15, 59, 131, 15, 217, 125, // z.$..k.;...} + 220, 7, 90, 124, 30, 17, 107, 198, 218, 177, 7, 150, // ..Z|..k..... + 61, 102, 26, 128, 49, 207, 36, 132, 2, 78, 155, 159, // =f..1.$..N.. + 251, 152, 133, 157, 72, 39, 218, 201, 19, 107, 196, 90, // ....H'...k.Z + 181, 226, 171, 102, 0, 8, 223, 209, 212, 220, 25, 176, // ...f........ + 214, 4, 253, 231, 139, 45, 117, 87, 212, 14, 29, 107, // .....-uW...k + 192, 90, 176, 166, 240, 29, 56, 13, 0, 20, 18, 215, // .Z....8..... + 22, 188, 221, 190, 37, 208, 110, 107, 244, 191, 87, 233, // ....%.nk..W. + 244, 93, 34, 223, 194, 17, 57, 6, 145, 120, 76, 60, // .]"...9..xL< + 54, 126, 6, 126, 22, 126, 38, 126, 182, 214, 253, 211, // 6~.~.~&~.... + 60, 0, 145, 84, 214, 21, 248, 133, 115, 107, 192, 235, // <..T....sk.. + 108, 244, 247, 215, 248, 184, 15, 173, 30, 223, 23, 21, // l........... + 181, 245, 151, 44, 213, 222, 97, 83, 121, 221, 21, 12, // ...,..aSy... + 50, 187, 208, 53, 250, 94, 31, 252, 111, 252, 127, 248, // 2..5.^..o... + 103, 248, 119, 240, 239, 226, 191, 193, 127, 139, 199, 192, // g.w......... + 99, 225, 49, 245, 232, 213, 255, 0, 58, 21, 99, 155, // c.1.....:.c. + 126, 121, 49, 188, 0, 0, 0, 0, 73, 69, 78, 68, // ~y1.....IEND + 174, 66, 96, 130, 0 // .B`. +}; + +static const struct packed_file { + const char *name; + const unsigned char *data; + size_t size; + time_t mtime; +} packed_files[] = { + {"/web_root/index.html", v1, sizeof(v1), 1654623573}, + {"/web_root/main.js", v2, sizeof(v2), 1654674665}, + {"/web_root/preact.min.js", v3, sizeof(v3), 1654623573}, + {"/web_root/style.css", v4, sizeof(v4), 1654653116}, + {"/web_root/user.png", v5, sizeof(v5), 1654623573}, + {NULL, NULL, 0, 0} +}; + +const char *mg_unlist(size_t no); +const char *mg_unlist(size_t no) { + return packed_files[no].name; +} +const char *mg_unpack(const char *path, size_t *size, time_t *mtime); +const char *mg_unpack(const char *name, size_t *size, time_t *mtime) { + const struct packed_file *p; + for (p = packed_files; p->name != NULL; p++) { + if (strcmp(p->name, name) != 0) continue; + if (size != NULL) *size = p->size - 1; + if (mtime != NULL) *mtime = p->mtime; + return (const char *) p->data; + } + return NULL; +} diff --git a/examples/uart-bridge/screenshots/dashboard.png b/examples/uart-bridge/screenshots/dashboard.png new file mode 100644 index 00000000..0ae0f04e Binary files /dev/null and b/examples/uart-bridge/screenshots/dashboard.png differ diff --git a/examples/uart-bridge/web_root/index.html b/examples/uart-bridge/web_root/index.html new file mode 100644 index 00000000..2a323abd --- /dev/null +++ b/examples/uart-bridge/web_root/index.html @@ -0,0 +1,12 @@ + + + + Device Dashboard + + + + + + + + diff --git a/examples/uart-bridge/web_root/main.js b/examples/uart-bridge/web_root/main.js new file mode 100644 index 00000000..661aa238 --- /dev/null +++ b/examples/uart-bridge/web_root/main.js @@ -0,0 +1,81 @@ +'use strict'; +import {Component, h, html, render, useEffect, useState, useRef} from './preact.min.js'; + +const Message = m => html` + ${m.message.data} +`; + +const App = function(props) { + const [cfg, setCfg] = useState({tcp: '', ws: ''}); + const [messages, setMessages] = useState([]); + const [txt, setTxt] = useState(''); + const [connected, setConnected] = useState(false); + const [ws, setWs] = useState(null); + + const tcp_port = cfg.tcp.split(':')[2] || 4001; + const ws_port = cfg.ws.split(':')[2] || 4002; + + const refresh = () => + fetch('/api/config/get').then(r => r.json()).then(r => setCfg(r)); + + const watchWebsocket = function() { + // Connect to websocker port, to implement WS console + var l = window.location, proto = l.protocol.replace('http', 'ws'); + var tid, url = `${proto}//${l.hostname}:${ws_port}/ws`; + console.log(url); + var reconnect = function() { + var ws = new WebSocket(url); + ws.onopen = () => { + setConnected(true); + setWs(ws); + }; + ws.onmessage = ev => { + // console.log(ev, ev.data); + setMessages(x => x.concat([{data: ev.data, uart: true}])); + }; + ws.onclose = function() { + clearTimeout(tid); + tid = setTimeout(reconnect, 1000); + setConnected(false); + setWs(null); + }; + }; + reconnect(); + }; + + useEffect(() => { + refresh(); + watchWebsocket(); + }, []); + + + const sendmessage = ev => { + setMessages(x => x.concat([{data: txt + '\n', uart: false}])); + if (ws) ws.send(txt + '\n'); + setTxt(''); + }; + + return html` +
+

UART \u27F7 network bridge

+

UART settings

+
${JSON.stringify(cfg, null, 2)}
+

RX pin ${cfg.rx}, TX pin ${cfg.tx}, baud ${cfg.baud}

+

TCP listener: port ${tcp_port}

+

Use netcat to connect:

+
$ nc ${location.hostname} ${tcp_port}
+

Websocket listener: port ${ws_port}

+
UART console. Status: ${connected ? 'connected' : 'disconnected'}
+
+    ${messages.map(message => h(Message, {message}))}
+  
+
+ setTxt(ev.target.value)} /> +
+
`; +}; + +window.onload = () => render(h(App), document.body); diff --git a/examples/uart-bridge/web_root/preact.min.js b/examples/uart-bridge/web_root/preact.min.js new file mode 100644 index 00000000..e24f87b9 --- /dev/null +++ b/examples/uart-bridge/web_root/preact.min.js @@ -0,0 +1 @@ +var e,n,_,t,o,r,u,l={},i=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(e,n){for(var _ in n)e[_]=n[_];return e}function f(e){var n=e.parentNode;n&&n.removeChild(e)}function a(n,_,t){var o,r,u,l={};for(u in _)"key"==u?o=_[u]:"ref"==u?r=_[u]:l[u]=_[u];if(arguments.length>2&&(l.children=arguments.length>3?e.call(arguments,2):t),"function"==typeof n&&null!=n.defaultProps)for(u in n.defaultProps)void 0===l[u]&&(l[u]=n.defaultProps[u]);return p(n,l,o,r,null)}function p(e,t,o,r,u){var l={type:e,props:t,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==u?++_:u};return null!=n.vnode&&n.vnode(l),l}function h(e){return e.children}function d(e,n){this.props=e,this.context=n}function v(e,n){if(null==n)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var _;n0?p(m.type,m.props,m.key,null,m.__v):m)){if(m.__=_,m.__b=_.__b+1,null===(y=H[a])||y&&m.key==y.key&&m.type===y.type)H[a]=void 0;else for(d=0;d=t.__.length&&t.__.push({}),t.__[e]}function G(e){return R=1,z(ie,e)}function z(e,n,_){var t=j(L++,2);return t.t=e,t.__c||(t.__=[_?_(n):ie(void 0,n),function(e){var n=t.t(t.__[0],e);t.__[0]!==n&&(t.__=[n,t.__[1]],t.__c.setState({}))}],t.__c=N),t.__}function J(e,_){var t=j(L++,3);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__H.__h.push(t))}function K(e,_){var t=j(L++,4);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__h.push(t))}function Q(e){return R=5,Y(function(){return{current:e}},[])}function X(e,n,_){R=6,K(function(){"function"==typeof e?e(n()):e&&(e.current=n())},null==_?_:_.concat(e))}function Y(e,n){var _=j(L++,7);return le(_.__H,n)&&(_.__=e(),_.__H=n,_.__h=e),_.__}function Z(e,n){return R=8,Y(function(){return e},n)}function ee(e){var n=N.context[e.__c],_=j(L++,9);return _.c=e,n?(null==_.__&&(_.__=!0,n.sub(N)),n.props.value):e.__}function ne(e,_){n.useDebugValue&&n.useDebugValue(_?_(e):e)}function _e(e){var n=j(L++,10),_=G();return n.__=e,N.componentDidCatch||(N.componentDidCatch=function(e){n.__&&n.__(e),_[1](e)}),[_[0],function(){_[1](void 0)}]}function te(){I.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(re),e.__H.__h.forEach(ue),e.__H.__h=[]}catch(_){e.__H.__h=[],n.__e(_,e.__v)}}),I=[]}n.__b=function(e){N=null,O&&O(e)},n.__r=function(e){V&&V(e),L=0;var n=(N=e.__c).__H;n&&(n.__h.forEach(re),n.__h.forEach(ue),n.__h=[])},n.diffed=function(e){q&&q(e);var _=e.__c;_&&_.__H&&_.__H.__h.length&&(1!==I.push(_)&&W===n.requestAnimationFrame||((W=n.requestAnimationFrame)||function(e){var n,_=function(){clearTimeout(t),oe&&cancelAnimationFrame(n),setTimeout(e)},t=setTimeout(_,100);oe&&(n=requestAnimationFrame(_))})(te)),N=void 0},n.__c=function(e,_){_.some(function(e){try{e.__h.forEach(re),e.__h=e.__h.filter(function(e){return!e.__||ue(e)})}catch(t){_.some(function(e){e.__h&&(e.__h=[])}),_=[],n.__e(t,e.__v)}}),B&&B(e,_)},n.unmount=function(e){$&&$(e);var _=e.__c;if(_&&_.__H)try{_.__H.__.forEach(re)}catch(e){n.__e(e,_.__v)}};var oe="function"==typeof requestAnimationFrame;function re(e){var n=N;"function"==typeof e.__c&&e.__c(),N=n}function ue(e){var n=N;e.__c=e.__(),N=n}function le(e,n){return!e||e.length!==n.length||n.some(function(n,_){return n!==e[_]})}function ie(e,n){return"function"==typeof n?n(e):n}var ce=function(e,n,_,t){var o;n[0]=0;for(var r=1;r=5&&((o||!e&&5===t)&&(u.push(t,0,o,_),t=6),e&&(u.push(t,e,0,_),t=6)),o=""},i=0;i"===n?(t=1,o=""):o=n+o[0]:r?n===r?r="":o+=n:'"'===n||"'"===n?r=n:">"===n?(l(),t=1):t&&("="===n?(t=5,_=o,o=""):"/"===n&&(t<5||">"===e[i][c+1])?(l(),3===t&&(u=u[0]),t=u,(u=u[0]).push(2,0,t),t=0):" "===n||"\t"===n||"\n"===n||"\r"===n?(l(),t=2):o+=n),3===t&&"!--"===o&&(t=4,u=u[0])}return l(),u}(e)),n),arguments,[])).length>1?n:n[0]}.bind(a);export{a as h,fe as html,M as render,d as Component,F as createContext,G as useState,z as useReducer,J as useEffect,K as useLayoutEffect,Q as useRef,X as useImperativeHandle,Y as useMemo,Z as useCallback,ee as useContext,ne as useDebugValue,_e as useErrorBoundary}; diff --git a/examples/uart-bridge/web_root/style.css b/examples/uart-bridge/web_root/style.css new file mode 100644 index 00000000..3e5b8c30 --- /dev/null +++ b/examples/uart-bridge/web_root/style.css @@ -0,0 +1,23 @@ +* { box-sizing: border-box; } +html, body { margin: 0; padding: 0; height: 100%; font: 16px sans-serif; } +select, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; } +pre { color: #373; font-family: monospace; font-weight: bolder; font-size: smaller; background: #ddd; padding: 1em; border-radius: 0.2em; } +textarea, input, .addon { font-size: 15px; border: 1px solid #ccc; padding: 0.5em; } +a, a:visited, a:active { color: #55f; } +body {background: #455; } +.addon { background: #eee; min-width: 9em;} +.btn { + background: #ccc; border-radius: 0.3em; border: 0; color: #fff; cursor: pointer; + display: inline-block; padding: 0.6em 2em; font-weight: bolder; +} +.btn[disabled] { opacity: 0.5; cursor: auto;} +.smooth { transition: all .2s; } +.container { margin: 2em auto; max-width: 680px; background: white; padding: 1em; border-radius: 0.5em; } +.d-flex { display: flex; } +.d-none { display: none; } +.border { border: 1px solid #ddd; } +.rounded { border-radius: 0.5em; } +.nowrap { white-space: nowrap; } +.msg { background: #def; border-left: 5px solid #59d; padding: 0.5em; font-size: 90%; margin: 1em 0; } +.input { background: #fea; padding: 0.2em 1em; border-radius: 0.4em; } +.output { background: #aef; padding: 0.2em 1em; border-radius: 0.4em; }