Implemented frontend for system settings

Started preparation for executing triggers
This commit is contained in:
Mark van Renswoude 2018-01-11 21:03:46 +01:00
parent 555eb38300
commit 2f96d0c60d
16 changed files with 2785 additions and 2402 deletions

81
API.md
View File

@ -4,6 +4,8 @@
- [GET /api/connection/status](#get-apiconnectionstatus) - [GET /api/connection/status](#get-apiconnectionstatus)
- [GET /api/connection](#get-apiconnection) - [GET /api/connection](#get-apiconnection)
- [POST /api/connection](#post-apiconnection) - [POST /api/connection](#post-apiconnection)
- [GET /api/system](#get-apisystem)
- [POST /api/system](#post-apisystem)
- [GET /api/steps](#get-apisteps) - [GET /api/steps](#get-apisteps)
- [POST /api/steps](#post-apisteps) - [POST /api/steps](#post-apisteps)
- [GET /api/triggers/time](#get-apitriggerstime) - [GET /api/triggers/time](#get-apitriggerstime)
@ -83,6 +85,28 @@ Updates the settings of the WiFi connections. The module will apply the new sett
``` ```
## GET /api/system
*Example response:*
```json
{
"lat": 52.370216,
"lng": 4.895168,
"pins": {
"ledAP": 4,
"ledSTA": 5,
"apButton": 2,
"pwmSDA": 13,
"pwmSCL": 12
},
"pwmAddress": 64,
"pwmFrequency": 1600,
"mapsAPIKey": ""
}
```
## POST /api/system
## GET /api/steps ## GET /api/steps
Returns the current brightness value for each step. The number of items in the array is equal to the number of configured steps. Each value has a range of 0 to 255. Returns the current brightness value for each step. The number of items in the array is equal to the number of configured steps. Each value has a range of 0 to 255.
@ -120,8 +144,65 @@ An optional array 'startTime' can be included which specifies the delay, for eac
## GET /api/triggers/time ## GET /api/triggers/time
Returns the current settings for the time triggers.
time:
Meaning depends on the triggerType
| triggerType | description |
| ----------- | - |
| 0 | fixed time, set time to the number of minutes since midnight |
| 1 | relative to sunrise, set time to the number of minutes before or after sunrise to trigger (negative numbers mean before sunrise) |
| 2 | relative to sunset, set time to the number of minutes before or after sunset to trigger (negative numbers mean before sunset) |
daysOfWeek:
Flags determining which days of the week the trigger is active.
| value | day |
| ----- | --- |
| 1 | Monday |
| 2 | Tuesday |
| 4 | Wednesday |
| 8 | Thursday |
| 16 | Friday |
| 32 | Saturday |
| 64 | Sunday |
Therefore 127 means every day of the week.
brightness: value from 0 to 255
enabled: whether or not this trigger is enabled
*Example response:*
```json
{
"enabled": true,
"transitionTime": 1000,
"triggers": [
{
"time": 480,
"daysOfWeek": 127,
"brightness": 0,
"triggerType": 0,
"enabled": true
},
{
"time": 1200,
"daysOfWeek": 127,
"brightness": 255,
"triggerType": 0,
"enabled": true
}
]
}
```
## POST /api/triggers/time ## POST /api/triggers/time
Changes the time trigger settings. Request body format is the same as is returned in the GET request.
## POST /api/firmware ## POST /api/firmware
Uploads new firmware. The bin file should be posted as a multipart/form-data file attachment. Name is not relevant. Uploads new firmware. The bin file should be posted as a multipart/form-data file attachment. Name is not relevant.

View File

@ -62,6 +62,52 @@ app.post('/api/firmware', function(req, res)
}); });
var system = {
"lat": 52.370216,
"lng": 4.895168,
"pins": {
"ledAP": 4,
"ledSTA": 5,
"apButton": 2,
"pwmSDA": 13,
"pwmSCL": 12
},
"pwmAddress": 64,
"pwmFrequency": 1600,
"mapsAPIKey": ""
};
app.get('/api/system', function(req, res)
{
res.send(system);
});
app.post('/api/system', function(req, res)
{
var body = req.body;
if (body)
{
system.lat = body.lat || system.lat;
system.lng = body.lng || system.lng;
system.pins.ledAP = body.pins.ledAP || system.pins.ledAP;
system.pins.ledSTA = body.pins.ledSTA || system.pins.ledSTA;
system.pins.apButton = body.pins.apButton || system.pins.apButton;
system.pins.pwmSDA = body.pins.pwmSDA || system.pins.pwmSDA;
system.pins.pwmSCL = body.pins.pwmSCL || system.pins.pwmSCL;
system.pwmAddress = body.pwmAddress || system.pwmAddress;
system.pwmFrequency = body.pwmFrequency || system.pwmFrequency;
system.mapsAPIKey = body.mapsAPIKey || system.mapsAPIKey;
res.sendStatus(200);
}
else
res.sendStatus(400);
});
var steps = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; var steps = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
app.get('/api/steps', function(req, res) app.get('/api/steps', function(req, res)

View File

@ -4,139 +4,140 @@
#include <pgmspace.h> #include <pgmspace.h>
const uint8_t EmbeddedBundleCSS[] PROGMEM = { const uint8_t EmbeddedBundleCSS[] PROGMEM = {
0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xc5,0x1a,0x4d,0x93,0xa3,0xba,0xf1,0xaf,0x90,0x99, 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xc5,0x1a,0x4d,0x93,0xa3,0xba,0xf1,0xaf,0x90,0xd9,
0xda,0x9a,0xb7,0x79,0xc0,0x62,0xb0,0x99,0x31,0xde,0xd9,0x4a,0x72,0xca,0x21,0xc9,0x21,0x87,0x5c,0xb6, 0xda,0xda,0xb7,0x79,0xc0,0x62,0x6c,0x33,0x33,0x78,0x67,0x2b,0xc9,0x29,0x87,0x24,0x87,0x1c,0x72,0xd9,
0xf6,0x20,0x83,0x30,0xaa,0xc5,0x40,0x40,0x8c,0x67,0x1e,0xc5,0x7f,0x4f,0xeb,0x03,0x23,0x81,0xc0,0x33, 0xda,0x83,0x0c,0xc2,0xa8,0x16,0x23,0x02,0x62,0x3c,0xf3,0x28,0xfe,0x7b,0x5a,0x1f,0x18,0x09,0x04,0x9e,
0x79,0xa9,0xca,0xba,0x76,0x6c,0x5a,0xdd,0xad,0x56,0x77,0xab,0xd5,0xdd,0xe2,0x8f,0x76,0x84,0x52,0x8a, 0xc9,0x4b,0x55,0xd6,0xb5,0x63,0xd3,0xea,0x6e,0xb5,0xba,0x5b,0xad,0xee,0x16,0x7f,0x74,0x63,0x94,0x31,
0x6b,0x3b,0x3a,0xe2,0xb4,0xac,0x71,0x77,0x2c,0x5f,0x9d,0x86,0xfc,0x46,0x8a,0x53,0x44,0x8a,0x0c,0xd7, 0x5c,0xbb,0xf1,0x11,0x67,0xb4,0xc6,0xdd,0x91,0xbe,0x78,0x0d,0xf9,0x8d,0x94,0xa7,0x98,0x94,0x39,0xae,
0x84,0xf6,0x19,0x3d,0xe7,0x2a,0xfc,0x58,0xd6,0x09,0xae,0x1d,0x80,0x1c,0xd2,0xb2,0xa0,0x0c,0x8c,0xa3, 0x09,0xeb,0x73,0x76,0x2e,0x74,0xf8,0x91,0xd6,0x29,0xae,0x3d,0x80,0x1c,0x32,0x5a,0x32,0x0e,0xc6,0x71,
0xd0,0x77,0x77,0x9f,0xfa,0x63,0x99,0xbc,0x75,0x71,0x99,0x97,0x75,0x74,0x1f,0x7a,0x61,0xfc,0x18,0x0a, 0x14,0xfa,0xfb,0x8f,0xfd,0x91,0xa6,0xaf,0x5d,0x42,0x0b,0x5a,0xc7,0x1f,0xa2,0x20,0x4a,0xee,0x23,0x89,
0x94,0x14,0x9d,0x49,0xfe,0x16,0xfd,0xb3,0x3c,0x96,0xb4,0xb4,0x1f,0xfe,0x8a,0xf3,0x17,0x4c,0x49,0x8c, 0x92,0xa1,0x33,0x29,0x5e,0xe3,0x7f,0xd2,0x23,0x65,0xd4,0xfd,0xf4,0x57,0x5c,0x3c,0x63,0x46,0x12,0xe4,
0xac,0x7f,0xe0,0x16,0x3f,0xd8,0xd7,0x67,0xfb,0xcf,0x35,0x41,0xb9,0xdd,0xa0,0xa2,0x71,0x1a,0x98,0x3c, 0xfc,0x03,0xb7,0xf8,0x93,0x7b,0x7d,0x76,0xff,0x5c,0x13,0x54,0xb8,0x0d,0x2a,0x1b,0xaf,0x81,0xc9,0x33,
0x55,0x66,0xd8,0xb8,0x21,0x3e,0x8b,0xe7,0x0b,0x26,0xa7,0x8c,0x46,0x81,0xe7,0x1d,0x72,0x4c,0x41,0x7c, 0x6d,0x86,0x8d,0x1f,0xe1,0xb3,0x7c,0xbe,0x60,0x72,0xca,0x59,0xbc,0x0d,0x82,0x43,0x81,0x19,0x88,0xef,
0xa7,0xa9,0x50,0xcc,0x64,0x73,0xbd,0x0d,0x20,0xe5,0xa4,0xc0,0x4e,0x26,0x90,0x80,0xac,0x3f,0xe6,0x65, 0x35,0x15,0x4a,0xb8,0x6c,0x7e,0xb0,0x01,0xa4,0x82,0x94,0xd8,0xcb,0x25,0x12,0x90,0xf5,0xc7,0x82,0x26,
0xfc,0xf3,0xdf,0x6d,0x49,0xd9,0xfa,0xb8,0xf0,0x39,0x4e,0x69,0xe4,0x06,0x35,0x3e,0x5b,0x4d,0x99,0x93, 0x3f,0xff,0xdd,0x52,0xc6,0xd7,0x27,0x84,0x2f,0x70,0xc6,0x62,0x7f,0x5b,0xe3,0xb3,0xd3,0xd0,0x82,0xa4,
0xc4,0xba,0xdf,0x7a,0xec,0x73,0x38,0xa3,0xfa,0x44,0x0a,0x31,0x7e,0x7d,0xaa,0x39,0x27,0xef,0x50,0xa1, 0xce,0x87,0x5d,0xc0,0x3f,0x87,0x33,0xaa,0x4f,0xa4,0x94,0xe3,0xd7,0xa7,0x5a,0x70,0x0a,0x0e,0x15,0x4a,
0x24,0x61,0xb3,0x6c,0x18,0xdd,0xc6,0xdd,0xc1,0x97,0xc2,0xdb,0x8a,0x72,0xd4,0x50,0x27,0xce,0x48,0x9e, 0x53,0x3e,0xcb,0x86,0xd3,0x6d,0xfc,0x3d,0x7c,0x69,0xbc,0x9d,0xb8,0x40,0x0d,0xf3,0x92,0x9c,0x14,0x69,
0x74,0x92,0x12,0xd6,0x4b,0xcb,0x73,0xe4,0xf5,0xee,0xb1,0x85,0x5f,0x85,0x2d,0xbf,0x48,0x51,0xb5,0xf4, 0xa7,0x28,0x61,0xbd,0x8c,0x9e,0xe3,0xa0,0xf7,0x8f,0x2d,0xfc,0x2a,0x5d,0xf5,0x45,0xca,0xaa,0x65,0xdf,
0x3b,0x7d,0xab,0xf0,0xb3,0x80,0xfc,0x50,0x41,0x35,0x6e,0x30,0xd5,0x20,0x4d,0x7b,0x3c,0x13,0xfa,0xa3, 0xd9,0x6b,0x85,0x9f,0x24,0xe4,0x87,0x0e,0xaa,0x71,0x83,0x99,0x01,0x69,0xda,0xe3,0x99,0xb0,0x1f,0xdd,
0x3b,0xa2,0xf8,0xe7,0xa9,0x2e,0xdb,0x22,0x71,0xa4,0x9a,0xbd,0x30,0x3d,0x88,0x45,0x45,0xee,0x46,0x59, 0x11,0x25,0x3f,0x4f,0x35,0x6d,0xcb,0xd4,0x53,0x6a,0x0e,0xa2,0xec,0x20,0x17,0x15,0xfb,0x1b,0x6d,0x3d,
0xcf,0x08,0x77,0x6a,0x94,0x90,0xb6,0x89,0xdc,0x2d,0x0c,0x1f,0x24,0x59,0x9a,0xa6,0x87,0xb8,0xad,0x1b, 0x23,0xdc,0xab,0x51,0x4a,0xda,0x26,0xf6,0x77,0x30,0x7c,0x50,0x64,0x59,0x96,0x1d,0x92,0xb6,0x6e,0xe0,
0xf8,0x5d,0x95,0xa4,0x00,0x1d,0x1e,0x12,0xd2,0x54,0x39,0x7a,0x03,0xbb,0x73,0xfd,0xf1,0x85,0x69,0xfa, 0x77,0x45,0x49,0x09,0x3a,0x3c,0xa4,0xa4,0xa9,0x0a,0xf4,0x0a,0x76,0x17,0xfa,0x13,0x0b,0x33,0xf4,0xcf,
0x67,0xec,0x35,0x03,0x3c,0x82,0x01,0xa4,0x9a,0x03,0xf7,0x89,0x8d,0x4e,0xcd,0xc1,0x49,0x54,0x73,0x48, 0xd9,0x1b,0x06,0xb8,0x07,0x03,0x28,0x35,0x6f,0xfd,0x07,0x3e,0x3a,0x35,0x87,0x20,0xd1,0xcd,0xa1,0xf0,
0xbc,0x41,0x93,0x9e,0xc5,0x6c,0x70,0xa0,0xf8,0x95,0x3a,0x28,0x27,0xa7,0x22,0x8a,0x31,0x17,0x86,0x43, 0x06,0x4d,0x06,0x0e,0xb7,0xc1,0x81,0xe1,0x17,0xe6,0xa1,0x82,0x9c,0xca,0x38,0xc1,0x42,0x18,0x01,0x49,
0x12,0x1c,0x97,0x35,0xa2,0xa4,0x2c,0xa2,0xa2,0x2c,0xb0,0x00,0xd2,0x1a,0xbc,0x03,0x7c,0xf5,0x1c,0xb5, 0x71,0x42,0x6b,0xc4,0x08,0x2d,0xe3,0x92,0x96,0x58,0x02,0x59,0x0d,0xde,0x01,0xbe,0x7a,0x8e,0xdb,0xaa,
0x55,0x85,0xeb,0x18,0x35,0xf8,0x70,0xc9,0x08,0xc5,0x7c,0x56,0x0c,0x98,0x97,0x1a,0x55,0x83,0xc2,0xa3, 0xc2,0x75,0x82,0x1a,0x7c,0xb8,0xe4,0x84,0x61,0x31,0x2b,0x06,0xcc,0x4b,0x8d,0xaa,0x41,0xe1,0x71,0x46,
0xb4,0x8c,0xdb,0xc6,0x1e,0x9e,0xb2,0xf2,0x05,0x9c,0x5d,0x1b,0xd2,0x46,0xe6,0x76,0x91,0x58,0x86,0x81, 0x93,0xb6,0x71,0x87,0xa7,0x9c,0x3e,0x83,0xb3,0x1b,0x43,0xc6,0xc8,0xdc,0x2e,0x0a,0xcb,0x32,0x30,0xa3,
0x19,0x85,0x30,0xdb,0x9c,0x40,0xc2,0x67,0xf8,0xd2,0xa8,0x73,0x82,0x61,0x80,0x53,0x18,0x6c,0x2e,0xb7, 0x90,0x66,0x9b,0x13,0x28,0xf8,0x0c,0x5f,0x19,0x75,0x4e,0x30,0x0c,0x08,0x0a,0x8b,0xcd,0xd5,0xd6,0x52,
0x96,0x34,0xaf,0x0e,0x54,0xec,0x5b,0xb6,0x94,0xa9,0x7e,0xf4,0xbe,0xef,0x60,0x62,0x74,0xcc,0x71,0xf2, 0xe6,0x35,0x81,0x9a,0x7d,0x69,0xcb,0xb8,0xea,0x47,0xef,0xfb,0x0e,0x26,0x46,0xc7,0x02,0xa7,0x3f,0xdc,
0xc3,0x9e,0x01,0xe6,0x0b,0x34,0x0f,0x8a,0xc5,0x98,0xc7,0xa4,0xdc,0xe3,0x60,0x27,0x5d,0x2c,0xc1,0x29, 0x19,0x60,0xbe,0x40,0xfb,0xa0,0x5c,0x8c,0x7d,0x4c,0xc9,0x3d,0x0e,0x76,0xca,0xc5,0x52,0x9c,0xa1,0xb6,
0x6a,0x73,0x7a,0x28,0x99,0x5f,0xd0,0xb7,0xc8,0xdd,0xcd,0x45,0xd2,0x2d,0xa5,0xc0,0x55,0x9b,0xcd,0xd0, 0x60,0x07,0xca,0xfd,0x82,0xbd,0xc6,0xfe,0x7e,0x2e,0x92,0x69,0x29,0x0d,0xae,0xdb,0x6c,0x86,0xbe,0x80,
0x17,0xb0,0xd7,0x56,0xb3,0x68,0xd1,0x35,0x2e,0xd3,0x65,0x2f,0x59,0x79,0x8d,0xc7,0x4c,0x3d,0x8b,0x96, 0xbd,0xb6,0x9a,0x45,0x8b,0xae,0x71,0x99,0x2e,0x7b,0xc9,0xca,0x6b,0x3c,0x66,0xea,0x59,0xb4,0xfc,0x94,
0x9f,0x72,0x59,0xdd,0xf7,0x0a,0x64,0xd0,0xaa,0xfc,0x72,0xa4,0x07,0xd8,0x66,0xe8,0x5c,0x03,0x2b,0x18, 0xcb,0xea,0xbe,0xd7,0x20,0x83,0x56,0xd5,0x97,0xa7,0x3c,0xc0,0xb5,0x43,0xe7,0x1a,0x58,0xc1,0x90,0xcb,
0x62,0x79,0x2b,0x08,0x52,0xf4,0x09,0xc6,0x5c,0x72,0xbe,0x7f,0x2b,0x54,0xc3,0x3e,0x3f,0xdc,0x94,0x5c, 0x5b,0x41,0x50,0xa2,0x4f,0x30,0xe6,0x92,0x8b,0xfd,0x5b,0xa1,0x1a,0xf6,0xf9,0xe1,0xa6,0xe4,0xa6,0x53,
0x77,0x8a,0xe9,0xa0,0xea,0x19,0x66,0xc2,0x35,0xba,0x9b,0xcb,0x5f,0x74,0x94,0x9b,0xfc,0x8c,0xca,0x5a, 0x4c,0x07,0x75,0xcf,0xb0,0x13,0xae,0xd1,0xdd,0x5c,0xfe,0xa2,0xa3,0xdc,0xe4,0x67,0x55,0xd6,0x92,0xcb,
0x72,0x99,0x9b,0xdc,0xcc,0x9a,0x5d,0x74,0x1e,0x23,0xbf,0x75,0x3b,0xac,0x45,0x12,0xf1,0xb4,0x60,0x9f, 0xdc,0xe4,0x66,0xd7,0xec,0xa2,0xf3,0x58,0xf9,0xad,0xdb,0x61,0x2d,0x92,0xc8,0xa7,0x05,0xfb,0x2c,0x6d,
0xa5,0xed,0xbb,0x8c,0xb6,0x62,0xb3,0x85,0xcd,0x7d,0x8b,0xd7,0x4d,0xfb,0xbc,0x63,0xeb,0x7f,0x60,0x0e, 0xdf,0x65,0xb4,0x15,0x9b,0x2d,0x6c,0xee,0x5b,0xbc,0x6e,0xda,0xe7,0x0d,0x5b,0xff,0x1d,0x73,0x58,0x8d,
0xa3,0xd1,0x6e,0x07,0x86,0x0f,0xcc,0x60,0xb6,0xe3,0x3b,0xc2,0xc6,0x8d,0x39,0x3a,0xcd,0xcc,0x32,0xbd, 0x76,0x3b,0x30,0xbc,0x63,0x06,0xbb,0x1d,0xdf,0x10,0x36,0x6e,0xcc,0xd1,0x19,0x66,0x56,0xe9,0xdd,0xca,
0x5b,0xd9,0x83,0x71,0x8e,0xd1,0xd4,0x54,0x02,0xb6,0xac,0xc0,0xd9,0xb8,0xbe,0xfa,0xd9,0xf0,0x44,0x72, 0x1e,0x4c,0x0a,0x8c,0xa6,0xa6,0x92,0xb0,0x65,0x05,0xce,0xc6,0xcd,0xd5,0xcf,0x86,0x27,0x92,0x8b,0xf1,
0x3e,0xfe,0x01,0x5f,0x7d,0x5f,0x30,0xe1,0x5c,0xcd,0x0e,0x2a,0x86,0x4c,0x4e,0xa9,0x12,0x2d,0xd3,0xdc, 0x77,0xf8,0xea,0xdb,0x82,0x89,0xe0,0x6a,0x77,0x50,0x39,0x64,0x73,0x4a,0x9d,0x68,0x99,0xe6,0x86,0x26,
0xd0,0xc4,0x4d,0x87,0x5b,0xe0,0x65,0xd0,0xda,0x2d,0xc7,0x5a,0xe0,0x64,0x52,0xf0,0x4d,0x07,0x52,0x78, 0x6e,0x3a,0xdc,0x02,0x2f,0x8b,0xd6,0x6e,0x39,0xd6,0x02,0x27,0x9b,0x82,0x6f,0x3a,0x90,0xc6,0xeb,0xf7,
0xfd,0x3e,0x63,0x98,0x83,0x07,0x67,0x7f,0x2b,0x74,0x4c,0x91,0x16,0x6d,0x74,0x23,0x6c,0x98,0xf9,0xdc, 0x19,0xc3,0x1e,0x3c,0x04,0xfb,0x5b,0xa1,0x63,0x8a,0xb4,0x68,0xa3,0x1b,0x61,0xc3,0xce,0xe7,0x86,0x45,
0xb0,0xc8,0x07,0x42,0xc6,0x4d,0xfe,0x06,0x33,0xbd,0x3f,0x5c,0xdc,0xe4,0x6e,0xb2,0xdc,0x07,0x42,0x85, 0xde,0x11,0x32,0x6e,0xf2,0xb7,0x98,0xe9,0xed,0xe1,0xe2,0x26,0x77,0x9b,0xe5,0xde,0x11,0x2a,0xac,0xfc,
0x91,0x7f,0xa7,0x6c,0xa5,0xb8,0x4c,0xd4,0x43,0x1c,0x32,0xcb,0x6d,0xba,0x4b,0x43,0x63,0x6d,0x31,0x16, 0x3b,0x6d,0x2b,0x25,0x34,0xd5,0x0f,0x71,0xc8,0x2c,0x77,0xd9,0x3e,0x8b,0xac,0xb5,0xc5,0x58,0x2c,0x3c,
0x0b,0x4f,0xe1,0x27,0x59,0x3c,0x41,0x8a,0xef,0xfa,0x6a,0xca,0xcf,0x9f,0x2c,0x5e,0x3c,0x99,0xf2,0xf6, 0x44,0x1f,0x55,0xf1,0x04,0x29,0xbe,0x1f,0xea,0x29,0xbf,0x78,0x72,0x44,0xf1,0x64,0xcb,0xdb,0xab,0x7a,
0xaa,0x5e,0x9b,0x6e,0x5e,0xb7,0xb1,0x3c,0x88,0xc9,0x9c,0xe6,0xe5,0xc5,0x79,0x8b,0x32,0x92,0x24,0xb8, 0x6d,0xba,0x79,0xdd,0xc6,0xf3,0x20,0x2e,0x73,0x56,0xd0,0x8b,0xf7,0x1a,0xe7,0x24,0x4d,0x71,0xc9,0xb9,
0x60,0x5c,0xbe,0x09,0xc9,0x35,0x31,0xbd,0x6b,0x91,0x23,0xaa,0x1b,0x43,0x41,0xa7,0xc9,0x04,0x6c,0xfa, 0x7c,0x93,0x92,0x1b,0x62,0x06,0xd7,0x22,0x47,0x56,0x37,0x96,0x82,0xce,0x90,0x09,0xd8,0xf4,0xf9,0x10,
0x6c,0x88,0x9b,0x40,0x2d,0xb9,0xd1,0xb2,0xd2,0x8b,0x2d,0x29,0xa4,0x5c,0x31,0x17,0xcf,0xeb,0x15,0xa5, 0x37,0x81,0x5a,0x71,0x63,0xb4,0x32,0x8b,0x2d,0x25,0xa4,0x5a,0xb1,0x10,0x2f,0xe8,0x35,0xa5,0xe3,0x33,
0xe3,0x33,0x22,0xb9,0x96,0x2a,0x17,0xed,0xf9,0x88,0x6b,0x0d,0x54,0xa1,0xa6,0xb9,0xc0,0x04,0x7a,0x4a, 0x22,0x85,0x91,0x2a,0x97,0xed,0xf9,0x88,0x6b,0x03,0x54,0xa1,0xa6,0xb9,0xc0,0x04,0x66,0x4a,0x0d,0xe6,
0x0d,0xe6,0x89,0x33,0x0d,0x44,0x71,0x3e,0x79,0x7e,0xd5,0x8b,0xc5,0xb6,0x06,0x84,0x06,0xe7,0x38,0xa6, 0x49,0x72,0x03,0xc4,0x70,0x31,0x79,0x7e,0x31,0x8b,0xc5,0xb6,0x06,0x84,0x06,0x17,0x38,0x61,0x2e,0x1f,
0x36,0x1b,0x84,0x1d,0x89,0x3a,0x04,0xc5,0x12,0x82,0x0d,0xca,0x35,0x0d,0xb5,0xd4,0x3b,0xb6,0xb5,0xbe, 0x84,0x1d,0x89,0x3a,0x04,0xc5,0x12,0x82,0x0d,0x2a,0x34,0x0d,0xb5,0xd4,0x1b,0xb6,0xb5,0xb9,0x46,0x55,
0x46,0x59,0x20,0x9b,0xec,0xce,0x9b,0x03,0x19,0x4a,0xca,0x8b,0xe4,0x3d,0x6b,0x22,0x1c,0xcc,0xe5,0x9f, 0x20,0xdb,0xec,0x2e,0x9a,0x03,0x39,0x4a,0xe9,0x45,0xf1,0x9e,0x35,0x11,0x0e,0xf6,0xf2,0xcf,0x8f,0x84,
0x1b,0x72,0xc5,0x73,0xb5,0x93,0x84,0x66,0xd1,0xc6,0xf3,0x3e,0xcd,0x15,0x37,0xf7,0x62,0xa9,0xbe,0xf9, 0xe2,0x85,0xda,0x49,0xca,0xf2,0x78,0x13,0x04,0x1f,0xe7,0x8a,0x9b,0x7b,0xb1,0x52,0xdf,0x7c,0xe0,0xaa,
0xc0,0x55,0x89,0x06,0xcf,0x17,0xaa,0x9c,0x0f,0x30,0x85,0x9a,0xa0,0xaf,0xa6,0xda,0x8c,0x29,0x57,0x42, 0x44,0x8b,0xe7,0x4b,0x55,0xce,0x07,0xb8,0x42,0x6d,0xd0,0x17,0x5b,0x6d,0xc6,0x95,0xab,0xa0,0x52,0xc5,
0x85,0x8a,0xe5,0xc3,0xa0,0x68,0xf1,0xd8,0xcd,0x52,0x73,0xa5,0x1a,0x13,0x74,0xaa,0x97,0x03,0xd3,0x5f, 0xea,0x61,0x50,0xb4,0x7c,0xec,0x66,0xa9,0xb9,0x56,0x8d,0x49,0x3a,0xdd,0xcb,0x81,0xe9,0x2f,0x9f,0x52,
0x1e,0x12,0x44,0x51,0x44,0xce,0xe8,0x84,0xbf,0x34,0x2f,0xa7,0x5f,0x5f,0xcf,0xf9,0xa1,0xa5,0xe9,0x93, 0xc4,0x50,0x4c,0xce,0xe8,0x84,0xbf,0x34,0xcf,0xa7,0x5f,0x5f,0xce,0xc5,0xa1,0x65,0xd9,0x83,0xfb,0x15,
0xfd,0x15,0x9e,0x2c,0x78,0x2a,0x9a,0xe7,0xbb,0x8c,0xd2,0x2a,0xfa,0xf2,0xe5,0x72,0xb9,0xb8,0x97,0xc0, 0x9e,0x1c,0x78,0x2a,0x9b,0xa7,0xbb,0x9c,0xb1,0x2a,0xfe,0xf2,0xe5,0x72,0xb9,0xf8,0x97,0xad,0x4f,0xeb,
0x2d,0xeb,0xd3,0x17,0xdf,0xf3,0x3c,0x86,0x7f,0x67,0x09,0x15,0x3f,0xdf,0x6d,0xb6,0x77,0xd6,0x0b,0xc1, 0xd3,0x97,0x30,0x08,0x02,0x8e,0x7f,0xe7,0x48,0x15,0x3f,0xdd,0x6d,0x76,0x77,0xce,0x33,0xc1,0x97,0xbf,
0x97,0xbf,0x94,0xaf,0xcf,0x77,0x9e,0xe5,0x59,0xfe,0xde,0x62,0x30,0xae,0xe1,0xe7,0x3b,0x7f,0x7f,0xf7, 0xd0,0x97,0xa7,0xbb,0xc0,0x09,0x9c,0xf0,0xd1,0xe1,0x30,0xa1,0xe1,0xa7,0xbb,0xf0,0xf1,0xee,0xdb,0xd7,
0xed,0x6b,0x85,0x68,0x66,0xa5,0x24,0xcf,0x9f,0xef,0xee,0x93,0x0d,0xfb,0xdc,0x59,0xc9,0xf3,0xdd,0xdf, 0x0a,0xb1,0xdc,0xc9,0x48,0x51,0x3c,0xdd,0x7d,0x48,0x37,0xfc,0x73,0xe7,0xa4,0x4f,0x77,0x7f,0x7f,0xf4,
0xf7,0x6e,0xf0,0xf8,0xe8,0x3f,0x5a,0x81,0x1b,0xfa,0xbb,0x7c,0xe7,0x7a,0x4f,0x9b,0xdd,0xd6,0x0a,0xdd, 0xb7,0xf7,0xf7,0xe1,0xbd,0xb3,0xf5,0xa3,0x70,0x5f,0xec,0xfd,0xe0,0x61,0xb3,0xdf,0x39,0x91,0xff,0xb8,
0x7d,0xb0,0xf3,0x83,0xbf,0x6d,0xf6,0xee,0x6e,0xeb,0x05,0xa1,0x18,0xbe,0xfb,0xf2,0xed,0x2b,0x9b,0xf9, 0xdd,0x87,0xdb,0xbf,0x6d,0x1e,0xfd,0xfd,0x2e,0xd8,0x46,0x72,0xf8,0xee,0xcb,0xb7,0xaf,0x7c,0xe6,0x6f,
0xdb,0xc3,0x67,0x4b,0x54,0xed,0x16,0x6f,0x94,0x58,0x45,0xe9,0xd4,0x18,0xbc,0x8d,0x0e,0x76,0x96,0x0d, 0x9f,0x3e,0x3b,0xb2,0x6a,0x77,0x44,0xa3,0xc4,0x29,0xa9,0x57,0x63,0xf0,0x36,0x36,0xd8,0x59,0x35,0x50,
0x14,0xb6,0x2f,0x7a,0x55,0x69,0xea,0xd9,0xc2,0x17,0xfe,0xff,0x55,0xc4,0xfe,0xb8,0x4d,0x62,0xf4,0xbb, 0xf8,0xbe,0xe8,0x75,0xa5,0xe9,0x67,0x8b,0x58,0xf8,0xff,0x57,0x11,0x8f,0xc7,0x5d,0x9a,0xa0,0xdf,0xa5,
0x14,0xd1,0x5f,0xf7,0xdb,0x99,0x14,0x43,0xcf,0x23,0x14,0x9d,0xa2,0x1c,0x1d,0x71,0x6e,0xe7,0xf8,0x84, 0x88,0xfe,0xba,0xdf,0xce,0xa4,0x1c,0x7a,0x1e,0x91,0xec,0x14,0x15,0xe8,0x88,0x0b,0xb7,0xc0,0x27,0x5c,
0x8b,0xa4,0xd3,0xe3,0x90,0xd6,0xe5,0x32,0x75,0x59,0xf4,0x76,0x92,0xe0,0x97,0x12,0x9c,0x27,0x70,0x56, 0xa6,0x9d,0x19,0x87,0x8c,0x2e,0x97,0xad,0xcb,0x62,0xb6,0x93,0x24,0xbf,0x8c,0xe0,0x22,0x85,0xb3,0x62,
0x0c,0xbe,0x26,0x76,0xd0,0xd8,0xa5,0xd2,0x22,0x50,0x9c,0xe1,0xf8,0x27,0xec,0x4b,0xbd,0x96,0x87,0x4d, 0xf0,0x35,0xb9,0x83,0xc6,0x2e,0x95,0x11,0x81,0x92,0x1c,0x27,0x3f,0x61,0x5f,0x9a,0xb5,0x3c,0x6c,0x62,
0x5c,0xfe,0xb8,0xca,0x22,0x1a,0x3f,0xbd,0xcb,0x05,0x75,0xc4,0xd3,0x64,0x50,0xed,0x0a,0x49,0xf1,0xb6, 0xfa,0xe3,0x2a,0x8b,0x6c,0xfc,0xf4,0xbe,0x10,0xd4,0x93,0x4f,0x93,0x41,0xbd,0x2b,0xa4,0xc4,0xdb,0x05,
0x9e,0xde,0x35,0x13,0xc2,0xb9,0x31,0xa0,0x20,0xa0,0xa8,0xbb,0xeb,0x39,0x80,0x5a,0x5a,0x02,0xea,0xab, 0x66,0xd7,0x4c,0x0a,0xe7,0x27,0x80,0x82,0x80,0xa2,0xee,0xae,0xe7,0x00,0x6a,0x19,0x05,0xd4,0x17,0x25,
0x94,0x74,0xb3,0xf1,0xf5,0x56,0x90,0x78,0x2c,0x1b,0xc2,0x3b,0x3e,0x35,0xce,0x11,0x25,0x2f,0x58,0x8d, 0xe9,0x66,0x13,0x9a,0xad,0x20,0xf9,0x48,0x1b,0x22,0x3a,0x3e,0x35,0x2e,0x10,0x23,0xcf,0x58,0x8f,0x0c,
0x0c,0x6e,0x5d,0x5e,0xae,0x12,0xa5,0x39,0x7e,0x3d,0xb0,0x3f,0x4e,0x42,0x6a,0xf0,0x29,0x46,0x04,0xfb, 0x7e,0x4d,0x2f,0x57,0x89,0xb2,0x02,0xbf,0x1c,0xf8,0x1f,0x2f,0x25,0x35,0xf8,0x14,0x27,0x82,0xfd,0xd6,
0xad,0x3d,0x17,0x23,0xcf,0x29,0x31,0xfb,0xef,0x80,0x7f,0x4a,0x84,0x6e,0xd4,0x95,0x61,0xf4,0x9b,0x2b, 0x9e,0xcb,0x91,0xe7,0x94,0x98,0xff,0xf7,0xc0,0x3f,0x15,0x42,0x37,0xea,0xca,0x32,0xfa,0xcd,0x97,0xec,
0xd8,0x99,0xb0,0xd8,0x59,0xd5,0xf1,0xc9,0xd9,0xaf,0x48,0xb4,0x9c,0x86,0x41,0x38,0x1f,0x3a,0xde,0xcd, 0x6c,0x58,0xfc,0xac,0xea,0xc4,0xe4,0xfc,0x57,0x2c,0x5b,0x4e,0xc3,0x20,0x9c,0x0f,0x9d,0xe8,0x66,0x79,
0x72,0xe0,0x28,0x39,0x37,0x5c,0x52,0xa7,0x01,0xbf,0xa0,0x23,0x8e,0x30,0xe5,0x1c,0x0d,0x9c,0x63,0x44, 0x70,0x94,0x9c,0x1b,0x21,0xa9,0xd7,0x80,0x5f,0xb0,0x11,0x47,0x9a,0x72,0x8e,0x06,0xce,0x31,0x22,0xc9,
0x12,0xdb,0x4a,0x43,0x12,0xa0,0x11,0xa5,0xa1,0x35,0xa6,0x71,0xa6,0xe1,0x48,0x98,0x32,0x19,0x82,0x6d, 0x6d,0x65,0x20,0x49,0xd0,0x88,0xd2,0xb0,0x1a,0xb3,0x24,0x37,0x70,0x14,0x4c,0x9b,0x0c,0xc1,0xb6,0xe3,
0xc7,0xac,0xa9,0x62,0x0d,0x40,0x8e,0x66,0x0d,0x6b,0x9d,0x38,0x26,0x88,0x14,0x6d,0xac,0xcd,0x60,0x3b, 0xd6,0xd4,0xb1,0x06,0xa0,0x40,0x73,0x86,0xb5,0x4e,0x1c,0x13,0x44,0x8a,0x37,0xce,0x66,0xb0,0x9d,0xd9,
0xbd,0x39,0x7a,0xb5,0x24,0xa8,0x77,0xaa,0xe9,0x81,0xa1,0xfc,0x72,0xca,0x34,0x05,0x5f,0x75,0x36,0x5e, 0x1c,0xbd,0x5a,0x12,0xd4,0x3b,0xd5,0xf4,0xc0,0x50,0x7d,0x79,0x34,0xcb,0xc0,0x57,0xbd,0x4d,0xd0,0xe9,
0xa7,0x72,0xd9,0xac,0x63,0xfb,0x3a,0xb6,0x7f,0x03,0x7b,0xa7,0x63,0xef,0x56,0xb1,0x83,0xc0,0x5e,0x1b, 0x5c,0x36,0xeb,0xd8,0xa1,0x89,0x1d,0xde,0xc0,0xde,0x9b,0xd8,0xfb,0x55,0xec,0xed,0xd6,0x5d,0x1b,0xdd,
0xdd,0x6a,0xbc,0x82,0xc0,0x0d,0xe0,0xdf,0x2a,0xc3,0x9d,0x2e,0xec,0x6e,0x5d,0xd8,0x30,0x5c,0x9b,0x3e, 0x19,0xbc,0xb6,0x5b,0x7f,0x0b,0xff,0x56,0x19,0xee,0x4d,0x61,0xf7,0xeb,0xc2,0x46,0xd1,0xda,0xf4,0xd1,
0x7c,0xd4,0x78,0x85,0xa1,0x1b,0xc2,0xbf,0x55,0x86,0x8f,0xfa,0xea,0x1f,0xd7,0x57,0xff,0xa4,0x0b,0xfb, 0xbd,0xc1,0x2b,0x8a,0xfc,0x08,0xfe,0xad,0x32,0xbc,0x37,0x57,0x7f,0xbf,0xbe,0xfa,0x07,0x53,0xd8,0x87,
0xb4,0x2e,0xec,0x5e,0xc7,0xde,0x2f,0x60,0x83,0x71,0xb9,0xc3,0xb0,0x58,0x0b,0x96,0xd5,0x3c,0xc4,0x4c, 0x75,0x61,0x1f,0x4d,0xec,0xc7,0x05,0x6c,0x30,0xae,0x70,0x18,0x1e,0x6b,0xc1,0xb2,0x86,0x87,0xd8,0x29,
0xe1,0x2b,0x14,0xbe,0x46,0xb1,0x64,0x6b,0x30,0xf2,0x48,0xb1,0xd3,0x28,0x16,0x56,0xbc,0x60,0x68,0xb0, 0x42,0x8d,0x22,0x34,0x28,0x96,0x6c,0x0d,0x46,0x1e,0x29,0xf6,0x06,0xc5,0xc2,0x8a,0x17,0x0c,0x0d,0x16,
0xf0,0x95,0xd1,0x60,0x5e,0x85,0xdb,0xaa,0xc5,0xb7,0x8a,0xd8,0x5b,0x4d,0xec,0xed,0x82,0xd8,0x3b,0x85, 0xbe,0x32,0x1a,0xcc,0xab,0x71,0x5b,0xb5,0xf8,0x4e,0x13,0x7b,0x67,0x88,0xbd,0x5b,0x10,0x7b,0xaf,0x51,
0x62,0xa7,0x51,0x2c,0xf9,0x49,0xa8,0x50,0x84,0x1a,0x45,0xb8,0x44,0x61,0x76,0x29,0xf0,0xa5,0x91,0x91, 0xec,0x0d,0x8a,0x25,0x3f,0x89,0x34,0x8a,0xc8,0xa0,0x88,0x96,0x28,0xec,0x2e,0x05,0xbe,0x34,0x32,0x52,
0x74,0x24,0x95,0xdb,0x9a,0x6f,0x3d,0x2a,0xda,0x7e,0xd4,0xb4,0xbd,0xe4,0x5f,0x4f,0x8a,0xd8,0x4f,0x9a, 0x8e,0xa4,0x73,0x5b,0xf3,0xad,0x7b,0x4d,0xdb,0xf7,0x86,0xb6,0x97,0xfc,0xeb,0x41,0x13,0xfb,0xc1,0x10,
0xd8,0x4b,0x3e,0xb6,0x57,0x28,0xf6,0x1a,0xc5,0xd4,0xcf,0x86,0x6f,0x25,0xc0,0x42,0x08,0x4b,0xa7,0xf1, 0x7b,0xc9,0xc7,0x1e,0x35,0x8a,0x47,0x83,0x62,0xea,0x67,0xc3,0xb7,0x16,0x60,0x21,0x84,0x65,0xd3,0xf8,
0x75,0x86,0xae,0xc5,0xda,0x91,0x62,0x08,0xb5,0x33,0x7c,0x2d,0xec,0x72,0x7c,0x19,0x75,0xff,0x74,0xc6, 0x3a,0x43,0x37,0x62,0xed,0x48,0x31,0x84,0xda,0x19,0xbe,0x11,0x76,0x05,0xbe,0x8a,0xba,0x7f,0x3a,0xe3,
0x09,0x41,0xd6,0x2f,0xec,0x70,0x1f,0xec,0x0d,0x87,0xd6,0xe7,0x8e,0x1f,0x4c,0x93,0xb3,0x08,0x40,0x5a, 0x94,0x20,0xe7,0x17,0x7e,0xb8,0x0f,0xf6,0x86,0x43,0xeb,0x73,0x27,0x0e,0xa6,0xc9,0x59,0x04,0x20,0x23,
0xc4,0x74,0x94,0x3c,0x37,0x46,0x79,0xfc,0x0b,0x8b,0x95,0xd6,0xaf,0xfc,0xd8,0xfb,0xac,0x07,0x61,0xfd, 0x62,0x7a,0x5a,0x9e,0x9b,0xa0,0x22,0xf9,0x85,0xc7,0x4a,0xe7,0x57,0x71,0xec,0x7d,0x36,0x83,0xb0,0x79,
0xb8,0x1f,0x72,0xe8,0xf1,0xa4,0x64,0x9c,0xfa,0x1e,0x29,0x75,0x9a,0xf1,0xc2,0xa4,0x97,0xd9,0xa8,0x8d, 0xdc,0x0f,0x39,0xf4,0x78,0x52,0x72,0x4e,0x7d,0x8f,0xb4,0x3a,0xcd,0x7a,0x61,0xd2,0xab,0x6c,0xd4,0x45,
0xf4,0xba,0x4e,0x56,0xe5,0x49,0x6e,0x97,0xb9,0xdd,0xe6,0x5d,0x4e,0x1a,0x48,0x3f,0xe8,0x5b,0x2e,0x6b, 0x66,0x5d,0xa7,0xaa,0xf2,0xb4,0x70,0x69,0xe1,0xb6,0x45,0x57,0x90,0x06,0xd2,0x0f,0xf6,0x5a,0xa8,0xda,
0x03,0x39,0x3d,0x2b,0x73,0xae,0xe9,0x84,0x8c,0xfa,0x40,0x64,0x01,0x1d,0xfc,0x2d,0xf9,0xdf,0x96,0xf1, 0x40,0x4d,0xcf,0xcb,0x9c,0x6b,0x3a,0xa1,0xa2,0x3e,0x10,0x39,0x40,0x07,0x7f,0xa9,0xf8,0xdb,0x72,0x1e,
0xb0,0x38,0x27,0x06,0x29,0x39,0xa4,0xe5,0x90,0x96,0x43,0x5a,0x06,0xe9,0xc6,0x04,0x47,0x58,0x98,0x67, 0x8e,0xe0,0xc4,0x21,0x54,0x40,0x5a,0x01,0x69,0x05,0xa4,0xe5,0x90,0x6e,0x4c,0x70,0xa4,0x85,0x45,0x46,
0x04,0xa2,0xe0,0x62,0xb1,0x42,0xfc,0xe0,0xf9,0x61,0xa9,0x89,0x03,0x0b,0x82,0x44,0x30,0xb7,0x48,0xd1, 0x20,0x0b,0x2e,0x1e,0x2b,0xe4,0x0f,0x91,0x1f,0x52,0x43,0x1c,0x58,0x10,0x24,0x82,0x85,0x43,0xca,0x86,
0x90,0x04,0xf7,0xba,0xac,0x31,0xa9,0xa1,0x7c,0x1d,0xc6,0x26,0x37,0x6c,0x49,0x62,0x27,0xd4,0xce,0xc9, 0xa4,0xb8,0x37,0x65,0x4d,0x48,0x0d,0xe5,0xeb,0x30,0x36,0xb9,0x61,0x4b,0x53,0x37,0x65,0x6e,0x41,0x26,
0x44,0x97,0x1b,0x35,0x73,0x12,0xb9,0xd0,0xac,0x54,0x9a,0x50,0x4c,0xef,0xf9,0x60,0xd9,0x76,0x4a,0x4e, 0xba,0xdc,0xe8,0x99,0x93,0xcc,0x85,0x66,0xa5,0xd2,0x84,0x62,0x7a,0xcf,0x07,0xcb,0x76,0x33,0x72,0x6a,
0x6d,0x8d,0x6d,0x76,0x0d,0xc5,0x74,0x58,0xd9,0x50,0x29,0xda,0x94,0xd5,0xd0,0x4c,0x9f,0x3a,0x03,0x5f, 0x6b,0xec,0xf2,0x6b,0x28,0xae,0xc3,0xca,0x85,0x4a,0xd1,0x65,0xbc,0x86,0xe6,0xfa,0x34,0x19,0x84,0x92,
0x30,0xe0,0xa3,0x43,0xae,0x36,0x5c,0x90,0x69,0x09,0x0a,0x4d,0x6c,0x9a,0x75,0xd7,0xeb,0x55,0x91,0xea, 0x81,0x18,0x1d,0x72,0xb5,0xe1,0x82,0xcc,0x48,0x50,0x58,0xea,0xb2,0xbc,0xbb,0x5e,0xaf,0xca,0x54,0x4f,
0xa9,0x25,0x18,0xde,0xb0,0xcf,0x58,0xb5,0x8a,0x52,0x5a,0xd6,0xad,0xca,0x1d,0x1a,0x33,0x15,0x70,0x8b, 0x2f,0xc1,0xf0,0x86,0x7f,0xc6,0xaa,0x55,0x96,0xd2,0xaa,0x6e,0xd5,0xee,0xd0,0xb8,0xa9,0x80,0x5b,0x9c,
0x52,0x52,0x0f,0x17,0x92,0xc0,0x59,0x7d,0xec,0x26,0x56,0x05,0xe4,0xf1,0xf2,0x92,0xe1,0x2a,0x57,0x99, 0x91,0x7a,0xb8,0x90,0x04,0xce,0xfa,0x63,0x37,0xb1,0x2a,0x20,0x8f,0x97,0x97,0x1c,0x57,0xbb,0xca,0x34,
0x7a,0x12,0xef,0xf5,0x47,0x1b,0xf2,0x8b,0x12,0x92,0xa7,0x49,0x92,0xda,0x57,0x9d,0xea,0x38,0x7d,0xb6, 0x93,0xf8,0xa0,0x3f,0xba,0x90,0x5f,0x50,0x48,0x9e,0x26,0x49,0x6a,0x5f,0x75,0xba,0xe3,0xf4,0xf9,0xc6,
0xb1,0x33,0xdf,0xce,0x02,0x3b,0xdb,0xda,0xd9,0xce,0xce,0xc2,0xee,0xc6,0xe5,0xad,0x23,0xae,0x0b,0x27, 0xcd,0x43,0x37,0xdf,0xba,0xf9,0xce,0xcd,0xf7,0x6e,0x1e,0x75,0x37,0x2e,0x6f,0x3d,0x79,0x5d,0x38,0xd1,
0xda,0x53,0x40,0x03,0x5f,0xc5,0x9d,0xb6,0x22,0x5f,0xd6,0x6f,0x7c,0xfd,0x3e,0xf3,0x15,0x9c,0xc0,0x88, 0x9e,0x06,0x1a,0xf8,0x6a,0xee,0xb4,0x93,0xf9,0xb2,0x79,0xe3,0x1b,0xf6,0x79,0xa8,0xe1,0x6c,0xad,0x38,
0xb3,0xeb,0xb3,0x40,0x41,0xf2,0xe5,0x05,0xa6,0x86,0x14,0xf4,0xd9,0x56,0xc3,0xf1,0x0d,0x97,0x9c,0x0e, 0xfb,0x3e,0xdf,0x6a,0x48,0xa1,0xba,0xc0,0x34,0x90,0xb6,0x7d,0xbe,0x33,0x70,0x42,0xcb,0x25,0xa7,0x07,
0x14,0x07,0x06,0x52,0xe0,0xbf,0xeb,0xd4,0xc4,0xde,0x74,0x41,0x0a,0xb4,0xbb,0x39,0x2d,0x90,0x86,0xdd, 0xc5,0x81,0x85,0x14,0xf8,0xef,0x3b,0x3d,0xb1,0xb7,0x5d,0x90,0x02,0xed,0x7e,0x4e,0x0b,0xa4,0x51,0x37,
0xac,0x26,0x98,0x90,0x7a,0x13,0xa2,0x6d,0x4f,0xce,0xa7,0x4e,0x4f,0xca,0x20,0x0d,0x67,0xfd,0x9d,0x94, 0xab,0x09,0x26,0xa4,0xc1,0x84,0x68,0xd7,0x93,0xf3,0xa9,0x33,0x93,0x32,0x48,0xc3,0x79,0x7f,0x27,0x23,
0xbc,0x8a,0x6b,0xfe,0x4e,0x34,0xf6,0x40,0xb5,0xd9,0x81,0x25,0xe8,0x10,0xd5,0xa2,0x07,0xeb,0xe1,0xda, 0x2f,0xf2,0x9a,0xbf,0x93,0x8d,0x3d,0x50,0x6d,0x7e,0xe0,0x09,0x3a,0x44,0xb5,0xf8,0x93,0xf3,0xe9,0xda,
0x15,0xe1,0x3e,0xda,0xbb,0x69,0x5e,0x22,0xca,0x5d,0xa3,0xe3,0x3f,0x85,0x43,0x49,0x30,0x77,0x03,0x09, 0x15,0x11,0x3e,0xda,0xfb,0x59,0x41,0x11,0x13,0xae,0xd1,0x89,0x9f,0xd2,0xa1,0x14,0x58,0xb8,0x81,0x82,
0xe7,0xbf,0xfb,0xef,0x2f,0x4e,0x0c,0x8f,0x3f,0xc7,0x4a,0x82,0x07,0x1f,0xfe,0x32,0x80,0xe1,0xe2,0x0a, 0x8b,0xdf,0xfd,0xf7,0x67,0x2f,0x81,0xc7,0x9f,0x63,0x25,0x21,0x82,0x8f,0x78,0x19,0xc0,0x72,0x71,0x05,
0x0c,0xaf,0x5c,0x52,0xaa,0xef,0x07,0xfc,0x0b,0xd7,0x09,0x2a,0xd6,0xdf,0x02,0xf0,0xaa,0xb1,0xac,0x94, 0x86,0xd7,0x2e,0x29,0xf5,0xf7,0x03,0xfe,0x85,0xeb,0x14,0x95,0xeb,0x6f,0x01,0x04,0xd5,0x58,0x56,0x2a,
0x2e,0xc2,0xe3,0x86,0x0c,0xcd,0x4d,0x5c,0x63,0x5c,0x58,0xa8,0x48,0xd4,0x28,0xfd,0x18,0x3e,0x55,0xaf, 0x17,0x11,0x71,0x43,0x85,0xe6,0x26,0xa9,0x31,0x2e,0x1d,0x54,0xa6,0x7a,0x94,0xbe,0x8f,0x1e,0xaa,0x97,
0x9f,0x3b,0x2e,0xd1,0x40,0xcc,0x9c,0x89,0x53,0x8a,0x32,0x69,0xdc,0xfe,0xa3,0x70,0xfd,0xfd,0x58,0xc5, 0xcf,0x9d,0x90,0x68,0x20,0xe6,0xce,0x24,0x28,0x65,0x99,0x34,0x6e,0xff,0x51,0xb8,0xfe,0xc3,0x58,0xc5,
0xcc,0x17,0xe2,0x7b,0xec,0xa3,0xfa,0xa6,0x56,0xcf,0x6c,0x26,0x9d,0x11,0x71,0xf2,0x57,0xaf,0xd6,0x7d, 0xcc,0x17,0x12,0x06,0xfc,0xa3,0xfb,0xa6,0x51,0xcf,0x6c,0x26,0x9d,0x11,0x79,0xf2,0x57,0x2f,0xce,0x87,
0x1a,0xa7,0x61,0x7c,0xbd,0xb5,0x17,0x7b,0x7b,0xc3,0x06,0x40,0x35,0xef,0x5a,0x87,0x22,0x96,0x02,0xd7, 0x2c,0xc9,0xa2,0xe4,0x7a,0x6b,0x2f,0xf7,0xf6,0x86,0x0f,0x80,0x6a,0xde,0xb4,0x0e,0x4d,0x2c,0x0d,0x6e,
0x0e,0x1b,0x35,0x5f,0x17,0x1b,0x97,0x41,0xfa,0xde,0xcd,0x30,0x82,0x59,0xbb,0x59,0x99,0x35,0x8c,0x58, 0x1c,0x36,0x7a,0xbe,0x2e,0x37,0x2e,0x87,0xf4,0xbd,0x9f,0x63,0x04,0xb3,0x76,0xb3,0x32,0x6b,0x18,0x71,
0xcc,0x8b,0x46,0xab,0xeb,0x3c,0x78,0xf4,0x1c,0x10,0xdd,0x0b,0x49,0x21,0x18,0x23,0x0a,0x85,0xfc,0x95, 0xb8,0x17,0x8d,0x56,0x37,0x79,0x6c,0x96,0x34,0x3d,0xa6,0x05,0xd1,0x3d,0x97,0x70,0x60,0xe6,0x5f,0x48,
0x1d,0x3a,0xc2,0x7a,0x5a,0x8a,0x0f,0xc3,0x3b,0x13,0x62,0xcf,0x1a,0x68,0x2c,0x97,0x14,0x09,0x89,0x11, 0x06,0x01,0x1b,0x31,0x28,0xf6,0x35,0xdf,0xd3,0x74,0x26,0x4d,0xf0,0x96,0x55,0xdb,0x78,0x5e,0x97,0x81,
0x2d,0x6b,0x73,0x91,0x29,0xdd,0x98,0xa9,0x71,0x70,0x72,0xa1,0x52,0xb5,0x01,0xb5,0xbb,0x1e,0x27,0x52, 0x8e,0xa0,0xc7,0x96,0xe1,0xc3,0xf0,0xae,0x86,0x8c,0x15,0xbd,0x85,0xc8,0xf1,0x49,0x99,0x92,0x04,0x31,
0x44,0x59,0x7e,0xae,0xce,0xf7,0x9d,0x75,0x18,0x1c,0x01,0x7e,0x06,0x5d,0x16,0x10,0xfe,0xd9,0x6d,0xf5, 0x5a,0xdb,0xab,0x5b,0xb5,0x7f,0xb8,0xfd,0x86,0xdd,0x25,0x6d,0xa9,0x77,0xbe,0xf6,0xd7,0x73,0x4c,0xe9,
0xdc,0xc6,0xc1,0x3e,0xfc,0x08,0x2f,0x58,0x87,0xca,0x6e,0x6a,0xe0,0x53,0x8d,0xdf,0xfe,0x0b,0xd1,0xc0, 0x46,0xd5,0xbd,0xab,0xf3,0x7d,0xe7,0xad,0x0d,0x4f,0x82,0x9f,0xc0,0x88,0x25,0x9c,0x3b,0xfc,0x9a,0x7c,
0x9b,0x4c,0xb2,0xa5,0xfb,0xe0,0x23,0xcc,0x70,0x5d,0x97,0xb5,0x89,0x4f,0xec,0x4d,0x62,0xea,0x26,0xac, 0xee,0x5c,0xdb,0xc7,0xe8,0x3d,0xbc,0x60,0x1d,0x3a,0xbb,0xa9,0x67,0x9d,0x6a,0xfc,0xfa,0x5f,0x88,0x06,
0x06,0xbb,0xb3,0x70,0xeb,0xcb,0x1d,0xd1,0x90,0x1c,0x72,0x88,0xe9,0x5e,0x1c,0xf1,0x02,0x89,0xc7,0x56, 0x6e,0x6c,0x93,0x2d,0x7b,0xdc,0xbe,0x87,0x19,0xae,0x6b,0x5a,0xdb,0xf8,0x24,0xc1,0x24,0x98,0x6f,0xa2,
0x39,0x6f,0x2f,0xde,0xfb,0x4f,0xec,0xa3,0x92,0x6f,0xab,0xeb,0x05,0x82,0xdc,0xc9,0x53,0x55,0xc1,0x7c, 0x6a,0x70,0x38,0x1e,0xe7,0x43,0xb5,0x15,0x1b,0x52,0x40,0xf2,0x32,0x0d,0x02,0x23,0xde,0x56,0xe1,0xf1,
0x0d,0x78,0x95,0xca,0x58,0xe9,0x31,0x03,0xf9,0xfc,0xc5,0x91,0xc9,0x76,0xec,0x5d,0x88,0x69,0x8d,0x1a, 0x55,0xce,0xfb,0x9a,0x1f,0xc2,0x07,0xfe,0xd1,0xc9,0x77,0xd5,0xf5,0xe6,0x42,0x85,0x90,0xa9,0xaa,0x60,
0xf7,0x14,0x84,0xe0,0x8a,0x60,0xc9,0xec,0xc1,0xa0,0x1e,0xd9,0xf7,0x1c,0xa3,0xc2,0x1f,0xc8,0xb9,0x2a, 0xbe,0x06,0xdc,0x4a,0x67,0xac,0x35,0xb7,0x81,0x7c,0xfe,0xc6,0xca,0x24,0x0e,0xf4,0x3e,0x04,0xd3,0x55,
0x6b,0x8a,0xa6,0xd7,0x1f,0x42,0x64,0x95,0xdb,0x47,0xee,0xc2,0x65,0xb3,0x66,0xf6,0xea,0x44,0x51,0xb2, 0xa7,0x17,0x08,0x8e,0x4a,0x5b,0x2c,0xea,0x51,0x0d,0xd7,0x31,0x1c,0xfd,0x81,0x9c,0x2b,0x5a,0x33,0x34,
0x05,0xe6,0xe5,0x05,0x27,0x87,0x75,0xfd,0x86,0xec,0x33,0xe9,0xde,0x68,0x5b,0x43,0xe8,0x23,0x23,0x05, 0xbd,0x77,0x91,0x22,0xeb,0xdc,0xde,0x73,0x09,0xff,0xb6,0xfd,0x6c,0xc8,0xaa,0x1d,0x30,0xaa,0xc7,0x34,
0x5d,0x6c,0x3f,0x31,0x9d,0x2a,0xb3,0x18,0x33,0x21,0x17,0x82,0x03,0x6f,0x9e,0x4c,0x34,0x39,0x37,0x46, 0x7b,0xe3,0xa3,0xa4,0x5c,0x3d,0x05,0xbd,0xe0,0xf4,0xb0,0x6e,0x9d,0x88,0x7f,0x26,0x4d,0x27,0x63,0x63,
0xef,0x36,0xed,0xb1,0xac,0x58,0x60,0x68,0xf4,0xda,0x98,0xf3,0x11,0xda,0x69,0x3a,0x13,0x1d,0xf8,0x01, 0x49,0x6d,0xe6,0xa4,0x64,0x8b,0x5d,0x33,0x6e,0x11,0x6d,0x16,0x6b,0x02,0xe7,0x43,0x4c,0x13,0x3d,0x9f,
0xd8,0xbe,0x9b,0x59,0xb3,0xa1,0xb8,0xd2,0x58,0x05,0x4a,0x7e,0x30,0xb6,0x19,0xe7,0x6d,0x24,0x41,0x6a, 0x89,0x1d,0xe6,0xa6,0xec,0xfd,0xa6,0x3d,0xd2,0x8a,0xc7,0x95,0xc6,0x2c,0xe9,0x05,0x1f,0xa9,0x84,0xa6,
0x49,0xce,0xd3,0xee,0x94,0x24,0xdd,0x0e,0x53,0x58,0xee,0x0b,0xca,0x5b,0x7c,0x23,0xae,0x89,0x7c,0x45, 0xb3,0xd1,0x81,0x17,0x81,0xe7,0x74,0x33,0x5f,0x68,0x18,0xae,0x0c,0x56,0x5b,0x2d,0xad,0x19,0xbb,0xa3,
0xb5,0xbe,0xe0,0xde,0x41,0x92,0x73,0xfc,0x49,0x60,0x51,0x93,0xa6,0xbb,0xd2,0x2e,0x91,0x21,0x4d,0xe4, 0xf3,0xee,0x97,0x24,0x75,0x14,0xe7,0x69,0x53,0x4d,0x91,0xee,0x86,0x29,0x1c,0xff,0x19,0x15,0x2d,0xbe,
0x6e,0x93,0xa6,0xba,0x2f,0x80,0xca,0x2d,0x88,0x74,0x42,0xe5,0x8d,0x1e,0x31,0x53,0x14,0x0d,0x53,0x89, 0x11,0x16,0x65,0x9a,0xa5,0xfb,0x8e,0xe4,0xde,0x41,0x6e,0x76,0xfc,0x49,0x60,0x51,0x93,0xbb,0x02,0xad,
0x67,0x87,0x66,0xed,0xf9,0xb8,0x38,0xbf,0x59,0x1e,0x5f,0x09,0xb1,0xbe,0x39,0xc4,0x6a,0x37,0x32,0xe2, 0xcb,0xa3,0x02,0xa2,0x4c,0x39,0x27,0x77,0x01,0xa1,0x04,0x6a,0x97,0x37,0xca,0x85,0xb5,0x17,0x91,0xe4,
0xf8,0xd2,0xdf,0x1e,0x53,0x04,0x3a,0x97,0xbf,0x01,0x69,0x71,0xc2,0x52,0x98,0xff,0xe5,0x24,0x17,0x54, 0x4c,0x71,0x3c,0x4c,0x25,0x9f,0x3d,0x96,0xb7,0xe7,0xe3,0xe2,0xfc,0x76,0x79,0x42,0x2d,0x40,0x87,0xf6,
0x17,0xcc,0xf5,0x54,0xd4,0xc0,0xf3,0x53,0x08,0x2c,0xc6,0xe3,0x74,0xbc,0x69,0xd8,0x19,0x33,0xcb,0xfe, 0x00,0x6d,0x5c,0x24,0xc9,0x53,0xd7,0x7c,0xe9,0x4d,0x13,0xe8,0x4c,0x7f,0x03,0xd2,0xf2,0x84,0x95,0x30,
0x3f,0xde,0x3d,0x2e,0x64,0x01,0x29,0x00,0x00}; 0xff,0xcb,0x49,0x2e,0xa8,0x2e,0xb9,0xeb,0xe9,0xa8,0xdb,0x20,0xcc,0x20,0x2c,0x59,0xb3,0x80,0xf1,0x82,
0x64,0x6f,0x4d,0x88,0xfb,0xff,0x00,0xdc,0xc0,0x0e,0xc5,0xb8,0x29,0x00,0x00};
#endif #endif

View File

@ -4,110 +4,122 @@
#include <pgmspace.h> #include <pgmspace.h>
const uint8_t EmbeddedIndex[] PROGMEM = { const uint8_t EmbeddedIndex[] PROGMEM = {
0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xcd,0x59,0x69,0x7b,0xe2,0x38,0x12,0xfe,0x2b,0x8e, 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xcd,0x5a,0x69,0x5b,0xe3,0x38,0x12,0xfe,0x2b,0xee,
0x77,0xf6,0x21,0xd9,0x34,0x67,0x48,0xba,0x93,0x0d,0xd9,0xe1,0x0c,0x10,0x20,0xdc,0x01,0xbe,0xc9,0xb6, 0xec,0xee,0x13,0xd8,0x6e,0x72,0x11,0xe8,0x86,0x25,0xec,0x38,0x17,0xb9,0xc9,0x0d,0xc9,0x37,0xd9,0x56,
0xb0,0x15,0xe4,0x23,0x96,0x0c,0xa1,0x7b,0xe6,0xbf,0x8f,0x7c,0x0b,0x30,0x09,0xbd,0xfd,0xcc,0xb3,0x9b, 0x6c,0x11,0x5f,0x58,0x72,0x42,0xba,0x67,0xfe,0xfb,0xca,0xb7,0xe2,0xd8,0x49,0x7a,0xfa,0x99,0x67,0x87,
0x0f,0x31,0x52,0x1d,0x7a,0xab,0x54,0xa5,0x2a,0xd9,0xf7,0x67,0xb5,0xe7,0xea,0x78,0xde,0xaf,0x0b,0x1a, 0x0f,0x18,0xa9,0x4a,0x55,0x6f,0x95,0xab,0x4a,0x25,0x99,0x87,0x4f,0xf5,0xe7,0xda,0x74,0x31,0x6c,0x70,
0xd5,0xf1,0xc3,0x7d,0xf0,0x1f,0x02,0xe5,0xe1,0x5e,0x87,0x14,0x08,0xb2,0x06,0x6c,0x02,0x69,0x49,0x9c, 0x0a,0xd1,0xd4,0xc7,0x07,0xff,0x37,0x04,0xd2,0xe3,0x83,0x06,0x09,0xe0,0x44,0x05,0x58,0x18,0x92,0x4a,
0x8c,0x1b,0xe9,0x6f,0xe2,0xc3,0x3d,0x45,0x14,0xc3,0x87,0xfb,0x6c,0xf0,0xf4,0x98,0x0c,0xa0,0xc3,0x92, 0x66,0x36,0x6d,0x5e,0x7d,0xcb,0x3c,0x3e,0x10,0x44,0x54,0xf8,0xf8,0x90,0xf7,0x9f,0x2e,0x93,0x0e,0x34,
0x48,0x35,0xa8,0xc3,0xb4,0x6c,0x62,0xd3,0x16,0x05,0xd9,0x34,0x28,0x34,0x98,0xdc,0x3f,0x72,0xde,0x9f, 0x58,0xc9,0x10,0x05,0x6a,0xf0,0x4a,0x34,0x54,0xc3,0xca,0x70,0xa2,0xa1,0x13,0xa8,0xd3,0x75,0xff,0x28,
0xb8,0xc3,0xba,0x46,0x70,0x63,0x99,0x36,0xe5,0xf8,0x36,0x48,0xa1,0x5a,0x49,0x81,0x6b,0x24,0xc3,0xb4, 0xb8,0x3f,0x99,0x3d,0xd6,0x0d,0x82,0x5b,0xd3,0xb0,0x08,0xc3,0xb7,0x45,0x12,0x51,0x2a,0x12,0xdc,0x20,
0x37,0xf8,0x82,0x0c,0x44,0x11,0xc0,0x69,0x22,0x03,0x0c,0x4b,0x79,0xa6,0x02,0x23,0x63,0x25,0xd8,0x10, 0x11,0x5e,0xb9,0x83,0x2f,0x48,0x47,0x04,0x01,0xf5,0x0a,0x8b,0x40,0x85,0x95,0x22,0x15,0xa1,0x22,0x7d,
0x97,0x44,0x42,0xb7,0x18,0x12,0x0d,0x42,0xa6,0x43,0xb3,0xe1,0xb2,0x24,0x4a,0x8e,0xa1,0x60,0x98,0x91, 0xcd,0x59,0x50,0xad,0x64,0x30,0xd9,0xa9,0x10,0x2b,0x10,0x52,0x19,0x8a,0x05,0x57,0x95,0x8c,0x60,0xeb,
0x09,0x61,0x8c,0x44,0xb6,0x91,0x45,0x05,0x62,0xcb,0x11,0xe1,0xd5,0x9d,0xcf,0xfa,0x04,0xf6,0xc3,0xb7, 0x92,0x0a,0x73,0x22,0xc6,0x94,0x11,0x8b,0x16,0x32,0x09,0x87,0x2d,0x31,0x24,0xbc,0x39,0xf3,0x79,0x8f,
0x51,0x32,0x95,0xed,0xc3,0xbd,0x82,0xd6,0x02,0x52,0x4a,0x22,0xb0,0x2c,0xd1,0x1f,0xad,0xd3,0x32,0x36, 0x40,0xff,0xf0,0x6c,0x14,0x0c,0x69,0xf7,0xf8,0x20,0xa1,0x0d,0x87,0xa4,0x4a,0x06,0x98,0x66,0xc6,0x1b,
0xc1,0x2a,0x26,0xb9,0x38,0x01,0x32,0xa0,0x1d,0x30,0xc8,0x18,0x10,0x52,0x12,0x5d,0x2d,0xde,0x1c,0xd2, 0x6d,0xae,0x44,0xd5,0x00,0xeb,0x88,0xe4,0xe0,0x04,0x48,0x87,0x96,0xcf,0x20,0xaa,0x00,0xe3,0x4a,0xc6,
0x55,0x7f,0x35,0x05,0x50,0x70,0x87,0x74,0xa0,0xc2,0xac,0x65,0xa8,0xff,0x96,0x00,0x81,0x37,0xc5,0x2f, 0x91,0xe2,0xce,0x21,0x4d,0xf6,0xb4,0x49,0x80,0x80,0x7b,0xa4,0x01,0x19,0xe6,0x4d,0x5d,0xfe,0x8f,0x00,
0x68,0x5a,0x79,0x1e,0x6e,0x72,0x4f,0x8f,0xaa,0x59,0x66,0x7f,0xbd,0xd1,0x44,0xab,0x4f,0x54,0xf6,0xab, 0x30,0xbc,0x2d,0x7f,0x41,0xf3,0xea,0xf3,0x78,0x5b,0xe8,0x3e,0xc9,0x06,0x4f,0x7f,0x06,0x93,0x99,0xd2,
0xe6,0x0e,0xcb,0x9b,0x6a,0x79,0xce,0x1e,0x95,0x59,0x79,0xad,0x37,0xdd,0x89,0xc7,0xd9,0xb0,0xf1,0xd2, 0x98,0xc9,0xf4,0xaf,0xba,0x33,0xe4,0xb7,0x35,0x7e,0x41,0x1f,0xd5,0x57,0x7e,0xa3,0xb5,0x9c,0x89,0xa7,
0x1c,0x8e,0xa5,0xc2,0x22,0xa7,0x14,0x1a,0xdb,0xc5,0xa0,0x52,0x59,0x3c,0xde,0xa2,0xc5,0xa8,0xd2,0x96, 0xd7,0x71,0xf3,0xa5,0x35,0x9e,0x0a,0xa5,0x65,0x41,0x2a,0x35,0x77,0xcb,0x51,0xb5,0xba,0x7c,0xba,0x43,
0x5e,0x1a,0xc6,0x62,0xda,0xc6,0xf3,0x97,0xe1,0xb5,0x2c,0x63,0xdc,0x77,0x05,0x66,0x95,0xf6,0xb0,0xde, 0xcb,0x49,0xb5,0x23,0xbc,0x34,0xf5,0xe5,0xbc,0xa3,0x2e,0x5e,0xc6,0x37,0xa2,0xa8,0xaa,0x43,0x67,0xc1,
0x98,0xc0,0x9e,0x4d,0x5e,0x94,0x7a,0x4f,0x7d,0x2d,0x0f,0x3a,0xf2,0xbc,0x22,0x97,0xfb,0x72,0xb9,0xaa, 0x6b,0xb5,0x33,0x6e,0x34,0x67,0x70,0x60,0xe1,0x17,0xa9,0x31,0x90,0xdf,0xf8,0x51,0x4f,0x5c,0x54,0x45,
0x0c,0x7a,0xc5,0x72,0xaf,0xd0,0xad,0x16,0xd5,0x21,0x99,0xb7,0x6f,0xeb,0x3d,0xa5,0xdc,0x9f,0x97,0x6b, 0x7e,0x28,0xf2,0x35,0x69,0x34,0x28,0xf3,0x83,0x52,0xbf,0x56,0x96,0xc7,0x78,0xd1,0xb9,0x6b,0x0c,0x24,
0xa0,0x5c,0x83,0x96,0x32,0xd1,0xba,0xf9,0xb7,0xc6,0xab,0x63,0xab,0xd6,0xed,0x48,0xee,0x36,0x55,0xe5, 0x7e,0xb8,0xe0,0xeb,0x80,0xaf,0x43,0x53,0x9a,0x29,0xfd,0xe2,0x7b,0xf3,0xcd,0xb6,0x64,0xf3,0x6e,0x22,
0x6b,0xfe,0x6a,0x7a,0xb5,0xa4,0x13,0xeb,0x1a,0x36,0xd5,0x6e,0x23,0x6f,0xdb,0x8f,0x75,0xe0,0xdc,0x4c, 0xf6,0x5b,0xb2,0xf4,0xb5,0x78,0x3d,0xbf,0x5e,0x91,0x99,0x79,0x03,0x5b,0x72,0xbf,0x59,0xb4,0xac,0xa7,
0x9b,0xb5,0x42,0xb3,0x2b,0x35,0xaf,0xdf,0xda,0xcf,0x9d,0xa6,0x0d,0x2e,0x97,0xab,0xef,0x12,0x99,0x0f, 0x06,0xb0,0x6f,0xe7,0xad,0x7a,0xa9,0xd5,0x17,0x5a,0x37,0xef,0x9d,0xe7,0x5e,0xcb,0x02,0x9f,0x57,0xeb,
0x89,0xd6,0xfd,0x66,0x75,0xc6,0xea,0xa4,0xa5,0x8e,0xd4,0xb5,0xd3,0xed,0x9a,0xf3,0xcd,0x25,0xea,0xce, 0xef,0x02,0x5e,0x8c,0xb1,0xd2,0xff,0x66,0xf6,0xa6,0xf2,0xac,0x2d,0x4f,0xe4,0x8d,0xdd,0xef,0x1b,0x8b,
0xc7,0xf6,0xcd,0x40,0xeb,0xcd,0xbb,0x76,0x0f,0xf5,0xb6,0x9b,0x56,0x07,0x6f,0xa7,0x4f,0x8a,0xbc,0xdd, 0xed,0x67,0xd4,0x5f,0x4c,0xad,0xdb,0x91,0x32,0x58,0xf4,0xad,0x01,0x1a,0xec,0xb6,0xed,0x9e,0xba,0x9b,
0xf6,0x89,0x2e,0x0f,0xc9,0x76,0x72,0x9d,0x5b,0xa9,0x4d,0x3a,0x18,0x38,0x85,0xb2,0xd2,0x6b,0x37,0xac, 0x77,0x25,0x71,0xb7,0x1b,0x62,0x4d,0x1c,0xe3,0xdd,0xec,0xa6,0xb0,0x96,0x5b,0x64,0x34,0xb2,0x4b,0xbc,
0xda,0xaa,0xfc,0x54,0x6c,0x65,0x3b,0xad,0x97,0xae,0x54,0x28,0x93,0x56,0x45,0x7e,0xcb,0xa1,0xe1,0x23, 0x34,0xe8,0x34,0xcd,0xfa,0x9a,0xef,0x96,0xdb,0xf9,0x5e,0xfb,0xa5,0x2f,0x94,0x78,0xdc,0xae,0x8a,0xef,
0x1c,0x3c,0xf6,0xc7,0x8b,0xe5,0xf4,0x66,0x50,0xcf,0x5d,0xaa,0xb5,0xc7,0x46,0xc1,0x36,0xc9,0x63,0x5d, 0x05,0x34,0x7e,0x82,0xa3,0xa7,0xe1,0x74,0xb9,0x9a,0xdf,0x8e,0x1a,0x85,0xcf,0x72,0xfd,0xa9,0x59,0xb2,
0xed,0x0e,0xde,0x5b,0x65,0xcd,0x58,0x94,0x51,0xbf,0xf7,0xad,0xe8,0x58,0xc3,0x65,0x2e,0xfb,0x8c,0x2d, 0x0c,0xfc,0xd4,0x90,0xfb,0xa3,0x8f,0x36,0xaf,0xe8,0x4b,0x1e,0x0d,0x07,0xdf,0xca,0xb6,0x39,0x5e,0x15,
0xd2,0xa9,0x56,0xac,0xab,0xed,0x5b,0x4e,0xd6,0x54,0x5a,0x9d,0x4c,0x16,0xf6,0x70,0x73,0x33,0xa8,0x3d, 0xf2,0xcf,0xaa,0x89,0x7b,0xb5,0xaa,0x79,0xbd,0x7b,0x2f,0x88,0x8a,0x4c,0x6a,0xb3,0xd9,0xd2,0x1a,0x6f,
0x5f,0xd5,0x5f,0x9a,0xa3,0xb7,0xc6,0x2d,0x05,0xf6,0x02,0x8c,0x9e,0xda,0x33,0xd8,0xae,0x29,0xd2,0x00, 0x6f,0x47,0xf5,0xe7,0xeb,0xc6,0x4b,0x6b,0xf2,0xde,0xbc,0x23,0xc0,0x5a,0x82,0x49,0xb7,0xf3,0x0a,0x3b,
0x93,0x7a,0xee,0xa9,0x76,0xd3,0xee,0x65,0x9f,0xcc,0x21,0x79,0xd4,0xde,0x67,0x4f,0x55,0x5c,0x7d,0x6a, 0x75,0x49,0x18,0xa9,0xb8,0x51,0xe8,0xd6,0x6f,0x3b,0x83,0x7c,0xd7,0x18,0xe3,0x27,0xe5,0xe3,0xb5,0x5b,
0xb6,0x5b,0xcb,0xd5,0x58,0xdb,0x74,0x5f,0xb4,0xf2,0x8d,0x52,0x19,0x99,0x78,0x88,0x5e,0x57,0xed,0x67, 0x53,0x6b,0xdd,0x56,0xa7,0xbd,0x5a,0x4f,0x95,0x6d,0xff,0x45,0xe1,0x6f,0xa5,0xea,0xc4,0x50,0xc7,0xe8,
0x25,0xbf,0x98,0xac,0x6f,0xb7,0x83,0xdb,0x67,0xeb,0x4d,0x6a,0x5a,0x08,0x4c,0xa6,0xa0,0x2e,0x2d,0xea, 0x6d,0xdd,0x79,0x96,0x8a,0xcb,0xd9,0xe6,0x6e,0x37,0xba,0x7b,0x36,0xdf,0x85,0x96,0x89,0xc0,0x6c,0x0e,
0x5f,0x69,0xab,0xf5,0x6a,0x56,0x9e,0x66,0x5b,0x62,0x92,0xbc,0x5c,0x9c,0x7e,0x83,0x52,0xa7,0xae,0x48, 0x1a,0xc2,0xb2,0xf1,0x95,0xb4,0xdb,0x6f,0x46,0xb5,0xfb,0xba,0xc3,0x06,0x2e,0x8a,0xe5,0xf9,0x37,0x28,
0xeb,0x82,0x24,0x77,0x49,0xfd,0xab,0xfa,0xea,0x54,0x94,0xf5,0x6c,0x38,0x6a,0x17,0x1b,0x97,0xd9,0xcd, 0xf4,0x1a,0x92,0xb0,0x29,0x09,0x62,0x1f,0x37,0xbe,0xca,0x6f,0x76,0x55,0xda,0xbc,0x8e,0x27,0x9d,0x72,
0x5b,0x6b,0x36,0xb3,0x5b,0x8f,0x1b,0x7d,0x76,0xf5,0x7d,0x03,0xe4,0x4e,0x4d,0x83,0xbd,0xe7,0xdb,0xfc, 0xf3,0x73,0x7e,0xfb,0xde,0x7e,0x7d,0xb5,0xda,0x4f,0x5b,0xed,0xf5,0xfa,0xfb,0x16,0x88,0xbd,0xba,0x02,
0xf3,0x6b,0x67,0xf0,0xa4,0xe4,0x8b,0xd3,0x6e,0xad,0x6a,0xcc,0xd5,0xea,0xfb,0xf4,0xb5,0x75,0xd5,0x1b, 0x07,0xcf,0x77,0xc5,0xe7,0xb7,0xde,0xa8,0x2b,0x15,0xcb,0xf3,0x7e,0xbd,0xa6,0x2f,0xe4,0xda,0xc7,0xfc,
0xc3,0xbc,0x3e,0x32,0xfb,0xb5,0xe2,0xed,0x7b,0x71,0x64,0xb3,0xe0,0xb8,0x7d,0xeb,0x1b,0x45,0x68,0xae, 0xad,0x7d,0x3d,0x98,0xc2,0xa2,0x36,0x31,0x86,0xf5,0xf2,0xdd,0x47,0x79,0x62,0xd1,0xe0,0xb8,0x7b,0x1f,
0xab,0x5d,0x2f,0x7a,0xea,0xb8,0x31,0x5e,0x8d,0x9c,0x81,0x5e,0xad,0xb2,0x48,0xd4,0xf2,0x0f,0x3f,0x7e, 0xea,0x65,0x68,0x6c,0x6a,0x7d,0x37,0x7a,0x1a,0x6a,0x73,0xba,0x9e,0xd8,0x23,0xad,0x56,0xa3,0x91,0xa8,
0x08,0xbf,0xd1,0xf3,0x94,0x97,0xa2,0xa9,0x0b,0xe1,0xcf,0x3f,0x59,0xb8,0xe7,0x19,0xa5,0xe0,0x52,0xd6, 0x14,0x1f,0x7f,0xfc,0xe0,0xfe,0x49,0x2e,0xb2,0x6e,0x8a,0x66,0x2f,0xb9,0x3f,0xfe,0xa0,0xe1,0x5e,0xa4,
0xd0,0x26,0xc8,0x34,0x32,0x64,0x4b,0x28,0xd4,0x5b,0x35,0xe1,0xac,0x54,0x12,0x0c,0x07,0x63,0xe1,0x3f, 0x94,0x92,0x43,0xd9,0x40,0x0b,0x23,0x43,0xcf,0xe1,0x1d,0x26,0x50,0x6b,0xd7,0xb9,0x4f,0x95,0x0a,0xa7,
0x9e,0x54,0x38,0xcf,0x04,0x2f,0x85,0xd4,0x9d,0x90,0x62,0x8f,0x03,0x19,0x36,0x9d,0xf2,0xf5,0x16,0x76, 0xdb,0xaa,0xca,0xfd,0xd7,0x5d,0x15,0xcc,0xd3,0x85,0x9f,0xb9,0xec,0x3d,0x97,0xa5,0x8f,0x83,0x35,0x74,
0xf2,0x61,0x83,0x96,0x88,0x50,0x40,0x1d,0xb2,0x9b,0x27,0x2c,0x7d,0x0c,0x28,0x53,0xa6,0x63,0x77,0x1e, 0x3a,0xeb,0xc9,0x2d,0xed,0xe5,0xc3,0x16,0xad,0x10,0x26,0x80,0xd8,0x78,0x3f,0x4f,0x68,0xfa,0xe8,0x50,
0x19,0x0a,0x92,0x01,0x75,0x4f,0x8c,0x3b,0x37,0x73,0xd2,0xbe,0xb0,0xaf,0x68,0xe4,0xfd,0xce,0x00,0x2b, 0x24,0x54,0xc6,0xfe,0x3c,0xd2,0x25,0x24,0x02,0xe2,0x54,0x8c,0x7b,0x27,0x73,0xae,0xbc,0xc5,0x9e,0xa0,
0x03,0x0d,0x20,0x61,0xa8,0x30,0x84,0xa9,0x40,0x13,0x54,0x52,0x2e,0x08,0x05,0x91,0x78,0xc2,0xcd,0x6f, 0x89,0xfb,0x77,0x0e,0x98,0x39,0xa8,0x03,0x41,0x85,0x12,0x45,0x98,0xf5,0x25,0x41,0x29,0xeb,0x80,0x90,
0xa6,0x3b,0x34,0x9f,0x57,0x21,0xcb,0x90,0x10,0xcb,0x44,0x06,0xcd,0xc4,0x5e,0x11,0x18,0xe3,0xb1,0x75, 0x10,0x8e,0x26,0x9c,0xfc,0xa6,0xb2,0x03,0xf3,0x59,0x11,0xa2,0x08,0x31,0x36,0x0d,0xa4,0x93,0x5c,0xe4,
0x76,0xe7,0x91,0xc5,0x16,0xfb,0x40,0x27,0x83,0xe1,0x09,0x06,0xce,0x76,0x41,0xfc,0x92,0xf5,0x2a,0xa4, 0x15,0x8e,0x32,0xa6,0xe9,0xd9,0x9f,0x47,0x26,0x55,0x76,0x44,0x26,0x85,0xe1,0x2e,0xf4,0x9d,0xed,0x80,
0x2f,0xa8,0xe1,0xad,0xc4,0x84,0xfc,0x05,0xcf,0x2f,0x8e,0xdb,0x47,0x7c,0x46,0xdd,0x54,0xe0,0x9e,0x7d, 0xf8,0x25,0xeb,0x65,0x48,0x5e,0x50,0xd3,0xd5,0x44,0x17,0x79,0x0a,0x2f,0x2e,0xd3,0xed,0xc3,0x1e,0xa3,
0x49,0x9a,0xc6,0xf0,0x9d,0x9e,0x73,0x48,0xf9,0xff,0xfe,0xe1,0x87,0xd8,0x79,0xca,0xce,0x3f,0x05,0x19, 0x66,0x48,0x30,0x66,0x5f,0x92,0xa4,0x29,0xfc,0x20,0x17,0x0c,0x52,0xf6,0xb7,0x57,0xfc,0x10,0xad,0xa7,
0xaa,0x18,0x82,0x0d,0xc7,0xe1,0xf2,0xc1,0x38,0x5a,0x29,0x18,0xb7,0x42,0x9b,0x76,0x3d,0xe1,0xeb,0x3c, 0xb4,0xfe,0x49,0x48,0x97,0x33,0x01,0xd8,0x60,0x1c,0xa8,0xf7,0xc7,0xa1,0x26,0x7f,0xdc,0x0e,0x6c,0xda,
0x8b,0x94,0xf0,0x6e,0xa0,0x40,0x72,0xc3,0x45,0x72,0x28,0x35,0x8d,0x70,0xd2,0x1f,0x31,0xc7,0x04,0xe3, 0xf7,0x84,0x27,0xf3,0x53,0x28,0x84,0x75,0x03,0x01,0x82,0x13,0x2e,0x82,0x4d,0x88,0xa1,0x07,0x93,0xde,
0x1f,0x42,0xca,0x9f,0x4a,0x9b,0x0e,0x65,0x75,0x00,0xb2,0xd0,0x04,0xcc,0xa7,0x6b,0x38,0x06,0x12,0x8b, 0x88,0x3a,0xc6,0x1f,0xff,0xe0,0xb2,0xde,0xd4,0x95,0x61,0x13,0xba,0x0f,0x40,0x1a,0x9a,0x80,0xfa,0x74,
0x61,0x21,0xe5,0x3b,0x8f,0x85,0xa5,0x28,0xfc,0x2e,0x63,0x24,0xaf,0xd8,0x81,0x1e,0x31,0xc4,0xf4,0xc8, 0x03,0xa7,0x40,0xa0,0x31,0xcc,0x65,0x3d,0xe7,0xd1,0xb0,0xcc,0x70,0xbf,0x89,0x2a,0x12,0xd7,0xb4,0xa0,
0x00,0x7f,0x9c,0x61,0xab,0x8f,0xb9,0x44,0xf1,0x17,0x79,0x10,0x7e,0x19,0x0e,0xb5,0x91,0xaa,0xb2,0xbc, 0x87,0x0c,0x11,0x3d,0x34,0xc0,0x1b,0xe7,0xa8,0xf6,0x29,0x93,0x28,0x9e,0x92,0x47,0xee,0x97,0xe1,0x10,
0x39,0x0e,0x28,0xe2,0x88,0x20,0x85,0x33,0x7f,0x1b,0xa8,0x38,0x12,0x8f,0xc3,0xe2,0x78,0x22,0x60,0xf1, 0x0b,0xc9,0x32,0xcd,0x9b,0x74,0x40,0x21,0x47,0x08,0x29,0x98,0xf9,0xcb,0x40,0x45,0x91,0x98,0x0e,0x8b,
0xdc,0xdf,0x06,0x6d,0x89,0x6c,0x7d,0x03,0x6c,0x78,0x1c,0x58,0xc4,0x11,0xc1,0x0a,0x67,0x8e,0x80,0x3a, 0xe1,0x09,0x81,0x45,0x73,0x7f,0x19,0x34,0xaf,0xb6,0x1c,0x79,0x7d,0x1e,0x3d,0x7a,0x7d,0xee,0x38,0x05,
0x88,0x3f,0x4e,0x1d,0x1f,0x10,0xf7,0xda,0xd5,0x7e,0x50,0xf0,0x47,0xe7,0x95,0xa7,0x82,0xd5,0x78,0xc3, 0xce,0x41,0xe4,0x31,0xa2,0xd8,0x50,0x78,0x50,0xae,0xe3,0xe1,0xc0,0x16,0xcd,0x6b,0x57,0x04,0xdd,0xdd,
0x72,0xa8,0x40,0xb7,0x16,0xeb,0x60,0x6c,0x16,0xc7,0xa6,0x18,0xb4,0x33,0x00,0xe3,0x11,0x85,0x16,0x61, 0x75,0xd3,0x26,0x1c,0xd9,0x99,0xb4,0x77,0xb1,0x68,0x04,0x1b,0x19,0xbf,0x91,0x01,0xaa,0x3a,0x21,0xd0,
0xe6,0xae,0x01,0x76,0xdc,0x5e,0xc8,0x76,0xa0,0xc8,0x16,0x75,0x33,0x12,0xf3,0x0c,0x5e,0x9b,0x11,0x8c, 0xc4,0xd4,0xd0,0x0d,0x50,0x6d,0xa7,0x0b,0xb2,0x6c,0x98,0xa1,0x4a,0x9d,0x5c,0x54,0x59,0x06,0xb7,0xc1,
0xc6,0x2e,0x13,0x6b,0x6a,0x80,0x04,0x71,0x94,0x65,0xee,0x20,0x8d,0x0c,0xd7,0x45,0xa2,0xb0,0x34,0xed, 0xf0,0x47,0x53,0x87,0x89,0xb6,0x33,0x40,0x80,0x6a,0x98,0x5f,0xce,0xe0,0x0a,0xe9,0x8e,0x73,0x32,0xdc,
0x7d,0xf6,0x5d,0x9c,0x3c,0x2d,0x80,0xeb,0x69,0xe0,0x4c,0xff,0x29,0xdc,0x4b,0x80,0xc9,0xe7,0xc0,0x1b, 0xca,0xb0,0xe2,0xec,0xfb,0x38,0x59,0x9a,0x0f,0xd7,0x95,0xc0,0x98,0xfe,0x53,0xb8,0x57,0x40,0xc5,0xa7,
0x1e,0xd7,0xe9,0xc8,0x03,0xfe,0x64,0xe8,0x1e,0xf1,0x08,0xf6,0x50,0x37,0xc1,0x88,0xb5,0x59,0x7b,0x35, 0x81,0x37,0x5d,0xae,0xf3,0x91,0xfb,0xfc,0xc9,0xd0,0x5d,0x62,0x0a,0xf6,0x40,0x36,0x56,0x11,0x6d,0xb0,
0x85,0x95,0x22,0x4b,0x0c,0x37,0x36,0xc4,0xc9,0x5a,0x3f,0x0b,0x44,0x51,0xe8,0x59,0xe5,0x2d,0xdc,0x05, 0x62,0xbb,0x09,0x7d,0xf1,0x66,0x26,0x78,0xb1,0x01,0x4e,0xda,0xf4,0x99,0x20,0x8c,0x3f,0xd7,0x2a,0x57,
0x54,0xcb,0x2c,0xb1,0x69,0xda,0xe7,0x21,0xef,0xd4,0x25,0x0a,0x59,0xa1,0x70,0x7d,0x2d,0xfc,0x4b,0xc8, 0x71,0x1f,0x10,0x25,0xb7,0x52,0x0d,0xc3,0xba,0x08,0x78,0xe7,0x0e,0x91,0xcb,0x73,0xa5,0x9b,0x1b,0xee,
0xe7,0x72,0x2e,0x86,0x7f,0xb2,0x16,0x91,0x29,0x48,0x58,0x9d,0xef,0x00,0x77,0x3d,0x6a,0xa8,0xcc,0x60, 0xdf,0x5c,0xb1,0x50,0x70,0x30,0xfc,0x8b,0x36,0x87,0x54,0x40,0x82,0x76,0xb6,0xf7,0xdb,0xf7,0xa8,0x2e,
0x1d,0x19,0x25,0x31,0xc7,0x9e,0xe0,0xbd,0x24,0x32,0x95,0xe2,0xae,0x74,0xe4,0xd3,0x8c,0xe1,0xe8,0x12, 0x53,0x83,0x35,0xa4,0x57,0x32,0x05,0xfa,0x04,0x1f,0x95,0x0c,0x15,0x99,0xd9,0x5f,0x1d,0xfa,0x34,0xa7,
0xe4,0x9c,0x33,0xf5,0x31,0x1e,0x9c,0xc2,0x09,0x56,0x9e,0xc5,0xdb,0xb1,0x4e,0x7b,0x1e,0x3e,0x77,0xc9, 0xdb,0x9a,0x00,0x19,0xe7,0xcc,0x3d,0x8c,0x07,0xf5,0x37,0xc1,0xca,0x4f,0xd1,0xeb,0xd8,0x5c,0xb9,0x1e,
0x5f,0x04,0x56,0x48,0xe0,0xfb,0x05,0x7b,0x08,0xe4,0x54,0x2f,0xb8,0x8c,0x99,0xf5,0xff,0xd6,0x05,0x31, 0xbe,0x70,0xc8,0x5f,0x38,0xba,0x85,0xc0,0x8f,0x4b,0xfa,0xe0,0xf0,0xb9,0x5e,0x70,0x18,0x73,0x9b,0xff,
0x86,0x3d,0xfb,0x93,0x2b,0xd2,0x6e,0xf6,0x72,0xa7,0xe7,0x3d,0xf3,0x85,0x2e,0xfc,0x4e,0x1c,0x49,0x47, 0xaf,0x0b,0x22,0x0c,0x31,0xfb,0x93,0xf7,0xa2,0xfd,0xec,0x65,0xea,0xe6,0x03,0xf5,0x85,0xc6,0xfd,0x86,
0x34,0x63,0xd9,0x70,0xed,0x5d,0x29,0x58,0x3b,0x8f,0xb7,0xe3,0x80,0xcd,0xe5,0x42,0x10,0x2b,0xec,0x32, 0x6d,0x41,0x43,0x24,0x67,0x5a,0x70,0xe3,0x1e,0x26,0x68,0x23,0xaf,0xee,0xa6,0x3e,0x9b,0xc3,0x85,0xa0,
0xc3,0xe7,0x7b,0x7c,0xe2,0x22,0x1d,0x8e,0x0f,0xb3,0x3e,0x6a,0x6c,0x80,0x6d,0x78,0xd5,0x30,0xd8,0x89, 0x2a,0xd1,0x63,0x0c,0x9b,0xef,0x51,0xad,0x45,0x1a,0x9c,0x1e,0x66,0x7d,0xd8,0xd2,0x00,0x4b,0x77,0xf7,
0xc3,0xe2,0x1b,0x35,0x0f,0x7f,0xfc,0x21,0x24,0x50,0xfd,0xa8,0x77,0x4f,0xba,0xab,0x84,0xe3,0x9e,0x2d, 0x41,0xff,0x4d,0x1c,0x6e,0xbb,0x61,0xdb,0xf0,0xfb,0xef,0x5c,0x02,0xd5,0x8b,0x7a,0xa7,0xc6,0x5d,0x27,
0xde,0x62,0x17,0x21,0xdb,0x80,0x94,0xef,0x21,0xfc,0x04,0xf3,0x76,0x1a,0x03,0x8a,0x4d,0xae,0xfc,0xee, 0x14,0x7a,0xaa,0xbc,0x4d,0x8f,0x40,0x96,0x0e,0x09,0xdb,0x3d,0xe4,0x23,0xc8,0x47,0xc1,0x6b,0x86,0xa3,
0xc8,0x76,0x00,0xed,0x98,0x41,0x2d,0x8e,0xb2,0x88,0xdf,0x21,0xca,0x4a,0xbe,0x9f,0xc3,0xa1,0x9e,0x38, 0x23,0x0e,0x9f,0x59,0x9d,0x77,0x3c,0x74,0xca,0xa3,0x7b,0x25,0xff,0x98,0x4f,0x6b,0x6c,0x27,0x93,0x04,
0xc7,0x77,0x34,0x65,0xa2,0x75,0x76,0xb6,0xdf,0x91,0x4c,0xcb,0x35,0x83,0x88,0xbb,0xa0,0x4c,0xd9,0xb3, 0x8c,0xdd,0x28,0x62,0xa0,0xd8,0xb8,0x11,0x15,0x28,0xae,0x05,0xe3,0xc3,0xaf,0x2e,0x51,0x2b,0xc5,0x54,
0x4e,0x4c,0x3c,0x04,0x92,0xa1,0x06,0x22,0x27,0x61,0x8d,0xd4,0x1f,0x03,0x1b,0x32,0x1c,0xad,0x3f,0x7e, 0x20,0x46,0x14,0xcb,0x70,0x46,0xf1,0x61,0xb9,0x0f,0x71,0x31,0xe4,0xfd,0xe2,0xc3,0x66,0x8e,0x72,0x7a,
0x21,0x89,0x63,0x82,0x40,0x60,0xcb,0x5a,0x27,0x52,0x7c,0x17,0xb6,0x6e,0x21,0x89,0x6d,0x72,0x44,0xfd, 0x71,0x2b,0x12,0xe0,0x66,0x0d,0x77,0xc4,0x42,0x3f,0x16,0x92,0xad,0x0b,0x88,0xa7,0x2d,0x0b,0x39,0x0f,
0xd0,0x80,0x91,0xc7,0x9e,0x58,0x70,0xb2,0x71,0xa4,0x7d,0x18,0x73,0xba,0xe9,0x2a,0xda,0x8f,0x3a,0x4e, 0x81,0x31,0x2d,0xe0,0xcf,0x5b,0xc5,0x2c,0x8e,0x5b,0xe5,0x63,0xf2,0xd4,0x63,0x24,0x25,0x2e,0xa7,0xf3,
0x3a,0xeb,0x06,0xf6,0x67,0x89,0xb0,0x53,0xaf,0x3f,0x4a,0x85,0x2a,0xdf,0x86,0x26,0x01,0xe3,0xab,0xfc, 0xfb,0x4a,0x59,0x4f,0x10,0xda,0x6e,0xfa,0x5e,0x70,0xd6,0x27,0xbb,0xc0,0xa5,0xdc,0x07,0x7d,0x34,0x4d,
0x1e,0x28,0x7e,0x83,0x64,0x0d,0xca,0x2b,0xc9,0x7c,0x0f,0x8a,0x42,0xdc,0x07,0x73,0xfb,0xc4,0xa9,0xe2, 0xb3,0x23,0xfe,0x71,0xb1,0x98,0xd4,0xa0,0xad,0x61,0x25,0xe2,0x09,0x68,0xe9,0x98,0xc2,0xd5,0x2e,0xae,
0x19,0x4e,0xa8,0x19,0x3c,0xf7,0x21,0x2e,0x8e,0xbc,0x1b,0x41,0xfc,0x81,0xa7,0x7d,0x2e,0xdc,0x8c,0x15, 0x68,0x94,0x84,0x2d,0xa2,0x9e,0xc2,0x77,0x2c,0x02,0x24,0x45,0x34,0x93,0xe5,0x7b,0x94,0x33,0x6d,0x4f,
0x78,0x87,0x9d,0xf0,0x81,0x85,0x41,0x0a,0x27,0x5b,0x17,0x12,0x3f,0xb7,0x2c,0xe2,0x3c,0x04,0xc6,0xf5, 0x8f,0x0d,0x57,0x4c,0x82,0x33,0x9c,0xf9,0x9f,0x8f,0x08,0x67,0xd5,0x41,0x28,0xb0,0xdb,0x82,0x2d,0x18,
0xef,0x3f,0x6f,0x15,0x27,0xbc,0x6f,0x15,0x9f,0xab,0x84,0x20,0x25,0x51,0x9c,0xcd,0x9f,0x92,0x8c,0x9e, 0xa6,0xc3,0x89,0xf7,0x5f,0x0b,0x4a,0xc4,0x80,0x4c,0x20,0x49,0x16,0x4d,0x9c,0x73,0xa2,0x04,0xa5,0xf8,
0x7c,0xb2,0x0b,0x3c,0x0a,0x97,0x49,0x67,0x1f,0xf8,0xc7,0xc3,0x62,0x31,0x83,0x36,0xa6,0x9d,0x88,0x27, 0x09,0x9d,0xf4,0x92,0x53,0x80,0xe3,0x8e,0xdd,0x0f,0x60,0x5b,0xa0,0x75,0x56,0x03,0x78,0x9d,0x18,0xc6,
0xa4,0x1d,0xc7,0x14,0x49,0x7b,0xb8,0xe2,0x51,0x12,0xb6,0x98,0xfa,0x19,0xbe,0x8f,0x22,0x40,0xd1,0x64, 0x21,0xf5,0xac,0x60,0x8e,0x64,0x25,0x87,0x34,0x43,0xff,0x45,0xd8,0x32,0x20,0x70,0x0b,0x76,0x49,0x98,
0x2b,0x59,0xbf,0x4f,0x39,0xd1,0xf6,0xe3,0xb1,0xe1,0xa9,0x49,0x70,0x86,0x3b,0xff,0xf3,0x11,0xe1,0x4a, 0x7d,0xd2,0x39,0x80,0x03,0x29,0x89,0x68,0x43,0xe2,0x9f,0x81,0xea,0x6d,0x2e,0x0c,0x60,0xc5,0xc0,0xc4,
0x1d,0x84,0xc2,0x09,0xc7,0x39,0x4a,0xc4,0x80,0x2c,0xa0,0x28,0x36,0x4b,0x9c,0x53,0xa2,0x04,0x1d,0xf1, 0x69,0x34,0x93,0x10,0x07,0xb4,0x53,0x90,0xef,0x4d,0x15,0x88,0x50,0x31,0x54,0xc9,0x69,0x18,0x52,0x84,
0x13,0xfa,0xd4,0x4b,0x6e,0xdd,0xdc,0x77,0xec,0x6e,0x00,0x3b,0x12,0x2b,0x8f,0x3a,0x20,0xab,0xc4,0x30, 0x0c,0x23,0x9e,0xec,0xa5,0x67,0x66,0xa8,0x3b,0xd1,0xce,0x88,0x7a,0x32,0xe1,0x98,0x68,0xf7,0x4e,0x15,
0x8e,0xa8,0x27,0x05,0x73,0xac,0x2b,0x39,0xa4,0x39,0xfa,0x2f,0xc2,0x56,0x01,0x85,0x1b,0xb0,0x4d,0xc2, 0x38,0x6c,0x7e,0xf6,0xa6,0xaf,0x4c,0x0b,0x69,0xc0,0xa2,0xbe,0xf3,0xe0,0x7b,0x1b,0xe7,0x9e,0x02,0x0c,
0x1c,0x90,0x4e,0x01,0x1c,0x6a,0x49,0x44,0x1b,0x11,0xff,0x1b,0xa8,0x07,0x9d,0x86,0x66,0x12,0xea,0xde, 0x36,0x6e,0x0b,0x11,0x34,0xdb,0xde,0xd8,0xbf,0x70,0x71,0x37,0xd6,0xaa,0x2b,0x6a,0xe2,0xce,0x53,0xcf,
0x0f,0x92,0x10,0x87,0xb4,0xcf,0x20,0xdf,0x59,0x18,0xc8,0x50,0x33,0xb1,0xe2,0xf6,0x79,0x47,0x94,0xf4, 0xdc,0xc7,0x29,0xd9,0xcb,0xa8,0x51,0xfa,0xc9,0xcd,0x3d,0x3c,0x38,0xa5,0x6c,0xec,0xb6,0xe9,0x9c,0xca,
0x63,0x9e,0xd4,0x85,0x6f,0x66,0xb4,0x76,0xa2,0x9d,0x31,0xf5,0xd3,0x84,0xe3,0xa2,0xdd,0xaf,0xcd,0x24, 0x9b,0xc8,0xd2,0x68,0xab,0x03,0xfd,0xe0,0x76,0xd7,0xa4,0xec,0xf1,0xfe,0xc9,0x6b,0xe5,0xaf,0x88,0x37,
0xea,0x59,0x77,0xa6,0xd3,0x96,0x8d,0x74,0x60,0x33,0xdf,0xf9,0xf0,0xfd,0xc2,0xb9,0xdb,0x17,0x80,0xb5, 0x1f,0xec,0xab,0x5c,0x21,0xd5,0x97,0x18,0x70,0x37,0x9d,0x99,0xbf,0xaf,0x73,0x23,0x27,0x7a,0x6e,0x19,
0xd7,0xf9,0x85,0x77,0x24,0x7f,0x1c,0xbc,0x2d,0xf3,0x0a,0x6b,0xc5,0x53,0x35,0xf2,0xe6,0x99,0x67,0xee, 0x5a,0x86,0xec,0x14,0x2e,0xf7,0x96,0x6c,0x15,0x9e,0x66,0x62,0x44,0xb7,0x75,0x4e,0x79,0x39,0x47,0xba,
0xf6,0x29,0xa9,0x0b,0x31,0xa1,0x35,0x38,0xa9,0xb8,0x73,0x77,0xde,0x23,0xa5,0xdd,0xb1,0xdc,0x97,0x2a, 0xa9,0x89,0xe7,0xe5,0xb3,0x3d,0xae,0x13,0xf3,0x6f,0xd7,0xa8,0x32,0x59,0xaf,0x02,0x12,0x3f,0x9d,0x53,
0x8d,0x80,0xcf,0x77,0x63,0x28,0x75,0xa4,0xce,0xc7,0xd7,0xe6,0x0f,0xaa,0xfc,0x12,0xe1,0x3d,0x6d,0x0d, 0xc4,0x3d,0x40,0xce,0xa9,0x4e,0xce,0xe2,0x28,0x63,0xfd,0xe5,0xae,0xc4,0x3d,0x15,0xcc,0x05,0x14,0xa3,
0x77,0xe6,0xff,0xd7,0xb5,0xb1,0x0b,0x7d,0x97,0xf4,0x6d,0x53,0x75,0x8f,0x2d,0xef,0x05,0xe7,0x32,0xba, 0xc2,0xbf,0x86,0x3a,0xa5,0xc2,0x73,0x4e,0x4c,0x45,0xfc,0x36,0x2a,0x6d,0x67,0x53,0x0d,0xd1,0xef,0xe1,
0x82,0xee,0x11,0xbd,0xfb,0xce,0x87,0x5b,0x73,0xf8,0x3a,0x0f,0xb3,0xd6,0x6f,0x89,0xde,0x8f,0x5f,0xda, 0x92,0xf6,0xe0,0x04,0x50,0x3e,0xff,0x59,0xc8,0x42,0xd9,0x21,0xbc,0x70,0x2a,0xe5,0x6a,0x85,0xdb,0xbf,
0x82,0xf7,0xa5,0x5c,0x06,0x59,0x5b,0xd6,0xf4,0x69,0xc1,0x89,0x2c,0xd9,0xfc,0x8b,0xd8,0xe0,0xb9,0xff, 0x4e,0x09,0x2e,0x4d,0xa2,0x08,0xc3,0x10,0x58,0xa2,0xd2,0x0b,0x25,0xb3,0x19,0xe3,0x92,0x68,0xac,0x84,
0x1e,0x36,0xf4,0xfa,0xd4,0x27,0x7b,0xaf,0x63,0xf7,0x45,0xa2,0xd7,0xb0,0x07,0xb7,0xa6,0xe0,0x03,0x08, 0xd4,0x74,0xf8,0x13,0x97,0x37,0xf1,0x76,0xe5,0x20,0x3e,0x4d,0xa4,0xe3,0x78,0x80,0xb2,0x2d,0x1b,0xd2,
0x66,0x37,0x33,0x07,0xa8,0xcc,0xb5,0xaf,0x60,0x0d,0xfc,0x49,0xf1,0x81,0x65,0x0c,0x31,0xb1,0xdb,0x3e, 0x7b,0x8d,0x3a,0x3f,0x8c,0x6b,0x0b,0xe6,0xd3,0x3d,0xe5,0x1d,0x1b,0xfd,0x66,0x2d,0x90,0x72,0x78,0xa8,
0xab,0xe7,0x62,0xcb,0xff,0xca,0x82,0xbe,0x33,0x0f,0x67,0x32,0x19,0xf1,0xe2,0x0b,0xcb,0x22,0x9b,0x96, 0x8c,0x50,0xe4,0xa8,0x9d,0x8e,0xa2,0x43,0xf5,0x93,0x29,0x9f,0xac,0x9f,0x12,0x7e,0x06,0x80,0x23,0xe7,
0x2d,0xeb,0xfc,0x82,0xfb,0x5e,0xe2,0x7f,0x29,0xc9,0x7a,0x1f,0x88,0xfe,0x02,0x33,0x94,0x47,0xb7,0x36, 0x14,0x02,0x57,0x57,0x0c,0x02,0x3f,0xf4,0x6a,0x4e,0x02,0x88,0x80,0x74,0x36,0x8c,0x50,0xd6,0x51,0x20,
0x1a,0x00,0x00}; 0xc0,0x0c,0x34,0xc6,0xa0,0x0c,0x5f,0xfa,0x75,0x8b,0x6e,0x14,0xd6,0xa4,0x9e,0xe4,0x13,0x96,0x7c,0x36,
0xa4,0x3d,0x99,0x47,0x61,0x99,0x5b,0xcd,0xd5,0x9b,0x0a,0xaa,0xd6,0x3b,0x0a,0xaa,0xd6,0xfb,0x13,0xa0,
0xa8,0xcc,0x93,0xa0,0x1c,0xbd,0x7b,0xa0,0xb6,0x1a,0xef,0x75,0xaf,0x07,0x78,0x42,0xca,0x99,0x50,0x22,
0x49,0xa9,0x28,0x18,0x65,0x31,0x10,0x4d,0x0b,0xbe,0xdb,0x50,0x17,0x77,0x09,0x30,0x42,0xda,0xd9,0x40,
0x22,0x69,0x47,0xa0,0x30,0x2a,0x0f,0xb3,0x5d,0x03,0xe6,0xb1,0x6c,0x77,0xc8,0xfc,0xb0,0xdd,0x85,0x07,
0x78,0x23,0xca,0x79,0x68,0x19,0x49,0x69,0x58,0x59,0x65,0x5c,0xfa,0x01,0xe7,0x80,0x5b,0x39,0x72,0xc4,
0xf9,0x5b,0xf5,0x25,0x69,0x4d,0xdf,0xe1,0xb7,0x26,0x95,0x16,0xec,0x15,0xfa,0x48,0xbf,0x57,0xf4,0x3f,
0xe6,0x31,0xbd,0xb9,0xb9,0xa3,0xbb,0xbc,0xe2,0x3b,0x42,0xb0,0xd8,0xaf,0x84,0xfe,0x33,0xfe,0x91,0x30,
0xe8,0xe6,0xe6,0x1e,0xd9,0xfd,0x56,0x18,0x5f,0x12,0x7e,0x23,0x3c,0xb8,0xd8,0xf3,0xbf,0xce,0xab,0x40,
0x97,0x6d,0x20,0x53,0xd7,0xbc,0x81,0x0d,0xf0,0x26,0x33,0x8f,0xb4,0x17,0xc7,0x86,0x0a,0x73,0xaa,0x21,
0x5f,0x64,0xda,0xde,0xbf,0x00,0xa0,0xef,0xd4,0x43,0xb9,0x5c,0x2e,0x73,0xf9,0x85,0x36,0x29,0x16,0xe1,
0x4d,0xf3,0xe2,0x92,0xf9,0x98,0xef,0x7d,0xc6,0xcf,0xbb,0xff,0xbd,0xf0,0x3f,0x97,0x68,0xfa,0x3c,0xd3,
0x20,0x00,0x00};
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -4,10 +4,10 @@
const uint8_t VersionMajor = 2; const uint8_t VersionMajor = 2;
const uint8_t VersionMinor = 0; const uint8_t VersionMinor = 0;
const uint8_t VersionPatch = 0; const uint8_t VersionPatch = 0;
const uint8_t VersionMetadata = 14; const uint8_t VersionMetadata = 15;
const char VersionBranch[] = "release/2.0"; const char VersionBranch[] = "release/2.0";
const char VersionSemVer[] = "2.0.0-beta.1"; const char VersionSemVer[] = "2.0.0-beta.1";
const char VersionFullSemVer[] = "2.0.0-beta.1+14"; const char VersionFullSemVer[] = "2.0.0-beta.1+15";
const char VersionCommitDate[] = "2018-01-10"; const char VersionCommitDate[] = "2018-01-11";
#endif #endif

View File

@ -38,8 +38,9 @@ void updateDebugStatus();
void updateLED(); void updateLED();
void updateNTPClient(); void updateNTPClient();
void startServer(); void updateTimeTrigger();
void stopServer(); void checkTriggers();
void handleNotFound(AsyncWebServerRequest* request); void handleNotFound(AsyncWebServerRequest* request);
@ -56,20 +57,6 @@ bool forceAccessPoint = false;
uint32_t stationModeStart = 0; uint32_t stationModeStart = 0;
uint32_t blinkOnTime = 0; uint32_t blinkOnTime = 0;
enum LEDState
{
Off,
BlinkLow,
BlinkHigh,
On
};
bool ledAP = false;
LEDState ledWiFi = Off;
#ifdef SerialDebug
uint32_t debugStatusTime = 0;
#endif
void setup() void setup()
@ -201,10 +188,17 @@ void loop()
} }
// TODO check AP button // TODO check AP button
updateLED(); updateLED();
updateNTPClient(); updateNTPClient();
// TODO check for triggers every 10 seconds or so // if motionTriggerEnabled || timeTriggerEnabled
// {
// TODO check for active time trigger every 10 seconds or so
// updateTimeTrigger();
checkTriggers();
// }
stairs->tick(); stairs->tick();
} }
@ -292,6 +286,8 @@ void wifiEvent(WiFiEvent_t event)
} }
uint32_t debugStatusTime = 0;
void updateDebugStatus() void updateDebugStatus()
{ {
if (currentTime - debugStatusTime < 5000) return; if (currentTime - debugStatusTime < 5000) return;
@ -313,6 +309,18 @@ void updateDebugStatus()
#endif #endif
enum LEDState
{
Off,
BlinkLow,
BlinkHigh,
On
};
bool ledAP = false;
LEDState ledWiFi = Off;
void updateLED() void updateLED()
{ {
uint8_t value = (currentTime - blinkOnTime >= 1000) ? LOW : HIGH; uint8_t value = (currentTime - blinkOnTime >= 1000) ? LOW : HIGH;
@ -389,6 +397,64 @@ void updateNTPClient()
} }
TimeTrigger* lastTimeTrigger = nullptr;
TimeTrigger* activeTimeTrigger = nullptr;
void updateTimeTrigger()
{
// TODO check active time trigger
}
void checkTriggers()
{
bool inTimeTrigger = timeTriggerSettings->enabled() &&
activeTimeTrigger != nullptr &&
activeTimeTrigger->brightness;
bool timeTriggerChanged = activeTimeTrigger != lastTimeTrigger;
lastTimeTrigger = activeTimeTrigger;
// TODO motion sensor settings
bool inMotionTrigger = false; // && (alsoDuringTimeTrigger || !inTimeTrigger)
bool motionChanged = false;
// TODO dummies, replace these with motionSettings-> values later on
uint16_t motionBrightness = 0;
uint16_t motionTransitionTime = 0;
if (!motionChanged && !timeTriggerChanged)
return;
if (motionChanged)
{
if (inMotionTrigger)
{
// Start sweep
}
else
{
if (inTimeTrigger)
{
// Fall back to time trigger value
stairs->setAll(activeTimeTrigger->brightness, motionTransitionTime, 0);
}
else
{
// No more motion, no active time trigger, turn off
stairs->setAll(0, motionTransitionTime, 0);
}
}
}
else if (timeTriggerChanged && !inMotionTrigger)
{
// Set to time trigger value
stairs->setAll(activeTimeTrigger->brightness, timeTriggerSettings->transitionTime(), 0);
}
}
void handleNotFound(AsyncWebServerRequest *request) void handleNotFound(AsyncWebServerRequest *request)
{ {
_d("HTTP :: not found: "); _dln(request->url()); _d("HTTP :: not found: "); _dln(request->url());

View File

@ -71,8 +71,9 @@ void handleGetTimeTriggers(AsyncWebServerRequest *request)
uint8_t count = timeTriggerSettings->triggerCount(); uint8_t count = timeTriggerSettings->triggerCount();
DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(count) + JSON_OBJECT_SIZE(2) + count*JSON_OBJECT_SIZE(5)); DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(count) + JSON_OBJECT_SIZE(3) + count*JSON_OBJECT_SIZE(5));
JsonObject& root = jsonBuffer.createObject(); JsonObject& root = jsonBuffer.createObject();
root["enabled"] = timeTriggerSettings->enabled();
root["transitionTime"] = timeTriggerSettings->transitionTime(); root["transitionTime"] = timeTriggerSettings->transitionTime();
JsonArray& jsonTriggers = root.createNestedArray("triggers"); JsonArray& jsonTriggers = root.createNestedArray("triggers");
@ -82,7 +83,7 @@ void handleGetTimeTriggers(AsyncWebServerRequest *request)
TimeTrigger* trigger = timeTriggerSettings->trigger(i); TimeTrigger* trigger = timeTriggerSettings->trigger(i);
JsonObject& jsonTrigger = jsonTriggers.createNestedObject(); JsonObject& jsonTrigger = jsonTriggers.createNestedObject();
jsonTrigger["timeofDay"] = trigger->timeOfDay; jsonTrigger["time"] = trigger->time;
jsonTrigger["daysOfWeek"] = trigger->daysOfWeek; jsonTrigger["daysOfWeek"] = trigger->daysOfWeek;
jsonTrigger["brightness"] = trigger->brightness; jsonTrigger["brightness"] = trigger->brightness;
jsonTrigger["triggerType"] = (uint8_t)trigger->triggerType; jsonTrigger["triggerType"] = (uint8_t)trigger->triggerType;
@ -100,7 +101,7 @@ void handlePostTimeTriggers(AsyncWebServerRequest *request, uint8_t *data, size_
{ {
_dln("API :: post time triggers"); _dln("API :: post time triggers");
DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(10) + JSON_OBJECT_SIZE(2) + 10*JSON_OBJECT_SIZE(5) + 510); DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(10) + JSON_OBJECT_SIZE(3) + 10*JSON_OBJECT_SIZE(5) + 510);
JsonObject& root = jsonBuffer.parseObject((char*)data); JsonObject& root = jsonBuffer.parseObject((char*)data);
if (!root.success()) if (!root.success())
{ {
@ -115,6 +116,7 @@ void handlePostTimeTriggers(AsyncWebServerRequest *request, uint8_t *data, size_
return; return;
} }
timeTriggerSettings->enabled(root["enabled"]);
timeTriggerSettings->transitionTime(root["transitionTime"]); timeTriggerSettings->transitionTime(root["transitionTime"]);
timeTriggerSettings->beginSetTriggers(jsonTriggers.size()); timeTriggerSettings->beginSetTriggers(jsonTriggers.size());
@ -123,7 +125,7 @@ void handlePostTimeTriggers(AsyncWebServerRequest *request, uint8_t *data, size_
{ {
JsonObject& jsonTrigger = jsonTriggers[i]; JsonObject& jsonTrigger = jsonTriggers[i];
trigger.timeOfDay = jsonTrigger["timeOfDay"]; trigger.time = jsonTrigger["time"];
trigger.daysOfWeek = jsonTrigger["daysOfWeek"]; trigger.daysOfWeek = jsonTrigger["daysOfWeek"];
trigger.brightness = jsonTrigger["brightness"]; trigger.brightness = jsonTrigger["brightness"];
trigger.triggerType = (TimeTriggerType)(uint8_t)jsonTrigger["triggerType"]; trigger.triggerType = (TimeTriggerType)(uint8_t)jsonTrigger["triggerType"];

View File

@ -49,6 +49,7 @@ struct Header
uint8_t version; uint8_t version;
uint8_t triggerCount; uint8_t triggerCount;
uint16_t transitionTime; uint16_t transitionTime;
bool enabled;
}; };
@ -68,6 +69,7 @@ void TimeTriggerSettings::read()
if (header.version != 1) if (header.version != 1)
return; return;
mEnabled = header.enabled;
mTransitionTime = header.transitionTime; mTransitionTime = header.transitionTime;
beginSetTriggers(header.triggerCount); beginSetTriggers(header.triggerCount);
@ -89,6 +91,7 @@ void TimeTriggerSettings::write()
Header header; Header header;
header.version = 1; header.version = 1;
header.enabled = mEnabled;
header.transitionTime = mTransitionTime; header.transitionTime = mTransitionTime;
header.triggerCount = mTriggerCount; header.triggerCount = mTriggerCount;
@ -136,7 +139,7 @@ void TimeTriggerSettings::endSetTriggers()
swapped = false; swapped = false;
for (i = 0, j = gap; j < mTriggerCount; i++, j++) for (i = 0, j = gap; j < mTriggerCount; i++, j++)
{ {
if (mTriggers[i].timeOfDay > mTriggers[j].timeOfDay) if (mTriggers[i].time > mTriggers[j].time)
{ {
temp = mTriggers[i]; temp = mTriggers[i];
mTriggers[i] = mTriggers[j]; mTriggers[i] = mTriggers[j];

View File

@ -9,6 +9,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <TimeLib.h> #include <TimeLib.h>
#include <stdbool.h>
enum DayOfWeek enum DayOfWeek
{ {
@ -36,7 +37,7 @@ enum TimeTriggerType
struct TimeTrigger struct TimeTrigger
{ {
uint16_t timeOfDay; uint16_t time;
uint8_t daysOfWeek; uint8_t daysOfWeek;
uint8_t brightness; uint8_t brightness;
TimeTriggerType triggerType; TimeTriggerType triggerType;
@ -47,6 +48,7 @@ struct TimeTrigger
class TimeTriggerSettings class TimeTriggerSettings
{ {
private: private:
bool mEnabled = false;
uint16_t mTransitionTime = 0; uint16_t mTransitionTime = 0;
uint8_t mTriggerCount = 0; uint8_t mTriggerCount = 0;
TimeTrigger* mTriggers = nullptr; TimeTrigger* mTriggers = nullptr;
@ -56,6 +58,9 @@ class TimeTriggerSettings
void write(); void write();
bool enabled() { return mEnabled; }
void enabled(bool value) { mEnabled = value; }
uint16_t transitionTime() { return mTransitionTime; } uint16_t transitionTime() { return mTransitionTime; }
void transitionTime(uint16_t value) { mTransitionTime = value; } void transitionTime(uint16_t value) { mTransitionTime = value; }

View File

@ -40,10 +40,6 @@ function startApp()
searchingLocation: false, searchingLocation: false,
triggers: { triggers: {
time: {
latlong: '',
location: ''
}
}, },
connection: { connection: {
@ -58,9 +54,26 @@ function startApp()
gateway: null gateway: null
}, },
system: {
lat: null,
lng: null,
pins: {
ledAP: null,
ledSTA: null,
apButton: null,
pwmSDA: null,
pwmSCL: null
},
pwmAddress: null,
pwmFrequency: null,
mapsAPIKey: ''
},
allSteps: true, allSteps: true,
allStepsValue: 0, allStepsValue: 0,
steps: [] steps: [],
location: ''
}, },
created: function() created: function()
@ -89,6 +102,7 @@ function startApp()
console.log(error); console.log(error);
}); });
// TODO retrieve system settings
axios.all([ axios.all([
axios.get('/api/connection') axios.get('/api/connection')
.then(function(response) .then(function(response)
@ -101,6 +115,17 @@ function startApp()
console.log(error); console.log(error);
}), }),
axios.get('/api/system')
.then(function(response)
{
if (typeof response.data == 'object')
self.system = response.data;
})
.catch(function(error)
{
console.log(error);
}),
axios.get('/api/steps') axios.get('/api/steps')
.then(function(response) .then(function(response)
{ {
@ -170,6 +195,27 @@ function startApp()
}) })
}, },
applySystem: function()
{
var self = this;
if (self.saving) return;
self.saving = true;
axios.post('/api/system', self.system)
.then(function(response)
{
})
.catch(function(error)
{
console.log(error);
})
.then(function()
{
self.saving = false;
});
},
startLoadingIndicator: function() startLoadingIndicator: function()
{ {
var self = this; var self = this;
@ -378,17 +424,18 @@ function startApp()
searchLocation: function() searchLocation: function()
{ {
var self = this; var self = this;
if (!self.triggers.time.location) return; if (!self.location) return;
self.searchingLocation = true; self.searchingLocation = true;
axios.get('/api/geocode/latlong', { params: { address: self.triggers.time.location }}) axios.get('https://maps.googleapis.com/maps/api/geocode/json', { params: { address: self.location, key: self.system.mapsAPIKey }})
.then(function(response) .then(function(response)
{ {
if (Array.isArray(response.data.results) && response.data.results.length > 0) if (Array.isArray(response.data.results) && response.data.results.length > 0)
{ {
var location = response.data.results[0].geometry.location; var location = response.data.results[0].geometry.location;
self.triggers.time.latlong = location.lat + ',' + location.lng; self.system.lat = location.lat;
self.system.lng = location.lng;
} }
}) })
.catch(function(error) .catch(function(error)

2
web/dist/bundle.css vendored

File diff suppressed because one or more lines are too long

2
web/dist/bundle.js vendored

File diff suppressed because one or more lines are too long

View File

@ -36,7 +36,7 @@
<button class="button" :class="{ 'button-outline': activeTab != 'status' }" @click="activeTab = 'status'">{{ $t('status.tabTitle') }}</button> <button class="button" :class="{ 'button-outline': activeTab != 'status' }" @click="activeTab = 'status'">{{ $t('status.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'triggers' }" @click="activeTab = 'triggers'">{{ $t('triggers.tabTitle') }}</button> <button class="button" :class="{ 'button-outline': activeTab != 'triggers' }" @click="activeTab = 'triggers'">{{ $t('triggers.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'connection' }" @click="activeTab = 'connection'">{{ $t('connection.tabTitle') }}</button> <button class="button" :class="{ 'button-outline': activeTab != 'connection' }" @click="activeTab = 'connection'">{{ $t('connection.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'firmware' }" @click="activeTab = 'firmware'">{{ $t('firmware.tabTitle') }}</button> <button class="button" :class="{ 'button-outline': activeTab != 'system' }" @click="activeTab = 'system'">{{ $t('system.tabTitle') }}</button>
</div> </div>
<div v-if="activeTab == 'status'"> <div v-if="activeTab == 'status'">
@ -87,16 +87,6 @@
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3"> <div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
{{ $t('triggers.timeInternet') }} {{ $t('triggers.timeInternet') }}
</div> </div>
<label for="latlong">{{ $t('triggers.timeLatLong') }}</label>
<input type="text" id="latlong" v-model="triggers.time.latlong">
<div class="suboptions">
<label for="location" class="label-inline">{{ $t('triggers.timeLocation') }}</label>
<input type="text" id="location" v-model="triggers.time.location">
<button class="button" @click.prevent="searchLocation" :disabled="searchingLocation">{{ $t('triggers.timeLocationSearch') }}</button>
</div>
</fieldset> </fieldset>
<fieldset> <fieldset>
@ -156,15 +146,15 @@
</form> </form>
</div> </div>
<div v-if="activeTab == 'firmware'"> <div v-if="activeTab == 'system'">
<!-- <!--
Firmware tab System tab
--> -->
<form @submit.prevent="uploadFirmware" id="firmware"> <form @submit.prevent="uploadFirmware" id="system">
<fieldset> <fieldset>
<h3>{{ $t('firmware.title') }}</h3> <h3>{{ $t('system.firmwareTitle') }}</h3>
<input type="file" id="firmwareFile"> <input type="file" id="firmwareFile">
@ -177,6 +167,61 @@
</div> </div>
</fieldset> </fieldset>
</form> </form>
<form @submit.prevent="applySystem" id="system">
<fieldset>
<h3>{{ $t('system.ntpTitle') }}</h3>
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
{{ $t('triggers.timeInternet') }}
</div>
<label for="lat">{{ $t('system.ntpLat') }}</label>
<input type="text" id="lat" v-model="system.lat">
<label for="lng">{{ $t('system.ntpLng') }}</label>
<input type="text" id="lng" v-model="system.lng">
<div class="suboptions">
<label for="location" class="label-inline">{{ $t('system.ntpLocation') }}</label>
<input type="text" id="location" v-model="location">
<button class="button button-outline" @click.prevent="searchLocation" :disabled="searchingLocation">{{ $t('system.ntpLocationSearch') }}</button>
</div>
<h3>{{ $t('system.pinsTitle') }}</h3>
<label for="pinLEDAP">{{ $t('system.pinLEDAP') }}</label>
<input type="number" id="pinLEDAP" v-model.number="system.pins.ledAP">
<label for="pinLEDSTA">{{ $t('system.pinLEDSTA') }}</label>
<input type="number" id="pinLEDSTA" v-model.number="system.pins.ledSTA">
<label for="pinAPButton">{{ $t('system.pinAPButton') }}</label>
<input type="number" id="pinAPButton" v-model.number="system.pins.apButton">
<label for="pinPWMDriverSDA">{{ $t('system.pinPWMDriverSDA') }}</label>
<input type="number" id="pinPWMDriverSDA" v-model.number="system.pins.pwmSDA">
<label for="pinPWMDriverSCL">{{ $t('system.pinPWMDriverSCL') }}</label>
<input type="number" id="pinPWMDriverSCL" v-model.number="system.pins.pwmSCL">
<label for="pwmAddress">{{ $t('system.pwmAddress') }}</label>
<input type="number" id="pwmAddress" v-model.number="system.pwmAddress">
<label for="pwmFrequency">{{ $t('system.pwmFrequency') }}</label>
<input type="number" id="pwmFrequency" v-model.number="system.pwmFrequency">
<h3>{{ $t('system.mapsTitle') }}</h3>
<label for="mapsAPIKey">{{ $t('system.mapsAPIKey') }}</label>
<input type="number" id="mapsAPIKey" v-model.number="system.mapsAPIKey">
<span class="hint">{{ $t('system.mapsAPIKeyhint') }}</span>
<div class="buttons">
<input class="button-primary" type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
</div>
</fieldset>
</form>
</div> </div>
</div> </div>

View File

@ -39,9 +39,6 @@ var messages = {
tabTitle: 'Triggers', tabTitle: 'Triggers',
timeTitle: 'Time', timeTitle: 'Time',
timeInternet: 'Please note that time triggers require an internet connection.', timeInternet: 'Please note that time triggers require an internet connection.',
timeLatLong: 'Latitude / longitude',
timeLocation: 'Get latitude / longitude from location',
timeLocationSearch: 'Search',
motionTitle: 'Motion' motionTitle: 'Motion'
}, },
@ -69,9 +66,28 @@ var messages = {
hostnamePlaceholder: 'Default: mac address' hostnamePlaceholder: 'Default: mac address'
}, },
firmware: { system: {
tabTitle: 'Firmware', tabTitle: 'System',
title: 'Firmware update' ntpTitle: 'Time synchronisation (NTP)',
pinsTitle: 'Hardware pinout',
mapsTitle: 'Google Maps API',
firmwareTitle: 'Firmware update',
ntpLat: 'Latitude',
ntpLng: 'Longitude',
ntpLocation: 'Get latitude / longitude from location',
ntpLocationSearch: 'Search',
pinLEDAP: 'Access Point status LED pin (+3.3v)',
pinLEDSTA: 'Station Mode status LED pin (+3.3v)',
pinAPButton: 'Enable Access Point button pin (pull low)',
pinPWMDriverSDA: 'PCA9685 PWM driver SDA pin (data)',
pinPWMDriverSCL: 'PCA9685 PWM driver SCL pin (clock)',
pwmAddress: 'PCA9685 PWM driver I²C address',
pwmFrequency: 'PCA9685 PWM driver frequency',
mapsAPIKey: 'Google Maps API key',
mapsAPIKeyhint: 'Optional. Currently only used for translating a location name to it\'s latitude / longitude, which you will most likely only do once. Will work without an API key, but Google might throttle your request.'
} }
}, },
@ -115,9 +131,6 @@ var messages = {
tabTitle: 'Triggers', tabTitle: 'Triggers',
timeTitle: 'Tijd', timeTitle: 'Tijd',
timeInternet: 'Let op dat voor tijd triggers een internetverbinding vereist is.', timeInternet: 'Let op dat voor tijd triggers een internetverbinding vereist is.',
timeLatLong: 'Breedtegraad / lengtegraad',
timeLocation: 'Breedtegraad / lengtegraad ophalen op basis van locatie',
timeLocationSearch: 'Zoeken',
motionTitle: 'Beweging' motionTitle: 'Beweging'
}, },
@ -145,9 +158,28 @@ var messages = {
hostnamePlaceholder: 'Standaard: mac adres' hostnamePlaceholder: 'Standaard: mac adres'
}, },
firmware: { system: {
tabTitle: 'Firmware', tabTitle: 'Systeem',
title: 'Firmware bijwerken' ntpTitle: 'Tijd synchronisatie (NTP)',
pinsTitle: 'Hardware aansluitingen',
mapsTitle: 'Google Maps API',
firmwareTitle: 'Firmware bijwerken',
ntpLat: 'Breedtegraad',
ntpLng: 'Lengtegraad',
ntpLocation: 'Breedtegraad / lengtegraad ophalen op basis van locatie',
ntpLocationSearch: 'Zoeken',
pinLEDAP: 'Access Point status LED pin (+3.3v)',
pinLEDSTA: 'WiFi status LED pin (+3.3v)',
pinAPButton: 'Access Point inschakelen knop pin (actief laag)',
pinPWMDriverSDA: 'PCA9685 PWM driver SDA pin (data)',
pinPWMDriverSCL: 'PCA9685 PWM driver SCL pin (klok)',
pwmAddress: 'PCA9685 PWM driver I²C address',
pwmFrequency: 'PCA9685 PWM driver frequency',
mapsAPIKey: 'Google Maps API key',
mapsAPIKeyhint: 'Optioneel. Wordt op dit moment enkel gebruikt om een locatie te vertalen naar een breedte- / lengtegraad, wat je waarschijnlijk maar één keer nodig hebt. Werkt ook zonder API key, met de kans dat Google je verzoek tijdelijk niet toestaat.'
} }
} }
} }

View File

@ -22,8 +22,8 @@ $sliderValueColor: #808080;
$warningColor: #302f28; $warningColor: #302f28;
$warningBorderColor: #000000; $warningBorderColor: #000000;
$smallScreen: "screen and (max-width: 767px)";
$smallScreen: "screen and (min-width: 768px)"; $mediumScreen: "screen and (min-width: 768px)";
[v-cloak] [v-cloak]
@ -40,7 +40,7 @@ body
padding-bottom: 3rem; padding-bottom: 3rem;
@media #{$smallScreen} @media #{$mediumScreen}
{ {
padding-top: 3rem; padding-top: 3rem;
} }
@ -62,7 +62,7 @@ input, textarea
box-shadow: $containerShadow; box-shadow: $containerShadow;
border: solid 1px black; border: solid 1px black;
@media #{$smallScreen} @media #{$mediumScreen}
{ {
width: 768px; width: 768px;
margin-left: auto; margin-left: auto;
@ -83,9 +83,18 @@ input, textarea
.wifistatus .wifistatus
{ {
position: absolute; @media #{$smallScreen}
right: 0; {
top: 0; clear: both;
margin-top: 3rem;
}
@media #{$mediumScreen}
{
position: absolute;
right: 0;
top: 0;
}
.indicator .indicator
{ {
@ -149,6 +158,11 @@ h3
{ {
background-color: transparent; background-color: transparent;
} }
@media #{$smallScreen}
{
width: 100%;
}
} }
} }