diff --git a/html/wifi.shtml b/html/wifi.shtml index 1a9ca0e..f685322 100644 --- a/html/wifi.shtml +++ b/html/wifi.shtml @@ -55,7 +55,7 @@ window.onload = () => {

Web Keyboard Wi-Fi Settings

-
+

Wi-Fi Network

diff --git a/lwipopts.h b/lwipopts.h index daf6604..1a20780 100644 --- a/lwipopts.h +++ b/lwipopts.h @@ -115,6 +115,7 @@ #define LWIP_HTTPD_CGI 1 #define LWIP_HTTPD_SSI 1 #define LWIP_HTTPD_SSI_INCLUDE_TAG 0 +#define LWIP_HTTPD_SUPPORT_POST 1 #define HTTPD_FSDATA_FILE "my_fsdata.c" diff --git a/my_fsdata.c b/my_fsdata.c index 5830928..2a212dd 100644 --- a/my_fsdata.c +++ b/my_fsdata.c @@ -143,253 +143,253 @@ static const unsigned char data_wifi_shtml[] = { 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, - 0x22, 0x67, 0x65, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x2e, 0x63, - 0x67, 0x69, 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x57, 0x69, 0x2d, 0x46, 0x69, - 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3c, 0x2f, - 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, - 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x22, 0x3e, 0x53, 0x53, 0x49, 0x44, 0x3a, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, - 0x73, 0x69, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, - 0x22, 0x73, 0x73, 0x69, 0x64, 0x22, 0xa, 0x9, 0x9, 0x9, - 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, - 0x22, 0x33, 0x32, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, - 0x73, 0x73, 0x69, 0x64, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0xa, 0x9, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0xa, 0x9, - 0x9, 0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x3d, 0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d, - 0x2d, 0x23, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x2d, 0x3e, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, - 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x6f, - 0x73, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, - 0x68, 0x6f, 0x73, 0x74, 0x22, 0xa, 0x9, 0x9, 0x9, 0x6d, - 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22, - 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x68, - 0x6f, 0x73, 0x74, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, - 0x68, 0x32, 0x3e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xa, 0xa, 0x9, 0x3c, - 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, - 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, - 0x55, 0x73, 0x65, 0x20, 0x44, 0x48, 0x43, 0x50, 0x3a, 0x3c, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x2e, + 0x63, 0x67, 0x69, 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x57, 0x69, 0x2d, 0x46, + 0x69, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3c, + 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x22, 0x3e, 0x53, 0x53, 0x49, 0x44, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x20, - 0x69, 0x64, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70, 0x22, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70, - 0x22, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x21, 0x2d, 0x2d, 0x23, - 0x64, 0x68, 0x63, 0x70, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, - 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x73, 0x73, 0x69, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x73, 0x73, 0x69, 0x64, 0x22, 0xa, 0x9, 0x9, + 0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3d, 0x22, 0x33, 0x32, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x73, 0x73, 0x69, 0x64, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0xa, 0x9, 0xa, 0x9, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0xa, + 0x9, 0x9, 0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3d, 0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x2d, 0x3e, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x49, - 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, + 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x6f, 0x73, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x68, 0x6f, 0x73, 0x74, 0x22, 0xa, 0x9, 0x9, 0x9, + 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, + 0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x68, 0x6f, 0x73, 0x74, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x68, 0x32, 0x3e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, + 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xa, 0xa, 0x9, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, + 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, + 0x3e, 0x55, 0x73, 0x65, 0x20, 0x44, 0x48, 0x43, 0x50, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, - 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x69, 0x70, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0xa, 0x9, 0x9, 0x9, - 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, - 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, - 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x30, 0x2d, 0x2d, 0x3e, 0x3e, - 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70, - 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, - 0x70, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, - 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, - 0x69, 0x70, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, - 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22, - 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, - 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, - 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x32, - 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0xa, 0x9, 0x9, - 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, - 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x33, 0x2d, 0x2d, 0x3e, - 0x3e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, - 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x6d, 0x61, 0x73, 0x6b, + 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x68, 0x63, + 0x70, 0x22, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x64, 0x68, 0x63, 0x70, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, + 0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, + 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, + 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30, 0x22, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30, + 0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0xa, 0x9, 0x9, + 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, + 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x30, 0x2d, 0x2d, 0x3e, + 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, + 0x70, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x69, 0x70, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, + 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x70, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, + 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x32, + 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, + 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, + 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, + 0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0xa, 0x9, + 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x33, 0x2d, 0x2d, + 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x6d, 0x61, 0x73, + 0x6b, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, + 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, + 0x30, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, + 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, + 0x61, 0x73, 0x6b, 0x30, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, + 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, + 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, + 0x61, 0x73, 0x6b, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, + 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x31, 0x2d, 0x2d, 0x3e, + 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, + 0x61, 0x73, 0x6b, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x22, 0xa, 0x9, + 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x32, + 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, - 0x73, 0x6b, 0x30, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, - 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x73, 0x6b, 0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x31, - 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, - 0x73, 0x6b, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, - 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, - 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, - 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, - 0x73, 0x6b, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, - 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x22, 0xa, 0x9, 0x9, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, + 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, + 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x30, + 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, - 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x2d, - 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, - 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, - 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, - 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, - 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73, - 0x6b, 0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, - 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, - 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0xa, - 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, - 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, - 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x30, 0x2d, - 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, - 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x67, 0x77, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, - 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, - 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, - 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, - 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, - 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, - 0x77, 0x32, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, - 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, - 0x67, 0x77, 0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, - 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22, - 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, - 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, - 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x33, - 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, 0x61, 0x76, - 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x2a, 0x3c, 0x62, - 0x72, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x2a, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, - 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, - 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xa, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, 0x2f, - 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x68, - 0x74, 0x6d, 0x6c, 0x3e, 0xa, }; + 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x31, 0x2d, 0x2d, 0x3e, + 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, + 0x77, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x67, 0x77, 0x32, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, + 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x67, 0x77, 0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, + 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x33, + 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, + 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, + 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, + 0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, 0x61, + 0x76, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x2a, 0x3c, + 0x62, 0x72, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x2a, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, + 0xa, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, }; static const unsigned char data_index_html[] = { /* /index.html */ @@ -1071,7 +1071,7 @@ static const unsigned char data_index_html[] = { 0x72, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, 0x6b, 0x65, - 0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x2c, 0x20, 0x32, 0x35, + 0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x2c, 0x20, 0x32, 0x30, 0x30, 0x20, 0x29, 0x3b, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x55, 0x70, 0x28, 0x65, 0x76, diff --git a/server.c b/server.c index 8d4c272..d8df6d1 100644 --- a/server.c +++ b/server.c @@ -25,6 +25,7 @@ static bool clientmode = false; static bool config_loaded = false; static bool bad_config = false; static bool reboot = false; +static void *current_connection; // list of SSI variable names for lwIP SSI handler const char * __not_in_flash("httpd") ssi_tags[] = { @@ -49,10 +50,24 @@ const char * __not_in_flash("httpd") ssi_tags[] = { "dhcp" }; +const char * ip_parts[] = { + "ip0=", + "ip1=", + "ip2=", + "ip3=", + "mask0=", + "mask1=", + "mask2=", + "mask3=", + "gw0=", + "gw1=", + "gw2=", + "gw3=" +}; +#define NPARTS ( sizeof( ip_parts )/ sizeof(ip_parts[0]) ) static const tCGI cgi_handlers[] = { { "/sendkeys.cgi", sendkeys_cgi }, - { "/wifi.cgi", save_wifi }, { "/reboot.cgi", reboot_cgi }, }; @@ -119,7 +134,7 @@ void run_http_server() { // start the HTTP web server for keyboard input and config page httpd_init(); - http_set_cgi_handlers(cgi_handlers, 3); + http_set_cgi_handlers(cgi_handlers, 2); for (size_t i = 0; i < LWIP_ARRAYSIZE(ssi_tags); i++) { LWIP_ASSERT("tag too long for LWIP_HTTPD_MAX_TAG_NAME_LEN", strlen(ssi_tags[i]) <= LWIP_HTTPD_MAX_TAG_NAME_LEN); @@ -184,89 +199,6 @@ const char * sendkeys_cgi (int iIndex, int iNumParams, char *pcParam[], char *pc return "/success.html"; } -// lwIP cgi handler for form submission of network config to wifi.cgi -const char * save_wifi (int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { - // clear all values in manual network settings - memset(ip, 0, sizeof(ip)); - memset(mask, 0, sizeof(mask)); - memset(gw, 0, sizeof(gw)); - - bad_config = false; - wifi.manual = true; - - // read parameter values - for (int i=0; i < iNumParams; i++) { - if (strcmp(pcParam[i], "ssid") == 0){ - if (pcValue[i][0] == "\0") { - bad_config = true; - } else { - urldecode(pcValue[i], wifi.ssid); - } - } else if (strcmp(pcParam[i], "pass") == 0) { - urldecode(pcValue[i], wifi.pass); - } else if (strcmp(pcParam[i], "host") == 0) { - urldecode(pcValue[i], wifi.host); - } else if (strcmp(pcParam[i], "dhcp") == 0) { - wifi.manual = false; - } else if (strncmp(pcParam[i], "ip", 2) ==0 ) { - uint8_t part = atoi(&(pcParam[i][2])); - int val = atoi(pcValue[i]); - if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) { - bad_config = true; - } else { - ip[part] = (uint8_t) val; - } - } else if (strncmp(pcParam[i], "gw", 2) ==0 ) { - uint8_t part = atoi(&(pcParam[i][2])); - int val = atoi(pcValue[i]); - if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) { - bad_config = true; - } else { - gw[part] = (uint8_t) val; - } - } else if (strncmp(pcParam[i], "mask", 4) ==0 ) { - uint8_t part = atoi(&(pcParam[i][4])); - int val = atoi(pcValue[i]); - if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) { - bad_config = true; - } else { - mask[part] = (uint8_t) val; - } - } - } - - if (bad_config) { - // config is invalid, so don't save and return to config page - return "/wifi.shtml"; - } else { - // config is valid, prepare for saving to flash - IP4_ADDR(&(wifi.ip), ip[0], ip[1], ip[2], ip[3]); - if(!wifi.ip.addr) { - wifi.ip.addr = IPADDR_NONE; - } - IP4_ADDR(&(wifi.mask), mask[0], mask[1], mask[2], mask[3]); - if(!wifi.mask.addr) { - wifi.mask.addr = IPADDR_NONE; - } - IP4_ADDR(&(wifi.gw), gw[0], gw[1], gw[2], gw[3]); - if(!wifi.gw.addr) { - wifi.gw.addr = IPADDR_NONE; - } - wifi.header = STARTFILE; - wifi.footer = ENDFILE; - config_loaded = true; - - watchdog_update(); - - // save configuratitons to flash - net_config_write(&wifi); - - printf("wifi settings saved\n"); - - return "/success.html"; - } -} - // lwIP cgi handler for reboots initiated from the web const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { // turn on reboot flag to prevent watchdog from updating @@ -275,7 +207,7 @@ const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcVal return "/success.html"; } - +// write configuration data to flash memory void net_config_write(net_config *config) { // core 0 must have its TinyUSB interrupts disabled to allow flash writes multicore_lockout_start_blocking(); @@ -397,12 +329,157 @@ uint16_t __time_critical_func(ssi_handler)(int iIndex, char *pcInsert, int iInse return (uint16_t)printed; } +// lwIP handler for POST requests +err_t httpd_post_begin(void *connection, const char *uri, + const char * http_request, u16_t http_request_len, int content_len, + char *response_uri,u16_t response_uri_len, u8_t *post_auto_wnd) { + if (memcmp(uri, "/wifi.cgi", 9) == 0 && current_connection != connection) { + // initiate post request to wifi.cgi + current_connection = connection; + // default page is wifi config page + snprintf(response_uri, response_uri_len, "/wifi.shtml"); + *post_auto_wnd = 1; + return ERR_OK; + } + return ERR_VAL; +} + +// lwIP handler for receiving POST data +err_t httpd_post_receive_data(void *connection, struct pbuf *p) { + if (current_connection == connection) { + // clear all values in manual network settings + memset(ip, 0, sizeof(ip)); + memset(mask, 0, sizeof(mask)); + memset(gw, 0, sizeof(gw)); + + bad_config = false; + wifi.manual = true; + char buf[MAX_POST_PARAM_LEN]; + char * value; + + // read parameter values + value = find_post_param(p, "ssid=", buf, sizeof(buf)); + if (value) { + urldecode(value, wifi.ssid); + } else { + bad_config = true; + } + value = find_post_param(p, "pass=", buf, sizeof(buf)); + if (value) { + urldecode(value, wifi.pass); + } else { + wifi.pass[0]=0; + } + value = find_post_param(p, "host=", buf, sizeof(buf)); + if (value) { + urldecode(value, wifi.host); + } else { + wifi.host[0]=0; + } + value = find_post_param(p, "dhcp=", buf, sizeof(buf)); + if (value) { + wifi.manual = false; + } else { + for (int i=0; i< NPARTS; i++) { + value = find_post_param(p, ip_parts[i], buf, sizeof(buf)); + if (value) { + int ip_part = atoi(value); + if (ip_part > 255 || ip_part < 0) { + bad_config = true; + } else { + if (strncmp(ip_parts[i], "ip", 2) == 0) { + uint8_t part = atoi(&ip_parts[i][2]); + ip[part] = (uint8_t) ip_part; + } else if (strncmp(ip_parts[i], "gw", 2) == 0) { + uint8_t part = atoi(&ip_parts[i][2]); + gw[part] = (uint8_t) ip_part; + } else if (strncmp(ip_parts[i], "mask", 4) == 0) { + uint8_t part = atoi(&ip_parts[i][4]); + mask[part] = (uint8_t) ip_part; + } + } + } else { + bad_config = true; + } + } + } + + if (!bad_config) { + // config is valid, prepare for saving to flash + IP4_ADDR(&(wifi.ip), ip[0], ip[1], ip[2], ip[3]); + if(!wifi.ip.addr) { + wifi.ip.addr = IPADDR_NONE; + } + IP4_ADDR(&(wifi.mask), mask[0], mask[1], mask[2], mask[3]); + if(!wifi.mask.addr) { + wifi.mask.addr = IPADDR_NONE; + } + IP4_ADDR(&(wifi.gw), gw[0], gw[1], gw[2], gw[3]); + if(!wifi.gw.addr) { + wifi.gw.addr = IPADDR_NONE; + } + wifi.header = STARTFILE; + wifi.footer = ENDFILE; + config_loaded = true; + + watchdog_update(); + + // save configurations to flash + net_config_write(&wifi); + printf("wifi settings saved\n"); + + pbuf_free(p); + return ERR_OK; + } + } + + pbuf_free(p); + current_connection = NULL; + return ERR_VAL; +} + +// lwIP handler for end of POST request +void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len) { + // return to Wi-Fi config page unless save was successful + snprintf(response_uri, response_uri_len, "/wifi.shtml"); + if (current_connection == connection) { + snprintf(response_uri, response_uri_len, "/success.html"); + } + current_connection = NULL; +} + +// Return a value for a parameter from POST +char *find_post_param(struct pbuf *p, const char *param, char *buf, size_t len) { + size_t param_len = strlen(param); + uint16_t param_pos = pbuf_memfind(p, param, param_len, 0); + if (param_pos != 0xFFFF) { + uint16_t value_pos = param_pos + param_len; + uint16_t value_len = 0; + uint16_t tmp; + + tmp = pbuf_memfind(p, "&", 1, value_pos); + if (tmp != 0xFFFF) { + value_len = tmp - value_pos; + } else { + value_len = p->tot_len - value_pos; + } + if (value_len > 0 && value_len < len) { + char *value = (char *) pbuf_get_contiguous(p, buf, len, value_len, value_pos); + if (value) { + value[value_len]=0; + return value; + } + } + } + return NULL; +} + // save keyboard's LED indicator status to memory void set_indicator(uint8_t const* buffer) { led_code = *buffer; } -// turn URL-formatted string from GET request and turn into regular string +// take URL-formatted string from GET request and turn into regular string void urldecode(char *urlstring, char *decoded) { uint8_t conv; while(*urlstring) { diff --git a/server.h b/server.h index ee051df..9f982bf 100644 --- a/server.h +++ b/server.h @@ -7,6 +7,7 @@ #define ENDFILE 0x0464 #define DEFAULTHOST "picokb" #define DEFAULTPASS "password" +#define MAX_POST_PARAM_LEN 63+1 typedef struct { uint16_t header; @@ -22,13 +23,13 @@ typedef struct { void run_http_server(); const char * sendkeys_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); -const char * save_wifi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); uint16_t __time_critical_func(ssi_handler)(int iIndex, char *pcInsert, int iInsertLen); void set_indicator(uint8_t const* buffer); void urldecode(char *urlstring, char *dest); bool net_config_load(net_config *wifi); void net_config_write(net_config *wifi); +char *find_post_param(struct pbuf *p, const char *param, char *buf, size_t len); #define FLASH_TARGET_OFFSET ((PICO_FLASH_SIZE_BYTES) - FLASH_SECTOR_SIZE)