A36 PCB1.1 软件工程整理

This commit is contained in:
2024-04-17 19:45:26 +08:00
commit 3401b91efc
3896 changed files with 4032291 additions and 0 deletions

View File

@ -0,0 +1,801 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "fr30xx.h"
#include "co_util.h"
#include "bt_types.h"
#include "me_api.h"
#include "hfg_api.h"
#include "gatt_api.h"
#include "app_at.h"
#include "app_task.h"
#include "app_ble.h"
#include "app_bt.h"
#include "app_audio.h"
#include "app_hw.h"
#include "btdm_mem.h"
#include "fdb_app.h"
#include "heap.h"
#include "app_ble.h"
#include "user_bt.h"
#include "user_ipc_st.h"
#include "dsp_mem.h"
#define AT_RECV_MAX_LEN 32
static uint8_t app_at_recv_char;
static uint8_t at_recv_buffer[AT_RECV_MAX_LEN];
static uint8_t at_recv_index = 0;
static uint8_t at_recv_state = 0;
void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data);
void btdm_host_vendor_cmd_cmp_evt(uint8_t status, uint8_t len, uint8_t const *param)
{
printf("status: 0x%02x.\r\n", status);
for (uint32_t i=0; i<len; i++) {
printf("%02x ", param[i]);
}
printf("\r\n");
}
void btdm_host_recv_vendor_evt(uint8_t len, uint8_t *param)
{
if (param[1] == 0x10) {
float acc[3];
memcpy((void *)&acc[0], &param[3], sizeof(float) * 3);
printf("%0.6f, \t%0.6f, \t%0.6f\r\n", acc[0], acc[1], acc[2]);
return;
}
//gsensor event:
// if (param[1] == 0x0A) {
// _gsensor_evt *evt = (_gsensor_evt *)&param[3];
// printf("EVENT: %d step:%d calorie:%d sleep:%d action:%d \n",evt->evt_id,evt->step,evt->calorie,evt->sleep,evt->action);
// }
// printf("EVENT: ");
// for (uint32_t i=0; i<len; i++) {
// printf("%02x ", param[i]);
// }
// printf("\r\n");
// if ((param[1] | (param[2]<<8)) == 0x000c)
{
// extern void fr_system_host_recv_vendor(uint8_t *recv_data,uint8_t len);
// fr_system_host_recv_vendor(param,len);
}
}
__RAM_CODE static void app_at_recv_cmd_A(uint8_t sub_cmd, uint8_t *data)
{
switch(sub_cmd)
{
case 'A':
{
uint8_t addr = ascii_strn2val((const char *)&data[0], 16, 2);
btdm_host_send_vendor_cmd(0x00, 1, &addr);
}
printf("OK\r\n");
break;
case 'B':
{
uint8_t buffer[2];
buffer[0] = ascii_strn2val((const char *)&data[0], 16, 2);
buffer[1] = ascii_strn2val((const char *)&data[3], 16, 2);
btdm_host_send_vendor_cmd(0x01, 2, (void *)&buffer[0]);
}
printf("OK\r\n");
break;
// case 'C':
// {
// uint32_t addr = ascii_strn2val((const char *)&data[0], 16, 8);
// btdm_host_send_vendor_cmd(0x02, 4, (void *)&addr);
// }
// printf("OK\r\n");
// break;
// case 'D':
// {
// uint32_t buffer[2];
// buffer[0] = ascii_strn2val((const char *)&data[0], 16, 8);
// buffer[1] = ascii_strn2val((const char *)&data[9], 16, 8);
// btdm_host_send_vendor_cmd(0x03, 8, (void *)&buffer[0]);
// }
// printf("OK\r\n");
// break;
case 'C':
{
btdm_host_send_vendor_cmd(0x15, 0, NULL);
}
printf("OK\r\n");
break;
case 'D':
// {
// uint8_t mode = ascii_strn2val((const char *)&data[0], 16, 2);
// btdm_host_send_vendor_cmd(0x14, 1, &mode);
// }
btdm_host_send_vendor_cmd(0x17, 0, NULL);
printf("OK\r\n");
break;
case 'E':
{
uint8_t sleep_dur[2];
sleep_dur[0] = ascii_strn2val((const char *)&data[0], 16, 2);
sleep_dur[1] = ascii_strn2val((const char *)&data[3], 16, 2);
btdm_host_send_vendor_cmd(0x16, 2, &sleep_dur);
}
break;
case 'F':
{
static uint8_t hour = 0;
static uint8_t minute = 0;
static uint8_t second = 0;
static uint16_t mini_second = 0;
uint8_t gsensor_cmd[] = {0x00, 0xe7, 0x07, 0x09, 0x12, 0x14, 0x36, 0x10, 0x20, 0x00, 0x2c, 0x01};
mini_second += 200;
if (mini_second >= 1000) {
mini_second = 0;
second++;
if (second >= 60) {
second = 0;
minute++;
if (minute >= 60) {
minute = 0;
hour++;
}
}
}
gsensor_cmd[5] = hour;
gsensor_cmd[6] = minute;
gsensor_cmd[7] = second;
gsensor_cmd[8] = mini_second;
gsensor_cmd[9] = mini_second >> 8;
btdm_host_send_vendor_cmd(0x12, sizeof(gsensor_cmd), gsensor_cmd);
}
break;
case 'G':
printf("hello world!\r\n");
break;
case 'H':
printf("VAL: 0x%08x.\r\n", *(volatile uint32_t *)ascii_strn2val((const char *)&data[0], 16, 8));
break;
case 'I':
*(volatile uint32_t *)ascii_strn2val((const char *)&data[0], 16, 8) = ascii_strn2val((const char *)&data[9], 16, 8);
printf("OK\r\n");
break;
case 'J':
printf("OOL VAL: 0x%02x.\r\n", ool_read(ascii_strn2val((const char *)&data[0], 16, 2)));
break;
case 'K':
ool_write(ascii_strn2val((const char *)&data[0], 16, 2), ascii_strn2val((const char *)&data[3], 16, 2));
printf("OK\r\n");
break;
case 'L':
printf("VAL: 0x%02x.\r\n", *(volatile uint8_t *)(ascii_strn2val((const char *)&data[0], 16, 8)));
break;
case 'M':
*(volatile uint8_t *)(ascii_strn2val((const char *)&data[0], 16, 8)) = ascii_strn2val((const char *)&data[9], 16, 2);
printf("OK\r\n");
break;
// case 'P':
// co_printf("VAL: 0x%02x.\r\n", *(uint8_t *)(MODEM_BASE + ascii_strn2val((const char *)&data[0], 16, 2)));
// break;
// case 'Q':
// *(uint8_t *)(MODEM_BASE + ascii_strn2val((const char *)&data[0], 16, 2)) = ascii_strn2val((const char *)&data[3], 16, 2);
// co_printf("OK\r\n");
// break;
// case 'S':
// co_printf("VAL: 0x%02x.\r\n", frspim_rd(FR_SPI_RF_COB_CHAN, ascii_strn2val((const char *)&data[0], 16, 2), 1));
// break;
// case 'T':
// frspim_wr(FR_SPI_RF_COB_CHAN, ascii_strn2val((const char *)&data[0], 16, 2), 1, ascii_strn2val((const char *)&data[3], 16, 2));
// co_printf("OK\r\n");
// break;
case 'U':
{
uint32_t *ptr = (uint32_t *)(ascii_strn2val((const char *)&data[0], 16, 8) & (~3));
uint8_t count = ascii_strn2val((const char *)&data[9], 16, 2);
uint32_t *start = (uint32_t *)((uint32_t)ptr & (~0x0f));
for(uint8_t i=0; i<count;) {
if(((uint32_t)start & 0x0c) == 0) {
printf("0x%08x: ", (uint32_t)start);
}
if(start < ptr) {
printf(" ");
}
else {
i++;
printf("%08x", *start);
}
if(((uint32_t)start & 0x0c) == 0x0c) {
printf("\r\n");
}
else {
printf(" ");
}
start++;
}
}
break;
case 'V':
flash_erase(QSPI0, ascii_strn2val((const char *)&data[0], 16, 8), ascii_strn2val((const char *)&data[9], 16, 8));
break;
case 'W':
{
uint32_t curr_free, min_free;
dsp_mem_get_usage(&curr_free, &min_free);
printf("DSP MEM: %d, %d\r\n", curr_free, min_free);
}
break;
case 'X':
{
void system_reset(void);
system_reset();
}
break;
case 'Y':
heap_dump_used_mem(ascii_strn2val((const char *)&data[0], 16, 2));
break;
case 'Z':
printf("MEM usage\r\n \
\tHEAP_TYPE_SRAM_BLOCK: %d, %d\r\n \
\tHEAP_TYPE_DRAM_BLOCK: %d, %d\r\n \
\tHEAP_TYPE_BTDM_BLOCK: %d, %d\r\n \
\tTOTAL USAGE: %d\r\n", \
heap_get_mem_usage(HEAP_TYPE_SRAM_BLOCK), heap_get_mem_usage_single(HEAP_TYPE_SRAM_BLOCK), \
heap_get_mem_usage(HEAP_TYPE_DRAM_BLOCK), heap_get_mem_usage_single(HEAP_TYPE_DRAM_BLOCK), \
heap_get_mem_usage(HEAP_TYPE_BTDM_BLOCK), heap_get_mem_usage_single(HEAP_TYPE_BTDM_BLOCK), \
heap_get_max_mem_usage());
break;
default:
break;
}
}
static void user_hci_callback(const BtEvent *event)
{
printf("event type = %d\r\n",event->eType);
if(event->eType == BTEVENT_COMMAND_COMPLETE){
btdm_free(event->p.meToken);
}
}
__RAM_CODE static void app_at_recv_cmd_B(uint8_t sub_cmd, uint8_t *data)
{
struct gap_ble_addr peer_addr;
BD_ADDR addr;
HfgResponse *rsp;
BtStatus status;
MeCommandToken *token;
uint16_t page_timeout = 0x400;
switch(sub_cmd) {
case 'A':
// AT#BA00
//app_ble_advertising_start(ascii_strn2val((const char *)&data[0], 16, 2));
break;
case 'B':
// AT#BB01
//app_ble_advertising_stop(ascii_strn2val((const char *)&data[0], 16, 2));
break;
case 'C':
app_ble_scan_start();
break;
case 'D':
app_ble_scan_stop();
break;
case 'E':
// AT#BE0123456789ab_01
peer_addr.addr.addr[5] = ascii_strn2val((const char *)&data[0], 16, 2);
peer_addr.addr.addr[4] = ascii_strn2val((const char *)&data[2], 16, 2);
peer_addr.addr.addr[3] = ascii_strn2val((const char *)&data[4], 16, 2);
peer_addr.addr.addr[2] = ascii_strn2val((const char *)&data[6], 16, 2);
peer_addr.addr.addr[1] = ascii_strn2val((const char *)&data[8], 16, 2);
peer_addr.addr.addr[0] = ascii_strn2val((const char *)&data[10], 16, 2);
peer_addr.addr_type = ascii_strn2val((const char *)&data[13], 16, 2);
app_ble_conn_start(&peer_addr);
break;
case 'F':
app_ble_conn_stop();
break;
#if BTDM_STACK_ENABLE_BT == 1
case 'H':
ME_Inquiry(BT_IAC_GIAC, 5, 5);
break;
case 'I':
ME_CancelInquiry();
break;
case 'J':
{
BtStatus status;
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
status = HFG_CreateServiceLink(&hfg_channel[0], &addr);
if (status == BT_STATUS_PENDING) {
printf("Opening Channel...\r\n");
} else {
printf("Could not open channel, status: %d\r\n", status);
}
}
break;
case 'K':
status = BT_STATUS_NO_RESOURCES;
rsp = (HfgResponse *)btdm_malloc(sizeof(HfgResponse));
if(rsp != NULL){
status = HFG_CreateCodecConnection(&hfg_channel[0], 1, rsp);
}
if(status != BT_STATUS_PENDING){
btdm_free((void *)rsp);
}
printf("status = %d\r\n",status);
break;
case 'L':
flashdb_del(FDB_KEY_BT_LINKKEY);
break;
case 'M':
token = btdm_malloc(sizeof(MeCommandToken));
token->p.general.in.hciCommand = 0x0c18;//HCC_WRITE_PAGE_TIMEOUT;
token->p.general.in.parmLen = 2;
token->p.general.in.parms = (uint8_t *)&page_timeout;
token->callback = user_hci_callback; //token is freed at this callback
status = ME_SendHciCommandAsync(token);
printf("status = %d\r\n",status);
break;
case 'N':
{
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
user_bt_env.connect_times = 3;
status = bt_connect(&addr);
printf("status = %d\r\n",status);
}
break;
#endif
case 'O':
// {
// uint8_t battery_level[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// struct gatt_send_event ntf[6];
// uint8_t i=0;
// for(i=0;i<6;i++){
// ntf[i].conidx = 0;
// ntf[i].svc_id = svc_id;
// ntf[i].att_idx = 2;
// ntf[i].data_len = 15;
// ntf[i].p_data = &battery_level[0];
// gatt_notification(&ntf[i]);
// }
// }
break;
case 'P':
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
bt_disconnect(&addr,false);
break;
case 'Q':
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
bt_disconnect(&addr,true);
break;
case 'R':
// ME_SetLocalDeviceName((const uint8_t *)"FR30xx_m", sizeof("FR30xx_m"));
//app_btdm_init();
break;
case 'S':
{
BtAccessModeInfo access_mode_nc = {
.inqInterval = 0x800,
.inqWindow = 0x12,
.pageInterval = 0x800,
.pageWindow = 0x12,
};
status = ME_SetAccessibleModeNC(BAM_GENERAL_ACCESSIBLE, &access_mode_nc);
printf("status = %d\r\n",status);
}
break;
case 'T':
{
status = ME_SetAccessibleModeNC(BAM_NOT_ACCESSIBLE, NULL);
printf("status = %d\r\n",status);
}
break;
}
printf("OK\r\n");
}
#include "user_bt_pbap.h"
uint8_t voltage_str[] = "AT+IPHONEACCEV=1,1,6";
uint8_t cmps_str[] = "AT+CPMS=?";
//bt hf&pbap related cmd
static void app_at_recv_cmd_C(uint8_t sub_cmd, uint8_t *data)
{
printf("%s \r\n", __func__);
BtStatus status;
uint8_t state;
BD_ADDR addr;
switch(sub_cmd) {
case 'A':
status = bt_answer_call(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
break;
case 'B':
status = bt_hang_up(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
break;
case 'C':
status = bt_redial(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
break;
case 'D':
{
//uint8_t number[] = "15907515643";
status = bt_dial_number(user_bt_env.last_active_index,&data[1],data[0]);
printf("status = %d\r\n",status);
}
break;
case 'E':
status = bt_list_current_calls(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
break;
case 'F':
status = bt_transfer_sco(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
break;
case 'G':
{
uint8_t dtmf = data[0];
status = bt_send_dtmf(user_bt_env.last_active_index,dtmf);
printf("status = %d\r\n",status);
}
break;
case 'H':
{
//vol---[0x00,0x0f]
uint8_t vol = ascii_strn2val((const char*)&data[0],16,2);
status = bt_report_spk_volume(user_bt_env.last_active_index,vol);
printf("status = %d\r\n",status);
}
break;
case 'I':
{
status = bt_send_hf_cmd(user_bt_env.last_active_index,voltage_str);
printf("status = %d\r\n",status);
}
break;
case 'J':
{
uint8_t enabled = ascii_strn2val((const char*)&data[0],16,2);
status = bt_enable_voice_recognition(user_bt_env.last_active_index, enabled);
printf("status = %d\r\n",status);
}
break;
case 'K':
printf("voice recog enabled : %d\r\n",bt_is_voice_rec_active(user_bt_env.last_active_index));
break;
case 'L':
//BD_ADDR addr;
//user_bt_env.dev[0].remote_bd;
#if BTDM_STACK_ENABLE_PBAP
state = user_bt_get_state(user_bt_env.last_active_index);
if(state >=BT_STATE_CONNECTED)
{
memcpy(&addr.A[0], &user_bt_env.dev[user_bt_env.last_active_index].remote_bd, 6);
//printf("%x%x%x%x%x%x\r\n",addr.A[0],addr.A[1],addr.A[2],addr.A[3],addr.A[4],addr.A[5]);
}
else {
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
}
status = PBAP_ClientConnect(&pbap_client[0],&addr);
printf("status = %d\r\n",status);
#endif
break;
case 'M':
#if BTDM_STACK_ENABLE_PBAP
status = PBAP_ClientDisconnect(&pbap_client[0]);
printf("status = %d\r\n",status);
#endif
break;
case 'N':
{
#if BTDM_STACK_ENABLE_PBAP
uint8_t pbName[64];
PbapPullPbParms parms;
memcpy(pbName,PB_LOCAL_MCH_NAME,sizeof(PB_LOCAL_MCH_NAME));
parms.pbName = pbName;
memset(parms.filter.byte,0,PBAP_FILTER_SIZE);
parms.filter.byte[0] = 0x84;
parms.listStartOffset = 0;
parms.maxListCount = 100; //0---search missed call and total pb size
parms.format= VCARD_FORMAT_30;
status = PBAP_PullPhonebook(&pbap_client[0], &parms);
printf("status = %d\r\n",status);
#endif
}
break;
case 'O':
{
#if BTDM_STACK_ENABLE_PBAP
PbapPullVcardListingParms parms;
uint8_t search_val[12]; //= "13262651013";
memcpy(search_val,&data[0],11);
uint8_t folder[] = "telecom/pb";
parms.folderName = folder;
parms.order = VCARD_SORT_ORDER_INDEXED;
parms.listStartOffset = 0x00;
parms.maxListCount = 4;
parms.searchAttribute = VCARD_SEARCH_ATTRIB_NUMBER;
parms.searchValue = (const char *)search_val;
status = PBAP_PullVcardListing(&pbap_client[0], &parms);
printf("status = %d\r\n",status);
#endif
}
break;
case 'P':
{
#if BTDM_STACK_ENABLE_PBAP
uint8_t pbName[64];
PbapPullPbParms parms;
memcpy(pbName,PB_LOCAL_STORE_NAME,sizeof(PB_LOCAL_STORE_NAME));
parms.pbName = pbName;
memset(parms.filter.byte,0,PBAP_FILTER_SIZE);
parms.filter.byte[0] = 0x07;//0x84;
parms.listStartOffset = 0;
parms.maxListCount = 20; //0---search missed call and total pb size
parms.format= VCARD_FORMAT_30;
status = PBAP_PullPhonebook(&pbap_client[0], &parms);
printf("status = %d\r\n",status);
#endif
}
break;
case 'R':
{
user_connect_pbap_client();
}
break;
case 'T':
{
user_pull_phonebook(0,0,25);
}
break;
case 'X':
{
uint8_t mute_str[] = "AT+CMUT=1";
status = bt_send_hf_cmd(user_bt_env.last_active_index,mute_str);
printf("status = %d\r\n",status);
}
break;
case 'Y':
{
flash_wr_test();
}
break;
case 'Q':
{
user_del_pbap_info();
}
break;
default:
break;
}
printf("OK\r\n");
}
///bt media related cmd
static void app_at_recv_cmd_E(uint8_t sub_cmd, uint8_t *data)
{
BD_ADDR addr;
BtStatus status;
switch(sub_cmd) {
case 'A':
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_PLAY, TRUE);
printf("status = %d\r\n",status);
break;
case 'B':
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_PAUSE, TRUE);
printf("status = %d\r\n",status);
break;
case 'C':
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_FORWARD, TRUE);
printf("status = %d\r\n",status);
break;
case 'D':
{
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_BACKWARD, TRUE);
printf("status = %d\r\n",status);
}
break;
case 'E':
{
printf("vol %d\r\n",data[0]);
uint8_t vol = data[0];//ascii_strn2val((const char*)&data[0],16,2);
status = bt_set_media_volume(user_bt_env.last_active_index,vol);
printf("status = %d %d\r\n",status,vol);
}
break;
case 'F':
{
status = bt_get_media_info(user_bt_env.last_active_index,0x41);
printf("status = %d\r\n",status);
}
break;
case 'G':
{
status = bt_get_playstatus(user_bt_env.last_active_index);
printf("status = %d\r\n",status);
}
break;
case 'H':
#if BTDM_STACK_ENABLE_SPP
addr.A[0] = ascii_strn2val((const char*)&data[0],16,2);
addr.A[1] = ascii_strn2val((const char*)&data[2],16,2);
addr.A[2] = ascii_strn2val((const char*)&data[4],16,2);
addr.A[3] = ascii_strn2val((const char*)&data[6],16,2);
addr.A[4] = ascii_strn2val((const char*)&data[8],16,2);
addr.A[5] = ascii_strn2val((const char*)&data[10],16,2);
status = spp_connect(&spp_dev[0],&addr);
printf("status = %d\r\n",status);
#endif
break;
case 'I':
#if BTDM_STACK_ENABLE_SPP
status = spp_disconnect(&spp_dev[0]);
printf("status = %d\r\n",status);
#endif
break;
case 'J':
{
#if BTDM_STACK_ENABLE_SPP
uint8_t test_data[] = {'1','2','3','4'};
status = spp_send(&spp_dev[0],test_data,sizeof(test_data));
printf("status = %d\r\n",status);
#endif
}
break;
default:
break;
}
printf("OK\r\n");
}
__RAM_CODE static void app_at_recv_cmd_D(uint8_t sub_cmd, uint8_t *data)
{
switch(sub_cmd) {
case 'A':
flash_erase(QSPI0, ascii_strn2val((const char*)&data[0],16,8), 0x1000);
break;
default:
break;
}
printf("OK\r\n");
}
__RAM_CODE void app_at_cmd_recv_handler(uint8_t *data, uint16_t length)
{
switch(data[0])
{
case 'A':
app_at_recv_cmd_A(data[1], &data[2]);
break;
case 'B':
app_at_recv_cmd_B(data[1], &data[2]);
break;
case 'C':
app_at_recv_cmd_C(data[1], &data[2]);
break;
case 'D':
app_at_recv_cmd_D(data[1], &data[2]);
break;
case 'E':
app_at_recv_cmd_E(data[1], &data[2]);
break;
default:
break;
}
}
static void app_at_recv_c(uint8_t c)
{
switch(at_recv_state)
{
case 0:
if(c == 'A')
{
at_recv_state++;
}
break;
case 1:
if(c == 'T')
at_recv_state++;
else
at_recv_state = 0;
break;
case 2:
if(c == '#')
at_recv_state++;
else
at_recv_state = 0;
break;
case 3:
at_recv_buffer[at_recv_index++] = c;
if((c == '\n')
||(at_recv_index >= AT_RECV_MAX_LEN))
{
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_AT_CMD, at_recv_index, false);
if(event) {
memcpy(event->param, at_recv_buffer, at_recv_index);
app_task_event_post(event, false);
}
at_recv_state = 0;
at_recv_index = 0;
}
break;
}
}
void app_at_rx_done(struct __UART_HandleTypeDef *handle)
{
app_at_recv_c(app_at_recv_char);
if (handle) {
uart_receive_IT(handle, &app_at_recv_char, 1);
}
}
void app_at_init(void)
{
hw_log_init(false);
uart_receive_IT(&uart_log_handle, &app_at_recv_char, 1);
}
void uart3_irq(void)
{
uart_IRQHandler(&uart_log_handle);
}
int fputc(int c, FILE *fp)
{
uart_transmit(&uart_log_handle, (void *)&c, 1);
return c;
}
void uart_transmit_byte(uint8_t *p,uint32_t len)
{
uart_transmit(&uart_log_handle, (void *)p, len);
}

View File

@ -0,0 +1,10 @@
#ifndef _APP_AT_H
#define _APP_AT_H
#include <stdint.h>
void app_at_cmd_recv_handler(uint8_t *data, uint16_t length);
void app_at_init(void);
#endif // _APP_AT_H

View File

@ -0,0 +1,140 @@
#include <assert.h>
#include "app_config.h"
#include "app_audio.h"
#include "dram_mem.h"
#include "audio_scene.h"
#include "co_list.h"
#include "fr_device_pa.h"
#define APP_AUDIO_DATA_READY_THD 6
#define APP_AUDIO_DATA_BUFFER_MAX 12
enum app_audio_mode_t {
APP_AUDIO_MODE_IDLE,
APP_AUDIO_MODE_A2DP_SINK,
APP_AUDIO_MODE_A2DP_SOURCE,
APP_AUDIO_MODE_SCO,
APP_AUDIO_MODE_TONE,
APP_AUDIO_MODE_VOICE_RECOGNIZE,
};
static enum app_audio_mode_t audio_mode = APP_AUDIO_MODE_IDLE;
static uint32_t audio_data_counter = 0;
static audio_scene_t *audio_scene;
static void app_audio_stop(void)
{
switch(audio_mode) {
case APP_AUDIO_MODE_A2DP_SINK:
app_audio_a2dp_sink_stop();
break;
case APP_AUDIO_MODE_SCO:
app_audio_sco_stop();
break;
default:
break;
}
}
void app_audio_a2dp_sink_start(audio_type_t audio_type, uint32_t sample_rate)
{
audio_scene_param_a2dp_sink_t param;
if (audio_mode == APP_AUDIO_MODE_A2DP_SINK) {
return;
}
if (audio_mode != APP_AUDIO_MODE_IDLE) {
app_audio_stop();
}
param.sample_rate = sample_rate;
param.channels = 2;
param.audio_type = audio_type;
param.hw_type = AUDIO_HW_TYPE_CODEC;
param.hw_base_addr = I2S0_BASE;
assert(audio_mode == APP_AUDIO_MODE_IDLE);
audio_scene = audio_scene_create(AUDIO_SCENE_TYPE_A2DP_SINK, &param);
assert(audio_scene != NULL);
audio_mode = APP_AUDIO_MODE_A2DP_SINK;
}
void app_audio_a2dp_sink_stop(void)
{
if (audio_mode == APP_AUDIO_MODE_A2DP_SINK) {
audio_scene_destroy(audio_scene);
audio_mode = APP_AUDIO_MODE_IDLE;
device_pa_disable();
}
}
void app_audio_a2dp_sink_play(uint8_t *buffer, uint32_t length)
{
if (audio_mode == APP_AUDIO_MODE_A2DP_SINK) {
if (audio_scene_dac_is_ready(audio_scene)) {
device_pa_enable();
}
audio_scene_recv_raw_data(audio_scene, true, buffer, length);
}
}
void app_audio_sco_start(audio_type_t audio_type,audio_sence_report_encoded_frame report_enc_cb, void *report_enc_arg)
{
audio_scene_param_sco_t param;
if (audio_mode == APP_AUDIO_MODE_SCO) {
return;
}
if (audio_mode != APP_AUDIO_MODE_IDLE) {
app_audio_stop();
}
if (audio_type == AUDIO_TYPE_MSBC) {
printf("SCO: msbc.\r\n");
param.sample_rate = 16000;
}
else {
printf("SCO: cvsd.\r\n");
param.sample_rate = 8000;
}
param.audio_type = audio_type;
param.hw_type = AUDIO_HW_TYPE_CODEC;
param.hw_base_addr = I2S0_BASE;
param.report_enc_cb = report_enc_cb;
param.report_enc_arg = report_enc_arg;
assert(audio_mode == APP_AUDIO_MODE_IDLE);
audio_scene = audio_scene_create(AUDIO_SCENE_TYPE_SCO, &param);
audio_mode = APP_AUDIO_MODE_SCO;
assert(audio_scene != NULL);
}
void app_audio_sco_stop(void)
{
if (audio_mode == APP_AUDIO_MODE_SCO) {
audio_scene_destroy(audio_scene);
audio_mode = APP_AUDIO_MODE_IDLE;
device_pa_disable();
}
}
void app_audio_sco_recv(bool valid, uint8_t audio_type, uint8_t *buffer, uint32_t length)
{
if (audio_mode == APP_AUDIO_MODE_SCO) {
if (audio_scene_dac_is_ready(audio_scene)) {
device_pa_enable();
}
if (audio_type == AUDIO_TYPE_MSBC) {
audio_scene_recv_raw_data(audio_scene, valid, buffer+2, length-3);
}
else {
audio_scene_recv_raw_data(audio_scene, valid, buffer, length);
}
}
}

View File

@ -0,0 +1,21 @@
#ifndef _APP_AUDIO_H
#define _APP_AUDIO_H
#include <stdint.h>
#include <stdbool.h>
#include "audio_common.h"
#include "audio_scene.h"
void app_audio_a2dp_sink_start(audio_type_t audio_type, uint32_t sample_rate);
void app_audio_a2dp_sink_stop(void);
void app_audio_a2dp_sink_play(uint8_t *buffer, uint32_t length);
void app_audio_sco_start(audio_type_t audio_type, audio_sence_report_encoded_frame report_enc_cb, void *report_enc_arg);
void app_audio_sco_stop(void);
void app_audio_sco_recv(bool valid, uint8_t audio_type, uint8_t *buffer, uint32_t length);
void app_audio_voice_recognize_start(void);
void app_audio_voice_recognize_stop(void);
#endif // _APP_AUDIO_H

View File

@ -0,0 +1,378 @@
#include <string.h>
#include "co_log.h"
#include "gap_api.h"
#include "gatt_api.h"
#include "fdb_app.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "portable.h"
#include "btdm_mem.h"
#include "ANCS_AMS_client.h"
#include "AMS_client.h"
#include "driver_gpio.h"
#include "hid_service.h"
#include "simple_gatt_service.h"
#include "ota_service.h"
#define APP_BLE_ADV_CHN_MAX 2
static void app_ble_start_advertising(uint8_t adv_chn);
char local_device_name[] = "Smart Watch";
static adv_handle adv[APP_BLE_ADV_CHN_MAX];
static uint16_t mtu_connected[8];
extern const uint8_t ble_static_addr[];
uint8_t slave_link_conidx;
/*
* Advertising data, max size is 28 bytes
*/
static uint8_t adv_data[] = {
#if 0
/* gatt service information */
0x03, //length of this AD
GAP_ADVTYPE_16BIT_MORE, //16bit service uuid AD type
//0xff, 0xf0, //value.service uuid:0xFFF0
LO_UINT16(0XFF72),
HI_UINT16(0XFF72),
#endif
/* local device name information */
0x0C, //length of this AD
GAP_ADVTYPE_LOCAL_NAME_COMPLETE, //complete name AD type
'S','m','a','r','t',' ','W','a','t','c','h', //value.local device name
0x09, // addr mac
GAP_ADVTYPE_MANUFACTURER_SPECIFIC,
LO_UINT16(0x1671),
HI_UINT16(0x1671),
0xc2,0x12,0x12,0x12,0x00,0x13,
0x03, // length of this data
GAP_ADVTYPE_APPEARANCE,
LO_UINT16(0x03c0),
HI_UINT16(0x03c0),
#if 0
// appearance
0x03, // length of this data
GAP_ADVTYPE_APPEARANCE,
LO_UINT16(GAP_APPEARE_HID_KEYBOARD),
HI_UINT16(GAP_APPEARE_HID_KEYBOARD),
#endif
};
/*
* Advertising scan response data, max size is 31 bytes
*/
static uint8_t adv_scan_rsp_data[] = {
#if 1
0x03, // length of this data
GAP_ADVTYPE_16BIT_COMPLETE,
LO_UINT16(HID_SERV_UUID),
HI_UINT16(HID_SERV_UUID),
#endif
#if 0
// Tx power level <20><><EFBFBD><EFBFBD><E4B9A6>
0x02, // length of this data
GAP_ADVTYPE_POWER_LEVEL,
0, // 0dBm
#endif
};
uint8_t service_id;
extern uint8_t slave_link_conidx;
uint16_t app_ble_get_mtu(uint8_t conidx)
{
return mtu_connected[conidx];
}
void app_ble_set_mtu(uint8_t conidx, uint16_t mtu)
{
mtu_connected[conidx] = mtu;
}
static uint16_t gap_callback(struct gap_event *event)
{
printf("gap_callback: type = %d\r\n", event->type);
switch(event->type) {
case GATT_EVT_PROFILE_ADDED:
{
printf("gap_callback: GATT_EVT_PROFILE_ADDED: 0x%02X\r\n", event->param.profile_added_status);
/* service profile has been added successfully, then the advertising can be started */
app_ble_start_advertising(0);
}
break;
case GAP_EVT_ADV_SET_PARAM:
printf("adv param set: 0x%02X\r\n", event->param.adv_set_param.status);
break;
case GAP_EVT_ADV_SET_ADV_DATA:
printf("adv data set: 0x%02X\r\n", event->param.adv_set_adv_data.status);
break;
case GAP_EVT_ADV_SET_SCAN_RSP:
printf("adv scan rsp data set: 0x%02X\r\n", event->param.adv_set_scan_rsp.status);
break;
case GAP_EVT_ADV_START:
printf("adv start :0x%02X\r\n", event->param.adv_start.status);
break;
case GAP_EVT_ADV_END:
printf("adv end: 0x%02X\r\n", event->param.adv_end.status);
break;
case GAP_EVT_SLAVE_CONNECT:
{
//gap_get_link_version(event->param.connect.conidx);
//gap_get_link_rssi(event->param.connect.conidx);
//gap_get_link_features(event->param.connect.conidx);
printf("slave connect[%d], connect num: %d\r\n", event->param.connect.conidx, gap_get_connect_num());
slave_link_conidx = event->param.connect.conidx;
//gatt_mtu_exchange_req(hid_svc_id, event->param.connect.conidx, 247);
//gap_security_req(event->param.connect.conidx);
#if BLE_PROFILE_ENABLE_ANCS
gatt_discovery_all_peer_svc(ANCS_AMS_client_id,event->param.connect.conidx);
#endif
}
break;
case GAP_EVT_DISCONNECT:
{
printf("gap_callback: GAP_EVT_DISCONNECT, conidx:%d, reason:0x%02X\r\n", event->param.disconnect.conidx,
event->param.disconnect.reason);
app_ble_start_advertising(0);
}
break;
case GATT_EVT_MTU:
printf("gap_callback: conidx: %d, GATT_EVT_MTU: %d\r\n", event->param.mtu_ind.conidx, event->param.mtu_ind.mtu);
app_ble_set_mtu(event->param.mtu_ind.conidx, event->param.mtu_ind.mtu);
//gap_security_req(event->param.connect.conidx);
break;
case GAP_EVT_SMP_ENCRYPT_SUCCESS:
printf("gap_callback: conidx: %d, GAP_EVT_SMP_ENCRYPT_SUCCESS \r\n", event->param.mtu_ind.conidx);
break;
case GAP_EVT_SMP_BOND_SUCCESS:
printf("gap_callback: conidx: %d, GAP_EVT_SMP_BOND_SUCCESS \r\n", event->param.mtu_ind.conidx);
#if BLE_PROFILE_ENABLE_ANCS
ancs_enable_src_notify(event->param.connect.conidx);
#endif
#if (BLE_PROFILE_ENABLE_HID)
hid_service_enable(event->param.connect.conidx);
#endif
#if 0
struct gap_link_param_update_req req;
req.conidx = event->param.connect.conidx;
req.intv_max = 12;
req.intv_min = 12;
req.latency = 30;
req.time_out = 140;
gap_param_update_req(&req);
#endif
//gap_conn_param_update((uint8_t)arg, 24, 24, 33, 500);
break;
case GAP_EVT_NAME_REQ:
{
gap_name_req_rsp(event->param.name_req.conidx,
event->param.name_req.token,
sizeof(local_device_name),
(uint8_t *)local_device_name);
}
break;
case GAP_EVT_APPEARANCE_REQ:
{
gap_appearance_req_rsp(event->param.appearance_req.conidx,
event->param.appearance_req.token,
GAP_APPEARE_HID_KEYBOARD);
}
break;
case GAP_EVT_LINK_PARAM_REQ:
{
struct gap_link_param_update_rsp rsp;
rsp.accept = true;
rsp.conidx = event->param.link_param_update_req.conidx;
rsp.ce_len_max = 2;
rsp.ce_len_min = 2;
gap_param_update_rsp(&rsp);
}
break;
case GAP_EVT_LINK_PARAM_UPDATE:
{
printf("conn param update,conidx:%d, con_int:%d, latency:%d, timeout%d\r\n", event->param.link_param_update.conidx,
event->param.link_param_update.con_interval,
event->param.link_param_update.con_latency,
event->param.link_param_update.sup_to);
//gap_security_req(event->param.connect.conidx);
}
break;
case GAP_EVT_LINK_RSSI:
printf("gap_callback: conidx: %d, GAP_EVT_LINK_RSSI: %d\r\n", event->param.gap_link_rssi.conidx, event->param.gap_link_rssi.link_rssi);
break;
case GAP_EVT_PHY_IND:
printf("gap_callback: conidx: %d, GAP_EVT_PHY_IND: %d\r\n", event->param.gap_phy_ind.conidx, event->param.gap_phy_ind.tx_phy);
break;
case GAP_EVT_PHY_REJECT:
printf("gap_callback: conidx: %d, GAP_EVT_PHY_REJECT, status: %d\r\n", event->param.gap_phy_update_reject.conidx, event->param.gap_phy_update_reject.status);
break;
case GAP_EVT_LINK_VER:
printf("gap_callback: conidx: %d, GAP_EVT_LINK_VER\r\n", event->param.gap_link_ver.conidx);
break;
case GAP_EVT_LINK_FEATURE:
printf("gap_callback: conidx: %d, GAP_EVT_LINK_FEATURE:%d\r\n", event->param.gap_link_feature.conidx, event->param.gap_link_feature.features[0]);
break;
default:
break;
}
return 0;
}
void app_ble_start_advertising(uint8_t adv_chn)
{
if (adv_chn < APP_BLE_ADV_CHN_MAX) {
if (adv[adv_chn] == NULL) {
struct gap_adv_param adv_param;
adv_param.adv_mode = GAP_ADV_MODE_UNDIRECT;
adv_param.disc_mode = GAP_ADV_DISC_MODE_GEN_DISC;
adv_param.filt_policy = GAP_ADV_FILTER_SCAN_ANY_CON_ANY;
adv_param.adv_chnl_map = GAP_ADV_CHAN_ALL;
adv_param.phy_mode = GAP_PHY_TYPE_LE_1M;
adv_param.own_addr_type = GAP_ADDR_TYPE_STATIC; // GAPM_GEN_RSLV_ADDR GAPM_STATIC_ADDR
adv_param.adv_intv_min = 1600;
adv_param.adv_intv_max = 1600;
adv[adv_chn] = gap_adv_create();
gap_adv_set_param(adv[adv_chn], &adv_param);
adv_data[17] = ble_static_addr[5];
adv_data[18] = ble_static_addr[4];
adv_data[19] = ble_static_addr[3];
adv_data[20] = ble_static_addr[2];
adv_data[21] = ble_static_addr[1];
adv_data[22] = ble_static_addr[0];
gap_adv_set_adv_data(adv[adv_chn], adv_data, sizeof(adv_data));
gap_adv_set_scan_rsp(adv[adv_chn], adv_scan_rsp_data, sizeof(adv_scan_rsp_data));
}
gap_adv_start(adv[adv_chn], 0, 0);
}
}
void app_ble_init(void)
{
printf("app_ble_init\r\n");
// gap_set_dev_appearance(GAP_APPEARE_HID_KEYBOARD);
/* set GAP event callback*/
gap_set_cb_func(gap_callback);
/* set security param */
struct gap_security_param smp_param;
smp_param.mitm = true;
smp_param.secure_connection = false;
smp_param.bond = true;
smp_param.oob_used = GAP_OOB_AUTH_DATA_NOT_PRESENT;
smp_param.io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;
smp_param.rsp_mode = ENABLE_AUTO_RSP;
gap_security_param_init(&smp_param);
/* add service profile, The GAP callback event is GATT_EVT_PROFILE_ADDED*/
//app_ble_add_service();
ota_gatt_add_service();
sp_gatt_add_service();
#if BLE_PROFILE_ENABLE_ANCS
ANCS_AMS_gatt_add_client();
#endif
#if BLE_PROFILE_ENABLE_HID
hid_gatt_add_service();
#endif
}
void app_ble_scan_start(void)
{
struct gap_scan_param param;
param.scan_type = GAP_SCAN_TYPE_GEN_DISC;
param.own_addr_type = GAP_ADDR_TYPE_STATIC;
param.phy_mode = GAP_PHY_TYPE_LE_1M;
param.dup_filt_pol = true;
param.scan_intv = 32;
param.scan_window = 20;
param.duration = 0;
gap_scan_start(&param);
}
void app_ble_scan_stop(void)
{
gap_scan_stop();
}
void app_ble_conn_start(struct gap_ble_addr *addr)
{
struct gap_conn_param conn_param;
conn_param.peer_addr.addr_type = addr->addr_type;
conn_param.peer_addr.addr.addr[0] = addr->addr.addr[0];
conn_param.peer_addr.addr.addr[1] = addr->addr.addr[1];
conn_param.peer_addr.addr.addr[2] = addr->addr.addr[2];
conn_param.peer_addr.addr.addr[3] = addr->addr.addr[3];
conn_param.peer_addr.addr.addr[4] = addr->addr.addr[4];
conn_param.peer_addr.addr.addr[5] = addr->addr.addr[5];
conn_param.own_addr_type = GAP_ADDR_TYPE_STATIC;
conn_param.phy_mode = GAP_PHY_TYPE_LE_1M;
conn_param.scan_intv = 32;
conn_param.scan_window = 32;
conn_param.conn_intv_min = 24;
conn_param.conn_intv_max = 24;
conn_param.supervision_to = 500;
conn_param.slave_latency = 0;
conn_param.ce_len_max = 2;
conn_param.ce_len_min = 2;
gap_conn_start(&conn_param);
}
void app_ble_conn_stop(void)
{
gap_conn_stop();
}

View File

@ -0,0 +1,19 @@
#ifndef _APP_BLE_H
#define _APP_BLE_H
#include <stdint.h>
#include "gap_api.h"
void app_ble_init(void);
void app_ble_advertising_start(uint8_t adv_chn);
void app_ble_advertising_stop(uint8_t adv_chn);
void app_ble_scan_start(void);
void app_ble_scan_stop(void);
void app_ble_conn_start(struct gap_ble_addr *addr);
void app_ble_conn_stop(void);
#endif // _APP_BLE_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
#ifndef _APP_BT_H
#define _APP_BT_H
#include "app_btdm.h"
#include "hf_api.h"
#include "me_api.h"
#include "a2dp_api.h"
#include "hfg_api.h"
#include "avrcp_api.h"
#include "hid_api.h"
#include "spp_api.h"
#include "pbap_api.h"
extern HfChannel *hf_channel;
extern HfgChannel *hfg_channel;
extern A2dpStream *Stream;
extern AvrcpChannel *rcpCtChannel;
extern AvrcpChannel *rcpTgChannel;
extern PbapClientSession *pbap_client;
extern SppDev *spp_dev;
uint8_t bt_get_free_hf_channel(void);
uint8_t bt_get_free_hfg_channel(void);
uint8_t bt_get_free_a2dp_stream(void);
uint8_t bt_get_free_avrcp_channel(void);
void app_bt_send_sco_data(void *channel, uint8_t seq, uint8_t *data, uint16_t length);
void app_bt_init(app_btdm_callback_t cb);
#endif // _APP_BT_H

View File

@ -0,0 +1,240 @@
#include "app_config.h"
#include "app_task.h"
#include "app_btdm.h"
#include "app_audio.h"
#include "app_ble.h"
#include "app_bt.h"
#include "user_bt.h"
#include "fr_device_pmu_io.h"
#include "fr_device_pmu_io.h"
#include "co_list.h"
#include "controller.h"
#include "host.h"
#include "btdm_mem.h"
#include "fdb_app.h"
#define SCO_DATA_BUFFER_COUNT 4
typedef int32_t app_btdm_ret_t;
struct sco_data_t {
struct co_list_hdr hdr;
void *arg;
uint16_t length;
uint8_t data[];
};
uint8_t bt_addr[] = {0x12, 0x00, 0x12, 0x12, 0x12, 0x12};
uint8_t ble_public_addr[] = {0x13, 0x00, 0x88, 0x12, 0x12, 0x12};
uint8_t ble_static_addr[] = {0x13, 0x66, 0x88, 0x12, 0x12, 0xc2};
static uint8_t sco_data_buffering = 0;
static struct co_list sco_data_list;
static void encoded_sco_frame_cb(void *arg, uint8_t *data, uint16_t length)
{
static uint16_t seq = 0;
if (sco_data_buffering) {
struct sco_data_t *sco_data;
sco_data = (void *)btdm_malloc(sizeof(struct sco_data_t) + length);
sco_data->arg = arg;
sco_data->length = length;
memcpy((void *)&sco_data->data[0], data, length);
co_list_push_back(&sco_data_list, &sco_data->hdr);
sco_data_buffering--;
if (sco_data_buffering == 0) {
sco_data = (void *)co_list_pop_front(&sco_data_list);
while (sco_data) {
//fputc('D', NULL);
app_bt_send_sco_data(sco_data->arg, seq++, sco_data->data, sco_data->length);
btdm_free((void *)sco_data);
sco_data = (void *)co_list_pop_front(&sco_data_list);
}
}
}
else {
//fputc('D', NULL);
app_bt_send_sco_data(arg, seq++, data, length);
}
}
static void btdm_callback(struct app_btdm_event_t *event)
{
switch(event->event) {
case APP_BTDM_EVT_A2DP_STREAM_STARTED:
if (event->param.a2dp_codec.codec_type == APP_BTDM_CODEC_SBC) {
app_audio_a2dp_sink_start(AUDIO_TYPE_SBC, event->param.a2dp_codec.sample_rate);
}
else if (event->param.a2dp_codec.codec_type == APP_BTDM_CODEC_AAC) {
app_audio_a2dp_sink_start(AUDIO_TYPE_AAC, event->param.a2dp_codec.sample_rate);
}
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_A2DP_ONGOING);
break;
case APP_BTDM_EVT_A2DP_STREAM_STOPPED:
app_audio_a2dp_sink_stop();
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_A2DP_ONGOING);
break;
case APP_BTDM_EVT_A2DP_STREAM_DATA:
app_audio_a2dp_sink_play(event->param.a2dp_data.buffer, event->param.a2dp_data.length);
break;
case APP_BTDM_EVT_SCO_CREATED:
sco_data_buffering = SCO_DATA_BUFFER_COUNT;
{
struct sco_data_t *sco_data;
sco_data = (void *)co_list_pop_front(&sco_data_list);
while (sco_data) {
btdm_free((void *)sco_data);
sco_data = (void *)co_list_pop_front(&sco_data_list);
}
}
if (event->param.sco_codec.codec_type == APP_BTDM_CODEC_mSBC) {
app_audio_sco_start(AUDIO_TYPE_MSBC, encoded_sco_frame_cb, event->param.sco_codec.hf_channel);
}
else {
app_audio_sco_start(AUDIO_TYPE_PCM, encoded_sco_frame_cb, event->param.sco_codec.hf_channel);
}
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_SCO_ONGOING);
break;
case APP_BTDM_EVT_SCO_REMOVED:
app_audio_sco_stop();
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_SCO_ONGOING);
break;
case APP_BTDM_EVT_SCO_DATA:
{
uint8_t audio_codec_type;
if (event->param.sco_data.codec_type == APP_BTDM_CODEC_mSBC) {
audio_codec_type = AUDIO_TYPE_MSBC;
}
else {
audio_codec_type = AUDIO_TYPE_PCM;
}
app_audio_sco_recv(event->param.sco_data.valid, audio_codec_type, event->param.sco_data.buffer, event->param.sco_data.length);
}
break;
default:
break;
}
}
void app_btdm_start(void)
{
app_ble_init();
#if BTDM_STACK_ENABLE_BT == 1
app_bt_init(btdm_callback);
user_bt_init();
#endif
}
void host_ready_cb(void)
{
struct app_task_event *event;
/* notify application BTDM stack is ready. */
event = app_task_event_alloc(APP_TASK_EVENT_HOST_INITED, 0, true);
app_task_event_post(event, false);
}
void app_btdm_init(void)
{
/*get bt addr*/
#if BT_ADDR_RANDOM_ENABLE | BLE_ADDR_RANDOM_ENABLE
uint8_t rand_num[4];
if(flashdb_get(FDB_KEY_USER_RANDOM_SEED, (void *)&rand_num[0], 4) != 0){
#if BT_ADDR_RANDOM_ENABLE
memcpy((void *)&bt_addr[0],rand_num,4);
#endif
#if BLE_ADDR_RANDOM_ENABLE
memcpy((void *)&ble_static_addr[0],rand_num,4);
#endif
}
#endif
/* prepare for BTDM stack */
#if CONTROLLER_CODE_LOAD_MODE == CONTROLLER_CODE_LOAD_MODE_XIP_RO
#if CONTROLLER_CODE_INC_SENSOR_HUB
extern uint8_t CONTROLLER_CODE_SPLIT_OTA_BASE;
uint32_t controller_code_base_addr = (uint32_t)&CONTROLLER_CODE_SPLIT_OTA_BASE;
#else
extern uint8_t CONTROLLER_CODE_OTA_BASE;
uint32_t controller_code_base_addr = (uint32_t)&CONTROLLER_CODE_OTA_BASE;
#endif
controller_start(BTDM_STACK_HCI_BAUDRATE, ble_public_addr, bt_addr, controller_code_base_addr);
#elif CONTROLLER_CODE_LOAD_MODE == CONTROLLER_CODE_LOAD_MODE_FIX_ADDRESS
controller_start(BTDM_STACK_HCI_BAUDRATE, ble_public_addr, bt_addr, CONTROLLER_CODE_FIX_ADDRESS | FLASH_DAC_BASE);
#else
#error "choose correct CONTROLLER_CODE_LOAD_MODE"
#endif
#if BTDM_STACK_ENABLE_BT == 1
host_btdm_start(BTDM_STACK_HCI_BAUDRATE, HOST_TASK_STACK_SIZE, HOST_TASK_PRIORITY, ble_static_addr);
#else
host_ble_start(BTDM_STACK_HCI_BAUDRATE, HOST_TASK_STACK_SIZE, HOST_TASK_PRIORITY, ble_static_addr);
#endif
/* init MCU->BT pin, configure PMU_PIN_8 output BBG_EN signal */
ool_write(PMU_REG_DIAG_CTRL, 0x82);
ool_write(PMU_REG_PIN_IOMUX_H, 0x03);
/* disable PMU pin input as default setting */
ool_write16(PMU_REG_PIN_INPUT_EN, (PMU_IO_INTTERUPT_DEFAULT<<2) | 0x0002);
/* PP1 is connected to ARST of 1010, this pin is low in sleep mode */
ool_write16(PMU_REG_PIN_PULL_EN, 0x3ffd);
ool_write16(PMU_REG_PIN_PULL_SEL, 0x3fff);
/* init BT->MCU pin, system should not enter sleep mode when this pin is low level */
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_TYPE_HCI_RX);
pmu_gpio_int_init(PMU_PIN_9, PMU_GPIO_PULL_UP, 0);
pmu_enable_isr(PMU_GPIO_PMU_INT_MSK_BIT);
NVIC_SetPriority(PMU_IRQn, 4);
NVIC_EnableIRQ(PMU_IRQn);
}
app_btdm_ret_t app_btdm_ble_adv_start(uint16_t dur)
{
return -1;
}
app_btdm_ret_t app_btdm_ble_adv_stop(void)
{
return -1;
}
app_btdm_ret_t app_btdm_ble_disconnect(void)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_access_mode_set(uint8_t mode)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_scan_start(uint16_t dur)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_scan_stop(void)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_connect(uint8_t *peer_addr)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_disconnect(void)
{
return -1;
}
app_btdm_ret_t app_btdm_bt_profile_enable(uint16_t profiles)
{
return -1;
}
const uint8_t *app_get_bt_addr(void)
{
return bt_addr;
}

View File

@ -0,0 +1,67 @@
#ifndef _APP_BTDM_H
#define _APP_BTDM_H
#include <stdint.h>
#include <stdbool.h>
enum {
APP_BTDM_EVT_BLE_CONNECTED,
APP_BTDM_EVT_BLE_DISCONNECTED,
APP_BTDM_EVT_BT_CONNECTED,
APP_BTDM_EVT_BT_DISCONNECTED,
APP_BTDM_EVT_HF_INCOMING,
APP_BTDM_EVT_HF_CALL_ACTIVE,
APP_BTDM_EVT_HF_CALL_REMOVE,
APP_BTDM_EVT_A2DP_STREAM_STARTED,
APP_BTDM_EVT_A2DP_STREAM_STOPPED,
APP_BTDM_EVT_A2DP_STREAM_DATA,
APP_BTDM_EVT_AVRCP_VOL_CHANGE,
APP_BTDM_EVT_AVRCP_NEXT,
APP_BTDM_EVT_AVRCP_PREV,
APP_BTDM_EVT_AVRCP_PAUSE,
APP_BTDM_EVT_AVRCP_FAST_FORWARD,
APP_BTDM_EVT_AVRCP_FAST_BACKWARD,
APP_BTDM_EVT_SCO_CREATED,
APP_BTDM_EVT_SCO_REMOVED,
APP_BTDM_EVT_SCO_DATA,
};
enum {
APP_BTDM_CODEC_SBC,
APP_BTDM_CODEC_AAC,
APP_BTDM_CODEC_mSBC,
APP_BTDM_CODEC_PCM,
APP_BTDM_CODEC_UNKNOWN,
};
struct app_btdm_event_t {
uint8_t event;
union {
struct {
uint8_t *buffer;
uint32_t length;
} a2dp_data;
struct {
uint8_t codec_type;
uint32_t sample_rate;
} a2dp_codec;
struct {
bool valid;
uint8_t codec_type;
uint8_t *buffer;
uint32_t length;
} sco_data;
struct {
void *hf_channel;
uint8_t codec_type;
} sco_codec;
} param;
};
typedef void (*app_btdm_callback_t)(struct app_btdm_event_t *e);
void app_btdm_start(void);
void app_btdm_init(void);
const uint8_t *app_get_bt_addr(void);
#endif // _APP_BTDM_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
#ifndef __APP_HW_H__
#define __APP_HW_H__
#include "fr30xx.h"
extern UART_HandleTypeDef uart_log_handle;
extern DMA_HandleTypeDef dma_display_handle;
extern SPI_HandleTypeDef spi_display_handle;
extern I2C_HandleTypeDef i2c_touchpad_handle;
extern SPI_HandleTypeDef spi_flash_handle;
extern DMA_HandleTypeDef dma_flash_handle;
void hw_log_init(bool wake_up);
void hw_display_init(bool wake_up);
void hw_touchpad_init(bool wake_up);
void hw_psram_init(bool wake_up);
void hw_external_flash_init(bool wake_up);
void hw_xip_flash_init(bool wake_up);
void hw_dsp_xip_flash_init(bool wake_up);
void hw_clock_init(void);
void hw_gpio_save(void);
void hw_gpio_restore(void);
void hw_dsp_restore(void);
#endif // __APP_HW_H__

View File

@ -0,0 +1,38 @@
#include <stdio.h>
#include "co_log.h"
#include <stdarg.h>
#include "FreeRTOS.h"
#include "semphr.h"
static SemaphoreHandle_t printMutex;
void init_printf_mutex(void)
{
printMutex = xSemaphoreCreateMutex();
if (printMutex == NULL) {
}
}
//线程安全打印接口
void thread_safe_printf(const char *format, ...)
{
va_list args;
va_start(args, format);
if(xPortIsInsideInterrupt()) {
if (xSemaphoreTakeFromISR(printMutex, NULL)) {
vprintf(format, args);
xSemaphoreGiveFromISR(printMutex, NULL);
}
}else
{
if (xSemaphoreTake(printMutex, portMAX_DELAY)) {
vprintf(format, args);
xSemaphoreGive(printMutex);
}
}
va_end(args);
}

View File

@ -0,0 +1,12 @@
#ifndef _APP_LOG_H
#define _APP_LOG_H
void init_printf_mutex(void);
void thread_safe_printf(const char *format, ...) ;
#define app_printf thread_safe_printf
#endif

View File

@ -0,0 +1,955 @@
#include "fr30xx.h"
#include "driver_display.h"
#include "driver_touchpad.h"
#include "driver_psram.h"
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "co_util.h"
/* little file system */
#include "lfs_port.h"
/* LVGL includes */
#include "demos/lv_demos.h"
#include "app_config.h"
#include "app_lvgl.h"
#include "app_hw.h"
#include "fr_device_rtc.h"
#include "fr_device_encode.h"
#include "fr_device_vbat.h"
//task queue
#define GUI_TASK_QUEUE_LENGTH ( 64 )
#define SYS_TASK_QUEUE_LENGTH ( 64 )
//lvgl define
#if BOARD_SEL == BOARD_EVB_FR5090
#define LCD_HOR_SIZE (466)
#define LCD_VER_SIZE (466)
#elif BOARD_SEL == BOARD_EVB_FR3092E
#if 0 //DISPLAY_TYPE_ICNA3310
#define LCD_HOR_SIZE (466)
#define LCD_VER_SIZE (466)
#else
#define LCD_HOR_SIZE LV_HOR_RES_MAX
#define LCD_VER_SIZE LV_VER_RES_MAX
#endif
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
#define LCD_HOR_SIZE (368)
#define LCD_VER_SIZE (448)
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
#define LCD_HOR_SIZE LV_HOR_RES_MAX
#define LCD_VER_SIZE LV_VER_RES_MAX
#else
#error "choose correct board"
#endif
#if (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) & 0x01)
#define HOR_OFFSET (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) + 0x01)
#else
#define HOR_OFFSET (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) + 0x00)
#endif
#if (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) & 0x01)
#define VER_OFFSET (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) + 0x01)
#else
#define VER_OFFSET (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) + 0x00)
#endif
#define LV_HOR_RES_MAX_ZOOM 258
#define LV_VER_RES_MAX_ZOOM 314
//#define IMG_BUFFER_VER 262
//#define DISPLAY_BUFFER_SIZE LV_HOR_RES_MAX*IMG_BUFFER_VER*LV_COLOR_DEPTH/8/sizeof(uint32_t)
#define DISPLAY_BUFFER_SIZE LV_HOR_RES_MAX*LV_VER_RES_MAX*LV_COLOR_DEPTH/8/sizeof(uint32_t)
#define DISPLAY_PSRAM_SIZE LV_HOR_RES_MAX*LV_VER_RES_MAX*LV_COLOR_DEPTH/8
#define DISPLAY_BLOCK_LINE DECODE_LINE_NUMBER
#define DISPLAY_BUFFER_20_LINE LV_HOR_RES_MAX*DISPLAY_BLOCK_LINE*LV_COLOR_DEPTH/8/sizeof(uint32_t)
DMA_HandleTypeDef dma_psram_handle;
/* used for DMA display */
static volatile bool display_dma_ongoing = false;
/* LVGL display buf enviroment */
static lv_disp_draw_buf_t disp_buf;
static lv_disp_drv_t * last_disp;
lv_indev_t * indev_keypad;
uint8_t key_code;
uint32_t display_framebuffer_block[DISPLAY_BUFFER_20_LINE+16];
uint32_t framebuffer_block_len = (DISPLAY_BUFFER_20_LINE+16) << 2;
//uint32_t display_framebuffer_bk[LV_HOR_RES_MAX*LV_VER_RES_MAX/2];
uint32_t display_framebuffer[DISPLAY_BUFFER_SIZE];
uint32_t display_framebuffer1[DISPLAY_BUFFER_SIZE];
//#define display_framebuffer1 display_framebuffer
#define LOAD_ORIG_FRAMEBUFFER (void *)PSRAM_DAC_BASE
#define LOAD_LEFT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE + DISPLAY_PSRAM_SIZE)
#define LOAD_RIGHT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE + DISPLAY_PSRAM_SIZE*2)
static QueueHandle_t gui_queue_handle;
static QueueHandle_t app_queue_handle;
static TaskHandle_t gui_task_Handle = NULL;
//过场特效的背景对<E699AF>?
const lv_img_dsc_t fetch_orig_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX,
.header.h = LV_VER_RES_MAX,
.data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = (const uint8_t *)display_framebuffer1,//(void *)PSRAM_DAC_BASE,
};
const lv_img_dsc_t fetch_orig_zoom_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX_ZOOM,
.header.h = LV_VER_RES_MAX_ZOOM,
.data_size = LV_HOR_RES_MAX_ZOOM * LV_VER_RES_MAX_ZOOM * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = (const uint8_t *)display_framebuffer1,//(void *)PSRAM_DAC_BASE,
};
const lv_img_dsc_t fetch_left_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX,
.header.h = LV_VER_RES_MAX,
.data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = LOAD_LEFT_FRAMEBUFFER,
};
const lv_img_dsc_t fetch_right_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX,
.header.h = LV_VER_RES_MAX,
.data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = LOAD_RIGHT_FRAMEBUFFER,
};
const lv_img_dsc_t fetch_disp_buf_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX,
.header.h = LV_VER_RES_MAX,
.data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = (const uint8_t *)display_framebuffer,
};
const lv_img_dsc_t fetch_disp_buf_zoom_img = {
.header.always_zero = 0,
.header.w = LV_HOR_RES_MAX_ZOOM,
.header.h = LV_VER_RES_MAX_ZOOM,
.data_size = LV_HOR_RES_MAX_ZOOM * LV_VER_RES_MAX_ZOOM * LV_COLOR_SIZE / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR,
.header.reserved = 0,
.data = (const uint8_t *)display_framebuffer1 + (LV_HOR_RES_MAX * LV_VER_RES_MAX)
};
extern bool fetch_orig_buffer_flag;
extern bool fetch_orig_buffer_zoom_flag;
extern bool exit_disp_flush_flag;
extern bool fetch_disp_buffer_flag;
extern bool fetch_disp_buffer_zoom_flag;
void fr_app_mainUI0_func(lv_obj_t *parent);
void lv_prj_main(void);
static void setup_gui_running(void);
//----------------------------------------------------
//lvgl function
//----------------------------------------------------
// this function is when frame data is flushed
static void my_disp_flush_done(void)
{
lv_disp_flush_ready(last_disp);
}
void lv_disp_draw_buf_sw(bool sw)
{
lv_disp_t *disp = lv_disp_get_default();
if(disp == NULL) return;
disp->driver->full_refresh = 1;
if(sw)
{
lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX);
//printf("display_framebuffer \n");
}
else
{
lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer_block, NULL, LV_HOR_RES_MAX * DISPLAY_BLOCK_LINE);
//printf("display_framebuffer_block \n");
}
lv_disp_drv_update(disp, disp->driver);
}
void lv_disp_buffer_copy(void)
{
//fputc('<', NULL);
volatile uint32_t * dst = display_framebuffer1;
volatile uint32_t * src = display_framebuffer;
for (uint32_t i=0; i<DISPLAY_PSRAM_SIZE/sizeof(uint32_t); i++) {
*dst++ = *src++;
}
//fputc('>', NULL);
}
bool lv_fetch_disp_buffer_func(const lv_area_t * area)
{
volatile uint32_t *dst ;
volatile uint32_t *src ;
// uint8_t * b_dst;
// uint8_t * b_src;
uint32_t i,j;
if(fetch_orig_buffer_zoom_flag)
{
//printf("disp w:%d,x:%d, h:%d,y:%d \n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1);
//fputc('[', NULL);
// b_dst = (uint8_t *)display_framebuffer1;
// b_src = (uint8_t *)display_framebuffer;
// b_src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) * 2;
// for (i = 0; i < LV_VER_RES_MAX_ZOOM; i++)
// {
// memcpy(b_dst, b_src, LV_HOR_RES_MAX_ZOOM * 2);
// b_src += LV_HOR_RES_MAX * 2;
// b_dst += LV_HOR_RES_MAX_ZOOM * 2;
// }
dst = display_framebuffer1;
src = display_framebuffer;
src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) / 2;
for (i = 0; i < LV_VER_RES_MAX_ZOOM; i++)
{
for (j=0; j < LV_HOR_RES_MAX_ZOOM / 2; j++)
{
*dst++ = *src++;
}
src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 2;
}
//fputc(']', NULL);
}
if(fetch_disp_buffer_flag)
{
//printf("disp w:%d,x:%d, h:%d,y:%d \n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1);
//printf("load disp buffer \n");
// dst = LOAD_LEFT_FRAMEBUFFER;
// src = display_framebuffer;
// for (i=0; i<DISPLAY_PSRAM_SIZE/sizeof(uint32_t); i++) {
// *dst++ = *src++;
// }
}
if(fetch_disp_buffer_zoom_flag)
{
//fputc('(', NULL);
// //img 2 address offset
// b_dst = (uint8_t *)display_framebuffer1;
// b_dst += (LV_HOR_RES_MAX * LV_VER_RES_MAX);
// b_src = (uint8_t *)display_framebuffer_block;
// uint16_t h = (area->y2 - area->y1 + 1);
// // printf("1 addr :%x \n",b_src);
// if(area->y1 <= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))
// {
// b_src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) * 2;
// h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2);
// }
// else
// {
// // printf("dst height :%d \n",(area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)));
// b_dst += (LV_HOR_RES_MAX_ZOOM * (area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) * 2);
// b_src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM);
// if((area->y2 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) >= LV_VER_RES_MAX_ZOOM)
// {
// if(h >= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))
// {
// h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2);
// }
// else
// {
// h = 0;
// }
// }
// }
// // printf("next w:%d,x:%d, h:%d,y1:%d y2:%d, h:%d\n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1,area->y2, h);
// // printf("2 addr :%x d addr %d\n",b_src, b_dst);
// for (i = 0; i < h; i++)
// {
// memcpy(b_dst, b_src, LV_HOR_RES_MAX_ZOOM * 2);
// b_src += LV_HOR_RES_MAX * 2;
// b_dst += LV_HOR_RES_MAX_ZOOM * 2;
// }
dst = display_framebuffer1;
dst += (LV_HOR_RES_MAX * LV_VER_RES_MAX) / 4;
src = display_framebuffer_block;
int16_t h = (area->y2 - area->y1 + 1);
// printf("1 addr :%x \n",b_src);
if(area->y1 <= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))
{
src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) / 2;
h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2);
}
else
{
// printf("dst height :%d \n",(area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)));
dst += (LV_HOR_RES_MAX_ZOOM * (area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) / 2);
src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 4;
if((area->y2 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) >= LV_VER_RES_MAX_ZOOM)
{
if(h >= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))
{
h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2);
}
else
{
h = 0;
}
}
}
// printf("next w:%d,x:%d, h:%d,y1:%d y2:%d, h:%d\n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1,area->y2, h);
// printf("2 addr :%x d addr %d\n",b_src, b_dst);
for (i = 0; i < h; i++)
{
for (j=0; j < LV_HOR_RES_MAX_ZOOM / 2; j++)
{
*dst++ = *src++;
}
src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 2;
}
//fputc(')', NULL);
}
if(fetch_disp_buffer_flag || fetch_orig_buffer_flag ||fetch_orig_buffer_zoom_flag ||fetch_disp_buffer_zoom_flag)
{
if(fetch_disp_buffer_flag)
{
lv_disp_draw_buf_sw(0);
}
else if(fetch_disp_buffer_zoom_flag)
{
if(area->y2 + 1 != LV_VER_RES_MAX)
{
return false;
}
else
{
lv_disp_draw_buf_sw(1);
}
}
fetch_disp_buffer_flag = false;
fetch_orig_buffer_flag = false;
fetch_orig_buffer_zoom_flag = false;
fetch_disp_buffer_zoom_flag = false;
return false;
}
if(exit_disp_flush_flag)
{
return false;
}
return true;
}
void* get_display_buffer1(void)
{
return display_framebuffer1;
}
extern bool display_te_status(void);
extern uint8_t volatile te_sign;
#include <stdio.h>
__RAM_CODE void convert_rgb565_to_bgr565(const uint16_t* rgb565_data, uint16_t* bgr565_data, uint32_t num_pixels) {
for (uint32_t i = 0; i < num_pixels; i++) {
uint16_t pixel = rgb565_data[i];
uint16_t bgr_pixel = ((pixel & 0x001F) << 11) | ((pixel & 0x07E0)) | ((pixel & 0xF800) >> 11);
bgr565_data[i] = bgr_pixel;
}
}
uint32_t last_time=0;
extern void uart_transmit_byte(uint8_t *buf,uint32_t len);
extern uint32_t get_system_dwt_value(void);
static void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
{
static uint32_t flush_last_time=0;
static uint8_t flags=0;
#if 1
//printf("disp:%d\r\n",(get_system_dwt_value()-flush_last_time)/192);
#if BOARD_SEL == BOARD_EVB_FR3092E_RGB
if(area->y1 == 0)
{
while(!te_sign)
{
// vTaskDelay(1);
}
}
uint32_t time1 = get_system_dwt_value();
#if 0
for(int i=area->y1; i<= area->y2; i++) //19ms
{
uint16_t *pColor = &(((uint16_t*)display_framebuffer1)[i*480]);
for(int j=area->x1; j<= area->x2; j++)
{
pColor[j] = rgb565_to_bgr(color_p[(i-area->y1)*(area->x2-area->x1+1)+(j-area->x1)].full);
//pColor[j] =(color_p[(i-area->y1)*(area->x2-area->x1+1)+(j-area->x1)].full);
}
}
#else
memcpy((uint8_t*)display_framebuffer1,(uint8_t*)color_p,(area->x2+1-area->x1)*(area->y2+1-area->y1)*2); //3ms
//convert_rgb565_to_bgr565((uint16_t*)color_p,(uint16_t*)display_framebuffer1,(area->x2+1-area->x1)*(area->y2+1-area->y1));//9ms
uint32_t time2 = get_system_dwt_value();
//printf("time:%d\r\n",(time2-time1)/192);
#endif
//
lv_disp_flush_ready(disp);
//last_time = get_system_dwt_value();
#else
// if(!lv_fetch_disp_buffer_func(area))
// {
// lv_disp_flush_ready(disp);
// return;
// }
while(display_dma_ongoing);
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING);
display_dma_ongoing = true;
last_disp = disp;
//while(!display_te_status());
display_set_window(area->x1,
area->x2,
area->y1,
area->y2);
#if LV_COLOR_DEPTH == 16
//last_time = get_system_dwt_value();
display_update_dma((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p);
flush_last_time = get_system_dwt_value();
//display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p);
lv_disp_flush_ready(disp);
#elif LV_COLOR_DEPTH == 32
display_update_dma((area->x2+1-area->x1)*(area->y2+1-area->y1), 32, (void *)color_p);
#endif
#endif
#else
display_set_window(HOR_OFFSET+area->x1,
HOR_OFFSET+area->x2,
VER_OFFSET+area->y1,
VER_OFFSET+area->y2);
#if LV_COLOR_DEPTH == 16
display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p);
#elif LV_COLOR_DEPTH == 32
display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 32, (void *)color_p);
#endif
lv_disp_flush_ready(disp);
#endif
}
static void my_touchpad_read(struct _lv_indev_drv_t * indev, lv_indev_data_t * data)
{
// uint8_t buffer[8];
//
// touchpad_read_data_raw(buffer, 8);
// data->state = (buffer[2] != 0) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
// if(data->state == LV_INDEV_STATE_PR) {
// data->point.x = ((buffer[3]&0x0f)<<8) | buffer[4];
// data->point.y = ((buffer[5]&0x0f)<<8) | buffer[6];
// }
int16_t x, y;
bool pressed;
pressed = touchpad_read(&x, &y);
if (pressed) {
if ((x < HOR_OFFSET)
|| (x >= HOR_OFFSET + LV_HOR_RES_MAX)
|| (y < VER_OFFSET)
|| (y >= (VER_OFFSET + LV_VER_RES_MAX))) {
data->state = LV_INDEV_STATE_REL;
}
else {
data->state = LV_INDEV_STATE_PR;
data->point.x = x - HOR_OFFSET;
data->point.y = y - VER_OFFSET;
//printf("x:%d,y:%d\n",data->point.x,data->point.y);
}
setup_gui_running();
}
else
{
data->state = LV_INDEV_STATE_REL;
}
}
static uint32_t keypad_get_key(void)
{
/*Your code comes here*/
return key_code;
}
/*Will be called by the library to read the mouse*/
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static uint32_t last_key = 0;
/*Get the current x and y coordinates*/
//mouse_get_xy(&data->point.x, &data->point.y);
/*Get whether the a key is pressed and save the pressed key*/
uint32_t act_key = keypad_get_key();
if(act_key != 0) {
data->state = LV_INDEV_STATE_PR;
/*Translate the keys to LVGL control characters according to your key definitions*/
switch(act_key) {
case 1:
act_key = LV_KEY_NEXT;
break;
case 2:
act_key = LV_KEY_PREV;
break;
case 3:
act_key = LV_KEY_LEFT;
break;
case 4:
act_key = LV_KEY_RIGHT;
break;
case 5:
act_key = LV_KEY_ENTER;
break;
}
last_key = act_key;
//printf("keypad_read =================act_key =%d ,last_key %d keydown \r\n",act_key,last_key);
} else {
data->state = LV_INDEV_STATE_REL;
}
data->key = last_key;
}
bool touchpad_state(void)
{
int16_t x, y;
return touchpad_read(&x, &y);
}
lv_group_t *keypad_group; //按键组
static void lvgl_init(void)
{
lv_init();
lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer, display_framebuffer1, LV_HOR_RES_MAX * LV_VER_RES_MAX); /*Initialize the display buffer*/
/* Implement and register a function which can copy the rendered image to an area of your display */
static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
disp_drv.draw_buf = &disp_buf; /*Assign the buffer to the display*/
disp_drv.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;
disp_drv.physical_hor_res = -1;
disp_drv.physical_ver_res = -1;
disp_drv.offset_x = 0;
disp_drv.offset_y = 0;
disp_drv.full_refresh = 1;
lv_disp_drv_register(&disp_drv); /*Finally register the driver*/
/* Implement and register a function which can read an input device. E.g. for a touch pad */
#if 0
static lv_indev_drv_t indev_drv; /*Descriptor of a input device driver*/
lv_indev_drv_init(&indev_drv); /*Basic initialization*/
indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
lv_indev_drv_register(&indev_drv); /*Finally register the driver*/
#endif
#if 1
/*------------------
* Keypad
* -----------------*/
static lv_indev_drv_t indev_drv1;
/*Initialize your keypad or keyboard if you have*/
/*Register a keypad input device*/
lv_indev_drv_init(&indev_drv1);
indev_drv1.type = LV_INDEV_TYPE_KEYPAD;
indev_drv1.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&indev_drv1);
//lv_group_t *keypad_group = NULL; //按键组
keypad_group = lv_group_create();
lv_indev_set_group(indev_keypad, keypad_group);
/*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,
*add objects to the group with `lv_group_add_obj(group, obj)`
*and assign this input device to group to navigate in it:
*`lv_indev_set_group(indev_keypad, group);`*/
#endif
// lv_demo_benchmark();
// lv_demo_stress();
// lv_demo_widgets();
// lv_demo_music();
//lv_demo_benchmark();
lv_prj_main();
}
//----------------------------------------------------
//end
//----------------------------------------------------
lv_group_t * lv_get_keypad_group(void)
{
return keypad_group;
}
int gui_task_msg_send(uint16_t msg_type,
void *header,
uint16_t header_length,
uint8_t *payload,
uint16_t payload_length,
ipc_tx_callback callback)
{
gui_task_msg_t queue_event;
queue_event.msg_type = msg_type;
queue_event.param_len = header_length+payload_length;
memcpy(queue_event.param, header, header_length);
memcpy(queue_event.param+header_length, payload, payload_length);
//if (portNVIC_INT_CTRL_REG & 0xff)
if(xPortIsInsideInterrupt())
{
BaseType_t xTaskWokenByPost = pdFALSE;
if (xQueueSendFromISR(gui_queue_handle, &queue_event, &xTaskWokenByPost) == errQUEUE_FULL )
{
return -1;
}
else
{
portYIELD_FROM_ISR(xTaskWokenByPost);
}
}
else
{
if (xQueueSend(gui_queue_handle, &queue_event, ( TickType_t ) 0) != pdPASS)
{
return -1;
}
}
return 0;
}
int sync_task_msg_send(uint16_t msg_type,
void *header,
uint16_t header_length,
uint8_t *payload,
uint16_t payload_length,
ipc_tx_callback callback)
{
gui_task_msg_t queue_event;
queue_event.msg_type = msg_type;
queue_event.param_len = header_length+payload_length;
memcpy(queue_event.param, header, header_length);
memcpy(queue_event.param+header_length, payload, payload_length);
//if (portNVIC_INT_CTRL_REG & 0xff)
if(xPortIsInsideInterrupt())
{
BaseType_t xTaskWokenByPost = pdFALSE;
if (xQueueSendFromISR(app_queue_handle, &queue_event, &xTaskWokenByPost) == errQUEUE_FULL )
{
return -1;
}
else
{
portYIELD_FROM_ISR(xTaskWokenByPost);
}
}
else
{
if (xQueueSend(app_queue_handle, &queue_event, ( TickType_t ) 0) != pdPASS)
{
return -1;
}
}
return 0;
}
uint32_t gui_running_last_time;
bool gui_task_resume_flag = false;
bool gui_task_suspend_flag = false;
static void setup_gui_running(void)
{
gui_running_last_time = portGET_RUN_TIME_COUNTER_VALUE();
}
static uint32_t get_gui_running_basetime(void)
{
uint32_t cur_base_time = portGET_RUN_TIME_COUNTER_VALUE();
uint32_t diff;
if(cur_base_time >= gui_running_last_time)
diff = cur_base_time - gui_running_last_time;
else
diff = (((uint32_t)0xFFFFFFFF) - gui_running_last_time) + cur_base_time + 1;
return diff;
}
bool screensaver_lock_flags = false;
static void gui_task_auto_suspend(void)
{
if(get_gui_running_basetime() > (10 * 1000) || gui_task_suspend_flag)
{
lv_obj_add_flag(lv_scr_act(),LV_OBJ_FLAG_HIDDEN);
while(display_dma_ongoing)
{
vTaskDelay(1);
}
setup_gui_running();
display_power_off();
touchpad_sleep();
vTaskSuspend(gui_task_Handle);
gui_task_suspend_flag = false;
}
if(gui_task_resume_flag)
{
gui_task_resume_flag = false;
lv_obj_clear_flag(lv_scr_act(),LV_OBJ_FLAG_HIDDEN);
}
}
bool gui_task_suspend_state(void)
{
return gui_task_suspend_flag;
}
void gui_task_suspend(void)
{
//vTaskSuspend(gui_task_Handle);
gui_task_suspend_flag = true;
}
void * gui_task_handle_is_active(void)
{
return gui_task_Handle;
}
bool gui_task_resume(void)
{
setup_gui_running();
if( eTaskGetState( gui_task_Handle ) == eSuspended)
{
touchpad_init();
display_power_on();
vTaskResume(gui_task_Handle);
gui_task_resume_flag = true;
return true;
}
return false;
}
extern void InitSysDateTime(void);
extern char * GetCurTimeString();
extern void UpdateSysTime();
lv_timer_t * lvgl_main_task_timer;
uint8_t lvgl_start = 0;
//gui task
static void gui_task(void *arg)
{
gui_task_msg_t queue_event;
printf("gui_task \r\n");
/* lfs init */
lfs_custom_init();
//lfs_custom_test_write_file();
//dev_rtc_time_init();
vTaskDelay(200);
lvgl_init();
// Create queue for gui task
gui_queue_handle = xQueueCreate(GUI_TASK_QUEUE_LENGTH, sizeof(gui_task_msg_t));
//battery detect
// adc_vbat_start_detect();
setup_gui_running();
InitSysDateTime();
GetCurTimeString();
lvgl_main_task_timer = lv_timer_create(UpdateSysTime, 1000, NULL);
printf("gui_task run\r\n");
lvgl_start =1;
while(1) {
vTaskDelay(1);
lv_timer_handler();
// rtc_running();
//encode_key_release();
if (xQueueReceive(gui_queue_handle, &queue_event, 0) == pdPASS)
{
gui_task_queue_callback(&queue_event);
}
if(lv_tick_get()%5000==0)
{
printf("lvgl tick\r\n");
}
// gui_task_auto_suspend();
}
}
static void sync_task(void *arg)
{
uint32_t sync_counter = 0;
gui_task_msg_t queue_event;
printf("sync_task \r\n");
// Create queue for sync task
app_queue_handle = xQueueCreate(SYS_TASK_QUEUE_LENGTH, sizeof(gui_task_msg_t));
while(1) {
if (xQueueReceive(app_queue_handle, &queue_event, 0) == pdPASS)
{
}
}
}
void app_lvgl_init(void)
{
memset((uint8_t*)display_framebuffer1,0xff,480*272*2);
#if (BOARD_SEL == BOARD_EVB_FR3092E_RGB)
display_init();
#else
hw_display_init(false);
// hw_touchpad_init(false);
#endif
#if ENABLE_PSRAM
hw_psram_init(false);
printf("PSRAM ID is 0x%08x.\r\n", psram_read_id());
#endif
/* create gui relative task. */
xTaskCreate( gui_task, "gui_task", GUI_TASK_STACK_SIZE, NULL, GUI_TASK_PRIORITY, &gui_task_Handle );
//xTaskCreate( sync_task, "sync_task", SYNC_TASK_STACK_SIZE, NULL, SYNC_TASK_PRIORITY, NULL );
}
//void dma1_irq(void)
//{
// printf("dma1_irq\r\n");
// if (dma_get_tfr_Status(&dma_display_handle)) {
// display_update_dma_isr();
//
// display_dma_ongoing = false;
// my_disp_flush_done();
// system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING);
// }
//}
void dma1_irq(void)
{
//printf("dma t:%d\r\n",(get_system_dwt_value()-last_time)/192);
//printf("dma1_irq\r\n");
if (dma_get_tfr_Status(&dma_display_handle)) {
display_update_dma_isr();
display_dma_ongoing = false;
my_disp_flush_done();
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING);
}
}
//void gpiob_irq(void)
//{
// printf("this is gpiob irq\r\n");
// // if(exti_get_LineStatus(GPIOB,0xFFFF))
// // {
// // exti_clear_LineStatus(GPIOB,0xFFFF);
// // }
// if(exti_get_LineStatus(GPIOB,EXTI_LINE_14))
// {
// exti_clear_LineStatus(GPIOB,EXTI_LINE_14);
// //printf("this is portb exti line 14 \r\n");
//
// // int16_t x, y;
// // touchpad_read(&x, &y);
// // printf("tp x:%d,y%d\n",x,y)
// }
//}
uint32_t *user_get_display_framebuffer(void)
{
memset((void*)display_framebuffer1,0,DISPLAY_BUFFER_SIZE);
return (uint32_t *)display_framebuffer1;
}

View File

@ -0,0 +1,66 @@
#ifndef _APP_LVGL_H
#define _APP_LVGL_H
#include "stdint.h"
#include "stdbool.h"
/* Maximal horizontal and vertical resolution to support by the library.*/
#define LV_HOR_RES_MAX (480)
#define LV_VER_RES_MAX (272)
//#define DISPLAY_TYPE_GC9C01
//#define DISPLAY_TYPE_JD9854
//#define DISPLAY_TYPE_SH8601A
//#define DISPLAY_TYPE_ICNA3310
//#define DISPLAY_TYPE_SH8601Z
//#define DISPLAY_TYPE_NV3047_RGB //272x480 rgb
//#define DISPLAY_TYPE_ST7701_RGB //480x480 rgb
#define DISPLAY_TYPE_NV3041A //272x480 8080
typedef struct
{
uint16_t msg_type;
uint16_t param_len;
uint8_t param[32 - 4];
}gui_task_msg_t;
typedef enum
{
BUTTON_KEY_EVT = 0,
ENCODE_KEY_EVT,
BUTTON_KEY1_EVT,
BUTTON_KEY2_EVT,
MESSAGE_IN_EVT,
PHONE_CALL_IN_EVT,
PHONE_CALL_OK_EVT,
PHONE_CALL_REJECT_EVT,
MUSIC_CONTROL_EVT,
POWER_CHARGE_IN_EVT,
POWER_CHARGE_OUT_EVT,
SCREENSAVER_IN_EVT,
}user_msg_type_t;
typedef void (*ipc_tx_callback)(uint8_t chn);
void app_lvgl_init(void);
void lv_disp_draw_buf_sw(bool sw);
int gui_task_msg_send(uint16_t msg_type,
void *header,
uint16_t header_length,
uint8_t *payload,
uint16_t payload_length,
ipc_tx_callback callback);
void gui_task_queue_callback(gui_task_msg_t * event);
bool gui_task_suspend_state(void);
void gui_task_suspend(void);
bool gui_task_resume(void);
void * gui_task_handle_is_active(void);
#endif // _APP_LVGL_H

View File

@ -0,0 +1,143 @@
#include "fr30xx.h"
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "rpmsg.h"
#include "rpmsg_lite.h"
#include "rpmsg_queue.h"
#include "rpmsg_ns.h"
#include "dsp.h"
#include "app_config.h"
#include "app_task.h"
#include "app_rpmsg.h"
/* Remote rpmsg instance */
static struct rpmsg_lite_instance *remote_rpmsg;
static TaskHandle_t rpmsg_task_handle;
static void rpmsg_recv(struct rpmsg_lite_instance *rpmsg, struct rpmsg_msg_t *msg)
{
// printf("rpmsg_recv: msg_type = %d.\r\n", msg->msg_type);
switch (msg->msg_type) {
case RPMSG_MSG_TYPE_SYNC_INVOKE:
if (msg->p.sync_func.func_id == RPMSG_SYNC_FUNC_SUM) {
uint32_t address = (uint32_t)msg->p.sync_func.param;
struct rpmsg_sync_msg_sum_t *param = msg->p.sync_func.param;
if (address >= DSP_DRAM_BASE_ADDR) {
address = DSP_DRAM_2_MCU_SRAM(address);
}
param = (void *)address;
rpmsg_send_sync_ret(rpmsg, 0, param->x + param->y);
}
else {
rpmsg_send_sync_ret(rpmsg, 0xffffffff, 0);
}
break;
case RPMSG_MSG_TYPE_ASYNC_MSG:
break;
default:
break;
}
}
static void rpmsg_task(void *arg)
{
struct app_task_event *event;
struct rpmsg_msg_t *msg;
uint32_t msg_len;
uint32_t src_addr;
uint32_t length;
dsp_prepare();
#if DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_SDCARD
if (dsp_load_code_from_fs("4:\\dsp\\demos.bin") == false) {
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_XIP_RO
#if DSP_ROM_CODE_XIP == 1
extern uint8_t DSP_CODE_FLASH_BASE, DSP_CODE_FLASH_END;
src_addr = (uint32_t)&DSP_CODE_FLASH_BASE;
length = (uint32_t)&DSP_CODE_FLASH_END - (uint32_t)&DSP_CODE_FLASH_BASE;
#else
extern uint8_t DSP_CODE_ROM_BASE, DSP_CODE_ROM_END;
src_addr = (uint32_t)&DSP_CODE_ROM_BASE;
length = (uint32_t)&DSP_CODE_ROM_END - (uint32_t)&DSP_CODE_ROM_BASE;
#endif
if (dsp_load_code_from_internal_flash(src_addr, length) == false) {
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_FIX_ADDRESS
src_addr = (uint32_t)((DSP_CODE_FIX_ADDRESS + 0x10) | FLASH_DAC_BASE);
length = *(volatile uint32_t *)((DSP_CODE_FIX_ADDRESS + 0x08) | FLASH_DAC_BASE);
if (dsp_load_code_from_internal_flash(src_addr, length) == false) {
#else
#error "choose correct DSP code load mode"
{
#endif
printf("DSP image load failed.\r\n");
while(1);
}
printf("DSP is released.\r\n");
#if DSP_ROM_CODE_XIP == 0
__SYSTEM_LIBRARY_ROM_CLK_ENABLE();
#endif
remote_rpmsg = rpmsg_remote_init(rpmsg_recv);
dsp_run(0x78400660);
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_TYPE_DSP);
rpmsg_wait_master_ready(remote_rpmsg);
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_TYPE_DSP);
printf("DSP is ready.\r\n");
/* notice APP that rpmsg is ready. */
event = app_task_event_alloc(APP_TASK_EVENT_RPMSG_INITED, 0, true);
app_task_event_post(event, false);
while (1) {
src_addr = rpmsg_recv_msg(remote_rpmsg, &msg, &msg_len);
rpmsg_recv(remote_rpmsg, msg);
rpmsg_lite_release_rx_buffer(remote_rpmsg, msg);
}
}
void app_rpmsg_init(void)
{
/* create rpmsg task. */
xTaskCreate(rpmsg_task, "RPMSG_TASK", RPMSG_TASK_STACK_SIZE, NULL, RPMSG_TASK_PRIORITY, &rpmsg_task_handle);
}
void app_rpmsg_recover(void)
{
dsp_prepare();
uint32_t src_addr;
uint32_t length;
#if DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_XIP_RO
#if DSP_ROM_CODE_XIP == 1
extern uint8_t DSP_CODE_FLASH_BASE, DSP_CODE_FLASH_END;
src_addr = (uint32_t)&DSP_CODE_FLASH_BASE;
length = (uint32_t)&DSP_CODE_FLASH_END - (uint32_t)&DSP_CODE_FLASH_BASE;
#else
extern uint8_t DSP_CODE_ROM_BASE, DSP_CODE_ROM_END;
src_addr = (uint32_t)&DSP_CODE_ROM_BASE;
length = (uint32_t)&DSP_CODE_ROM_END - (uint32_t)&DSP_CODE_ROM_BASE;
#endif
dsp_load_rw_from_internal_flash(src_addr, length);
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_FIX_ADDRESS
src_addr = (uint32_t)((DSP_CODE_FIX_ADDRESS + 0x10) | FLASH_DAC_BASE);
length = *(volatile uint32_t *)((DSP_CODE_FIX_ADDRESS + 0x08) | FLASH_DAC_BASE);
dsp_load_rw_from_internal_flash(src_addr, length);
#else
#error "choose correct DSP code load mode"
#endif
#if DSP_ROM_CODE_XIP == 0
__SYSTEM_LIBRARY_ROM_CLK_ENABLE();
#endif
dsp_run(0x78400660);
rpmsg_remote_recover();
}

View File

@ -0,0 +1,7 @@
#ifndef _APP_RPMSG_H
#define _APP_RPMSG_H
void app_rpmsg_init(void);
void app_rpmsg_recover(void);
#endif // _APP_RPMSG_H

View File

@ -0,0 +1,204 @@
#include "FreeRTOS.h"
#include "task.h"
#include "app_config.h"
#include "app_at.h"
#include "app_task.h"
#include "app_bt.h"
#include "app_ble.h"
#include "app_btdm.h"
#include "app_lvgl.h"
#include "app_rpmsg.h"
#include "fr_device_charge.h"
#include "fr_device_pmu_io.h"
#include "fr_device_button.h"
#include "fr_device_pa.h"
#include "fr_device_encode.h"
#include "fr_device_vbat.h"
#if PRJ_NUM == A36
#include "A36_app.h"
#elif PRJ_NUM == A39
#include "A39_app.h"
#endif
#include "mx_app.h"
static struct co_list event_list;
static TaskHandle_t app_task_handle;
void hci_controller_read(void);
void hci_host_read(void);
static void app_task_event_handler(void)
{
struct app_task_event *event = NULL;
vTaskSuspendAll();
event = (struct app_task_event *)co_list_pop_front(&event_list);
xTaskResumeAll();
//printf("%s %x\r\n",__func__, (uint32_t)&event);
if(event) {
switch(event->event_type) {
case APP_TASK_EVENT_AT_CMD:
app_at_cmd_recv_handler(event->param, event->param_len);
break;
case APP_TASK_EVENT_RPMSG_INITED:
#if BTDM_STACK_ENABLE == 1
app_btdm_init();
break;
#endif
case APP_TASK_EVENT_HOST_INITED:
//2024.4.11 by hsp
pri_power_on();
lcd_power_on();
app_lvgl_init();
// break;
#if BTDM_STACK_ENABLE == 1
case APP_TASK_EVENT_LVGL_INITED:
app_btdm_start();
#endif
//2024.4.11 by hsp
project_init();
break;
case APP_TASK_EVENT_BTN_TOGGLE:
{
button_toggle_handler(*(uint32_t *)event->param);
}
break;
case APP_TASK_EVENT_BTN_OUTPUT:
{
button_event_handler(event->param);
}
break;
case APP_TASK_EVENT_ENCODE_TOGGLE:
{
encode_event_handle(*(uint32_t *)event->param);
}
break;
case APP_TASK_EVENT_ADC_VBAT_DETECT:
{
adc_vbat_event_handle();
}
break;
case APP_TASK_EVENT_CHARGE_OUTPUT:
// {
// charge_event_handle(*(uint8_t *)event->param);
// }
break;
default:
break;
}
vPortFree((void *)event);
}
}
void app_task_event_post(struct app_task_event *event, bool high)
{
uint32_t old_basepri;
if(xPortIsInsideInterrupt()) {
old_basepri = taskENTER_CRITICAL_FROM_ISR();
if(high) {
co_list_push_front(&event_list, &event->hdr);
}
else {
co_list_push_back(&event_list, &event->hdr);
}
taskEXIT_CRITICAL_FROM_ISR(old_basepri);
vTaskNotifyGiveFromISR(app_task_handle, NULL);
}
else {
taskENTER_CRITICAL();
if(high) {
co_list_push_front(&event_list, &event->hdr);
}
else {
co_list_push_back(&event_list, &event->hdr);
}
taskEXIT_CRITICAL();
xTaskNotifyGive(app_task_handle);
}
}
struct app_task_event *app_task_event_alloc(uint8_t event_type, uint32_t param_len, bool block)
{
struct app_task_event *event = NULL;
while(event == NULL) {
event = pvPortMalloc(sizeof(struct app_task_event) + param_len);
if (event == NULL) {
if (block) {
vTaskDelay(10);
}
else {
return NULL;
}
}
}
event->event_type = event_type;
event->param_len = param_len;
return event;
}
static void app_task(void *arg)
{
struct app_task_event *event;
printf("app_task\r\n");
#if ENABLE_DSP == 1
app_rpmsg_init();
#else
event = app_task_event_alloc(APP_TASK_EVENT_RPMSG_INITED, 0, true);
app_task_event_post(event, false);
#endif
//关闭 2024.03.04
// // device_pa_init();
// // device_charge_init();
//#if BOARD_SEL == BOARD_EVB_FR5090
// button_init(BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|KEY1_PIN_NUM);
//#elif BOARD_SEL == BOARD_EVB_FR3092E
// //关闭 2024.03.04
// //button_init(BUTTON_PIN_NUM|SOS_KEY_PIN_NUM);
// //开启 A36按键配置 2024.03.04
// button_gpio_config();
//
//#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
// button_init(BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|KEY1_PIN_NUM);
//#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
// // button_init(BUTTON_PIN_NUM|SOS_KEY_PIN_NUM);
//#else
//#error "choose correct board"
//#endif
// //关闭 2024.03.04
// //device_pmu_io_init();
//2024.03.04 hsp
// project_init();
// pri_power_on();
// lcd_power_on();
mx_task_run();
while(1) {
ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
app_task_event_handler();
}
}
void app_task_init(void)
{
xTaskCreate(app_task, "app", APP_TASK_STACK_SIZE, NULL, APP_TASK_PRIORITY, &app_task_handle);
}

View File

@ -0,0 +1,34 @@
#ifndef _APP_TASK_H
#define _APP_TASK_H
#include <stdint.h>
#include <stdbool.h>
#include "co_list.h"
#define APP_TASK_EVENT_AT_CMD 0x00
#define APP_TASK_EVENT_RPMSG_INITED 0x01
#define APP_TASK_EVENT_HOST_INITED 0x02
#define APP_TASK_EVENT_LVGL_INITED 0x03
#define APP_TASK_EVENT_BTN_OUTPUT 0x04
#define APP_TASK_EVENT_BTN_TOGGLE 0x05
#define APP_TASK_EVENT_ENCODE_TOGGLE 0x06
#define APP_TASK_EVENT_ADC_VBAT_DETECT 0x07
#define APP_TASK_EVENT_CHARGE_OUTPUT 0x08
struct app_task_event {
struct co_list_hdr hdr;
uint8_t event_type;
uint16_t param_len;
uint8_t param[];
};
void app_task_event_post(struct app_task_event *event, bool high);
struct app_task_event *app_task_event_alloc(uint8_t event_type, uint32_t param_len, bool block);
void app_task_init(void);
#endif // _APP_TASK_H

View File

@ -0,0 +1,451 @@
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs (C)ChaN, 2019 */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be */
/* attached to the FatFs via a glue function rather than modifying it. */
/* This is an example of glue functions to attach various exsisting */
/* storage control modules to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/
#include <string.h>
#include "fr30xx.h"
#include "ff.h" /* Obtains integer types */
#include "diskio.h" /* Declarations of disk functions */
/* Definitions of physical drive number for each drive */
#define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */
#define DEV_MMC 1 /* Example: Map MMC to physical drive 1 */
#define DEV_SPI_FLASH 2 /* Example: Map SPI Flash to physical drive 2 */
#define DEV_NAND_FLASH 3 /* Example: Map Nand Flash to physical drive 3 */
#define DEV_SD_CARD 4 /* Example: Map SD Card to physical drive 4 */
#define RAM_SECTOR_SIZE 512
#define RAM_SECTOR_COUNT (16*48)
#define RAM_BLOCK_SIZE 4096
#define RAM_DISK_SIZE (RAM_SECTOR_SIZE * RAM_SECTOR_COUNT)
#define SD_CARD_SECTOR_SIZE 512
#define SD_CARD_BLOCK_SIZE 4096
#define SPI_FLASH_SECTOR_SIZE 512
#define SPI_FLASH_BLOCK_SIZE 4096
#define SPI_FLASH_SECTOR_COUNT (2*1024*4)
__ALIGNED(4) static uint8_t ram_disk_space[RAM_DISK_SIZE];
static uint8_t spi_flash_poll[4096];
extern SD_HandleTypeDef sdio_handle;
static DSTATUS RAM_disk_status(void)
{
return RES_OK;
}
static DSTATUS MMC_disk_status(void)
{
return RES_OK;
}
static DSTATUS SPI_flash_status(void)
{
return RES_OK;
}
static DSTATUS SD_Card_status(void)
{
return RES_OK;
}
static DSTATUS RAM_disk_initialize(void)
{
// memset(ram_disk_space, 0, RAM_DISK_SIZE);
return RES_OK;
}
static DSTATUS MMC_disk_initialize(void)
{
return RES_ERROR;
}
static DSTATUS SPI_flash_initialize(void)
{
return RES_OK;
}
static DSTATUS SD_Card_initialize(void)
{
// uint32_t EER;
//
// EER = SDCard_Init(&SDIO);
// if (EER != INT_NO_ERR) {
// return RES_ERROR;
// }
// EER = SDCard_BusWidth_Select(&SDIO, SDIO_BUS_WIDTH_4BIT);
// if (EER != INT_NO_ERR) {
// return RES_ERROR;
// }
return RES_OK;
}
static DSTATUS RAM_disk_read(BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS SPI_flash_read(BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS MMC_disk_read(BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS SD_Card_read(BYTE *buff, LBA_t sector, UINT count)
{
SDCard_ReadBolcks(&sdio_handle, (uint32_t *)buff, sector, count);
return RES_OK;
}
static DSTATUS RAM_disk_write(const BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS MMC_disk_write(const BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS SPI_flash_write(const BYTE *buff, LBA_t sector, UINT count)
{
return RES_ERROR;
}
static DSTATUS SD_Card_write(const BYTE *buff, LBA_t sector, UINT count)
{
SDCard_WriteBolcks(&sdio_handle, (uint32_t *)buff, sector, count);
return RES_OK;
}
/*-----------------------------------------------------------------------*/
/* Get Drive Status */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
switch (pdrv) {
case DEV_RAM :
stat = RAM_disk_status();
// translate the reslut code here
return stat;
case DEV_MMC :
stat = MMC_disk_status();
// translate the reslut code here
return stat;
case DEV_SPI_FLASH :
stat = SPI_flash_status();
// translate the reslut code here
return stat;
case DEV_SD_CARD :
stat = SD_Card_status();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
switch (pdrv) {
case DEV_RAM :
stat = RAM_disk_initialize();
// translate the reslut code here
return stat;
case DEV_MMC :
stat = MMC_disk_initialize();
// translate the reslut code here
return stat;
case DEV_SPI_FLASH :
stat = SPI_flash_initialize();
// translate the reslut code here
return stat;
case DEV_SD_CARD :
stat = SD_Card_initialize();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
{
DRESULT res;
switch (pdrv) {
case DEV_RAM :
// translate the arguments here
res = RAM_disk_read(buff, sector, count);
// translate the reslut code here
return res;
case DEV_MMC :
// translate the arguments here
res = MMC_disk_read(buff, sector, count);
// translate the reslut code here
return res;
case DEV_SPI_FLASH :
// translate the arguments here
res = SPI_flash_read(buff, sector, count);
// translate the reslut code here
return res;
case DEV_SD_CARD :
// translate the arguments here
res = SD_Card_read(buff, sector, count);
// translate the reslut code here
return res;
}
return RES_PARERR;
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
#if FF_FS_READONLY == 0
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
{
DRESULT res;
switch (pdrv) {
case DEV_RAM :
// translate the arguments here
res = RAM_disk_write(buff, sector, count);
// translate the reslut code here
return res;
case DEV_MMC :
// translate the arguments here
res = MMC_disk_write(buff, sector, count);
// translate the reslut code here
return res;
case DEV_SPI_FLASH :
// translate the arguments here
res = SPI_flash_write(buff, sector, count);
// translate the reslut code here
return res;
case DEV_SD_CARD :
// translate the arguments here
res = SD_Card_write(buff, sector, count);
// translate the reslut code here
return res;
}
return RES_PARERR;
}
#endif
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res = RES_PARERR;
switch (pdrv) {
case DEV_RAM :
// Process of the command for the RAM drive
switch(cmd)
{
case CTRL_SYNC:
res = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = RAM_SECTOR_SIZE;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff = RAM_BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = RAM_SECTOR_COUNT;
res = RES_OK;
break;
case CTRL_TRIM:
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
return res;
case DEV_MMC :
// Process of the command for the MMC/SD card
return res;
case DEV_SPI_FLASH :
// Process of the command for the MMC/SD card
switch(cmd)
{
case CTRL_SYNC:
res = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = SPI_FLASH_SECTOR_SIZE;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff = SPI_FLASH_BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = SPI_FLASH_SECTOR_COUNT;
res = RES_OK;
break;
case CTRL_TRIM:
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
return res;
case DEV_SD_CARD :
// Process of the command for the RAM drive
switch(cmd)
{
case CTRL_SYNC:
res = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = SD_CARD_SECTOR_SIZE;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff = SD_CARD_BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = SDCard_Get_Block_count(&sdio_handle);
res = RES_OK;
break;
case CTRL_TRIM:
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
return res;
}
return RES_PARERR;
}

View File

@ -0,0 +1,28 @@
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "heap.h"
#include "dram_mem.h"
#define configTOTAL_DRAM_HEAP_SIZE ( ( 12 * 1024 ) )
static bool is_mem_poll_inited = false;
__attribute__((section("dram_section"))) static uint32_t ucHeap[ (configTOTAL_DRAM_HEAP_SIZE >> 2) + 0x10];
void * dram_malloc( uint32_t xWantedSize )
{
if (is_mem_poll_inited == false) {
is_mem_poll_inited = true;
heap_mem_init(HEAP_TYPE_DRAM_BLOCK, (void *)ucHeap, configTOTAL_DRAM_HEAP_SIZE);
}
return heap_mem_alloc(HEAP_TYPE_DRAM_BLOCK, xWantedSize);
}
void dram_free( void * pv )
{
heap_mem_free(pv);
}

View File

@ -0,0 +1,9 @@
#ifndef __BTDM_MEM_H__
#define __BTDM_MEM_H__
#include <stdint.h>
void * dram_malloc( uint32_t xWantedSize );
void dram_free( void * pv );
#endif // __BTDM_MEM_H__

View File

@ -0,0 +1,191 @@
/*
* This file is part of the EasyLogger Library.
*
* Copyright (c) 2015, Armink, <armink.ztl@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* 'Software'), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Function: Portable interface for each platform.
* Created on: 2015-04-28
*/
#include <elog.h>
#include "fr30xx.h"
extern UART_HandleTypeDef uart_log_handle;
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
static SemaphoreHandle_t xSemaphore_lock;
static SemaphoreHandle_t xSemaphore_notice;
#else
static uint32_t prim;
#endif
/**
* EasyLogger port initialize
*
* @return result
*/
ElogErrCode elog_port_init(void) {
ElogErrCode result = ELOG_NO_ERR;
/* add your code here */
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
xSemaphore_lock = xSemaphoreCreateBinary();
xSemaphore_notice = xSemaphoreCreateBinary();
xSemaphoreGive(xSemaphore_lock);
xSemaphoreGive(xSemaphore_notice);
#endif
return result;
}
/**
* output log port interface
*
* @param log output of log
* @param size log size
*/
void elog_port_output(const char *log, size_t size) {
/* add your code here */
uart_transmit(&uart_log_handle, (uint8_t *)log, size);
}
/**
* output lock
*/
void elog_port_output_lock(void) {
/* add your code here */
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
xSemaphoreTake(xSemaphore_lock, portMAX_DELAY);
#else
prim = __get_PRIMASK();
__disable_irq();
#endif
}
/**
* output unlock
*/
void elog_port_output_unlock(void) {
/* add your code here */
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
xSemaphoreGive(xSemaphore_lock);
#else
if(!prim)
{
__enable_irq();
}
#endif
}
/**
* get current time interface
*
* @return current time
*/
const char *elog_port_get_time(void) {
/* add your code here */
return "2023/2/2";
}
/**
* get current process name interface
*
* @return current process name
*/
const char *elog_port_get_p_info(void) {
/* add your code here */
return "";
}
/**
* get current thread name interface
*
* @return current thread name
*/
const char *elog_port_get_t_info(void) {
/* add your code here */
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
return "";
#else
return "";
#endif
}
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
void elog_async_output_notice(void)
{
xSemaphoreGive(xSemaphore_notice);
}
void async_output_task(void *arg)
{
size_t get_log_size = 0;
static char poll_get_buf[ELOG_LINE_BUF_SIZE - 4];
while(true)
{
/* waiting log */
xSemaphoreTake(xSemaphore_notice, portMAX_DELAY);
/* polling gets and outputs the log */
while(true)
{
#ifdef ELOG_ASYNC_LINE_OUTPUT
get_log_size = elog_async_get_line_log(poll_get_buf, sizeof(poll_get_buf));
#else
get_log_size = elog_async_get_log(poll_get_buf, sizeof(poll_get_buf));
#endif
if (get_log_size)
{
elog_port_output_lock();
elog_port_output(poll_get_buf, get_log_size);
elog_port_output_unlock();
}
else
{
break;
}
}
}
}
#endif

View File

@ -0,0 +1,101 @@
#include "user_bt_a2dp.h"
#include "lvgl.h"
#include "FreeRTOS.h"
#include "app_lvgl.h"
#include "app_bt.h"
#include "user_bt.h"
#define BT_MUSIC_LOG printf
user_bt_media_t bt_media;
void user_bt_music_control(bt_enum_music_t control)
{
BtStatus status;
switch(control)
{
case BT_ENUM_MUSIC_PLAY:
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_PLAY, TRUE);
break;
case BT_ENUM_MUSIC_PAUSE:
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_PAUSE, TRUE);
break;
case BT_ENUM_MUSIC_PREVIOUS:
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_FORWARD, TRUE);
break;
case BT_ENUM_MUSIC_NEXT:
status = AVRCP_SetPanelKey(user_bt_env.dev[user_bt_env.last_active_index].rcp_chan, AVRCP_POP_BACKWARD, TRUE);
break;
default:
break;
}
BT_MUSIC_LOG("%s %d\r\n",__func__, status);
}
void user_bt_sync_music_volume(uint8_t vol)
{
uint8_t buf[3];
printf("%s %d %d\r\n", __func__, vol,__LINE__);
buf[0] = 'E';
buf[1] = 'E';
buf[2] = vol * 127/ 100;
printf("%s %d %d\r\n", __func__, __LINE__,buf[2]);
app_at_cmd_recv_handler(buf,NULL);
}
void user_bt_set_music_playstatus(bool status)
{
bt_media.play_status = status;
}
bool user_bt_get_music_playstatus(void)
{
return bt_media.play_status;
}
uint8_t user_bt_get_music_vol(void)
{
return bt_media.vol;
}
void user_bt_set_music_vol(uint8_t vol)
{
bt_media.vol = vol;
}
uint8_t *user_bt_get_music_songname(void)
{
return &bt_media.song[0];
}
void user_bt_song_lyric_notify(void)
{
gui_task_msg_send(MUSIC_CONTROL_EVT,NULL,0,NULL,0,NULL);
}
void user_bt_get_media_info(void)
{
BtStatus status;
status = bt_get_media_info(user_bt_env.last_active_index,0x41);
BT_MUSIC_LOG("%s %d\r\n",__func__, status);
}

View File

@ -0,0 +1,47 @@
#ifndef __USER_BT_A2DP_H
#define __USER_BT_A2DP_H
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "app_at.h"
typedef enum{
BT_ENUM_MUSIC_PLAY,
BT_ENUM_MUSIC_PAUSE,
BT_ENUM_MUSIC_PREVIOUS,
BT_ENUM_MUSIC_NEXT,
//BT_ENUM_MUSIC_VOLUME_INC,
//BT_ENUM_MUSIC_VOLUME_DEC,
}bt_enum_music_t;
typedef struct
{
bool play_status;
uint8_t vol;
uint16_t playlen;
uint16_t playpos;
uint8_t song[100];
}user_bt_media_t;
extern user_bt_media_t bt_media;
extern void user_bt_music_control(uint8_t control);
extern void user_bt_sync_music_volume(uint8_t vol);
extern void user_bt_set_music_playstatus(bool status);
extern bool user_bt_get_music_playstatus(void);
extern uint8_t user_bt_get_music_vol(void);
extern void user_bt_set_music_vol(uint8_t vol);
extern uint8_t *user_bt_get_music_songname(void);
extern void user_bt_song_lyric_notify(void);
extern void user_bt_get_media_info(void);
#endif /* __USER_BT_A2DP_H */

View File

@ -0,0 +1,197 @@
#include "user_bt_call.h"
#include "FreeRTOS.h"
#include "user_bt_common.h"
#include "app_lvgl.h"
#include "task.h"
#include "timers.h"
#include "app_bt.h"
#include "user_bt.h"
#define BT_CALL_LOG printf
#define BT_LOG_ENABLE 1
#if BT_LOG_ENABLE
#define BT_LOG printf
#else
#define BT_LOG
#endif
call_info_t bt_call;
//bool call_flag = 0;
uint8_t call_incoming = 0; //呼入呼出状态
bool call_complete = 0; //接通状态
xTimerHandle user_bt_call_timer;
//0呼出1接通2静音3通话结束
//4拨出失败5来电显示
uint8_t call_mode;
void user_set_call_mode(uint8_t mode)
{
call_mode = mode;
}
uint8_t user_get_call_mode(void)
{
return call_mode;
}
void bt_hf_call_outgoing(uint8_t *number, uint8_t len)
{
BtStatus status;
status = bt_dial_number(user_bt_env.last_active_index,&number[1],number[0]);
BT_CALL_LOG("%s %d \r\n", __func__,status);
}
void bt_hf_call_hangup(void)
{
BtStatus status;
status = bt_hang_up(user_bt_env.last_active_index);
BT_CALL_LOG("%s %d \r\n", __func__,status);
}
void bt_hf_call_answer(void)
{
BtStatus status;
status = bt_answer_call(user_bt_env.last_active_index);
BT_CALL_LOG("%s %d \r\n", __func__,status);
}
void user_bt_hf_mic_mute(bool mute)
{
if(mute)
{
__CODEC_SET_ADC_VOLUME(0);
}else {
__CODEC_SET_ADC_VOLUME(0x8000);
}
}
void user_bt_hfcall_handle(uint8_t hf_call)
{
if(hf_call == 0) //挂断
{
if(call_complete)
{
call_complete = 0;
gui_task_msg_send(PHONE_CALL_REJECT_EVT,NULL,0,NULL,0,NULL);
}
}
else if(hf_call == 1) //接通
{
user_set_call_mode(HF_ENUM_CALL_CONNECTING);
call_incoming = 0;
call_complete = 1; //接通状态
gui_task_msg_send(PHONE_CALL_OK_EVT,NULL,0,NULL,0,NULL);
}
}
void user_bt_callsetup_handle(uint8_t hf_callsetup)
{
if(hf_callsetup == 0)
{
if(call_incoming == 1 || call_incoming == 2) //
{
call_incoming = 0;
gui_task_msg_send(PHONE_CALL_REJECT_EVT,NULL,0,NULL,0,NULL);
}
}
else if(hf_callsetup == 1) /* incoming call */
{
call_incoming = 1; //来电状态置1
user_set_call_mode(5);
}
else if(hf_callsetup == 2) /* outgoing call */
{
call_incoming = 2; //呼出状态
user_set_call_mode(0);
}
}
void user_bt_set_calling_num(const char *num, uint8_t len)
{
bt_call.number_len = len;
memset(&bt_call.call_namber[0], 0, sizeof(bt_call.call_namber));
memcpy(&bt_call.call_namber[0], num, len);
if(call_incoming)
{
gui_task_msg_send(PHONE_CALL_IN_EVT,NULL,0,NULL,0,NULL);
}
}
void user_bt_get_calling_info(call_info_t * call)
{
#if 1
call->number_len = bt_call.number_len;
memset(call->call_namber,0,32);
memcpy(call->call_namber,bt_call.call_namber,call->number_len);
//call->name_len = call_context[call->number_len] + 1;
//memset(call->call_name,0,128);
//memcpy(call->call_name, call_context+call->number_len+1, call->name_len);
#else
if(call_context[0] > 0)
{
call->number_len = call_context[0];
memset(call->call_namber,0,32);
memcpy(call->call_namber,call_context+1,call->number_len);
call->name_len = call_context[call->number_len] + 1;
memset(call->call_name,0,128);
memcpy(call->call_name, call_context+call->number_len+1, call->name_len);
}
#endif
}
static void user_bt_timer_call_handler( TimerHandle_t xTimer)
{
BT_LOG("%s \r\n",__func__);
}
void user_bt_timer_call_init(void)
{
user_bt_call_timer = xTimerCreate("user_bt_call_timer", 100 , pdFALSE, NULL, user_bt_timer_call_handler);
//xTimerStart(user_bt_call_timer,0);
}
void user_bt_hf_set_volume(uint8_t lev)
{
if(lev == 0){
user_bt_set_local_volume(BT_VOL_HFP, 1);
}else{
user_bt_set_local_volume(BT_VOL_HFP, lev);
}
BT_LOG("%s %d \r\n", __func__, lev);
}

View File

@ -0,0 +1,53 @@
#ifndef __USER_BT_CALL_H
#define __USER_BT_CALL_H
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "driver_codec.h"
#include "app_at.h"
#include "fr_watch.h"
typedef struct
{
uint8_t num_len;
uint8_t num[15];
}user_bt_call_t;
//0呼出1接通2静音3通话结束
//4拨出失败5来电显示
typedef enum
{
HF_ENUM_OUTGOING = 0,
HF_ENUM_CALL_CONNECTING = 1,
HF_ENUM_INCOMING = 5,
}call_enum_state_t;
//mic mute
enum{
ENUM_MIC_CLOSE,
ENUM_MIC_OPEN,
};
extern void bt_hf_call_outgoing(uint8_t *number, uint8_t len);
extern void bt_hf_call_hangup(void);
extern void bt_hf_call_answer(void);
extern void user_bt_set_calling_num(const char *num, uint8_t len);
extern void user_set_call_mode(uint8_t mode);
extern uint8_t user_get_call_mode(void);
extern void user_bt_get_calling_info(call_info_t * call);
extern void user_bt_callsetup_handle(uint8_t hf_callsetup);
extern void user_bt_hfcall_handle(uint8_t hf_call);
extern void user_bt_hf_mic_mute(bool mute);
extern void user_bt_timer_call_init(void);
extern void user_bt_hf_mic_mute(bool mute);
extern void user_bt_hf_set_volume(uint8_t lev);
#endif /* __USER_BT_CALL_H */

View File

@ -0,0 +1,222 @@
#include "user_bt_common.h"
#include "lvgl.h"
#include "FreeRTOS.h"
#define BT_COMM_ENABLE 1
#if BT_COMM_ENABLE
#define BT_COMM_LOG printf
#else
#define BT_COMM_LOG
#endif
user_bt_vol_t user_bt_volum;
bool system_bt_module = 0; //0:close 1:start
/*
change phone volume to local spk vol
*/
bool user_bt_set_local_volume(enum bt_volume_type_t type,uint16_t vol)
{
uint16_t avrcp_vol,hf_vol;
if((type >= BT_VOL_MAX)||(vol > 0xFFFF)){
return false;
}
if(type == BT_VOL_HFP){
if(user_bt_env.dev[user_bt_env.last_active_index].conFlags&LINK_STATUS_SCO_CONNECTED){
if(vol == 0){
hf_vol = 0;
}
else{
hf_vol = 0 + (USER_BT_HF_VOLUME_MAX*vol)/15;
}
BT_COMM_LOG("%s %d %d \r\n",__func__,vol,hf_vol);
codec_Set_DAC_Volume(hf_vol);
}
}
else if(type == BT_VOL_MEDIA){
if(user_bt_env.dev[user_bt_env.last_active_index].conFlags&LINK_STATUS_MEDIA_PLAYING){
if(vol >= USER_BT_VOLUM_MAX){
avrcp_vol = 127;
}
else{
avrcp_vol = (USER_BT_VOLUM_MAX*vol)/127;
}
BT_COMM_LOG("%s %d %d \r\n",__func__,vol,avrcp_vol);
codec_Set_DAC_Volume(avrcp_vol);
}else{
}
}
else if(type == BT_VOL_TONE){
}
return true;
}
/*
local change volume send to phone
*/
bool user_bt_set_spk_volume(enum bt_volume_type_t type,uint16_t vol)
{
uint16_t avrcp_vol,hf_vol;
if((type >= BT_VOL_MAX)||(vol > 0xFFFF)){
return false;
}
if(type == BT_VOL_HFP){
if(user_bt_env.dev[user_bt_env.last_active_index].conFlags&LINK_STATUS_SCO_CONNECTED){
if(vol == 0){
hf_vol = + (USER_BT_HF_VOLUME_MAX * 1)/15;
vol = 1;
}
else{
hf_vol = 0 + (USER_BT_HF_VOLUME_MAX*vol)/15;
}
BT_COMM_LOG("%s %d %d \r\n",__func__,vol,hf_vol);
bt_report_spk_volume(user_bt_env.last_active_index,vol);
codec_Set_DAC_Volume(hf_vol);
}
}
else if(type == BT_VOL_MEDIA){
if(user_bt_env.dev[user_bt_env.last_active_index].conFlags&LINK_STATUS_MEDIA_PLAYING){
if(vol == 0x3f){
avrcp_vol = USER_BT_VOLUM_MAX;
}
else{
avrcp_vol = (USER_BT_VOLUM_MAX*vol)/127;
}
bt_set_media_volume(user_bt_env.last_active_index, vol);
codec_Set_DAC_Volume(avrcp_vol);
}else{
}
}
else if(type == BT_VOL_TONE){
}
return true;
}
user_bt_vol_t *user_bt_get_volume(void)
{
return (user_bt_vol_t *)&user_bt_volum.vol;
}
uint8_t user_bt_volume_lev_convert(enum bt_volume_type_t type,uint8_t lev)
{
uint8_t vol;
if(type == BT_VOL_MEDIA)
{
vol = (lev * 127 / 100);
}
else if(type == BT_VOL_HFP)
{
vol = (lev * 15 / 100);
}
printf("%s %d \r\n", __func__,vol);
return vol;
}
uint8_t *user_bt_get_local_name(void)
{
extern uint8_t default_name[];
return default_name;
}
uint8_t *user_bt_get_mac(void)
{
extern uint8_t bt_addr[];
return bt_addr;
}
char *user_ble_get_local_name(void)
{
extern char local_device_name[];
return local_device_name;
}
uint8_t *user_ble_get_mac(void)
{
extern uint8_t ble_static_addr[];
return ble_static_addr;
}
/*
bt module enable/disable api
system_bt_module param
0:close
1:start
*/
void user_bt_set_module(bool sat)
{
system_bt_module = sat;
}
bool user_bt_get_module(void)
{
return system_bt_module;
}
void user_bt_disconnect(void)
{
BtStatus status;
status = bt_disconnect(&user_bt_env.dev[0].remote_bd, true); //强制断开bt
BT_COMM_LOG("%s %d %d\r\n", __func__,__LINE__,status);
}
void user_bt_off(void)
{
BtStatus status;
status = bt_disconnect(&user_bt_env.dev[0].remote_bd, true); //强制断开bt
BT_COMM_LOG("%s %d %d\r\n", __func__,__LINE__,status);
status = bt_exit_pairing();
user_bt_set_module(false);
BT_COMM_LOG("%s %d %d\r\n", __func__,__LINE__,status);
}
void user_bt_on(void)
{
BtStatus status;
BtAccessModeInfo access_mode_nc = {
.inqInterval = 0x800,
.inqWindow = 0x12,
.pageInterval = 0x800,
.pageWindow = 0x12,
};
status = bt_enter_pairing(BAM_GENERAL_ACCESSIBLE, &access_mode_nc);
user_bt_env.connect_times = 3;
BT_COMM_LOG("bt reconnect addr %x %x %x %x %x %x \r\n",user_bt_env.last_dev_addr.A[0],
user_bt_env.last_dev_addr.A[1],
user_bt_env.last_dev_addr.A[2],
user_bt_env.last_dev_addr.A[3],
user_bt_env.last_dev_addr.A[4],
user_bt_env.last_dev_addr.A[5]);
status = bt_connect(&user_bt_env.last_dev_addr);
user_bt_set_module(true);
BT_COMM_LOG("status = %d\r\n",status);
}

View File

@ -0,0 +1,48 @@
#ifndef __USER_BT_COMMON_H
#define __USER_BT_COMMON_H
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "driver_codec.h"
#include "app_at.h"
#include "user_bt.h"
#define USER_BT_VOLUM_MAX (0x1000)
#define USER_BT_HF_VOLUME_MAX (0x2000)
#define USER_BT_NAME "freq_bt"
typedef struct
{
uint8_t vol;
uint8_t lev;
}user_bt_vol_t;
enum bt_volume_type_t{
BT_VOL_HFP, //设置通话音量
BT_VOL_MEDIA, //设置媒体音量
BT_VOL_TONE, //设置提示音量
BT_VOL_MAX,
};
extern void user_bt_set_volume(uint8_t vol);
extern uint8_t user_bt_volume_lev_convert(enum bt_volume_type_t type,uint8_t lev);
extern uint8_t *user_bt_get_local_name(void);
extern uint8_t *user_bt_get_mac(void);
extern char *user_ble_get_local_name(void);
extern uint8_t *user_ble_get_mac(void);
extern bool user_bt_set_spk_volume(enum bt_volume_type_t type,uint16_t vol);
extern bool user_bt_set_local_volume(enum bt_volume_type_t type,uint16_t vol);
extern void user_bt_disconnect(void);
extern void user_bt_off(void);
extern void user_bt_on(void);
extern void user_bt_set_module(bool sat);
extern bool user_bt_get_module(void);
#endif /* __USER_BT_COMMON_H */

View File

@ -0,0 +1,36 @@
#include "user_bt_voice_recognition.h"
#include "user_bt.h"
#include "app_bt.h"
#define BT_VOICE_LOG printf
bool voice_active = 0;
void user_bt_voice_start_active(bool type)
{
BtStatus status;
if(type)
{
//memcpy(event->param, (void *)"CJ01", sizeof("CJ01"));
status = bt_enable_voice_recognition(user_bt_env.last_active_index, true);
}else {
//memcpy(event->param, (void *)"CJ00", sizeof("CJ01"));
status = bt_enable_voice_recognition(user_bt_env.last_active_index, false);
}
BT_VOICE_LOG("status = %d\r\n",status);
}
bool user_bt_get_voice_active(void)
{
return voice_active;
}
void user_bt_set_voice_active(bool active)
{
voice_active = active;
}

View File

@ -0,0 +1,22 @@
#ifndef __USER_BT_VOICE_RECONGNITION_H
#define __USER_BT_VOICE_RECONGNITION_H
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "driver_codec.h"
#include "app_at.h"
#include "fr_watch.h"
#include "FreeRTOS.h"
#include "app_lvgl.h"
#include "task.h"
#include "timers.h"
#include "app_task.h"
extern bool voice_active;
extern void user_bt_voice_start_active(bool type);
extern bool user_bt_get_voice_active(void);
extern void user_bt_set_voice_active(bool active);
#endif /* __USER_BT_VOICE_RECONGNITION_H */

View File

@ -0,0 +1,679 @@
#include <stdint.h>
#include <stddef.h>
#include "driver_gpio.h"
#include "fr30xx.h"
#include "app_task.h"
#include "fr_device_pmu_io.h"
#include "fr_device_button.h"
#include "app_lvgl.h"
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#define BUTTON_IDX_MAX 1
#define BUTTON_SHORT_DURING 0x08 // x10ms
#define BUTTON_LONG_DURING 0x14 // x100ms
#define BUTTON_LONG_LONG_DURING 0x28 // x100ms
#define BUTTON_MULTI_INTERVAL 0x14 // x10ms
#define BUTTON_LONG_PRESSING_INTERVAL 0x1e // x10ms
uint8_t current_state = BUTTON_WORKING_STATE_IDLE;
uint16_t button_task_id;
xTimerHandle button_anti_shake_timer;
xTimerHandle button_pressing_timer;
xTimerHandle button_state_timer;
xTimerHandle moto_mode_button_state_timer;
xTimerHandle moto_set_button_state_timer;
/* which io is enabled for button function */
uint32_t button_io_mask = 0;
uint32_t curr_button_before_anti_shake = 0;
uint32_t current_pressed_button = 0;
uint32_t last_saved_button = 0;
uint32_t button_to_be_send = 0; //for multi click
uint8_t pressed_cnt = 0; //for multi click
void button_toggle_detected(uint32_t curr_button)
{
if(button_io_mask != 0) {
curr_button_before_anti_shake = curr_button & button_io_mask;
if(xPortIsInsideInterrupt())
xTimerStartFromISR( button_anti_shake_timer, NULL );
else
xTimerStart(button_anti_shake_timer, 0);
}
}
void button_int_isr(uint32_t changed_button)
{
uint32_t curr_button;
curr_button = current_pressed_button ^ changed_button;
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_BTN_TOGGLE, sizeof(uint32_t), false);
if(event)
{
memcpy(event->param, (void *)&curr_button, sizeof(uint32_t));
event->param_len = sizeof(uint32_t);
app_task_event_post(event, false);
}
}
void button_send_event(uint8_t event, uint32_t button, uint8_t cnt)
{
struct button_msg_t msg;
msg.button_index = button;
msg.button_type = event;
msg.button_cnt = cnt;
struct app_task_event *toggle_event;
toggle_event = app_task_event_alloc(APP_TASK_EVENT_BTN_OUTPUT, sizeof(msg), false);
if(toggle_event)
{
memcpy(toggle_event->param, (void *)&msg, sizeof(msg));
toggle_event->param_len = sizeof(msg);
app_task_event_post(toggle_event, false);
}
pressed_cnt = 0;
}
static void button_idle(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
}
static void button_just_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_state_timer,0);
button_send_event(BUTTON_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_PRESSED;
xTimerChangePeriod(button_state_timer, (BUTTON_LONG_DURING*10-BUTTON_SHORT_DURING)*10,0);
xTimerStart(button_state_timer,0);
}
}
static void button_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
if(0/*__jump_table.button_disable_multi_click*/ & last_saved_button)
{
current_state = BUTTON_WORKING_STATE_IDLE;
button_send_event(BUTTON_SHORT_PRESSED, last_saved_button, 0);
}
else
{
//TBD<42><44><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
current_state = BUTTON_WORKING_STATE_WAIT_MULTI;
button_to_be_send = last_saved_button;
pressed_cnt++;
xTimerChangePeriod(button_state_timer,BUTTON_MULTI_INTERVAL*10,0);
xTimerStart(button_state_timer,0);
}
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_LONG_PRESSED;
xTimerChangePeriod(button_state_timer, ((BUTTON_LONG_LONG_DURING-BUTTON_LONG_DURING)*10)*10,0);
xTimerStart(button_state_timer,0);
xTimerChangePeriod(button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10,0);
xTimerStart(button_pressing_timer,0);
button_send_event(BUTTON_LONG_PRESSED, current_pressed_button, pressed_cnt);
}
}
static void button_wait_multi(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
if(current_pressed_button != button_to_be_send)
{
if(pressed_cnt > 1)
{
button_send_event(BUTTON_MULTI_PRESSED, button_to_be_send, pressed_cnt);
}
else
{
button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
}
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_IDLE;
if(pressed_cnt > 1)
{
button_send_event(BUTTON_MULTI_PRESSED, button_to_be_send, pressed_cnt);
}
else
{
button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
}
}
}
static void button_long_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_LONG_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
button_send_event(BUTTON_LONG_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_LONG_LONG_PRESSED;
button_send_event(BUTTON_LONG_LONG_PRESSED, current_pressed_button, pressed_cnt);
}
}
static void button_long_long_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
xTimerStop(button_pressing_timer,0);
current_state = BUTTON_WORKING_STATE_IDLE;
button_send_event(BUTTON_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
button_send_event(BUTTON_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
}
}
static void button_comb_just_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_state_timer,0);
button_send_event(BUTTON_COMB_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_RELEASED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_COMB_PRESSED;
xTimerChangePeriod(button_state_timer, (BUTTON_LONG_DURING*10-BUTTON_SHORT_DURING)*10,0);
xTimerStart(button_state_timer,0);
}
}
static void button_comb_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_state_timer,0);
button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_COMB_LONG_PRESSED;
xTimerChangePeriod(button_state_timer, ((BUTTON_LONG_LONG_DURING-BUTTON_LONG_DURING)*10)*10,0);
xTimerStart(button_state_timer,0);
xTimerChangePeriod(button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10,0);
xTimerStart(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_PRESSED, current_pressed_button, pressed_cnt);
}
}
static void button_comb_long_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
{
current_state = BUTTON_WORKING_STATE_COMB_LONG_LONG_PRESSED;
button_send_event(BUTTON_COMB_LONG_LONG_PRESSED, current_pressed_button, pressed_cnt);
}
}
static void button_comb_long_long_pressed(uint8_t event)
{
if(event == BUTTON_WORKING_EVENT_RELEASED)
{
current_state = BUTTON_WORKING_STATE_IDLE;
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
{
current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
}
else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
{
current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
xTimerChangePeriod(button_state_timer, BUTTON_SHORT_DURING*10,0);
xTimerStart(button_state_timer,0);
xTimerStop(button_pressing_timer,0);
button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
}
}
void (*const button_statemachines[BUTTON_WORKING_STATE_MAX])(uint8_t) =
{
button_idle,
button_just_pressed,
button_pressed,
button_wait_multi,
button_long_pressed,
button_long_long_pressed,
button_comb_just_pressed,
button_comb_pressed,
button_comb_long_pressed,
button_comb_long_long_pressed,
};
//one or more button is released or pressed
int button_toggle_handler(uint32_t curr_button)
{
enum button_working_event_t event;
current_pressed_button = curr_button;
if(last_saved_button != current_pressed_button)
{
if(current_pressed_button == 0)
{
event = BUTTON_WORKING_EVENT_RELEASED;
}
else
{
if((current_pressed_button & (current_pressed_button-1)) == 0)
{
event = BUTTON_WORKING_EVENT_SINGLE_PRESSED;
}
else
{
event = BUTTON_WORKING_EVENT_COMB_PRESSED;
}
}
button_statemachines[current_state](event);
last_saved_button = current_pressed_button;
}
return 0;
}
static void button_timeout_handler( TimerHandle_t xTimer)
{
button_statemachines[current_state](BUTTON_WORKING_EVENT_TIME_OUT);
}
static void button_pressing_timeout_handler( TimerHandle_t xTimer )
{
enum button_type_t event;
if((current_pressed_button & (current_pressed_button - 1)) == 0)
{
event = BUTTON_LONG_PRESSING;
}
else
{
event = BUTTON_COMB_LONG_PRESSING;
}
button_send_event(event, current_pressed_button, pressed_cnt);
xTimerChangePeriod(button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10,0);
xTimerStart(button_pressing_timer,0);
}
static void button_anti_shake_timeout_handler( TimerHandle_t xTimer )
{
uint32_t curr_button;
curr_button = ool_read16(PMU_REG_PIN_DATA);
curr_button &= button_io_mask;
if(curr_button == curr_button_before_anti_shake)
{
curr_button ^= button_io_mask;
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_BTN_TOGGLE, sizeof(uint32_t), false);
if(event)
{
memcpy(event->param, (void *)&curr_button, sizeof(uint32_t));
event->param_len = sizeof(uint32_t);
app_task_event_post(event, false);
}
}
}
void button_event_handler(void * param)
{
struct button_msg_t *button_msg;
const char *button_type_str[] = {
"BUTTON_PRESSED",
"BUTTON_RELEASED",
"BUTTON_SHORT_PRESSED",
"BUTTON_MULTI_PRESSED",
"BUTTON_LONG_PRESSED",
"BUTTON_LONG_PRESSING",
"BUTTON_LONG_RELEASED",
"BUTTON_LONG_LONG_PRESSED",
"BUTTON_LONG_LONG_RELEASED",
"BUTTON_COMB_PRESSED",
"BUTTON_COMB_RELEASED",
"BUTTON_COMB_SHORT_PRESSED",
"BUTTON_COMB_LONG_PRESSED",
"BUTTON_COMB_LONG_PRESSING",
"BUTTON_COMB_LONG_RELEASED",
"BUTTON_COMB_LONG_LONG_PRESSED",
"BUTTON_COMB_LONG_LONG_RELEASED",
};
button_msg = (struct button_msg_t *)param;
uint8_t encode_bit_code = 0;
printf("KEY 0x%08x, TYPE %s. %d\r\n", button_msg->button_index, button_type_str[button_msg->button_type],button_msg->button_type);
if(button_msg->button_type == BUTTON_PRESSED) //short button
{
if(button_msg->button_index == 113)
{
if(!gui_task_resume()){
encode_bit_code = 113;
//gui_task_msg_send(BUTTON_KEY_EVT,NULL,0,NULL,0,NULL);
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
encode_bit_code = 0x0;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
}
else if(button_msg->button_index == 119)
{
if(!gui_task_resume())
{
encode_bit_code = 119;
// gui_task_msg_send(BUTTON_KEY2_EVT,NULL,0,NULL,0,NULL);
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);\
encode_bit_code = 0x0;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
}
}
else if(button_msg->button_type == BUTTON_LONG_PRESSED)//long
{
if(button_msg->button_index == 113)
{
if(!gui_task_resume())
gui_task_msg_send(BUTTON_KEY_EVT,NULL,0,NULL,0,NULL);
}
else if(button_msg->button_index == 119)
{
if(!gui_task_resume())
{
gui_task_msg_send(BUTTON_KEY2_EVT,NULL,0,NULL,0,NULL);
}
}
}
}
void button_init(uint32_t enable_io)
{
button_io_mask = enable_io;
button_anti_shake_timer = xTimerCreate("button_anti_shake_timer", 10, pdFALSE, NULL, button_anti_shake_timeout_handler);
button_pressing_timer = xTimerCreate("button_pressing_timer", BUTTON_LONG_PRESSING_INTERVAL * 10, pdFALSE, NULL, button_pressing_timeout_handler);
button_state_timer = xTimerCreate("button_state_timer", 10 , pdFALSE, NULL, button_timeout_handler);
}
#define BUTTON_SET 0X00
#define BUTTON_MODE 0X01
#define BUTTON_LONG_SET 0X02
#define BUTTON_LONG_MODE 0X03
enum
{
LV_KEY_RESET = 0, // 0x11
LV_KEY_SET = 10, // 0x71
LV_KEY_MODE = 119, // 0x77
LV_KEY_LONG_SET = 114, // 0x72
LV_KEY_LONG_MODE = 120, // 0x78
};
#define SHORT_PRESS_THRESHOLD 200
static bool button_set_status(void){
bool status ;
status = gpio_read_pin(GPIOB, GPIO_PIN_10);
return status;
}
static bool button_mode_status(void){
bool status ;
status = gpio_read_pin(GPIOB, GPIO_PIN_11);
return status;
}
extern uint8_t key_code;
extern uint32_t encode_release_last_time;
extern uint8_t lvgl_start;
static void button_task(void *arg)
{
bool set_status = 1;
bool mode_status = 1;
uint16_t set_endTime = 0;
uint16_t mode_endTime = 0;
bool set_flag_Pressed = false; //按下为true
bool mode_flag_Pressed = false; //按下为true
uint8_t encode_bit_code = 0;
for(;;){
vTaskDelay(10);
set_status = button_set_status();
mode_status = button_mode_status();
if(lvgl_start!=1)
continue;
if (!set_status && !set_flag_Pressed)
set_flag_Pressed = true;
if(!set_status && set_flag_Pressed)
set_endTime++;
if (set_status && set_flag_Pressed) {
set_flag_Pressed = false;
if (set_endTime < SHORT_PRESS_THRESHOLD) {
//printf("set BUTTON_KEY_EVT============== set_endTime = %d \r\n",set_endTime);
encode_release_last_time = set_endTime;//portGET_RUN_TIME_COUNTER_VALUE();
encode_bit_code = LV_KEY_SET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
vTaskDelay(80);
encode_bit_code = LV_KEY_RESET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
} else{
//printf("set long press ENCODE_KEY_EVT============== set_endTime %d\r\n",set_endTime);
encode_bit_code = LV_KEY_LONG_SET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
vTaskDelay(80);
encode_bit_code = LV_KEY_RESET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
set_endTime =0;
}
if (!mode_status && !mode_flag_Pressed)
mode_flag_Pressed = true;
if(!mode_status && mode_flag_Pressed)
mode_endTime++;
if(mode_status && mode_flag_Pressed) {
mode_flag_Pressed = false;
if (mode_endTime < SHORT_PRESS_THRESHOLD) {//短按
//printf("mode BUTTON_KEY2_EVT============== mode_endTime =%d\r\n",mode_endTime);
encode_bit_code = LV_KEY_MODE;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
vTaskDelay(80);
encode_bit_code = LV_KEY_RESET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
} else{
//printf("mode long press BUTTON_KEY2_EVT============== mode_endTime =%d\r\n",mode_endTime);
encode_bit_code = LV_KEY_LONG_MODE;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
vTaskDelay(80);
encode_bit_code = LV_KEY_RESET;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
mode_endTime =0;
}
}
}
void button_gpio_config(void)
{
GPIO_InitTypeDef gpio_config;
__SYSTEM_GPIOB_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_10 | GPIO_PIN_11;
gpio_config.Mode = GPIO_MODE_INPUT;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
xTaskCreate(button_task, "buttontask", RPMSG_TASK_STACK_SIZE, NULL, RPMSG_TASK_PRIORITY, NULL);
}

View File

@ -0,0 +1,82 @@
#ifndef _BUTTON_H
#define _BUTTON_H
#include <stdint.h>
enum button_event_t
{
BUTTON_TOGGLE,
BUTTON_PRESSED_EVENT,
BUTTON_TIMER_TO_TIMER,
BUTTON_PRESSING_TO_TIMER,
BUTTON_ANTI_SHAKE_TO_TIMER,
};
enum button_type_t
{
BUTTON_PRESSED,
BUTTON_RELEASED,
BUTTON_SHORT_PRESSED,
BUTTON_MULTI_PRESSED,
BUTTON_LONG_PRESSED,
BUTTON_LONG_PRESSING,
BUTTON_LONG_RELEASED,
BUTTON_LONG_LONG_PRESSED,
BUTTON_LONG_LONG_RELEASED,
BUTTON_COMB_PRESSED,
BUTTON_COMB_RELEASED,
BUTTON_COMB_SHORT_PRESSED,
BUTTON_COMB_LONG_PRESSED,
BUTTON_COMB_LONG_PRESSING,
BUTTON_COMB_LONG_RELEASED,
BUTTON_COMB_LONG_LONG_PRESSED,
BUTTON_COMB_LONG_LONG_RELEASED,
};
enum button_working_state_t
{
BUTTON_WORKING_STATE_IDLE,
BUTTON_WORKING_STATE_JUST_PRESSED,
BUTTON_WORKING_STATE_PRESSED,
BUTTON_WORKING_STATE_WAIT_MULTI,
BUTTON_WORKING_STATE_LONG_PRESSED,
BUTTON_WORKING_STATE_LONG_LONG_PRESSED,
BUTTON_WORKING_STATE_COMB_JUST_PRESSED,
BUTTON_WORKING_STATE_COMB_PRESSED,
BUTTON_WORKING_STATE_COMB_LONG_PRESSED,
BUTTON_WORKING_STATE_COMB_LONG_LONG_PRESSED,
BUTTON_WORKING_STATE_MAX,
};
enum button_working_event_t
{
BUTTON_WORKING_EVENT_RELEASED,
BUTTON_WORKING_EVENT_SINGLE_PRESSED,
BUTTON_WORKING_EVENT_COMB_PRESSED,
BUTTON_WORKING_EVENT_TIME_OUT,
};
struct button_toggle_param_t
{
uint32_t curr_button;
uint32_t timestamp;
};
struct button_msg_t
{
uint32_t button_index;
uint8_t button_type;
uint8_t button_cnt; // only for multi click
};
void button_toggle_detected(uint32_t curr_button);
void button_int_isr(uint32_t changed_button);
void button_init(uint32_t enable_io);
void button_gpio_config(void);
int button_toggle_handler(uint32_t curr_button);
void button_event_handler(void *param);
#endif //_BUTTON_H

View File

@ -0,0 +1,188 @@
#include "fr_device_charge.h"
#include "app_lvgl.h"
static uint8_t charge_status = CHARGING_IDLE;
/************************************************************************************
* @fn charge init
*
* @brief charge init
*/
void device_charge_init(void)
{
uint32_t timeout_count = 10;
/* enable charge function, and set charge current & voltage. */
pmu_charge_enable(PMU_CHG_CUR_88mA, PMU_CHG_END_VOL_4_1);
#if 1
while(timeout_count)
{
/* Check that the charger is connected */
if (read_analog_status() & PMU_CHG_ACOK_STATUS_BIT)
{ /* filter */
//system_delay_us(100);
if (read_analog_status() & PMU_CHG_ACOK_STATUS_BIT)
{ /* The charger is connected. Check out action */
pmu_charge_monitor_en(PMU_CHARGING_OUT);
/* Check that the battery is full */
pmu_battery_full_monitor_en(PMU_BATTERY_FULL);
printf("charge config 1 \r\n");
charge_status = CHARGING_IN;
charge_vbat_toggle_detected(charge_status);
break;
}
}
else
{ /* filter */
//system_delay_us(100);
if ((read_analog_status() & PMU_CHG_ACOK_STATUS_BIT) == 0)
{ /* The charger not connected. Check in action */
pmu_charge_monitor_en(PMU_CHARGING_IN);
printf("charge config 2 \r\n");
charge_status = CHARGING_IDLE;
charge_vbat_toggle_detected(charge_status);
break;
}
}
timeout_count--;
if (timeout_count == 0)
printf("ACOK status timeout");
}
NVIC_EnableIRQ(PMU_IRQn);
#endif
//while(1);
}
void PMU_Charge_Monitor_IRQHandler(void)
{
if (read_analog_status() & PMU_CHG_ACOK_STATUS_BIT)
{
//printf("charge in...\r\n");
/* The charger is connected. Check out action */
pmu_charge_monitor_en(PMU_CHARGING_OUT);
/* Check that the battery is full */
pmu_battery_full_monitor_en(PMU_BATTERY_FULL);
charge_status = CHARGING_IN;
}
else
{
//printf("charge out...\r\n");
/* The charger not connected. Check in action */
pmu_charge_monitor_en(PMU_CHARGING_IN);
charge_status = CHARGING_OUT;
}
charge_vbat_toggle_detected(charge_status);
}
void PMU_Battery_Full_IRQHandler(void)
{
if (read_analog_status() & PMU_BATFULL_STATUS_BIT)
{
//printf("full...\r\n");
/* The battery is full. Check that the battery not full */
pmu_battery_full_monitor_en(PMU_BATTERY_NOT_FULL);
charge_status = CHARGING_FULL;
}
else
{
//printf("not full\r\n");
/* The battery not full. Check that the battery is full */
pmu_battery_full_monitor_en(PMU_BATTERY_FULL);
charge_status = CHARGING_NOT_FULL;
}
charge_vbat_toggle_detected(charge_status);
}
/*
send vbat charge status
*/
void charge_vbat_toggle_detected(uint8_t sat)
{
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_CHARGE_OUTPUT, sizeof(uint8_t), false);
if(event)
{
memcpy(event->param, (void *)&sat, sizeof(uint8_t));
event->param_len = sizeof(uint8_t);
app_task_event_post(event, false);
}
}
void charge_event_handle(uint8_t param)
{
printf("%s param=%d \r\n",__func__,param);
switch(param)
{
case CHARGING_IDLE:
printf("---> CHARGING_IDLE \r\n");
break;
case CHARGING_IN:
printf("---> CHARGING_IN \r\n");
if(gui_task_handle_is_active() == NULL)
return;
gui_task_resume();
gui_task_msg_send(POWER_CHARGE_IN_EVT,NULL,0,NULL,0,NULL);
break;
case CHARGING_OUT:
printf("---> CHARGING_OUT \r\n");
if(gui_task_handle_is_active() == NULL)
return;
gui_task_resume();
gui_task_msg_send(POWER_CHARGE_OUT_EVT,NULL,0,NULL,0,NULL);
break;
case CHARGING_FULL:
printf("---> CHARGING_FULL \r\n");
break;
case CHARGING_NOT_FULL:
printf("---> CHARGING_NOT_FULL \r\n");
break;
}
}
uint8_t get_charge_status(void)
{
return charge_status;
}

View File

@ -0,0 +1,33 @@
#ifndef __FR_DEVICE_CHARGE__
#define __FR_DEVICE_CHARGE__
#ifdef __cplusplus
extern "C" {
#endif
#include "fr30xx.h"
#include "app_task.h"
#define read_analog_status() ool_read(PMU_REG_ANA_STATUS)
typedef enum
{
CHARGING_IDLE = 0,
CHARGING_IN,
CHARGING_OUT,
CHARGING_FULL,
CHARGING_NOT_FULL,
}enum_charge_type_t;
extern void device_charge_init(void);
extern void charge_vbat_toggle_detected(uint8_t sat);
extern void charge_event_handle(uint8_t param);
extern uint8_t get_charge_status(void);
#ifdef __cplusplus
}
#endif
#endif /* __FR_DEVICE_CHARGE__ */

View File

@ -0,0 +1,264 @@
#include <stdint.h>
#include <stddef.h>
#include "driver_gpio.h"
#include "fr30xx.h"
#include "app_task.h"
#include "fr_device_pmu_io.h"
#include "fr_device_encode.h"
#include "app_lvgl.h"
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
extern uint8_t key_code;
#define ENCODE_FILO_LEN 16
static uint8_t encode_bit_status = 0;
static uint8_t encode_bit_code = 0;
encode_type_t encode_table_filo[ENCODE_FILO_LEN];
uint8_t encode_table_key[ENCODE_FILO_LEN];
uint8_t key_release_flag = 0;
const uint8_t encode_table_value[8][5] =
{
{0x01, 0x00, 0x02, 0x03, 0x01},
{0x02, 0x03, 0x01, 0x00, 0x01},
{0x03, 0x01, 0x00, 0x02, 0x01},
{0x00, 0x02, 0x03, 0x01, 0x01},
{0x02, 0x00, 0x01, 0x03, 0x02},
{0x01, 0x03, 0x02, 0x00, 0x02},
{0x03, 0x02, 0x00, 0x01, 0x02},
{0x00, 0x01, 0x03, 0x02, 0x02},
};
uint32_t encode_last_time;
static uint32_t get_encode_basetime(void)
{
uint32_t cur_base_time = portGET_RUN_TIME_COUNTER_VALUE();
uint32_t diff;
if(cur_base_time >= encode_last_time)
diff = cur_base_time - encode_last_time;
else
diff = (((uint32_t)0xFFFFFFFF) - encode_last_time) + cur_base_time + 1;
encode_last_time = cur_base_time;
return diff;
}
uint32_t encode_release_last_time;
static uint32_t get_encode_release_basetime(void)
{
uint32_t cur_base_time = portGET_RUN_TIME_COUNTER_VALUE();
uint32_t diff;
if(cur_base_time >= encode_release_last_time)
diff = cur_base_time - encode_release_last_time;
else
diff = (((uint32_t)0xFFFFFFFF) - encode_release_last_time) + cur_base_time + 1;
return diff;
}
void clear_encode_fifo(void)
{
encode_last_time = portGET_RUN_TIME_COUNTER_VALUE();
memset(encode_table_filo,0,ENCODE_FILO_LEN*2);
}
void encode_push_key(uint8_t key_value)
{
uint8_t i;
uint32_t time;
time = get_encode_basetime();
if(time <= 3)
{
time += encode_table_filo[0].time;
if(time > 0xff)
time = 0xff;
encode_table_filo[0].time = time;
encode_table_filo[0].keyvalue = key_value;
// printf("fiter");
}
else
{
for(i = ENCODE_FILO_LEN - 1; i > 0; i -- )
{
encode_table_filo[i] = encode_table_filo[i - 1];
}
encode_table_filo[0].keyvalue = key_value;
if(time > 255)
{
encode_table_filo[0].time = 0xff;
// printf("\n");
// printf("\n");
// printf("\n");
// printf("\n");
// printf("\n");
// printf("\n");
}
else
encode_table_filo[0].time = time;
}
// printf("keyvlue:");
// for(i = 0; i < 15; i ++ )
// {
// printf("%d/", encode_table_filo[i].keyvalue);
// printf("%d ", encode_table_filo[i].time);
// }
// printf("\n");
}
uint8_t get_encode_start(void)
{
uint8_t i = 0;
while(i < ENCODE_FILO_LEN)
{
if(encode_table_filo[i].time == 0xff)
{
i ++;
break;
}
i ++;
}
return i;
}
void encode_event_handle(uint8_t key_value)
{
uint8_t len;
uint8_t start;
uint8_t i,j;
// if (get_charte_state())
// return;
// if (system_enter_music_flag)
// return;
//printf("value %d\n", key_value);
start = get_encode_start();
len = start;
for(i = 0; i < len; i++)
{
encode_table_key[i] = encode_table_filo[start - 1].keyvalue;
start --;
}
if(len > 4)
{
j = 0;
while(j < (len-4))
{
i = 0;
while(i < 8)
{
if(memcmp(&encode_table_value[i][0],encode_table_key+j,4) == 0)
{
//if(!key_release_flag)
{
//os_timer_stop(&encode_release_timer);
encode_bit_code = encode_table_value[i][4];
//printf("code %d \n",encode_bit_code);
key_release_flag = 1;
if(!gui_task_resume())
{
encode_release_last_time = portGET_RUN_TIME_COUNTER_VALUE();
encode_bit_code |= 0x80;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
return;
}
}
i ++;
}
j++;
}
}
else if((len >= 2) && (len <= 4))
{
i = 0;
while(i < 8)
{
if(memcmp(&encode_table_value[i][0],encode_table_key,len) == 0)
{
//if(!key_release_flag)
{
//os_timer_stop(&encode_release_timer);
encode_bit_code = encode_table_value[i][4];
//printf("code %d \n",encode_bit_code);
key_release_flag = 1;
if(!gui_task_resume())
{
encode_release_last_time = portGET_RUN_TIME_COUNTER_VALUE();
encode_bit_code |= 0x80;
gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
}
return;
}
}
i ++;
}
}
}
bool encode_key_release(void)
{
if(get_encode_release_basetime() > 10)
{
key_code = 0;
return true;
}
return false;
}
void encode_toggle_detected(uint8_t curr_encode)
{
//printf("encode %d \n",curr_encode);
if(encode_bit_status != curr_encode)
{
encode_bit_status = curr_encode;
encode_push_key(curr_encode);
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_ENCODE_TOGGLE, sizeof(uint8_t), false);
if(event)
{
memcpy(event->param, (void *)&curr_encode, sizeof(uint8_t));
event->param_len = sizeof(uint8_t);
app_task_event_post(event, false);
}
}
}

View File

@ -0,0 +1,21 @@
#ifndef __FR_DEVICE_ENCODE_H__
#define __FR_DEVICE_ENCODE_H__
#include <stdint.h>
typedef struct
{
uint8_t keyvalue;
uint8_t time; //1 ms as unit
}encode_type_t;
bool encode_key_release(void);
void encode_toggle_detected(uint8_t curr_encode);
void encode_event_handle(uint8_t key_value);
#endif //__FR_DEVICE_ENCODE_H__

View File

@ -0,0 +1,38 @@
#include "fr_device_pa.h"
bool pa_enable_flag = false;
void device_pa_init(void)
{
GPIO_InitTypeDef gpio_config;
__SYSTEM_GPIOA_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_6;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLDOWN;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOA, &gpio_config);
pa_enable_flag = false;
gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_CLEAR); //defaultoutput low
}
void device_pa_enable(void)
{
if(pa_enable_flag == false){
printf("PA enable\r\n");
pa_enable_flag = true;
gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); //output high
}
}
void device_pa_disable(void)
{
if(pa_enable_flag == true){
printf("PA disable\r\n");
pa_enable_flag = false;
gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_CLEAR); //output low
}
}

View File

@ -0,0 +1,21 @@
#ifndef __FR_DEVICE_PA__
#define __FR_DEVICE_PA__
#ifdef __cplusplus
extern "C" {
#endif
#include "fr30xx.h"
#include "app_task.h"
extern void device_pa_init(void);
extern void device_pa_enable(void);
extern void device_pa_disable(void);
#ifdef __cplusplus
}
#endif
#endif /* __FR_DEVICE_PA__ */

View File

@ -0,0 +1,118 @@
/*********************
* INCLUDES
*********************/
#include "driver_gpio.h"
#include "fr30xx.h"
#include "app_lvgl.h"
#include "fr_device_pmu_io.h"
#include "fr_device_button.h"
#include "fr_device_encode.h"
/*********************
* DEFINES
*********************/
#define BUTTON_DEBUG(fmt,arg...) printf("[BUTTON]"fmt,##arg)
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* EXTERN FUNCTIONS
**********************/
/**********************
* FUNCTIONS
**********************/
void device_pmu_io_init(void)
{
pmu_gpio_int_init(BUTTON_PIN_NUM, PMU_GPIO_PULL_UP, 1);
pmu_gpio_int_init(SOS_KEY_PIN_NUM, PMU_GPIO_PULL_UP, 1);
pmu_gpio_int_init(KEY1_PIN_NUM, PMU_GPIO_PULL_UP, 1);
pmu_gpio_int_init(ENCONDED_A_PIN_NUM, PMU_GPIO_PULL_UP, 1);
pmu_gpio_int_init(ENCONDED_B_PIN_NUM, PMU_GPIO_PULL_UP, 1);
pmu_enable_isr(PMU_GPIO_PMU_INT_MSK_BIT);
NVIC_SetPriority(PMU_IRQn, 4);
NVIC_EnableIRQ(PMU_IRQn);
}
void PMU_GPIO_PMU_IRQHandler(void)
{
uint16_t data = ool_read16(PMU_REG_PIN_DATA);
uint16_t result = ool_read16(PMU_REG_PIN_XOR_RESULT);
/* update last value with latest data */
ool_write16(PMU_REG_PIN_LAST_V, data);
/* clear last XOR result */
ool_write16(PMU_REG_PIN_XOR_CLR, result);
// printf("PMU IO: 0x%04x, 0x%04x\r\n", data, result);
if (data & PMU_PIN_9) {
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_TYPE_HCI_RX);
}
else {
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_TYPE_HCI_RX);
}
if (result & (ENCONDED_A_PIN_NUM | ENCONDED_B_PIN_NUM)) {
uint8_t encode_bit_status;
if (!(data & ENCONDED_A_PIN_NUM))
{
encode_bit_status |= 0x02;
}
else
{
encode_bit_status &= 0xFD;
}
if (!(data & ENCONDED_B_PIN_NUM))
{
encode_bit_status |= 0x01;
}
else
{
encode_bit_status &= 0xFE;
}
encode_toggle_detected(encode_bit_status);
}
if (result & (BUTTON_PIN_NUM | SOS_KEY_PIN_NUM | KEY1_PIN_NUM)) {
button_toggle_detected(data);
}
}

View File

@ -0,0 +1,108 @@
#ifndef __FR_DEVICE_PMU_IO_H__
#define __FR_DEVICE_PMU_IO_H__
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "app_config.h"
/*********************
* DEFINES
*********************/
#if BOARD_SEL == BOARD_EVB_FR5090
#define BUTTON_PIN_NUM PMU_PIN_7
#define SOS_KEY_PIN_NUM PMU_PIN_5
#define KEY1_PIN_NUM PMU_PIN_4
#define ENCONDED_A_PIN_NUM PMU_PIN_2
#define ENCONDED_B_PIN_NUM PMU_PIN_3
#define PMU_IO_INTTERUPT_DEFAULT (BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|KEY1_PIN_NUM|ENCONDED_A_PIN_NUM|ENCONDED_B_PIN_NUM)
#elif BOARD_SEL == BOARD_EVB_FR3092E
#define BUTTON_PIN_NUM PMU_PIN_7
#define SOS_KEY_PIN_NUM PMU_PIN_5
#define KEY1_PIN_NUM PMU_PIN_4
#define ENCONDED_A_PIN_NUM PMU_PIN_2
#define ENCONDED_B_PIN_NUM PMU_PIN_3
#define PMU_IO_INTTERUPT_DEFAULT (BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|ENCONDED_A_PIN_NUM|ENCONDED_B_PIN_NUM)
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
#define BUTTON_PIN_NUM PMU_PIN_4
#define SOS_KEY_PIN_NUM PMU_PIN_5
#define KEY1_PIN_NUM PMU_PIN_3
#define ENCONDED_A_PIN_NUM PMU_PIN_7
#define ENCONDED_B_PIN_NUM PMU_PIN_6
#define PMU_IO_INTTERUPT_DEFAULT (BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|KEY1_PIN_NUM|ENCONDED_A_PIN_NUM|ENCONDED_B_PIN_NUM)
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
#define BUTTON_PIN_NUM PMU_PIN_7
#define SOS_KEY_PIN_NUM PMU_PIN_5
#define KEY1_PIN_NUM PMU_PIN_4
#define ENCONDED_A_PIN_NUM PMU_PIN_2
#define ENCONDED_B_PIN_NUM PMU_PIN_3
#define PMU_IO_INTTERUPT_DEFAULT (BUTTON_PIN_NUM|SOS_KEY_PIN_NUM|ENCONDED_A_PIN_NUM|ENCONDED_B_PIN_NUM)
#else
#error "choose correct board"
#endif
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* VARIABLES
**********************/
/**********************
* MACROS
**********************/
//default Time zone
/**********************
* EXTERN FUNCTIONS
**********************/
void device_pmu_io_init(void);
/**********************
* FUNCTIONS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif

View File

@ -0,0 +1,396 @@
/**
* @file fr_device_rtc.c
*
* @author tangzheng
*/
/*********************
* INCLUDES
*********************/
/* Standard includes. */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "fr30xx.h"
#include "FreeRTOS.h"
#include "lvgl.h"
#include "fr_device_rtc.h"
#include "fr_watch.h"
/*********************
* DEFINES
*********************/
#define RTC_DEBUG(fmt,arg...) printf("[RTC]"fmt,##arg)
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
#define BLE_BASETIMECNT_MASK ((uint32_t)0xFFFFFFFF) //((uint32_t)0x4FFFFFF)
uint32_t system_rtc_tick = 0;
uint32_t last_ke_time;
/**********************
* VARIABLES
**********************/
const unsigned char g_day_per_mon[MONTH_PER_YEAR] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
time_rtc_t rtc_time = {
.ucYear = 2023,
.ucMonth = 10,
.ucDate = 1,
.ucHour = 12,
.ucMinute = 0,
.ucSecond = 0,
};
time_zone_t gSysTimeZone = {
.h = 8,
.m = 0,
};
static uint32_t sys_utc_time;
/**********************
* MACROS
**********************/
/**********************
* EXTERN FUNCTIONS
**********************/
/**********************
* FUNCTIONS
**********************/
unsigned char applib_dt_is_leap_year(unsigned short year)
{
if((year % 400) == 0)
{
return 1;
}
else if((year % 100) == 0)
{
return 0;
}
else if((year % 4) == 0)
{
return 1;
}
else
{
return 0;
}
}
unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year)
{
if((month == 0) || (month > 12))
{
return g_day_per_mon[1] + applib_dt_is_leap_year(year);
}
if(month != 2)
{
return g_day_per_mon[month - 1];
}
else
{
return g_day_per_mon[1] + applib_dt_is_leap_year(year);
}
}
unsigned int CalcWeekday(time_rtc_t time)
{
char century_code, year_code, month_code, day_code;
int week = 0;
century_code = year_code = month_code = day_code = 0;
if(time.ucMonth == 1 || time.ucMonth == 2)
{
century_code = (time.ucYear - 1) / 100;
year_code = (time.ucYear - 1) % 100;
month_code = time.ucMonth + 12;
day_code = time.ucDate;
}
else
{
century_code = time.ucYear / 100;
year_code = time.ucYear % 100;
month_code = time.ucMonth;
day_code = time.ucDate;
}
week = year_code + year_code / 4 + century_code / 4 - 2 * century_code + 26 * (month_code + 1) / 10 + day_code - 1;
week = week > 0 ? (week % 7) : ((week % 7) + 7);
return week;
}
unsigned int utc_time_to_sec(time_rtc_t* currTime)
{
unsigned short i;
unsigned int no_of_days = 0;
int utc_time;
if(currTime->ucYear < UTC_BASE_YEAR)
{
return 0;
}
/* year */
for(i = UTC_BASE_YEAR; i < currTime->ucYear; i++)
{
no_of_days += (DAY_PER_YEAR + applib_dt_is_leap_year(i));
}
/* month */
for(i = 1; i < currTime->ucMonth; i++)
{
no_of_days += applib_dt_last_day_of_mon((unsigned char) i, currTime->ucYear);
}
/* day */
no_of_days += (currTime->ucDate - 1);
#if 0
/* sec */
//utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int)(currTime->ucHour * SEC_PER_HOUR +
// currTime->ucMinute * SEC_PER_MIN + currTime->ucSecond);
utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int)((currTime->ucHour-8) * SEC_PER_HOUR +
currTime->ucMinute * SEC_PER_MIN + currTime->ucSecond);
#else
utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int)(currTime->ucHour * SEC_PER_HOUR +
currTime->ucMinute * SEC_PER_MIN + currTime->ucSecond);
utc_time -= (gSysTimeZone.h * 3600 + gSysTimeZone.m * 60);
#endif
return utc_time;
}
void utc_sec_to_time(unsigned int utc_sec, time_rtc_t* result)
{
int sec, day;
unsigned short y;
unsigned char m;
unsigned short d;
//unsigned char dst;
#if 0
if(daylightSaving)
{
utc_sec += SEC_PER_HOUR;
}
#endif
utc_sec = utc_sec + gSysTimeZone.h * 3600 + gSysTimeZone.m * 60;
/* hour, min, sec */
/* hour */
sec = utc_sec % SEC_PER_DAY;
result->ucHour = sec / SEC_PER_HOUR;
/* min */
sec %= SEC_PER_HOUR;
result->ucMinute = sec / SEC_PER_MIN;
/* sec */
result->ucSecond = sec % SEC_PER_MIN;
/* year, month, day */
/* year */
/* year */
day = utc_sec / SEC_PER_DAY;
for(y = UTC_BASE_YEAR; day > 0; y++)
{
d = (DAY_PER_YEAR + applib_dt_is_leap_year(y));
if(day >= d)
{
day -= d;
}
else
{
break;
}
}
result->ucYear = y;
for(m = 1; m < MONTH_PER_YEAR; m++)
{
d = applib_dt_last_day_of_mon(m, y);
if(day >= d)
{
day -= d;
}
else
{
break;
}
}
result->ucMonth = m;
result->ucDate = (unsigned char)(day + 1);
//result->DayIndex = applib_dt_dayindex(result->ncYear, result->ucMonth, result->ucDate);
}
unsigned char system_time_set_time_zone(time_zone_t set)
{
if(gSysTimeZone.h == set.h && gSysTimeZone.m == set.m)
{
return 0;
}
gSysTimeZone = set;
return 1;
}
void system_time_set(time_rtc_t set)
{
rtc_time = set;
}
time_rtc_t *system_time_get(void)
{
return &rtc_time;
}
time_zone_t *system_time_get_timeZone(void)
{
return &gSysTimeZone;
}
//date & time
bool CalcDoYear(uint16_t ucYear)
{
if((ucYear % 400 == 0)
||((ucYear % 4 == 0) && (ucYear % 100 != 0)))
{
return 1; //run nian
}
return 0;
}
uint8_t CalcMaxDate(time_rtc_t time)
{
uint8_t dates;
switch(time.ucMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dates = 31;
break;
case 2:
if(CalcDoYear(time.ucYear))
dates = 29; //run nian
else
dates = 28;
break;
case 4:
case 6:
case 9:
case 11:
dates = 30;
break;
}
return dates;
}
uint32_t system_get_curr_time(void)
{
return portGET_RUN_TIME_COUNTER_VALUE();
//return system_rtc_tick;
}
static uint32_t get_sys_ke_basetime(void)
{
uint32_t cur_base_time = system_get_curr_time();
uint32_t diff;
if(cur_base_time >= last_ke_time)
diff = cur_base_time - last_ke_time;
else
diff = (BLE_BASETIMECNT_MASK - last_ke_time) + cur_base_time + 1;
return diff;
}
void dev_rtc_time_init(void)
{
sys_utc_time = utc_time_to_sec(&rtc_time);
last_ke_time = system_get_curr_time();
}
unsigned int get_sys_utc_time(void)
{
return sys_utc_time;
}
void fr_system_update_utc_time(time_rtc_t *cur_time)
{
sys_utc_time = utc_time_to_sec(cur_time);
}
void rtc_running(void)
{
uint32_t diff = get_sys_ke_basetime();
if( diff > 1000 )
{
uint32_t temp_time_value=0;
temp_time_value = diff / 1000;
last_ke_time += temp_time_value*1000;
//if( last_ke_time > BLE_BASETIMECNT_MASK)
// last_ke_time -= (BLE_BASETIMECNT_MASK+1);
sys_utc_time += temp_time_value;
utc_sec_to_time(sys_utc_time,&sync_cm3_data.time);
}
}

View File

@ -0,0 +1,83 @@
/**
* @file fr_device_rtc.h
*
* @author tangzheng
*/
#ifndef __FR_DEVICE_RTC_H__
#define __FR_DEVICE_RTC_H__
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
typedef struct {
signed char h;
signed char m;
}time_zone_t;
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* VARIABLES
**********************/
/**********************
* MACROS
**********************/
#define UTC_BASE_YEAR 1970
#define MONTH_PER_YEAR 12
#define DAY_PER_YEAR 365
#define SEC_PER_DAY 86400
#define SEC_PER_HOUR 3600
#define SEC_PER_MIN 60
//default Time zone
#define DEFAULT_TIME_ZONE {8, 00}
/**********************
* EXTERN FUNCTIONS
**********************/
extern void rtc_running(void);
extern void dev_rtc_time_init(void);
extern unsigned int get_sys_utc_time(void);
/**********************
* FUNCTIONS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif

View File

@ -0,0 +1,386 @@
#include "fr_device_vbat.h"
#include "fr_device_charge.h"
#include "fr_watch.h"
uint16_t CH_Data[10];
uint8_t Bat_voltage = 0;
bool bat_filo_init_flag = false;
/************************************************************************************
* @fn adc vbat start
*
* @brief adc vbat start
*/
void device_vbat_init(enum_ADC_Demo_t fe_demo)
{
adc_InitConfig_t ADC_Config;
__SYSTEM_ADC_CLK_ENABLE();
pmu_adc_power_ctrl(true);
pmu_vbe_power_ctrl(true);
switch(0)
{
case ADC_SOFTWARE_TRIGGER_MODE:
{
ADC_Config.ADC_Reference = ADC_REF_IOLDO;
ADC_Config.ADC_TriggerMode = ADC_SOFTWARE_TRIGGER;
#if 0
adc_set_channel_maping(0, ADC_CHANNEL_MAP_PMU_P4);
adc_set_channel_maping(1, ADC_CHANNEL_MAP_PMU_P5);
adc_set_channel_maping(2, ADC_CHANNEL_MAP_PMU_P6);
adc_set_channel_maping(3, ADC_CHANNEL_MAP_PMU_P7);
adc_set_channel_maping(4, ADC_CHANNEL_MAP_VABT);
adc_set_channel_maping(5, ADC_CHANNEL_MAP_VBE);
#else
adc_set_channel_maping(4, ADC_CHANNEL_MAP_VBAT);
#endif
adc_init(ADC_Config);
adc_soft_trigger_convert(4);
while(!adc_get_channel_valid_status(4));
uint16_t adc_result = adc_get_channel_data(4);
uint16_t vbat_vol = adc_result * 4 * 3300 / 1023;
//init filo
if(!bat_filo_init_flag)
{
battery_value_fifo_init(vbat_vol);
bat_filo_init_flag = true;
}
//transform to precentage
//Bat_voltage = transform_battery(vbat_vol);
Bat_voltage = battery_value_fifo_inc(transform_battery(vbat_vol));
sync_cm3_data.battery.battery_value = Bat_voltage;
printf("adc %d vol %d prec %d \r\n",adc_result,vbat_vol,Bat_voltage);
}
break;
#if 0
case ADC_HARDWARE_TRIGGER_LOOP_MODE:
{
ADC_Config.ADC_Reference = ADC_REF_IOLDO;
ADC_Config.ADC_TriggerMode = ADC_HARDWARE_TRIGGER;
ADC_Config.HardTriggerConfig.ADC_Channel_Max = 6;
ADC_Config.HardTriggerConfig.ADC_Convert_Mode = ADC_LOOP_MODE;
adc_init(ADC_Config);
adc_set_channel_maping(0, ADC_CHANNEL_MAP_PMU_P4);
adc_set_channel_maping(1, ADC_CHANNEL_MAP_PMU_P5);
adc_set_channel_maping(2, ADC_CHANNEL_MAP_PMU_P6);
adc_set_channel_maping(3, ADC_CHANNEL_MAP_PMU_P7);
adc_set_channel_maping(4, ADC_CHANNEL_MAP_VABT);
adc_set_channel_maping(5, ADC_CHANNEL_MAP_VBE);
adc_convert_start();
while(1)
{
for (int i = 0; i < 6; i++)
{
if (adc_get_channel_valid_status(i))
{
CH_Data[i] = adc_get_channel_data(i);
printf("Channel:%d, DATA:%d\r\n", i, CH_Data[i]);
}
}
}
}break;
case ADC_HARDWARE_TRIGGER_IT_MODE:
{
ADC_Config.ADC_Reference = ADC_REF_IOLDO;
ADC_Config.ADC_TriggerMode = ADC_HARDWARE_TRIGGER;
ADC_Config.HardTriggerConfig.ADC_Channel_Max = 6;
ADC_Config.HardTriggerConfig.ADC_Convert_Mode = ADC_LOOP_MODE;
adc_init(ADC_Config);
adc_set_channel_maping(0, ADC_CHANNEL_MAP_PMU_P4);
adc_set_channel_maping(1, ADC_CHANNEL_MAP_PMU_P5);
adc_set_channel_maping(2, ADC_CHANNEL_MAP_PMU_P6);
adc_set_channel_maping(3, ADC_CHANNEL_MAP_PMU_P7);
adc_set_channel_maping(4, ADC_CHANNEL_MAP_VABT);
adc_set_channel_maping(5, ADC_CHANNEL_MAP_VBE);
adc_convert_start_IT();
NVIC_EnableIRQ(ADC_IRQn);
while(1);
}break;
#endif
}
}
/*
get vbat voltage
*/
uint16_t device_get_vbat(void)
{
return Bat_voltage;
}
/*
adc vbat event handle
*/
void adc_vbat_event_handle(void)
{
device_vbat_init(ADC_SOFTWARE_TRIGGER_MODE);
}
/*
adc vbat start detect
*/
void adc_vbat_start_detect(void)
{
struct app_task_event *event;
event = app_task_event_alloc(APP_TASK_EVENT_ADC_VBAT_DETECT, 0, false);
if(event)
{
//memcpy(event->param, (void *)&curr_button, sizeof(uint32_t));
//event->param_len = sizeof(uint32_t);
app_task_event_post(event, false);
}
}
/*
adc isr
*/
void adc_irq(void)
{
for (int i = 0; i < 6; i++)
{
if (adc_get_channel_valid_status(i))
{
//printf("int channel: %d, DATA:%d\r\n", i, adc_get_channel_data(i));
}
}
}
const uint16_t g_battery_table[] =
{
//0-10 //3405
3405,
3410,
3415,
3420,
3425,
3430,
3435,
3440,
3446,
3452,
//10-20 //3458
3458,
3464,
3470,
3476,
3482,
3488,
3494,
3500,
3506,
3512,
//20-30 //3519
3516,
3520,
3524,
3528,
3532,
3536,
3540,
3544,
3548,
3552,
//30-40 //3555
3556,
3560,
3564,
3568,
3572,
3576,
3579,
3582,
3585,
3588,
//40-50 //3590
3591,
3594,
3597,
3602,
3605,
3608,
3611,
3614,
3617,
3620,
// 3800 --> 50% //3623
//50-60
3623,
3627,
3631,
3635,
3639,
3643,
3647,
3652,
3657,
3662,
// 3844
//60-70 //3667
3667,
3673,
3679,
3685,
3691,
3697,
3703,
3710,
3717,
3724,
// 3920
//70-80 //3731
3731,
3739,
3747,
3755,
3763,
3771,
3779,
3787,
3795,
3803,
//3980
//80-90 //3812
3811,
3819,
3827,
3835,
3843,
3851,
3859,
3867,
3875,
3883,
//4040
//90-100 //3830
3900,
3915,
3930,
3945,
3960,
3975,
3990,
4005,
4020,
4050,
};
uint8_t transform_battery(uint16_t battery_value)
{
uint8_t i = 100;
while(i > 0)
{
if(battery_value >= g_battery_table[i - 1])
{
break;
}
i --;
}
return i;
}
#define BATTERY_FIFO_MAX 20
uint8_t battery_detect_fifo[BATTERY_FIFO_MAX];
void battery_value_fifo_init(uint16_t value)
{
uint8_t voltage = transform_battery(value);
for(uint8_t i = 0; i < BATTERY_FIFO_MAX; i ++ )
{
battery_detect_fifo[i] = voltage;
}
Bat_voltage = voltage;
}
uint8_t battery_value_fifo_inc(uint8_t value)
{
for(uint8_t i = 0; i < (BATTERY_FIFO_MAX - 1); i ++ )
{
battery_detect_fifo[(BATTERY_FIFO_MAX - 1) - i] = battery_detect_fifo[(BATTERY_FIFO_MAX - 2) - i];
}
battery_detect_fifo[0] = value;
uint32_t battery_total = 0;
for(uint8_t i = 0; i < BATTERY_FIFO_MAX; i ++ )
{
battery_total += battery_detect_fifo[i];
}
uint8_t averages = battery_total / BATTERY_FIFO_MAX;
if(get_charge_status() == CHARGING_IN)
{
return averages;
}
else
{
if(averages > Bat_voltage)
{
return Bat_voltage;
}
else
{
return averages;
}
}
}

View File

@ -0,0 +1,32 @@
#ifndef __FR_DEVICE_BATTERY__
#define __FR_DEVICE_BATTERY__
#ifdef __cplusplus
extern "C" {
#endif
#include "fr30xx.h"
#include "app_task.h"
/* ADC demo select */
typedef enum
{
ADC_SOFTWARE_TRIGGER_MODE,
ADC_HARDWARE_TRIGGER_LOOP_MODE,
ADC_HARDWARE_TRIGGER_IT_MODE,
}enum_ADC_Demo_t;
/* Exported functions --------------------------------------------------------*/
extern void device_vbat_init(enum_ADC_Demo_t fe_demo);
extern void adc_vbat_event_handle(void);
extern void adc_vbat_start_detect(void);
extern uint8_t transform_battery(uint16_t battery_value);
extern uint8_t battery_value_fifo_inc(uint8_t value);
extern void battery_value_fifo_init(uint16_t value);
#ifdef __cplusplus
}
#endif
#endif /* __FR_DEVICE_BATTERY__ */

View File

@ -0,0 +1,526 @@
/**
*********************************************************************************************************
* @file lfs_port.c
* @brief
* @details
* @author tang zheng
* @date 2022-08-27
* @version v0.1
* *********************************************************************************************************
*/
#include "fr30xx.h"
#include "lfs_port.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#define ACCESS_EXTERN_FLASH_WIDTH_32BITS 1
lfs_t lfs;
QueueHandle_t lfs_semaphore;
volatile bool lfs_flash_read_dma_int = true;
void lfs_flash_read_callback(void)
{
lfs_flash_read_dma_int = false;
}
static int lfs_custom_flash_read(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, void *buffer, lfs_size_t size)
{
#ifdef LFS_EXT_FLASH
//IC_W25Qxx_Read_Data((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
//IC_W25Qxx_Read_Dual_Output((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
#if ACCESS_EXTERN_FLASH_WIDTH_32BITS == 0
IC_W25Qxx_Read_Quad_Output((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
#else
assert((size & 0x03) == 0);
assert(((uint32_t)buffer & 0x03) == 0);
__SPI_DISABLE(spi_flash_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_flash_handle.SPIx, SPI_FRAME_SIZE_32BIT);
__SPI_RX_ENDIAN_SET(spi_flash_handle.SPIx, TX_RX_Endian_1234);
IC_W25Qxx_Read_Quad_Output((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size>>2);
__SPI_DISABLE(spi_flash_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_flash_handle.SPIx, SPI_FRAME_SIZE_8BIT);
__SPI_RX_ENDIAN_SET(spi_flash_handle.SPIx, TX_RX_Endian_4321);
#endif
#if 0
//printf("E ................\r\n");
lfs_flash_read_dma_int = true;
IC_W25Qxx_Set_Read_Callback(lfs_flash_read_callback);
//IC_W25Qxx_Read_Dual_Output_DMA((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
IC_W25Qxx_Read_Quad_Output_DMA((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
while(lfs_flash_read_dma_int)
{
vTaskDelay(1);
printf("f w \r\n");
}
#endif
#if 0
lfs_flash_read_dma_int = true;
IC_W25Qxx_Set_Read_Callback(lfs_flash_read_callback);
//IC_W25Qxx_Read_Data_IT
//IC_W25Qxx_Read_Dual_Output_IT
//IC_W25Qxx_Read_Quad_Output_IT
IC_W25Qxx_Read_Quad_Output_IT((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
while(lfs_flash_read_dma_int)
{
//vTaskDelay(1);
printf("f w \r\n");
}
#endif
#else
flash_read(LFS_FLASH_START_ADRRESS+(block * c->block_size)+off,size,(uint8_t *)buffer);
#endif
return 0;
}
static int lfs_custom_flash_write(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size)
{
#ifdef LFS_EXT_FLASH
//IC_W25Qxx_PageProgram((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
IC_W25Qxx_PageProgram_Quad((uint8_t *)buffer, LFS_FLASH_START_ADRRESS+(block * c->block_size), size);
#else
flash_write(LFS_FLASH_START_ADRRESS+(block * c->block_size)+off,size,(uint8_t *)buffer);
#endif
return 0;
}
static int lfs_custom_flash_erase(const struct lfs_config *c, lfs_block_t block)
{
#ifdef LFS_EXT_FLASH
IC_W25Qxx_EraseSector(LFS_FLASH_START_ADRRESS+(block * c->block_size));
#else
flash_erase(LFS_FLASH_START_ADRRESS+(block * c->block_size), HAL_FLASH_BLOCK_4K);
#endif
return 0;
}
static int lfs_custom_flash_sync(const struct lfs_config *c)
{
return 0;
}
int32_t lfs_free_size(void)
{
int16_t block;
block=LFS_FLASH_SIZE/HAL_FLASH_BLOCK_4K-lfs_fs_size(&lfs);
if(block >= 0)
{
return block*HAL_FLASH_BLOCK_4K;
}
else
{
return -1;
}
}
int lfs_port_lock(const struct lfs_config *c)
{
uint32_t time_out_counter = 0;
while(xSemaphoreTake( lfs_semaphore, 0 ) != pdPASS)
{
vTaskDelay(1);
time_out_counter ++;
if(time_out_counter >= 1000)
return -1;
}
return 0;
// if( xSemaphoreTake( lfs_semaphore, 0 ) != pdPASS )
// {
// return -1;
// }
// else
// {
// return 0;
// }
}
int lfs_port_unlock(const struct lfs_config *c)
{
if( xSemaphoreGive( lfs_semaphore ) != pdPASS )
{
return -1;
}
else
{
return 0;
}
}
int extern_flash_lock(void)
{
if( xSemaphoreTake( lfs_semaphore, 0 ) != pdPASS )
{
return -1;
}
else
{
return 0;
}
}
int extern_flash_unlock(void)
{
if( xSemaphoreGive( lfs_semaphore ) != pdPASS )
{
return -1;
}
else
{
return 0;
}
}
void extern_flash_read(uint8_t *Buffer, uint32_t flash_Address, uint32_t Length)
{
while(extern_flash_lock())
{
vTaskDelay(1);
}
//IC_W25Qxx_Read_Quad_Output(Buffer, (flash_Address & 0x3fffffff), Length);
// while (Length) {
// uint32_t read_length;
// read_length = Length > 64 ? 64 : Length;
// IC_W25Qxx_Read_Quad_Output(Buffer, (flash_Address & 0x3fffffff), read_length);
// Buffer += read_length;
// flash_Address += read_length;
// Length -= read_length;
// }
//DMA
#if ACCESS_EXTERN_FLASH_WIDTH_32BITS == 0
lfs_flash_read_dma_int = true;
IC_W25Qxx_Set_Read_Callback(lfs_flash_read_callback);
IC_W25Qxx_Read_Quad_Output_DMA(Buffer, (flash_Address & 0x3fffffff), Length);
while(lfs_flash_read_dma_int)
{
vTaskDelay(1);
}
#else
__SPI_DISABLE(spi_flash_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_flash_handle.SPIx, SPI_FRAME_SIZE_32BIT);
__SPI_RX_ENDIAN_SET(spi_flash_handle.SPIx, TX_RX_Endian_1234);
while (Length) {
#define MAX_READ_FRAME_SIZE (64*4*1)
uint32_t single_length;
if (Length >= MAX_READ_FRAME_SIZE) {
single_length = MAX_READ_FRAME_SIZE;
// lfs_flash_read_dma_int = true;
// IC_W25Qxx_Set_Read_Callback(lfs_flash_read_callback);
// IC_W25Qxx_Read_Quad_Output_DMA(Buffer, (flash_Address & 0x3fffffff), single_length>>2);
// while(lfs_flash_read_dma_int)
// {
//
// }
IC_W25Qxx_Read_Data((uint8_t *)Buffer, (flash_Address & 0x3fffffff), single_length>>2);
}
else {
single_length = Length & (~0x03);
if (single_length) {
// lfs_flash_read_dma_int = true;
// IC_W25Qxx_Set_Read_Callback(lfs_flash_read_callback);
// IC_W25Qxx_Read_Quad_Output_DMA(Buffer, (flash_Address & 0x3fffffff), single_length>>2);
// while(lfs_flash_read_dma_int)
// {
//// vTaskDelay(1);
// }
IC_W25Qxx_Read_Data((uint8_t *)Buffer, (flash_Address & 0x3fffffff), single_length>>2);
Buffer += single_length;
flash_Address += single_length;
Length -= single_length;
}
single_length = Length;
if (single_length) {
uint32_t value;
IC_W25Qxx_Read_Data((void *)&value, (flash_Address & 0x3fffffff), sizeof(uint32_t)>>2);
memcpy(Buffer, (void *)&value, single_length);
}
break;
}
Buffer += single_length;
flash_Address += single_length;
Length -= single_length;
}
__SPI_DISABLE(spi_flash_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_flash_handle.SPIx, SPI_FRAME_SIZE_8BIT);
__SPI_RX_ENDIAN_SET(spi_flash_handle.SPIx, TX_RX_Endian_4321);
#endif
extern_flash_unlock();
}
#if 0
void extern_flash_write(uint8_t *Buffer, uint32_t flash_Address, uint32_t Length)
{
while(extern_flash_lock())
{
vTaskDelay(1);
}
//IC_W25Qxx_PageProgram_Quad((uint8_t *)Buffer, (flash_Address & 0x3fffffff), Length);
IC_W25Qxx_PageProgram((uint8_t *)Buffer, (flash_Address & 0x3fffffff), Length);
extern_flash_unlock();
}
#endif
void extern_flash_write(uint8_t *Buffer, uint32_t flash_Address, uint32_t Length)
{
while(extern_flash_lock())
{
vTaskDelay(1);
}
uint32_t Page_aligned=0;
Page_aligned=256-(flash_Address%256);
if(Length<=Page_aligned)
Page_aligned=Length;
while(1)
{
IC_W25Qxx_PageProgram(Buffer,flash_Address,Page_aligned);
if(Length==Page_aligned)
{
break;
}
else
{
Buffer+=Page_aligned;
flash_Address+=Page_aligned;
Length-=Page_aligned;
if(Length>256)
Page_aligned=256;
else
Page_aligned=Length;
}
vTaskDelay(1);
};
extern_flash_unlock();
}
void extern_flash_erase(uint32_t flash_Address)
{
while(extern_flash_lock())
{
vTaskDelay(1);
}
IC_W25Qxx_EraseSector(flash_Address & 0x3fffffff);
extern_flash_unlock();
}
void extern_flash_erase_ex(uint32_t flash_Address,uint32_t len)
{
while(extern_flash_lock())
{
vTaskDelay(1);
}
for (uint32_t i = 0; i < len; i += 4096)
{
IC_W25Qxx_EraseSector((flash_Address+i) & 0x3fffffff);
vTaskDelay(1);
}
extern_flash_unlock();
}
// configuration of the filesystem is provided by this struct
static const struct lfs_config cfg = {
// block device operations
.read = lfs_custom_flash_read,
.prog = lfs_custom_flash_write,
.erase = lfs_custom_flash_erase,
.sync = lfs_custom_flash_sync,
//thread safe
.lock = lfs_port_lock,
.unlock = lfs_port_unlock,
#if 1
// block device configuration
.read_size = 256,
.prog_size = 256,
.block_size = HAL_FLASH_BLOCK_4K,
.block_count = LFS_FLASH_SIZE/HAL_FLASH_BLOCK_4K, //1M
.block_cycles = 100,
.cache_size = 256,
.lookahead_size = 128,
#endif
#if 0
.read_size = 16,
.prog_size = 16,
.block_size = HAL_FLASH_BLOCK_4K,
.block_count = LFS_FLASH_SIZE/HAL_FLASH_BLOCK_4K, //100K
.cache_size = 16,
.lookahead_size = 16,
.block_cycles = 500,
#endif
};
static int lfs_port_traverse_cb(void *data, lfs_block_t block)
{
return 0;
}
uint8_t testbuff[1026];
void lfs_custom_init(void)
{
//create semaphroe for littlefs lock
lfs_semaphore = xQueueGenericCreate(( UBaseType_t ) 1,
semSEMAPHORE_QUEUE_ITEM_LENGTH,
queueQUEUE_TYPE_BINARY_SEMAPHORE);
xSemaphoreGive( lfs_semaphore );
// printf("flash_id:%x\r\n",ext_flash_get_id());
// extern_flash_erase_ex(0,0x1000);
// for(uint8_t i=0;i<255;i++)
// {
// testbuff[i]=i+1;
// }
//extern_flash_write(testbuff,0,255);
#if 0
int err = lfs_mount(&lfs, &cfg);
// reformat if we can't mount the filesystem
// this should only happen on the first boot
if (err)
{
lfs_format(&lfs, &cfg);
err = lfs_mount(&lfs, &cfg);
printf("lfs mount result:%d\r\n", err);
}
if(lfs_fs_traverse(&lfs, lfs_port_traverse_cb, NULL))
{
printf("lfs traverse fail \r\n");
lfs_format(&lfs, &cfg);
err = lfs_mount(&lfs, &cfg);
}
#endif
//printf("lfs fs size %d Byte %d\r\n",lfs_free_size(),lfs_fs_size(&lfs)*4096);
// lfs_larger_test();
}
void lfs_custom_format(void)
{
lfs_format(&lfs, &cfg);
}
void lfs_custom_test(void)
{
lfs_file_t file;
// read current count
uint32_t boot_count = 0;
lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count));
printf("boot_count %d\r\n",boot_count);
// update boot count
boot_count += 1;
lfs_file_rewind(&lfs, &file);
lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count));
//printf("lfs fs size %d Byte %d\r\n",lfs_free_size(),lfs_fs_size(&lfs)*4096);
// remember the storage is not updated until the file is closed successfully
lfs_file_close(&lfs, &file);
}
void lfs_custom_test_write_file(void)
{
lfs_file_t file;
// read current count
uint8_t str[] = "abcdefj12321321asdfkjlfalsjdfksajflqwpojdkfjqpwjklsdflq;wfqwefqweqw";
lfs_file_open(&lfs, &file, "img", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_write(&lfs, &file, str, sizeof(str));
//printf("lfs fs size %d Byte %d\r\n",lfs_free_size(),lfs_fs_size(&lfs)*4096);
// remember the storage is not updated until the file is closed successfully
lfs_file_close(&lfs, &file);
}
void lfs_custom_test_read_file(void)
{
lfs_file_t file;
lfs_file_open(&lfs, &file, "img", LFS_O_RDONLY);
lfs_file_read(&lfs, &file, testbuff, 256);
printf("file: %s\r\n",testbuff);
//printf("lfs fs size %d Byte %d\r\n",lfs_free_size(),lfs_fs_size(&lfs)*4096);
// remember the storage is not updated until the file is closed successfully
lfs_file_close(&lfs, &file);
}

View File

@ -0,0 +1,53 @@
/**
*********************************************************************************************************
* @file lfs_port.h
* @brief
* @details
* @author tang zheng
* @date 2022-08-27
* @version v0.1
* *********************************************************************************************************
*/
#include "lfs.h"
#define LFS_EXT_FLASH 1
#ifdef LFS_EXT_FLASH
#include "IC_W25Qxx.h"
#define LFS_FLASH_START_ADRRESS 0xFC0000 //#define LFS_FLASH_START_ADRRESS 0xF80000
#define LFS_FLASH_SIZE 0x040000
#define HAL_FLASH_BLOCK_4K 0x1000
#else
#define FR5090_BUS_START_ADDRESS 0x08000000
#define LFS_FLASH_START_ADRRESS FR5090_BUS_START_ADDRESS + 0x40000
#define LFS_FLASH_SIZE 0x20000
#define HAL_FLASH_BLOCK_4K 0x1000
#endif
extern lfs_t lfs;
void lfs_custom_init(void);
int32_t lfs_free_size(void);
void lfs_custom_test(void);
void lfs_custom_test_write_file(void);
void lfs_custom_test_read_file(void);
void extern_flash_read(uint8_t *Buffer, uint32_t flash_Address, uint32_t Length);
void extern_flash_write(uint8_t *Buffer, uint32_t flash_Address, uint32_t Length);
void extern_flash_erase(uint32_t flash_Address);
void extern_flash_erase_ex(uint32_t flash_Address,uint32_t len);

View File

@ -0,0 +1,139 @@
/*******************************************************************************
* Size: 128 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_128px.c --bpp 4 --size 128 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a -r 0x25 -r 0x47 -r 0x4F
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_128PX
#define NUMBER_HARMONYOS_BPP4_128PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_128PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe,
0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x22,
0x2a
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 43, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 17, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4,
4, 16,
4, 17,
16, 2,
16, 3,
17, 3,
17, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-37, -119, -77, -31, -31, 1, 15, -36,
-30
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 9,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_128px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_128px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 39,
.cmap_num = 1,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_128px = {
#else
lv_font_t Number_HarmonyOS_bpp4_128px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 98, /*The maximum line height required by the font*/
.base_line = 2, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -10,
.underline_thickness = 6,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_128PX*/

View File

@ -0,0 +1,996 @@
/*******************************************************************************
* Size: 12 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_12px.c --bpp 4 --size 12 -r 0x20-0x7f
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_12PX
#define NUMBER_HARMONYOS_BPP4_12PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_12PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0020 " " */
/* U+0021 "!" */
0x2f, 0x12, 0xf0, 0x1f, 0x1, 0xf0, 0x1f, 0x0,
0xf0, 0xe, 0x0, 0x20, 0x1a, 0x2, 0xe1,
/* U+0022 "\"" */
0x25, 0x16, 0x5b, 0x3d, 0x5b, 0x3d, 0x4b, 0x3c,
/* U+0023 "#" */
0x0, 0x1f, 0x2, 0xf0, 0x0, 0x4d, 0x5, 0xc0,
0x0, 0x7a, 0x8, 0xa0, 0xf, 0xff, 0xff, 0xfc,
0x3, 0xe6, 0x3f, 0x52, 0x3, 0xe0, 0x4e, 0x0,
0xdf, 0xff, 0xff, 0xf0, 0x2b, 0x93, 0xc8, 0x30,
0xd, 0x40, 0xe3, 0x0, 0xf, 0x11, 0xf0, 0x0,
/* U+0024 "$" */
0x0, 0x7, 0x10, 0x0, 0x0, 0xf2, 0x0, 0x2,
0xaf, 0xb3, 0x1, 0xec, 0xfd, 0xf1, 0x5e, 0xf,
0x2b, 0x35, 0xf1, 0xf2, 0x0, 0xc, 0xef, 0x30,
0x0, 0x7, 0xff, 0x80, 0x0, 0xf, 0x7f, 0x66,
0x70, 0xf2, 0xb8, 0x5f, 0x5f, 0x5e, 0x50, 0x8f,
0xff, 0xa0, 0x0, 0x1f, 0x30, 0x0, 0x0, 0xf2,
0x0,
/* U+0025 "%" */
0x1c, 0xf6, 0x0, 0x8c, 0x0, 0x9a, 0x4f, 0x11,
0xf4, 0x0, 0xb5, 0xd, 0x38, 0xb0, 0x0, 0xa8,
0x1f, 0x3f, 0x30, 0x0, 0x2e, 0xf8, 0x9b, 0x0,
0x0, 0x0, 0x12, 0xf2, 0x0, 0x0, 0x0, 0xa,
0xa1, 0xbe, 0x80, 0x0, 0x2f, 0x29, 0xb3, 0xe4,
0x0, 0xb9, 0x9, 0xa1, 0xd4, 0x3, 0xf1, 0x1,
0xce, 0x90,
/* U+0026 "&" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0x70,
0x0, 0x3, 0xf6, 0x6f, 0x30, 0x0, 0x5f, 0x0,
0xf4, 0x0, 0x1, 0xf9, 0xcb, 0x0, 0x0, 0x1c,
0xfa, 0x4, 0x90, 0xd, 0xb8, 0xe2, 0x8b, 0x6,
0xf0, 0xa, 0xdd, 0x60, 0x7e, 0x0, 0xd, 0xf1,
0x3, 0xf7, 0x25, 0xff, 0x90, 0x6, 0xdf, 0xd5,
0x3f, 0x60,
/* U+0027 "'" */
0x25, 0x5b, 0x5b, 0x4b,
/* U+0028 "(" */
0x0, 0x3, 0x0, 0x9, 0x90, 0x3, 0xf1, 0x0,
0xa9, 0x0, 0xe, 0x50, 0x1, 0xf2, 0x0, 0x3f,
0x10, 0x2, 0xf1, 0x0, 0x1f, 0x30, 0x0, 0xd6,
0x0, 0x9, 0xb0, 0x0, 0x2f, 0x20, 0x0, 0x7b,
0x0,
/* U+0029 ")" */
0x21, 0x0, 0x5d, 0x0, 0xc, 0x70, 0x5, 0xe0,
0x1, 0xf3, 0x0, 0xe5, 0x0, 0xd7, 0x0, 0xd6,
0x0, 0xe5, 0x1, 0xf2, 0x6, 0xd0, 0xd, 0x60,
0x7b, 0x0,
/* U+002A "*" */
0x0, 0xd1, 0x6, 0xcd, 0x9a, 0x9, 0xfc, 0x6,
0xcd, 0xaa, 0x0, 0xd1, 0x10, 0x0, 0x0,
/* U+002B "+" */
0x0, 0x5, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0,
0x1f, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x13, 0x4f,
0x33, 0x10, 0x1, 0xf0, 0x0, 0x0, 0x1f, 0x0,
0x0,
/* U+002C "," */
0xa, 0x21, 0xe6, 0x8, 0x43, 0x90, 0x0, 0x0,
/* U+002D "-" */
0x4f, 0xff, 0xf2, 0x2, 0x22, 0x20,
/* U+002E "." */
0x1a, 0x2, 0xe1,
/* U+002F "/" */
0x0, 0xb, 0x80, 0x1, 0xf2, 0x0, 0x5d, 0x0,
0xb, 0x80, 0x0, 0xf2, 0x0, 0x5d, 0x0, 0xa,
0x80, 0x0, 0xf3, 0x0, 0x5d, 0x0, 0xa, 0x80,
0x0,
/* U+0030 "0" */
0x2, 0xcf, 0xc1, 0x0, 0xcc, 0x5d, 0xb0, 0x2f,
0x30, 0x4f, 0x25, 0xf0, 0x0, 0xf5, 0x6f, 0x0,
0xf, 0x66, 0xf0, 0x0, 0xf6, 0x5f, 0x0, 0xf,
0x52, 0xf3, 0x4, 0xf2, 0xc, 0xc5, 0xdc, 0x0,
0x2c, 0xfc, 0x10,
/* U+0031 "1" */
0x3, 0xdb, 0x7f, 0xeb, 0xb4, 0x9b, 0x0, 0x9b,
0x0, 0x9b, 0x0, 0x9b, 0x0, 0x9b, 0x0, 0x9b,
0x0, 0x9b, 0x0, 0x9b,
/* U+0032 "2" */
0x3, 0xcf, 0xc2, 0x1, 0xea, 0x5d, 0xc0, 0x2b,
0x0, 0x5f, 0x0, 0x0, 0x6, 0xf0, 0x0, 0x0,
0xda, 0x0, 0x0, 0x8f, 0x20, 0x0, 0x5f, 0x50,
0x0, 0x2f, 0x80, 0x0, 0x1d, 0xd4, 0x44, 0x16,
0xff, 0xff, 0xf5,
/* U+0033 "3" */
0x4, 0xdf, 0xc2, 0x1, 0xf9, 0x5d, 0xc0, 0x17,
0x0, 0x6f, 0x0, 0x0, 0x1c, 0xc0, 0x0, 0x7f,
0xf3, 0x0, 0x1, 0x4c, 0xe0, 0x0, 0x0, 0x2f,
0x42, 0x90, 0x2, 0xf4, 0x2f, 0x94, 0xbe, 0x0,
0x4d, 0xfc, 0x30,
/* U+0034 "4" */
0x0, 0x9, 0xc0, 0x0, 0x1, 0xf5, 0x0, 0x0,
0x7e, 0x0, 0x0, 0xe, 0x70, 0x0, 0x5, 0xf1,
0x97, 0x0, 0xc9, 0xb, 0x90, 0x3f, 0x20, 0xb9,
0x8, 0xff, 0xff, 0xfc, 0x13, 0x33, 0xca, 0x20,
0x0, 0xb, 0x90,
/* U+0035 "5" */
0x7, 0xff, 0xfe, 0x0, 0x9b, 0x33, 0x30, 0xa,
0x90, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe, 0xef,
0xd3, 0x0, 0xe8, 0x4b, 0xe0, 0x0, 0x0, 0x2f,
0x30, 0x30, 0x2, 0xf3, 0xf, 0x94, 0xce, 0x0,
0x4d, 0xfc, 0x20,
/* U+0036 "6" */
0x0, 0x8, 0xd0, 0x0, 0x2, 0xf5, 0x0, 0x0,
0xad, 0x0, 0x0, 0x3f, 0x50, 0x0, 0xb, 0xff,
0xe5, 0x2, 0xfa, 0x49, 0xf2, 0x4f, 0x10, 0xf,
0x64, 0xf1, 0x0, 0xf6, 0xe, 0xb5, 0xaf, 0x10,
0x2c, 0xfd, 0x40,
/* U+0037 "7" */
0x5f, 0xff, 0xff, 0x41, 0x33, 0x37, 0xf1, 0x0,
0x0, 0xab, 0x0, 0x0, 0xf, 0x50, 0x0, 0x5,
0xf0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x1f, 0x40,
0x0, 0x7, 0xe0, 0x0, 0x0, 0xc9, 0x0, 0x0,
0x2f, 0x40, 0x0,
/* U+0038 "8" */
0x3, 0xcf, 0xc2, 0x0, 0xeb, 0x4b, 0xd0, 0x1f,
0x30, 0x3f, 0x0, 0xe9, 0x19, 0xd0, 0x4, 0xff,
0xf4, 0x1, 0xea, 0x4a, 0xe0, 0x5f, 0x0, 0xf,
0x56, 0xf0, 0x0, 0xf5, 0x2f, 0xa4, 0xaf, 0x10,
0x4d, 0xfd, 0x40,
/* U+0039 "9" */
0x4, 0xdf, 0xc2, 0x1, 0xfa, 0x5c, 0xd0, 0x6f,
0x0, 0x2f, 0x37, 0xe0, 0x1, 0xf4, 0x3f, 0x71,
0x9f, 0x10, 0x8f, 0xff, 0xb0, 0x0, 0x16, 0xf2,
0x0, 0x0, 0xca, 0x0, 0x0, 0x5f, 0x10, 0x0,
0xd, 0x80, 0x0,
/* U+003A ":" */
0x1e, 0x30, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0,
0xa1, 0x1e, 0x30,
/* U+003B ";" */
0xd, 0x40, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0,
0xa3, 0xe, 0x80, 0x75, 0x2a, 0x0, 0x0,
/* U+003C "<" */
0x0, 0x0, 0x29, 0x50, 0x3, 0xaf, 0xb2, 0x2c,
0xfa, 0x30, 0x5, 0xfc, 0x30, 0x0, 0x3, 0xaf,
0xb4, 0x0, 0x0, 0x29, 0xf5, 0x0, 0x0, 0x1,
0x20,
/* U+003D "=" */
0x6f, 0xff, 0xff, 0x61, 0x33, 0x33, 0x31, 0x0,
0x0, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x13, 0x33,
0x33, 0x10,
/* U+003E ">" */
0x59, 0x20, 0x0, 0x2, 0xcf, 0xa3, 0x0, 0x0,
0x3a, 0xfb, 0x20, 0x0, 0x3c, 0xf5, 0x4, 0xbf,
0xa3, 0x6, 0xf9, 0x20, 0x0, 0x21, 0x0, 0x0,
0x0,
/* U+003F "?" */
0x1, 0xbf, 0xe5, 0x0, 0xcc, 0x5a, 0xf2, 0x6,
0x10, 0x2f, 0x30, 0x0, 0x9, 0xd0, 0x0, 0x8,
0xd1, 0x0, 0x1, 0xf2, 0x0, 0x0, 0x1f, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0,
0x1, 0xe3, 0x0,
/* U+0040 "@" */
0x0, 0x4, 0xbd, 0xec, 0x60, 0x0, 0x0, 0x8e,
0x73, 0x36, 0xdb, 0x0, 0x6, 0xd1, 0x0, 0x0,
0xc, 0x80, 0xe, 0x30, 0x9f, 0xc9, 0x82, 0xe0,
0x3d, 0x6, 0xe4, 0x6f, 0x80, 0xd3, 0x5a, 0xb,
0x80, 0xb, 0x80, 0xb5, 0x6a, 0xb, 0x70, 0xa,
0x80, 0xc4, 0x4c, 0x7, 0xc1, 0x2e, 0xa1, 0xf1,
0xf, 0x20, 0xbf, 0xe5, 0xef, 0x80, 0x8, 0xb0,
0x1, 0x0, 0x1, 0x0, 0x0, 0xcc, 0x40, 0x4,
0x70, 0x0, 0x0, 0x8, 0xef, 0xfe, 0x70, 0x0,
0x0, 0x0, 0x1, 0x10, 0x0, 0x0,
/* U+0041 "A" */
0x0, 0xb, 0xc0, 0x0, 0x0, 0x0, 0xff, 0x10,
0x0, 0x0, 0x5c, 0xc7, 0x0, 0x0, 0xb, 0x77,
0xd0, 0x0, 0x1, 0xf2, 0x2f, 0x20, 0x0, 0x6d,
0x0, 0xc8, 0x0, 0xb, 0xff, 0xff, 0xd0, 0x1,
0xf5, 0x33, 0x4f, 0x30, 0x6d, 0x0, 0x0, 0xc9,
0xc, 0x80, 0x0, 0x7, 0xe0,
/* U+0042 "B" */
0xff, 0xfe, 0xa1, 0xf, 0x73, 0x5d, 0xb0, 0xf4,
0x0, 0x6f, 0xf, 0x40, 0x1c, 0xc0, 0xff, 0xff,
0xf4, 0xf, 0x62, 0x3a, 0xf2, 0xf4, 0x0, 0xf,
0x6f, 0x40, 0x0, 0xf6, 0xf7, 0x34, 0xaf, 0x2f,
0xff, 0xfc, 0x40,
/* U+0043 "C" */
0x0, 0x4c, 0xfd, 0x60, 0x5, 0xf9, 0x58, 0xf5,
0xe, 0x90, 0x0, 0x63, 0x4f, 0x20, 0x0, 0x0,
0x6f, 0x0, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0,
0x4f, 0x20, 0x0, 0x0, 0xe, 0x90, 0x0, 0x62,
0x5, 0xf9, 0x58, 0xf5, 0x0, 0x4c, 0xfd, 0x60,
/* U+0044 "D" */
0xff, 0xfe, 0x81, 0x0, 0xf7, 0x46, 0xed, 0x0,
0xf4, 0x0, 0x1e, 0x80, 0xf4, 0x0, 0x7, 0xe0,
0xf4, 0x0, 0x5, 0xf0, 0xf4, 0x0, 0x5, 0xf0,
0xf4, 0x0, 0x7, 0xe0, 0xf4, 0x0, 0x1e, 0x80,
0xf7, 0x46, 0xed, 0x0, 0xff, 0xfe, 0x91, 0x0,
/* U+0045 "E" */
0xff, 0xff, 0xf8, 0xf7, 0x44, 0x42, 0xf4, 0x0,
0x0, 0xf5, 0x0, 0x0, 0xff, 0xff, 0xf1, 0xf7,
0x33, 0x30, 0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0,
0xf7, 0x44, 0x42, 0xff, 0xff, 0xfa,
/* U+0046 "F" */
0xff, 0xff, 0xf8, 0xf7, 0x44, 0x42, 0xf4, 0x0,
0x0, 0xf4, 0x0, 0x0, 0xf5, 0x0, 0x0, 0xff,
0xff, 0xf1, 0xf7, 0x33, 0x30, 0xf4, 0x0, 0x0,
0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0,
/* U+0047 "G" */
0x0, 0x3c, 0xfe, 0x80, 0x4, 0xfa, 0x57, 0xf9,
0xe, 0x90, 0x0, 0x44, 0x3f, 0x20, 0x0, 0x0,
0x6f, 0x0, 0x0, 0x0, 0x6f, 0x0, 0x2f, 0xff,
0x3f, 0x20, 0x3, 0x7f, 0xe, 0xa0, 0x0, 0x5f,
0x4, 0xfb, 0x55, 0xcd, 0x0, 0x3b, 0xfe, 0xa1,
/* U+0048 "H" */
0xf4, 0x0, 0x3, 0xf0, 0xf4, 0x0, 0x3, 0xf0,
0xf4, 0x0, 0x3, 0xf0, 0xf5, 0x0, 0x4, 0xf0,
0xff, 0xff, 0xff, 0xf0, 0xf7, 0x33, 0x36, 0xf0,
0xf4, 0x0, 0x3, 0xf0, 0xf4, 0x0, 0x3, 0xf0,
0xf4, 0x0, 0x3, 0xf0, 0xf4, 0x0, 0x3, 0xf0,
/* U+0049 "I" */
0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4,
0xf4, 0xf4,
/* U+004A "J" */
0x0, 0x7, 0xd0, 0x0, 0x7d, 0x0, 0x7, 0xd0,
0x0, 0x7d, 0x0, 0x7, 0xd0, 0x0, 0x7d, 0x0,
0x7, 0xd2, 0x0, 0x8b, 0xda, 0x5e, 0x73, 0xdf,
0xa0,
/* U+004B "K" */
0xf4, 0x0, 0x1e, 0x90, 0xf4, 0x0, 0xcc, 0x0,
0xf4, 0xa, 0xd1, 0x0, 0xf4, 0x6f, 0x20, 0x0,
0xf8, 0xfc, 0x0, 0x0, 0xff, 0xaf, 0x60, 0x0,
0xfa, 0x9, 0xe1, 0x0, 0xf4, 0x0, 0xeb, 0x0,
0xf4, 0x0, 0x4f, 0x50, 0xf4, 0x0, 0xa, 0xe1,
/* U+004C "L" */
0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0,
0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4,
0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0,
0xf7, 0x44, 0x42, 0xff, 0xff, 0xf8,
/* U+004D "M" */
0xf5, 0x0, 0x0, 0xd, 0x6f, 0xe0, 0x0, 0x6,
0xf6, 0xff, 0x70, 0x0, 0xef, 0x6f, 0x9f, 0x10,
0x8c, 0xd6, 0xf3, 0xc9, 0x1f, 0x3d, 0x6f, 0x33,
0xfb, 0xa0, 0xd6, 0xf3, 0xa, 0xf1, 0xd, 0x6f,
0x30, 0x14, 0x0, 0xd6, 0xf3, 0x0, 0x0, 0xd,
0x6f, 0x30, 0x0, 0x0, 0xd6,
/* U+004E "N" */
0xf6, 0x0, 0x4, 0xff, 0xe1, 0x0, 0x4f, 0xfe,
0xa0, 0x4, 0xff, 0x6f, 0x40, 0x4f, 0xf3, 0x9d,
0x4, 0xff, 0x30, 0xe8, 0x4f, 0xf3, 0x5, 0xf6,
0xff, 0x30, 0xa, 0xff, 0xf3, 0x0, 0x1f, 0xff,
0x30, 0x0, 0x6f,
/* U+004F "O" */
0x0, 0x4c, 0xfd, 0x70, 0x0, 0x5f, 0x95, 0x7f,
0x90, 0xe, 0x90, 0x0, 0x5f, 0x24, 0xf2, 0x0,
0x0, 0xe7, 0x6f, 0x0, 0x0, 0xb, 0x96, 0xf0,
0x0, 0x0, 0xb9, 0x4f, 0x20, 0x0, 0xe, 0x70,
0xe9, 0x0, 0x5, 0xf2, 0x5, 0xf9, 0x57, 0xf8,
0x0, 0x5, 0xcf, 0xd7, 0x0,
/* U+0050 "P" */
0xff, 0xfe, 0x80, 0xf, 0x73, 0x6f, 0x90, 0xf4,
0x0, 0x7e, 0xf, 0x40, 0x6, 0xf0, 0xf4, 0x3,
0xdb, 0xf, 0xff, 0xfc, 0x10, 0xf7, 0x31, 0x0,
0xf, 0x40, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf,
0x40, 0x0, 0x0,
/* U+0051 "Q" */
0x0, 0x4c, 0xfd, 0x70, 0x0, 0x5, 0xf9, 0x57,
0xf8, 0x0, 0xe, 0x90, 0x0, 0x5f, 0x20, 0x4f,
0x20, 0x0, 0xe, 0x70, 0x6f, 0x0, 0x0, 0xb,
0x90, 0x6f, 0x0, 0x0, 0xb, 0x90, 0x4f, 0x20,
0x0, 0xe, 0x70, 0xe, 0x90, 0x0, 0x5f, 0x20,
0x5, 0xf9, 0x57, 0xf9, 0x0, 0x0, 0x5c, 0xff,
0xd0, 0x0, 0x0, 0x0, 0x3, 0xeb, 0x0, 0x0,
0x0, 0x0, 0x2d, 0xc1,
/* U+0052 "R" */
0xff, 0xfe, 0x80, 0xf, 0x73, 0x6f, 0x90, 0xf4,
0x0, 0x7e, 0xf, 0x40, 0x6, 0xf0, 0xf4, 0x3,
0xdb, 0xf, 0xff, 0xfc, 0x10, 0xf7, 0x3d, 0x90,
0xf, 0x40, 0x4f, 0x40, 0xf4, 0x0, 0xad, 0xf,
0x40, 0x1, 0xe8,
/* U+0053 "S" */
0x5, 0xdf, 0xd6, 0x2, 0xf9, 0x48, 0xf4, 0x6f,
0x0, 0x6, 0x15, 0xf6, 0x0, 0x0, 0x9, 0xfe,
0x81, 0x0, 0x2, 0x8e, 0xe2, 0x0, 0x0, 0x1e,
0x98, 0x80, 0x0, 0xc9, 0x5f, 0x95, 0x7f, 0x50,
0x5d, 0xfd, 0x60,
/* U+0054 "T" */
0xef, 0xff, 0xff, 0xd3, 0x46, 0xf5, 0x43, 0x0,
0x2f, 0x20, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x2f,
0x20, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x2f, 0x20,
0x0, 0x2, 0xf2, 0x0, 0x0, 0x2f, 0x20, 0x0,
0x2, 0xf2, 0x0,
/* U+0055 "U" */
0x1f, 0x30, 0x0, 0x5f, 0x1f, 0x30, 0x0, 0x5f,
0x1f, 0x30, 0x0, 0x5f, 0x1f, 0x30, 0x0, 0x5f,
0x1f, 0x30, 0x0, 0x5f, 0x1f, 0x30, 0x0, 0x5f,
0xf, 0x40, 0x0, 0x6e, 0xd, 0x90, 0x0, 0xbb,
0x6, 0xf8, 0x59, 0xf4, 0x0, 0x6d, 0xfd, 0x50,
/* U+0056 "V" */
0xcb, 0x0, 0x0, 0x7d, 0x6, 0xf0, 0x0, 0xc,
0x80, 0x1f, 0x50, 0x1, 0xf3, 0x0, 0xba, 0x0,
0x6d, 0x0, 0x5, 0xf0, 0xb, 0x80, 0x0, 0xf,
0x50, 0xf3, 0x0, 0x0, 0xaa, 0x5d, 0x0, 0x0,
0x4, 0xfb, 0x80, 0x0, 0x0, 0xe, 0xf3, 0x0,
0x0, 0x0, 0x9d, 0x0, 0x0,
/* U+0057 "W" */
0xc9, 0x0, 0xb, 0x90, 0x0, 0xb8, 0x7d, 0x0,
0xf, 0xd0, 0x0, 0xf4, 0x3f, 0x10, 0x3f, 0xf2,
0x3, 0xf0, 0xe, 0x60, 0x7a, 0xd6, 0x7, 0xb0,
0xa, 0xa0, 0xb6, 0x9a, 0xb, 0x70, 0x5, 0xe0,
0xf2, 0x4f, 0xf, 0x20, 0x1, 0xf7, 0xd0, 0xf,
0x7e, 0x0, 0x0, 0xce, 0x90, 0xb, 0xea, 0x0,
0x0, 0x8f, 0x50, 0x7, 0xf5, 0x0, 0x0, 0x3f,
0x10, 0x3, 0xf1, 0x0,
/* U+0058 "X" */
0x7f, 0x20, 0x0, 0xd9, 0xd, 0xb0, 0x8, 0xe0,
0x3, 0xf5, 0x2f, 0x50, 0x0, 0x9e, 0xcb, 0x0,
0x0, 0xe, 0xf1, 0x0, 0x0, 0x1f, 0xf2, 0x0,
0x0, 0xac, 0xbc, 0x0, 0x4, 0xf2, 0x2f, 0x60,
0xe, 0x80, 0x8, 0xf1, 0x8e, 0x0, 0x0, 0xda,
/* U+0059 "Y" */
0xad, 0x0, 0x2, 0xf4, 0x2f, 0x60, 0x9, 0xc0,
0x9, 0xe0, 0x2f, 0x40, 0x1, 0xf8, 0xac, 0x0,
0x0, 0x7f, 0xf3, 0x0, 0x0, 0xe, 0xb0, 0x0,
0x0, 0xc, 0x80, 0x0, 0x0, 0xc, 0x80, 0x0,
0x0, 0xc, 0x80, 0x0, 0x0, 0xc, 0x80, 0x0,
/* U+005A "Z" */
0x5f, 0xff, 0xff, 0x81, 0x44, 0x49, 0xf2, 0x0,
0x0, 0xe8, 0x0, 0x0, 0x7e, 0x10, 0x0, 0x1f,
0x60, 0x0, 0x9, 0xd0, 0x0, 0x2, 0xf4, 0x0,
0x0, 0xbb, 0x0, 0x0, 0x4f, 0x74, 0x44, 0x3b,
0xff, 0xff, 0xfb,
/* U+005B "[" */
0x0, 0x0, 0xff, 0xf0, 0xf6, 0x30, 0xf3, 0x0,
0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0,
0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf4, 0x0,
0xff, 0xf0, 0x33, 0x30,
/* U+005C "\\" */
0xa8, 0x0, 0x5, 0xd0, 0x0, 0xf, 0x30, 0x0,
0xa8, 0x0, 0x5, 0xd0, 0x0, 0xf, 0x20, 0x0,
0xb8, 0x0, 0x5, 0xd0, 0x0, 0x1f, 0x20, 0x0,
0xb8,
/* U+005D "]" */
0x0, 0x0, 0xcf, 0xf4, 0x23, 0xf4, 0x0, 0xf4,
0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4,
0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4,
0xcf, 0xf4, 0x23, 0x30,
/* U+005E "^" */
0x0, 0xdb, 0x0, 0x3, 0xff, 0x10, 0xa, 0x9a,
0x80, 0x1f, 0x24, 0xe0, 0x7c, 0x0, 0xd5,
/* U+005F "_" */
0xff, 0xff, 0xf3, 0x22, 0x22, 0x20,
/* U+0060 "`" */
0xe, 0x40, 0x4, 0xc0,
/* U+0061 "a" */
0x4, 0xdf, 0xa1, 0xe, 0x73, 0xd9, 0x1, 0x0,
0x7c, 0x6, 0xcd, 0xdd, 0x4f, 0x42, 0x8d, 0x5e,
0x10, 0xbd, 0x9, 0xed, 0x9d,
/* U+0062 "b" */
0x2f, 0x10, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x2f,
0x10, 0x0, 0x2, 0xf6, 0xee, 0x70, 0x2f, 0xd5,
0x7f, 0x52, 0xf4, 0x0, 0x9b, 0x2f, 0x20, 0x7,
0xd2, 0xf4, 0x0, 0x9b, 0x2f, 0xd4, 0x6f, 0x52,
0xf5, 0xee, 0x80,
/* U+0063 "c" */
0x2, 0xcf, 0xc2, 0xe, 0xa4, 0xa8, 0x5f, 0x0,
0x0, 0x7d, 0x0, 0x0, 0x5f, 0x0, 0x0, 0xe,
0xa4, 0xa8, 0x3, 0xcf, 0xc2,
/* U+0064 "d" */
0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0,
0x0, 0xb, 0x70, 0x3d, 0xf9, 0xb7, 0x1e, 0xa4,
0xaf, 0x75, 0xf0, 0x0, 0xe7, 0x7d, 0x0, 0xc,
0x75, 0xe0, 0x0, 0xe7, 0x1e, 0x81, 0x8f, 0x70,
0x3d, 0xfa, 0xa7,
/* U+0065 "e" */
0x3, 0xcf, 0xc2, 0x0, 0xea, 0x3b, 0xc0, 0x5f,
0x0, 0x2f, 0x27, 0xfe, 0xee, 0xf3, 0x5e, 0x11,
0x11, 0x0, 0xe9, 0x37, 0xa0, 0x3, 0xcf, 0xd4,
0x0,
/* U+0066 "f" */
0x0, 0x0, 0x0, 0x1c, 0xf7, 0x9, 0xc4, 0x20,
0xb8, 0x0, 0xdf, 0xff, 0x22, 0xc9, 0x20, 0xb,
0x80, 0x0, 0xb8, 0x0, 0xb, 0x80, 0x0, 0xb8,
0x0, 0xb, 0x80, 0x0,
/* U+0067 "g" */
0x3, 0xdf, 0x9a, 0x71, 0xea, 0x4a, 0xf7, 0x5f,
0x0, 0xe, 0x77, 0xd0, 0x0, 0xc7, 0x5e, 0x0,
0xe, 0x71, 0xea, 0x49, 0xf7, 0x3, 0xdf, 0x9c,
0x70, 0x10, 0x0, 0xe5, 0x1f, 0x74, 0x9f, 0x10,
0x5d, 0xfc, 0x30,
/* U+0068 "h" */
0x2f, 0x10, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x2f,
0x10, 0x0, 0x2, 0xf7, 0xee, 0x50, 0x2f, 0xd5,
0x9f, 0x12, 0xf3, 0x0, 0xf3, 0x2f, 0x10, 0xf,
0x42, 0xf1, 0x0, 0xf4, 0x2f, 0x10, 0xf, 0x42,
0xf1, 0x0, 0xf4,
/* U+0069 "i" */
0x2e, 0x21, 0xa1, 0x0, 0x2, 0xf1, 0x2f, 0x12,
0xf1, 0x2f, 0x12, 0xf1, 0x2f, 0x12, 0xf1,
/* U+006A "j" */
0x0, 0x2e, 0x10, 0x1, 0xa0, 0x0, 0x0, 0x0,
0x2, 0xf1, 0x0, 0x2f, 0x10, 0x2, 0xf1, 0x0,
0x2f, 0x10, 0x2, 0xf1, 0x0, 0x2f, 0x10, 0x2,
0xf1, 0x0, 0x2f, 0x10, 0x59, 0xe0, 0x4e, 0xe4,
0x0,
/* U+006B "k" */
0x2f, 0x10, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x2f,
0x10, 0x0, 0x2, 0xf1, 0x9, 0xd0, 0x2f, 0x15,
0xe2, 0x2, 0xf4, 0xf4, 0x0, 0x2f, 0xef, 0x50,
0x2, 0xfa, 0x8e, 0x10, 0x2f, 0x20, 0xd9, 0x2,
0xf1, 0x4, 0xf3,
/* U+006C "l" */
0x2f, 0x12, 0xf1, 0x2f, 0x12, 0xf1, 0x2f, 0x12,
0xf1, 0x2f, 0x12, 0xf1, 0x2f, 0x12, 0xf1,
/* U+006D "m" */
0x2f, 0x7f, 0xd3, 0xaf, 0xa0, 0x2f, 0xa2, 0xcf,
0x63, 0xf5, 0x2f, 0x20, 0x7e, 0x0, 0xb8, 0x2f,
0x10, 0x6d, 0x0, 0xa8, 0x2f, 0x10, 0x6d, 0x0,
0xa8, 0x2f, 0x10, 0x6d, 0x0, 0xa8, 0x2f, 0x10,
0x6d, 0x0, 0xa8,
/* U+006E "n" */
0x2f, 0x6e, 0xe5, 0x2, 0xfb, 0x27, 0xf1, 0x2f,
0x30, 0xf, 0x32, 0xf1, 0x0, 0xf4, 0x2f, 0x10,
0xf, 0x42, 0xf1, 0x0, 0xf4, 0x2f, 0x10, 0xf,
0x40,
/* U+006F "o" */
0x2, 0xbf, 0xc3, 0x0, 0xeb, 0x49, 0xf1, 0x5f,
0x0, 0xe, 0x77, 0xd0, 0x0, 0xb9, 0x5f, 0x0,
0xd, 0x70, 0xea, 0x49, 0xf1, 0x2, 0xcf, 0xc3,
0x0,
/* U+0070 "p" */
0x2f, 0x6e, 0xe7, 0x2, 0xfc, 0x24, 0xf5, 0x2f,
0x40, 0x9, 0xb2, 0xf2, 0x0, 0x7d, 0x2f, 0x40,
0x9, 0xb2, 0xfd, 0x56, 0xf5, 0x2f, 0x6e, 0xe8,
0x2, 0xf1, 0x0, 0x0, 0x2f, 0x10, 0x0, 0x2,
0xf1, 0x0, 0x0,
/* U+0071 "q" */
0x3, 0xdf, 0x9a, 0x71, 0xea, 0x4a, 0xf7, 0x5f,
0x0, 0xe, 0x77, 0xd0, 0x0, 0xc7, 0x5f, 0x0,
0xe, 0x71, 0xea, 0x4a, 0xf7, 0x3, 0xdf, 0x9c,
0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0xb, 0x70,
0x0, 0x0, 0xb7,
/* U+0072 "r" */
0x2f, 0x7f, 0x82, 0xfb, 0x21, 0x2f, 0x30, 0x2,
0xf1, 0x0, 0x2f, 0x10, 0x2, 0xf1, 0x0, 0x2f,
0x10, 0x0,
/* U+0073 "s" */
0x8, 0xee, 0x60, 0x5e, 0x46, 0xd0, 0x6f, 0x40,
0x0, 0x8, 0xee, 0x60, 0x0, 0x6, 0xf1, 0x8b,
0x36, 0xf1, 0x1b, 0xfe, 0x60,
/* U+0074 "t" */
0xd, 0x60, 0x0, 0xd6, 0x0, 0xef, 0xff, 0x32,
0xd7, 0x20, 0xd, 0x60, 0x0, 0xd6, 0x0, 0xd,
0x60, 0x0, 0xbb, 0x41, 0x3, 0xdf, 0x50,
/* U+0075 "u" */
0x3f, 0x0, 0x1f, 0x33, 0xf0, 0x1, 0xf3, 0x3f,
0x0, 0x1f, 0x33, 0xf0, 0x1, 0xf3, 0x2f, 0x10,
0x2f, 0x30, 0xf8, 0x2b, 0xf3, 0x5, 0xee, 0x7f,
0x30,
/* U+0076 "v" */
0xba, 0x0, 0x2f, 0x15, 0xf0, 0x7, 0xb0, 0xe,
0x50, 0xd5, 0x0, 0x9b, 0x2f, 0x0, 0x3, 0xf8,
0xa0, 0x0, 0xd, 0xf4, 0x0, 0x0, 0x7e, 0x0,
0x0,
/* U+0077 "w" */
0xb8, 0x0, 0xd7, 0x0, 0xe4, 0x6d, 0x1, 0xfc,
0x2, 0xe0, 0x1f, 0x26, 0xcf, 0x17, 0xa0, 0xc,
0x7a, 0x5c, 0x5c, 0x40, 0x6, 0xce, 0x17, 0xbf,
0x0, 0x1, 0xfb, 0x2, 0xfa, 0x0, 0x0, 0xc6,
0x0, 0xc5, 0x0,
/* U+0078 "x" */
0x9d, 0x0, 0xab, 0x0, 0xe8, 0x5f, 0x10, 0x4,
0xfe, 0x60, 0x0, 0xc, 0xe0, 0x0, 0x4, 0xfe,
0x60, 0x0, 0xd7, 0x6f, 0x10, 0x9d, 0x0, 0xbb,
0x0,
/* U+0079 "y" */
0xca, 0x0, 0x1f, 0x25, 0xf0, 0x7, 0xc0, 0xf,
0x50, 0xc6, 0x0, 0x9b, 0x1f, 0x10, 0x3, 0xf8,
0xb0, 0x0, 0xd, 0xf5, 0x0, 0x0, 0x7f, 0x0,
0x0, 0x9, 0x90, 0x0, 0x45, 0xf3, 0x0, 0xb,
0xf8, 0x0, 0x0,
/* U+007A "z" */
0x6f, 0xff, 0xf2, 0x1, 0x1b, 0xb0, 0x0, 0x4f,
0x20, 0x0, 0xe7, 0x0, 0x8, 0xd0, 0x0, 0x2f,
0x62, 0x20, 0x9f, 0xff, 0xf5,
/* U+007B "{" */
0x0, 0x0, 0x0, 0x8, 0xf5, 0x2, 0xf7, 0x10,
0x3f, 0x0, 0x4, 0xf0, 0x0, 0x4f, 0x0, 0x1a,
0xd0, 0x9, 0xf4, 0x0, 0x3b, 0xc0, 0x0, 0x4f,
0x0, 0x4, 0xf0, 0x0, 0x3f, 0x30, 0x0, 0xcf,
0x50, 0x0, 0x21,
/* U+007C "|" */
0x12, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
/* U+007D "}" */
0x0, 0x0, 0xb, 0xd3, 0x0, 0x2c, 0xb0, 0x0,
0x7d, 0x0, 0x6, 0xd0, 0x0, 0x6e, 0x0, 0x3,
0xf5, 0x0, 0xb, 0xf2, 0x3, 0xf7, 0x0, 0x6e,
0x0, 0x6, 0xd0, 0x0, 0x9c, 0x0, 0xcf, 0x60,
0x2, 0x10, 0x0,
/* U+007E "~" */
0x0, 0x0, 0x0, 0x0, 0xaf, 0x91, 0xe3, 0x3e,
0x1b, 0xfc, 0x1, 0x20, 0x2, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 0, .adv_w = 47, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 15, .adv_w = 72, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 7},
{.bitmap_index = 23, .adv_w = 127, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 63, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 112, .adv_w = 153, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 162, .adv_w = 138, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 212, .adv_w = 39, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 7},
{.bitmap_index = 216, .adv_w = 69, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 249, .adv_w = 69, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 275, .adv_w = 84, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 4},
{.bitmap_index = 290, .adv_w = 111, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 315, .adv_w = 49, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 323, .adv_w = 94, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 3},
{.bitmap_index = 329, .adv_w = 46, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 332, .adv_w = 77, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 357, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 392, .adv_w = 111, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 412, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 447, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 482, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 517, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 552, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 587, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 622, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 657, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 692, .adv_w = 51, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 703, .adv_w = 53, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 718, .adv_w = 111, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 743, .adv_w = 111, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 761, .adv_w = 111, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 786, .adv_w = 86, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0},
{.bitmap_index = 821, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 899, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 944, .adv_w = 127, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 979, .adv_w = 127, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1019, .adv_w = 139, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1059, .adv_w = 115, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1089, .adv_w = 109, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1119, .adv_w = 136, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1159, .adv_w = 145, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1199, .adv_w = 53, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1209, .adv_w = 92, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1234, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1274, .adv_w = 110, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1304, .adv_w = 167, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1349, .adv_w = 143, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1384, .adv_w = 148, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1429, .adv_w = 117, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1464, .adv_w = 148, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1524, .adv_w = 126, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1559, .adv_w = 111, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1594, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1629, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1669, .adv_w = 130, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1714, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1774, .adv_w = 130, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1814, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1854, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1889, .adv_w = 68, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1917, .adv_w = 77, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1942, .adv_w = 68, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1970, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 5},
{.bitmap_index = 1985, .adv_w = 84, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 1991, .adv_w = 61, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 8},
{.bitmap_index = 1995, .adv_w = 106, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2016, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2051, .adv_w = 95, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2072, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2107, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2132, .adv_w = 69, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2160, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2195, .adv_w = 113, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2230, .adv_w = 48, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2245, .adv_w = 48, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3},
{.bitmap_index = 2278, .adv_w = 104, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2313, .adv_w = 48, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2328, .adv_w = 165, .box_w = 10, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2363, .adv_w = 113, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2388, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2413, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2448, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2483, .adv_w = 75, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2501, .adv_w = 88, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2522, .adv_w = 74, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2545, .adv_w = 113, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2570, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2595, .adv_w = 152, .box_w = 10, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2630, .adv_w = 98, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2655, .adv_w = 103, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2690, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2711, .adv_w = 74, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2746, .adv_w = 38, .box_w = 2, .box_h = 13, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2759, .adv_w = 74, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2794, .adv_w = 111, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 3}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 95, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 0, 1, 0, 0, 0, 0,
1, 2, 3, 0, 4, 0, 4, 0,
5, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
6, 7, 8, 9, 10, 7, 11, 12,
13, 14, 14, 15, 16, 17, 14, 14,
7, 18, 0, 19, 20, 21, 15, 5,
22, 23, 24, 25, 2, 8, 3, 0,
0, 0, 26, 27, 28, 29, 30, 31,
32, 26, 0, 33, 34, 29, 26, 26,
27, 27, 0, 35, 36, 37, 32, 38,
38, 39, 38, 40, 2, 0, 3, 4
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 1, 0, 2, 0, 0, 0, 0,
2, 0, 3, 0, 4, 5, 4, 5,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 4, 0, 0,
7, 8, 6, 9, 8, 9, 9, 9,
8, 9, 9, 10, 9, 9, 9, 9,
8, 9, 8, 9, 11, 12, 13, 14,
15, 16, 17, 18, 0, 14, 3, 0,
5, 0, 19, 20, 21, 21, 21, 22,
21, 20, 0, 23, 20, 20, 24, 24,
21, 0, 21, 24, 25, 26, 27, 28,
28, 29, 30, 31, 0, 0, 3, 4
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 4, 0, 4, 4,
2, 0, 3, 0, 0, 13, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -8, 3, 4, -8,
-27, -18, 4, -7, 0, -23, -2, 4,
0, 0, 0, 0, 0, 0, -15, 0,
-14, -5, 0, -9, -11, -1, -9, -9,
-11, -9, -10, 0, 0, 0, -6, -19,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -4, 0, 0, -8, -7,
0, 0, 0, -7, 0, -6, 0, -7,
-4, -7, -11, -4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -8, -22, 0, -12, 5, 0, -13,
-7, 0, 0, 0, -16, -3, -18, -13,
0, -21, 4, 0, 0, -2, 0, 0,
0, 0, 0, 0, -8, 0, -8, 0,
0, -2, 0, 0, 0, -3, 0, 0,
0, 3, 0, -7, 0, -9, -3, 0,
-11, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
2, 0, -6, 4, 0, 6, -3, 0,
0, 0, 1, 0, -1, 0, 0, -1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -4, 0, -4, 0, 0, 0,
0, 0, 2, 0, 2, -2, 0, 2,
0, 0, 0, -2, 0, 0, -2, 0,
-2, 0, -2, -3, 0, 0, -2, -2,
-2, -4, -2, -4, 0, -2, 5, 0,
1, -25, -11, 8, -1, 0, -27, 0,
4, 0, 0, 0, 0, 0, 0, -8,
0, -5, -2, 0, -3, 0, -2, 0,
-4, -7, -4, -5, 0, 0, 0, 0,
3, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, -6, -3,
0, 0, 0, -6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -8, 0, 0, -21, 3, 0, -1,
-11, -3, 0, -3, 0, -5, 0, 0,
0, 0, 0, -6, 0, -7, -8, 0,
-3, -3, -8, -8, -13, -7, -13, 0,
-10, -20, 0, -17, 5, 0, -14, -9,
0, 3, -2, -25, -8, -28, -21, 0,
-34, 0, -1, 0, -4, -4, 0, 0,
0, -5, -5, -18, 0, -18, 0, -2,
2, 0, 2, -28, -16, 3, 0, 0,
-31, 0, 0, 0, -1, -1, -5, 0,
-6, -6, 0, -6, 0, 0, 0, 0,
0, 0, 2, 0, 2, 0, 0, -2,
0, -2, 7, 0, -1, -2, 0, 0,
1, -2, -2, -5, -3, 0, -9, 0,
0, 0, -2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, 4,
0, 0, -3, 0, 0, -4, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -6, 6, 0, -15,
-22, -16, 7, -6, 0, -27, 0, 4,
0, 4, 4, 0, 0, 0, -23, 0,
-21, -9, 0, -18, -21, -6, -17, -20,
-21, -20, -17, -2, 3, 0, -5, -15,
-13, 0, -4, 0, -14, 0, 4, 0,
0, 0, 0, 0, 0, -15, 0, -12,
-3, 0, -8, -9, 0, -7, -4, -6,
-4, -7, 0, 0, 4, -18, 2, 0,
2, -7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -5, 0, -7, 0,
0, -3, -3, -6, -6, -12, 0, -12,
0, -6, 3, 4, -14, -26, -21, 2,
-11, 0, -26, -5, 0, 0, 0, 0,
0, 0, 0, -22, 0, -21, -10, 0,
-16, -18, -7, -15, -14, -13, -14, -15,
0, 0, 2, -9, 4, 0, 2, -5,
0, 0, -2, 0, 0, 0, 0, 0,
0, 0, -1, 0, -3, 0, 0, 0,
0, 0, 0, -6, 0, -6, 0, 0,
-8, 0, 0, 0, 0, -6, 0, 0,
0, 0, -17, 0, -14, -13, -2, -19,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -2, 0, -2, 0, 0, -10,
0, -2, -6, 0, -8, 0, 0, 0,
0, -21, 0, -14, -12, -7, -21, 0,
-2, 0, 0, -2, 0, 0, 0, -1,
0, -4, -5, -4, -4, 0, 1, 0,
3, 5, 0, -2, 0, 0, 0, 0,
-15, 0, -10, -7, 3, -15, 0, 0,
0, -1, 2, 0, 0, 0, 4, 0,
0, 1, 0, 3, 0, 0, 3, 0,
0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 3, -1,
0, -5, 0, 0, 0, 0, -14, 0,
-12, -9, -3, -18, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, -1,
0, 0, 0, 9, 0, -1, -15, 0,
9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -5, 0, -5, 0,
0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -5,
0, 0, 0, 0, -18, 0, -9, -8,
0, -16, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 8, 0,
0, 0, 0, 0, 0, 0, 0, -4,
0, 0, -5, 5, 0, -9, 0, 0,
0, 0, -18, 0, -12, -11, 0, -16,
0, -6, 0, -4, 0, 0, 0, -2,
0, -2, 0, 0, 0, 0, 0, 5,
0, 2, -21, -9, -6, 0, 0, -23,
0, 0, 0, -8, 0, -10, -14, 0,
-8, 0, -6, 0, 0, 0, -1, 6,
0, 0, 0, 0, 0, 0, -6, 0,
0, 0, 0, -6, 0, 0, 0, 0,
-19, 0, -14, -10, -1, -20, 0, 0,
0, 0, 0, 0, 0, 2, 0, 0,
-2, 0, -2, 2, 0, -1, 2, 0,
5, 0, -5, 0, 0, 0, 0, -13,
0, -9, 0, 0, -13, 0, 0, 0,
-2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -17,
-8, -5, 0, 0, -15, 0, -20, 0,
-9, -4, -12, -14, 0, -4, 0, -4,
0, 0, 0, -2, 0, 0, 0, 0,
0, 0, 0, 0, 0, -4, 2, 0,
-8, 0, 0, 0, 0, -21, 0, -11,
-6, 0, -13, 0, -3, 0, -5, 0,
0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2, 0, -6,
0, 0, 0, 0, -19, 0, -11, -6,
0, -14, 0, -3, 0, -4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 40,
.right_class_cnt = 31,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 1,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_12px = {
#else
lv_font_t Number_HarmonyOS_bpp4_12px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 15, /*The maximum line height required by the font*/
.base_line = 3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -1,
.underline_thickness = 1,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_12PX*/

View File

@ -0,0 +1,309 @@
/*******************************************************************************
* Size: 12 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_12px.c --bpp 4 --size 12 -r 0x20-0x7f
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_12PX
#define NUMBER_HARMONYOS_BPP4_12PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_12PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 95, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 0, 1, 0, 0, 0, 0,
1, 2, 3, 0, 4, 0, 4, 0,
5, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
6, 7, 8, 9, 10, 7, 11, 12,
13, 14, 14, 15, 16, 17, 14, 14,
7, 18, 0, 19, 20, 21, 15, 5,
22, 23, 24, 25, 2, 8, 3, 0,
0, 0, 26, 27, 28, 29, 30, 31,
32, 26, 0, 33, 34, 29, 26, 26,
27, 27, 0, 35, 36, 37, 32, 38,
38, 39, 38, 40, 2, 0, 3, 4
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 1, 0, 2, 0, 0, 0, 0,
2, 0, 3, 0, 4, 5, 4, 5,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 4, 0, 0,
7, 8, 6, 9, 8, 9, 9, 9,
8, 9, 9, 10, 9, 9, 9, 9,
8, 9, 8, 9, 11, 12, 13, 14,
15, 16, 17, 18, 0, 14, 3, 0,
5, 0, 19, 20, 21, 21, 21, 22,
21, 20, 0, 23, 20, 20, 24, 24,
21, 0, 21, 24, 25, 26, 27, 28,
28, 29, 30, 31, 0, 0, 3, 4
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 4, 0, 4, 4,
2, 0, 3, 0, 0, 13, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -8, 3, 4, -8,
-27, -18, 4, -7, 0, -23, -2, 4,
0, 0, 0, 0, 0, 0, -15, 0,
-14, -5, 0, -9, -11, -1, -9, -9,
-11, -9, -10, 0, 0, 0, -6, -19,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -4, 0, 0, -8, -7,
0, 0, 0, -7, 0, -6, 0, -7,
-4, -7, -11, -4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -8, -22, 0, -12, 5, 0, -13,
-7, 0, 0, 0, -16, -3, -18, -13,
0, -21, 4, 0, 0, -2, 0, 0,
0, 0, 0, 0, -8, 0, -8, 0,
0, -2, 0, 0, 0, -3, 0, 0,
0, 3, 0, -7, 0, -9, -3, 0,
-11, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
2, 0, -6, 4, 0, 6, -3, 0,
0, 0, 1, 0, -1, 0, 0, -1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -4, 0, -4, 0, 0, 0,
0, 0, 2, 0, 2, -2, 0, 2,
0, 0, 0, -2, 0, 0, -2, 0,
-2, 0, -2, -3, 0, 0, -2, -2,
-2, -4, -2, -4, 0, -2, 5, 0,
1, -25, -11, 8, -1, 0, -27, 0,
4, 0, 0, 0, 0, 0, 0, -8,
0, -5, -2, 0, -3, 0, -2, 0,
-4, -7, -4, -5, 0, 0, 0, 0,
3, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, -6, -3,
0, 0, 0, -6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -8, 0, 0, -21, 3, 0, -1,
-11, -3, 0, -3, 0, -5, 0, 0,
0, 0, 0, -6, 0, -7, -8, 0,
-3, -3, -8, -8, -13, -7, -13, 0,
-10, -20, 0, -17, 5, 0, -14, -9,
0, 3, -2, -25, -8, -28, -21, 0,
-34, 0, -1, 0, -4, -4, 0, 0,
0, -5, -5, -18, 0, -18, 0, -2,
2, 0, 2, -28, -16, 3, 0, 0,
-31, 0, 0, 0, -1, -1, -5, 0,
-6, -6, 0, -6, 0, 0, 0, 0,
0, 0, 2, 0, 2, 0, 0, -2,
0, -2, 7, 0, -1, -2, 0, 0,
1, -2, -2, -5, -3, 0, -9, 0,
0, 0, -2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, 4,
0, 0, -3, 0, 0, -4, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -6, 6, 0, -15,
-22, -16, 7, -6, 0, -27, 0, 4,
0, 4, 4, 0, 0, 0, -23, 0,
-21, -9, 0, -18, -21, -6, -17, -20,
-21, -20, -17, -2, 3, 0, -5, -15,
-13, 0, -4, 0, -14, 0, 4, 0,
0, 0, 0, 0, 0, -15, 0, -12,
-3, 0, -8, -9, 0, -7, -4, -6,
-4, -7, 0, 0, 4, -18, 2, 0,
2, -7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -5, 0, -7, 0,
0, -3, -3, -6, -6, -12, 0, -12,
0, -6, 3, 4, -14, -26, -21, 2,
-11, 0, -26, -5, 0, 0, 0, 0,
0, 0, 0, -22, 0, -21, -10, 0,
-16, -18, -7, -15, -14, -13, -14, -15,
0, 0, 2, -9, 4, 0, 2, -5,
0, 0, -2, 0, 0, 0, 0, 0,
0, 0, -1, 0, -3, 0, 0, 0,
0, 0, 0, -6, 0, -6, 0, 0,
-8, 0, 0, 0, 0, -6, 0, 0,
0, 0, -17, 0, -14, -13, -2, -19,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -2, 0, -2, 0, 0, -10,
0, -2, -6, 0, -8, 0, 0, 0,
0, -21, 0, -14, -12, -7, -21, 0,
-2, 0, 0, -2, 0, 0, 0, -1,
0, -4, -5, -4, -4, 0, 1, 0,
3, 5, 0, -2, 0, 0, 0, 0,
-15, 0, -10, -7, 3, -15, 0, 0,
0, -1, 2, 0, 0, 0, 4, 0,
0, 1, 0, 3, 0, 0, 3, 0,
0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 3, -1,
0, -5, 0, 0, 0, 0, -14, 0,
-12, -9, -3, -18, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, -1,
0, 0, 0, 9, 0, -1, -15, 0,
9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -5, 0, -5, 0,
0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -5,
0, 0, 0, 0, -18, 0, -9, -8,
0, -16, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 8, 0,
0, 0, 0, 0, 0, 0, 0, -4,
0, 0, -5, 5, 0, -9, 0, 0,
0, 0, -18, 0, -12, -11, 0, -16,
0, -6, 0, -4, 0, 0, 0, -2,
0, -2, 0, 0, 0, 0, 0, 5,
0, 2, -21, -9, -6, 0, 0, -23,
0, 0, 0, -8, 0, -10, -14, 0,
-8, 0, -6, 0, 0, 0, -1, 6,
0, 0, 0, 0, 0, 0, -6, 0,
0, 0, 0, -6, 0, 0, 0, 0,
-19, 0, -14, -10, -1, -20, 0, 0,
0, 0, 0, 0, 0, 2, 0, 0,
-2, 0, -2, 2, 0, -1, 2, 0,
5, 0, -5, 0, 0, 0, 0, -13,
0, -9, 0, 0, -13, 0, 0, 0,
-2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -17,
-8, -5, 0, 0, -15, 0, -20, 0,
-9, -4, -12, -14, 0, -4, 0, -4,
0, 0, 0, -2, 0, 0, 0, 0,
0, 0, 0, 0, 0, -4, 2, 0,
-8, 0, 0, 0, 0, -21, 0, -11,
-6, 0, -13, 0, -3, 0, -5, 0,
0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2, 0, -6,
0, 0, 0, 0, -19, 0, -11, -6,
0, -14, 0, -3, 0, -4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 40,
.right_class_cnt = 31,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_12px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_12px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 1,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_12px = {
#else
lv_font_t Number_HarmonyOS_bpp4_12px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 15, /*The maximum line height required by the font*/
.base_line = 3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -1,
.underline_thickness = 1,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_12PX*/

View File

@ -0,0 +1,309 @@
/*******************************************************************************
* Size: 16 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_16px.c --bpp 4 --size 16 -r 0x20-0x7f
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_16PX
#define NUMBER_HARMONYOS_BPP4_16PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_16PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 95, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 0, 1, 0, 0, 0, 0,
1, 2, 3, 0, 4, 0, 4, 0,
5, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
6, 7, 8, 9, 10, 7, 11, 12,
13, 14, 14, 15, 16, 17, 14, 14,
7, 18, 0, 19, 20, 21, 15, 5,
22, 23, 24, 25, 2, 8, 3, 0,
0, 0, 26, 27, 28, 29, 30, 31,
32, 26, 0, 33, 34, 29, 26, 26,
27, 27, 0, 35, 36, 37, 32, 38,
38, 39, 38, 40, 2, 0, 3, 4
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 1, 0, 2, 0, 0, 0, 0,
2, 0, 3, 0, 4, 5, 4, 5,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 4, 0, 0,
7, 8, 6, 9, 8, 9, 9, 9,
8, 9, 9, 10, 9, 9, 9, 9,
8, 9, 8, 9, 11, 12, 13, 14,
15, 16, 17, 18, 0, 14, 3, 0,
5, 0, 19, 20, 21, 21, 21, 22,
21, 20, 0, 23, 20, 20, 24, 24,
21, 0, 21, 24, 25, 26, 27, 28,
28, 29, 30, 31, 0, 0, 3, 4
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 5, 5,
3, 0, 4, 0, 0, 18, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -14, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -10, 5, 5, -11,
-36, -24, 6, -9, 0, -31, -3, 5,
0, 0, 0, 0, 0, 0, -19, 0,
-19, -6, 0, -12, -15, -2, -12, -12,
-14, -12, -14, 0, 0, 0, -8, -26,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -6, 0, 0, -11, -9,
0, 0, 0, -9, 0, -8, 0, -9,
-5, -9, -14, -6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -10, -30, 0, -16, 7, 0, -17,
-9, 0, 0, 0, -22, -4, -24, -18,
0, -28, 5, 0, 0, -3, 0, 0,
0, 0, 0, 0, -11, 0, -11, 0,
0, -3, 0, 0, 0, -4, 0, 0,
0, 4, 0, -9, 0, -12, -4, 0,
-15, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
3, 0, -8, 6, 0, 8, -4, 0,
0, 0, 1, 0, -1, 0, 0, -1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -6, 0, -6, 0, 0, 0,
0, 0, 3, 0, 3, -3, 0, 3,
0, 0, 0, -3, 0, 0, -3, 0,
-3, 0, -3, -4, 0, 0, -2, -3,
-2, -5, -2, -5, 0, -3, 7, 0,
2, -34, -15, 10, -1, 0, -36, 0,
6, 0, 0, 0, 0, 0, 0, -10,
0, -7, -2, 0, -5, 0, -3, 0,
-6, -9, -6, -6, 0, 0, 0, 0,
5, 0, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, -8, -4,
0, 0, 0, -8, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -10, 0, 0, -28, 5, 0, -2,
-15, -4, 0, -4, 0, -7, 0, 0,
0, 0, 0, -7, 0, -9, -10, 0,
-4, -4, -10, -11, -17, -9, -17, 0,
-13, -26, 0, -23, 7, 0, -18, -12,
0, 4, -2, -34, -11, -38, -28, 0,
-46, 0, -2, 0, -5, -5, 0, -1,
0, -7, -7, -24, 0, -24, 0, -3,
3, 0, 3, -37, -21, 4, 0, 0,
-41, 0, 0, 0, -1, -1, -6, 0,
-8, -8, 0, -8, 0, 0, 0, 0,
0, 0, 3, 0, 3, 0, 0, -3,
0, -2, 10, 0, -1, -3, 0, 0,
2, -3, -3, -7, -5, 0, -13, 0,
0, 0, -3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, 6,
0, 0, -4, 0, 0, -6, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -8, 8, 0, -20,
-29, -22, 9, -8, 0, -36, 0, 6,
0, 5, 5, 0, 0, 0, -30, 0,
-28, -12, 0, -24, -28, -8, -23, -27,
-27, -27, -22, -3, 5, 0, -6, -20,
-18, 0, -5, 0, -19, -1, 5, 0,
0, 0, 0, 0, 0, -20, 0, -16,
-4, 0, -11, -12, 0, -9, -6, -8,
-6, -9, 0, 0, 5, -24, 3, 0,
3, -9, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -6, 0, -9, 0,
0, -4, -5, -8, -8, -16, 0, -16,
0, -8, 4, 5, -18, -35, -28, 2,
-14, 0, -35, -6, 0, 0, 0, 0,
0, 0, 0, -29, 0, -27, -13, 0,
-22, -24, -9, -20, -19, -18, -19, -20,
0, 0, 3, -12, 5, 0, 3, -7,
0, 0, -3, 0, 0, 0, 0, 0,
0, 0, -1, 0, -4, 0, 0, 0,
0, 0, 0, -8, 0, -8, 0, 0,
-10, 0, -1, 0, 0, -8, 0, 0,
0, 0, -22, 0, -19, -17, -2, -26,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -3, 0, -3, 0, 0, -13,
0, -3, -8, 0, -10, 0, 0, 0,
0, -28, 0, -19, -16, -9, -27, 0,
-3, 0, 0, -2, 0, 0, 0, -1,
0, -5, -6, -5, -6, 0, 1, 0,
5, 6, 0, -3, 0, 0, 0, 0,
-20, 0, -13, -9, 5, -20, 0, 1,
0, -1, 3, 0, 0, 0, 6, 0,
0, 2, 0, 4, 0, 0, 4, 0,
0, 0, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, 0, 4, -1,
0, -6, 0, 0, 0, 0, -18, 0,
-17, -13, -4, -24, 0, 0, 0, 0,
0, 0, 0, 3, 0, 0, -1, -2,
-1, 0, 0, 12, 0, -2, -20, 0,
12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -7, 0, -6, 1,
0, 0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -7,
0, 0, 0, 0, -24, 0, -12, -11,
0, -22, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 11, 0,
0, 0, 0, 0, 0, 0, 0, -6,
0, 0, -7, 6, 0, -12, 0, 0,
0, 0, -24, 0, -16, -14, 0, -22,
0, -7, 0, -6, 0, 0, 0, -3,
0, -2, 0, 0, 0, 0, 0, 6,
0, 2, -28, -12, -7, 0, 0, -30,
0, 0, 0, -11, 0, -13, -19, 0,
-11, 0, -8, 0, 0, 0, -2, 7,
0, 0, 0, 0, 0, 0, -7, 0,
0, 0, 0, -8, 0, 0, 0, 0,
-26, 0, -18, -13, -1, -27, 0, 0,
0, 0, 0, 0, 0, 2, 0, 0,
-2, 0, -2, 3, 0, -2, 3, -1,
7, 0, -6, 0, 0, 0, 0, -18,
0, -12, 0, -1, -17, 0, 0, 0,
-2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -23,
-11, -7, 0, 0, -20, 0, -27, 0,
-12, -6, -16, -19, 0, -5, 0, -5,
0, 0, 0, -3, 0, 0, 0, 0,
0, 0, 0, 0, 0, -5, 2, 0,
-10, 0, 0, 0, 0, -27, 0, -14,
-8, 0, -18, 0, -4, 0, -6, 0,
0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3, 0, -8,
0, 0, 0, 0, -25, 0, -14, -8,
0, -19, 0, -4, 0, -6, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 40,
.right_class_cnt = 31,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_16px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_16px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 1,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_16px = {
#else
lv_font_t Number_HarmonyOS_bpp4_16px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 19, /*The maximum line height required by the font*/
.base_line = 4, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -1,
.underline_thickness = 1,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_16PX*/

View File

@ -0,0 +1,128 @@
/*******************************************************************************
* Size: 180 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_180px.c --bpp 4 --size 180 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_180PX
#define NUMBER_HARMONYOS_BPP4_180PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_180PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 45, .range_length = 14, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
3, 1,
3, 2,
3, 3
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-37, -119, -77
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_180px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_180px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 55,
.cmap_num = 1,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_180px = {
#else
lv_font_t Number_HarmonyOS_bpp4_180px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 137, /*The maximum line height required by the font*/
.base_line = 2, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -13,
.underline_thickness = 9,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_180PX*/

View File

@ -0,0 +1,315 @@
/*******************************************************************************
* Size: 20 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_20px.c --bpp 4 --size 20 -r 0x00-0x7f
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_20PX
#define NUMBER_HARMONYOS_BPP4_20PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_20PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 0, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 32, .range_length = 95, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 0, 0, 1, 0, 0, 0,
0, 1, 2, 3, 0, 4, 0, 4,
0, 5, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
4, 6, 7, 8, 9, 10, 7, 11,
12, 13, 14, 14, 15, 16, 17, 14,
14, 7, 18, 0, 19, 20, 21, 15,
5, 22, 23, 24, 25, 2, 8, 3,
0, 0, 0, 26, 27, 28, 29, 30,
31, 32, 26, 0, 33, 34, 29, 26,
26, 27, 27, 0, 35, 36, 37, 32,
38, 38, 39, 38, 40, 2, 0, 3,
4
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 0, 1, 0, 2, 0, 0, 0,
0, 2, 0, 3, 0, 4, 5, 4,
5, 6, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0,
0, 7, 8, 6, 9, 8, 9, 9,
9, 8, 9, 9, 10, 9, 9, 9,
9, 8, 9, 8, 9, 11, 12, 13,
14, 15, 16, 17, 18, 0, 14, 3,
0, 5, 0, 19, 20, 21, 21, 21,
22, 21, 20, 0, 23, 20, 20, 24,
24, 21, 0, 21, 24, 25, 26, 27,
28, 28, 29, 30, 31, 0, 0, 3,
4
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 0, 0, 0, 0, 5, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 6, 0, 6, 6,
3, 0, 4, 0, 0, 22, 0, 0,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -17, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -13, 6, 6, -14,
-45, -29, 7, -12, 0, -39, -3, 6,
0, 0, 0, 0, 0, 0, -24, 0,
-24, -8, 0, -15, -19, -2, -15, -14,
-18, -14, -17, 0, 0, 0, -11, -32,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -7, 0, 0, -14, -12,
0, 0, 0, -12, 0, -10, 0, -12,
-6, -11, -18, -7, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -13, -37, 0, -20, 8, 0, -22,
-12, 0, 0, 0, -27, -5, -29, -22,
0, -36, 7, 0, 0, -4, 0, 0,
0, 0, 0, 0, -14, 0, -14, 0,
0, -4, 0, 0, 0, -5, 0, 0,
0, 4, 0, -11, 0, -14, -5, 0,
-18, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
3, 0, -10, 7, 0, 11, -5, 0,
0, 0, 2, 0, -1, 0, 0, -1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -7, 0, -7, 0, 0, 0,
0, 0, 3, 0, 4, -3, 0, 4,
0, 0, 0, -4, 0, 0, -4, 0,
-3, 0, -4, -4, 0, 0, -3, -3,
-3, -7, -3, -7, 0, -3, 8, 0,
2, -42, -19, 13, -2, 0, -44, 0,
7, 0, 0, 0, 0, 0, 0, -13,
0, -9, -3, 0, -6, 0, -4, 0,
-7, -12, -7, -8, 0, 0, 0, 0,
6, 0, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, -10, -5,
0, 0, 0, -10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -13, 0, 0, -35, 6, 0, -2,
-19, -5, 0, -5, 0, -8, 0, 0,
0, 0, 0, -9, 0, -11, -13, 0,
-5, -5, -13, -13, -21, -11, -21, 0,
-16, -33, 0, -29, 8, 0, -23, -15,
0, 5, -3, -42, -14, -47, -35, 0,
-57, 0, -2, 0, -6, -6, 0, -1,
0, -9, -8, -30, 0, -30, 0, -3,
3, 0, 4, -46, -26, 5, 0, 0,
-51, 0, 0, 0, -1, -2, -8, 0,
-10, -11, 0, -10, 0, 0, 0, 0,
0, 0, 4, 0, 4, 0, 0, -4,
0, -3, 12, 0, -1, -3, 0, 0,
2, -4, -4, -9, -6, 0, -16, 0,
0, 0, -4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3, 0, 0, 0, 7,
0, 0, -5, 0, 0, -7, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -10, 10, 0, -26,
-36, -27, 12, -10, 0, -45, 0, 7,
0, 6, 6, 0, 0, 0, -38, 0,
-36, -14, 0, -29, -36, -11, -28, -34,
-34, -34, -28, -3, 6, 0, -8, -25,
-22, 0, -6, 0, -23, -1, 6, 0,
0, 0, 0, 0, 0, -25, 0, -20,
-5, 0, -14, -15, 0, -11, -7, -11,
-7, -11, 0, 0, 6, -29, 3, 0,
4, -11, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -8, 0, -11, 0,
0, -5, -6, -10, -10, -20, 0, -20,
0, -10, 4, 6, -23, -44, -36, 3,
-18, 0, -44, -8, 0, 0, 0, 0,
0, 0, 0, -36, 0, -34, -16, 0,
-27, -30, -11, -25, -24, -22, -24, -25,
0, 0, 3, -15, 6, 0, 3, -9,
0, 0, -3, 0, 0, 0, 0, 0,
0, 0, -2, 0, -5, 0, 0, 0,
0, 0, 0, -11, 0, -11, 0, 0,
-13, 0, -1, 0, 0, -10, 0, 0,
0, 0, -28, 0, -24, -21, -3, -32,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -4, 0, -4, 0, 0, -16,
0, -3, -10, 0, -13, 0, 0, 0,
0, -36, 0, -24, -20, -11, -34, 0,
-3, 0, 0, -3, 0, 0, 0, -2,
0, -7, -8, -7, -7, 0, 1, 0,
6, 8, 0, -4, 0, 0, 0, 0,
-25, 0, -17, -11, 6, -25, 0, 1,
0, -1, 4, 0, 0, 0, 7, 0,
0, 2, 0, 4, 0, 0, 4, 0,
0, 0, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -2, 0, 5, -1,
0, -8, 0, 0, 0, 0, -23, 0,
-21, -16, -4, -29, 0, 0, 0, 0,
0, 0, 0, 4, 0, 0, -1, -2,
-1, 0, 0, 15, 0, -2, -25, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -9, 0, -8, 1,
0, 0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -9,
0, 0, 0, 0, -29, 0, -15, -14,
0, -27, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 13, 0,
0, 0, 0, 0, 0, 0, 0, -7,
0, 0, -9, 8, 0, -15, 0, 0,
0, 0, -29, 0, -20, -18, 0, -27,
0, -9, 0, -7, 0, 0, 0, -4,
0, -3, 0, 0, 0, 0, 0, 8,
0, 3, -35, -15, -9, 0, 0, -38,
0, 0, 0, -14, 0, -16, -24, 0,
-13, 0, -11, 0, 0, 0, -2, 9,
0, 0, 0, 0, 0, 0, -9, 0,
0, 0, 0, -10, 0, 0, 0, 0,
-32, 0, -23, -16, -1, -34, 0, 0,
0, 0, 0, 0, 0, 3, 0, 0,
-3, 0, -3, 4, 0, -2, 3, -1,
9, 0, -8, 0, 0, 0, 0, -22,
0, -15, 0, -1, -22, 0, 0, 0,
-3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -29,
-14, -9, 0, 0, -26, 0, -34, 0,
-14, -7, -20, -24, 0, -6, 0, -7,
0, 0, 0, -3, 0, 0, 0, 0,
0, 0, 0, 0, 0, -6, 3, 0,
-13, 0, 0, 0, 0, -34, 0, -18,
-11, 0, -22, 0, -5, 0, -8, 0,
0, 0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3, 0, -10,
0, 0, 0, 0, -31, 0, -18, -10,
0, -24, 0, -5, 0, -7, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 40,
.right_class_cnt = 31,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_20px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_20px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_20px = {
#else
lv_font_t Number_HarmonyOS_bpp4_20px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 23, /*The maximum line height required by the font*/
.base_line = 5, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -1,
.underline_thickness = 1,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_20PX*/

View File

@ -0,0 +1,295 @@
/*******************************************************************************
* Size: 36 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font D:\code\lv_font_conv\lv_font_convert_tools\HarmonyOS_Sans_SC_Medium.ttf -o D:\code\lv_font_conv\lv_font_convert_tools\Number_HarmonyOS_bpp4_36px.c --bpp 4 --size 36 --symbols <20><><EFBFBD>H%:-GOQWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm/.+ -r 0x25-0x3A
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_36PX
#define NUMBER_HARMONYOS_BPP4_36PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_36PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_3[] = {
0x0, 0x6
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 22, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 65, .range_length = 26, .glyph_id_start = 23,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 97, .range_length = 26, .glyph_id_start = 49,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 8451, .range_length = 7, .glyph_id_start = 75,
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 0, 0, 1, 2, 0, 0,
0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
5, 6, 7, 8, 9, 10, 0, 0,
11, 12, 13, 0, 0, 7, 14, 0,
15, 16, 17, 11, 3, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28,
22, 0, 29, 30, 25, 22, 22, 23,
23, 0, 31, 32, 33, 28, 34, 34,
35, 34, 36, 6, 9
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 0, 0, 1, 0, 2, 0, 3,
4, 3, 4, 5, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 5,
6, 7, 6, 6, 6, 7, 6, 6,
8, 6, 6, 6, 6, 7, 6, 7,
6, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 19, 19, 20, 19,
18, 0, 21, 18, 18, 22, 22, 19,
0, 19, 22, 23, 24, 25, 26, 26,
27, 28, 29, 0, 0
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 12, 0, 12, 12, 6,
0, 8, 0, 0, 40, 0, 0, 10,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 14, 0, 0, 0, 0, 0, 0,
0, 0, 10, 12, -25, -82, -53, 0,
-21, -70, -6, 11, 0, 0, 0, 0,
0, 0, -44, 0, -43, -14, 0, -28,
-34, -4, -28, -26, -32, -26, -31, -67,
0, -36, 15, 0, 0, -21, 0, 0,
-48, -9, -53, -40, 0, -64, 12, 0,
0, -6, 0, 0, 0, 0, 0, 0,
-25, 0, -25, 0, -7, 0, 0, 0,
-9, 0, 0, 8, 0, -20, 0, -26,
-9, 0, -33, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 6, 0, -18, 13, 0, 0, -9,
0, 0, 3, 0, -2, 0, 0, -2,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -13, 0, -13, 0, -13, 0,
0, -25, -21, 0, 0, -21, 0, -18,
0, -21, -12, -20, -32, -13, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 6, 0,
0, -6, 6, 0, 0, 0, -6, 0,
0, -7, 0, -6, 0, -6, -8, 0,
0, -5, -6, -5, -12, -5, -12, 0,
15, 0, 3, -75, -33, 0, -3, -80,
0, 13, 0, 0, 0, 0, 0, 0,
-23, 0, -16, -5, 0, -10, 0, -7,
0, -13, -21, -13, -14, 0, 0, 1,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -17, -9, 0,
0, -17, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, -63, 10, 0, -9, -33, 0, -9,
0, -15, 0, 0, 0, 0, 0, -17,
0, -20, -24, 0, -9, -9, -24, -24,
-39, -20, -39, 0, -59, 0, -52, 15,
0, 0, -28, 10, -5, -75, -25, -85,
-63, 0, -103, 0, -4, 0, -12, -11,
0, -1, 1, -16, -15, -55, 0, -55,
0, 6, 0, 7, -83, -47, 0, 0,
-92, 0, 0, 0, -2, -3, -14, 0,
-17, -19, 0, -17, 0, 0, 0, 0,
0, 0, 6, 0, 6, 0, -6, 0,
-5, 22, 0, 0, -6, 0, 4, -7,
-7, -16, -10, 0, -28, 0, 0, 0,
-7, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 13, 0, 0, -9, 0,
0, -13, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
17, 0, -46, -66, -48, 0, -18, -81,
0, 13, 0, 11, 12, 0, 0, 0,
-69, 0, -64, -26, 0, -53, -64, -19,
-51, -61, -62, -61, -50, 10, 0, -14,
-44, -40, 0, -12, -42, -1, 12, 0,
0, 0, 0, 0, 0, -44, 0, -36,
-9, 0, -25, -26, 0, -20, -13, -19,
-13, -20, 0, 12, -53, 6, 0, 0,
-20, 0, 0, 0, 0, 0, 0, 0,
0, 0, -14, 0, -20, 0, 0, -10,
-10, -18, -18, -35, 0, -35, 0, 8,
12, -41, -79, -64, 0, -32, -79, -14,
0, 0, 0, 0, 0, 0, 0, -65,
0, -62, -29, 0, -49, -54, -20, -45,
-43, -40, -43, -44, 0, 6, -26, 12,
0, 0, -16, 0, -6, 0, 0, 0,
0, 0, 0, 0, -3, 0, -9, 0,
0, 0, 0, 0, 0, -19, 0, -19,
0, -24, 0, -1, 0, 0, 0, 0,
0, 0, -50, 0, -43, -38, -5, -58,
0, 0, 0, 0, 0, 0, 0, 0,
-1, 0, -7, 0, -7, 0, -29, 0,
-6, -18, 0, 0, 0, 0, 0, -64,
0, -43, -36, -20, -62, 0, -6, 0,
0, -5, 0, 0, 0, -3, 0, -12,
-14, -12, -13, 2, 0, 10, 14, 0,
0, 0, 0, 0, -45, 0, -30, -20,
10, -44, 0, 1, 0, -2, 7, 0,
0, 0, 13, 0, 0, 4, 0, 8,
0, 8, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -3, 0, 9,
-2, 0, 0, 0, 0, 0, -41, 0,
-37, -28, -8, -53, 0, 0, 0, 0,
0, 0, 0, 6, 0, 0, -1, -4,
-1, 0, 27, 0, -4, -44, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -16, 0, -14, 1, 0, 0,
0, 8, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
-53, 0, -28, -25, 0, -49, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
24, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -16, 14, 0, 0, 0,
0, 0, -53, 0, -35, -32, 0, -49,
0, -17, 0, -13, 0, 0, 0, -6,
0, -5, 0, 0, 0, 0, 14, 0,
5, -62, -27, 0, 0, -68, 0, 0,
0, -25, 0, -29, -43, 0, -24, 0,
-19, 0, 0, 0, -3, 17, 0, 0,
0, 0, 0, -17, 0, 0, 0, 0,
0, 0, 0, 0, -58, 0, -41, -29,
-2, -60, 0, 0, 0, 0, 0, 0,
0, 5, 0, 0, -5, 0, -5, 7,
-4, 6, -1, 16, 0, 0, 0, 0,
0, -40, 0, -27, 0, -1, -39, 0,
0, 0, -5, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, 0, 0, 0,
-52, -25, 0, 0, -46, 0, -61, 0,
-26, -13, -35, -43, 0, -11, 0, -12,
0, 0, 0, -6, 0, 0, 0, 0,
0, -1, 0, 0, -12, 5, 0, 0,
0, 0, 0, -62, 0, -32, -19, 0,
-40, 0, -9, 0, -14, 0, 0, 0,
0, 7, 0, 0, 0, 0, 0, 0,
0, 0, 6, 0, 0, 0, 0, 0,
-56, 0, -32, -18, 0, -43, 0, -9,
0, -13, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 36,
.right_class_cnt = 29,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_36px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_36px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 4,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_36px = {
#else
lv_font_t Number_HarmonyOS_bpp4_36px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 39, /*The maximum line height required by the font*/
.base_line = 8, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -3,
.underline_thickness = 2,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_36PX*/

View File

@ -0,0 +1,751 @@
/*******************************************************************************
* Size: 44 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_44px.c --bpp 4 --size 44 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a -r 0x25
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_44PX
#define NUMBER_HARMONYOS_BPP4_44PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_44PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0025 "%" */
0x0, 0x0, 0x0, 0x46, 0x75, 0x20, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xb2,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff,
0x40, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff,
0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff,
0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0,
0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6, 0xff,
0xff, 0x92, 0x26, 0xef, 0xff, 0xc0, 0x0, 0x0,
0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0,
0xcf, 0xff, 0x80, 0x0, 0x2, 0xff, 0xff, 0x20,
0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff,
0xf6, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0,
0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0,
0x7f, 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0xa0,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0,
0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xff,
0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0x40, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x4f,
0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9,
0xff, 0xfd, 0x20, 0x0, 0x9f, 0xff, 0xe0, 0x0,
0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x2f, 0xff, 0xff, 0xcb, 0xef, 0xff, 0xf8,
0x0, 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff,
0xff, 0xfa, 0x0, 0x0, 0xbf, 0xff, 0xf1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,
0xce, 0xfd, 0xa4, 0x0, 0x0, 0x4f, 0xff, 0xf7,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8,
0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x37,
0x99, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x3,
0xdf, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0,
0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff,
0x40, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff,
0xff, 0xa0, 0x0, 0xbf, 0xff, 0xe5, 0x1, 0x6f,
0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xbf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf4, 0x0,
0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x4f, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xfc,
0x0, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, 0x0,
0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x6f,
0xff, 0x90, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, 0x0,
0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0xff,
0x30, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0,
0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x2f,
0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff,
0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, 0x0,
0x1c, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff,
0xea, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa,
0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0,
0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0,
0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0,
0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0x9d, 0xfe, 0xd8, 0x20,
0x0, 0x0,
/* U+002D "-" */
0x3b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfd,
/* U+002E "." */
0x2, 0xab, 0x70, 0x1, 0xef, 0xff, 0xa0, 0x6f,
0xff, 0xff, 0x17, 0xff, 0xff, 0xf1, 0x2f, 0xff,
0xfc, 0x0, 0x4d, 0xfa, 0x10,
/* U+002F "/" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff,
0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef,
0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4,
0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0,
0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0,
0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff,
0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf,
0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0,
0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20,
0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff,
0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f,
0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+0030 "0" */
0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff,
0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0,
0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0,
0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff,
0xfe, 0xcd, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0,
0xaf, 0xff, 0xff, 0x60, 0x0, 0x2a, 0xff, 0xff,
0xf3, 0x0, 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0,
0x0, 0xbf, 0xff, 0xfb, 0x0, 0x9, 0xff, 0xff,
0x90, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20,
0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xa,
0xff, 0xff, 0x70, 0x3f, 0xff, 0xfd, 0x0, 0x0,
0x0, 0x0, 0x4, 0xff, 0xff, 0xc0, 0x6f, 0xff,
0xf9, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff,
0xf0, 0x8f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x0, 0xef, 0xff, 0xf2, 0xbf, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, 0xdf,
0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf,
0xff, 0xf6, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x9f, 0xff, 0xf7, 0xef, 0xff, 0xf1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x8f, 0xff, 0xf8, 0xff, 0xff, 0xf1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0xef, 0xff,
0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff,
0xf7, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0,
0x0, 0x9f, 0xff, 0xf6, 0xcf, 0xff, 0xf3, 0x0,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0xaf,
0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf,
0xff, 0xf3, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xfb,
0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0,
0x1f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6,
0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0x50, 0x0,
0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x6, 0xff,
0xff, 0xd0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff,
0x0, 0x0, 0xef, 0xff, 0xfa, 0x0, 0x0, 0x3,
0xef, 0xff, 0xf7, 0x0, 0x0, 0x6f, 0xff, 0xff,
0xd6, 0x45, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0,
0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x40, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8,
0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x17, 0xce, 0xff, 0xda, 0x50,
0x0, 0x0, 0x0,
/* U+0031 "1" */
0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xf6, 0x0,
0x0, 0x0, 0x2b, 0xff, 0xff, 0xf6, 0x0, 0x0,
0x19, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x7, 0xef,
0xff, 0xff, 0xff, 0xf6, 0x4, 0xdf, 0xff, 0xff,
0xff, 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xcf,
0xff, 0xf6, 0xdf, 0xff, 0xff, 0x91, 0x6f, 0xff,
0xf6, 0xdf, 0xff, 0xb2, 0x0, 0x6f, 0xff, 0xf6,
0xdf, 0xd4, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0xb6,
0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0,
0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6,
0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0,
0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0,
0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6,
0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0,
0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0,
0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0,
0x6f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6,
/* U+0032 "2" */
0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff,
0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0,
0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0,
0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x20, 0x0, 0x0, 0xdf, 0xff, 0xff,
0xfd, 0xce, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x9,
0xff, 0xff, 0xf8, 0x10, 0x0, 0x3c, 0xff, 0xff,
0xf6, 0x0, 0x1f, 0xff, 0xff, 0x40, 0x0, 0x0,
0x0, 0xcf, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xf6,
0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10,
0x4d, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xe,
0xff, 0xff, 0x30, 0x0, 0x6e, 0x50, 0x0, 0x0,
0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff,
0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff,
0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xb0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff,
0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff,
0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3, 0xff, 0xff, 0xfd, 0x10, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff,
0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
0xdf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff,
0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa,
0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfa,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x5f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4,
0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf4,
/* U+0033 "3" */
0x0, 0x0, 0x0, 0x0, 0x15, 0x67, 0x75, 0x20,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf,
0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x20, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x2f,
0xff, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xff, 0xfd,
0x0, 0x0, 0xb, 0xff, 0xff, 0xe5, 0x0, 0x0,
0x2c, 0xff, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xff,
0xd1, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb0,
0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0,
0x4f, 0xff, 0xfe, 0x0, 0x0, 0x4d, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x6, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff,
0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x7f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x25, 0xcf, 0xff, 0xff, 0x80,
0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff,
0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0,
0xc, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff,
0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc,
0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x23, 0x59, 0xff, 0xff,
0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0xaf, 0xff, 0xff, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff,
0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff,
0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xdf, 0xff, 0xf2, 0x0, 0x8, 0xe0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x20,
0x6e, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3,
0xff, 0xff, 0xf0, 0xd, 0xff, 0xff, 0x40, 0x0,
0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x7f,
0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xff,
0xff, 0x60, 0x0, 0xdf, 0xff, 0xff, 0xd7, 0x32,
0x37, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x2, 0xef,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2,
0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x7e,
0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0,
0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xfd, 0xa6,
0x10, 0x0, 0x0, 0x0,
/* U+0034 "4" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff,
0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff,
0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xe1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x9, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xaf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc,
0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf,
0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x13,
0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff,
0xff, 0x20, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff,
0xf1, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0,
/* U+0035 "5" */
0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x7,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9,
0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf9, 0x0, 0x0, 0xb, 0xff, 0xfd,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xaf, 0xff, 0xd4, 0x9d, 0xff, 0xeb,
0x71, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, 0xff,
0xfd, 0x74, 0x24, 0x8f, 0xff, 0xff, 0xf8, 0x0,
0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf,
0xff, 0xff, 0x10, 0x0, 0x4c, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x1f, 0xff, 0xff, 0x70, 0x0, 0x0,
0x30, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x40,
0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0,
0x0, 0x3c, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7,
0xff, 0xff, 0xa0, 0x9, 0xff, 0xfc, 0x0, 0x0,
0x0, 0x0, 0x1e, 0xff, 0xff, 0x50, 0xa, 0xff,
0xff, 0xa0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe,
0x0, 0x3, 0xff, 0xff, 0xfd, 0x73, 0x24, 0x8e,
0xff, 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0,
0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff,
0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0,
0x5a, 0xdf, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0,
/* U+0036 "6" */
0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff,
0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x4f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff,
0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff,
0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x1, 0x10,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff,
0xfd, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0,
0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xef, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0,
0x7, 0xff, 0xff, 0xff, 0x83, 0x0, 0x27, 0xff,
0xff, 0xff, 0x40, 0xe, 0xff, 0xff, 0xe2, 0x0,
0x0, 0x0, 0x2d, 0xff, 0xff, 0xd0, 0x3f, 0xff,
0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff,
0xf4, 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0,
0x0, 0xaf, 0xff, 0xf8, 0x9f, 0xff, 0xf7, 0x0,
0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xaf,
0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f,
0xff, 0xfc, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0,
0x0, 0x0, 0x4f, 0xff, 0xfc, 0x8f, 0xff, 0xf7,
0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa,
0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0,
0xcf, 0xff, 0xf7, 0xf, 0xff, 0xff, 0x50, 0x0,
0x0, 0x0, 0x4, 0xff, 0xff, 0xf2, 0x8, 0xff,
0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff,
0xa0, 0x1, 0xef, 0xff, 0xff, 0xb5, 0x33, 0x5a,
0xff, 0xff, 0xff, 0x20, 0x0, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0,
0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x50, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0,
0x27, 0xbe, 0xff, 0xec, 0x82, 0x0, 0x0, 0x0,
/* U+0037 "7" */
0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff,
0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f,
0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa,
0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff,
0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff,
0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf,
0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+0038 "8" */
0x0, 0x0, 0x0, 0x1, 0x46, 0x77, 0x63, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff,
0xff, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x0, 0x0,
0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0,
0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff,
0xea, 0x88, 0xbf, 0xff, 0xff, 0xf2, 0x0, 0x3,
0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xdf, 0xff,
0xfa, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0,
0x0, 0x1f, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff,
0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30,
0xd, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x6,
0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0x20, 0x0,
0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x9, 0xff,
0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff,
0x0, 0x3, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0,
0x7f, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xfe,
0x72, 0x0, 0x3a, 0xff, 0xff, 0xe2, 0x0, 0x0,
0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x30, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x8f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0,
0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x80, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x94,
0x23, 0x5b, 0xff, 0xff, 0xf7, 0x0, 0xa, 0xff,
0xff, 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff,
0x30, 0x3f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0,
0x6, 0xff, 0xff, 0xb0, 0x8f, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, 0xcf,
0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f,
0xff, 0xf5, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xf1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf7,
0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x9f, 0xff, 0xf6, 0xbf, 0xff, 0xf7, 0x0, 0x0,
0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x7f, 0xff,
0xfe, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff,
0xf0, 0x1f, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0,
0x4f, 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff,
0x84, 0x23, 0x5b, 0xff, 0xff, 0xfe, 0x10, 0x0,
0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf5, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6e,
0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0,
0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, 0x82,
0x0, 0x0, 0x0,
/* U+0039 "9" */
0x0, 0x0, 0x0, 0x0, 0x14, 0x67, 0x75, 0x20,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf,
0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
0x30, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1e,
0xff, 0xff, 0xff, 0xcb, 0xcf, 0xff, 0xff, 0xff,
0x30, 0x0, 0xb, 0xff, 0xff, 0xf8, 0x10, 0x0,
0x7, 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff,
0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5,
0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0,
0x8, 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0x30,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x1,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xdf, 0xff, 0xf2, 0x2f, 0xff, 0xfe, 0x0, 0x0,
0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x32, 0xff,
0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf,
0xff, 0xf3, 0x1f, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0xef, 0xff,
0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff,
0xf0, 0xa, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0,
0x0, 0xbf, 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff,
0xa0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x60,
0x0, 0xbf, 0xff, 0xff, 0xd5, 0x10, 0x14, 0xbf,
0xff, 0xff, 0xe0, 0x0, 0x1, 0xef, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0,
0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfd, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0x0, 0x39, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xa0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11,
0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x90,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff,
0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x80,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5,
0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
/* U+003A ":" */
0x0, 0x26, 0x50, 0x0, 0x4f, 0xff, 0xd1, 0xd,
0xff, 0xff, 0x80, 0xff, 0xff, 0xfa, 0xc, 0xff,
0xff, 0x70, 0x2e, 0xff, 0xb0, 0x0, 0x3, 0x20,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x5, 0xa9, 0x20, 0x7,
0xff, 0xff, 0x20, 0xef, 0xff, 0xf9, 0xf, 0xff,
0xff, 0xa0, 0xaf, 0xff, 0xf5, 0x0, 0xae, 0xd6,
0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 562, .box_w = 35, .box_h = 33, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 578, .adv_w = 344, .box_w = 17, .box_h = 4, .ofs_x = 2, .ofs_y = 11},
{.bitmap_index = 612, .adv_w = 170, .box_w = 7, .box_h = 6, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 633, .adv_w = 284, .box_w = 18, .box_h = 32, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 921, .adv_w = 408, .box_w = 22, .box_h = 33, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1284, .adv_w = 408, .box_w = 14, .box_h = 32, .ofs_x = 4, .ofs_y = 0},
{.bitmap_index = 1508, .adv_w = 408, .box_w = 22, .box_h = 33, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1871, .adv_w = 408, .box_w = 23, .box_h = 33, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 2251, .adv_w = 408, .box_w = 24, .box_h = 32, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 2635, .adv_w = 408, .box_w = 22, .box_h = 32, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 2987, .adv_w = 408, .box_w = 22, .box_h = 32, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 3339, .adv_w = 408, .box_w = 22, .box_h = 32, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 3691, .adv_w = 408, .box_w = 22, .box_h = 33, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 4054, .adv_w = 408, .box_w = 23, .box_h = 33, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 4434, .adv_w = 187, .box_w = 7, .box_h = 23, .ofs_x = 2, .ofs_y = 0}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-31, -100, -65
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_44px = {
#else
lv_font_t Number_HarmonyOS_bpp4_44px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 33, /*The maximum line height required by the font*/
.base_line = 0, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -3,
.underline_thickness = 2,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_44PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 44 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_44px.c --bpp 4 --size 44 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a -r 0x25
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_44PX
#define NUMBER_HARMONYOS_BPP4_44PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_44PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-31, -100, -65
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_44px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_44px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_44px = {
#else
lv_font_t Number_HarmonyOS_bpp4_44px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 33, /*The maximum line height required by the font*/
.base_line = 0, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -3,
.underline_thickness = 2,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_44PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 46 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_46px.c --bpp 4 --size 46 -r 0x30-0x39 -r 0x2d-0x2f -r 0x25 -r 0x3a
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_46PX
#define NUMBER_HARMONYOS_BPP4_46PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_46PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-32, -105, -68
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_46px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_46px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_46px = {
#else
lv_font_t Number_HarmonyOS_bpp4_46px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 36, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -3,
.underline_thickness = 2,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_46PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 50 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_50px.c --bpp 4 --size 50 -r 0x30-0x39 -r 0x2d-0x2f -r 0x25 -r 0x3a
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_50PX
#define NUMBER_HARMONYOS_BPP4_50PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_50PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-35, -114, -74
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_50px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_50px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_50px = {
#else
lv_font_t Number_HarmonyOS_bpp4_50px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 39, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -4,
.underline_thickness = 3,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_50PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 62 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_62px.c --bpp 4 --size 62 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a -r 0x25
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_62PX
#define NUMBER_HARMONYOS_BPP4_62PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_62PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-37, -119, -77
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_62px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_62px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 19,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_62px = {
#else
lv_font_t Number_HarmonyOS_bpp4_62px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 47, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -5,
.underline_thickness = 3,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_62PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 80 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_80px.c --bpp 4 --size 80 -r 0x30-0x39 -r 0x2d-0x2f -r 0x25 -r 0x3a
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_80PX
#define NUMBER_HARMONYOS_BPP4_80PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_80PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-36, -116, -75
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_80px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_80px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 25,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_80px = {
#else
lv_font_t Number_HarmonyOS_bpp4_80px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 62, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -6,
.underline_thickness = 4,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_80PX*/

View File

@ -0,0 +1,132 @@
/*******************************************************************************
* Size: 92 px
* Bpp: 4
* Opts: --no-compress --format lvgl --font HarmonyOS_Sans_SC_Medium.ttf -o Number_HarmonyOS_bpp4_92px.c --bpp 4 --size 92 -r 0x30-0x39 -r 0x2d-0x2f -r 0x3a -r 0x25
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef NUMBER_HARMONYOS_BPP4_92PX
#define NUMBER_HARMONYOS_BPP4_92PX 1
#endif
#if NUMBER_HARMONYOS_BPP4_92PX
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
#include "bin_font.h"
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 37, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 45, .range_length = 14, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Pair left and right glyphs for kerning*/
static const uint8_t kern_pair_glyph_ids[] =
{
4, 2,
4, 3,
4, 4
};
/* Kerning between the respective left and right glyphs
* 4.4 format which needs to scaled with `kern_scale`*/
static const int8_t kern_pair_values[] =
{
-37, -119, -77
};
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 3,
.glyph_ids_size = 0
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR >= 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = Number_HarmonyOS_bpp4_92px_glyph_bitmap,
.glyph_dsc = Number_HarmonyOS_bpp4_92px_glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 28,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR >= 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t Number_HarmonyOS_bpp4_92px = {
#else
lv_font_t Number_HarmonyOS_bpp4_92px = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 70, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -7,
.underline_thickness = 5,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if NUMBER_HARMONYOS_BPP4_92PX*/

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,282 @@
#if 1
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_BATT_FULL_GREN
#define LV_ATTRIBUTE_IMG_BATT_FULL_GREN
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BATT_FULL_GREN uint8_t batt_full_gren_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x24, 0x44, 0x24, 0x51, 0x25, 0x42, 0x25, 0x44, 0x25, 0x44, 0x25, 0x44, 0x25, 0x42, 0x24, 0x5d, 0x24, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x20, 0x24, 0x61, 0x00, 0x1f, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x40, 0x24, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0x02, 0xdb, 0x60, 0xff, 0x71, 0xff, 0x66, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xfb, 0x77, 0x8e, 0x87, 0xb2, 0x61, 0xfb, 0x61, 0xdb, 0x61, 0xdb, 0x61, 0xfb, 0x61, 0xd7, 0x61, 0x8e, 0x6c, 0x92, 0x81, 0xff, 0x67, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x64, 0xff, 0x64, 0xff, 0x67, 0xd7, 0x71, 0xb7, 0x40, 0x00, 0x00,
0xff, 0x02, 0xff, 0xba, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xf4, 0xdf, 0xec, 0xdf, 0xeb, 0xdf, 0xec, 0xdf, 0xec, 0xdf, 0xec, 0xdf, 0xe5, 0xff, 0xdf, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe1, 0xdf, 0xeb, 0xdf, 0xec, 0xdf, 0xec, 0xdf, 0xec, 0xdf, 0xec, 0xdf, 0xef, 0xbf, 0xf3, 0xdf, 0xfa, 0xfb, 0xf0, 0xff, 0x6f,
0xff, 0x72, 0x9a, 0xff, 0x31, 0xf7, 0x15, 0xfc, 0x15, 0xfc, 0x19, 0xfb, 0x19, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x9e, 0xfb, 0x9f, 0xfb, 0x9e, 0xfb, 0x9e, 0xfb, 0xbf, 0xfb, 0x7e, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfc, 0x1d, 0xf7, 0x3d, 0xf9, 0x9a, 0xe0,
0xbb, 0xde, 0x0c, 0xff, 0x10, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x9e, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x7e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf7,
0x31, 0xf6, 0x10, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf4,
0x11, 0xf2, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf0, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf1, 0x11, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x11, 0xf2, 0x10, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xf2,
0x55, 0xf1, 0x0c, 0xff, 0x15, 0xff, 0x15, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x9e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xfe,
0xff, 0xbb, 0x31, 0xff, 0x10, 0xff, 0x14, 0xff, 0x18, 0xff, 0x19, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x9e, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xbf, 0xff, 0x7e, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x59, 0xd9,
0xff, 0x3e, 0xdb, 0xff, 0x76, 0xfe, 0x76, 0xe7, 0x56, 0xd9, 0x56, 0xcb, 0x7a, 0xc6, 0x7a, 0xc8, 0x7a, 0xc8, 0x5a, 0xc8, 0x7a, 0xc8, 0x9a, 0xc8, 0xbb, 0xc8, 0x9a, 0xc8, 0x9a, 0xc8, 0xbb, 0xc8, 0x9a, 0xc8, 0x5a, 0xc8, 0x5a, 0xc8, 0x7a, 0xc8, 0x7a, 0xc8, 0x7a, 0xc8, 0x7a, 0xc8, 0x7a, 0xc7, 0x7a, 0xc9, 0x5a, 0xcd, 0x5a, 0xd2, 0x59, 0xd3, 0x55, 0xeb, 0xb7, 0xa9,
0x00, 0x00, 0xff, 0x6e, 0xff, 0xcc, 0xfb, 0xbe, 0xfb, 0xa7, 0xfb, 0x99, 0xfb, 0x95, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x97, 0xf7, 0x9b, 0xf7, 0xa1, 0xd7, 0xb1, 0xd7, 0xa7, 0xff, 0x36,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe4, 0x20, 0x44, 0x04, 0x21, 0x51, 0x04, 0x21, 0x42, 0x04, 0x21, 0x44, 0x04, 0x21, 0x44, 0x04, 0x21, 0x44, 0x04, 0x21, 0x42, 0xe4, 0x20, 0x5d, 0xe4, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x18, 0x20, 0xc3, 0x18, 0x61, 0x41, 0x08, 0x1f, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1a, 0x61, 0x08, 0x40, 0xe3, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x31, 0x0a, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x18, 0xce, 0x60, 0xdd, 0xee, 0x71, 0x7f, 0xff, 0x66, 0x3e, 0xff, 0x63, 0x1e, 0xff, 0x63, 0x1e, 0xff, 0x63, 0xfe, 0xfe, 0x63, 0xff, 0xff, 0x63, 0x1a, 0xde, 0x77, 0x2e, 0x73, 0x87, 0x72, 0x9c, 0x61, 0x3a, 0xd6, 0x61, 0xd9, 0xcd, 0x61, 0xd8, 0xcd, 0x61, 0x1a, 0xd6, 0x61, 0x98, 0xcd, 0x61, 0x70, 0x8b, 0x6c, 0x91, 0x8b, 0x81, 0xfe, 0xfe, 0x67, 0xdf, 0xff, 0x63, 0xdd, 0xf6, 0x63, 0xfe, 0xfe, 0x63, 0xfe, 0xfe, 0x64, 0xfe, 0xf6, 0x64, 0x3f, 0xff, 0x67, 0x17, 0xbd, 0x71, 0x35, 0xad, 0x40, 0x00, 0x00, 0x00,
0xff, 0xff, 0x02, 0xff, 0xff, 0xba, 0x5d, 0xef, 0xff, 0xb8, 0xc6, 0xff, 0xb8, 0xbe, 0xf4, 0xd8, 0xc6, 0xec, 0xf9, 0xbe, 0xeb, 0xf8, 0xc6, 0xec, 0xf8, 0xc6, 0xec, 0xf8, 0xbe, 0xec, 0x9b, 0xd7, 0xe5, 0xff, 0xf7, 0xdf, 0xff, 0xf7, 0xec, 0xdd, 0xef, 0xec, 0xdd, 0xef, 0xec, 0xde, 0xef, 0xec, 0xdd, 0xe7, 0xec, 0xfc, 0xdf, 0xec, 0xfe, 0xe7, 0xe8, 0xfd, 0xe7, 0xe1, 0x7a, 0xcf, 0xeb, 0xf8, 0xbe, 0xec, 0x19, 0xc7, 0xec, 0x19, 0xc7, 0xec, 0xf8, 0xc6, 0xec, 0xd8, 0xbe, 0xef, 0xb7, 0xb6, 0xf3, 0xf8, 0xbe, 0xfa, 0x5a, 0xde, 0xf0, 0xdf, 0xfe, 0x6f,
0xff, 0xff, 0x72, 0x91, 0x7d, 0xff, 0x85, 0x1c, 0xf7, 0xc4, 0x04, 0xfc, 0x66, 0x05, 0xfc, 0xe6, 0x05, 0xfb, 0x87, 0x06, 0xfb, 0xe7, 0x06, 0xfb, 0x48, 0x0f, 0xfb, 0x87, 0x07, 0xfb, 0x89, 0x17, 0xfb, 0xd4, 0x87, 0xfb, 0xd5, 0x8f, 0xfb, 0xd4, 0x87, 0xfb, 0xd4, 0x87, 0xfb, 0xd5, 0x97, 0xfb, 0xb2, 0x6f, 0xfb, 0x87, 0x07, 0xfb, 0x88, 0x07, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x0f, 0xfb, 0x88, 0x07, 0xfb, 0x88, 0x07, 0xfc, 0xa8, 0x07, 0xf7, 0x09, 0x27, 0xf9, 0x13, 0x8e, 0xe0,
0x14, 0x9e, 0xde, 0x20, 0x03, 0xff, 0x42, 0x04, 0xff, 0x05, 0x05, 0xff, 0x86, 0x05, 0xff, 0x06, 0x06, 0xff, 0x87, 0x06, 0xff, 0x07, 0x07, 0xff, 0x68, 0x07, 0xff, 0xa7, 0x07, 0xff, 0xc9, 0x0f, 0xff, 0xf4, 0x87, 0xff, 0xf5, 0x97, 0xff, 0xf4, 0x8f, 0xff, 0xf4, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xf2, 0x6f, 0xff, 0xa7, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xa8, 0x07, 0xff, 0xc8, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xa7, 0x07, 0xf7,
0x26, 0x14, 0xf6, 0xa2, 0x03, 0xff, 0xa6, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x17, 0xff, 0xa8, 0x0f, 0xf4,
0x04, 0x04, 0xf2, 0x05, 0x04, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf0, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x25, 0x0c, 0xf1, 0x04, 0x04, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0x04, 0x0c, 0xf2, 0xe4, 0x03, 0xff, 0x85, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xf2,
0xcc, 0x4c, 0xf1, 0x60, 0x03, 0xff, 0xa6, 0x0c, 0xff, 0x06, 0x0d, 0xff, 0x87, 0x0d, 0xff, 0x07, 0x0e, 0xff, 0x88, 0x0e, 0xff, 0x08, 0x0f, 0xff, 0x69, 0x0f, 0xff, 0xa8, 0x07, 0xff, 0xaa, 0x17, 0xff, 0xd4, 0x87, 0xff, 0xd5, 0x97, 0xff, 0xd5, 0x8f, 0xff, 0xd5, 0x8f, 0xff, 0xf6, 0x9f, 0xff, 0xd2, 0x77, 0xff, 0xa8, 0x0f, 0xff, 0xa8, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x0f, 0xff, 0xa9, 0x17, 0xff, 0xc9, 0x0f, 0xff, 0xe8, 0x07, 0xfe,
0x1c, 0xe7, 0xbb, 0x05, 0x14, 0xff, 0x00, 0x04, 0xff, 0xe3, 0x04, 0xff, 0xa4, 0x05, 0xff, 0x44, 0x06, 0xff, 0xc5, 0x06, 0xff, 0x46, 0x07, 0xff, 0xc6, 0x07, 0xff, 0xe5, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xf4, 0x7f, 0xff, 0xf5, 0x8f, 0xff, 0xf4, 0x87, 0xff, 0xf4, 0x87, 0xff, 0xf6, 0x97, 0xff, 0xf2, 0x6f, 0xff, 0xe6, 0x07, 0xff, 0xe6, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe7, 0x07, 0xff, 0xe6, 0x07, 0xff, 0x4b, 0x36, 0xd9,
0xff, 0xff, 0x3e, 0x79, 0xc6, 0xff, 0x2f, 0x75, 0xfe, 0x2d, 0x5d, 0xe7, 0x2d, 0x55, 0xd9, 0x4d, 0x55, 0xcb, 0xad, 0x55, 0xc6, 0xee, 0x55, 0xc8, 0x2e, 0x56, 0xc8, 0x2d, 0x4e, 0xc8, 0x2e, 0x5e, 0xc8, 0x53, 0x96, 0xc8, 0x54, 0x9e, 0xc8, 0x54, 0x96, 0xc8, 0x54, 0x96, 0xc8, 0x54, 0x9e, 0xc8, 0x53, 0x86, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc8, 0x2e, 0x56, 0xc7, 0x2e, 0x56, 0xc9, 0x0d, 0x4e, 0xcd, 0xcc, 0x45, 0xd2, 0xcc, 0x45, 0xd3, 0xaa, 0x44, 0xeb, 0xb5, 0xac, 0xa9,
0x00, 0x00, 0x00, 0xdf, 0xff, 0x6e, 0xde, 0xf6, 0xcc, 0x7c, 0xee, 0xbe, 0x1b, 0xe6, 0xa7, 0xfb, 0xe5, 0x99, 0xfb, 0xe5, 0x95, 0xfb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xb9, 0xcd, 0x96, 0xb8, 0xcd, 0x96, 0xb9, 0xcd, 0x96, 0xb9, 0xcd, 0x96, 0xb8, 0xcd, 0x96, 0xb9, 0xd5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xdb, 0xe5, 0x96, 0xbb, 0xe5, 0x97, 0x9a, 0xdd, 0x9b, 0x59, 0xdd, 0xa1, 0xd7, 0xc4, 0xb1, 0xf7, 0xc4, 0xa7, 0xbf, 0xff, 0x36,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0xe4, 0x44, 0x21, 0x04, 0x51, 0x21, 0x04, 0x42, 0x21, 0x04, 0x44, 0x21, 0x04, 0x44, 0x21, 0x04, 0x44, 0x21, 0x04, 0x42, 0x20, 0xe4, 0x5d, 0x20, 0xe4, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x20, 0x18, 0xc3, 0x61, 0x08, 0x41, 0x1f, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1a, 0x08, 0x61, 0x40, 0x18, 0xe3, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xa6, 0x0a, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0xce, 0x18, 0x60, 0xee, 0xdd, 0x71, 0xff, 0x7f, 0x66, 0xff, 0x3e, 0x63, 0xff, 0x1e, 0x63, 0xff, 0x1e, 0x63, 0xfe, 0xfe, 0x63, 0xff, 0xff, 0x63, 0xde, 0x1a, 0x77, 0x73, 0x2e, 0x87, 0x9c, 0x72, 0x61, 0xd6, 0x3a, 0x61, 0xcd, 0xd9, 0x61, 0xcd, 0xd8, 0x61, 0xd6, 0x1a, 0x61, 0xcd, 0x98, 0x61, 0x8b, 0x70, 0x6c, 0x8b, 0x91, 0x81, 0xfe, 0xfe, 0x67, 0xff, 0xdf, 0x63, 0xf6, 0xdd, 0x63, 0xfe, 0xfe, 0x63, 0xfe, 0xfe, 0x64, 0xf6, 0xfe, 0x64, 0xff, 0x3f, 0x67, 0xbd, 0x17, 0x71, 0xad, 0x35, 0x40, 0x00, 0x00, 0x00,
0xff, 0xff, 0x02, 0xff, 0xff, 0xba, 0xef, 0x5d, 0xff, 0xc6, 0xb8, 0xff, 0xbe, 0xb8, 0xf4, 0xc6, 0xd8, 0xec, 0xbe, 0xf9, 0xeb, 0xc6, 0xf8, 0xec, 0xc6, 0xf8, 0xec, 0xbe, 0xf8, 0xec, 0xd7, 0x9b, 0xe5, 0xf7, 0xff, 0xdf, 0xf7, 0xff, 0xec, 0xef, 0xdd, 0xec, 0xef, 0xdd, 0xec, 0xef, 0xde, 0xec, 0xe7, 0xdd, 0xec, 0xdf, 0xfc, 0xec, 0xe7, 0xfe, 0xe8, 0xe7, 0xfd, 0xe1, 0xcf, 0x7a, 0xeb, 0xbe, 0xf8, 0xec, 0xc7, 0x19, 0xec, 0xc7, 0x19, 0xec, 0xc6, 0xf8, 0xec, 0xbe, 0xd8, 0xef, 0xb6, 0xb7, 0xf3, 0xbe, 0xf8, 0xfa, 0xde, 0x5a, 0xf0, 0xfe, 0xdf, 0x6f,
0xff, 0xff, 0x72, 0x7d, 0x91, 0xff, 0x1c, 0x85, 0xf7, 0x04, 0xc4, 0xfc, 0x05, 0x66, 0xfc, 0x05, 0xe6, 0xfb, 0x06, 0x87, 0xfb, 0x06, 0xe7, 0xfb, 0x0f, 0x48, 0xfb, 0x07, 0x87, 0xfb, 0x17, 0x89, 0xfb, 0x87, 0xd4, 0xfb, 0x8f, 0xd5, 0xfb, 0x87, 0xd4, 0xfb, 0x87, 0xd4, 0xfb, 0x97, 0xd5, 0xfb, 0x6f, 0xb2, 0xfb, 0x07, 0x87, 0xfb, 0x07, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x0f, 0x88, 0xfb, 0x07, 0x88, 0xfb, 0x07, 0x88, 0xfc, 0x07, 0xa8, 0xf7, 0x27, 0x09, 0xf9, 0x8e, 0x13, 0xe0,
0x9e, 0x14, 0xde, 0x03, 0x20, 0xff, 0x04, 0x42, 0xff, 0x05, 0x05, 0xff, 0x05, 0x86, 0xff, 0x06, 0x06, 0xff, 0x06, 0x87, 0xff, 0x07, 0x07, 0xff, 0x07, 0x68, 0xff, 0x07, 0xa7, 0xff, 0x0f, 0xc9, 0xff, 0x87, 0xf4, 0xff, 0x97, 0xf5, 0xff, 0x8f, 0xf4, 0xff, 0x8f, 0xf4, 0xff, 0x9f, 0xf6, 0xff, 0x6f, 0xf2, 0xff, 0x07, 0xa7, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xa8, 0xff, 0x07, 0xc8, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xa7, 0xf7,
0x14, 0x26, 0xf6, 0x03, 0xa2, 0xff, 0x0c, 0xa6, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x17, 0xa9, 0xff, 0x0f, 0xa8, 0xf4,
0x04, 0x04, 0xf2, 0x04, 0x05, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf0, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x25, 0xf1, 0x04, 0x04, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x0c, 0x04, 0xf2, 0x03, 0xe4, 0xff, 0x0c, 0x85, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xf2,
0x4c, 0xcc, 0xf1, 0x03, 0x60, 0xff, 0x0c, 0xa6, 0xff, 0x0d, 0x06, 0xff, 0x0d, 0x87, 0xff, 0x0e, 0x07, 0xff, 0x0e, 0x88, 0xff, 0x0f, 0x08, 0xff, 0x0f, 0x69, 0xff, 0x07, 0xa8, 0xff, 0x17, 0xaa, 0xff, 0x87, 0xd4, 0xff, 0x97, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x8f, 0xd5, 0xff, 0x9f, 0xf6, 0xff, 0x77, 0xd2, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa8, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x0f, 0xa9, 0xff, 0x17, 0xa9, 0xff, 0x0f, 0xc9, 0xff, 0x07, 0xe8, 0xfe,
0xe7, 0x1c, 0xbb, 0x14, 0x05, 0xff, 0x04, 0x00, 0xff, 0x04, 0xe3, 0xff, 0x05, 0xa4, 0xff, 0x06, 0x44, 0xff, 0x06, 0xc5, 0xff, 0x07, 0x46, 0xff, 0x07, 0xc6, 0xff, 0x07, 0xe5, 0xff, 0x07, 0xe7, 0xff, 0x7f, 0xf4, 0xff, 0x8f, 0xf5, 0xff, 0x87, 0xf4, 0xff, 0x87, 0xf4, 0xff, 0x97, 0xf6, 0xff, 0x6f, 0xf2, 0xff, 0x07, 0xe6, 0xff, 0x07, 0xe6, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe7, 0xff, 0x07, 0xe6, 0xff, 0x36, 0x4b, 0xd9,
0xff, 0xff, 0x3e, 0xc6, 0x79, 0xff, 0x75, 0x2f, 0xfe, 0x5d, 0x2d, 0xe7, 0x55, 0x2d, 0xd9, 0x55, 0x4d, 0xcb, 0x55, 0xad, 0xc6, 0x55, 0xee, 0xc8, 0x56, 0x2e, 0xc8, 0x4e, 0x2d, 0xc8, 0x5e, 0x2e, 0xc8, 0x96, 0x53, 0xc8, 0x9e, 0x54, 0xc8, 0x96, 0x54, 0xc8, 0x96, 0x54, 0xc8, 0x9e, 0x54, 0xc8, 0x86, 0x53, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc8, 0x56, 0x2e, 0xc7, 0x56, 0x2e, 0xc9, 0x4e, 0x0d, 0xcd, 0x45, 0xcc, 0xd2, 0x45, 0xcc, 0xd3, 0x44, 0xaa, 0xeb, 0xac, 0xb5, 0xa9,
0x00, 0x00, 0x00, 0xff, 0xdf, 0x6e, 0xf6, 0xde, 0xcc, 0xee, 0x7c, 0xbe, 0xe6, 0x1b, 0xa7, 0xe5, 0xfb, 0x99, 0xe5, 0xfb, 0x95, 0xe5, 0xfb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xcd, 0xb9, 0x96, 0xcd, 0xb8, 0x96, 0xcd, 0xb9, 0x96, 0xcd, 0xb9, 0x96, 0xcd, 0xb8, 0x96, 0xd5, 0xb9, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xdb, 0x96, 0xe5, 0xbb, 0x97, 0xdd, 0x9a, 0x9b, 0xdd, 0x59, 0xa1, 0xc4, 0xd7, 0xb1, 0xc4, 0xf7, 0xa7, 0xff, 0xbf, 0x36,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x1e, 0x1e, 0x44, 0x1f, 0x1f, 0x1f, 0x51, 0x22, 0x22, 0x22, 0x42, 0x21, 0x21, 0x21, 0x44, 0x21, 0x21, 0x21, 0x44, 0x21, 0x21, 0x21, 0x44, 0x22, 0x22, 0x22, 0x42, 0x1e, 0x1e, 0x1e, 0x5d, 0x1e, 0x1e, 0x1e, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x17, 0x17, 0x20, 0x1a, 0x1a, 0x1a, 0x61, 0x08, 0x08, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1a, 0x0b, 0x0b, 0x0b, 0x40, 0x1c, 0x1c, 0x1c, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0xc4, 0xbf, 0xc7, 0x60, 0xe8, 0xda, 0xec, 0x71, 0xfa, 0xeb, 0xff, 0x66, 0xf2, 0xe5, 0xf9, 0x63, 0xf2, 0xe2, 0xf9, 0x63, 0xf2, 0xe0, 0xf7, 0x63, 0xf2, 0xdd, 0xf7, 0x63, 0xff, 0xff, 0xff, 0x63, 0xd2, 0xc0, 0xd8, 0x77, 0x71, 0x66, 0x73, 0x87, 0x93, 0x8b, 0x95, 0x61, 0xcd, 0xc5, 0xd2, 0x61, 0xc5, 0xba, 0xc7, 0x61, 0xc2, 0xb8, 0xc5, 0x61, 0xcd, 0xc2, 0xd2, 0x61, 0xc2, 0xb0, 0xca, 0x61, 0x81, 0x6e, 0x88, 0x6c, 0x86, 0x72, 0x8c, 0x81, 0xf0, 0xde, 0xf7, 0x67, 0xff, 0xf7, 0xff, 0x63, 0xec, 0xda, 0xf4, 0x63, 0xf2, 0xdd, 0xf7, 0x63, 0xf2, 0xdd, 0xf7, 0x64, 0xef, 0xdb, 0xf4, 0x64, 0xfa, 0xe6, 0xff, 0x67, 0xb6, 0xa2, 0xbb, 0x71, 0xab, 0xa3, 0xab, 0x40, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0x02, 0xff, 0xfd, 0xff, 0xba, 0xea, 0xea, 0xea, 0xff, 0xc3, 0xd6, 0xc0, 0xff, 0xc2, 0xd5, 0xbb, 0xf4, 0xc3, 0xd8, 0xbd, 0xec, 0xc5, 0xdb, 0xbc, 0xeb, 0xc4, 0xdd, 0xbd, 0xec, 0xc4, 0xdd, 0xbd, 0xec, 0xc2, 0xdc, 0xb7, 0xec, 0xd9, 0xf1, 0xd0, 0xe5, 0xf9, 0xfe, 0xf3, 0xdf, 0xf8, 0xff, 0xf4, 0xec, 0xea, 0xf8, 0xe6, 0xec, 0xeb, 0xf9, 0xe8, 0xec, 0xed, 0xf9, 0xea, 0xec, 0xe8, 0xf8, 0xe1, 0xec, 0xe1, 0xfc, 0xd9, 0xec, 0xed, 0xff, 0xe3, 0xe8, 0xea, 0xff, 0xe1, 0xe1, 0xd2, 0xeb, 0xc8, 0xeb, 0xc1, 0xdb, 0xb8, 0xec, 0xc5, 0xdf, 0xbd, 0xec, 0xc5, 0xdf, 0xbd, 0xec, 0xc4, 0xde, 0xbd, 0xec, 0xc2, 0xda, 0xb7, 0xef, 0xb7, 0xd5, 0xaf, 0xf3, 0xc0, 0xdb, 0xb9, 0xfa, 0xd4, 0xc7, 0xd8, 0xf0, 0xf5, 0xda, 0xff, 0x6f,
0xff, 0xff, 0xff, 0x72, 0x8a, 0xb1, 0x79, 0xff, 0x2c, 0x8f, 0x18, 0xf7, 0x22, 0x99, 0x00, 0xfc, 0x2d, 0xae, 0x01, 0xfc, 0x32, 0xbe, 0x03, 0xfb, 0x37, 0xcf, 0x03, 0xfb, 0x3c, 0xde, 0x04, 0xfb, 0x40, 0xea, 0x05, 0xfb, 0x39, 0xf1, 0x00, 0xfb, 0x49, 0xf2, 0x0d, 0xfb, 0x9d, 0xf8, 0x7d, 0xfb, 0xa6, 0xf7, 0x8c, 0xfb, 0x9f, 0xf7, 0x82, 0xfb, 0x9f, 0xf7, 0x82, 0xfb, 0xac, 0xf8, 0x93, 0xfb, 0x8e, 0xf6, 0x6a, 0xfb, 0x3c, 0xf1, 0x00, 0xfb, 0x3d, 0xf1, 0x00, 0xfb, 0x43, 0xf1, 0x05, 0xfb, 0x42, 0xf1, 0x05, 0xfb, 0x42, 0xf1, 0x05, 0xfb, 0x42, 0xf1, 0x05, 0xfb, 0x42, 0xf1, 0x05, 0xfb, 0x42, 0xf1, 0x05, 0xfb, 0x42, 0xf0, 0x04, 0xfb, 0x3f, 0xf1, 0x02, 0xfc, 0x3d, 0xf3, 0x02, 0xf7, 0x4b, 0xe1, 0x1e, 0xf9, 0x98, 0xc1, 0x8a, 0xe0,
0xa3, 0xbf, 0x98, 0xde, 0x00, 0x66, 0x00, 0xff, 0x12, 0x87, 0x00, 0xff, 0x2a, 0xa0, 0x00, 0xff, 0x2d, 0xb0, 0x00, 0xff, 0x31, 0xc1, 0x00, 0xff, 0x36, 0xd2, 0x00, 0xff, 0x3c, 0xe1, 0x01, 0xff, 0x3f, 0xee, 0x02, 0xff, 0x39, 0xf6, 0x00, 0xff, 0x47, 0xf7, 0x0a, 0xff, 0x9f, 0xfc, 0x7f, 0xff, 0xaa, 0xfc, 0x8e, 0xff, 0xa3, 0xfc, 0x85, 0xff, 0xa3, 0xfc, 0x85, 0xff, 0xb0, 0xfd, 0x95, 0xff, 0x90, 0xfb, 0x6c, 0xff, 0x3c, 0xf6, 0x00, 0xff, 0x3d, 0xf6, 0x00, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x41, 0xf6, 0x02, 0xff, 0x42, 0xf6, 0x03, 0xff, 0x43, 0xf7, 0x03, 0xff, 0x36, 0xff, 0x00, 0xff, 0x3c, 0xf6, 0x00, 0xf7,
0x30, 0x83, 0x13, 0xf6, 0x0f, 0x76, 0x00, 0xff, 0x2d, 0x93, 0x08, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x4a, 0xf3, 0x0e, 0xff, 0x43, 0xf5, 0x05, 0xf4,
0x23, 0x81, 0x03, 0xf2, 0x26, 0x80, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2c, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2c, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb1, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x2b, 0x85, 0x0c, 0xf0, 0x22, 0x7e, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x28, 0x84, 0x08, 0xf1, 0x24, 0x7f, 0x02, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe1, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0b, 0xf2,
0x24, 0x80, 0x05, 0xf2, 0x1f, 0x7e, 0x01, 0xff, 0x2b, 0x92, 0x07, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x47, 0xf4, 0x0a, 0xf2,
0x5e, 0x99, 0x49, 0xf1, 0x00, 0x6d, 0x00, 0xff, 0x2d, 0x93, 0x06, 0xff, 0x30, 0xa1, 0x08, 0xff, 0x35, 0xb2, 0x09, 0xff, 0x39, 0xc2, 0x0a, 0xff, 0x3e, 0xd2, 0x0a, 0xff, 0x43, 0xe0, 0x0b, 0xff, 0x46, 0xed, 0x0c, 0xff, 0x40, 0xf4, 0x02, 0xff, 0x4e, 0xf5, 0x14, 0xff, 0xa1, 0xfa, 0x83, 0xff, 0xac, 0xfa, 0x91, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xa5, 0xfa, 0x88, 0xff, 0xb1, 0xfb, 0x98, 0xff, 0x93, 0xf9, 0x71, 0xff, 0x43, 0xf4, 0x06, 0xff, 0x44, 0xf4, 0x07, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf4, 0x0c, 0xff, 0x48, 0xf3, 0x0d, 0xff, 0x49, 0xf7, 0x0c, 0xff, 0x3f, 0xff, 0x00, 0xfe,
0xe2, 0xe2, 0xdf, 0xbb, 0x27, 0x7f, 0x12, 0xff, 0x00, 0x80, 0x00, 0xff, 0x15, 0x9c, 0x00, 0xff, 0x1f, 0xb3, 0x00, 0xff, 0x24, 0xc7, 0x00, 0xff, 0x29, 0xd9, 0x00, 0xff, 0x2f, 0xea, 0x00, 0xff, 0x33, 0xf9, 0x00, 0xff, 0x2c, 0xff, 0x00, 0xff, 0x3c, 0xff, 0x00, 0xff, 0x9f, 0xff, 0x7b, 0xff, 0xac, 0xff, 0x8c, 0xff, 0xa4, 0xff, 0x81, 0xff, 0xa4, 0xff, 0x81, 0xff, 0xb2, 0xff, 0x94, 0xff, 0x8e, 0xff, 0x66, 0xff, 0x2f, 0xff, 0x00, 0xff, 0x30, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x35, 0xff, 0x00, 0xff, 0x37, 0xff, 0x00, 0xff, 0x39, 0xff, 0x00, 0xff, 0x39, 0xff, 0x00, 0xff, 0x34, 0xff, 0x00, 0xff, 0x59, 0xca, 0x31, 0xd9,
0xff, 0xff, 0xff, 0x3e, 0xc8, 0xcb, 0xc3, 0xff, 0x75, 0xa4, 0x6f, 0xfe, 0x66, 0xa3, 0x57, 0xe7, 0x66, 0xa4, 0x4f, 0xd9, 0x65, 0xa9, 0x4d, 0xcb, 0x6a, 0xb5, 0x51, 0xc6, 0x6d, 0xbc, 0x51, 0xc8, 0x6e, 0xc3, 0x51, 0xc8, 0x6c, 0xc5, 0x4c, 0xc8, 0x72, 0xc6, 0x55, 0xc8, 0x9c, 0xc9, 0x8d, 0xc8, 0xa1, 0xc9, 0x95, 0xc8, 0x9f, 0xc9, 0x90, 0xc8, 0x9f, 0xc9, 0x90, 0xc8, 0xa4, 0xc9, 0x97, 0xc8, 0x96, 0xc9, 0x84, 0xc8, 0x6d, 0xc5, 0x4f, 0xc8, 0x6d, 0xc5, 0x50, 0xc8, 0x70, 0xc5, 0x51, 0xc8, 0x70, 0xc5, 0x51, 0xc8, 0x70, 0xc5, 0x51, 0xc8, 0x70, 0xc5, 0x51, 0xc8, 0x70, 0xc6, 0x53, 0xc7, 0x6e, 0xc4, 0x51, 0xc9, 0x68, 0xbf, 0x4a, 0xcd, 0x62, 0xb9, 0x44, 0xd2, 0x5e, 0xb7, 0x3d, 0xd3, 0x54, 0x93, 0x41, 0xeb, 0xa5, 0x93, 0xac, 0xa9,
0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0xff, 0x6e, 0xed, 0xd9, 0xf1, 0xcc, 0xe4, 0xce, 0xea, 0xbe, 0xda, 0xc1, 0xe1, 0xa7, 0xd5, 0xbc, 0xdf, 0x99, 0xd9, 0xbc, 0xe3, 0x95, 0xd7, 0xbb, 0xe3, 0x96, 0xd6, 0xb7, 0xe2, 0x96, 0xd7, 0xb7, 0xe3, 0x96, 0xd6, 0xb7, 0xe0, 0x96, 0xc5, 0xb5, 0xcc, 0x96, 0xc3, 0xb5, 0xc8, 0x96, 0xc5, 0xb5, 0xca, 0x96, 0xc5, 0xb5, 0xca, 0x96, 0xc3, 0xb5, 0xc8, 0x96, 0xc8, 0xb5, 0xcf, 0x96, 0xd7, 0xb7, 0xe3, 0x96, 0xd7, 0xb7, 0xe3, 0x96, 0xd6, 0xb7, 0xe2, 0x96, 0xd6, 0xb7, 0xe2, 0x96, 0xd6, 0xb7, 0xe2, 0x96, 0xd6, 0xb7, 0xe2, 0x96, 0xd7, 0xb7, 0xe3, 0x96, 0xd6, 0xb6, 0xe0, 0x97, 0xcf, 0xb0, 0xda, 0x9b, 0xca, 0xa9, 0xd5, 0xa1, 0xb8, 0x97, 0xc3, 0xb1, 0xb8, 0x9b, 0xc1, 0xa7, 0xfa, 0xf5, 0xfa, 0x36,
#endif
};
const lv_img_dsc_t batt_full_gren = {
.header.always_zero = 0,
.header.w = 30,
.header.h = 62,
.data_size = 1860 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.data = batt_full_gren_map,
};

View File

@ -0,0 +1,282 @@
#if 1
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_BATT_FULL_YELLOW
#define LV_ATTRIBUTE_IMG_BATT_FULL_YELLOW
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BATT_FULL_YELLOW uint8_t batt_full_yellow_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x24, 0x44, 0x24, 0x51, 0x25, 0x42, 0x25, 0x44, 0x25, 0x44, 0x25, 0x44, 0x25, 0x42, 0x24, 0x5d, 0x24, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x20, 0x24, 0x61, 0x00, 0x1f, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x40, 0x24, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0x02, 0xdb, 0x60, 0xff, 0x71, 0xff, 0x66, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xdb, 0x77, 0x6e, 0x87, 0x92, 0x61, 0xdb, 0x61, 0xdb, 0x61, 0xdb, 0x61, 0xdb, 0x61, 0xbb, 0x61, 0x72, 0x6c, 0x92, 0x81, 0xff, 0x67, 0xff, 0x63, 0xff, 0x63, 0xff, 0x63, 0xff, 0x64, 0xff, 0x64, 0xff, 0x67, 0xb7, 0x71, 0xb7, 0x40, 0x00, 0x00,
0xff, 0x02, 0xff, 0xba, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf4, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xec, 0xff, 0xef, 0xfb, 0xf3, 0xff, 0xfa, 0xdb, 0xf0, 0xff, 0x6f,
0xff, 0x72, 0xd6, 0xff, 0x90, 0xf7, 0xb0, 0xfc, 0xb0, 0xfc, 0xd4, 0xfb, 0xd4, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfb, 0xf8, 0xfc, 0xf8, 0xf7, 0xf8, 0xf9, 0xda, 0xe0,
0xda, 0xde, 0x68, 0xff, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf7,
0x8c, 0xf6, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf4,
0x8c, 0xf2, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf0, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf1, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0x8c, 0xf2, 0x8c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xf2,
0xb1, 0xf1, 0x68, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xfe,
0xff, 0xbb, 0x8c, 0xff, 0x8c, 0xff, 0xb0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xd5, 0xd9,
0xff, 0x3e, 0xdb, 0xff, 0xb6, 0xfe, 0xb5, 0xe7, 0xb5, 0xd9, 0xb5, 0xcb, 0xd5, 0xc6, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xda, 0xc8, 0xda, 0xc8, 0xda, 0xc8, 0xda, 0xc8, 0xda, 0xc8, 0xda, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc8, 0xd5, 0xc7, 0xd5, 0xc9, 0xd5, 0xcd, 0xd5, 0xd2, 0xd5, 0xd3, 0xb1, 0xeb, 0xb7, 0xa9,
0x00, 0x00, 0xff, 0x6e, 0xff, 0xcc, 0xdf, 0xbe, 0xdb, 0xa7, 0xdb, 0x99, 0xdb, 0x95, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x96, 0xdb, 0x97, 0xbb, 0x9b, 0xbb, 0xa1, 0xb7, 0xb1, 0xb7, 0xa7, 0xff, 0x36,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe4, 0x20, 0x44, 0x04, 0x21, 0x51, 0x04, 0x21, 0x42, 0x04, 0x21, 0x44, 0x04, 0x21, 0x44, 0x04, 0x21, 0x44, 0x04, 0x21, 0x42, 0xe4, 0x20, 0x5d, 0xe4, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x18, 0x20, 0xc3, 0x18, 0x61, 0x41, 0x08, 0x1f, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1a, 0x61, 0x08, 0x40, 0xe3, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x31, 0x0a, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x19, 0xc6, 0x60, 0x1d, 0xdf, 0x71, 0x9f, 0xef, 0x66, 0x5f, 0xef, 0x63, 0x5f, 0xe7, 0x63, 0x3f, 0xe7, 0x63, 0x1f, 0xe7, 0x63, 0xff, 0xff, 0x63, 0x3b, 0xc6, 0x77, 0x4e, 0x6b, 0x87, 0x73, 0x8c, 0x61, 0x5a, 0xce, 0x61, 0xf9, 0xbd, 0x61, 0xf9, 0xbd, 0x61, 0x3a, 0xc6, 0x61, 0x99, 0xb5, 0x61, 0xb1, 0x73, 0x6c, 0xd1, 0x73, 0x81, 0x3f, 0xe7, 0x67, 0xff, 0xff, 0x63, 0x1e, 0xdf, 0x63, 0x1f, 0xe7, 0x63, 0x1f, 0xe7, 0x64, 0x1e, 0xdf, 0x64, 0x7f, 0xef, 0x67, 0x38, 0xa5, 0x71, 0x35, 0xa5, 0x40, 0x00, 0x00, 0x00,
0xff, 0xff, 0x02, 0xff, 0xff, 0xba, 0x5d, 0xef, 0xff, 0x98, 0xde, 0xff, 0x97, 0xde, 0xf4, 0x98, 0xde, 0xec, 0xb7, 0xde, 0xeb, 0xd8, 0xe6, 0xec, 0xd8, 0xe6, 0xec, 0xb7, 0xde, 0xec, 0x5a, 0xf7, 0xe5, 0xfe, 0xff, 0xdf, 0xfe, 0xff, 0xec, 0xbd, 0xff, 0xec, 0xbd, 0xff, 0xec, 0xdd, 0xff, 0xec, 0xbc, 0xff, 0xec, 0xbb, 0xff, 0xec, 0xfc, 0xff, 0xe8, 0xfc, 0xff, 0xe1, 0x39, 0xef, 0xeb, 0xb7, 0xde, 0xec, 0xd8, 0xe6, 0xec, 0xd8, 0xe6, 0xec, 0xd8, 0xe6, 0xec, 0xb7, 0xde, 0xef, 0x76, 0xde, 0xf3, 0xb7, 0xde, 0xfa, 0x5b, 0xce, 0xf0, 0x1f, 0xdf, 0x6f,
0xff, 0xff, 0x72, 0x2f, 0xb5, 0xff, 0xa3, 0x93, 0xf7, 0xc0, 0x9b, 0xfc, 0x40, 0xb4, 0xfc, 0xc0, 0xc4, 0xfb, 0x20, 0xd5, 0xfb, 0x80, 0xe5, 0xfb, 0xe1, 0xed, 0xfb, 0x00, 0xf6, 0xfb, 0x22, 0xf6, 0xfb, 0x10, 0xff, 0xfb, 0x11, 0xff, 0xfb, 0x10, 0xff, 0xfb, 0x10, 0xff, 0xfb, 0x32, 0xff, 0xfb, 0xed, 0xfe, 0xfb, 0x00, 0xf6, 0xfb, 0x00, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x21, 0xf6, 0xfb, 0x00, 0xf6, 0xfb, 0x00, 0xf6, 0xfc, 0x20, 0xf6, 0xf7, 0xc4, 0xe5, 0xf9, 0xb1, 0xc5, 0xe0,
0xd3, 0xc5, 0xde, 0x20, 0x6a, 0xff, 0x40, 0x8b, 0xff, 0x00, 0xa4, 0xff, 0x60, 0xb4, 0xff, 0xc0, 0xc4, 0xff, 0x40, 0xd5, 0xff, 0xa0, 0xe5, 0xff, 0x00, 0xf6, 0xff, 0x20, 0xfe, 0xff, 0x41, 0xfe, 0xff, 0x30, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0x0d, 0xff, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x20, 0xfe, 0xff, 0x40, 0xfe, 0xff, 0x20, 0xfe, 0xf7,
0x62, 0x83, 0xf6, 0xe0, 0x7a, 0xff, 0xc1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x22, 0xf6, 0xff, 0x21, 0xfe, 0xf4,
0x40, 0x83, 0xf2, 0x40, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x61, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf0, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x61, 0x8b, 0xf1, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x41, 0x83, 0xf2, 0x20, 0x83, 0xff, 0xa1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xf2,
0x49, 0x9c, 0xf1, 0x60, 0x72, 0xff, 0xc1, 0x93, 0xff, 0x21, 0xa4, 0xff, 0x81, 0xb4, 0xff, 0xe1, 0xc4, 0xff, 0x41, 0xd5, 0xff, 0xa1, 0xe5, 0xff, 0x01, 0xf6, 0xff, 0x20, 0xf6, 0xff, 0x42, 0xfe, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0xee, 0xfe, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x21, 0xf6, 0xff, 0x22, 0xf6, 0xff, 0x41, 0xfe, 0xff, 0x60, 0xfe, 0xfe,
0x1c, 0xe7, 0xbb, 0x42, 0x83, 0xff, 0xe0, 0x82, 0xff, 0xc0, 0x9b, 0xff, 0x60, 0xb4, 0xff, 0xe0, 0xcc, 0xff, 0x40, 0xdd, 0xff, 0xc0, 0xed, 0xff, 0x20, 0xfe, 0xff, 0x40, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x6f, 0xff, 0xff, 0x91, 0xff, 0xff, 0x70, 0xff, 0xff, 0x70, 0xff, 0xff, 0x92, 0xff, 0xff, 0x4d, 0xff, 0xff, 0x40, 0xfe, 0xff, 0x40, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x80, 0xfe, 0xff, 0x60, 0xfe, 0xff, 0x66, 0xcd, 0xd9,
0xff, 0xff, 0x3e, 0x58, 0xce, 0xff, 0xce, 0xa4, 0xfe, 0x8b, 0xa4, 0xe7, 0x8a, 0xa4, 0xd9, 0xca, 0xac, 0xcb, 0x0a, 0xbd, 0xc6, 0x4a, 0xbd, 0xc8, 0x6a, 0xc5, 0xc8, 0x69, 0xcd, 0xc8, 0x8b, 0xcd, 0xc8, 0xf2, 0xcd, 0xc8, 0x13, 0xce, 0xc8, 0xf2, 0xcd, 0xc8, 0xf2, 0xcd, 0xc8, 0x13, 0xce, 0xc8, 0xf0, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, 0x8a, 0xcd, 0xc7, 0x6a, 0xc5, 0xc9, 0x49, 0xc5, 0xcd, 0x08, 0xbd, 0xd2, 0x08, 0xbd, 0xd3, 0x28, 0x94, 0xeb, 0xd5, 0x94, 0xa9,
0x00, 0x00, 0x00, 0xdf, 0xff, 0x6e, 0xfe, 0xde, 0xcc, 0xbd, 0xd6, 0xbe, 0x5c, 0xc6, 0xa7, 0x3c, 0xbe, 0x99, 0x3c, 0xbe, 0x95, 0x1c, 0xbe, 0x96, 0x1c, 0xbe, 0x96, 0x1c, 0xbe, 0x96, 0xfc, 0xbd, 0x96, 0xd9, 0xbd, 0x96, 0xd9, 0xbd, 0x96, 0xd9, 0xbd, 0x96, 0xd9, 0xbd, 0x96, 0xd9, 0xbd, 0x96, 0xfa, 0xbd, 0x96, 0x1c, 0xbe, 0x96, 0x1c, 0xbe, 0x96, 0xfc, 0xbd, 0x96, 0xfc, 0xbd, 0x96, 0xfc, 0xbd, 0x96, 0xfc, 0xbd, 0x96, 0x1c, 0xbe, 0x96, 0xfc, 0xb5, 0x97, 0xdb, 0xb5, 0x9b, 0x9b, 0xad, 0xa1, 0xf8, 0x9c, 0xb1, 0x38, 0x9d, 0xa7, 0xbf, 0xff, 0x36,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0xe4, 0x44, 0x21, 0x04, 0x51, 0x21, 0x04, 0x42, 0x21, 0x04, 0x44, 0x21, 0x04, 0x44, 0x21, 0x04, 0x44, 0x21, 0x04, 0x42, 0x20, 0xe4, 0x5d, 0x20, 0xe4, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x20, 0x18, 0xc3, 0x61, 0x08, 0x41, 0x1f, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1a, 0x08, 0x61, 0x40, 0x18, 0xe3, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xa6, 0x0a, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0xc6, 0x19, 0x60, 0xdf, 0x1d, 0x71, 0xef, 0x9f, 0x66, 0xef, 0x5f, 0x63, 0xe7, 0x5f, 0x63, 0xe7, 0x3f, 0x63, 0xe7, 0x1f, 0x63, 0xff, 0xff, 0x63, 0xc6, 0x3b, 0x77, 0x6b, 0x4e, 0x87, 0x8c, 0x73, 0x61, 0xce, 0x5a, 0x61, 0xbd, 0xf9, 0x61, 0xbd, 0xf9, 0x61, 0xc6, 0x3a, 0x61, 0xb5, 0x99, 0x61, 0x73, 0xb1, 0x6c, 0x73, 0xd1, 0x81, 0xe7, 0x3f, 0x67, 0xff, 0xff, 0x63, 0xdf, 0x1e, 0x63, 0xe7, 0x1f, 0x63, 0xe7, 0x1f, 0x64, 0xdf, 0x1e, 0x64, 0xef, 0x7f, 0x67, 0xa5, 0x38, 0x71, 0xa5, 0x35, 0x40, 0x00, 0x00, 0x00,
0xff, 0xff, 0x02, 0xff, 0xff, 0xba, 0xef, 0x5d, 0xff, 0xde, 0x98, 0xff, 0xde, 0x97, 0xf4, 0xde, 0x98, 0xec, 0xde, 0xb7, 0xeb, 0xe6, 0xd8, 0xec, 0xe6, 0xd8, 0xec, 0xde, 0xb7, 0xec, 0xf7, 0x5a, 0xe5, 0xff, 0xfe, 0xdf, 0xff, 0xfe, 0xec, 0xff, 0xbd, 0xec, 0xff, 0xbd, 0xec, 0xff, 0xdd, 0xec, 0xff, 0xbc, 0xec, 0xff, 0xbb, 0xec, 0xff, 0xfc, 0xe8, 0xff, 0xfc, 0xe1, 0xef, 0x39, 0xeb, 0xde, 0xb7, 0xec, 0xe6, 0xd8, 0xec, 0xe6, 0xd8, 0xec, 0xe6, 0xd8, 0xec, 0xde, 0xb7, 0xef, 0xde, 0x76, 0xf3, 0xde, 0xb7, 0xfa, 0xce, 0x5b, 0xf0, 0xdf, 0x1f, 0x6f,
0xff, 0xff, 0x72, 0xb5, 0x2f, 0xff, 0x93, 0xa3, 0xf7, 0x9b, 0xc0, 0xfc, 0xb4, 0x40, 0xfc, 0xc4, 0xc0, 0xfb, 0xd5, 0x20, 0xfb, 0xe5, 0x80, 0xfb, 0xed, 0xe1, 0xfb, 0xf6, 0x00, 0xfb, 0xf6, 0x22, 0xfb, 0xff, 0x10, 0xfb, 0xff, 0x11, 0xfb, 0xff, 0x10, 0xfb, 0xff, 0x10, 0xfb, 0xff, 0x32, 0xfb, 0xfe, 0xed, 0xfb, 0xf6, 0x00, 0xfb, 0xf6, 0x00, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x21, 0xfb, 0xf6, 0x00, 0xfb, 0xf6, 0x00, 0xfc, 0xf6, 0x20, 0xf7, 0xe5, 0xc4, 0xf9, 0xc5, 0xb1, 0xe0,
0xc5, 0xd3, 0xde, 0x6a, 0x20, 0xff, 0x8b, 0x40, 0xff, 0xa4, 0x00, 0xff, 0xb4, 0x60, 0xff, 0xc4, 0xc0, 0xff, 0xd5, 0x40, 0xff, 0xe5, 0xa0, 0xff, 0xf6, 0x00, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x41, 0xff, 0xff, 0x30, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xff, 0x0d, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x40, 0xff, 0xfe, 0x20, 0xf7,
0x83, 0x62, 0xf6, 0x7a, 0xe0, 0xff, 0x93, 0xc1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x22, 0xff, 0xfe, 0x21, 0xf4,
0x83, 0x40, 0xf2, 0x83, 0x40, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x61, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf0, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x8b, 0x61, 0xf1, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x83, 0x41, 0xf2, 0x83, 0x20, 0xff, 0x93, 0xa1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xf2,
0x9c, 0x49, 0xf1, 0x72, 0x60, 0xff, 0x93, 0xc1, 0xff, 0xa4, 0x21, 0xff, 0xb4, 0x81, 0xff, 0xc4, 0xe1, 0xff, 0xd5, 0x41, 0xff, 0xe5, 0xa1, 0xff, 0xf6, 0x01, 0xff, 0xf6, 0x20, 0xff, 0xfe, 0x42, 0xff, 0xff, 0x10, 0xff, 0xff, 0x32, 0xff, 0xff, 0x31, 0xff, 0xff, 0x31, 0xff, 0xff, 0x53, 0xff, 0xfe, 0xee, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x21, 0xff, 0xf6, 0x22, 0xff, 0xfe, 0x41, 0xff, 0xfe, 0x60, 0xfe,
0xe7, 0x1c, 0xbb, 0x83, 0x42, 0xff, 0x82, 0xe0, 0xff, 0x9b, 0xc0, 0xff, 0xb4, 0x60, 0xff, 0xcc, 0xe0, 0xff, 0xdd, 0x40, 0xff, 0xed, 0xc0, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x40, 0xff, 0xfe, 0x60, 0xff, 0xff, 0x6f, 0xff, 0xff, 0x91, 0xff, 0xff, 0x70, 0xff, 0xff, 0x70, 0xff, 0xff, 0x92, 0xff, 0xff, 0x4d, 0xff, 0xfe, 0x40, 0xff, 0xfe, 0x40, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x60, 0xff, 0xfe, 0x80, 0xff, 0xfe, 0x60, 0xff, 0xcd, 0x66, 0xd9,
0xff, 0xff, 0x3e, 0xce, 0x58, 0xff, 0xa4, 0xce, 0xfe, 0xa4, 0x8b, 0xe7, 0xa4, 0x8a, 0xd9, 0xac, 0xca, 0xcb, 0xbd, 0x0a, 0xc6, 0xbd, 0x4a, 0xc8, 0xc5, 0x6a, 0xc8, 0xcd, 0x69, 0xc8, 0xcd, 0x8b, 0xc8, 0xcd, 0xf2, 0xc8, 0xce, 0x13, 0xc8, 0xcd, 0xf2, 0xc8, 0xcd, 0xf2, 0xc8, 0xce, 0x13, 0xc8, 0xcd, 0xf0, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x6a, 0xc8, 0xcd, 0x8a, 0xc7, 0xc5, 0x6a, 0xc9, 0xc5, 0x49, 0xcd, 0xbd, 0x08, 0xd2, 0xbd, 0x08, 0xd3, 0x94, 0x28, 0xeb, 0x94, 0xd5, 0xa9,
0x00, 0x00, 0x00, 0xff, 0xdf, 0x6e, 0xde, 0xfe, 0xcc, 0xd6, 0xbd, 0xbe, 0xc6, 0x5c, 0xa7, 0xbe, 0x3c, 0x99, 0xbe, 0x3c, 0x95, 0xbe, 0x1c, 0x96, 0xbe, 0x1c, 0x96, 0xbe, 0x1c, 0x96, 0xbd, 0xfc, 0x96, 0xbd, 0xd9, 0x96, 0xbd, 0xd9, 0x96, 0xbd, 0xd9, 0x96, 0xbd, 0xd9, 0x96, 0xbd, 0xd9, 0x96, 0xbd, 0xfa, 0x96, 0xbe, 0x1c, 0x96, 0xbe, 0x1c, 0x96, 0xbd, 0xfc, 0x96, 0xbd, 0xfc, 0x96, 0xbd, 0xfc, 0x96, 0xbd, 0xfc, 0x96, 0xbe, 0x1c, 0x96, 0xb5, 0xfc, 0x97, 0xb5, 0xdb, 0x9b, 0xad, 0x9b, 0xa1, 0x9c, 0xf8, 0xb1, 0x9d, 0x38, 0xa7, 0xff, 0xbf, 0x36,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x1e, 0x1e, 0x44, 0x1f, 0x1f, 0x1f, 0x51, 0x22, 0x22, 0x22, 0x42, 0x21, 0x21, 0x21, 0x44, 0x21, 0x21, 0x21, 0x44, 0x21, 0x21, 0x21, 0x44, 0x22, 0x22, 0x22, 0x42, 0x1e, 0x1e, 0x1e, 0x5d, 0x1e, 0x1e, 0x1e, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x17, 0x17, 0x20, 0x1a, 0x1a, 0x1a, 0x61, 0x08, 0x08, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1a, 0x0b, 0x0b, 0x0b, 0x40, 0x1c, 0x1c, 0x1c, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0xc7, 0xbf, 0xbf, 0x60, 0xec, 0xdf, 0xda, 0x71, 0xff, 0xf0, 0xeb, 0x66, 0xf9, 0xe7, 0xe5, 0x63, 0xf9, 0xe7, 0xe2, 0x63, 0xf7, 0xe5, 0xe0, 0x63, 0xf7, 0xe2, 0xdd, 0x63, 0xff, 0xff, 0xff, 0x63, 0xd8, 0xc5, 0xc0, 0x77, 0x73, 0x69, 0x66, 0x87, 0x95, 0x8d, 0x8b, 0x61, 0xd2, 0xc7, 0xc5, 0x61, 0xc7, 0xbd, 0xba, 0x61, 0xc5, 0xbd, 0xba, 0x61, 0xd2, 0xc5, 0xc2, 0x61, 0xca, 0xb2, 0xb0, 0x61, 0x88, 0x73, 0x6e, 0x6c, 0x8c, 0x78, 0x72, 0x81, 0xf7, 0xe3, 0xde, 0x67, 0xff, 0xfc, 0xf7, 0x63, 0xf4, 0xe0, 0xda, 0x63, 0xf7, 0xe2, 0xdd, 0x63, 0xf7, 0xe2, 0xdd, 0x64, 0xf4, 0xe0, 0xdb, 0x64, 0xff, 0xeb, 0xe6, 0x67, 0xbd, 0xa6, 0xa2, 0x71, 0xab, 0xa3, 0xa3, 0x40, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0x02, 0xff, 0xff, 0xfd, 0xba, 0xea, 0xea, 0xea, 0xff, 0xc0, 0xd1, 0xd6, 0xff, 0xbb, 0xcf, 0xd5, 0xf4, 0xbd, 0xd2, 0xd8, 0xec, 0xbc, 0xd4, 0xdb, 0xeb, 0xbd, 0xd7, 0xdd, 0xec, 0xbd, 0xd7, 0xdd, 0xec, 0xb7, 0xd4, 0xdc, 0xec, 0xd0, 0xea, 0xf1, 0xe5, 0xf3, 0xfe, 0xfe, 0xdf, 0xf4, 0xff, 0xff, 0xec, 0xe6, 0xf5, 0xf8, 0xec, 0xe8, 0xf6, 0xf9, 0xec, 0xea, 0xf7, 0xf9, 0xec, 0xe2, 0xf4, 0xf8, 0xec, 0xd9, 0xf6, 0xfc, 0xec, 0xe3, 0xff, 0xff, 0xe8, 0xe1, 0xfd, 0xff, 0xe1, 0xc8, 0xe4, 0xeb, 0xeb, 0xb8, 0xd3, 0xdb, 0xec, 0xbd, 0xd9, 0xdf, 0xec, 0xbd, 0xd9, 0xdf, 0xec, 0xbd, 0xd8, 0xde, 0xec, 0xb8, 0xd4, 0xda, 0xef, 0xaf, 0xcc, 0xd5, 0xf3, 0xb9, 0xd4, 0xdb, 0xfa, 0xd8, 0xca, 0xc7, 0xf0, 0xff, 0xe1, 0xda, 0x6f,
0xff, 0xff, 0xff, 0x72, 0x79, 0xa6, 0xb1, 0xff, 0x18, 0x73, 0x8f, 0xf7, 0x00, 0x7a, 0x99, 0xfc, 0x01, 0x8a, 0xad, 0xfc, 0x03, 0x99, 0xbe, 0xfb, 0x03, 0xa5, 0xcf, 0xfb, 0x04, 0xb2, 0xde, 0xfb, 0x05, 0xbc, 0xea, 0xfb, 0x00, 0xc1, 0xf1, 0xfb, 0x0d, 0xc5, 0xf2, 0xfb, 0x7d, 0xdf, 0xf8, 0xfb, 0x8c, 0xe2, 0xf7, 0xfb, 0x82, 0xdf, 0xf7, 0xfb, 0x82, 0xdf, 0xf7, 0xfb, 0x93, 0xe3, 0xf8, 0xfb, 0x6a, 0xdb, 0xf6, 0xfb, 0x00, 0xc2, 0xf1, 0xfb, 0x00, 0xc2, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x05, 0xc3, 0xf1, 0xfb, 0x04, 0xc2, 0xf0, 0xfb, 0x02, 0xc2, 0xf1, 0xfc, 0x02, 0xc4, 0xf3, 0xf7, 0x1e, 0xb9, 0xe1, 0xf9, 0x8a, 0xb6, 0xc1, 0xe0,
0x98, 0xb8, 0xbf, 0xde, 0x00, 0x46, 0x66, 0xff, 0x00, 0x68, 0x87, 0xff, 0x00, 0x80, 0xa0, 0xff, 0x00, 0x8d, 0xb0, 0xff, 0x00, 0x9a, 0xc1, 0xff, 0x00, 0xa8, 0xd2, 0xff, 0x01, 0xb4, 0xe1, 0xff, 0x02, 0xc0, 0xee, 0xff, 0x00, 0xc3, 0xf6, 0xff, 0x0a, 0xc7, 0xf7, 0xff, 0x7f, 0xe3, 0xfc, 0xff, 0x8e, 0xe6, 0xfc, 0xff, 0x85, 0xe4, 0xfc, 0xff, 0x85, 0xe4, 0xfc, 0xff, 0x95, 0xe8, 0xfd, 0xff, 0x6c, 0xdf, 0xfb, 0xff, 0x00, 0xc4, 0xf6, 0xff, 0x00, 0xc4, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc5, 0xf6, 0xff, 0x02, 0xc6, 0xf6, 0xff, 0x03, 0xc6, 0xf6, 0xff, 0x03, 0xc6, 0xf7, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xc5, 0xf6, 0xf7,
0x13, 0x6d, 0x83, 0xf6, 0x00, 0x5b, 0x76, 0xff, 0x08, 0x78, 0x93, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0e, 0xc6, 0xf3, 0xff, 0x05, 0xc5, 0xf5, 0xf4,
0x03, 0x69, 0x81, 0xf2, 0x02, 0x67, 0x80, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x66, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x66, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9e, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x66, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xab, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x0c, 0x6e, 0x85, 0xf0, 0x02, 0x65, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x08, 0x6b, 0x85, 0xf1, 0x02, 0x66, 0x7f, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0b, 0xc6, 0xf4, 0xf2,
0x05, 0x68, 0x80, 0xf2, 0x01, 0x64, 0x7e, 0xff, 0x07, 0x76, 0x92, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb2, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe1, 0xff, 0x0c, 0xc0, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0a, 0xc6, 0xf4, 0xf2,
0x49, 0x88, 0x99, 0xf1, 0x00, 0x4e, 0x6d, 0xff, 0x06, 0x78, 0x93, 0xff, 0x08, 0x83, 0xa1, 0xff, 0x09, 0x90, 0xb1, 0xff, 0x0a, 0x9d, 0xc2, 0xff, 0x0a, 0xaa, 0xd2, 0xff, 0x0b, 0xb6, 0xe0, 0xff, 0x0c, 0xc1, 0xed, 0xff, 0x02, 0xc4, 0xf4, 0xff, 0x14, 0xc8, 0xf5, 0xff, 0x83, 0xe2, 0xfa, 0xff, 0x91, 0xe5, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x88, 0xe3, 0xfa, 0xff, 0x98, 0xe7, 0xfb, 0xff, 0x71, 0xde, 0xf9, 0xff, 0x06, 0xc5, 0xf4, 0xff, 0x07, 0xc5, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0c, 0xc6, 0xf4, 0xff, 0x0d, 0xc5, 0xf3, 0xff, 0x0c, 0xc8, 0xf7, 0xff, 0x00, 0xcd, 0xff, 0xfe,
0xdf, 0xe2, 0xe2, 0xbb, 0x12, 0x68, 0x7f, 0xff, 0x00, 0x5e, 0x80, 0xff, 0x00, 0x78, 0x9c, 0xff, 0x00, 0x8b, 0xb3, 0xff, 0x00, 0x9b, 0xc7, 0xff, 0x00, 0xaa, 0xd9, 0xff, 0x00, 0xb8, 0xea, 0xff, 0x00, 0xc4, 0xf9, 0xff, 0x00, 0xc8, 0xff, 0xff, 0x00, 0xcd, 0xff, 0xff, 0x7b, 0xec, 0xff, 0xff, 0x8c, 0xf0, 0xff, 0xff, 0x81, 0xed, 0xff, 0xff, 0x81, 0xed, 0xff, 0xff, 0x94, 0xf2, 0xff, 0xff, 0x66, 0xe7, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcb, 0xff, 0xff, 0x00, 0xcd, 0xff, 0xff, 0x00, 0xce, 0xff, 0xff, 0x00, 0xd2, 0xff, 0xff, 0x00, 0xcd, 0xff, 0xff, 0x31, 0xab, 0xca, 0xd9,
0xff, 0xff, 0xff, 0x3e, 0xc3, 0xca, 0xcb, 0xff, 0x6f, 0x97, 0xa4, 0xfe, 0x57, 0x92, 0xa3, 0xe7, 0x4f, 0x92, 0xa4, 0xd9, 0x4d, 0x97, 0xa9, 0xcb, 0x51, 0xa0, 0xb5, 0xc6, 0x51, 0xa8, 0xbc, 0xc8, 0x51, 0xac, 0xc3, 0xc8, 0x4c, 0xad, 0xc5, 0xc8, 0x55, 0xaf, 0xc6, 0xc8, 0x8d, 0xbc, 0xc9, 0xc8, 0x95, 0xbf, 0xc9, 0xc8, 0x90, 0xbd, 0xc9, 0xc8, 0x90, 0xbd, 0xc9, 0xc8, 0x97, 0xc0, 0xc9, 0xc8, 0x84, 0xbb, 0xc9, 0xc8, 0x4f, 0xae, 0xc5, 0xc8, 0x50, 0xae, 0xc5, 0xc8, 0x51, 0xae, 0xc5, 0xc8, 0x51, 0xae, 0xc5, 0xc8, 0x51, 0xae, 0xc5, 0xc8, 0x51, 0xae, 0xc5, 0xc8, 0x53, 0xaf, 0xc6, 0xc7, 0x51, 0xad, 0xc4, 0xc9, 0x4a, 0xa7, 0xbf, 0xcd, 0x44, 0xa2, 0xb9, 0xd2, 0x3d, 0xa0, 0xb7, 0xd3, 0x41, 0x83, 0x93, 0xeb, 0xac, 0x98, 0x93, 0xa9,
0x00, 0x00, 0x00, 0x00, 0xff, 0xfa, 0xf8, 0x6e, 0xf1, 0xde, 0xd9, 0xcc, 0xea, 0xd5, 0xce, 0xbe, 0xe1, 0xc9, 0xc1, 0xa7, 0xdf, 0xc3, 0xbc, 0x99, 0xe1, 0xc4, 0xbc, 0x95, 0xe3, 0xc1, 0xbb, 0x96, 0xe2, 0xc1, 0xb7, 0x96, 0xe3, 0xc0, 0xb7, 0x96, 0xe0, 0xbe, 0xb7, 0x96, 0xcc, 0xb9, 0xb5, 0x96, 0xc8, 0xb9, 0xb5, 0x96, 0xca, 0xb9, 0xb5, 0x96, 0xca, 0xb9, 0xb5, 0x96, 0xc8, 0xb9, 0xb5, 0x96, 0xcf, 0xbb, 0xb5, 0x96, 0xe3, 0xc0, 0xb7, 0x96, 0xe3, 0xc0, 0xb7, 0x96, 0xe2, 0xbe, 0xb7, 0x96, 0xe2, 0xbe, 0xb7, 0x96, 0xe2, 0xbe, 0xb7, 0x96, 0xe2, 0xbe, 0xb7, 0x96, 0xe3, 0xc0, 0xb7, 0x96, 0xe0, 0xbe, 0xb4, 0x97, 0xda, 0xb8, 0xb0, 0x9b, 0xd5, 0xb2, 0xa9, 0xa1, 0xc3, 0x9e, 0x95, 0xb1, 0xc1, 0xa3, 0x9b, 0xa7, 0xfa, 0xf5, 0xf5, 0x36,
#endif
};
const lv_img_dsc_t batt_full_yellow = {
.header.always_zero = 0,
.header.w = 30,
.header.h = 62,
.data_size = 1860 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.data = batt_full_yellow_map,
};

View File

@ -0,0 +1,18 @@
#ifndef BIN_OFFSETS_H
#define BIN_OFFSETS_H
#define Number_HarmonyOS_bpp4_20px_glyph_bitmap (const uint8_t *)0xa02000
#define Number_HarmonyOS_bpp4_20px_glyph_dsc (const lv_font_fmt_txt_glyph_dsc_t *)0xa02af8
#define Number_HarmonyOS_bpp4_12px_glyph_bitmap (const uint8_t *)0xa02000
#define Number_HarmonyOS_bpp4_12px_glyph_dsc (const lv_font_fmt_txt_glyph_dsc_t *)0xa02af8
#define Number_HarmonyOS_bpp4_16px_glyph_bitmap (const uint8_t *)0xa030f8
#define Number_HarmonyOS_bpp4_16px_glyph_dsc (const lv_font_fmt_txt_glyph_dsc_t *)0xa04264
#define Number_HarmonyOS_bpp4_36px_glyph_bitmap (const uint8_t *)0xa04864
#define Number_HarmonyOS_bpp4_36px_glyph_dsc (const lv_font_fmt_txt_glyph_dsc_t *)0xa08cba
#define Number_HarmonyOS_bpp4_44px_glyph_bitmap (const uint8_t *)0xa0918a
#define Number_HarmonyOS_bpp4_44px_glyph_dsc (const lv_font_fmt_txt_glyph_dsc_t *)0xa0a32d
#define TOTAL_SIZE 10527789
#endif

View File

@ -0,0 +1,141 @@
#ifndef __FR_LV_APP_PAGE_H__
#define __FR_LV_APP_PAGE_H__
void fr_lv_alarm_setting_func(lv_obj_t *parent, lv_point_t *top); // 闹钟首页设置
void fr_lv_alarm_upper_limit_func(lv_obj_t *parent, lv_point_t *top); // 闹钟添加到上限
void fr_lv_alarm_repeat_func(lv_obj_t *parent, lv_point_t *top) ;//设置闹钟重复日期
void fr_lv_alarm_edit_func(lv_obj_t *parent, lv_point_t *top); // 闹钟编辑界面
void fr_lv_del_alarm_hint_func(lv_obj_t *parent, lv_point_t *top) ;//删除闹钟提示
void fr_lv_alarm_bell_func(lv_obj_t *parent, lv_point_t *top);//闹钟响铃提示
void fr_lv_app_downkey_func(lv_obj_t *parent, lv_point_t *top);//下键设置列表
void fr_lv_app_exercise_func(lv_obj_t *parent, lv_point_t *top);//每日活动/运动界面
void fr_lv_blood_oxygen_measure_func(lv_obj_t *parent, lv_point_t *top); //血氧测量主界面
void fr_lv_blood_oxygen_show_func(lv_obj_t *parent, lv_point_t *top); //血氧测量完成显示
void fr_lv_blood_pressure_measure_func(lv_obj_t *parent, lv_point_t *top) ;//血压测量完成显示
void fr_lv_blood_sugar_measure_func(lv_obj_t *parent, lv_point_t *top) ;//血糖测量界面
void fr_lv_body_temperature_display_func(lv_obj_t *parent, lv_point_t *top); //体温测量显示
void fr_lv_body_temperature_func(lv_obj_t *parent, lv_point_t *top) ;//体温测量主页
void fr_lv_body_temperature_warn_func(lv_obj_t *parent, lv_point_t *top);//体温过高警告
void fr_lv_breath_training_home_func(lv_obj_t *parent, lv_point_t *top) ;// 呼吸训练主界面
void fr_lv_breath_setting_func(lv_obj_t *parent, lv_point_t *top) ;//呼吸训练设置目标
void fr_lv_breath_training_finish_func(lv_obj_t *parent, lv_point_t *top); // 呼吸训练完成显示
void fr_lv_breath_training_display_func(lv_obj_t *parent, lv_point_t *top); // 呼吸训练动画显示
void fr_lv_bright_time_func(lv_obj_t *parent, lv_point_t *top) ;// 亮屏时长设置
void fr_lv_bright_home_func(lv_obj_t *parent, lv_point_t *top) ;// 亮度&时长调节主页面
void fr_lv_bright_adjust_func(lv_obj_t *parent, lv_point_t *top);//亮度调节字页面
void fr_lv_dial_preview_func(lv_obj_t* parent,lv_point_t *top);/*表盘预览界面*/
void fr_lv_screen_off_dial_func(lv_obj_t *parent, lv_point_t *top) ;//熄屏表盘设置
void fr_lv_theme_select_func(lv_obj_t *parent, lv_point_t *top) ;// 风格主题选择界面
void fr_lv_raise_wake_hint_func(lv_obj_t *parent, lv_point_t *top);//开启抬腕亮屏设置
void fr_lv_effective_time_home_func(lv_obj_t *parent, lv_point_t *top); //生效时间主页
void fr_lv_dorp_down_func(lv_obj_t *parent, lv_point_t *top);//主页下拉菜单
void fr_lv_pressure_emotion_func(lv_obj_t *parent, lv_point_t *top) ;//情绪测量
void fr_lv_app_exercise_classify_list_func(lv_obj_t *parent, lv_point_t *top);//运动分类列表
void fr_lv_app_exercise_default_list_func(lv_obj_t *parent, lv_point_t *top);//默认运动列表
void fr_lv_exercise_detection_func(lv_obj_t *parent, lv_point_t *top) ;// 运动识别界面
void fr_lv_exercise_detection_hint_func(lv_obj_t *parent, lv_point_t *top) ;//运动识别提示界面
void fr_lv_exercise_over_hint_func(lv_obj_t *parent, lv_point_t *top);// 运动结束提示
void fr_lv_exercise_distance_short_hint_func(lv_obj_t *parent, lv_point_t *top);//距离过短提示
void fr_lv_exercise_time_short_hint_func(lv_obj_t *parent, lv_point_t *top);//时间过短提示
void fr_lv_exercise_long_info_func(lv_obj_t *parent, lv_point_t *top);//运动长信息界面
void fr_lv_exercise_short_info_func(lv_obj_t *parent, lv_point_t *top);//运动短信息界面 根据实际需要显示的信息选择
void fr_lv_exercise_record_func_ex(lv_obj_t *parent, lv_point_t *top) ;//运动记录长页面
void fr_lv_exercise_record_func(lv_obj_t *parent, lv_point_t *top) ;//运动记录短页面
void fr_lv_exercise_app_disc_func(lv_obj_t *parent, lv_point_t *top);//app断开提示
void fr_lv_bluetooth_connect_succ_func(lv_obj_t *parent, lv_point_t *top);//蓝牙连接成功提示
void fr_lv_bluetooth_connect_fail_func(lv_obj_t *parent, lv_point_t *top);//蓝牙连接失败提示
void fr_lv_exercise_start_func(lv_obj_t *parent, lv_point_t *top);//运动开始倒计时
void fr_lv_exercise_sub_list_func(lv_obj_t *parent, lv_point_t *top);//运动选项子类列表 总共7个子类列表
void fr_lv_exercise_start_hint_func(lv_obj_t *parent, lv_point_t *top);//运动开始提示设置
void fr_lv_target_setting_func(lv_obj_t *parent, lv_point_t *top);//运动目标设置时间卡路里公里
void fr_lv_select_target_func(lv_obj_t *parent, lv_point_t *top);//运动设置项选择
void fr_lv_target_setting_func_ex(lv_obj_t *parent, lv_point_t *top);//运动目标设置 距离
void fr_lv_female_health_func(lv_obj_t *parent, lv_point_t *top);//女性健康页面
void fr_lv_find_phone_display_func(lv_obj_t *parent, lv_point_t *top); // 查找手机动画显示
void fr_lv_flashlight_func(lv_obj_t *parent, lv_point_t *top); // 手电筒
void fr_lv_heart_rate_list_func(lv_obj_t *parent, lv_point_t *top);//心率列表
void fr_lv_heart_rate_curve_func(lv_obj_t *parent, lv_point_t *top); //心率监测曲线
void fr_lv_heart_rate_quietness_func(lv_obj_t *parent, lv_point_t *top); //静息心率
void fr_lv_heart_rate_warning_func(lv_obj_t *parent, lv_point_t *top); //心率预警
void fr_lv_alarm_close_hint_func(lv_obj_t *parent, lv_point_t *top); // 闹钟关闭提醒
void fr_lv_alarm_resound_hint_func(lv_obj_t *parent, lv_point_t *top) ;// 闹钟十分钟后再响提醒
void fr_lv_sedentary_hint_func(lv_obj_t *parent, lv_point_t *top); // 久坐提醒
void fr_lv_target_finish_hint_func(lv_obj_t *parent, lv_point_t *top); // 目标达成提示界面
void fr_lv_low_battery_func(lv_obj_t *parent, lv_point_t *top) ;// 低电量提醒
void fr_lv_power_saving_mode_func(lv_obj_t *parent, lv_point_t *top); // 省电模式是否开启
void fr_lv_poweroff_hint_func(lv_obj_t *parent, lv_point_t *top); // 关机提醒
void fr_lv_dev_bind_hint_func(lv_obj_t *parent, lv_point_t *top) ;// 绑定状态显示
void fr_lv_dev_bind_func(lv_obj_t *parent, lv_point_t *top);//是否绑定选择
void fr_lv_home_short_menu_func(lv_obj_t *parent, lv_point_t *top);//主页快捷菜单
void fr_lv_language_setting_func(lv_obj_t *parent, lv_point_t *top);//语言设置
void fr_lv_list_menu_func(lv_obj_t *parent, lv_point_t *top); //长列表菜单
void fr_lv_arc_list_func(lv_obj_t *parent, lv_point_t *top); //弧形列表菜单
void fr_lv_main_clock0_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_main_clock1_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_main_clock2_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_main_clock3_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_main_clock4_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_main_clock5_func(lv_obj_t *parent, lv_point_t *top);//主时钟表盘界面
void fr_lv_message_hint_page_func(lv_obj_t *parent, lv_point_t *top);//消息主界面
void fr_lv_message_details_page_func(lv_obj_t *parent, lv_point_t *top); //显示对应消息条目详情
void fr_lv_not_disturb_func(lv_obj_t *parent, lv_point_t *top) ;// 勿扰设置
void fr_lv_not_disturb_hint_func(lv_obj_t *parent, lv_point_t *top);//开启勿扰模式提示
void fr_lv_offscreen_dial_func(lv_obj_t *parent, lv_point_t *top); //熄屏表盘
void fr_lv_ota_firmware_func(lv_obj_t *parent, lv_point_t *top); // ota界面
void fr_lv_ota_result_func(lv_obj_t *parent, lv_point_t *top); // 升级结束显示
void fr_lv_add_cards_page_func(lv_obj_t *parent, lv_point_t *top);//主页添加主题提示界面
void fr_lv_themepage_select_func(lv_obj_t *parent, lv_point_t *top);//主页主题选择设置界面
void fr_lv_password_home_func(lv_obj_t *parent, lv_point_t *top);//锁屏 密码主界面
void fr_lv_password_succ_hint_func(lv_obj_t *parent, lv_point_t *top);//密码修改成功提示界面
void fr_lv_password_input_func(lv_obj_t *parent, lv_point_t *top) ;//密码输入提示界面
void fr_lv_about_page_func(lv_obj_t *parent, lv_point_t *top) ;//关于界面
void fr_lv_pressure_measure_func(lv_obj_t *parent, lv_point_t *top) ;//压力测量完成显示
void fr_lv_qrcode_page_func(lv_obj_t *parent, lv_point_t *top);//二维码
void fr_lv_respiratory_rate_func(lv_obj_t *parent, lv_point_t *top); //呼吸率测量
void fr_lv_set_time_select_func(lv_obj_t *parent, lv_point_t *top); //时间设置选择页面
void fr_lv_date_select_func(lv_obj_t *parent, lv_point_t *top) ;// 日期设置选择 页面
void fr_lv_setting_list_func(lv_obj_t *parent, lv_point_t *top); //默认设置列表
void fr_lv_dial_theme_setting_func(lv_obj_t *parent, lv_point_t *top); //表盘主题设置
void fr_lv_more_list_func(lv_obj_t *parent, lv_point_t *top);//更多设置列表
void fr_lv_sleep_page_func(lv_obj_t *parent, lv_point_t *top); //睡眠主界面
void fr_lv_soundvibration_home_func(lv_obj_t *parent, lv_point_t *top); // 声音与振动主页面
void fr_lv_sound_adjust_func(lv_obj_t *parent, lv_point_t *top); // 声音音量调节子界面
void fr_lv_vibration_select_func(lv_obj_t *parent, lv_point_t *top); // 振动强度选择 页面
void fr_lv_stop_watch_func(lv_obj_t *parent, lv_point_t *top); // 秒表
void fr_lv_system_menu_func(lv_obj_t *parent, lv_point_t *top) ; //系统菜单
void fr_lv_system_menu_hint_func(lv_obj_t *parent, lv_point_t *top);//重启 关机 恢复出厂设置 提示页面
void fr_lv_time_date_home_func(lv_obj_t *parent, lv_point_t *top); // 时间与日期主界面
void fr_lv_universal_time_func(lv_obj_t *parent, lv_point_t *top); //世界时间主界面
void fr_lv_add_city_func(lv_obj_t *parent, lv_point_t *top); //添加城市界面
void fr_lv_del_city_hint_func(lv_obj_t *parent, lv_point_t *top);//是否删除当前城市
void fr_lv_wear_detection_func(lv_obj_t *parent, lv_point_t *top); //佩戴检测
void fr_lv_wear_detection_func_ex(lv_obj_t *parent, lv_point_t *top); //佩戴提醒
void fr_lv_weather_report_func(lv_obj_t *parent, lv_point_t *top); //天气预报界面
void fr_lv_voice_assistant_func(lv_obj_t *parent, lv_point_t *top);//语音助手界面
void fr_lv_power_ctrl_func(lv_obj_t *parent, lv_point_t *top); // 电源控制界面
void fr_lv_exercise_main_info_func(lv_obj_t *parent,lv_point_t *top);//运动信息显示界面
void fr_lv_app_circle_func(lv_obj_t *parent,lv_point_t *top);//单圆样式界面
void fr_lv_app_dia_func(lv_obj_t *parent,lv_point_t *top);//电话相关界面
void fr_lv_app_dial_phone_book(lv_obj_t *parent,lv_point_t *top);//电话本界面
void fr_lv_app_dial_call_history(lv_obj_t *parent,lv_point_t *top);//通话记录界面
void fr_lv_app_dial_dial(lv_obj_t *parent,lv_point_t *top);//拨号盘界面
void fr_lv_timer_count_start_func(lv_obj_t *parent, lv_point_t *top);//计时器开始界面
void fr_lv_timer_custom_func(lv_obj_t *parent, lv_point_t *top);//自定义计数参数界面
void fr_lv_app_timer_func(lv_obj_t *parent, lv_point_t *top);//计时器界面
void fr_lv_photograph_func(lv_obj_t *parent, lv_point_t *top);//点击拍照界面
void fr_lv_app_calculator(lv_obj_t *parent, lv_point_t *top);//计算器界面
void fr_lv_app_music_control_func(lv_obj_t *parent, lv_point_t *top);//音乐界面
void fr_lv_screensaver_func(lv_obj_t *parent, lv_point_t *top) ;
void fr_lv_flexible_msg_func(lv_obj_t *parent, lv_point_t *top);//灵动岛消息
void fr_flexible_msg_set_type(uint8_t type);
#endif

View File

@ -0,0 +1,224 @@
#include "lvgl.h"
#include "fr_lv_public_func.h"
#include "lv_user_sqlist.h"
#define PAGE_MAX_LENGTH 15
#define CUSTOM_UI_ARRY_NUMBER 12
SqlistType_t page_list;
ElemType_t page_sqlist_space[PAGE_MAX_LENGTH]={0};
/*
page_list define:
0:ui_clock_group,
1-(PAGE_MAX_LENGTH-1):custom_ui_arry
*/
extern void fr_load_watch_face_from_ext_flash(lv_obj_t *parent,void *arg);
static const ui_func custom_ui_arry[CUSTOM_UI_ARRY_NUMBER]=
{
fr_lv_add_cards_page_func,
//---------------------------
fr_lv_app_exercise_func,
fr_lv_sleep_page_func,
fr_lv_weather_report_func,
fr_lv_pressure_measure_func,
fr_lv_heart_rate_list_func,
fr_lv_blood_oxygen_measure_func,
fr_lv_blood_pressure_measure_func,
fr_lv_app_exercise_default_list_func,
//---------------------------
fr_lv_pressure_emotion_func,
fr_lv_respiratory_rate_func,
fr_lv_body_temperature_display_func,
//fr_load_watch_face_from_ext_flash,
//---------------------------
};
static LV_ATTRIBUTE_LARGE_CONST const ui_func ui_clock_group[] =
{
fr_lv_main_clock2_func,
fr_lv_main_clock1_func,
fr_lv_main_clock0_func,
fr_lv_main_clock3_func,
fr_lv_main_clock4_func,
fr_lv_main_clock5_func,
NULL, //*entry_main
};
//==============================================================
//==============================================================
//==============================================================
uint8_t fr_ui_watchface_total(void)
{
return sizeof(ui_clock_group) / 4;
}
ui_func fr_ui_get_watchface(void)
{
uint8_t ui_face_id = fr_system_get_watch_face();
ui_func func = ui_clock_group[ui_face_id];
return func;
}
void fr_lv_custom_page_set_watch_face(uint8_t watch_face_id)
{
watch_face_id |= 0xc0;
lv_user_list_replace(&page_list,0,watch_face_id);
}
bool fr_lv_is_ui_index_in_list(uint8_t custom_ui_arry_index)
{
custom_ui_arry_index |= 0x80;
uint8_t elem_id = lv_user_list_get_elem_id(&page_list,custom_ui_arry_index);
if(elem_id != 0xff)
{
return 1;
}
else
return 0;
}
bool fr_lv_custom_page_add(uint8_t custom_ui_arry_index)
{
custom_ui_arry_index |= 0x80;
uint8_t elem_id = lv_user_list_get_elem_id(&page_list,custom_ui_arry_index);
if( elem_id == 0xff)
{
printf("add elem!!\r\n");
//列表中无该元素,则添加
//放在添加页面之前,添加页面永远在最后
uint8_t len = lv_user_list_get_sqlist_length(&page_list);
if(len == 0)
lv_user_list_insert(&page_list,len,custom_ui_arry_index);
else
lv_user_list_insert(&page_list,len-1,custom_ui_arry_index);
return 1;
}
return 0;
}
bool fr_lv_custom_page_delete(uint8_t custom_ui_arry_index)
{
custom_ui_arry_index |= 0x80;
uint8_t elem_id = lv_user_list_get_elem_id(&page_list,custom_ui_arry_index);
if(elem_id != 0xff)
{
lv_user_list_delete(&page_list,elem_id);
return 1;
}
else
return 0;
}
uint8_t fr_lv_get_custom_page_length(void)
{
return page_list.length;
}
uint8_t *fr_lv_get_custom_page_data(void)
{
return (uint8_t *)page_list.data;
}
ui_func fr_lv_get_prev_custom_page(uint8_t index)
{
ElemType_t prev_page = lv_user_list_get_prev_elem(&page_list,index);
if((prev_page & 0xc0) == 0xc0)
{
prev_page &= 0x3f;
return ui_clock_group[prev_page];
}
else
{
prev_page &= 0x7f;
return custom_ui_arry[prev_page];
}
}
ui_func fr_lv_get_next_custom_page(uint8_t index)
{
ElemType_t next_page = lv_user_list_get_next_elem(&page_list,index);
if((next_page & 0xc0) == 0xc0)
{
next_page &= 0x3f;
return ui_clock_group[next_page];
}
else
{
next_page &= 0x7f;
return custom_ui_arry[next_page];
}
}
ui_func fr_lv_get_cur_custom_page(uint8_t index)
{
ElemType_t cur_page = lv_user_list_get_cur_elem(&page_list,index);
if((cur_page&0xc0) == 0xc0)
{
cur_page &= 0x3f;
return ui_clock_group[cur_page];
}
else
{
cur_page &= 0x7f;
return custom_ui_arry[cur_page];
}
}
uint8_t splist_get_elem_number(void)
{
uint8_t len = 0;
uint8_t *custom_mode = fr_system_get_custom_page_mode();
for (uint8_t i = 0; i < CUSTOM_ID_ARRY_NUMBER; i++)
{
if ((custom_mode[i] != 0) && (custom_mode[i] <= CUSTOM_ID_ARRY_NUMBER))
{
len++;
}
}
return len;
}
//--
ui_func get_prior_element(uint8_t index)
{
return fr_lv_get_prev_custom_page(index);
}
ui_func get_next_element(uint8_t index)
{
return fr_lv_get_next_custom_page(index);
}
ui_func get_cur_element(uint8_t index)
{
return fr_lv_get_cur_custom_page(index);
}
//---
void page_list_traverser(void)
{
ListTraverse(&page_list);
}
void fr_lv_custom_page_init(void)
{
page_list.data = page_sqlist_space;
page_list.length = 0;
//----------------------------------
uint8_t elem_len = splist_get_elem_number();
if (elem_len == 0) // list is empty;
{
//clock0 and fr_lv_add_cards_page_func
fr_lv_custom_page_add(0);
fr_lv_custom_page_add(1);
fr_lv_custom_page_set_watch_face(0);
//---------------------------------
fr_lv_custom_page_add(1);
fr_lv_custom_page_add(2);
fr_lv_custom_page_add(3);
fr_lv_custom_page_add(4);
fr_system_set_custom_page_mode();
}
else
{
uint8_t *custom_mode = fr_system_get_custom_page_mode();
for (uint8_t i = 0; i < elem_len; i++)
{
fr_lv_custom_page_add(custom_mode[i]);
}
}
}

View File

@ -0,0 +1,23 @@
#ifndef __FR_LV_CUSTOMER_PAGE_H__
#define __FR_LV_CUSTOMER_PAGE_H__
#include "lvgl.h"
#include "fr_lv_public_func.h"
uint8_t fr_ui_watchface_total(void);
ui_func fr_ui_get_watchface(void);
bool fr_lv_is_ui_index_in_list(uint8_t custom_ui_arry_index);
void fr_lv_custom_page_set_watch_face(uint8_t watch_face_id);
bool fr_lv_custom_page_add(uint8_t custom_ui_arry_index);
bool fr_lv_custom_page_delete(uint8_t custom_ui_arry_index);
uint8_t fr_lv_get_custom_page_length(void);
uint8_t *fr_lv_get_custom_page_data(void);
ui_func fr_lv_get_prev_custom_page(uint8_t index);
ui_func fr_lv_get_next_custom_page(uint8_t index);
ui_func fr_lv_get_cur_custom_page(uint8_t index);
uint8_t splist_get_elem_number(void);
ui_func get_prior_element(uint8_t index);
ui_func get_next_element(uint8_t index);
ui_func get_cur_element(uint8_t index);
void page_list_traverser(void);
void fr_lv_custom_page_init(void);
#endif

View File

@ -0,0 +1,504 @@
#include "lvgl.h"
#include "img_def.h"
#include "lv_common_function.h"
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_20px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_16px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_12px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_36px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_44px);
#define LV_FONT_SMALL_NUMBER_20PX &Number_HarmonyOS_bpp4_20px
#define LV_FONT_SMALL_NUMBER_16PX &Number_HarmonyOS_bpp4_16px
#define LV_FONT_SMALL_NUMBER_12PX &Number_HarmonyOS_bpp4_12px
#define LV_FONT_BIG_NUMBER_44PX &Number_HarmonyOS_bpp4_44px
#define LV_FONT_MEDIUM_NUMBER_36PX &Number_HarmonyOS_bpp4_36px
static lv_timer_t *refresh_timer=NULL;
static uint8_t background_style = 1;
// LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_bg1_src[6] =
// {
// IMG_INSTRUMENT_BG1_1,
// IMG_INSTRUMENT_BG1_2,
// IMG_INSTRUMENT_BG1_3,
// IMG_INSTRUMENT_BG1_4,
// IMG_INSTRUMENT_BG1_5,
// };
// LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_bg2_src[6] =
// {
// IMG_INSTRUMENT_BG2_1,
// IMG_INSTRUMENT_BG2_2,
// IMG_INSTRUMENT_BG2_3,
// IMG_INSTRUMENT_BG2_4,
// IMG_INSTRUMENT_BG2_5,
// };
// LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* left_img_src[2] =
// {
// IMG_INSTRUMENT_ICO13,
// IMG_INSTRUMENT_ICO14,
// };
// LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* right_img_src[2] =
// {
// IMG_INSTRUMENT_ICO9,
// IMG_INSTRUMENT_ICO10,
// };
// LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* batt_black_img_src[5] =
// {
// IMG_INSTRUMENT_BATT_ICO1,
// IMG_INSTRUMENT_BATT_ICO2,
// IMG_INSTRUMENT_BATT_ICO3,
// IMG_INSTRUMENT_BATT_ICO4,
// IMG_INSTRUMENT_BATT_ICO5
// };
static uint32_t odb_val = 660;
static uint32_t trip_val = 1770;
static uint8_t dir_sw_flags=0;
static uint8_t dir_cnt=0;
static uint8_t speed_val=50;
static uint8_t right_battery_val=20;
static uint8_t left_battery_val=20;
static int speed_angle=2400;
static uint32_t background_sw =0 ;
void fr_lv_instrument_panel_func(lv_obj_t *parent, lv_point_t *top);
void lv_img_big_disp(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start)
{
lv_obj_t *cont1 = lv_obj_create(parent);
lv_obj_remove_style_all(cont1);
lv_obj_clear_flag(cont1, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_scrollbar_mode(cont1, LV_SCROLLBAR_MODE_OFF);
//lv_obj_set_size(cont1,LV_PCT(100),LV_PCT(100));
lv_obj_set_style_bg_color(cont1,lv_color_black(),0);
lv_obj_set_size(cont1,LV_SIZE_CONTENT,LV_SIZE_CONTENT);
lv_obj_align(cont1,LV_ALIGN_TOP_LEFT,x,y);
lv_obj_t *old_obj = NULL;
for (uint8_t i = 0; i < img_num; i++)
{
lv_obj_t *img1 = lv_img_create(cont1);
lv_img_set_src(img1,src[start+i]);
if(i == 0)
lv_obj_set_pos(img1,0,0);
else
lv_obj_align_to(img1,old_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);
old_obj = img1;
}
lv_obj_clear_flag(cont1,LV_OBJ_FLAG_CLICKABLE);
}
lv_obj_t* lv_img_big_create(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start)
{
lv_obj_t *cont1 = lv_obj_create(parent);
lv_obj_remove_style_all(cont1);
lv_obj_clear_flag(cont1, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_scrollbar_mode(cont1, LV_SCROLLBAR_MODE_OFF);
//lv_obj_set_size(cont1,LV_PCT(100),LV_PCT(100));
lv_obj_set_style_bg_color(cont1,lv_color_black(),0);
lv_obj_set_size(cont1,LV_SIZE_CONTENT,LV_SIZE_CONTENT);
//lv_obj_align(cont1,LV_ALIGN_TOP_LEFT,x,y);
lv_obj_t *old_obj = NULL;
for(uint8_t i = 0; i < img_num; i++)
{
lv_obj_t *img1 = lv_img_create(cont1);
lv_img_set_src(img1,src[start+i]);
if(i == 0)
lv_obj_set_pos(img1,0,0);
else
lv_obj_align_to(img1,old_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);
old_obj = img1;
}
return cont1;
}
void refresh_timer_cb(lv_timer_t *t)
{
// lv_obj_t *parent = t->user_data;
// if(!lv_obj_is_valid(parent))
// return;
// if(++background_sw>100)
// {
// background_sw = 0;
// background_style^=1;
// lv_timer_del(refresh_timer);
// refresh_timer = NULL;
// lv_obj_clean(parent);
// fr_lv_instrument_panel_func(parent,NULL);
// return;
// }
// lv_obj_t *left_img = lv_obj_get_child(parent,1);
// lv_obj_t *right_img = lv_obj_get_child(parent,2);
// lv_obj_t *odb_lab = lv_obj_get_child(parent,6);
// lv_obj_t *trip_lab = lv_obj_get_child(parent,7);
// lv_obj_t *wiper_img = lv_obj_get_child(parent,3);//5
// lv_obj_t *led_ico1_img = lv_obj_get_child(parent,4);//6
// lv_obj_t *led_ico2_img = lv_obj_get_child(parent,5);//7
// lv_obj_t * hand_img = lv_obj_get_child(parent, lv_obj_get_child_cnt(parent)-4);
// lv_obj_t *speed_lab = lv_obj_get_child(parent,lv_obj_get_child_cnt(parent)-2);
// lv_obj_t *right_slider_battery = lv_obj_get_child(parent,10);//10
// lv_obj_t *left_slider_battery = lv_obj_get_child(parent,11);//11
// lv_img_set_angle(hand_img,speed_angle);
// speed_angle+=100;
// if(speed_angle>4800)
// speed_angle=2400;
// if(!dir_sw_flags)
// {
// lv_img_set_src(left_img,left_img_src[1]);
// lv_img_set_src(right_img,right_img_src[0]);
// lv_obj_add_flag(wiper_img,LV_OBJ_FLAG_HIDDEN);
// lv_obj_clear_flag(led_ico1_img,LV_OBJ_FLAG_HIDDEN);
// lv_obj_add_flag(led_ico2_img,LV_OBJ_FLAG_HIDDEN);
// }else{
// lv_img_set_src(left_img,left_img_src[0]);
// lv_img_set_src(right_img,right_img_src[1]);
// lv_obj_clear_flag(wiper_img,LV_OBJ_FLAG_HIDDEN);
// lv_obj_add_flag(led_ico1_img,LV_OBJ_FLAG_HIDDEN);
// lv_obj_clear_flag(led_ico2_img,LV_OBJ_FLAG_HIDDEN);
// }
// if(++dir_cnt>15)
// {
// dir_cnt = 0;
// dir_sw_flags^=1;
// odb_val++;
// trip_val++;
// }
// lv_label_set_text_fmt(speed_lab,"%d",speed_val);
// lv_label_set_text_fmt(odb_lab,"%d",odb_val);
// lv_label_set_text_fmt(trip_lab,"%d",trip_val);
// lv_slider_set_value(left_slider_battery, left_battery_val, LV_ANIM_OFF);
// lv_slider_set_value(right_slider_battery, right_battery_val, LV_ANIM_OFF);
// lv_label_set_text_fmt(lv_obj_get_child(parent,13),"%d%%",(int)right_battery_val);
// lv_label_set_text_fmt(lv_obj_get_child(parent,12),"%d%%",(int)left_battery_val);
// left_battery_val+=5;
// left_battery_val%=100;
// right_battery_val+=5;
// right_battery_val%=100;
// //speed_val++;
// //speed_val%=100;
// speed_val = ((speed_angle-2400)*1.2)/24;
}
static inline lv_color_t get_label_color(void)
{
if(background_style==0)
{
return lv_color_hex(0xffffff);
}
else{
return lv_color_hex(0x00);
}
}
#define M_PI 3.14
static int center_x = 242, center_y = 119;
static int radius = 51;
static double start_angle = 0;
static double end_angle = 0;
static float progress =0.0;
#define TEST_FUN 0
void move_arrow_task_cb(lv_timer_t *t) {
start_angle = atan2(center_y - 143, 199 - center_x) * 180 / M_PI;
end_angle = atan2(center_y - 143, 284 - center_x) * 180 / M_PI;
lv_obj_t *parent = t->user_data;
if(!lv_obj_is_valid(parent))
return;
//current_angle-=1;
int current_angle = start_angle - progress * (start_angle + 390);
int x = center_x + radius * cos(current_angle * M_PI / 180.0);
int y = center_y - radius * sin(current_angle * M_PI / 180.0);
lv_obj_t *arrow = lv_obj_get_child(parent, 4);
lv_obj_set_pos(arrow, x, y);
printf("current_angle:%d x:%d y:%d\r\n",current_angle,x,y);
progress += 0.01;
if (progress > 1.0) {
progress = 0.0;
}
}
static void slider1_change_cb(lv_event_t *e)
{
lv_obj_t *slider = lv_event_get_target(e);
lv_event_code_t event = lv_event_get_code(e);
lv_obj_t *label = e->user_data;
if(!lv_obj_is_valid(slider)||!lv_obj_is_valid(label))
return;
if(event == LV_EVENT_VALUE_CHANGED)
{
lv_label_set_text_fmt(label,"%d%%",(int)lv_slider_get_value(slider));
printf("event_slider:%d \n", (int)lv_slider_get_value(slider));
}
}
static void slider2_change_cb(lv_event_t *e)
{
lv_obj_t *slider = lv_event_get_target(e);
lv_event_code_t event = lv_event_get_code(e);
lv_obj_t *label = e->user_data;
if(!lv_obj_is_valid(slider)||!lv_obj_is_valid(label))
return;
if(event == LV_EVENT_VALUE_CHANGED)
{
lv_label_set_text_fmt(label,"%d%%",(int)lv_slider_get_value(slider));
printf("event_slider:%d \n", (int)lv_slider_get_value(slider));
}
}
#if 1
LV_IMG_DECLARE(batt_full_gren);
LV_IMG_DECLARE(batt_full_yellow);
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo1_src[5] =
{
/*IMG_DM1_BG_1,
IMG_DM1_BG_2,
IMG_DM1_BG_3,
IMG_DM1_BG_4,
IMG_DM1_BG_5,*/
};
//LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* arc_test_src[4] =
//{
//IMG_SPEED_ARC_1,
//IMG_SPEED_ARC_2,
//IMG_SPEED_ARC_3,
//};
void fr_lv_instrument_panel_func(lv_obj_t *parent, lv_point_t *top)
{
printf("fr_lv_instrument_panel_func start .\r\n");
if(!lv_obj_is_valid(parent))
return;
UI_PARENT_INIT(parent);
if(background_style==0)
{
lv_obj_t* panel_bg_img = lv_img_big_create(parent,panel_demo1_src,0,0,5,0);//0
}
else{
lv_obj_t* panel_bg_img = lv_img_big_create(parent,panel_demo1_src,0,0,5,0);//0
}
printf("fr_lv_instrument_panel_func ok .\r\n");
}
#else
void fr_lv_instrument_panel_func(lv_obj_t *parent, lv_point_t *top)
{
//start_angle = -atan2(143 - center_y, 199 - center_x) * 180 / M_PI + 360; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
// end_angle = -atan2(143 - center_y, 284 - center_x) * 180 / M_PI + 360; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
//start_angle = -atan2(143 - center_y, 199 - center_x) * 180 / M_PI + 360; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
//end_angle = -atan2(143 - center_y, 284 - center_x) * 180 / M_PI + 360; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
start_angle = atan2(center_y - 143, 199 - center_x) * 180 / M_PI; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
end_angle = atan2(center_y - 143, 284 - center_x) * 180 / M_PI; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
start_angle = -150;
// start_angle = atan2(143 - center_y, 199 - center_x) * 180 / M_PI; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
// end_angle = atan2(143 - center_y, 284 - center_x) * 180 / M_PI; // <20>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
// if (start_angle < 0) start_angle += 360;
// if (end_angle < 0) end_angle += 360;
printf("<EFBFBD><EFBFBD>ʼ<EFBFBD>Ƕȣ<EFBFBD>%lf <20><>\n", start_angle);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕȣ<EFBFBD>%lf <20><>\n", end_angle);
if(!lv_obj_is_valid(parent))
return;
UI_PARENT_INIT(parent);
if(background_style==0)
{
lv_obj_t* panel_bg_img = lv_img_big_create(parent,panel_bg1_src,0,0,5,0);//0
}
else{
lv_obj_t* panel_bg_img = lv_img_big_create(parent,panel_bg2_src,0,0,5,0);//0
}
lv_obj_t *left_img = lv_img_create(parent);//1
lv_img_set_src(left_img,left_img_src[1]);
lv_obj_align(left_img,LV_ALIGN_TOP_LEFT,50,10);
lv_obj_t *right_img = lv_img_create(parent);//2
lv_img_set_src(right_img,right_img_src[1]);
lv_obj_align(right_img,LV_ALIGN_TOP_RIGHT,-50,10);
lv_obj_t * speed_lab= lv_label_create(parent);//3
lv_obj_set_style_text_color(speed_lab,lv_color_make(216,38,44),0);
lv_obj_set_style_text_font(speed_lab,LV_FONT_BIG_NUMBER_44PX,0);
lv_obj_align(speed_lab,LV_ALIGN_CENTER, 0, -20);
lv_label_set_text_fmt(speed_lab,"%d",100);
#if(TEST_FUN==1)
lv_obj_t *dot_obj = lv_btn_create(parent);
lv_obj_set_size(dot_obj,3,3);
lv_obj_set_style_pad_all(dot_obj,0,0);
lv_obj_set_style_radius(dot_obj,1,0);
lv_obj_set_style_bg_color(dot_obj,lv_color_make(0xff, 0, 0),0);
lv_obj_set_pos(dot_obj,197,145);
#else
lv_obj_t *arrows_img = lv_img_create(parent);//4
lv_img_set_src(arrows_img,IMG_INSTRUMENT_ICO8);
lv_obj_set_pos(arrows_img,197,145);
//lv_img_set_pivot(arrows_img, 50, 15);
lv_timer_create(move_arrow_task_cb,100,parent);
#endif
lv_obj_t *wiper_img = lv_img_create(parent);//5
lv_img_set_src(wiper_img,IMG_INSTRUMENT_ICO3);
lv_obj_align_to(wiper_img,left_img,LV_ALIGN_OUT_RIGHT_MID,20,0);
lv_obj_t *led_ico1_img = lv_img_create(parent);//6
lv_img_set_src(led_ico1_img,IMG_INSTRUMENT_ICO11);
lv_obj_align_to(led_ico1_img,right_img,LV_ALIGN_OUT_LEFT_MID,-10,0);
lv_obj_t *led_ico2_img = lv_img_create(parent);//7
lv_img_set_src(led_ico2_img,IMG_INSTRUMENT_ICO7);
lv_obj_align_to(led_ico2_img,led_ico1_img,LV_ALIGN_OUT_LEFT_MID,-10,0);
lv_obj_t * trip_lab = lv_label_create(parent);//8
lv_obj_set_style_text_color(trip_lab,get_label_color(),0);
lv_obj_set_style_text_font(trip_lab,LV_FONT_SMALL_NUMBER_20PX,0);
lv_obj_align(trip_lab, LV_ALIGN_BOTTOM_MID, 140, -10);
lv_label_set_text_fmt(trip_lab,"%d",trip_val);
lv_obj_t * odb_lab = lv_label_create(parent);//9
lv_obj_set_style_text_color(odb_lab,get_label_color(),0);
lv_obj_set_style_text_font(odb_lab,LV_FONT_SMALL_NUMBER_20PX,0);
lv_obj_align(odb_lab, LV_ALIGN_BOTTOM_LEFT, 110, -10);
lv_label_set_text_fmt(odb_lab,"%d",odb_val);
lv_obj_t * sta_lab = lv_label_create(parent);//10
lv_obj_set_style_text_color(sta_lab,lv_color_make(11,250,73),0);
lv_obj_set_style_text_font(sta_lab,LV_FONT_MEDIUM_NUMBER_36PX,0);
lv_obj_align(sta_lab, LV_ALIGN_CENTER, 0, 55);
lv_label_set_text(sta_lab,"R");
lv_obj_t * ecu_label = lv_label_create(parent);//10
lv_obj_set_style_text_color(ecu_label,lv_color_hex(0x00ff00),0);
lv_obj_set_style_text_font(ecu_label,LV_FONT_SMALL_NUMBER_20PX,0);
lv_obj_align(ecu_label, LV_ALIGN_BOTTOM_LEFT, 10, -10);
lv_label_set_text(ecu_label,"ECU");
lv_obj_t * odb_label = lv_label_create(parent);//11
lv_obj_set_style_text_color(odb_label,get_label_color(),0);
lv_obj_set_style_text_font(odb_label,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align_to(odb_label,ecu_label, LV_ALIGN_OUT_RIGHT_BOTTOM, 10, 0);
lv_label_set_text(odb_label,"ODB");
lv_obj_t * ready_label = lv_label_create(parent);//12
lv_obj_set_style_text_color(ready_label,lv_color_hex(0x00ff00),0);
lv_obj_set_style_text_font(ready_label,LV_FONT_SMALL_NUMBER_20PX,0);
lv_obj_align(ready_label, LV_ALIGN_BOTTOM_MID, 0, -15);
lv_label_set_text(ready_label,"READY");
lv_obj_t * trip_label = lv_label_create(parent);//
lv_obj_set_style_text_color(trip_label,get_label_color(),0);
lv_obj_set_style_text_font(trip_label,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align(trip_label, LV_ALIGN_BOTTOM_MID, 80, -10);
lv_label_set_text(trip_label,"TRIP");
lv_obj_t * trip_uint = lv_label_create(parent);//
lv_obj_set_style_text_color(trip_uint,get_label_color(),0);
lv_obj_set_style_text_font(trip_uint,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align_to(trip_uint,trip_lab, LV_ALIGN_OUT_RIGHT_BOTTOM, 10, -2);
lv_label_set_text(trip_uint,"KM");
lv_obj_t * odb_uint = lv_label_create(parent);//
lv_obj_set_style_text_color(odb_uint,get_label_color(),0);
lv_obj_set_style_text_font(odb_uint,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align_to(odb_uint,odb_lab, LV_ALIGN_OUT_RIGHT_BOTTOM, 15, -2);
lv_label_set_text(odb_uint,"KM");
lv_obj_t *left_batt_img = lv_img_create(parent);
lv_img_set_src(left_batt_img,batt_black_img_src[2]);
lv_obj_align(left_batt_img,LV_ALIGN_LEFT_MID,55,0);
lv_obj_t *right_batt_img = lv_img_create(parent);
lv_img_set_src(right_batt_img,batt_black_img_src[3]);
lv_obj_align(right_batt_img,LV_ALIGN_RIGHT_MID,-55,0);
lv_obj_t * left_batt_val = lv_label_create(parent);//
lv_obj_set_style_text_color(left_batt_val,lv_color_make(250,198,13),0);
lv_obj_set_style_text_font(left_batt_val,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align_to(left_batt_val, left_batt_img,LV_ALIGN_OUT_BOTTOM_MID, 0, 5);
lv_label_set_text_fmt(left_batt_val,"%d%%",50);
lv_obj_t * right_batt_val = lv_label_create(parent);//
lv_obj_set_style_text_color(right_batt_val,lv_color_make(8,255,74),0);
lv_obj_set_style_text_font(right_batt_val,LV_FONT_SMALL_NUMBER_16PX,0);
lv_obj_align_to(right_batt_val, right_batt_img,LV_ALIGN_OUT_BOTTOM_MID, 0, 5);
lv_label_set_text_fmt(right_batt_val,"%d%%",90);
lv_obj_t * left_batt_lab = lv_label_create(parent);//
lv_obj_set_style_text_color(left_batt_lab,lv_color_make(137,137,137),0);
lv_obj_set_style_text_font(left_batt_lab,LV_FONT_SMALL_NUMBER_12PX,0);
lv_obj_align_to(left_batt_lab, left_batt_img,LV_ALIGN_OUT_TOP_MID, 0, -5);
lv_label_set_text(left_batt_lab,"BAT1");
lv_obj_t * right_batt_lab= lv_label_create(parent);//
lv_obj_set_style_text_color(right_batt_lab,lv_color_make(137,137,137),0);
lv_obj_set_style_text_font(right_batt_lab,LV_FONT_SMALL_NUMBER_12PX,0);
lv_obj_align_to(right_batt_lab, right_batt_img,LV_ALIGN_OUT_TOP_MID, 0, -5);
lv_label_set_text(right_batt_lab,"BAT2");
// lv_obj_t * arc = lv_arc_create(parent);//<2F><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// lv_obj_set_size(arc,105,105);
// lv_arc_set_rotation(arc,0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// lv_arc_set_bg_angles(arc,0,360); //<2F><><EFBFBD>ýǶ<C3BD>
// lv_arc_set_range(arc,0,270);
// lv_arc_set_change_rate(arc,1);
// lv_obj_set_style_arc_width(arc, 2, LV_PART_MAIN); // <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>״̬<D7B4>µĿ<C2B5><C4BF><EFBFBD>
// lv_obj_set_style_arc_color(arc, lv_color_make(0,0,255), LV_PART_MAIN);
// lv_obj_remove_style(arc,NULL,LV_PART_KNOB); //<2F>Ƴ<EFBFBD><C6B3><EFBFBD>ʽ
// lv_obj_clear_flag(arc,LV_OBJ_FLAG_CLICKABLE);//<2F><><EFBFBD><EFBFBD><EFBFBD>־λ
// lv_obj_align(arc,LV_ALIGN_CENTER,0,-18);
lv_obj_t *left_ico1 = lv_img_create(parent);
lv_img_set_src(left_ico1,IMG_INSTRUMENT_ICO1);
lv_obj_align(left_ico1,LV_ALIGN_LEFT_MID,100,-25);
lv_obj_t *left_ico2 = lv_img_create(parent);
lv_img_set_src(left_ico2,IMG_INSTRUMENT_ICO5);
lv_obj_align_to(left_ico2,left_ico1,LV_ALIGN_OUT_BOTTOM_MID,0,10);
lv_obj_t *left_ico3 = lv_img_create(parent);
lv_img_set_src(left_ico3,IMG_INSTRUMENT_ICO2);
lv_obj_align_to(left_ico3,left_ico2,LV_ALIGN_OUT_BOTTOM_MID,0,10);
lv_obj_t *right_ico1 = lv_img_create(parent);
lv_img_set_src(right_ico1,IMG_INSTRUMENT_ICO6);
lv_obj_align(right_ico1,LV_ALIGN_RIGHT_MID,-100,-25);
lv_obj_t *right_ico2 = lv_img_create(parent);
lv_img_set_src(right_ico2,IMG_INSTRUMENT_ICO12);
lv_obj_align_to(right_ico2,right_ico1,LV_ALIGN_OUT_BOTTOM_MID,0,10);
lv_obj_t *right_ico3 = lv_img_create(parent);
lv_img_set_src(right_ico3,IMG_INSTRUMENT_ICO4);
lv_obj_align_to(right_ico3,right_ico2,LV_ALIGN_OUT_BOTTOM_MID,0,10);
// refresh_timer = lv_timer_create(refresh_timer_cb,20,parent);
}
#endif

View File

@ -0,0 +1,665 @@
#include "lvgl.h"
#include "fr_lv_public_func.h"
const lv_img_dsc_t* switch_ico_img[2] =
{
IMG_SWITCH_OFF_ICO,
IMG_SWITCH_ON_ICO,
};
// const uint16_t format_12hour_str[2]=
// {
// STR_ID_AM,
// STR_ID_PM,
// };
const uint16_t week_str[7]= //周日->周一
{
STR_ID_SUM,
STR_ID_MON,
STR_ID_TUE,
STR_ID_WED,
STR_ID_THU,
STR_ID_FRI,
STR_ID_SAT,
};
const lv_img_dsc_t* exercise_type_img[115] =
{
IMG_EXERCISE_SMALL_001_OUTDOOR_RUNNING ,
IMG_EXERCISE_SMALL_002_OUTDOOR_CYCLING ,
IMG_EXERCISE_SMALL_003_SKIPPING ,
IMG_EXERCISE_SMALL_004_SWIMMING ,
IMG_EXERCISE_SMALL_005_BADMINTON ,
IMG_EXERCISE_SMALL_006_TABLE_TENNIS ,
IMG_EXERCISE_SMALL_007_TENNIS ,
IMG_EXERCISE_SMALL_008_CLIMBING ,
IMG_EXERCISE_SMALL_009_HIKING ,
IMG_EXERCISE_SMALL_010_BASKETBALL ,
IMG_EXERCISE_SMALL_011_SOCCER ,
IMG_EXERCISE_SMALL_012_BASEBALL ,
IMG_EXERCISE_SMALL_013_VOLLEYBALL ,
IMG_EXERCISE_SMALL_014_CRICKET ,
IMG_EXERCISE_SMALL_015_RUGBY ,
IMG_EXERCISE_SMALL_016_HOCKEY ,
IMG_EXERCISE_SMALL_017_DANCE ,
IMG_EXERCISE_SMALL_018_INDOOR_CYCLING ,
IMG_EXERCISE_SMALL_019_YOGA ,
IMG_EXERCISE_SMALL_020_SIT_UPS ,
IMG_EXERCISE_SMALL_021_TREADMILL ,
IMG_EXERCISE_SMALL_022_GYMNASTICS ,
IMG_EXERCISE_SMALL_023_ROWING ,
IMG_EXERCISE_SMALL_024_JUMPING_JACK ,
IMG_EXERCISE_SMALL_025_FREE_TRAINING ,
IMG_EXERCISE_SMALL_026_OUTDOOR_WALKING ,
IMG_EXERCISE_SMALL_027_INDOOR_RUN ,
IMG_EXERCISE_SMALL_028_STRENGTH_TRAINING ,
IMG_EXERCISE_SMALL_029_STEPPING ,
IMG_EXERCISE_SMALL_030_HORSE_RIDING ,
IMG_EXERCISE_SMALL_031_ELLIPTICAL_TRAINER ,
IMG_EXERCISE_SMALL_032_TAI_CHI ,
IMG_EXERCISE_SMALL_033_SHUTTLECOCK ,
IMG_EXERCISE_SMALL_034_BOXING ,
IMG_EXERCISE_SMALL_035_OUTDOOR_WALK ,
IMG_EXERCISE_SMALL_036_CROSS_COUNTRY_RUNNING ,
IMG_EXERCISE_SMALL_037_SKIING ,
IMG_EXERCISE_SMALL_038_ICE_HOCKEY ,
IMG_EXERCISE_SMALL_039_TAEKWONDO ,
IMG_EXERCISE_SMALL_040_VO2MAX_TEST ,
IMG_EXERCISE_SMALL_041_ROWING_MACHING ,
IMG_EXERCISE_SMALL_042_STROLLER ,
IMG_EXERCISE_SMALL_043_ATHLETICS ,// 占位 复用图标代替
IMG_EXERCISE_SMALL_043_ATHLETICS ,
IMG_EXERCISE_SMALL_044_WAIST_AND_ABDOMINAL_TRAINING,
IMG_EXERCISE_SMALL_045_KARATE ,
IMG_EXERCISE_SMALL_046_RELAXATION ,
IMG_EXERCISE_SMALL_047_CROSS_TRAINING ,
IMG_EXERCISE_SMALL_048_PILATES ,
IMG_EXERCISE_SMALL_049_CROSS_FIT ,
IMG_EXERCISE_SMALL_050_FUNCTIONAL_TRAINING ,
IMG_EXERCISE_SMALL_051_PHYSICAL_TRAINING ,
IMG_EXERCISE_SMALL_052_ARCHERY ,
IMG_EXERCISE_SMALL_053_FLEXIBILITY ,
IMG_EXERCISE_SMALL_054_MIXED_AEROBIC ,
IMG_EXERCISE_SMALL_055_LATIN_DANCE ,
IMG_EXERCISE_SMALL_056_STREET_DANCE ,
IMG_EXERCISE_SMALL_057_FREE_BOXING ,
IMG_EXERCISE_SMALL_058_BALLET ,
IMG_EXERCISE_SMALL_059_AUSTRALIAN_SOCCER ,
IMG_EXERCISE_SMALL_060_MARTIAL_ARTS ,
IMG_EXERCISE_SMALL_061_STAIR_CLIMBING ,
IMG_EXERCISE_SMALL_062_HANDBALL ,
IMG_EXERCISE_SMALL_063_BOWLING ,
IMG_EXERCISE_SMALL_064_SQUASH ,
IMG_EXERCISE_SMALL_065_CURLING ,
IMG_EXERCISE_SMALL_066_HUNTING ,
IMG_EXERCISE_SMALL_067_SNOWBOARDING ,
IMG_EXERCISE_SMALL_068_LEISURE_SPORTS ,
IMG_EXERCISE_SMALL_069_AMERICAN_FOOTBALL ,
IMG_EXERCISE_SMALL_070_HAND_CYCLING ,
IMG_EXERCISE_SMALL_071_FISHING ,
IMG_EXERCISE_SMALL_072_FRISBEE ,
IMG_EXERCISE_SMALL_072_FRISBEE , //占位 复用图标代替
IMG_EXERCISE_SMALL_073_GOLF ,
IMG_EXERCISE_SMALL_074_FOLK_DANCE ,
IMG_EXERCISE_SMALL_075_DOWNHILL_SKIING ,
IMG_EXERCISE_SMALL_076_SNOW_SPORTS ,
IMG_EXERCISE_SMALL_077_CLAM_MEDIATION_SPORTS ,
IMG_EXERCISE_SMALL_078_CORE_TRAINING ,
IMG_EXERCISE_SMALL_079_ICE_SKATING ,
IMG_EXERCISE_SMALL_080_FITNESS_GAMES ,
IMG_EXERCISE_SMALL_081_GYMNASTICS ,
IMG_EXERCISE_SMALL_082_GROUP_TRAINING ,
IMG_EXERCISE_SMALL_083_KICKBOXING ,
IMG_EXERCISE_SMALL_084_LACROSSE ,
IMG_EXERCISE_SMALL_085_FOAM_ROLLING ,
IMG_EXERCISE_SMALL_086_WRESTLING ,
IMG_EXERCISE_SMALL_087_FENCING ,
IMG_EXERCISE_SMALL_088_SOFTBALL ,
IMG_EXERCISE_SMALL_089_SINGLE_BAR ,
IMG_EXERCISE_SMALL_090_PARALLEL_BARS ,
IMG_EXERCISE_SMALL_091_ROLLER_SKATING ,
IMG_EXERCISE_SMALL_092_HULA_HOOP ,
IMG_EXERCISE_SMALL_093_DARTS ,
IMG_EXERCISE_SMALL_094_PICKLEBALL ,
IMG_EXERCISE_SMALL_095_HIIT ,
IMG_EXERCISE_SMALL_096_SHOOTING ,
IMG_EXERCISE_SMALL_097_JUDO ,
IMG_EXERCISE_SMALL_098_TRAMPOLINE ,
IMG_EXERCISE_SMALL_099_SKATEBOARDING ,
IMG_EXERCISE_SMALL_100_HOVERBOARD ,
IMG_EXERCISE_SMALL_101_BLADING ,
IMG_EXERCISE_SMALL_102_PARKOUR ,
IMG_EXERCISE_SMALL_103_DIVING ,
IMG_EXERCISE_SMALL_104_SURFING ,
IMG_EXERCISE_SMALL_105_SNORKELING ,
IMG_EXERCISE_SMALL_106_PULL_UPS ,
IMG_EXERCISE_SMALL_107_PUSH_UPS ,
IMG_EXERCISE_SMALL_108_PLANKING ,
IMG_EXERCISE_SMALL_109_ROCK_CLIMBING ,
IMG_EXERCISE_SMALL_110_HIGH_JUMP ,
IMG_EXERCISE_SMALL_111_BUNGEE_JUMP ,
IMG_EXERCISE_SMALL_112_LONG_JUMP ,
IMG_EXERCISE_SMALL_113_MARATHON ,
};
const uint16_t exercise_type_str[115] =
{
STR_ID_OUTDOOR_RUN ,
STR_ID_OUTDOOR_CYCLE ,
STR_ID_JUMP_ROPE ,
STR_ID_SWIM ,
STR_ID_BADMINTON ,
STR_ID_TABLE_TENNIS ,
STR_ID_TENNIS ,
STR_ID_MOUNTAINEERING ,
STR_ID_HIKING ,
STR_ID_BASKETBALL ,
STR_ID_FOOTBALL ,
STR_ID_BASEBALL ,
STR_ID_VOLLEYBALL ,
STR_ID_CRICKET ,
STR_ID_RUGBY ,
STR_ID_HOCKEY ,
STR_ID_DANCE ,
STR_ID_INDOOR_CYCLE ,
STR_ID_YOGA ,
STR_ID_SIT_UP ,
STR_ID_TREADMILL ,
STR_ID_GYMNASTICS ,
STR_ID_BOATING ,
STR_ID_JUMPING_JACK ,
STR_ID_FREE_TRAINING ,
STR_ID_OUTDOOR_WALK ,
STR_ID_INDOOR_RUN ,
STR_ID_STRENGTH_TRAINING ,
STR_ID_STEP_TRAINING ,
STR_ID_HORSE_RIDING ,
STR_ID_ELLIPTICAL_TRAINER ,
STR_ID_TAI_CHI ,
STR_ID_SHUTTLECOCK ,
STR_ID_BOXING ,
STR_ID_INDOOR_WALK ,
STR_ID_TRAIL_RUNNING ,
STR_ID_SKIING ,
STR_ID_ICE_HOCKEY ,
STR_ID_TAEKWONDO ,
STR_ID_VO2MAX_TEST ,
STR_ID_ROWING_MACHING ,
STR_ID_AIR_WALKER ,
STR_ID_HIKING ,
STR_ID_ATHLETICS ,
STR_ID_WAIST_TRAINING ,
STR_ID_KARATE ,
STR_ID_COOLDOWN ,
STR_ID_CROSS_TRAINING ,
STR_ID_PILATES ,
STR_ID_CROSS_FIT ,
STR_ID_FUNCTIONAL_TRAINING ,
STR_ID_PHYSICAL_TRAINING ,
STR_ID_ARCHERY ,
STR_ID_FLEXIBILITY ,
STR_ID_MIXED_CARDIO ,
STR_ID_LATIN_DANCE ,
STR_ID_STREET_DANCE ,
STR_ID_KICKBOXING ,
STR_ID_BALLET ,
STR_ID_AUSTRALIAN_FOOTBALL ,
STR_ID_MARTIAL_ARTS ,
STR_ID_STAIRS ,
STR_ID_HANDBALL ,
STR_ID_BOWLING ,
STR_ID_RACQUETBALL ,
STR_ID_CURLING ,
STR_ID_HUNTING ,
STR_ID_SNOWBOARDING ,
STR_ID_PLAY ,
STR_ID_AMERICAN_FOOTBALL ,
STR_ID_HAND_CYCLING ,
STR_ID_FISHING ,
STR_ID_DISC_SPORTS ,
STR_ID_RUGBY ,
STR_ID_GOLF ,
STR_ID_FOLK_DANCE ,
STR_ID_DOWNHILL_SKIING ,
STR_ID_SNOW_SPORTS ,
STR_ID_MIND_AND_BODY ,
STR_ID_CORE_TRAINING ,
STR_ID_SKATING ,
STR_ID_FITNESS_GAMING ,
STR_ID_AEROBICS ,
STR_ID_GROUP_TRAINING ,
STR_ID_KENDO ,
STR_ID_LACROSSE ,
STR_ID_ROLLING ,
STR_ID_WRESTLING ,
STR_ID_FENCING ,
STR_ID_SOFTBALL ,
STR_ID_SINGLE_BAR ,
STR_ID_PARALLEL_BARS ,
STR_ID_ROLLER_SKATING ,
STR_ID_HULA_HOOP ,
STR_ID_DARTS ,
STR_ID_PICKLEBALL ,
STR_ID_HIIT ,
STR_ID_SHOOTING ,
STR_ID_JUDO ,
STR_ID_TRAMPOLINE ,
STR_ID_SKATEBOARD ,
STR_ID_HOVERBOARD ,
STR_ID_BLADING ,
STR_ID_PARKOUR ,
STR_ID_DIVING ,
STR_ID_SURFING ,
STR_ID_SNORKELING ,
STR_ID_PULL_UP ,
STR_ID_PUSH_UP ,
STR_ID_PLANKING ,
STR_ID_ROCK_CLIMBING ,
STR_ID_HIGHT_JUMP ,
STR_ID_BUNGEE_JUMPING ,
STR_ID_LONG_JUMP ,
STR_ID_MARATHON ,
};
const uint16_t measure_text_str[3]=
{
STR_ID_START_MEASURING,
STR_ID_MEASURING,
STR_ID_MEASURE_AGAIN,
};
void lv_img_big_disp(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start)
{
lv_obj_t *cont1 = lv_obj_create(parent);
lv_obj_remove_style_all(cont1);
lv_obj_clear_flag(cont1, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_scrollbar_mode(cont1, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_style_bg_color(cont1,lv_color_black(),0);
//lv_obj_set_size(cont1,LV_PCT(100),LV_PCT(100));
lv_obj_set_size(cont1,LV_SIZE_CONTENT,LV_SIZE_CONTENT);
lv_obj_align(cont1,LV_ALIGN_TOP_LEFT,x,y);
lv_obj_t *old_obj = NULL;
for (uint8_t i = 0; i < img_num; i++)
{
lv_obj_t *img1 = lv_img_create(cont1);
lv_img_set_src(img1,src[start+i]);
if(i == 0)
lv_obj_set_pos(img1,0,0);
else
lv_obj_align_to(img1,old_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);
old_obj = img1;
}
//lv_obj_clear_flag(cont1,LV_OBJ_FLAG_CLICKABLE);
}
lv_obj_t* lv_img_big_create(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start)
{
lv_obj_t *cont1 = lv_obj_create(parent);
lv_obj_remove_style_all(cont1);
lv_obj_clear_flag(cont1, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_scrollbar_mode(cont1, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_size(cont1,LV_SIZE_CONTENT,LV_SIZE_CONTENT);
//lv_obj_align(cont1,LV_ALIGN_TOP_LEFT,x,y);
lv_obj_t *old_obj = NULL;
for(uint8_t i = 0; i < img_num; i++)
{
lv_obj_t *img1 = lv_img_create(cont1);
lv_img_set_src(img1,src[start+i]);
if(i == 0)
lv_obj_set_pos(img1,0,0);
else
lv_obj_align_to(img1,old_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);
old_obj = img1;
}
//lv_obj_clear_flag(cont1,LV_OBJ_FLAG_CLICKABLE);
return cont1;
}
lv_obj_t* lv_title_text_create(lv_obj_t* parent ,const char *str,lv_color_t value, uint8_t hour,uint8_t minute)
{
lv_obj_t *cont1 = lv_obj_create(parent);
lv_obj_remove_style_all(cont1);
lv_obj_set_size(cont1,LV_PCT(100),50);
lv_obj_t* title_label = lv_label_create(cont1);
lv_label_set_text_fmt(title_label,"%s",str);
lv_obj_set_style_text_font (title_label, LV_FONT_OSD_MEDIUM_32PX, 0);
lv_obj_set_style_text_color (title_label, value,0);
lv_obj_align (title_label, LV_ALIGN_LEFT_MID, 50, 0);
//时间标签
lv_obj_t* top_time = lv_label_create(cont1);
lv_label_set_text_fmt (top_time, "%02d:%02d",hour,minute);
lv_obj_set_style_text_color (top_time, lv_color_hex(0xffffff),0);
lv_obj_set_style_text_font (top_time,LV_FONT_MEDIUM_NUMBER_36PX, 0);
lv_obj_align (top_time, LV_ALIGN_RIGHT_MID, -50, 0);
return cont1;
}
void lv_img_change_big_img_src(lv_obj_t* parent, const lv_img_dsc_t **src ,uint8_t img_num,uint8_t start)
{
for (uint8_t i = 0; i < img_num; i++)
{
lv_obj_t *img1 = lv_obj_get_child(parent,i);
lv_img_set_src(img1,src[start+i]);
}
}
void convertTo12HourFormat(uint8_t *hours, uint8_t *isAM) {
if (*hours == 0) {
*hours = 12;
*isAM = 1;
} else if (*hours == 12) {
*isAM = 0;
} else if (*hours > 12) {
*hours -= 12;
*isAM = 0;
} else {
*isAM = 1;
}
}
uint8_t get_language_id(void)
{
// return 1;
return fr_system_get_language();
}
uint8_t get_system_curr_time_hour(void)
{
//return 12;
return fr_system_get_time_hour();
}
uint8_t get_system_curr_time_min(void)
{
//return 20;
return fr_system_get_time_minute();
}
void roller_mask_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
static int16_t mask_top_id = -1;
static int16_t mask_bottom_id = -1;
if (code == LV_EVENT_COVER_CHECK) {
lv_event_set_cover_res(e, LV_COVER_RES_MASKED);
} else if (code == LV_EVENT_DRAW_MAIN_BEGIN) {
/* add mask */
const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);
lv_coord_t font_h = lv_font_get_line_height(font);
lv_area_t roller_coords;
lv_obj_get_coords(obj, &roller_coords);
lv_area_t rect_area;
rect_area.x1 = roller_coords.x1;
rect_area.x2 = roller_coords.x2;
rect_area.y1 = roller_coords.y1;
rect_area.y2 = roller_coords.y1 + (lv_obj_get_height(obj) - font_h - line_space) / 2;
lv_draw_mask_fade_param_t * fade_mask_top = lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t));
lv_draw_mask_fade_init(fade_mask_top, &rect_area, LV_OPA_TRANSP, rect_area.y1, LV_OPA_COVER, rect_area.y2);
mask_top_id = lv_draw_mask_add(fade_mask_top, NULL);
rect_area.y1 = rect_area.y2 + font_h + line_space - 1;
rect_area.y2 = roller_coords.y2;
lv_draw_mask_fade_param_t * fade_mask_bottom =lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t));
lv_draw_mask_fade_init(fade_mask_bottom, &rect_area, LV_OPA_COVER, rect_area.y1, LV_OPA_TRANSP, rect_area.y2);
mask_bottom_id = lv_draw_mask_add(fade_mask_bottom, NULL);
} else if (code == LV_EVENT_DRAW_POST_END) {
lv_draw_mask_fade_param_t * fade_mask_top = lv_draw_mask_remove_id(mask_top_id);
lv_draw_mask_fade_param_t * fade_mask_bottom = lv_draw_mask_remove_id(mask_bottom_id);
lv_mem_buf_release(fade_mask_top);
lv_mem_buf_release(fade_mask_bottom);
mask_top_id = -1;
mask_bottom_id = -1;
}
}
uint8_t get_time_format_flag(void) //返回时间格式
{
uint8_t time_format_flag =0; //0 24小时制 1 12小时制
return time_format_flag;
}
lv_obj_t * draw_dashed_line(lv_obj_t *parent, lv_coord_t x, lv_coord_t y)
{
static lv_point_t line_points[] ={{0, 2}, {290, 2}};
lv_obj_t *line = lv_line_create(parent);
lv_obj_set_style_line_width(line,1,0);
lv_obj_set_style_line_dash_width(line,4,0);
lv_obj_set_style_line_dash_gap(line, 4,0);
lv_obj_set_pos(line, x, y);
//lv_obj_set_style_border_color(line,lv_color_hex(0x727272),0);
lv_obj_set_style_line_color(line,lv_color_hex(0x727272),0);
lv_line_set_points(line,line_points,2);
return line;
}
//w=368 h=202
lv_obj_t *lv_user_create_chart(lv_obj_t *parent,lv_coord_t x, lv_coord_t y,uint8_t *value,uint32_t *color_buff,uint16_t num)
{
lv_obj_t *obj_cont = lv_obj_create(parent);
lv_obj_set_size(obj_cont,368,202);
lv_obj_set_style_bg_color(obj_cont,lv_color_hex(0x00),0);
lv_obj_set_style_pad_all(obj_cont,0,0);
// lv_obj_set_style_border_width(obj_cont,0,0);
//lv_obj_set_style_border_color(obj_cont,lv_color_hex(0x292929),0);
lv_obj_set_style_border_color(obj_cont,lv_color_black(),0);
lv_obj_set_style_border_width(obj_cont,2,0);
lv_obj_set_scrollbar_mode(obj_cont, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_pos(obj_cont,x,y);
lv_obj_clear_flag(obj_cont,LV_OBJ_FLAG_SCROLLABLE);
static lv_point_t line_points[] ={{0, 20}, {290, 20}};
lv_obj_t * line1;
line1 = lv_line_create(obj_cont);
lv_line_set_points(line1, line_points, 2); /*Set the points*/
lv_obj_set_style_border_color(line1,lv_color_hex(0x666666),0);
lv_obj_align(line1,LV_ALIGN_BOTTOM_LEFT,59,-30);
draw_dashed_line(obj_cont,58,131);//绘制虚线
draw_dashed_line(obj_cont,58,91);
draw_dashed_line(obj_cont,58,51);
draw_dashed_line(obj_cont,58,11);
lv_obj_t *old_obj ;
for(int i = 0; i <num;i++)
{
lv_obj_t *series_obj = lv_obj_create(obj_cont);
lv_obj_set_style_border_color(series_obj,lv_color_hex(color_buff[i]),0);
uint16_t ser_val = (uint16_t)((value[i]*3)/2+3);
lv_obj_set_size(series_obj,8,ser_val);
lv_obj_set_style_pad_all(series_obj,0,0);
lv_obj_set_style_radius(series_obj,5,0);
lv_obj_set_style_bg_color(series_obj,lv_color_hex(color_buff[i]),0);
if(i==0)
{
lv_obj_align_to(series_obj,line1,LV_ALIGN_OUT_LEFT_BOTTOM,10,-1);
}
else{
lv_obj_align_to(series_obj,old_obj,LV_ALIGN_OUT_RIGHT_BOTTOM,4,0);
}
old_obj = series_obj;
//printf("index:%d\r\n",value[i]);
}
lv_obj_t* start_time = lv_label_create(obj_cont);
lv_obj_set_style_text_font(start_time,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(start_time,"%02d:%02d",0,0);
lv_obj_set_style_text_color(start_time, lv_color_hex(0x666666),0);
lv_obj_align(start_time,LV_ALIGN_BOTTOM_LEFT,20,-5);
lv_obj_t* end_time = lv_label_create(obj_cont);
lv_obj_set_style_text_font(end_time,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(end_time,"%02d:%02d",8,0);
lv_obj_set_style_text_color(end_time, lv_color_hex(0x666666),0);
lv_obj_align(end_time,LV_ALIGN_BOTTOM_RIGHT,-20,-5);
lv_obj_t* y_label1 = lv_label_create(obj_cont);
lv_obj_set_style_text_font(y_label1,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(y_label1,"%d",100);
lv_obj_set_style_text_color(y_label1, lv_color_hex(0x666666),0);
lv_obj_align(y_label1,LV_ALIGN_TOP_LEFT,17,2);
lv_obj_t* y_label2 = lv_label_create(obj_cont);
lv_obj_set_style_text_font(y_label2,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(y_label2,"%d",75);
lv_obj_set_style_text_color(y_label2, lv_color_hex(0x666666),0);
lv_obj_align_to(y_label2,y_label1,LV_ALIGN_OUT_BOTTOM_LEFT,0,18);
lv_obj_t* y_label3 = lv_label_create(obj_cont);
lv_obj_set_style_text_font(y_label3,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(y_label3,"%d",50);
lv_obj_set_style_text_color(y_label3, lv_color_hex(0x666666),0);
lv_obj_align_to(y_label3,y_label2,LV_ALIGN_OUT_BOTTOM_LEFT,0,18);
lv_obj_t* y_label4 = lv_label_create(obj_cont);
lv_obj_set_style_text_font(y_label4,LV_FONT_SMALL_NUMBER_20PX,0);
lv_label_set_text_fmt(y_label4,"%d",25);
lv_obj_set_style_text_color(y_label4, lv_color_hex(0x666666),0);
lv_obj_align_to(y_label4,y_label3,LV_ALIGN_OUT_BOTTOM_LEFT,0,18);
return obj_cont;
}
bool lv_ui_node_return_to_prev_node(void)
{
//退到上一级节点
lv_ui_node_t e_cur;
if(!lv_ui_node_pop_ex(&e_cur))
{
return false;
}
lv_refr_now(NULL);
extern uint8_t lv_ui_node_depth(void);
if(lv_ui_node_depth() == 0)
{
extern void lv_ui_node_hor_return_head(lv_obj_t *parent, lv_ui_node_t *e);
lv_ui_node_hor_return_head(prj_prev_cont,&e_cur);
}
else
{
lv_obj_remove_event_cb(prj_prev_cont,NULL);
lv_obj_clean(prj_prev_cont);
lv_ui_node_func(prj_prev_cont,&e_cur);
}
return true;
}
#define ENCODE_OFFSET 120
// int16_t encoder_y_pos;
lv_coord_t top_pos;
static bool setting_timer_flag;
static bool user_click_flag;
static void setting_list_timer_cb(lv_timer_t *t)
{
lv_timer_del(t);
setting_timer_flag = false;
lv_obj_t *obj = t->user_data;
lv_obj_scroll_by(obj, 0, top_pos, LV_ANIM_ON);
}
void fr_lv_encoder_obj_event_cb(lv_event_t *e)
{
lv_obj_t *target = e->target;
lv_event_code_t code = e->code;
uint8_t child_cn = lv_obj_get_child_cnt(target);
if (!lv_obj_is_valid(target))
return;
if(code == LV_EVENT_KEY)
{
uint32_t *key = lv_event_get_param(e);
uint32_t input_key = *key;
// printf("key:%d\r\n",input_key);
lv_coord_t obj_y;
#if 0
if(input_key == 130)
{
lv_obj_t *lastest_child_obj = lv_obj_get_child(target,-1);
obj_y = lv_obj_get_style_y(lastest_child_obj,0)-lv_obj_get_height(lastest_child_obj)*2;
printf("obj_y:%d\r\n",obj_y);
if((encoder_y_pos+ENCODE_OFFSET) < obj_y)
encoder_y_pos += ENCODE_OFFSET;
else
encoder_y_pos = obj_y;
}
else if(input_key == 129)
{
if((encoder_y_pos-ENCODE_OFFSET) > 0)
encoder_y_pos -= ENCODE_OFFSET;
else
encoder_y_pos = 0;
}
#else
if(setting_timer_flag == false)
{
if(input_key == 130)
{
lv_obj_scroll_by(target, 0, ENCODE_OFFSET, LV_ANIM_ON);
user_click_flag = true;
}
else if(input_key == 129)
{
lv_obj_scroll_by(target, 0, -ENCODE_OFFSET, LV_ANIM_ON);
user_click_flag = true;
}
}
#endif
}
else if (code == LV_EVENT_DELETE)
{
lv_group_remove_obj(target);
group_tail_obj = lv_group_get_focused(prj_group);
// printf("list,group remove\r\n");
}
else if(code == LV_EVENT_SCROLL_END)
{
if(user_click_flag == false)
return;
user_click_flag = false;
lv_coord_t top = lv_obj_get_scroll_top(target);
lv_obj_t *obj = lv_obj_get_child(target,-1);
// printf("top:%d\r\n",top);
if(top < 0)
{
// printf("in the top!\r\n");
if(setting_timer_flag == false)
{
top_pos = top;
lv_timer_create(setting_list_timer_cb,100,target);
setting_timer_flag = true;
}
}
else if((obj->coords.y1+lv_obj_get_height(obj)) <= 448)
{
// printf("in the botom\r\n!");
if(setting_timer_flag == false)
{
top_pos = 448 - (obj->coords.y1+lv_obj_get_height(obj));
top_pos -= lv_obj_get_style_pad_bottom(target,0);
lv_timer_create(setting_list_timer_cb,100,target);
setting_timer_flag = true;
}
}
}
}
//uint16_t get_curr_screen_width(void)
//{
// lv_coord_t hor_res = lv_disp_get_hor_res(lv_disp_get_default()); // 获取屏幕宽度
// lv_coord_t ver_res = lv_disp_get_ver_res(lv_disp_get_default()); // 获取屏幕高度
// // 打印屏幕宽度和高度
// printf("Screen width: %d\n", hor_res);
// printf("Screen height: %d\n", ver_res);
//}

View File

@ -0,0 +1,251 @@
#ifndef __FR_LV_PUBLIC_FUNC_H__
#define __FR_LV_PUBLIC_FUNC_H__
#include "img_def.h"
#include "lv_common_function.h"
#include "fr_ui_node.h"
enum
{
Exercise_Type_Outdoor_Running = 0x1 , //户外跑步
Exercise_Type_Outdoor_Cycling = 0x2 , //户外骑行
Exercise_Type_Skipping = 0x3 , //跳绳
Exercise_Type_Swimming = 0x4 , //游泳
Exercise_Type_Badminton = 0x5 , //羽毛球
Exercise_Type_Table_Tennis = 0x6 , //乒乓球
Exercise_Type_Tennis = 0x7 , //网球
Exercise_Type_Climbing = 0x8 , //登山
Exercise_Type_Hiking = 0x9 , //徒步
Exercise_Type_Basketball = 0xa , //篮球
Exercise_Type_Soccer = 0xb , //足球
Exercise_Type_Baseball = 0xc , //棒球
Exercise_Type_Volleyball = 0xd , //排球
Exercise_Type_Cricket = 0xe , //板球
Exercise_Type_Rugby = 0xf , //橄榄球
Exercise_Type_Hockey = 0x10, //曲棍球
Exercise_Type_Dance = 0x11, //舞蹈
Exercise_Type_Indoor_Cycling = 0x12, //室内骑行
Exercise_Type_Yoga = 0x13, //瑜伽
Exercise_Type_Sit_ups = 0x14, //仰卧起坐
Exercise_Type_Treadmill = 0x15, //跑步机
Exercise_Type_Gymnastics = 0x16, //体操
Exercise_Type_Rowing = 0x17, //划船
Exercise_Type_Jumping_Jack = 0x18, //开合跳
Exercise_Type_Free_training = 0x19, //自由训练
Exercise_Type_Outdoor_Walking = 0x1A, //户外健走
Exercise_Type_Indoor_Run = 0x1B, //室内跑步
Exercise_Type_Strength_Training = 0x1C, //力量训练
Exercise_Type_Stepping = 0x1D, //踏步
Exercise_Type_Horse_Riding = 0x1E, //骑马
Exercise_Type_Elliptical_Trainer = 0x1F, //椭圆机
Exercise_Type_Tai_Chi = 0x20, //太极
Exercise_Type_Shuttlecock = 0x21, //毽球
Exercise_Type_Boxing = 0x22, //拳击
Exercise_Type_Outdoor_Walk = 0x23, //室内走路
Exercise_Type_Cross_country_Running = 0x24, //越野跑
Exercise_Type_Skiing = 0x25, //滑雪
Exercise_Type_Ice_Hockey = 0x26, //冰球
Exercise_Type_Taekwondo = 0x27, //跆拳道
Exercise_Type_VO2max_test = 0x28, //最大摄氧量测试
Exercise_Type_Rowing_Maching = 0x29, //划船机
Exercise_Type_Stroller = 0x2A, //漫步机
Exercise_Type_Hiking_Unused = 0x2B, //原本地就有(徒步)
Exercise_Type_Athletics = 0x2C, //田径
Exercise_Type_Waist_and_Abdominal_Training = 0x2D, //腰腹训练
Exercise_Type_Karate = 0x2E, //空手道
Exercise_Type_Relaxation = 0x2F, //整理放松
Exercise_Type_Cross_Training = 0x30, //交叉训练
Exercise_Type_Pilates = 0x31, //普拉提
Exercise_Type_Cross_Fit = 0x32, //交叉配合
Exercise_Type_Functional_Training = 0x33, //功能性训练
Exercise_Type_Physical_Training = 0x34, //体能训练
Exercise_Type_Archery = 0x35, //射箭
Exercise_Type_Flexibility = 0x36, //柔韧度
Exercise_Type_Mixed_Aerobic = 0x37, //混合有氧
Exercise_Type_Latin_Dance = 0x38, //拉丁舞
Exercise_Type_Street_Dance = 0x39, //街舞
Exercise_Type_Free_Boxing = 0x3A, //自由搏击
Exercise_Type_Ballet = 0x3B, //芭蕾
Exercise_Type_Australian_Soccer = 0x3C, //澳式足球
Exercise_Type_Martial_Arts = 0x3D, //武术
Exercise_Type_Stair_Climbing = 0x3E, //爬楼
Exercise_Type_Handball = 0x3F, //手球
Exercise_Type_Bowling = 0x40, //保龄球
Exercise_Type_Squash = 0x41, //壁球
Exercise_Type_Curling = 0x42, //冰壶
Exercise_Type_Hunting = 0x43, //打猎
Exercise_Type_Snowboarding = 0x44, //单板滑雪
Exercise_Type_Leisure_Sports = 0x45, //休闲运动
Exercise_Type_American_Football = 0x46, //美式橄榄球
Exercise_Type_Hand_Cycling = 0x47, //手摇车
Exercise_Type_Fishing = 0x48, //钓鱼
Exercise_Type_Frisbee = 0x49, //飞盘
Exercise_Type_Rugby_Unused = 0x4A, //原本地就有(橄榄球)
Exercise_Type_Golf = 0x4B, //高尔夫
Exercise_Type_Folk_Dance = 0x4C, //民族舞
Exercise_Type_Downhill_Skiing = 0x4D, //高山滑雪
Exercise_Type_Snow_Sports = 0x4E, //雪上运动
Exercise_Type_Clam_Mediation_Sports = 0x4F, //舒缓冥想类运动
Exercise_Type_Core_Training = 0x50, //核心训练
Exercise_Type_Ice_Skating = 0x51, //滑冰
Exercise_Type_Fitness_Games = 0x52, //健身游戏
Exercise_Type_Gymnastics_Unused = 0x53, //健身操
Exercise_Type_Group_Training = 0x54, //团体操
Exercise_Type_Kickboxing = 0x55, //搏击操
Exercise_Type_Lacrosse = 0x56, //长曲棍球
Exercise_Type_Foam_Rolling = 0x57, //泡沫轴筋膜放松
Exercise_Type_Wrestling = 0x58, //摔跤
Exercise_Type_Fencing = 0x59, //击剑
Exercise_Type_Softball = 0x5A, //垒球
Exercise_Type_Single_Bar = 0x5B, //单杠
Exercise_Type_Parallel_Bars = 0x5C, //双杠
Exercise_Type_Roller_Skating = 0x5D, //轮滑
Exercise_Type_Hula_Hoop = 0x5E, //呼啦圈
Exercise_Type_Darts = 0x5F, //飞镖
Exercise_Type_Pickleball = 0x60, //匹克球
Exercise_Type_HIIT = 0x61, //HIIT
Exercise_Type_Shooting = 0x62, //射击
Exercise_Type_Judo = 0x63, //柔道
Exercise_Type_Trampoline = 0x64, //蹦床
Exercise_Type_Skateboarding = 0x65, //滑板
Exercise_Type_Hoverboard = 0x66, //平衡车
Exercise_Type_Blading = 0x67, //溜旱冰
Exercise_Type_Parkour = 0x68, //跑酷
Exercise_Type_Diving = 0x69, //跳水
Exercise_Type_Surfing = 0x6A, //冲浪
Exercise_Type_Snorkeling = 0x6B, //浮潜
Exercise_Type_Pull_ups = 0x6C, //引体向上
Exercise_Type_Push_ups = 0x6D, //俯卧撑
Exercise_Type_Planking = 0x6E, //平板支撑
Exercise_Type_Rock_Climbing = 0x6F, //攀岩
Exercise_Type_High_Jump = 0x70, //跳高
Exercise_Type_Bungee_Jump = 0x71, //蹦极
Exercise_Type_Long_Jump = 0x72, //跳远
Exercise_Type_Marathon = 0x73, //马拉松
};
#define BODY_BUILDING_NUM 41 //健身类
#define DANCE_SPORTS_NUM 4 //舞蹈类
#define RELATIVE_SPORTS_NUM 18 //休闲运动
#define BALL_GAME_NUM 19 //球类
#define ICE_SPORTS_NUM 7 //水上运动
#define WATER_SPORTS_NUM 4 //冰上运动
#define EXTREMITY_SPORTS_NUM 4 //极限运动
enum
{
Exercise_List_Type_BodyBuilding=0x00, //健身类
Exercise_List_Type_Dance=0x01,//舞蹈类
Exercise_List_Type_Relative=0x02,//休闲运动
Exercise_List_Type_Ball=0x03,//球类
Exercise_List_Type_ICE=0x04,//水上运动
Exercise_List_Type_Water=0x05,//冰上运动
Exercise_List_Type_Extremity=0x06,//极限运动
};
enum
{
Information_App_call=0x01,
Information_App_facebook=0x02,
Information_App_flickr=0x03,
Information_App_gmail=0x04,
Information_App_googleplus=0x05,
Information_App_hangouts ,
Information_App_ins ,
Information_App_kakao ,
Information_App_line ,
Information_App_link ,
Information_App_message ,
Information_App_messenger ,
Information_App_other ,
Information_App_pinterest ,
Information_App_QQ ,
Information_App_skype ,
Information_App_snapchat ,
Information_App_telegram ,
Information_App_tumblr ,
Information_App_twitter ,
Information_App_viber ,
Information_App_vkontakte ,
Information_App_wechat ,
Information_App_whatsapp ,
Information_App_youtube ,
Information_App_ZALO ,
};
typedef enum {
FLEXIBLE_PHONE_CALL=0,
FLEXIBLE_RECORD=1,
FLEXIBLE_MUSIC=2,
FLEXIBLE_MESSAGE=3,
FLEXIBLE_HEADSET=4,
FLEXIBLE_EXERCISE=5,
FLEXIBLE_TEMP_WARNING=6,
FLEXIBLE_POWER_LOW_WARNING=7,
}FLEXIBLE_MSG_TYPE;
#define OK_BTN_ICO_SMALL_IMG IMG_OK_GREY_54X54 //灰色
#define CLEAR_BTN_ICO_SMALL_IMG IMG_CANCELLATION_WHITE_54X54
#define OK_BTN_ICO_WHITE_SMALL IMG_OK_WHITE_58X58 //白色
void convertTo12HourFormat(uint8_t *hours, uint8_t *isAM);
void lv_img_change_big_img_src(lv_obj_t* parent, const lv_img_dsc_t **src ,uint8_t img_num,uint8_t start);
void lv_img_big_disp(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start);
lv_obj_t* lv_img_big_create(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coord_t x, lv_coord_t y,uint8_t img_num,uint8_t start);
lv_obj_t* lv_title_text_create(lv_obj_t* parent ,const char *str,lv_color_t value, uint8_t hour,uint8_t minute);
void roller_mask_event_cb(lv_event_t * e);
lv_obj_t *lv_user_create_chart(lv_obj_t *parent,lv_coord_t x, lv_coord_t y,uint8_t *value,uint32_t *color_buff,uint16_t num);
extern const lv_img_dsc_t* exercise_type_img[115];
extern const uint16_t exercise_type_str[115] ;
extern const uint16_t measure_text_str[3];
extern const lv_img_dsc_t* switch_ico_img[2];
//const uint16_t format_12hour_str[2];
extern const uint16_t week_str[7];
extern lv_obj_t* cont_parent;
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_180px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_128px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_92px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_80px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_62px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_50px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_46px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_44px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_36px);
LV_FONT_DECLARE(Number_HarmonyOS_bpp4_20px);
//LV_FONT_DECLARE(OSD_arialuni_bbp4_36px);
LV_FONT_DECLARE(OSD_arialuni_bbp4_32px);
LV_FONT_DECLARE(arialuni_bbp1_32px);
#define LV_FONT_BIG_NUMBER_180PX &Number_HarmonyOS_bpp4_180px
#define LV_FONT_BIG_NUMBER_128PX &Number_HarmonyOS_bpp4_128px
#define LV_FONT_BIG_NUMBER_92PX &Number_HarmonyOS_bpp4_92px
#define LV_FONT_BIG_NUMBER_80PX &Number_HarmonyOS_bpp4_80px
#define LV_FONT_BIG_NUMBER_62PX &Number_HarmonyOS_bpp4_62px
#define LV_FONT_BIG_NUMBER_50PX &Number_HarmonyOS_bpp4_50px
#define LV_FONT_BIG_NUMBER_46PX &Number_HarmonyOS_bpp4_46px
#define LV_FONT_BIG_NUMBER_44PX &Number_HarmonyOS_bpp4_44px
#define LV_FONT_SMALL_NUMBER_20PX &Number_HarmonyOS_bpp4_20px
#define LV_FONT_MEDIUM_NUMBER_36PX &Number_HarmonyOS_bpp4_36px
#define LV_FONT_OSD_MEDIUM_32PX &OSD_arialuni_bbp4_32px//&OSD_arialuni_bbp4_32px
#define LV_FONT_OSD_MEDIUM_36PX &OSD_arialuni_bbp4_32px//&OSD_arialuni_bbp4_32px
#define LV_FONT_ARIALUNI_ALL_32PX &arialuni_bbp1_32px
uint8_t get_language_id(void);
uint8_t get_system_curr_time_hour(void);
uint8_t get_system_curr_time_min(void);
uint8_t get_time_format_flag(void);
bool lv_ui_node_return_to_prev_node(void);
void fr_lv_encoder_obj_event_cb(lv_event_t *e);
#endif

View File

@ -0,0 +1,943 @@
#include "lvgl.h"
#include "img_def.h"
#include "lv_common_function.h"
#include "fr_lv_customer_page.h"
#include "FreeRTOS.h"
#include "app_task.h"
//1001,mean:v1.0.0.1
#define FW_VERSION 1001
extern void co_delay_100us(uint32_t count);
//=======================================================
LV_ATTRIBUTE_LARGE_CONST const ui_func style_func_arry[] =
{
};
/*
void update_rt_timer_cb(lv_timer_t *t)
{
if(lv_obj_is_valid(t->user_data))
{
lv_label_set_text_fmt(t->user_data,"%02d:%02d",fr_system_time_hour(),fr_system_time_minute());
}
}
void common_right_top_little_time_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *rt_time = lv_event_get_target(e);
if(code == LV_EVENT_DELETE)
{
if(rt_time->user_data != NULL)
{
lv_timer_del(rt_time->user_data);
rt_time->user_data = NULL;
}
}
}
lv_obj_t *common_right_top_little_time(lv_obj_t *parent,lv_point_t *top)
{
lv_obj_t *rt_time = lv_label_create(parent);
lv_obj_align(rt_time,LV_ALIGN_TOP_RIGHT,-30,0);
lv_obj_set_style_text_color(rt_time,lv_color_make(0xc0,0xc0,0xc0),0);
lv_label_set_text_fmt(rt_time,"%02d:%02d",fr_system_time_hour(),fr_system_time_minute());
lv_obj_add_event_cb(rt_time,common_right_top_little_time_event_cb,LV_EVENT_DELETE,NULL);
rt_time->user_data = lv_timer_create(update_rt_timer_cb,500,rt_time);
return rt_time;
}
*/
//=====================================================================
//----------------- about time ----------------------------------------
//=====================================================================
time_rtc_t *fr_system_get_time_rtc(void)
{
return &sync_cm3_data.time;
}
uint8_t fr_system_get_time_week(void)
{
return CalcWeekday(sync_cm3_data.time);
}
uint8_t fr_system_get_time_hour(void)
{
uint8_t cur_Hour;
if(sync_cm3_data.ui_info.time_format)
{
if(sync_cm3_data.time.ucHour < 12)
{
if(sync_cm3_data.time.ucHour == 0)
cur_Hour = 12;
else
cur_Hour = sync_cm3_data.time.ucHour % 12;
}
else
{
if(sync_cm3_data.time.ucHour == 12)
cur_Hour = 12;
else
cur_Hour = sync_cm3_data.time.ucHour - 12;
}
}
else
{
cur_Hour = sync_cm3_data.time.ucHour;
}
return cur_Hour;
}
uint8_t fr_system_get_time_minute(void)
{
return sync_cm3_data.time.ucMinute;
}
uint8_t fr_system_get_time_second(void)
{
return sync_cm3_data.time.ucSecond;
}
void fr_system_set_time_hour(uint8_t temp_data)
{
sync_cm3_data.time.ucHour = temp_data;
fr_system_update_utc_time(&sync_cm3_data.time);
}
void fr_system_set_time_minute(uint8_t temp_data)
{
sync_cm3_data.time.ucMinute = temp_data;
fr_system_update_utc_time(&sync_cm3_data.time);
}
void fr_system_set_time_second(uint8_t temp_data)
{
sync_cm3_data.time.ucSecond = temp_data;
fr_system_update_utc_time(&sync_cm3_data.time);
}
void fr_system_set_time_format(uint8_t temp_data)
{
//0:24 hour,1:12 hour
sync_cm3_data.ui_info.time_format = temp_data;
}
void fr_system_timer_delay(uint16_t n)
{
co_delay_100us(n);
}
//----------------------- end -----------------------------------------
//=====================================================================
//----------------- about watch setting--------------------------------
//=====================================================================
//cm3 fw version
uint16_t fr_system_get_fw_version(void)
{
// return sync_cm3_data.m3_version_new;
return (uint16_t)FW_VERSION;
}
//MAC address
uint8_t *fr_system_get_mac_address(void)
{
return sync_cm3_data.ble_address;
}
void fr_system_set_Wirst_Awake(uint8_t state)
{
uint8_t data = state;
dsp_post_operate_to_m3(DSP_EVT_WIRST,&data,1);
}
uint8_t fr_system_Wirst_Awake(void)
{
return sync_cm3_data.motion;
}
//no disturb
void fr_system_set_no_disturb( uint8_t state)
{
uint8_t data = state;
dsp_post_operate_to_m3(DSP_EVT_DISTURB_CONTROL,&data,1);
}
uint8_t fr_system_no_disturb(void)
{
return sync_cm3_data.disturb_state;
}
//panel power on time
void fr_system_set_panel_on_time( uint8_t value)
{
}
uint8_t fr_system_panel_on_time(void)
{
return 0;
}
//language
void fr_system_set_language( uint8_t id)
{
sync_cm3_data.ui_info.ui_language = id;
// dsp_ipc_cmd = M3_DRIVER_DAILY_DATA;
//ipc_msg_with_payload_send(IPC_MSG_M3_INPUT, &dsp_ipc_cmd, 1, (uint8_t *)&sync_cm3_data, sizeof(ipc_daily_data_t), NULL);
}
uint8_t fr_system_get_language(void)
{
return sync_cm3_data.ui_info.ui_language;
}
//backlight
void fr_system_set_backlight( uint8_t id)
{
uint8_t data = id;
sync_cm3_data.ui_info.ui_backlight_brightness = data;
dsp_post_operate_to_m3(DSP_EVT_BRIGHT,&data,1);
}
uint8_t fr_system_get_backlight(void)
{
return sync_cm3_data.ui_info.ui_backlight_brightness;
}
//ble state
uint8_t fr_system_get_ble_state(void)
{
return sync_cm3_data.ble_state;
}
//bt state
uint8_t fr_system_get_bt_state(void)
{
return sync_cm3_data.bt_state;
}
//baterry
uint8_t fr_system_get_battery_state(void)
{
return sync_cm3_data.battery.state;
}
uint8_t fr_system_get_battery_value(void)
{
return sync_cm3_data.battery.battery_value;
}
uint8_t *fr_system_get_sleep_distory(void)
{
return NULL;
}
uint16_t fr_system_get_sleep_total_time(void)
{
return sync_cm3_data.sleep_total_time;
}
uint16_t fr_system_get_sleep_d_time(void)
{
return sync_cm3_data.deep_sleep_time;
}
uint16_t fr_system_get_sleep_l_time(void)
{
return sync_cm3_data.light_sleep_time;;
}
uint8_t fr_system_get_day1_weather_type(void)
{
if(sync_cm3_data.day1.type > 9)
{
return 0;
}
else
return sync_cm3_data.day1.type;
}
void fr_system_set_weather_temperature_format(uint8_t temp_data)
{
sync_cm3_data.ui_info.temperature_format = temp_data;
}
uint8_t fr_system_get_weather_temperature_format(void)
{
return sync_cm3_data.ui_info.temperature_format;
}
int16_t centigrade2fahrenhite(int16_t centigrade_data)
{
return (centigrade_data*18+320)/10;
}
int16_t fr_system_get_day1_weather_temp(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day1.cur_tempture);
else
return sync_cm3_data.day1.cur_tempture;
}
int16_t fr_system_get_day1_weather_temp_m(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day1.h_tempture);
else
return sync_cm3_data.day1.h_tempture;
}
int16_t fr_system_get_day1_weather_temp_n(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day1.l_tempture);
else
return sync_cm3_data.day1.l_tempture;
}
uint8_t fr_system_get_day2_weather_type(void)
{
if(sync_cm3_data.day2.type > 9)
{
return 0;
}
else
return sync_cm3_data.day2.type;
}
int16_t fr_system_get_day2_weather_temp(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day2.cur_tempture);
else
return sync_cm3_data.day2.cur_tempture;
}
int16_t fr_system_get_day2_weather_temp_m(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day2.h_tempture);
else
return sync_cm3_data.day2.h_tempture;
}
int16_t fr_system_get_day2_weather_temp_n(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day2.l_tempture);
else
return sync_cm3_data.day2.l_tempture;
}
uint8_t fr_system_get_day3_weather_type(void)
{
if(sync_cm3_data.day3.type > 9)
{
return 0;
}
else
return sync_cm3_data.day3.type;
}
int16_t fr_system_get_day3_weather_temp(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day3.cur_tempture);
else
return sync_cm3_data.day3.cur_tempture;
}
int16_t fr_system_get_day3_weather_temp_m(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day3.h_tempture);
else
return sync_cm3_data.day3.h_tempture;
}
int16_t fr_system_get_day3_weather_temp_n(void)
{
if(sync_cm3_data.ui_info.temperature_format)
return centigrade2fahrenhite(sync_cm3_data.day3.l_tempture);
else
return sync_cm3_data.day3.l_tempture;
}
//sport
uint32_t fr_system_get_sport_time(void)
{
return sync_cm3_data.sport.sport_time;
}
uint8_t fr_system_get_sport_type(void)
{
return sync_cm3_data.sport.sport_type;
}
uint16_t fr_system_get_sport_speed(void)
{
return sync_cm3_data.sport.speed;
}
uint16_t fr_system_get_sport_step(void)
{
return sync_cm3_data.sport.step;
}
uint16_t fr_system_get_sport_carlorie(void)
{
return sync_cm3_data.sport.carloie;
}
uint16_t fr_system_get_sport_distcace(void)
{
if(fr_system_get_distance_format())
return sync_cm3_data.sport.distance*621/1000;
else
return sync_cm3_data.sport.distance;
}
uint8_t fr_system_get_sport_state(void)
{
return sync_cm3_data.sport.state;
}
uint8_t fr_system_get_sport_hrm(void)
{
return sync_cm3_data.sport.hrm;
}
uint8_t fr_system_get_sport_hrm_max(void)
{
return sync_cm3_data.sport.max_hrm;
}
uint8_t fr_system_get_sport_hrm_min(void)
{
return sync_cm3_data.sport.min_hrm;
}
uint8_t fr_system_get_sport_oxygen(void)
{
return sync_cm3_data.sport.oxygen;
}
uint32_t fr_system_get_sport_total_time(void)
{
return sync_cm3_data.sport.sport_total_time;
}
uint16_t fr_system_get_sport_total_carlorie(void)
{
return sync_cm3_data.sport.total_carloie;
}
uint8_t fr_system_get_sport_avg_hrm(void)
{
return sync_cm3_data.sport.avg_hrm;
}
void fr_system_sports_start(uint8_t mode)
{
uint8_t buffer[2];
buffer[0] = 1; //start
buffer[1] = mode;
dsp_post_operate_to_m3(DSP_EVT_SPORTS,buffer,2);
sync_cm3_data.sport.sport_type = mode;
}
void fr_system_sports_stop(uint8_t mode)
{
uint8_t buffer[2];
buffer[0] = 0; //stop
buffer[1] = mode;
dsp_post_operate_to_m3(DSP_EVT_SPORTS,buffer,2);
}
void fr_system_sports_pause(uint8_t mode)
{
uint8_t buffer[2];
buffer[0] = 2; //pause
buffer[1] = mode;
dsp_post_operate_to_m3(DSP_EVT_SPORTS,buffer,2);
}
void fr_system_turn_on_bt(void)
{
uint8_t data = 1;
dsp_post_operate_to_m3(DSP_EVT_BT_SWATCH,&data,1);
fr_system_timer_delay(100);
}
void fr_system_turn_off_bt(void)
{
uint8_t data = 0;
dsp_post_operate_to_m3(DSP_EVT_BT_SWATCH,&data,1);
fr_system_timer_delay(100);
}
void fr_system_shut_down(void)
{
dsp_post_operate_to_m3(DSP_EVT_SYSTEM_SHUTDOWN,NULL,0);
}
void fr_system_reset_to_factory(void)
{
//just test
extern void system_reset(void);
system_reset();
}
void fr_system_reboot(void)
{
// dsp_post_operate_to_m3(DSP_EVT_SYSTEM_REBOOT,NULL,0);
extern void system_reset(void);
system_reset();
}
void fr_system_power_off(void)
{
//just test
extern void system_reset(void);
system_reset();
}
void fr_system_enable_mic(void)
{
sync_cm3_data.audio_mic_on = 1;
dsp_post_operate_to_m3(DSP_EVT_MIC_OPEN,NULL,0);
}
void fr_system_disable_mic(void)
{
sync_cm3_data.audio_mic_on = 0;
dsp_post_operate_to_m3(DSP_EVT_MIC_MUTE,NULL,0);
}
uint8_t fr_system_get_mic_state(void)
{
return sync_cm3_data.audio_mic_on;
}
void fr_system_set_step_target(uint32_t temp_data)
{
sync_cm3_data.steptarget = temp_data;
}
uint32_t fr_system_get_step_target(void)
{
return sync_cm3_data.steptarget;
}
uint32_t fr_system_get_step(void)
{
return sync_cm3_data.step;
}
uint32_t fr_system_get_calorie(void)
{
return sync_cm3_data.calorie;
}
uint8_t fr_system_get_distance_format(void)
{
return sync_cm3_data.ui_info.distance_format;
}
uint32_t fr_system_get_distance(void)
{
return sync_cm3_data.distance;
}
void fr_system_clear_light_time(void)
{
extern uint32_t gui_running_last_time;
gui_running_last_time = portGET_RUN_TIME_COUNTER_VALUE();
}
void fr_system_take_picture(void)
{
dsp_post_operate_to_m3(DSP_EVT_CAMERA,NULL,1);
}
void fr_system_search_phone(void)
{
uint8_t data = 0x01;
dsp_post_operate_to_m3(DSP_EVT_FIND,&data,1);
}
void fr_system_set_menu_style(uint8_t id)
{
sync_cm3_data.ui_info.ui_menu_style_id = id;
}
uint8_t fr_system_get_menu_style(void)
{
return sync_cm3_data.ui_info.ui_menu_style_id;
}
void fr_system_set_watch_face( uint8_t id)
{
sync_cm3_data.ui_info.ui_clock_id = id;
}
uint8_t fr_system_get_watch_face(void)
{
return sync_cm3_data.ui_info.ui_clock_id;
}
uint8_t* fr_system_get_custom_page_mode(void)
{
return sync_cm3_data.ui_info.custom_page_mode;
}
void fr_system_set_custom_page_mode(void)
{
// uint8_t *custom_page_data = fr_lv_get_custom_page_data();
// memcpy(sync_cm3_data.ui_info.custom_page_mode,custom_page_data,CUSTOM_ID_ARRY_NUMBER);
// dsp_post_operate_to_m3(DSP_EVT_SET_CARD_INDEX,sync_cm3_data.ui_info.custom_page_mode,CUSTOM_ID_ARRY_NUMBER);
}
//----------------------- end -----------------------------------------
//=====================================================================
//----------------- about call ----------------------------------------
//=====================================================================
/*
uint8_t call_mode;
uint8_t fr_system_get_call_mode(void)
{
return call_mode;
}
void fr_system_set_call_mode(uint8_t mode)
{
call_mode = mode;
}
*/
extern bool coming_call_ok;
extern bool call_flag;
void dsp_op_system_call_out(uint8_t * number,uint8_t len)
{
coming_call_ok = true;
call_flag = true;
memset(call_context,0,200);
memcpy(call_context,number,len);
uint8_t * buffer = (uint8_t *)pvPortMalloc(len + 3);
if(buffer != NULL)
{
buffer[0] = 'D';
buffer[1] = 'A';
memcpy(buffer+2, number, len+1);
dsp_post_operate_to_m3(DSP_EVT_CALL_CONTROL,buffer,len+3);
vPortFree(buffer);
}
}
void dsp_op_get_current_call(call_info_t * call)
{
if(call_context[0] > 0)
{
call->number_len = call_context[0];
memset(call->call_namber,0,32);
memcpy(call->call_namber,call_context+1,call->number_len);
call->name_len = call_context[call->number_len] + 1;
memset(call->call_name,0,128);
memcpy(call->call_name, call_context+call->number_len+1, call->name_len);
}
}
uint8_t dsp_op_dial_from_book(uint16_t id)
{
uint8_t buffer[2];
buffer[0] = id >> 8;
buffer[1] = id;
//dsp_post_operate_to_m3(DSP_EVT_READ_PHONE_BOOK_LIST,buffer,2);
//co_delay_100us(500);
if(call_list[0] > 0)
{
memcpy(call_context,&book_list[id][0],200);
if(call_context[0] < 3)
{
return 0;
}
bool namber_is_ok = true;
for(uint8_t i = 1; i <= call_context[0]; i++)
{
if((call_context[i] >= '0') && (call_context[i] <= '9'))
{
}
else if(call_context[i] == '+') //area number
{
}
else
{
namber_is_ok = false;
break;
}
}
if(namber_is_ok)
{
coming_call_ok = true;
call_flag = true;
uint8_t * buffer = (uint8_t *)pvPortMalloc(call_context[0] + 3);
if(buffer != NULL)
{
buffer[0] = 'D';
buffer[1] = 'A';
memcpy(buffer+2, call_context, call_context[0]+1);
dsp_post_operate_to_m3(DSP_EVT_CALL_CONTROL,buffer,call_context[0]+3);
vPortFree(buffer);
}
return 1;
}
return 0;
}
return 0;
}
bool get_phone_book_flag = false;
bool phone_book_is_bank_flag = true;
uint32_t phone_book_total = 0;
void dsp_op_get_call_from_book(call_info_t * call,uint16_t id)
{
uint8_t buffer[2];
buffer[0] = id >> 8;
buffer[1] = id;
dsp_post_operate_to_m3(DSP_EVT_READ_PHONE_BOOK_LIST,buffer,2);
get_phone_book_flag = true;
uint16_t counter = 0;
while(get_phone_book_flag)
{
co_delay_100us(1);
counter ++;
if(counter > 1000)
break;
}
if(call_list[0] > 0)
{
call->number_len = call_list[0];
memset(call->call_namber,0,32);
memcpy(call->call_namber,call_list+1,call->number_len);
call->name_len = call_list[call->number_len] + 1;
memset(call->call_name,0,128);
memcpy(call->call_name, call_list+call->number_len+1, call->name_len);
}
}
void dsp_op_get_phone_book_tatol(void)
{
dsp_post_operate_to_m3(DSP_EVT_READ_PHONE_BOOK_TOTAL,NULL,0);
get_phone_book_flag = true;
uint16_t counter = 0;
while(get_phone_book_flag)
{
co_delay_100us(1);
counter ++;
if(counter > 1000)
break;
}
}
void dsp_op_sync_phone_book(void)
{
dsp_post_operate_to_m3(DSP_EVT_LOAD_PHONE_BOOK,NULL,0);
}
uint16_t dsp_op_get_phone_book_id_offset(void)
{
return sync_cm3_data.phone_book_id_offset;
}
uint16_t dsp_op_set_phone_book_id_offset(uint16_t id_offset)
{
uint8_t buffer[2];
buffer[0] = id_offset >> 8;
buffer[1] = id_offset;
dsp_post_operate_to_m3(DSP_EVT_SET_PHONE_BOOK_ID_OFFSET,buffer,2);
//fr_system_timer_delay(2000);
return 0;
}
void dsp_op_system_call_ok(void)
{
coming_call_ok = true;
uint8_t buffer[2];
buffer[0] = 'C';
buffer[1] = 'A';
//dsp_ipc_cmd = M3_DRIVER_CALLING;
//ipc_msg_with_payload_send(IPC_MSG_M3_INPUT, &dsp_ipc_cmd,1,buffer,2,NULL);
dsp_post_operate_to_m3(DSP_EVT_CALL_CONTROL,buffer,2);
}
void dsp_op_system_call_reject(void)
{
call_flag = false;
coming_call_ok = false;
uint8_t buffer[2];
buffer[0] = 'C';
buffer[1] = 'B';
//dsp_ipc_cmd = M3_DRIVER_CALLING;
//ipc_msg_with_payload_send(IPC_MSG_M3_INPUT, &dsp_ipc_cmd,1,buffer,2,NULL);
dsp_post_operate_to_m3(DSP_EVT_CALL_CONTROL,buffer,2);
}
void dsp_op_read_cm3_record_list(void)
{
dsp_ipc_cmd = M3_DRIVER_CAllLIST_INFO;
//(IPC_MSG_M3_INPUT, &dsp_ipc_cmd, 1, (uint8_t *)&sync_cm3_data, sizeof(ipc_daily_data_t), NULL);
get_phone_book_flag = true;
uint16_t counter = 0;
while(get_phone_book_flag)
{
co_delay_100us(1);
counter ++;
if(counter > 1000)
break;
}
}
void dsp_op_get_call_from_record_list(call_info_t * call,uint8_t *call_context)
{
memcpy(call_list,call_context,CALL_NUMBER_MAX_LEN - 1);
call->number_len = call_list[0];
memset(call->call_namber,0,32);
memcpy(call->call_namber,call_list+1,call->number_len);
call->name_len = call_list[call->number_len] + 1;
memset(call->call_name,0,128);
memcpy(call->call_name, call_list+call->number_len+1, call->name_len);
}
uint8_t dsp_get_system_record_total(void)
{
return record_list.call_record_total;
}
//----------------------- end -----------------------------------------
//=====================================================================
//----------------- about node ----------------------------------------
//=====================================================================
//layer_page
void dsp_store_ui_scene(uint8_t mode,uint8_t layer, uint8_t page,uint16_t page_cur_x,uint16_t page_cur_y)
{
sync_cm3_data.ui_info.ui_mode = mode;
sync_cm3_data.ui_info.ui_node_lv = layer;
sync_cm3_data.ui_info.ui_page_id = page;
dsp_ipc_cmd = M3_DRIVER_DAILY_DATA;
//ipc_msg_with_payload_send(IPC_MSG_M3_INPUT, &dsp_ipc_cmd, 1, (uint8_t *)&sync_cm3_data, sizeof(ipc_daily_data_t), NULL);
}
void dsp_set_ui_scene_default_style(uint8_t type)
{
sync_cm3_data.ui_info.ui_default_style = type;
}
uint8_t dsp_get_ui_scene_default_style(void)
{
return sync_cm3_data.ui_info.ui_default_style;
}
uint8_t fr_system_panel_state(void)
{
return sync_cm3_data.panel_state;
}
uint8_t dsp_get_ui_scene_mode(void)
{
return sync_cm3_data.ui_info.ui_mode;
}
uint8_t dsp_get_ui_scene_page_id(void)
{
return sync_cm3_data.ui_info.ui_page_id;
}
//----------------------- end -----------------------------------------
//=====================================================================
//----------------- about host recv vendor-----------------------------
//=====================================================================
#define RECEIVE_MODE_GSENSOR 0x0A
#define RECEIVE_MODE_SPO2 0x0B
#define RECEIVE_MODE_HRM 0x0C
typedef enum {
STK_EVENT_NONE,
STK_EVENT_STEP_NOTIFY,
STK_EVENT_FALL_NOTIFY,
STK_EVENT_SLEEP_NOTIFY,
STK_EVENT_ACTION_NOTIFY,
STK_EVENT_SEDENTARY_NOTIFY,
STK_EVENT_CALORIE_NOTIFY,
STK_EVENT_DISTANCE_NOTIFY,
STK_EVENT_FLIP_NOTIFY,
STK_EVENT_RAISE_NOTIFY,
STK_EVENT_SHAKE_NOTIFY
}STKMOTION_EVENT;
typedef struct {
STKMOTION_EVENT evt_id;
signed int step;
signed int calorie;
signed char action;
signed char sleep;
}_gsensor_evt;
typedef enum
{
HRM_MODE = 1,
SPO2_MODE,
}hrm_mode_t;
hrm_mode_t hrm_mode;
uint8_t system_hrm_status; //1:open,0:close
uint8_t system_spo2_status; //1:open,0:close
//---------------------------------------------------------------------
void fr_system_host_recv_vendor(uint8_t *recv_data,uint8_t len)
{
uint8_t receive_mode = recv_data[1];
switch (receive_mode)
{
case RECEIVE_MODE_GSENSOR:
{
_gsensor_evt *evt = (_gsensor_evt *)&recv_data[3];
sync_cm3_data.step = evt->step;
sync_cm3_data.calorie = evt->calorie;
sync_cm3_data.motion = evt->action;
printf("step:%d,calorie:%d,motion:%d\r\n",sync_cm3_data.step,
sync_cm3_data.calorie,sync_cm3_data.motion);
}
break;
case RECEIVE_MODE_HRM:
system_hrm_status = recv_data[3];
sync_cm3_data.bpm = recv_data[3+4+4];
break;
case RECEIVE_MODE_SPO2:
system_spo2_status = recv_data[3];
sync_cm3_data.spo2 = recv_data[3+4+4];
printf("spo2 status:%d,spo2:%d\r\n",system_spo2_status,sync_cm3_data.spo2);
default:
break;
}
}
//----------------------- end -----------------------------------------
//=====================================================================
//----------------- about hrm -----------------------------------------
//=====================================================================
void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data);
uint8_t fr_system_get_hrm_status(void)
{
return system_hrm_status;
}
void fr_system_hrm_start(void)
{
uint8_t mode = 0;
btdm_host_send_vendor_cmd(0x14, 1, &mode);
system_hrm_status = 1;
hrm_mode = HRM_MODE;
}
void fr_system_hrm_stop(void)
{
btdm_host_send_vendor_cmd(0x15, 0, NULL);
system_hrm_status = 0;
}
uint8_t fr_system_get_hrm(void)
{
return sync_cm3_data.bpm;
}
uint8_t fr_system_get_hrm_warning_h(void)
{
return sync_cm3_data.bpm_warning_h;
}
uint8_t fr_system_get_hrm_warning_l(void)
{
return sync_cm3_data.bpm_warning_l;
}
//--------------------------------------------------
void fr_system_spo2_start(void)
{
uint8_t mode = 1;
btdm_host_send_vendor_cmd(0x14, 1, &mode);
system_spo2_status = 1;
hrm_mode = SPO2_MODE;
}
void fr_system_spo2_stop(void)
{
btdm_host_send_vendor_cmd(0x15, 0, NULL);
system_spo2_status = 0;
}
uint8_t fr_system_get_spo2(void)
{
return sync_cm3_data.spo2;
}
uint8_t fr_system_get_spo2_status(void)
{
return system_spo2_status;
}
//----------------------- end -----------------------------------------
//=====================================================================
//-------------------- about gsensor ----------------------------------
//=====================================================================
void fr_system_send_step_cmd(void)
{
btdm_host_send_vendor_cmd(0x12,0,NULL);
}
//----------------------- end -----------------------------------------

View File

@ -0,0 +1,218 @@
#ifndef __LV_COMMON_FUNCTION_H__
#define __LV_COMMON_FUNCTION_H__
//#include "fr_lv_public_func.h"
//#include "lan_str_table.h"
#include "fr_watch.h"
//#include "fr_lv_app_page.h"
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_180px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_128px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_92px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_80px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_62px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_50px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_46px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_44px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_36px);
//LV_FONT_DECLARE(Number_HarmonyOS_bpp4_20px);
//#define LV_FONT_BIG_NUMBER_62PX &Number_HarmonyOS_bpp4_62px
//#define LV_FONT_BIG_NUMBER_50PX &Number_HarmonyOS_bpp4_50px
//#define LV_FONT_BIG_NUMBER_46PX &Number_HarmonyOS_bpp4_46px
//#define LV_FONT_BIG_NUMBER_44PX &Number_HarmonyOS_bpp4_44px
//#define LV_FONT_SMALL_NUMBER_20PX &Number_HarmonyOS_bpp4_20px
//=============================================
//--------------- define ----------------------
//=============================================
extern LV_ATTRIBUTE_LARGE_CONST const ui_func style_func_arry[];
#define UI_PARENT_INIT(PARENT) do{lv_obj_set_size(PARENT,LV_PCT(100),LV_PCT(100));\
lv_obj_set_style_bg_color(PARENT,lv_color_black(),0); \
lv_obj_set_style_pad_all(PARENT,0,0); \
lv_obj_set_style_border_width(PARENT, 0, 0); \
lv_obj_set_scrollbar_mode(PARENT, LV_SCROLLBAR_MODE_OFF);}while(0)
//------------------- end ----------------------
typedef enum
{
UI_MAIN_FLOAT = 0,
UI_APP_MUSIC,
UI_APP_SPORT_DETAIL,
UI_APP_OTA,
} ui_type_t;
//=============================================
//--------------- about time ------------------
//=============================================
extern time_rtc_t *fr_system_get_time_rtc(void);
extern uint8_t fr_system_get_time_week(void);;
extern uint8_t fr_system_get_time_hour(void);
extern uint8_t fr_system_get_time_minute(void);
extern uint8_t fr_system_get_time_second(void);
extern void fr_system_set_time_hour(uint8_t temp_data);
extern void fr_system_set_time_minute(uint8_t temp_data);
extern void fr_system_set_time_second(uint8_t temp_data);
extern void fr_system_set_time_format(uint8_t temp_data);
//------------------- end ----------------------
//=============================================
//---------- about watch setting --------------
//=============================================
extern uint16_t fr_system_get_fw_version(void);
extern uint8_t *fr_system_get_mac_address(void);
extern void fr_system_set_Wirst_Awake(uint8_t state);
extern uint8_t fr_system_Wirst_Awake(void);
extern void fr_system_set_no_disturb(uint8_t state);
extern uint8_t fr_system_no_disturb(void);
extern void fr_system_set_panel_on_time(uint8_t value);
extern uint8_t fr_system_panel_on_time(void);
extern void fr_system_set_language(uint8_t id);
extern uint8_t fr_system_get_language(void);
extern void fr_system_set_backlight(uint8_t id);
extern uint8_t fr_system_get_backlight(void);
extern uint8_t fr_system_get_ble_state(void);
extern uint8_t fr_system_get_bt_state(void);
extern uint8_t fr_system_get_battery_state(void);
extern uint8_t fr_system_get_battery_value(void);
extern uint8_t *fr_system_get_sleep_distory(void);
extern uint16_t fr_system_get_sleep_total_time(void);
extern uint16_t fr_system_get_sleep_d_time(void);
extern uint16_t fr_system_get_sleep_l_time(void);
extern uint8_t fr_system_get_day1_weather_type(void);
extern void fr_system_set_weather_temperature_format(uint8_t temp_data);
extern uint8_t fr_system_get_weather_temperature_format(void);
extern int16_t centigrade2fahrenhite(int16_t centigrade_data);
extern int16_t fr_system_get_day1_weather_temp(void);
extern int16_t fr_system_get_day1_weather_temp_m(void);
extern int16_t fr_system_get_day1_weather_temp_n(void);
extern int16_t fr_system_get_day2_weather_temp(void);
extern int16_t fr_system_get_day2_weather_temp_m(void);
extern int16_t fr_system_get_day2_weather_temp_n(void);
extern int16_t fr_system_get_day3_weather_temp(void);
extern int16_t fr_system_get_day3_weather_temp_m(void);
extern int16_t fr_system_get_day3_weather_temp_n(void);
//------------------- end ----------------------
//sport
extern uint32_t fr_system_get_sport_time(void);
extern uint8_t fr_system_get_sport_type(void);
extern uint16_t fr_system_get_sport_speed(void);
extern uint16_t fr_system_get_sport_step(void);
extern uint16_t fr_system_get_sport_carlorie(void);
extern uint16_t fr_system_get_sport_distcace(void);
extern uint8_t fr_system_get_sport_state(void);
extern uint8_t fr_system_get_sport_hrm(void);
extern uint8_t fr_system_get_sport_hrm_max(void);
extern uint8_t fr_system_get_sport_hrm_min(void);
extern uint8_t fr_system_get_sport_oxygen(void);
extern uint32_t fr_system_get_sport_total_time(void);
extern uint16_t fr_system_get_sport_total_carlorie(void);
extern uint8_t fr_system_get_sport_avg_hrm(void);
extern void fr_system_sports_start(uint8_t mode);
extern void fr_system_sports_stop(uint8_t mode);
extern void fr_system_sports_pause(uint8_t mode);
extern void fr_system_turn_on_bt(void);
extern void fr_system_turn_off_bt(void);
extern void fr_system_shut_down(void);
extern void fr_system_reset_to_factory(void);
extern void fr_system_reboot(void);
extern void fr_system_power_off(void);
extern void fr_system_enable_mic(void);
extern void fr_system_disable_mic(void);
extern uint8_t fr_system_get_mic_state(void);
extern void fr_system_set_step_target(uint32_t temp_data);
extern uint32_t fr_system_get_step_target(void);
extern uint32_t fr_system_get_step(void);
extern uint32_t fr_system_get_calorie(void);
extern uint8_t fr_system_get_distance_format(void);
extern uint32_t fr_system_get_distance(void);
extern void fr_system_clear_light_time(void);
extern void fr_system_take_picture(void);
extern void fr_system_search_phone(void);
extern void fr_system_set_menu_style(uint8_t id);
extern uint8_t fr_system_get_menu_style(void);
extern void fr_system_set_watch_face( uint8_t id);
extern uint8_t fr_system_get_watch_face(void);
extern uint8_t* fr_system_get_custom_page_mode(void);
extern void fr_system_set_custom_page_mode(void);
//------------------- end ----------------------
//=============================================
//--------------- about call ------------------
//=============================================
extern uint8_t fr_system_get_call_mode(void);
extern void fr_system_set_call_mode(uint8_t mode);
extern void dsp_op_system_call_out(uint8_t * number,uint8_t len);
extern void dsp_op_get_current_call(call_info_t * call);
extern uint8_t dsp_op_dial_from_book(uint16_t id);
extern void dsp_op_get_call_from_book(call_info_t * call,uint16_t id);
extern void dsp_op_get_phone_book_tatol(void);
extern void dsp_op_sync_phone_book(void);
extern uint16_t dsp_op_get_phone_book_id_offset(void);
extern uint16_t dsp_op_set_phone_book_id_offset(uint16_t id_offset);
extern void dsp_op_system_call_ok(void);
extern void dsp_op_system_call_reject(void);
extern void dsp_op_read_cm3_record_list(void);
extern void dsp_op_get_call_from_record_list(call_info_t * call,uint8_t *call_context);
extern uint8_t dsp_get_system_record_total(void);
//------------------- end ----------------------
//=============================================
//--------------- about node ------------------
//=============================================
extern void dsp_store_ui_scene(uint8_t mode,uint8_t layer, uint8_t page,uint16_t page_cur_x,uint16_t page_cur_y);
extern void dsp_set_ui_scene_default_style(uint8_t type);
extern uint8_t dsp_get_ui_scene_default_style(void);
extern uint8_t fr_system_panel_state(void);
extern uint8_t dsp_get_ui_scene_mode(void);
extern uint8_t dsp_get_ui_scene_page_id(void);
//------------------- end ----------------------
//=============================================
//---------- about host recv vendor------------
//=============================================
void fr_system_host_recv_vendor(uint8_t *recv_data,uint8_t len);
//------------------- end ----------------------
//=============================================
//--------------- about hrm -------------------
//=============================================
extern uint8_t fr_system_get_hrm_status(void);
extern void fr_system_hrm_start(void);
extern void fr_system_hrm_stop(void);
extern uint8_t fr_system_get_hrm(void);
extern uint8_t fr_system_get_hrm_warning_h(void);
extern uint8_t fr_system_get_hrm_warning_l(void);
extern void fr_system_spo2_start(void);
extern void fr_system_spo2_stop(void);
extern uint8_t fr_system_get_spo2(void);
extern uint8_t fr_system_get_spo2_status(void);
//------------------- end ----------------------
//=============================================
//------------- about gsensor -----------------
//=============================================
void fr_system_send_step_cmd(void);
//------------------- end ----------------------
//=============================================
//-------- extern file declare ----------------
//=============================================
extern void fr_lv_app_starsky_func(lv_obj_t *parent,lv_point_t *top);
extern void fr_lv_track_roller_func(lv_obj_t *parent,lv_point_t *top);
//extern ui_func fr_ui_get_watchface(void);
extern void fr_lv_home_short_sqlist_save_data(uint8_t ui_array_index);
extern void lv_app_msg_win(lv_obj_t *parent,lv_point_t *top);
extern bool fr_lv_get_charge_ui_state(void);
extern void offscreen_dial_charge_create(void);
extern void offscreen_dial_charge_clean(void);
extern void fr_lv_app_dialing_function(lv_obj_t *parent,lv_point_t *top);
extern void fr_system_update_utc_time(time_rtc_t *cur_time);
//------------------- end ----------------------
#endif

View File

@ -0,0 +1,394 @@
/*
* INCLUDES (<28><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>)
*/
#include <stdio.h>
#include <string.h>
#include "gap_api.h"
#include "gatt_api.h"
#include "gatt_sig_uuid.h"
#include "ANCS_AMS_client.h"
#include "AMS_client.h"
#include "system_fr30xx.h"
#include "FreeRTOS.h"
#include "lvgl.h"
#include "lv_user_sqlist.h"
#include "user_ANCS_info_intergration.h"
#include "app_lvgl.h"
#define NTF_ATT_ID_APPLE 0
#define NTF_ATT_ID_TITLE 1
#define NTF_ATT_ID_SUBTITLE 2
#define NTF_ATT_ID_MSG 3
#define NTF_ATT_ID_MSG_SIZE 4
#define NTF_ATT_ID_DATE 5
#define NTF_ATT_ID_POSITIVE_ACT 6
#define NTF_ATT_ID_NEGATIVE_ACT 7
char *const msg_type_string[]=
{
#if 0
[CATEGORY_WEIXIN]="com.tencent.xin",
[CATEGORY_MOBILE_SMS]="com.apple.MobileSMS",
[CATEGORY_MOBILE_PHONE]="com.apple.mobilephone",
[CATEGORY_MQQ]="com.tencent.mqq",
[CATEGORY_QQ]="com.tencent.qq",
[CATEGORY_WHATSAPP]="net.whatsapp.WhatsApp",
[CATEGORY_FACEBOOK]="com.facebook.Facebook",
[CATEGORY_LINE]="jp.naver.line",
[CATEGORY_FACEBOOK_MES]="com.facebook.Messenger",
[CATEGORY_INSTAGRAM]="com.burbn.instagram",
[CATEGORY_IPAD_QQ]="com.tencent.mipadqq",
[CATEGORY_ZEPHYR]="com.linkedin.Zephyr",
[CATEGORY_WEIBO]="com.sina.weibo",
[CATEGORY_VOIP]="com.viber.voip",
[CATEGORY_KAKAOTALK]="com.iwilab.KakaoTalk",
[CATEGORY_DINGTALK]="com.laiwang.DingTalk",
[CATEGORY_DINGTALKLITE]="com.alibaba.dingtalklite",
[CATEGORY_TWITTER]="com.atebits.Tweetie2",
[CATEGORY_TELEGRAPH]="ph.telegra.Telegraph",
#else
[CATEGORY_WECHAT]="xin",
[CATEGORY_MOBILE_PHONE]="phone",
[CATEGORY_FACEBOOK]="facebook",
[CATEGORY_FLICKR]="flickr",
[CATEGORY_GMAIL]="gmail",
[CATEGORY_GOOGLE_PLUS]="google",
[CATEGORY_HANGOUTS]="hangouts",
[CATEGORY_INS]="ins",
[CATEGORY_KAKAO]="kakao",
[CATEGORY_LINE]="line",
[CATEGORY_LINK]="link",
[CATEGORY_MESSAGE]="SMS",
[CATEGORY_MESSENGER]="messenger",
[CATEGORY_PINTEREST]="pinterest",
[CATEGORY_QQ]="qq",
[CATEGORY_SKYPE]="skype",
[CATEGORY_SNAPCHAT]="snapchat",
[CATEGORY_TELEGRAM]="telegram",
[CATEGORY_TUMBLR]="tumblr",
[CATEGORY_TWITTER]="twitter",
[CATEGORY_VIBER]="viber",
[CATEGORY_VKONTAKTE]="vkontakte",
[CATEGORY_WHATSAPP]="whatsapp",
[CATEGORY_YOUTUBE]="youtube",
[CATEGORY_ZALO]="zalo",
#endif
};
ElemType_t msg_info_index[MAX_MSG_LIST] = {0};
SqlistType_t msg_sqlist=
{
.length = 0,
.data = msg_info_index,
};
extern lv_obj_t *prj_parent_cont;
extern ancs_msg_t msglist;
//=======================================================
//=======================================================
//=======================================================
/**
* @Function:
* @Descripttion:
* @param {uint8_t} *data
* @return {*}1:success,0:fail
*/
bool fr_lv_message_add(uint8_t *data)
{
uint8_t len = lv_user_list_get_sqlist_length(&msg_sqlist);
if(len >= MAX_MSG_LIST)
return 0; //overflow
//顺序查询还有哪些空闲的数组
uint8_t elem_id,msg_info_index;
for (uint8_t i = 0; i < MAX_MSG_LIST; i++)
{
msg_info_index = i | 0x80;
elem_id = lv_user_list_get_elem_id(&msg_sqlist,msg_info_index);
if(elem_id == 0xff)
{
//当前为空,将对应的下标插入队列
lv_user_list_insert(&msg_sqlist,len,msg_info_index);
//同时将数据写入相对应数组
memcpy(&msglist.fifo[i],data,data[1]);
return 1;
}
}
return 0;
}
/**
* @Function:
* @Descripttion:
* @param {uint8_t} elem_index:队列的第elem_index个元素
* @return {*}1:success,0:fail
*/
bool fr_lv_message_delete(uint8_t elem_index)
{
uint8_t elem_msg_info_index = msg_sqlist.data[elem_index] & 0x7F;
if(elem_msg_info_index >= MAX_MSG_LIST)
return 0;
if(lv_user_list_delete(&msg_sqlist,elem_index) == SUCCESS)
{
//清除数组里的数据
memset(&msglist.fifo[elem_msg_info_index],0,MESSAGE_MAX_LENGTH);
return 1;
}
else
return 0;
}
/**
* @Function:
* @Descripttion: 获取到最新的信息
* @return {*}
*/
info_msg_t *fr_lv_message_get_latest_info(void)
{
if(msg_sqlist.length == 0)
return NULL;
uint8_t latest_index = msg_sqlist.length - 1;
uint8_t elem_msg_info_index = msg_sqlist.data[latest_index] & 0x7F;
return &msglist.fifo[elem_msg_info_index];
}
/**
* @Function:
* @Descripttion: 获取队列中第elem_index条信息
* @param {uint8_t} elem_index
* @return {*}
*/
info_msg_t *fr_lv_message_get_info(uint8_t elem_index)
{
if(elem_index >= msg_sqlist.length)
return NULL;
uint8_t elem_msg_info_index = msg_sqlist.data[elem_index] & 0x7F;
return &msglist.fifo[elem_msg_info_index];
}
/**
* @Function:
* @Descripttion: 获取队列中消息长度
* @return {*}
*/
uint8_t fr_lv_message_get_info_length(void)
{
return msg_sqlist.length;
}
/**
* @Function:
* @Descripttion: 清空消息
* @return {*}
*/
void fr_lv_message_clear_all(void)
{
msg_sqlist.length = 0;
memset(msg_info_index,0,sizeof(msg_info_index));
memset(&msglist,0,sizeof(ancs_msg_t));
}
uint32_t user_test_get_mes_remind_status(void)
{
return 0x00ffffff;
}
void user_ANCS_recv_data_src(uint8_t conidx,uint8_t *p_data, uint16_t len)
{
uint8_t msg_type = CATEGORY_OTHER;
uint16_t i = 0;
uint16_t data_len = 0;
uint8_t att_flag = 0;
uint8_t event_id = p_data[i++];
uint32_t uid = *(uint32_t *)(p_data + i);
i+=4;
printf("evt_id:%d,uid:%x,len:%d\r\n",event_id,uid,len);
uint8_t ancs_data_len = 0;
uint8_t *ancs_data_buff = (uint8_t *)pvPortMalloc(MESSAGE_MAX_LENGTH);
if(ancs_data_buff == NULL)
return;
memset(ancs_data_buff,0,MESSAGE_MAX_LENGTH);
while((i < len) && (att_flag != 0xff))
{
switch(p_data[i++])
{
case NTF_ATT_ID_APPLE:
if( att_flag|0x01)
{
data_len = *(uint16_t *)(p_data + i);
i+=2;
uint32_t mes_type_remind_status = user_test_get_mes_remind_status();
if(mes_type_remind_status == 0)
break;
for (uint8_t j = 0; j < (sizeof(msg_type_string)/sizeof(char *)); j++)
{
// if( memcmp(p_data+i,msg_type_string[j],strlen(msg_type_string[j])) == 0 )
if( strstr((const char *)(p_data+i),(const char *)msg_type_string[j]) != NULL )
{
//is enable?
if(mes_type_remind_status & (1<<j))
msg_type = j;
else
msg_type = CATEGORY_NULL;
printf("msg_type:%d\r\n",msg_type);
break;
}
}
i+=data_len;
att_flag |= 1;
}
break;
case NTF_ATT_ID_TITLE: //UTF-8
if( att_flag|0x02)
{
data_len = *(uint16_t *)(p_data + i);
i+=2;
//date & time
ancs_data_len = 17;//type(1 bytes) + total_len(1 bytes) + date + time<6D>?5 bytes //20220211T210959<35>?
if(ancs_data_len + data_len >= 64)
{
data_len = 64 - ancs_data_len;
}
ancs_data_buff[ancs_data_len] = data_len+1;//空出一个\0
ancs_data_len ++;
memcpy(ancs_data_buff+ancs_data_len,p_data + i,data_len);
ancs_data_len += data_len;
ancs_data_len ++;//空出一个\0
i+=data_len;
att_flag |= 2;
}
break;
case NTF_ATT_ID_SUBTITLE: //UTF-8
data_len = *(uint16_t *)(p_data + i);
i+=2;
i+=data_len;
break;
case NTF_ATT_ID_MSG: //UTF-8
if(att_flag|0x04)
{
data_len = *(uint16_t *)(p_data + i);
i+=2;
if(ancs_data_len + data_len >= MESSAGE_MAX_LENGTH)
{
data_len = MESSAGE_MAX_LENGTH - ancs_data_len;
}
ancs_data_buff[ancs_data_len] = data_len;
ancs_data_len ++;
memcpy(ancs_data_buff+ancs_data_len,p_data + i,data_len);
ancs_data_len += data_len;
// total len
ancs_data_buff[1] = ancs_data_len;
//msg type
ancs_data_buff[0] = msg_type;
i+=data_len;
att_flag |= 4;
}
break;
case NTF_ATT_ID_MSG_SIZE: //ASCII
data_len = *(uint16_t *)(p_data + i);
i+=2;
i+=data_len;
break;
case NTF_ATT_ID_DATE: //ASCII
if(att_flag|0x08)
{
data_len = *(uint16_t *)(p_data + i);
i += 2;
memcpy(ancs_data_buff+2,p_data + i,15);
i += data_len;
att_flag |= 8;
// if(att_flag == 0x0f)
// {
// goto parse_end;
// }
}
break;
case NTF_ATT_ID_POSITIVE_ACT: //UTF-8
data_len = *(uint16_t *)(p_data + i);
i += 2;
i += data_len;
break;
case NTF_ATT_ID_NEGATIVE_ACT: //UTF-8
data_len = *(uint16_t *)(p_data + i);
i += 2;
i += data_len;
break;
default:
printf("ERRR\r\n");
break;
}
}
if((att_flag == 0x0f) && (msg_type != CATEGORY_NULL))
// if((att_flag == 0x0f))
{
if(ancs_data_buff[1] > 17 )
{
// ancs_msg_ipc_send(msg_type,ancs_data_buff,ancs_data_len);
//show the message
// printf("msg_type:%d\r\n",msg_type);
// printf("ancs_data_len:%d,data:\r\n",ancs_data_len);
// for (uint8_t m = 0; m < ancs_data_len; m++)
// {
// printf("0x%x,",ancs_data_buff[m]);
// }
// printf("%s\r\n",ancs_data_buff);
if(fr_lv_message_add(ancs_data_buff))
gui_task_msg_send(MESSAGE_IN_EVT,NULL,0,NULL,0,NULL);
}
}
vPortFree(ancs_data_buff);
}
/*
//============================================
//test add message
info_msg_t test_data5=
{
.msg_type = 5,
.data_len = 17+50,
.msg_time = {"20231005"},
.msg_context = {"\x0atest_data51a555"},
};
static uint8_t message_counter = 0;
void test_show_message(void)
{
char test_disp_title[] = {"这是标题"};
// char test_disp_context[] = {"晚上一起去打球!"};
char test_disp_context[] = {"天气0testest"};
test_disp_context[8] = 0x30+message_counter;
message_counter++;
uint16_t char1_len = sizeof(test_disp_title);
uint16_t char2_len = sizeof(test_disp_context);
printf("size of test_disp_title:%d\r\n",char1_len);
printf("size of test_disp_context:%d\r\n",char2_len);
test_data5.data_len = 17+char1_len+char2_len;
test_data5.msg_context[0] = char1_len;
memcpy(&test_data5.msg_context[1],test_disp_title,char1_len);
uint8_t *test_ptr = &test_data5.msg_context[char1_len+1];
test_ptr[0] = char2_len;
memcpy(&test_ptr[1],test_disp_context,char2_len);
if(fr_lv_message_add(&test_data5))
{
printf("add new meesage!ok\r\n");
lv_event_send(prj_parent_cont, LV_EVENT_ANCS_MSG_IN, NULL);
}
}
*/

View File

@ -0,0 +1,46 @@
#ifndef __USER_ANCS_INFO_INTERGRATION_H__
#define __USER_ANCS_INFO_INTERGRATION_H__
#include "fr_watch.h"
typedef enum
{
CATEGORY_WECHAT = 0,
CATEGORY_MOBILE_PHONE,
CATEGORY_FACEBOOK,
CATEGORY_FLICKR,
CATEGORY_GMAIL,
CATEGORY_GOOGLE_PLUS,
CATEGORY_HANGOUTS,
CATEGORY_INS,
CATEGORY_KAKAO,
CATEGORY_LINE,
CATEGORY_LINK,
CATEGORY_MESSAGE,
CATEGORY_MESSENGER,
CATEGORY_PINTEREST,
CATEGORY_QQ,
CATEGORY_SKYPE,
CATEGORY_SNAPCHAT,
CATEGORY_TELEGRAM,
CATEGORY_TUMBLR,
CATEGORY_TWITTER,
CATEGORY_VIBER,
CATEGORY_VKONTAKTE,
CATEGORY_WHATSAPP,
CATEGORY_YOUTUBE,
CATEGORY_ZALO,
CATEGORY_OTHER,
//-------------
CATEGORY_NULL,
}ANCS_category_id_t;
bool fr_lv_message_add(uint8_t *data);
bool fr_lv_message_delete(uint8_t elem_index);
info_msg_t *fr_lv_message_get_latest_info(void);
info_msg_t *fr_lv_message_get_info(uint8_t elem_index);
uint8_t fr_lv_message_get_info_length(void);
void fr_lv_message_clear_all(void);
void user_ANCS_recv_data_src(uint8_t conidx,uint8_t *p_data, uint16_t len);
#endif

View File

@ -0,0 +1,52 @@
/**
* @file lv_frame.h
*
*/
#ifndef LV_FRAME_H
#define LV_FRAME_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "lvgl.h"
#include "fr_ui_node.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void fr_main_roll_cont(lv_obj_t *parent,lv_point_t *top);
void fr_del_float_win(void);
extern bool frame_log_enable;
/*=====================
* Other functions
*====================*/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,92 @@
/**
* @file lv_ui_node.h
*
*/
#ifndef LV_UI_NODE_H
#define LV_UI_NODE_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "lvgl.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
//ui node
typedef uint16_t lv_ui_entry_id_t;
typedef struct
{
uint16_t scroll_dir : 1;
uint16_t node_style : 3;
uint16_t reserved : 12;
}lv_ui_node_attr_t;
typedef struct
{
lv_ui_entry_id_t child_0_id;
lv_ui_entry_id_t child_1_id;
lv_point_t child_0_top;
lv_point_t child_1_top;
lv_ui_node_attr_t attr;
}lv_ui_node_t;
#define UI_NODE_MAX_DEPTH 12
#define CUSTOM_ID_ARRY_NUMBER 12
typedef void (* ui_func)(lv_obj_t *obj,lv_point_t *top);
/**********************
* GLOBAL PROTOTYPES
**********************/
void lv_ui_node_stack_init(void);
void lv_ui_node_func(lv_obj_t *parent, lv_ui_node_t *node);
void lv_ui_node_add(lv_obj_t *node_parent,lv_obj_t * obj_scroll,ui_func cur,ui_func next,bool scroll_dir);
void lv_ui_node_alpha_fade_func(lv_obj_t *parent, lv_ui_node_t *node);
void lv_ui_node_alpha_fade_add(lv_obj_t *node_parent,lv_obj_t * obj_scroll,ui_func cur,ui_func next,bool scroll_dir);
void lv_ui_node_alpha_blend_func(lv_obj_t *parent, lv_ui_node_t *node);
void lv_ui_node_alpha_blend_add(lv_obj_t *node_parent,lv_obj_t * obj_scroll,ui_func cur,ui_func next,bool scroll_dir);
void lv_ui_node_zoom_blend_func(lv_obj_t *parent, lv_ui_node_t *node);
void lv_ui_node_zoom_blend_add(lv_obj_t *node_parent,lv_obj_t * obj_scroll,ui_func cur,ui_func next,bool scroll_dir);
bool lv_ui_node_set_cur_p(lv_point_t * top);
bool lv_ui_node_get_cur(lv_ui_node_t * e);
bool lv_ui_node_set_cur(lv_ui_node_t * e);
bool lv_ui_node_pop_ex(lv_ui_node_t * e);
void lv_ui_node_hor_prev(lv_obj_t *parent);
bool lv_alpha_fade_set(lv_obj_t * parent,lv_opa_t value);
/*=====================
* Other functions
*====================*/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif

View File

@ -0,0 +1,776 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "lvgl.h"
#include "fr_watch.h"
#include "lv_common_function.h"
#define WATCH_DEBUG(fmt, arg...) printf("[WATCH]" fmt "\r\n", ##arg)
//cm3 input
ipc_daily_data_t sync_cm3_data;
sleep_history_stru sleep_history_data = {0};
uint8_t sportheartrate_historydata[72] = {0};
uint8_t heartrate_historydata[48] = {0};
ctp_type_t tp;
ctp_timer_t tp_timer;
extern lv_obj_t *prj_parent_cont;
extern lv_obj_t *prj_call_cont;
lv_obj_t *cur_show_vol_slider = NULL;
uint8_t msg_list_total;
ancs_msg_t msglist;
call_record_list_t record_list;
uint8_t call_context[200];
uint8_t call_list[200];
uint8_t book_list[10][200];
#ifdef FR508X_DSP_SDK
static uint8_t dsp_power_on_step = 0;
static uint8_t remind_index_backup;
uint8_t OTA_STEP = 0;
uint8_t system_mainUI_sw_state_backup;
// volatile bool get_sleep_data_flag = false;
uint8_t get_sleep_data_flag = 0xa5;
bool get_sleep_data_success_flag = false;
bool get_heartrate_data_success_flag = false;
bool init_remind_func_flag = false;
bool calling_wakeup_flag = false;
extern uint8_t phonenumber[];
extern uint8_t phonenName[];
extern bool call_flag;
extern bool coming_call_ok;
static uint32_t start_tick = 0;
static uint32_t next_tick = 0;
uint32_t elaps = 0;
extern uint8_t ctp_last_point;
extern lv_point_t point_FIFO;
extern uint8_t *music_context;
extern lv_obj_t * obj_context;
extern bool get_phone_book_flag;
extern bool phone_book_is_bank_flag;
extern bool get_all_sport_history_flag;
extern uint8_t *sport_history_p;
extern uint16_t sport_history_len;
//static uint8_t test_datadata[240] = {0};
extern sleep_history_stru sleep_history_data;
static uint8_t lcm_init_flag = false;
static bool backlight_flag = 0;
void turn_on_device_backlight(void)
{
if(!backlight_flag){
dsp_post_operate_to_m3(DSP_EVT_TURN_ON_BACKLIGHT,NULL,0);
backlight_flag = 1;
}
}
void m3_drv_calling(uint8_t *buffer, uint16_t length)
{
#if 1
if (!call_flag)
{
call_flag = true;
uint32_t len = buffer[0]+1;
WATCH_DEBUG("length : %d \r\n",length);
if(length < 2)
{
coming_call_ok = true;
//phonenumber[0] = 0;
//phonenName[0] = 0;
memset(call_context,0,200);
}
else
{
coming_call_ok = false;
//memcpy(&phonenumber, buffer, len);
//uint32_t name_len = buffer[len] + 1;
//memcpy(&phonenName, buffer+len, name_len);
memcpy(call_context,buffer,length);
}
dsp_post_operate_to_m3(DSP_EVT_GET_CALL_STATE,NULL,0);
//co_delay_100us(1000);
WATCH_DEBUG("LV_EVENT_CALL_IN \r\n");
}
#endif
}
void do_m3_message_input(uint8_t *buffer, uint16_t length)
{
switch (buffer[0])
{
case M3_DRIVER_CALLING:
m3_drv_calling(buffer + 1, length - 1);
break;
case M3_DRIVER_CALLING_CANCE:
if (call_flag)
{
//if(prj_call_cont != NULL)
if(lv_obj_is_valid(prj_call_cont))
{
m3_log("LV_EVENT_CALL_REJECT \n");
lv_event_send(prj_call_cont, LV_EVENT_CALL_REJECT, NULL);
//WATCH_DEBUG("LV_EVENT_CALL_REJECT \r\n");
}
}
break;
case M3_DRIVER_CALLING_OK:
if (call_flag)
{
//if(prj_call_cont != NULL)
if(lv_obj_is_valid(prj_call_cont))
{
m3_log("LV_EVENT_CALL_OK \n");
lv_event_send(prj_call_cont, LV_EVENT_CALL_OK, NULL);
//WATCH_DEBUG("fLV_EVENT_CALL_OK \r\n");
}
}
break;
case M3_DRIVER_CALLING_STATE:
{
//WATCH_DEBUG("LV_EVENT_CALL_IN %d\r\n",buffer[1]);
if(buffer[1])
{
coming_call_ok = true;
}
if(lv_obj_is_valid(prj_parent_cont))
{
lv_event_send(prj_parent_cont, LV_EVENT_CALL_IN, NULL);
}
}
break;
default:
break;
}
}
void show_reg(uint8_t *data, uint32_t len, uint8_t dbg_on)
{
uint32_t i = 0;
if (len == 0 || (dbg_on == 0))
return;
for (; i < len; i++)
{
printf("0x%02X ", data[i]);
}
printf("\r\n");
}
ancs_t *ancs_msg;
#define NTF_ATT_ID_APPLE 0
#define NTF_ATT_ID_TITLE 1
#define NTF_ATT_ID_SUBTITLE 2
#define NTF_ATT_ID_MSG 3
#define NTF_ATT_ID_MSG_SIZE 4
#define NTF_ATT_ID_DATE 5
#define NTF_ATT_ID_POSITIVE_ACT 6
#define NTF_ATT_ID_NEGATIVE_ACT 7
show_reg(uint8_t *data, uint32_t len, uint8_t dbg_on)
{
uint32_t i = 0;
if (len == 0 || (dbg_on == 0))
return;
for (; i < len; i++)
{
printf("0x%02X ", data[i]);
}
printf("\r\n");
}
void show_utf8_hex(uint8_t *data, uint32_t len, uint8_t dbg_on)
{
uint32_t i = 0;
if (len == 0 || (dbg_on == 0))
return;
for (; i < len; i++)
{
printf("%02X", data[i]);
}
printf("\r\n");
}
void ancs_message_read(uint8_t *p_data, uint16_t len)
{
#if 0
uint16_t str_len = 0;
uint16_t i = 0;
uint16_t data_len = 0;
uint8_t msg_type = 0;
uint8_t event_id = p_data[i++];
uint8_t ntf_att_id;
uint8_t len_byte_h,len_byte_l;
//uint32_t uid = *(uint32_t *)(p_data + i);
i+=4;
printf("evt_id:%d,len:%d\r\n",event_id,len);
while(i < len)
{
ntf_att_id = p_data[i];
printf("ntf_att_id %d\r\n",ntf_att_id);
i ++;
switch(ntf_att_id)//p_data[i++])
{
case NTF_ATT_ID_APPLE:
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
//data_len = *(uint16_t *)(p_data + i);
i+=2;
//show_reg(p_data + i,data_len,1);
if( memcmp(p_data+i,"com.tencent.xin",strlen("com.tencent.xin"))==0 )
msg_type = WEIXIN;
else if( memcmp(p_data+i,"com.apple.MobileSMS",strlen("com.apple.MobileSMS"))==0 )
msg_type = MOBILE_SMS;
else if( memcmp(p_data+i,"com.apple.mobilephone",strlen("com.apple.mobilephone"))==0 )
msg_type = MOBILE_PHONE;
else if( memcmp(p_data+i,"com.tencent.mqq",strlen("com.tencent.mqq"))==0 )
msg_type = QQ;
else if( memcmp(p_data+i,"com.tencent.qq",strlen("com.tencent.qq"))==0 )
msg_type = QQ;
ancs_msg->msg_type = msg_type;
printf("NTF_ATT_ID_APPLE,msg_type:%d,len:%d\r\n",msg_type,data_len);
i+=data_len;
break;
case NTF_ATT_ID_TITLE: //UTF-8
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
ancs_msg->title_len = data_len;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_TITLE,len:%d\r\n",data_len);
i+=2;
memcpy(ancs_msg->msg_title,p_data + i,data_len);
show_utf8_hex(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_SUBTITLE: //UTF-8
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_SUBTITLE,len:%d\r\n",data_len);
i+=2;
show_utf8_hex(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_MSG: //UTF-8
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
ancs_msg->context_len = data_len;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_MSG,len:%d\r\n",data_len);
i+=2;
memcpy(ancs_msg->msg_context,p_data + i,data_len);
show_utf8_hex(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_MSG_SIZE: //ASCII
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_MSG_SIZE,len:%d\r\n",data_len);
i+=2;
show_reg(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_DATE: //ASCII
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
ancs_msg->time_len = data_len;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_DATE,len:%d\r\n",data_len);
i+=2;
memcpy(ancs_msg->msg_time,p_data + i,data_len);
show_reg(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_POSITIVE_ACT: //UTF-8
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_POSITIVE_ACT,len:%d\r\n",data_len);
i+=2;
show_utf8_hex(p_data + i,data_len,1);
i+=data_len;
break;
case NTF_ATT_ID_NEGATIVE_ACT: //UTF-8
len_byte_l = * (p_data + i);
len_byte_h = * (p_data + i + 1);
data_len = (len_byte_h << 8) | len_byte_l;
//data_len = *(uint16_t *)(p_data + i);
printf("NTF_ATT_ID_NEGATIVE_ACT,len:%d\r\n",data_len);
i+=2;
show_utf8_hex(p_data + i,data_len,1);
i+=data_len;
break;
default:
printf("ERRR\r\n");
break;
}
}
#else
memset(ancs_msg->msg_title, 0, 128);
ancs_msg->title_len = p_data[16];
memcpy(ancs_msg->msg_title,p_data+17,ancs_msg->title_len);
memset(ancs_msg->msg_context, 0, 256);
ancs_msg->context_len = p_data[17+ancs_msg->title_len - 1];
memcpy(ancs_msg->msg_context, p_data+17+ancs_msg->title_len, ancs_msg->context_len);
#endif
}
void do_m3_ancs_msg_input(uint8_t *buffer, uint16_t length)
{
ancs_msg->msg_type = buffer[0];
switch (buffer[0])
{
case CATEGORY_WECHAT:
WATCH_DEBUG("WEIXIN");
ancs_message_read(buffer + 1, length - 1);
break;
case CATEGORY_SMS:
WATCH_DEBUG("MOBILE_SMS");
ancs_message_read(buffer + 1, length - 1);
break;
case CATEGORY_PHONE:
WATCH_DEBUG("MOBILE_PHONE");
ancs_message_read(buffer + 1, length - 1);
break;
case CATEGORY_QQ:
WATCH_DEBUG("QQ");
ancs_message_read(buffer + 1, length - 1);
break;
default:
break;
}
}
void ipc_m3_msg_input(uint8_t *buffer, uint16_t length)
{
uint8_t key_value;
//printf("freemomery :%d",xPortGetFreeHeapSize());
switch (buffer[0])
{
case 0:
break;
case M3_DRIVER_MESSAGE_INPUT:
{
lv_msg_t msg;
msg.data = buffer;
msg.data_len = length;
lv_msg_post_event(&msg);
}
break;
case M3_DRIVER_KEY_INPUT:
//key input
if(dsp_get_ui_scene_mode() != UI_APP_CHARGE)
{
key_value = buffer[1];
key_code = key_value;
// m3_log("key code: %d \n", key_value);
}
break;
case M3_DRIVER_CTP_INPUT:
next_tick = start_tick;
start_tick = lv_tick_get();
elaps = start_tick - next_tick;
//printf("elaps = %d\r\n",elaps);
memcpy(&tp, buffer + 1, length - 1);
//touch
uint8_t input_key = tp.ctp_status & 0xfe;
tp.ctp_status = tp.ctp_status & 0x01;
if (tp.ctp_status)
{
if (!tp_timer.start_flag)
{
tp_timer.start_flag = 1;
tp_timer.pen_timeout_counter = 0;
//WATCH_DEBUG("first point, keypress:%d,x:%d,y:%d \r\n",tp.ctp_status,tp.cur_pos_x,tp.cur_pos_y);
}
else
tp_timer.pen_timeout_counter = 0;
ctp_last_point++;
if (ctp_last_point > 20)
ctp_last_point = 20;
point_FIFO.x = tp.cur_pos_x;
point_FIFO.y = tp.cur_pos_y;
}
else
{
tp_timer.start_flag = 0;
}
//WATCH_DEBUG("length:%d, keypress:%d,x:%d,y:%d \r\n",length -1,tp.ctp_status,tp.cur_pos_x,tp.cur_pos_y);
break;
case M3_DRIVER_DAILY_DATA:
{
ipc_daily_data_t *p_data = (ipc_daily_data_t *)(buffer + 1);
if (p_data->panel_state > PANEL_STATE_OFF)
{
// WATCH_DEBUG("panel on . step %d\r\n",dsp_power_on_step);
//power_on_ctrl_init_panel = 0;
if (dsp_power_on_step == 0)
dsp_power_on_step = 1;
if(!lcm_init_flag)
{
lcd_gc9c01_init();
lcm_init_flag = true;
}
}
else if (p_data->panel_state == PANEL_STATE_OFF)
{
//it will be to send ui state to cm3
WATCH_DEBUG("panel sleep \r\n");
lcm_enter_sleep();
lcm_init_flag = false;
}
if(coming_call_ok)
{
break;
}
memcpy(&sync_cm3_data, buffer + 1, length - 1);
//WATCH_DEBUG("y:%d,m:%d,d:%d \r\n", sync_cm3_data.time.ucYear, sync_cm3_data.time.ucMonth, sync_cm3_data.time.ucDate);
//WATCH_DEBUG("h:%d,m:%d,s:%d \r\n", sync_cm3_data.time.ucHour, sync_cm3_data.time.ucMinute, sync_cm3_data.time.ucSecond);
if(get_sleep_data_flag == 0xa5)
{
get_sleep_data_flag = 0;
printf("send sleep cmd\r\n");
dsp_set_system_sleep_history_cmd();
dsp_set_system_version();
}
}
break;
case M3_DRIVER_MESSAGE_INFO:
if(coming_call_ok)
break;
if(buffer[1])
{
//all messaged
memcpy(&msglist, buffer + 2, length -2);
//show_reg(buffer + 2,length -2,1);
msg_list_total = msglist.msg_tatol;
}
else
{
//one message
memcpy(&msglist.fifo[0], buffer + 2, length -2);
//show_reg(buffer + 2,length -2,1);
#if 0
memset(ancs_msg->msg_title, 0, 128);
ancs_msg->title_len = buffer[16+2];
memcpy(ancs_msg->msg_title,buffer+17+2,ancs_msg->title_len);
memset(ancs_msg->msg_context, 0, 256);
ancs_msg->context_len = buffer[17+2+ancs_msg->title_len - 1];
memcpy(ancs_msg->msg_context, buffer+17+2+ancs_msg->title_len, ancs_msg->context_len);
#endif
lv_event_send(prj_parent_cont, LV_EVENT_ANCS_MSG_IN, NULL);
}
break;
case M3_DRIVER_CAllLIST_INFO:
get_phone_book_flag = false;
if(buffer[1] == 1) //upload record list
{
memset(&record_list,0,sizeof(call_record_list_t));
memcpy(&record_list, buffer + 2, length -2);
}
else if(buffer[1] == 3) //upload one record
{
memset(call_list,0,200);
memcpy(call_list,buffer+2,length-2);
}
else if(buffer[1] == 2) //upload no find
{
memset(call_list,0,200);
}
else if(buffer[1] == 4) //phone book total
{
//phone_book_total = 3;//(uint32_t)(buffer + 2);
//m3_log("phone_book_total : %d \n", phone_book_total);
phone_book_total = (buffer[2] << 24) | (buffer[3] << 16) | (buffer[4] << 8) | buffer[5];
m3_log("phone_book_total : %d \n", phone_book_total);
//m3_log("v : %x,%x,%x,%x \n", buffer[2],buffer[3],buffer[4],buffer[5]);
}
else //upload one call info form phone book
{
memset(call_list,0,200);
memcpy(call_list,buffer+2,length-2);
phone_book_is_bank_flag = false;
}
//show_reg(buffer + 2,length -2,1);
//WATCH_DEBUG("M3_DRIVER_CAllLIST_INFO %d\r\n",call_list[0]);
break;
case M3_DRIVER_OTA_STEP:
OTA_STEP = buffer[1];
break;
case M3_MUSIC_CONTROL:
WATCH_DEBUG("M3_MUSIC_CONTROL \r\n");
music_context = pvPortMalloc(length);
if(music_context != NULL)
{
memcpy(music_context, buffer+2, length-2);
music_context[length-2]= '\0';
WATCH_DEBUG("M3_MUSIC_CONTROL 1\r\n");
if(lv_obj_is_valid(obj_context))
{
WATCH_DEBUG("M3_MUSIC_CONTROL 2\r\n");
lv_event_send(obj_context, LV_EVENT_MSUIC_CONTEXT_IN, NULL);
}
vPortFree(music_context);
}
break;
case M3_DRIVER_UI_JUMP:
{
printf("M3_DRIVER_UI_JUMP\r\n");
lv_msg_t msg;
msg.data = buffer;
msg.data_len = length;
lv_msg_post_event(&msg);
}
break;
case M3_DRIVER_HISTORY_DATA:
if(*(buffer + 1) == 0x01)
{
memcpy(heartrate_historydata, buffer + 2, length - 2);
get_heartrate_data_success_flag = true;
printf("heartrate length:%d\r\n",(length - 2));
}
else if(*(buffer + 1) == 0x02)
{
//It's sleep data
memcpy(&sleep_history_data, buffer + 2, length - 2);
get_sleep_data_success_flag = true;
//printf("sleep data,length:%d\r\n",(length - 2));
}
else if(*(buffer + 1) == 0x03)
{
memcpy(sportheartrate_historydata, buffer + 2, length - 2);
//printf("heartrate:%d\r\n",(length - 2));
}
else if(*(buffer + 1) == 0x04) //运动记录
{
get_all_sport_history_flag = false;
// memcpy(sportheartrate_historydata, buffer + 2, length - 2);
sport_history_p = buffer + 2;
sport_history_len = length - 2;
}
break;
case M3_DRIVER_SEND_DATA:
{
//m3_log("M3_DRIVER_SEND_DATA.cmd:%d\r\n",buffer[1]);
switch (buffer[1])
{
case 0:
{
lv_msg_t msg;
msg.data = buffer;
msg.data_len = length;
lv_msg_post_event(&msg);
}
break;
case 1:
{
uint32_t stopwatch_count = 0;
stopwatch_count |= buffer[2] << (8 * 3);
stopwatch_count |= buffer[3] << (8 * 2);
stopwatch_count |= buffer[4] << (8 * 1);
stopwatch_count |= buffer[5] << (8 * 0);
printf("m3 stopwatch count = %d\n",stopwatch_count);
stopwatch_tick_inc(stopwatch_count);
}
break;
}
}
break;
default:
break;
}
}
LV_ATTRIBUTE_LARGE_CONST const uint8_t week_char[7][5] =
{
"Sun","Mon","Tues","Wed","Thur","Fri","Sat",
};
LV_ATTRIBUTE_LARGE_CONST const uint8_t battery_char[5][5] =
{
LV_SYMBOL_BATTERY_EMPTY,
LV_SYMBOL_BATTERY_1,
LV_SYMBOL_BATTERY_2,
LV_SYMBOL_BATTERY_3,
LV_SYMBOL_BATTERY_FULL,
};
void topbar_status_bt_baterrry_time(lv_obj_t * bar_bat,lv_obj_t * bar_time)
{
uint8_t i = 50;//(lv_transform_battery(sync_cm3_data.battery.battery_value) +19) / 20;
if(i > 0)
{
i -= 1;
}
lv_obj_align(bar_bat,LV_ALIGN_TOP_LEFT,30,10);
if(sync_cm3_data.ble_state)
lv_label_set_text_fmt(bar_bat,LV_SYMBOL_BLUETOOTH" %s",battery_char[i]);
else
lv_label_set_text_fmt(bar_bat," %s",battery_char[i]);
lv_obj_align(bar_time,LV_ALIGN_TOP_RIGHT,-40,10);
lv_label_set_text_fmt(bar_time,"%d:%d",sync_cm3_data.time.ucHour,sync_cm3_data.time.ucMinute);
}
void dsp_printf_to_m3(const char * fmt, ...)
{
va_list ap;
char text[256];
memset(text, 0, sizeof(text));
text[0] = DSP_INTERNAL_EVENT;
memcpy(text+1, "[dsp]", 5);
va_start(ap, fmt);
lv_vsnprintf(text+6, 249, fmt, ap);
strcat(text, "\n");
lv_msg_t msg;
msg.data = text;
msg.data_len = strlen(text)+1;
lv_msg_post_event(&msg);
va_end(ap);
}
uint32_t CalcWeekday(time_rtc_t time)
{
char century_code, year_code, month_code, day_code;
int week = 0;
century_code = year_code = month_code = day_code = 0;
if (time.ucMonth == 1 || time.ucMonth == 2)
{
century_code = (time.ucYear - 1) / 100;
year_code = (time.ucYear - 1) % 100;
month_code = time.ucMonth + 12;
day_code = time.ucDate;
}
else
{
century_code = time.ucYear / 100;
year_code = time.ucYear % 100;
month_code = time.ucMonth;
day_code = time.ucDate;
}
week = year_code + year_code / 4 + century_code / 4 - 2 * century_code + 26 * (month_code + 1) / 10 + day_code - 1;
week = week > 0 ? (week % 7) : ((week % 7) + 7);
return week;
}
#endif
void dsp_post_operate_to_m3(uint8_t op_cmd,uint8_t *buffer,uint16_t len)
{
#ifdef FR508X_DSP_SDK
uint8_t op_head[2];
op_head[0] = 0;
op_head[1] = op_cmd;
ipc_msg_with_payload_send(IPC_MSG_M3_INPUT, op_head,2,buffer,len,NULL);
#endif
}

View File

@ -0,0 +1,647 @@
#ifndef __FR_WATCH_H__
#define __FR_WATCH_H__
#include "lvgl.h"
#include "user_ipc_st.h"
#include "fr_ui_node.h"
#include "fr_frame.h"
#include "lv_msg_event.h"
#include "lv_user_sqstack.h"
#define I16 signed short
typedef enum
{
M3_DRIVER_CALLING = 1,
M3_DRIVER_CALLING_CANCE = 2,
M3_DRIVER_CALLING_OK = 3,
M3_DRIVER_CALLING_STATE = 4,
}phone_call_t;
typedef enum
{
M3_DRIVER_MESSAGE_INPUT = 7,
M3_DRIVER_CTP_INPUT = 8,
M3_DRIVER_KEY_INPUT = 9,
M3_DRIVER_DAILY_DATA = 10,
M3_DRIVER_MESSAGE_INFO = 11,
M3_DRIVER_CAllLIST_INFO = 12,
M3_MUSIC_CONTROL = 13,
M3_DRIVER_OTA_STEP = 14,
M3_DRIVER_UI_JUMP = 15,
M3_DRIVER_UI_REMIND = 16,
//new add
M3_DRIVER_HISTORY_DATA = 17,
M3_DRIVER_TEST_DATA = 18,
#if ALIPAY_FUNC_ENABLE
M3_DRIVER_UPAY_DATA= 19,
#endif
M3_DRIVER_SEND_DATA = 20,// 切换主表盘ID
DSP_INTERNAL_EVENT = 21,
DSP_CALLOUT_EVENT = 22,
}watch_ipc_msg_type_t;
//byte[0] 1开关心<E585B3>? byte[1]:0关闭心率 1开启心<E590AF>?
//byte[0] 2开关血<E585B3>? byte[1]:0关闭血<E997AD>?1开启血<E590AF>?
//byte[0] 3开关血<E585B3>? byte[1]:0关闭血<E997AD>?1开启血<E590AF>?
//byte[0] 4马达震动 byte[1]:0关闭震动 1开启震<E590AF>? byte[2]:震动次数
//byte[0] 5查找手机 byte[1]:1查找手机
//byte[0] 6音乐播放暂停根据AVRCP的状<E79A84>?get_avrcp_work_state();0:停止 1:开<>? 2:暂停
//byte[0] 7音乐暂停<E69A82>?
//byte[0] 8音乐停止
//byte[0] 9上一<E4B88A>?
//byte[0] 10下一<E4B88B>?
//byte[0] 11音量++
//byte[0] 12音量--
//byte[0] 13拨号 byte[1......12]参数带拨号号<E58FB7>?长度+13714106071
//byte[0] 14接听
//byte[0] 15拒接
//byte[0] 16重拨
//byte[0] 17静音 目前功能无效续作优化
//byte[0] 18关机
//byte[0] 19复位
//byte[0] 20重启
//byte[0] 21开关抬腕亮<E88595>? byte[1]:0关闭抬腕亮屏 1开启抬腕亮<E88595>?
//byte[0] 22设置亮屏时间 byte[1]:
//byte[0] 23设置亮度调节 byte[1]:亮度等级
//byte[0] 24语言设置 byte[1]:参看枚举类型定义
//byte[0] 25闹钟开<E9929F>? byte[1]:
//byte[0] 26: 秒表控制 byte[1]:1开<31>? 2暂停 0关闭
//byte[0] 27: 运动模式控制 byte[1]:1开<31>?2暂停 0停止保存数据
//byte[0] 28: 拍照
//byte[0] 29: 开关背<E585B3>?
//byte[0] 30: 是否延迟闹钟10分再次触<E6ACA1>?
//byte[0] 31: 倒计<E58092>? byte[1]:1开<31>? 2暂停 0关闭
//byte[0] 32: 同步byte[1]:1心率 byte[2]心率<E5BF83>? 同步byte[1]:2血压byte[2]低压byte[3]高压 同步byte[1]:3血氧byte[2]血氧<E8A180>?到APP
//byte[0] 33: APP切换表盘
//byte[0] 34: 语音助手
//byte[0] 35: 主动开关音频蓝牙开<E78999>?byte[1] 1开启音频蓝<E9A291>? 0关闭音频蓝<E9A291>?
typedef enum
{
DSP_EVT_NULL = 0,
DSP_EVT_HEART, // 1 byte[0] 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte[1]:0<>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DSP_EVT_BLOOD, // 2 byte[0] 2<><32><EFBFBD><EFBFBD>Ѫѹ byte[1]:0<>ر<EFBFBD>Ѫѹ 1<><31><EFBFBD><EFBFBD>Ѫѹ
DSP_EVT_OXYGEN, // 3 byte[0] 3<><33><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA> byte[1]:0<>ر<EFBFBD>Ѫ<EFBFBD><D1AA> 1<><31><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA>
DSP_EVT_MOTOR, // 4 byte[0] 4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte[1]:0<>ر<EFBFBD><D8B1><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte[2]:<3A>𶯴<EFBFBD><F0B6AFB4><EFBFBD>
DSP_EVT_FIND, // 5 byte[0] 5<><35><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD> byte[1]:1<><31><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>
#if 0
DSP_EVT_MUSIC_PLAY, // 6 byte[0] 6<><36><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AVRCP<43><50>״̬ get_avrcp_work_state();0:ֹͣ 1:<3A><><EFBFBD><EFBFBD> 2:<3A><>ͣ
DSP_EVT_MUSIC_PAUSE, // 7 byte[0] 7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>
DSP_EVT_MUSIC_STOP, // 8 byte[0] 8<><38><EFBFBD><EFBFBD>ֹͣ
DSP_EVT_MUSIC_FORWARD, // 9 byte[0] 9<><39>һ<EFBFBD><D2BB>
DSP_EVT_MUSIC_BACKWARD, // 10 byte[0] 10<31><30>һ<EFBFBD><D2BB>
DSP_EVT_MUSIC_VALUME_UP, // 11 byte[0] 11<31><31><EFBFBD><EFBFBD>++
DSP_EVT_MUSIC_VALUME_DOWN,// 12 byte[0] 12<31><32><EFBFBD><EFBFBD>--
DSP_EVT_DIAL_NUM, //13 byte[0] 13<31><33><EFBFBD><EFBFBD> byte[1......12]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD>+13714106071
DSP_EVT_CALL_ANSWER, //14 byte[0] 14<31><34><EFBFBD><EFBFBD>
DSP_EVT_CALL_REJECT, //15 byte[0] 15<31>ܽ<EFBFBD>
DSP_EVT_CALL_REDIAL, //16 byte[0] 16<31>ز<EFBFBD>
DSP_EVT_CALL_MUTE, //17 byte[0] 17<31><37><EFBFBD><EFBFBD> Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>
#endif
DSP_EVT_SYSTEM_SHUTDOWN, //18 byte[0] 18<31>ػ<EFBFBD>
DSP_EVT_SYSTEM_RESET, //19 byte[0] 19<31><39>λ
DSP_EVT_SYSTEM_REBOOT, //20 byte[0] 20<32><30><EFBFBD><EFBFBD>
DSP_EVT_WIRST, //21 byte[0] 21<32><31><EFBFBD><EFBFBD>̧<EFBFBD><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte[1]:0<>ر<EFBFBD>̧<EFBFBD><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>̧<EFBFBD><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DSP_EVT_LIGHT_TIME, //22 byte[0] 22<32><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> byte[1]:
DSP_EVT_BRIGHT, //23 byte[0] 23<32><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD> byte[1]:<3A><><EFBFBD>ȵȼ<C8B5>
DSP_EVT_SYSTEM_LANGUAGE, //24 byte[0] 24<32><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte[1]:<3A>ο<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
DSP_EVT_ALARM, //25 byte[0] 25<32><35><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> byte[1]:
DSP_EVT_WATCHSTOP_TIME, //26 byte[0] 26: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? byte[1]:1<><31><EFBFBD><EFBFBD> 2<><32>ͣ 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 0<>ر<EFBFBD>
DSP_EVT_SPORTS, //27 byte[0] 27: <20>˶<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> byte[1]:1<><31>ʼ 2<><32>ͣ 0ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DSP_EVT_CAMERA, //28 byte[0] 28: <20><><EFBFBD><EFBFBD>
DSP_EVT_SWATCH_BRIGHT, //29 byte[0] 29: <20><><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
DSP_EVT_ALARM_DELAY, //30 byte[0] 30: <20>Ƿ<EFBFBD><C7B7>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD>ٴδ<D9B4><CEB4><EFBFBD>
DSP_EVT_TIMER_TIME, //31 byte[0] 31: <20><><EFBFBD><EFBFBD>ʱ byte[1]:1<><31><EFBFBD><EFBFBD> 2<><32>ͣ 0<>ر<EFBFBD>
DSP_EVT_SYNC_HERAT_BLOOD_OXYGEN,//32 byte[0] 32: ͬ<><CDAC>byte[1]:1<><31><EFBFBD><EFBFBD> byte[2]<5D><><EFBFBD><EFBFBD>ֵ ͬ<><CDAC>byte[1]:2Ѫѹbyte[2]<5D><>ѹbyte[3]<5D><>ѹ ͬ<><CDAC>byte[1]:3Ѫ<33><D1AA>byte[2]Ѫ<><D1AA>ֵ <20><>APP
DSP_EVT_SELECT_WATCH_INDEX,//33 byte[0] 33: <20>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
DSP_EVT_SYSTEM_SIRI, //34 byte[0] 34: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DSP_EVT_BT_SWATCH, //35 byte[0] 35: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>byte[1] 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> 0<><30><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
//enzon
DSP_EVT_LOAD_PHONE_BOOK,
DSP_EVT_BT_A2DP_CONTROL,
DSP_EVT_MUSIC_CONTROL,
DSP_EVT_CALL_CONTROL,
DSP_EVT_BT_VALUME_UP,
DSP_EVT_BT_VALUME_DOWN,
DSP_EVT_READ_MSG_LIST,
DSP_EVT_READ_PHONE_BOOK_LIST,
DSP_EVT_READ_CALL_NAME,
DSP_EVT_DISTURB_CONTROL,
DSP_EVT_SET_PHONE_BOOK_ID_OFFSET,
DSP_EVT_SET_BT_VALUME,
DSP_EVT_MIC_MUTE,
DSP_EVT_MIC_OPEN,
DSP_EVT_CLEAR_LIGHT_TIME,
DSP_EVT_GET_HISTORY_DATA,
DSP_EVT_GET_CALL_STATE,
DSP_EVT_SET_CARD_INDEX, //自定义卡<E4B989>?
DSP_EVT_LOW_POWER_MODE,
DSP_EVT_DSP_VERSION,
DSP_EVT_GET_TEST_DATA,
DSP_EVT_BREATHE,
DSP_EVT_DATA_SEND_BLE,
DSP_EVT_CAMERA_CONTROL,
DSP_EVT_PRINTF,
DSP_EVT_READ_PHONE_BOOK_TOTAL,
DSP_EVT_TURN_ON_BACKLIGHT,
}_DSP_COMMADE_T;
#define MESSAGE_MAX_LENGTH 200
#define MAX_MSG_CONTEXT_LEN MESSAGE_MAX_LENGTH - 17
typedef struct
{
uint8_t msg_type;
uint8_t data_len;
uint8_t msg_time[15];
//1 byte(title len) + n byte(title) + 1 byte (context leng)+ n byte(context)
uint8_t msg_context[MAX_MSG_CONTEXT_LEN];
} info_msg_t;
#define MAX_MSG_LIST 5
typedef struct
{
uint8_t msg_tatol;
uint8_t fifo_head;
uint8_t fifo_tail;
info_msg_t fifo[MAX_MSG_LIST];
} ancs_msg_t;
//ancs
typedef struct
{
uint8_t msg_type;
uint16_t title_len;
uint8_t msg_title[128];
uint16_t context_len;
uint8_t msg_context[512];
uint16_t time_len;
uint8_t msg_time[32];
}ancs_t;
typedef struct
{
uint8_t story_state;
uint8_t number_len;
uint8_t call_namber[32];
uint8_t name_len;
uint8_t call_name[128];
uint8_t time_len;
uint8_t msg_time[32];
}call_info_t;
#define CALL_NUMBER_MAX_LEN 96
#define CALL_RECORD_LIST_MAX 10
typedef struct
{
uint8_t call_state;
uint8_t call_context[CALL_NUMBER_MAX_LEN - 1];
} card_record_t;
#define MAX_MSG_LIST 5
typedef struct
{
uint8_t call_record_total;
card_record_t fifo[CALL_RECORD_LIST_MAX];
} call_record_list_t;
//tp define here!
typedef enum
{
CTP_PEN_DOWN,
CTP_PEN_UP,
CTP_PEN_MOVE,
CTP_PEN_MOVE_DOWN,
CTP_PEN_MOVE_UP,
CTP_PEN_MOVE_LEFT,
CTP_PEN_MOVE_RIGHT,
CTP_PEN_LONG_PRESS,
}ctp_status_t;
typedef struct
{
uint8_t status;
uint8_t ctp_status;
signed short pendown_pos_x;
signed short pendown_pos_y;
signed short cur_pos_x;
signed short cur_pos_y;
signed short dx;
signed short dy;
}ctp_type_t;
typedef enum
{
TP_MSG_INPUT,
APP_MSG_INPUT,
}watch_msg_id_t;
//massage
typedef struct
{
int msg_id;
int param1;
void *param2;
}app_msg_t;
typedef struct
{
//bool start_flag;
uint8_t start_flag;
uint32_t counter;
uint32_t pen_timeout_counter;
uint32_t delaycounter;
}ctp_timer_t;
//win coordinate
typedef struct
{
uint8_t col;
uint8_t rol;
}win_pos_t;
typedef struct
{
uint32_t EnterSleepTime;
uint32_t ExitSleepTime;
uint16_t SleepData[31];
}sleep_history_stru;
//----------------------------clock-ui---------------------------------
typedef void (* p_main_clock)(lv_obj_t * obj);
typedef lv_obj_t * (*p_lv_obj_create)(lv_obj_t * parent);
typedef void (* p_lv_obj_clean)(lv_obj_t * obj);
//style
typedef void (* p_lv_obj_set_style_bg_color)(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_style_pad_all)(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_style_radius)(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_style_border_width)(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
//obj prop
typedef void (* p_lv_obj_set_size)(lv_obj_t * obj, lv_coord_t w, lv_coord_t h);
typedef void (* p_lv_obj_align)(lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs);
typedef void (* p_lv_obj_align_to)(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs);
typedef void (* p_lv_obj_set_pos)(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
typedef void (* p_lv_obj_set_scrollbar_mode)(lv_obj_t * obj, lv_scrollbar_mode_t mode);
//img
typedef lv_obj_t * (*p_lv_img_create)(lv_obj_t * parent);
typedef void (* p_lv_img_set_src)(lv_obj_t * obj, const void * src);
typedef void (* p_lv_img_set_pivot)(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
typedef void (* p_lv_img_set_angle)(lv_obj_t * obj, int16_t angle);
//timer
typedef lv_timer_t * (* p_lv_timer_create)(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data);
typedef void (* p_lv_timer_del)(lv_timer_t * timer);
//event
typedef struct _lv_event_dsc_t * (* p_lv_obj_add_event_cb)(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data);
typedef lv_res_t (* p_lv_event_send)(lv_obj_t * obj, lv_event_code_t event_code, void * param);
typedef lv_event_code_t (* p_lv_event_get_code)(lv_event_t * e);
typedef lv_obj_t * (* p_lv_event_get_target)(lv_event_t * e);
typedef void * (* p_lv_event_get_param)(lv_event_t * e);
typedef void * (* p_lv_event_get_user_data)(lv_event_t * e);
//parent and child
typedef uint32_t (* p_lv_obj_get_child_id)(const lv_obj_t * obj);
typedef lv_obj_t * (* p_lv_obj_get_parent)(const lv_obj_t * obj);
typedef lv_obj_t * (* p_lv_obj_get_child)(const lv_obj_t * obj, int32_t id);
//label
typedef lv_obj_t * (* p_lv_label_create)(lv_obj_t * parent);
typedef void (* p_lv_label_set_text)(lv_obj_t * obj, const char * text);
typedef void (* p_lv_obj_set_style_text_font)(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector);
typedef void (* p_lv_mainUI_select_entry)(lv_obj_t * obj);
//line & arc
typedef void (* p_lv_style_init)(lv_style_t * style);
typedef void (* p_lv_style_set_line_width)(lv_style_t * style, lv_coord_t value);
typedef void (* p_lv_style_set_line_color)(lv_style_t * style, lv_color_t value);
typedef void (* p_lv_style_set_line_rounded)(lv_style_t * style, bool value);
typedef lv_obj_t * (* p_lv_line_create)(lv_obj_t * parent);
typedef void (* p_lv_line_set_points)(lv_obj_t * obj, const lv_point_t points[], uint16_t point_num);
typedef void (* p_lv_obj_add_style)(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector);
typedef lv_obj_t * (* p_lv_arc_create)(lv_obj_t * parent);
typedef void (* p_lv_obj_set_style_arc_width)(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_style_arc_color)(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
typedef void (* p_lv_arc_set_end_angle)(lv_obj_t * obj, uint16_t end);
typedef void (* p_lv_arc_set_bg_angles)(lv_obj_t * obj, uint16_t start, uint16_t end);
typedef int16_t (* p_lv_trigo_sin)(int16_t angle);
typedef int16_t (* p_lv_trigo_cos)(int16_t angle);
typedef void (* p_lv_label_set_text_fmt)(lv_obj_t * obj, const char * fmt, ...);
typedef bool (* p_lv_font_get_glyph_dsc_fmt_txt)(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter,uint32_t unicode_letter_next);
typedef const uint8_t * (* p_lv_font_get_bitmap_fmt_txt)(const lv_font_t * font, uint32_t unicode_letter);
typedef uint32_t (* p_lv_tick_get)(void);
typedef bool (* p_lv_obj_is_valid)(const lv_obj_t * obj);
typedef uint8_t (* p_fr_system_get_time_week)(void);
typedef void (* p_lv_obj_set_style_text_color)(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
//new
typedef void (* p_lv_obj_remove_style)(struct _lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector);
typedef void (* p_lv_arc_set_angles)(lv_obj_t * arc, uint16_t start, uint16_t end);
typedef void (* p_lv_obj_clear_flag)(lv_obj_t * obj, lv_obj_flag_t f);
typedef void (* p_lv_label_set_recolor)(lv_obj_t * obj, bool en);
typedef void (* p_lv_obj_set_style_text_letter_space)(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_style_text_line_space)(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
typedef void (* p_lv_obj_set_width)(lv_obj_t * obj, lv_coord_t w);
typedef void (* p_lv_obj_set_style_text_align)(struct _lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector);
typedef struct _lv_api_t
{
p_lv_obj_create f_lv_obj_create;
p_lv_obj_clean f_lv_obj_clean;
//style
p_lv_obj_set_style_bg_color f_lv_obj_set_style_bg_color;
p_lv_obj_set_style_pad_all f_lv_obj_set_style_pad_all;
p_lv_obj_set_style_radius f_lv_obj_set_style_radius;
p_lv_obj_set_style_border_width f_lv_obj_set_style_border_width;
//obj prop
p_lv_obj_align f_lv_obj_align;
p_lv_obj_set_size f_lv_obj_set_size;
p_lv_obj_align_to f_lv_obj_align_to;
p_lv_obj_set_pos f_lv_obj_set_pos;
p_lv_obj_set_scrollbar_mode f_lv_obj_set_scrollbar_mode;
//img
p_lv_img_create f_lv_img_create;
p_lv_img_set_src f_lv_img_set_src;
p_lv_img_set_pivot f_lv_img_set_pivot;
p_lv_img_set_angle f_lv_img_set_angle;
//timer
p_lv_timer_create f_lv_timer_create;
p_lv_timer_del f_lv_timer_del;
//event
p_lv_event_send f_lv_event_send;
p_lv_obj_add_event_cb f_lv_obj_add_event_cb;
p_lv_event_get_code f_lv_event_get_code;
p_lv_event_get_target f_lv_event_get_target;
p_lv_event_get_param f_lv_event_get_param;
p_lv_event_get_user_data f_lv_event_get_user_data;
//parent and child
p_lv_obj_get_child_id f_lv_obj_get_child_id;
p_lv_obj_get_parent f_lv_obj_get_parent;
p_lv_obj_get_child f_lv_obj_get_child;
//label
p_lv_label_create f_lv_label_create;
p_lv_label_set_text f_lv_label_set_text;
p_lv_obj_set_style_text_font f_lv_obj_set_style_text_font;
//other
p_lv_mainUI_select_entry f_lv_mainUI_select_entry;
lv_obj_t ** prj_parent;
ipc_daily_data_t *p_sync_cm3;
p_lv_style_init f_lv_style_init;
p_lv_style_set_line_width f_lv_style_set_line_width;
p_lv_style_set_line_color f_lv_style_set_line_color;
p_lv_style_set_line_rounded f_lv_style_set_line_rounded;
p_lv_line_create f_lv_line_create;
p_lv_line_set_points f_lv_line_set_points;
p_lv_obj_add_style f_lv_obj_add_style;
p_lv_arc_create f_lv_arc_create;
p_lv_obj_set_style_arc_width f_lv_obj_set_style_arc_width;
p_lv_obj_set_style_arc_color f_lv_obj_set_style_arc_color;
p_lv_arc_set_end_angle f_lv_arc_set_end_angle;
p_lv_arc_set_bg_angles f_lv_arc_set_bg_angles;
p_lv_trigo_sin f_lv_trigo_sin;
p_lv_trigo_cos f_lv_trigo_cos;
p_lv_label_set_text_fmt f_lv_label_set_text_fmt;
lv_font_t * font_min;
lv_font_t * font_mid;
lv_font_t * font_max;
p_lv_font_get_glyph_dsc_fmt_txt f_lv_font_get_glyph_dsc_fmt_txt;
p_lv_font_get_bitmap_fmt_txt f_lv_font_get_bitmap_fmt_txt;
p_lv_tick_get f_lv_tick_get;
p_lv_obj_is_valid f_lv_obj_is_valid;
p_fr_system_get_time_week f_fr_system_get_time_week;
p_lv_obj_set_style_text_color f_lv_obj_set_style_text_color;
// new
p_lv_obj_remove_style f_lv_obj_remove_style;
p_lv_arc_set_angles f_lv_arc_set_angles;
p_lv_obj_clear_flag f_lv_obj_clear_flag;
p_lv_label_set_recolor f_lv_label_set_recolor;
p_lv_obj_set_style_text_letter_space f_lv_obj_set_style_text_letter_space;
p_lv_obj_set_style_text_line_space f_lv_obj_set_style_text_line_space;
p_lv_obj_set_width f_lv_obj_set_width;
p_lv_obj_set_style_text_align f_lv_obj_set_style_text_align;
}lv_api_t;
typedef struct _main_program_env{
uint32_t version;
struct {
void *(*__malloc)(uint32_t size);
void (*__free)(void *ptr);
} mem_api;
struct {
int (*__printf)(const char* format, ...);
} debug_api;
void * img_addr;
lv_obj_t * parent;
void * arg;
lv_api_t * lv_api;
}main_program_env_t;
//----------------------------------------------------------------
typedef int (* app_entry)(main_program_env_t * arg);
typedef void (* ui_entry)(lv_obj_t *obj, lv_point_t *top);
//#define PRI_UI_GROUP_NUM 20
typedef struct _lv_ui_group_t
{
lv_coord_t ui_num;
ui_entry * lay_ui;
}lv_ui_group_t;
// ui page stack
typedef struct
{
uint16_t mode_id : 4;
uint16_t page_id : 12;
uint16_t page_attr;
int16_t top_cur_x;
int16_t top_cur_y;
}ui_scene_t;
#define PG_STACK_LEN 10
typedef struct
{
ui_scene_t ui[PG_STACK_LEN];
int s_top;
}pg_stack_t;
extern lv_api_t ui_api;
extern p_main_clock * entry_main;
extern p_main_clock * entry_main1;
extern p_main_clock * entry_main2;
extern p_main_clock * entry_main3;
extern p_main_clock * entry_main4;
extern const lv_font_t arialuni_20;
extern lv_font_t bin_font;
extern void **font_addr;
extern void lv_init_bin_font(lv_font_t * font,const void * dsc,const lv_font_t * scr);
extern lv_point_t sys_scroll_sum;
//varable
extern ctp_type_t tp;
extern uint8_t key_code;
extern ipc_daily_data_t sync_cm3_data;
//extern ipc_daily_data_t volatile sync_cm3_data;
extern sleep_history_stru sleep_history_data;
extern uint8_t sportheartrate_historydata[72];
extern uint8_t heartrate_historydata[];
extern lv_obj_t * prj_parent_cont;
extern lv_obj_t * prj_prev_cont;
extern lv_indev_t * indev_keypad;
extern ui_func pri_ui_group[];
extern uint8_t dsp_ipc_cmd;
extern lv_group_t *prj_group;
extern lv_obj_t *group_tail_obj;
extern uint8_t lv_transform_battery(uint16_t battery_value);
//system & timer & driver
extern void lvgl_main_task_timer_callback(void *arg);
//ui
extern void lv_guimain(lv_obj_t * obj);
extern void ui_main_float(lv_obj_t * parent);
extern void layer_main_cont(lv_obj_t * parent, ui_entry f_parent, ui_entry f_cont, ui_entry f_cont1);
extern void layer_left_cont(lv_obj_t * parent, ui_entry f_cont, ui_entry f_cont1);
extern void return_function(lv_obj_t * parent);
extern uint32_t CalcWeekday(time_rtc_t time);
extern void topbar_status_bt_baterrry_time(lv_obj_t * bar_bat,lv_obj_t * bar_time);
extern void dsp_post_operate_to_m3(uint8_t op_cmd,uint8_t *buffer,uint16_t len);
extern ancs_msg_t msglist;
extern uint8_t msg_list_total;
extern call_record_list_t record_list;
extern uint8_t call_context[];
extern uint8_t call_list[];
extern uint8_t book_list[10][200];
extern uint32_t phone_book_total;
#define m3_log //dsp_printf_to_m3
#endif // __MAIN_H__

View File

@ -0,0 +1,73 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "fr_watch.h"
#include "lvgl.h"
#ifdef FR508X_DSP_SDK
lv_msg_t * lv_msg_list = NULL;
void lv_msg_callback(uint8_t *buffer, uint16_t length)
{
}
void lv_msg_post_event(lv_msg_t *p_msg)
{
lv_msg_t *curr;
lv_msg_t *msg = pvPortMalloc(sizeof(lv_msg_t));
if(msg != NULL)
{
memcpy(msg,p_msg,sizeof(lv_msg_t));
msg->data = pvPortMalloc(p_msg->data_len);
if(msg->data != NULL)
{
memcpy(msg->data,p_msg->data,p_msg->data_len);
msg->func = lv_msg_callback;
GLOBAL_INT_DISABLE();
msg->next = NULL;
if(lv_msg_list == NULL)
{
lv_msg_list = msg;
}
else
{
for (curr = lv_msg_list;
curr->next;
curr = curr->next)
{
}
curr->next = msg;
}
GLOBAL_INT_RESTORE();
}
}
}
void lv_msg_do_event(void)
{
lv_msg_t *curr;
if(lv_msg_list != NULL)
{
GLOBAL_INT_DISABLE();
curr = lv_msg_list;
lv_msg_list = curr->next;
GLOBAL_INT_RESTORE();
curr->func(curr->data,curr->data_len);
vPortFree(curr->data);
vPortFree(curr);
}
}
#endif

View File

@ -0,0 +1,22 @@
#ifndef LV_MSG_EVENT_H__
#define LV_MSG_EVENT_H__
typedef uint8_t (* lv_msg_callback_t)(uint8_t *arg, uint16_t len);
typedef struct lv_msg
{
struct lv_msg * next;
lv_msg_callback_t func;
uint16_t id;
uint16_t data_len;
uint8_t * data;
}lv_msg_t;
void ancs_message_read(uint8_t *p_data, uint16_t len);
void lv_msg_post_event(lv_msg_t *p_msg);
#endif

View File

@ -0,0 +1,164 @@
#include "lvgl.h"
#include "img_def.h"
#include "lv_common_function.h"
#include "lv_user_sqlist.h"
/**
* @Function:
* @Descripttion: 删除第index个元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @return {*}
*/
StatusType lv_user_list_delete(SqlistType_t *list,uint8_t index)
{
uint8_t length = list->length;
if((index < 0) || (index > length))
return OVERFLOW;
//-----------------------------------
ElemType_t *delete_ptr = &list->data[index];
//尾元素地址+1
ElemType_t *p = &list->data[length];
for(;delete_ptr < p;delete_ptr++)
{
*delete_ptr = *(delete_ptr+1);
}
list->length --;
return SUCCESS;
}
/**
* @Function:
* @Descripttion: 在第index个元素之前插入新元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @param {ElemType_t} e
* @return {*}
*/
StatusType lv_user_list_insert(SqlistType_t *list,uint8_t index,ElemType_t e)
{
uint8_t length = list->length;
if((index < 0) || (index > length))
return OVERFLOW;
//-----------------------------------
ElemType_t *insert_ptr = &(list->data[index]);
//尾元素地址+1
ElemType_t *ptr = &(list->data[length]);
for(;insert_ptr < ptr;--ptr)
{
*ptr = *(ptr-1);
}
*insert_ptr = e;
list->length ++;
return SUCCESS;
}
/**
* @Function:
* @Descripttion: 替换第i元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @param {ElemType_t} e
* @return {*}
*/
StatusType lv_user_list_replace(SqlistType_t *list,uint8_t index,ElemType_t e)
{
uint8_t length = list->length;
if((index < 0) || (index > length))
return OVERFLOW;
list->data[index] = e;
return SUCCESS;
}
/**
* @Function:
* @Descripttion: 根据元素获取id
* @param {ElemType_t} e
* @return {*} note:0xff->fail
*/
uint8_t lv_user_list_get_elem_id(SqlistType_t *list,ElemType_t e)
{
uint8_t i = 0;
ElemType_t *p = list->data;
uint8_t length = list->length;
while ((i < length) && (*p++ != e))
{
++i;
}
if(i < length)
return i;
else
return 0xff;
}
/**
* @Function:
* @Descripttion: 获取sqlist长度
* @param {SqlistType_t} *list
* @return {*}
*/
uint8_t lv_user_list_get_sqlist_length(SqlistType_t *list)
{
return list->length;
}
/**
* @Function:
* @Descripttion: 获取第index个元素的上一元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @return {*}
*/
ElemType_t lv_user_list_get_prev_elem(SqlistType_t *list,uint8_t index)
{
uint8_t length = list->length;
if(index == 0)
index = length-1;
else
index --;
return list->data[index];
}
/**
* @Function:
* @Descripttion: 获取第index个元素的下一元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @return {*}
*/
ElemType_t lv_user_list_get_next_elem(SqlistType_t *list,uint8_t index)
{
uint8_t length = list->length;
index ++;
index %= length;
return list->data[index];
}
/**
* @Function:
* @Descripttion: 获取第index个元素
* @param {SqlistType_t} *list
* @param {uint8_t} index
* @return {*}
*/
ElemType_t lv_user_list_get_cur_elem(SqlistType_t *list,uint8_t index)
{
return list->data[index];
}
/**
* @Function:
* @Descripttion: 遍历整个list元素
* @param {SqlistType_t} *list
* @return {*}
*/
void ListTraverse(SqlistType_t *list)
{
uint8_t length = list->length;
printf("length:%d,sqlist all data:\r\n",length);
for (uint8_t i = 0; i < length; i++)
{
printf("0x%x,",list->data[i]);
}
printf("\r\n");
}

View File

@ -0,0 +1,30 @@
#ifndef __LV_USER_SQLIST_H__
#define __LV_USER_SQLIST_H__
typedef uint8_t ElemType_t;
typedef struct
{
ElemType_t *data;
uint8_t length;
}SqlistType_t;
//0:success,>=1:fail
typedef uint8_t StatusType;
//最大支持的长度
#define SQLIST_MAX_LENGTH 15
//状态
#define SUCCESS 0
#define OVERFLOW 1 //上下标溢出
//--------------------------------------------------------
StatusType lv_user_list_delete(SqlistType_t *list,uint8_t index);
StatusType lv_user_list_insert(SqlistType_t *list,uint8_t index,ElemType_t e);
StatusType lv_user_list_replace(SqlistType_t *list,uint8_t index,ElemType_t e);
uint8_t lv_user_list_get_elem_id(SqlistType_t *list,ElemType_t e);
ElemType_t lv_user_list_get_prev_elem(SqlistType_t *list,uint8_t index);
ElemType_t lv_user_list_get_next_elem(SqlistType_t *list,uint8_t index);
ElemType_t lv_user_list_get_cur_elem(SqlistType_t *list,uint8_t index);
uint8_t lv_user_list_get_sqlist_length(SqlistType_t *list);
void ListTraverse(SqlistType_t *list);
#endif

View File

@ -0,0 +1,45 @@
#include "lvgl.h"
#include "img_def.h"
#include "lv_common_function.h"
void lv_user_sqstatck_init(SeqStack *SS)
{
SS->topidx = 0;
}
uint8_t lv_user_get_sqstatck_top(SeqStack *SS,uint8_t *top)
{
if(SS->topidx == 0)
return 0;
// --SS->topidx;
*top = SS->Data[SS->topidx-1];
// SS->Data[SS->topidx] = 0;
return 1;
}
//error:0,success:1;
uint8_t lv_user_sqstatck_push(SeqStack *SS,uint8_t elem)
{
if(SS->topidx >= (SQ_STACK_MAXSIZE-1))
return 0;
SS->Data[SS->topidx++] = elem;
return 1;
}
//error:0,success:1;
uint8_t lv_user_sqstatck_pop(SeqStack *SS,uint8_t *elem)
{
if(SS->topidx == 0)
return 0;
--SS->topidx;
*elem = SS->Data[SS->topidx];
SS->Data[SS->topidx] = 0;
return 1;
}

View File

@ -0,0 +1,18 @@
#ifndef __LV_USER_SQSTACK_H__
#define __LV_USER_SQSTACK_H__
//元素最多为SQ_STACK_MAXSIZE-1个,栈顶要占一个
#define SQ_STACK_MAXSIZE 7
typedef struct
{
uint8_t Data[SQ_STACK_MAXSIZE];
uint8_t topidx;
}SeqStack;
void lv_user_sqstatck_init(SeqStack *SS);
uint8_t lv_user_sqstatck_push(SeqStack *SS,uint8_t elem);
uint8_t lv_user_sqstatck_pop(SeqStack *SS,uint8_t *elem);
#endif

View File

@ -0,0 +1,314 @@
#ifndef __USER_IPC_ST_H__
#define __USER_IPC_ST_H__
#include "fr_ui_node.h"
typedef enum
{
DAILY_DATA,
SYNC_DATA,
INFO_DATA,
}ipc_data_type_t;
typedef struct
{
uint16_t ucYear;
uint8_t ucMonth;
uint8_t ucDate;
uint8_t ucHour;
uint8_t ucMinute;
uint8_t ucSecond;
}time_rtc_t;
//battery
typedef enum
{
BATTERY_GO,
BATTERY_LOW,
BATTERY_FULL,
BATTERY_CHARGEIN,
}battery_state_t;
typedef struct
{
uint8_t state; //battery_state_t
uint16_t battery_value;
}battery_t;
//weather
typedef enum
{
WEATHER_SNOW,
WEATHER_SUN,
WEATHER_CLOUDY,
}weather_type_t;
typedef struct
{
uint8_t type; //weather_type_t
int16_t cur_tempture;
int16_t h_tempture;
int16_t l_tempture;
}weather_t;
typedef enum
{
UI_MAIN,
UI_FLOAT_WIN_UP,
UI_FLOAT_WIN_LEFT,
UI_FLOAT_WIN_DOWN,
UI_MENU,
UI_MAX
}ui_mode_t;
typedef struct
{
uint8_t ui_page_id;
uint16_t ui_page_cur_x;
uint16_t ui_page_cur_y;
}ui_layer_t;
typedef enum
{
PANEL_STATE_OFF,
PANEL_STATE_ON,
PANEL_STATE_MAX
}panel_state_t;
typedef struct
{
uint8_t ui_mode; //ui_mode_t
uint8_t ui_page_id; //mode 0 page id
uint8_t ui_node_lv;
//--------new
uint8_t time_format; // 0 : 24小时<E5B08F>?1:12小时<E5B08F>?
uint8_t temperature_format; //0 : 摄氏度1华氏摄氏度
uint8_t distance_format; //0 : 公制<E585AC>?<EFBC9A>?
//clock id
uint8_t ui_clock_id;
//ui default style
uint8_t ui_default_style;
//menu style
uint8_t ui_menu_style_id;
//language
uint8_t ui_language;
uint8_t ui_backlight_brightness;
uint8_t ui_lock;
uint8_t ui_reset;
uint8_t ui_powerdown;
uint8_t ui_music_state;
uint8_t ui_prev_mode;
// 节点栈定义
uint8_t ui_node_depth;
lv_ui_node_t ui_node_stack[UI_NODE_MAX_DEPTH];
//--------new
uint8_t custom_page_mode[CUSTOM_ID_ARRY_NUMBER];
}ui_info_t;
typedef struct
{
uint32_t start_time;
uint16_t total_time;
uint16_t speed;
uint16_t step;
uint16_t cal;
uint16_t dis;
uint8_t heart;
uint8_t max_heart;
uint8_t min_heart;
uint8_t sports_mode;
uint8_t sports_heart[72];// 72
}_sport_t;
typedef struct
{
_sport_t data[5];
uint8_t index;
}_sport_data_t;
//===========================================================
typedef struct
{
uint32_t sport_total_time;
uint16_t total_carloie;
uint8_t avg_hrm;
//once
uint8_t sport_type;
uint32_t sport_time;
uint16_t speed;
uint16_t step;
uint16_t distance;
uint16_t carloie;
uint8_t state;
uint8_t hrm;
uint8_t max_hrm;
uint8_t min_hrm;
uint8_t oxygen;
}sport_t;
typedef struct
{
uint8_t isEn;
uint8_t Repeat;
uint32_t alarm_time_value;
}Alarm_type;
typedef struct//<2F><><EFBFBD><EFBFBD>
{
unsigned char flag;//<2F><><EFBFBD><EFBFBD>
unsigned char hour;//ʱ
unsigned char minute;//<2F><>
unsigned char weekday;//<2F><><EFBFBD><EFBFBD>
//unsigned char data[50];//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}_clockTime;
typedef struct
{
//system state
//bt state
uint8_t bt_state;
uint8_t bt_on_off;
//ble state
uint8_t ble_state;
uint8_t ble_on_off;
//time
time_rtc_t time;
//battery state
battery_t battery;
uint8_t panel_state;
//system info
uint8_t version;
//------new add
//uint16_t version;
uint8_t ble_address[6];
//step message
uint32_t step;
uint32_t calorie;
uint32_t distance;
uint8_t motion;
uint8_t cadence_step;
uint16_t cadence_amp;
uint8_t cadence_degree;
uint8_t sleep_active;
//hearte message
uint8_t bpm;
uint8_t bpm_warning_h;
uint8_t bpm_warning_l;
//o2
uint8_t sbp;
uint8_t dbp;
uint8_t spo2;
//blood
uint8_t blood_h;
uint8_t blood_l;
//ui display
ui_info_t ui_info;
//weather message
weather_t day1;
weather_t day2;
weather_t day3;
weather_t day4;
weather_t day5;
weather_t day6;
weather_t day7;
//time tick
uint32_t system_tick_value;
////volume
uint8_t bt_volume_media;
uint8_t bt_volume_hfp;
uint8_t bt_volume_tone;
uint8_t dsp_version;
//-----new add
//uint16_t dsp_version;
uint8_t disturb_state;
uint8_t phone_book_sync_state; //0 error,phone server off, 1 syncing, 2 finished
uint16_t phone_book_id_offset;
uint16_t sleep_total_time;
uint16_t deep_sleep_time;
uint16_t light_sleep_time;
//cm3 tick counter
uint32_t user_tick_counter;
sport_t sport;
uint16_t light_auto_close_time;
uint8_t audio_mic_on;
_clockTime alarm[5];
uint32_t timer_init_value;
uint32_t count_down_counter;
uint16_t m3_version_new;
uint16_t dsp_version_new;
//----new add
uint32_t steptarget;
uint8_t camera_state;
uint8_t low_power_state;
uint8_t count_down_counter_state;
//----new
uint8_t device_alarm_index;
uint8_t watch_hrm_value;
uint8_t remind_index;
uint32_t stopwatch_time;
uint16_t phone_book_len;
//lv_ui_node_t ui_node_stack[UI_NODE_MAX_DEPTH];
//uint8_t ui_node_depth; //当前列表的长度
}ipc_daily_data_t;
typedef struct
{
ipc_data_type_t type;
}ipc_info_t;
#endif

View File

@ -0,0 +1,414 @@
/* Standard includes. */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
/* LVGL includes */
#include "lvgl.h"
#include "fdb_app.h"
#include "ff.h"
#include "elog.h"
#include "audio_scene.h"
/* peripheral drivers */
#include "fr30xx.h"
#include "driver_flash.h"
#include "IC_W25Qxx.h"
#include "app_config.h"
#include "app_task.h"
#include "app_at.h"
#include "app_hw.h"
#include "app_rpmsg.h"
#include "fr_device_pmu_io.h"
#include "fr_device_button.h"
#include "ext_flash.h"
#include "ext_flash_program.h"
#include "host.h"
#include "driver_pmu_iwdt.h"
#include "fr_device_rtc.h"
#include "fr_device_vbat.h"
#include "driver_nv3047_rgb.h"
#include "system_dwt.h"
/* hardware handlers */
SD_HandleTypeDef sdio_handle;
/* file system */
static FATFS fs;
#if ENABLE_RTOS_MONITOR == 1
/* FreeRTOS running status monitor task */
static TaskHandle_t monitor_task_handle;
volatile unsigned int CPU_RunTime;
static uint8_t CPU_RunInfo[2048];
#endif
void sys_wdt_init(void)
{
iwdt_Init_t iwdt_handle;
iwdt_handle.iwdt_int_Enable = WDT_INT_DISABLE;
iwdt_handle.iwdt_Timeout = 0xFFF;
iwdt_handle.iwdt_Count = 32000 * 60; // 32K, timeout 3s
iwdt_init(iwdt_handle);
iwdt_Enable();
}
#if ENABLE_RTOS_MONITOR == 1
static void monitor_task(void *arg)
{
vTaskDelay(5000);
/* enable sleep */
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_TYPE_DISABLE);
sys_wdt_init();
while(1) {
vTaskDelay(30000);
iwdt_Refresh();
rtc_running();
//battery detect
adc_vbat_start_detect();
// memset(CPU_RunInfo,0,2048);
// vTaskList((char *)&CPU_RunInfo);
// printf("---------------------------------------------\r\n");
// printf("name state priority stack seq\r\n");
// printf("%s", CPU_RunInfo);
// printf("---------------------------------------------\r\n");
//
// memset(CPU_RunInfo,0,400);
// vTaskGetRunTimeStats((char *)&CPU_RunInfo);
// printf("name counter usage\r\n");
// printf("%s", CPU_RunInfo);
// printf("---------------------------------------------\r\n");
}
}
#endif
void spi_flash_cs_set(void)
{
#if(SPI_FLASH_GPIO_SEL==1)
gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
#elif(SPI_FLASH_GPIO_SEL==2)
gpio_write_pin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
#endif
}
void spi_flash_cs_clear(void)
{
#if(SPI_FLASH_GPIO_SEL==1)
gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_CLEAR);
#elif(SPI_FLASH_GPIO_SEL==2)
gpio_write_pin(GPIOB, GPIO_PIN_1, GPIO_PIN_CLEAR);
#endif
}
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
( void ) pcTaskName;
( void ) pxTask;
log_i("%s", pcTaskName);
assert( 0 );
}
void vApplicationTickHook(void)
{
//gui tick counter add here!
lv_tick_inc(1);
#if ENABLE_RTOS_MONITOR == 1
CPU_RunTime++;
#endif
}
__RAM_CODE bool user_deep_sleep_check(void)
{
return host_before_sleep_check();
}
__RAM_CODE void user_entry_before_sleep(void)
{
//fputc('S', NULL);
/* wait for UART TX done */
system_delay_us(20);
hw_gpio_save();
ool_write(PMU_REG_PMU_GATE_M, ool_read(PMU_REG_PMU_GATE_M) | 0x40);
}
void wdt_rst_start(void)
{
iwdt_Init_t iwdt_handle;
iwdt_handle.iwdt_int_Enable = WDT_INT_DISABLE;
iwdt_handle.iwdt_Timeout = 0xFFF;
iwdt_handle.iwdt_Count = 32000 * 3; // 32K, timeout 3s
iwdt_init(iwdt_handle);
iwdt_Enable();
}
__RAM_CODE void user_entry_after_sleep(void)
{
/* configure all interrupt priority to 2 */
*(volatile uint32_t *)0xE000E400 = 0x40404040;
*(volatile uint32_t *)0xE000E404 = 0x40404040;
*(volatile uint32_t *)0xE000E408 = 0x40404040;
*(volatile uint32_t *)0xE000E40C = 0x40404040;
*(volatile uint32_t *)0xE000E410 = 0x40404040;
*(volatile uint32_t *)0xE000E414 = 0x40404040;
*(volatile uint32_t *)0xE000E418 = 0x40404040;
*(volatile uint32_t *)0xE000E41C = 0x40404040;
*(volatile uint32_t *)0xE000E420 = 0x40404040;
*(volatile uint32_t *)0xE000E424 = 0x40404040;
*(volatile uint32_t *)0xE000E428 = 0x40404040;
*(volatile uint32_t *)0xE000E42C = 0x40404040;
*(volatile uint32_t *)0xE000E430 = 0x40404040;
*(volatile uint32_t *)0xE000E434 = 0x40404040;
*(volatile uint32_t *)0xE000E438 = 0x40404040;
*(volatile uint32_t *)0xE000E43C = 0x40404040;
*(volatile uint32_t *)0xE000E440 = 0x40404040;
hw_gpio_restore();
ool_write(PMU_REG_PMU_GATE_M, ool_read(PMU_REG_PMU_GATE_M) & (~0x40));
hw_clock_init();
host_hci_reinit();
hw_xip_flash_init(true);
hw_log_init(true);
#if (BOARD_SEL != BOARD_EVB_FR3092E_RGB)
hw_display_init(true);
hw_touchpad_init(true);
hw_external_flash_init(true);
#endif
#if ENABLE_PSRAM
hw_psram_init(true);
#endif
#if DSP_ROM_CODE_XIP
hw_dsp_xip_flash_init(true);
#endif
NVIC_SetPriority(PMU_IRQn, 4);
NVIC_EnableIRQ(PMU_IRQn);
//fputc('W', NULL);
app_rpmsg_recover();
}
int main( void )
{
GPIO_InitTypeDef gpio_config;
UART_HandleTypeDef dsp_uart_handle;
uint32_t error;
uint32_t rand_num;
size_t size;
/* reserve 1s to program data with jlink when sleep or spll is enabled. */
system_delay_us(1000000);
pmu_init();
// /* power on DSP flash */
// ool_write(0xfc, ool_read(0xfc) | 0x01);
/* power on codec */
ool_write(0xc3, 0x27);
#if 0
/* set DSP DLDO to 1.3v */
ool_write(PMU_REG_DSP_DLDO_CTRL, 0x06);
/* short DSP LDO and APP LDO, set APP DLDO to 1.3v */
ool_write(PMU_REG_APP_DLDO_CTRL, 0x86);
#else
/* set SYSTEM BUCK to 1.35v, set DSP LDO and APP LDO to bypass mode */
ool_write(PMU_REG_SYSBUCK_CTRL_0, 0x04);
ool_write(PMU_REG_DSP_DLDO_CTRL, ool_read(PMU_REG_DSP_DLDO_CTRL)| 0x80);
ool_write(PMU_REG_APP_DLDO_CTRL, ool_read(PMU_REG_APP_DLDO_CTRL)| 0x40);
#endif
/* initial system clock and XIP flash */
hw_clock_init();
hw_xip_flash_init(false);
/* try to handshake with PC to program external flash */
ext_flash_program();
system_dwt_init();
/* reinit external flash */
// hw_external_flash_init(false);
/* configure all interrupt priority to 2 */
*(volatile uint32_t *)0xE000E400 = 0x40404040;
*(volatile uint32_t *)0xE000E404 = 0x40404040;
*(volatile uint32_t *)0xE000E408 = 0x40404040;
*(volatile uint32_t *)0xE000E40C = 0x40404040;
*(volatile uint32_t *)0xE000E410 = 0x40404040;
*(volatile uint32_t *)0xE000E414 = 0x40404040;
*(volatile uint32_t *)0xE000E418 = 0x40404040;
*(volatile uint32_t *)0xE000E41C = 0x40404040;
*(volatile uint32_t *)0xE000E420 = 0x40404040;
*(volatile uint32_t *)0xE000E424 = 0x40404040;
*(volatile uint32_t *)0xE000E428 = 0x40404040;
*(volatile uint32_t *)0xE000E42C = 0x40404040;
*(volatile uint32_t *)0xE000E430 = 0x40404040;
*(volatile uint32_t *)0xE000E434 = 0x40404040;
*(volatile uint32_t *)0xE000E438 = 0x40404040;
*(volatile uint32_t *)0xE000E43C = 0x40404040;
*(volatile uint32_t *)0xE000E440 = 0x40404040;
// pmu_reg_write(0xe4, (pmu_reg_read(0xe4)&0xF0)|0x03); //3.3V IO
// pmu_reg_write(0xe6, (pmu_reg_read(0xe6)&0xF0)|0x0F); //1.8V IO 将1.8V io电压抬到最高
// /* initialize uart for DSP UART */
// /* ========================================================== */
// /* ========= Uart LOG configuration ========= */
// /* ========================================================== */
// /* configure PA4 and PA5 to UART1 function */
// gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_5;
// gpio_config.Mode = GPIO_MODE_AF_PP;
// gpio_config.Pull = GPIO_PULLUP;
// gpio_config.Alternate = GPIO_FUNCTION_1;
// gpio_init(GPIOA, &gpio_config);
// /* UART1: used for DSP Log */
// __SYSTEM_UART1_CLK_ENABLE();
// dsp_uart_handle.UARTx = UART1;
// dsp_uart_handle.Init.BaudRate = 3000000;
// dsp_uart_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
// dsp_uart_handle.Init.StopBits = UART_STOPBITS_1;
// dsp_uart_handle.Init.Parity = UART_PARITY_NONE;
// dsp_uart_handle.Init.FIFO_Mode = UART_FIFO_ENABLE;
// dsp_uart_handle.TxCpltCallback = NULL;
// dsp_uart_handle.RxCpltCallback = NULL;
// uart_init(&dsp_uart_handle);
/* initialize uart for log and AT command */
app_at_init();
/* initialize EasyLogger */
elog_init();
/* set EasyLogger log format */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_LVL);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_LVL);
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_LVL);
// elog_set_text_color_enabled(true);
/* start EasyLogger */
elog_start();
log_a("Hello ELOG_LVL_ASSERT!");
log_e("Hello ELOG_LVL_ERROR!");
log_w("Hello ELOG_LVL_WARN!");
log_i("Hello ELOG_LVL_INFO!");
log_d("Hello ELOG_LVL_DEBUG!");
log_v("Hello ELOG_LVL_VERBOSE!");
#if DSP_ROM_CODE_XIP
hw_dsp_xip_flash_init(false);
#endif
/* flashdb is used to manage user enviroments stored in internal flash (XIP flash) */
flashdb_init();
/* get random seed*/
size = flashdb_get(FDB_KEY_USER_RANDOM_SEED, (void *)&rand_num, 4);
printf("flashdb get random seed :%d\r\n",size);
if(size == 0){
__SYSTEM_TRNG_CLK_ENABLE();
trng_init();
trng_read_rand_num((uint8_t *)&rand_num,4);
flashdb_set(FDB_KEY_USER_RANDOM_SEED,(uint8_t *)&rand_num,4);
__SYSTEM_TRNG_CLK_DISABLE();
}
printf("flash db get rand num: %x\r\n",rand_num);
/*
* initialize modules step by step
* 1. app_task
* 2. rpmsg
* 3. btdm stack
* 4. lvgl
* 5. others.....
*/
#if ENABLE_RTOS_MONITOR == 1
xTaskCreate(monitor_task, "monitor", MONITOR_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &monitor_task_handle);
#endif
audio_scene_init(AUDIO_SCENE_TASK_STACK_SIZE, AUDIO_SCENE_TASK_PRIORITY);
app_task_init();
/*
* enable pull up of all 3.3v IO, these configuration will be latched by set
* BIT6 of PMU_REG_PMU_GATE_M regsiter. used to avoid electric leakage
*/
SYSTEM->PortA_PullSelect = 0x0000ff9f;
SYSTEM->PortB_PullSelect = 0x00000fff;
SYSTEM->PortC_PullSelect = 0x00000000;
SYSTEM->PortD_PullSelect = 0x0000ffff;
SYSTEM->PortA_PullEN = 0x00007fff;
SYSTEM->PortB_PullEN = 0x00000fff;
SYSTEM->PortC_PullEN = 0x00000000;
SYSTEM->PortD_PullEN = 0x0000ffff;
SYSTEM->QspiPadConfig.QSPI_PullSelect = 0x00000000;
SYSTEM->QspiPadConfig.QSPI_PullEN = 0xffffffff;
SYSTEM->OspiPadConfig.OSPI_PullSelect = 0x00000000;
SYSTEM->OspiPadConfig.OSPI_PullEN = 0xffffffff;
/* IO33 always on, IO18 off in sleep mode */
ool_write(0x63, 0x08);
__SYSTEM_GPIOB_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_12;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLDOWN;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
gpio_write_pin(GPIOB, GPIO_PIN_12, GPIO_PIN_CLEAR); // motor en: default output low
__SYSTEM_GPIOA_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_5;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOA, &gpio_config);
gpio_write_pin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // HR sensor power en: default output high
/* Start the scheduler itself. */
vTaskStartScheduler();
return 0;
}
#if 1
void dma0_irq(void)
{
#if (BOARD_SEL == BOARD_EVB_FR3092E_RGB)
rgb_display_dma_irq();
#else
IC_W25Qxx_DMA_Interrupt();
#endif
}
#endif
//void dma1_irq(void)
//{
// printf("dma1_irq\r\n");
// IC_W25Qxx_DMA_Interrupt();
//
//
//}
void spimx8_0_irq(void)
{
IC_W25Qxx_Spi_Interrupt();
}

View File

@ -0,0 +1,817 @@
/* *********************************************************** */
/* 2024.04.08 by hsp */
/* *********************************************************** */
#include "app_task.h"
#if PRJ_NUM == A36
#include <string.h>
#include "co_log.h"
#include "gap_api.h"
#include "gatt_api.h"
#include "fdb_app.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "portable.h"
#include "driver_gpio.h"
#include "driver_timer.h"
#include "driver_pwm.h"
#include "fr_device_rtc.h"
//#include "app_task.h"
#include "A36_app.h"
//#include "mycrc.h"
#include "app_lvgl.h"
#include "app_ble.h"
extern uint8_t flagPeerMode;
const uint8_t SWVER[] = {"V1.0"};
static TaskHandle_t app_io_task_handle;
uint8_t speed_task,key_task;
uint8_t BT_GPIO_data;
UART_HandleTypeDef uart2_handle;
//struct UART_COMM uart_com; //命令数据结构体
//#define COMM_RECV_MAX_LEN 24
//static uint8_t comm_recv_char,comm_recv_state;
//static uint32_t comm_recv_index,comm_recv_data_len;
//uint8_t comm_recv_buffer[COMM_RECV_MAX_LEN];
//uint8_t comm_send_buffer[12]={0x55,0xAA,0xFF,0x06,0x00,0x03,0x04,0x05,0x00,0xF1,0xF3,0x5A};
uint8_t display_key,reset_key,start_key,high_low_key;
uint32_t display_key_cnt,reset_key_cnt,start_key_cnt,high_low_key_cnt,co_key_cnt,total_run_time;
uint8_t start_key_index,machine_status,co_status,high_low_index;
uint32_t cnt;
uint32_t last_systime;
/* *************************************************************************** */
//仪表相关 by hsp 2024.04.09
//
/* *************************************************************************** */
#define SPEED_SAVE_NUM 9
#define ONE_KM_VALUE 4012 //1KM 的脉冲数 1KM 保存一次里程
#define TL_M 4102560000
#define DOT_CS 0.0024375
#define DOT_YCS 0.0015145092281401875
#define SPEED_PARA_G 0.8775
#define SPEED_PARA_Y 0.5452233221304675
#define CHANGE_PARA 6
uint32_t last_Tach_timer_tick,tach_value;
uint32_t speed_index,fuel_index,adc_index,Tach_timeout_cnt;
volatile uint32_t speed_data[SPEED_SAVE_NUM];
volatile uint32_t Trip_num,Tach_Period_time;
volatile uint32_t speed_value;
uint32_t save_temp = ONE_KM_VALUE;//1KM;
volatile struct User_data_TypeDef User_param;
uint8_t save_mileage_en,check_key_task,adc_task;
volatile uint32_t MOTOR_CLK;
volatile uint32_t Timer2_CLK;
uint8_t bt_io_cmd[] = {0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0};
uint8_t bt_io_index,io_read_en_flag;
uint8_t gear_data[8];
uint16_t io_adc_data[8],io_adc_value[8],adc_temp;
uint8_t gear_read_cnt,gear_num, gear_num_index;
//uint8_t gear_num,gear_temp,last_gear;
//uint32_t gear_num_cnt,lost_gear;
uint8_t key_value;
uint32_t key_set_h,key_set_l,key_mode_h,key_mode_l,key_press_time;
// END
/* *************************************************************************** */
//uint32_t uart_command_cnt;
//xTimerHandle comm_timer;
//extern uint8_t lvgl_start;
//void system_screen_open(void){
// uint16_t crcrc;
// gpio_write_pin(GPIOB,GPIO_PIN_10,1);
// system_delay_us(200*1000);
// lcd_power_on();
// gpio_write_pin(GPIOB,GPIO_PIN_10,0);
// start_key_index = 1;
// //启动
// comm_send_buffer[8] = 0x01;
// machine_status = 1;
// crcrc = Check_CRC16_Modbus(&comm_send_buffer[6],3);
// uart_transmit(&uart2_handle,comm_send_buffer,12);
//}
//void system_screen_close(void){
// uint16_t crcrc;
// if(machine_status == 1)//运行态 停止
// {
// comm_send_buffer[8] = 0x02;
// machine_status = 0;
// lcd_power_off();
// save_run_time();
// start_key_index = 0;
// /* enable sleep */
// system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_TYPE_DISABLE);
// }
// crcrc = Check_CRC16_Modbus(&comm_send_buffer[6],3);
// uart_transmit(&uart2_handle,comm_send_buffer,12);
//}
//void a36_button_event_handler(void * param)
//{
// struct button_msg_t *button_msg;
// uint16_t crcrc;
// uint8_t encode_bit_code = 0;
//
// button_msg = (struct button_msg_t *)param;
//
// switch(button_msg->button_index)
// {
// case BUTTON_START:
// switch(start_key_index)
// {
// case 0://激活
// system_screen_open();
// break;
// case 1://启动
// system_screen_close();
//
// break;
// default:
// break;
// }
// break;
// case BUTTON_HIGH_LOW:
// switch(high_low_index)
// {
// case 0: //50Hz
// comm_send_buffer[7] |= 0x02;
// high_low_index = 1;
// break;
// case 1: //60Hz
// comm_send_buffer[7] &= 0xFD;
// high_low_index = 0;
// break;
// }
// crcrc = Check_CRC16_Modbus(&comm_send_buffer[6],3);
// uart_transmit(&uart2_handle,comm_send_buffer,12);
// break;
// case BUTTON_RESET:
// comm_send_buffer[7] &= 0xFB;
// crcrc = Check_CRC16_Modbus(&comm_send_buffer[6],3);
// uart_transmit(&uart2_handle,comm_send_buffer,12);
// comm_send_buffer[7] |= 0x04;
// break;
// case BUTTON_DISPLAY:
//
// break;
// }
// //printf("KEY 0x%02x, %d\r\n", button_msg->button_index,button_msg->button_cnt);
// // 2024.3.21 by lj
// if(lvgl_start){
// encode_bit_code = button_msg->button_index;
// gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
// vTaskDelay(80);
// encode_bit_code = 0;
// gui_task_msg_send(ENCODE_KEY_EVT,(void *)&encode_bit_code,1,NULL,0,NULL);
// }
//
// fule_adc_init();
// printf("RUN time %d\r\n",CPU_RunTime);
//}
void uart2_comm(struct __UART_HandleTypeDef *handle)
{
// uart_command_rec(comm_recv_char);
// if (handle) {
// uart_receive_IT(handle, &comm_recv_char, 1);
// }
// printf("R:%X\r\n",comm_recv_char);
// uart_command_irq(&uart_com,comm_recv_char);
}
void uart2_irq(void)
{
// printf("uart2_irq\r\n");
uart_IRQHandler(&uart2_handle);
}
void set_timer_mode(struct_Timer_t *TIMERx)
{
TIMERx->Control.MODE = 1;
}
void project_init(void)
{
// struct app_task_event *event;
printf("System run...\r\nMXC_A36 Ver=%s-%04d%02d%02d\r\n",SWVER,CMYEAR,CMMONTH,CMDAY);
// printf("project init\r\n");
static GPIO_InitTypeDef GPIO_Handle;
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
//配置端口 PA4 CAT1_PWR_KEY, PA5 B/L_EN PA6 DW_IN
GPIO_Handle.Alternate = GPIO_FUNCTION_0;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_Handle.Pull = GPIO_PULLDOWN;
gpio_init(GPIOA, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_INPUT;
GPIO_Handle.Pin = GPIO_PIN_6;
GPIO_Handle.Pull = GPIO_NOPULL;
gpio_init(GPIOA, &GPIO_Handle);
//PD12 CAT1_RST,PD13 CAT1_PWR
GPIO_Handle.Alternate = GPIO_FUNCTION_0;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_12|GPIO_PIN_13;
GPIO_Handle.Pull = GPIO_PULLDOWN;
gpio_init(GPIOD, &GPIO_Handle);
// //PP6 PRI_PWR外设电源
// pmu_set_pin_dir(PMU_PIN_6, PMU_GPIO_MODE_OUTPUT);
// pmu_set_pin_pull(PMU_PIN_6, PMU_GPIO_PULL_DOWN);
//// pmu_set_pin_dir(PMU_PIN_7, PMU_GPIO_MODE_OUTPUT);
//// pmu_set_pin_pull(PMU_PIN_7, PMU_GPIO_NO_PULL);
//// pmu_set_pin_value(PMU_PIN_7, 0);
//// uint16_t data = ool_read16(PMU_REG_PIN_DATA);
// lcd_power_on();
//// lcd_power_off();
// //开启外设电源
// pmu_set_pin_value(PMU_PIN_6, 1);
//PB2 SP, PB3 LOCK,PB10 TACH,
GPIO_Handle.Alternate = GPIO_FUNCTION_0;
GPIO_Handle.Mode = GPIO_MODE_EXTI_IT_FALLING;
GPIO_Handle.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_10;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(GPIOB, &GPIO_Handle);
exti_set_Filter(GPIOB,EXTI_LINE_2|EXTI_LINE_3|EXTI_LINE_10,24,100);
exti_interrupt_enable(GPIOB, EXTI_LINE_2|EXTI_LINE_3|EXTI_LINE_10);
exti_clear_LineStatus(GPIOB, EXTI_LINE_2|EXTI_LINE_3|EXTI_LINE_10);
NVIC_EnableIRQ(GPIOB_IRQn);
//串口通讯
// init_uart_command_module(&uart_com,rx_ring_buf,rx_buf,send_buf,RX_MAX_LENGTH,command_Process);
/* ========================================================== */
/* ========= Uart configuration ========= */
/* ========================================================== */
GPIO_InitTypeDef gpio_config;
/* configure PB0 and PB1 to UART2 function */
gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_1;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_1;
gpio_init(GPIOB, &gpio_config);
__SYSTEM_UART2_CLK_ENABLE();
/* UART2: used for command */
uart2_handle.UARTx = UART2;
uart2_handle.Init.BaudRate = 9600;
uart2_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
uart2_handle.Init.StopBits = UART_STOPBITS_1;
uart2_handle.Init.Parity = UART_PARITY_NONE;
uart2_handle.Init.FIFO_Mode = UART_FIFO_DISABLE;
uart2_handle.TxCpltCallback = NULL;
uart2_handle.RxCpltCallback = uart2_comm;
uart_init(&uart2_handle);
NVIC_EnableIRQ(UART2_IRQn);
__UART_INT_RX_ENABLE(uart2_handle.UARTx);
// comm_timer = xTimerCreate("uart_comm_timer",100 , pdTRUE, NULL, comm_handler);
// xTimerStart(comm_timer, 0);
read_mileage();
io_adc_init();
// xTimerCreate("timer_start",100 , pdFALSE, NULL, sp_timer_start_handler);
// system_screen_open();
__SYSTEM_TIMER3_CLK_ENABLE();
__SYSTEM_TIMER2_CLK_ENABLE();
/* ********************************************************************* */
//timer3 设置接口相关处理的时钟 0.1mS
// 最大计时119小时
/* ********************************************************************* */
// timer_init(Timer3,96000000/4);
set_timer_mode(Timer3);
timer_init(Timer3,2400-1);
NVIC_EnableIRQ(TIMER3_IRQn);
timer_int_enable(Timer3);
timer_start(Timer3);
/* ********************************************************************* */
//timer2 设置接口相关处理的时钟 5mS
//
/* ********************************************************************* */
// set_timer_mode(Timer2);
// printf("timer_init(Timer2,24000000/200-1) TRUE\n");
// timer_init(Timer2,24000000/200-1);
// //timer_init(Timer2,24000000-1);
// NVIC_EnableIRQ(TIMER2_IRQn);
// timer_int_enable(Timer2);
// timer_start(Timer2);
}
void lcd_power_on(void)
{
printf("MXC-A36 lcd_power_on .\r\n");
// GPIO_InitTypeDef GPIO_Handle;
// __SYSTEM_PWM0_CLK_ENABLE();
// /* backlight PA5 */
// struct_PWM_Config_t PWM_CONF;
// GPIO_Handle.Alternate = GPIO_FUNCTION_4;
// GPIO_Handle.Mode = GPIO_MODE_AF_PP;
// GPIO_Handle.Pin = GPIO_PIN_5;
// GPIO_Handle.Pull = GPIO_PULLDOWN;
// gpio_init(GPIOA, &GPIO_Handle);
// PWM_CONF.Period = 1000;
// PWM_CONF.Prescale = 1;
// PWM_CONF.Posedge = 0;
// PWM_CONF.Negedge = 25;
// pwm_config(PWM0,PWM_CHANNEL_5,PWM_CONF);
// pwm_output_enable(PWM0,PWM_CHANNEL_5);
GPIO_InitTypeDef GPIO_Handle;
/* backlight PA5 */
GPIO_Handle.Alternate = GPIO_FUNCTION_0;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_5;
GPIO_Handle.Pull = GPIO_NOPULL;
gpio_init(GPIOA, &GPIO_Handle);
gpio_write_pin(GPIOA,GPIO_PIN_5,1);
}
void lcd_power_off(void)
{
GPIO_InitTypeDef GPIO_Handle;
/* backlight PA5 */
GPIO_Handle.Alternate = GPIO_FUNCTION_0;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_5;
GPIO_Handle.Pull = GPIO_NOPULL;
gpio_init(GPIOA, &GPIO_Handle);
gpio_write_pin(GPIOA,GPIO_PIN_5,0);
}
void pri_power_on(void)
{
printf("MXC-A36 pri_power_on .\r\n");
//PP6 PRI_PWR外设电源
pmu_set_pin_dir(PMU_PIN_6, PMU_GPIO_MODE_OUTPUT);
pmu_set_pin_pull(PMU_PIN_6, PMU_GPIO_PULL_DOWN);
// pmu_set_pin_dir(PMU_PIN_7, PMU_GPIO_MODE_OUTPUT);
// pmu_set_pin_pull(PMU_PIN_7, PMU_GPIO_NO_PULL);
// pmu_set_pin_value(PMU_PIN_7, 0);
// uint16_t data = ool_read16(PMU_REG_PIN_DATA);
//开启外设电源
pmu_set_pin_value(PMU_PIN_6, 1);
}
void save_run_time(void)
{
uint32_t i;
for(i=0;i<8;i++)
if(flashdb_set(FDB_KEY_RUN_TIME,(uint8_t *)&total_run_time,4) == FDB_NO_ERR)
break;
}
//void project_init(void)
//{
// printf("System run...\r\nMXC_A39 Ver=%s-%04d%02d%02d\r\n",SWVER,CMYEAR,CMMONTH,CMDAY);
// xTaskCreate(app_io_task, "app_io", APP_TASK_STACK_SIZE, NULL, APP_TASK_PRIORITY, &app_io_task_handle);
//}
void check_key(void)
{
// if(!gpio_read_pin(GPIOA,GPIO_PIN_4))
// display_key_cnt++;
// else
// display_key_cnt = 0;
// if(display_key_cnt == 2)
// {
// display_key = 1;
// //button_send_event(BUTTON_PRESSED, BUTTON_DISPLAY, 1);
// button_send_event(BUTTON_PRESSED, BUTTON_DISPLAY, 1);
//// printf("display key\r\n");
// }
// if(display_key_cnt==LONGKEYTIME)
// {
// display_key = 1;
// button_send_event(BUTTON_PRESSED, BUTTON_LONG_PAIRING, 1);
// #if 0
// flagPeerMode=1-flagPeerMode;
// #ifdef DEBUG_XK
// if(flagPeerMode==NORMALMODE) printf("enter Normal model\r\n");
// else printf("enter Peer model\r\n");
// #endif
// #endif
// }
//
// if(!gpio_read_pin(GPIOA,GPIO_PIN_6))
// start_key_cnt++;
// else
// start_key_cnt = 0;
// if(start_key_cnt == 2)
// {
// start_key = 1;
// button_send_event(BUTTON_PRESSED, BUTTON_START, 1);
//// printf("start key\r\n");
// }
// if(!gpio_read_pin(GPIOB,GPIO_PIN_2))
// high_low_key_cnt++;
// else
// high_low_key_cnt = 0;
// if(high_low_key_cnt == 2)
// {
// high_low_key = 1;
// button_send_event(BUTTON_PRESSED, BUTTON_HIGH_LOW, 1);
//// printf("high low key\r\n");
// }
//
// if((ool_read16(PMU_REG_PIN_DATA) & 0x80) == 0)
// reset_key_cnt++;
// else
// reset_key_cnt = 0;
// if(reset_key_cnt == 2)
// {
// reset_key = 1;
// button_send_event(BUTTON_PRESSED, BUTTON_RESET, 1);
//// printf("reset key\r\n");
// }
//
// if(gpio_read_pin(GPIOD,GPIO_PIN_12))
// co_key_cnt++;
// else
// co_key_cnt = 0;
// if(co_key_cnt == 3)
// {
// co_status = 1;
// }
}
/* ************************************************************************* */
// 发动机转速及车速采样中断
/* ************************************************************************* */
__RAM_CODE void gpiob_irq(void)
{
uint32_t tick=0,T_temp;
//TACH 发动机转速中断
if(exti_get_LineStatus(GPIOB, EXTI_LINE_10))
{
Tach_timeout_cnt = 0;
//TACH 获取发动机转速时间
tick = MOTOR_CLK;
Tach_Period_time = tick - last_Tach_timer_tick;
last_Tach_timer_tick = tick;
exti_clear_LineStatus(GPIOB, EXTI_LINE_10);
// printf("tach =%d \r\n",Tach_Period_time);
}
// SP 车速采样中断
if(exti_get_LineStatus(GPIOB, EXTI_LINE_2))
{
User_param.SP_CNT++;
// if(SP_CNT >= 6)//转换成1圈8CLK
if(User_param.SP_CNT >= CHANGE_PARA)//转换成1圈8CLK
{
User_param.SP_CNT = 0;
Trip_num ++;
User_param.TRIP_mileage ++;
User_param.TOTAL_mileage ++;
}
save_mileage_en = 1;
exti_clear_LineStatus(GPIOB, EXTI_LINE_2);
// printf("SP =%d \r\n",Trip_num);
}
//LOCK 中断
if(exti_get_LineStatus(GPIOB, EXTI_LINE_3))
{
exti_clear_LineStatus(GPIOB, EXTI_LINE_3);
}
}
/* ************************************************************************* */
// 摩托仪表任务timer
// 0.1mS 一次中断
// 0.1mS用于发动机转速采样计时
/* ************************************************************************* */
__RAM_CODE void timer3_irq(void)
// void timer3_irq(void)
{
//MOTOR_CLK 单位0.1mS
timer_int_clear(Timer3);
//发动机转速计时。最大时长119小时
MOTOR_CLK++;
}
/* ************************************************************************* */
// 摩托仪表任务timer
// 25mS用于保存车速CLK数的保存
//
/* ************************************************************************* */
void timer2_irq(void)
{
timer_int_clear(Timer2);
Timer2_CLK++;
if((Timer2_CLK%25) == 0)
{
//125mS 保存一次车速计数
speed_data[speed_index] = Trip_num;
speed_index++;
speed_index %= SPEED_SAVE_NUM;
//本次的总数减后一个总数为1秒内计数总数
speed_value = Trip_num - speed_data[speed_index];
// printf("\rSP %d %d %d\r\n",speed_index,Trip_num,speed_vulue);
}
//发动机转速0.4秒无数据,清零
Tach_timeout_cnt++;
if(Tach_timeout_cnt == 80)
Tach_Period_time = 100000;
//1秒 ADC采样任务
if((Timer2_CLK%200) == 0)
{
printf("Speed %d \r\n",get_speed());
printf("Tach %d \r\n",get_tach());
adc_task = 1;
// printf("bt_io_index %d \r\n",bt_io_index);
// if(io_read_en_flag)
// get_io_status();
printf("Gear %d \r\nadc ",gear_num);
for(uint8_t i=0;i<8;i++)
printf("%d ",io_adc_value[i]);
printf("\r\n");
}
get_io_status();
}
uint32_t get_speed(void)
{
uint32_t sp_value;
// km/h kmil/h
if(User_param.UNIT_MODE)
sp_value = speed_value * SPEED_PARA_G;//公制 显示速度100%
else
sp_value = speed_value * SPEED_PARA_Y;//英制 显示速度100%
return sp_value;
}
uint32_t get_tach(void)
{
uint32_t tc_value;
//转速1000-12000转 对应的周期: 5-17ms 单位: 转/分钟
tc_value = 600000/Tach_Period_time;
// printf("Tach %d \r\n",tc_value);
return tc_value;
}
void get_io_status(void)
{
adc_soft_trigger_convert(3);
if(!gpio_read_pin(GPIOA,GPIO_PIN_6))
gear_data[bt_io_index]++;
while(!adc_get_channel_valid_status(3));
// uint16_t vbat_vol = adc_result * 4 * 3300 / 1023;
adc_temp = adc_get_channel_data(3);
// io_adc_data[bt_io_index] = adc_get_channel_data(3);
printf("adc %d %d \r\n",bt_io_index,adc_temp);
switch(bt_io_index)
{
case 0:
case 1:
case 2:
case 4:
break;
case 3://TCS
break;
case 5://key set
if(adc_temp<400)
{
key_set_h++;
key_set_l = 0;
}
else
{
key_set_l++;
if(key_set_l == 1)
{
key_value = 1;
key_press_time = key_set_h;
printf("key %d %d\r\n",key_value,key_press_time);
}
key_set_h = 0;
}
break;
case 7://key mode
if(adc_temp<400)
{
key_mode_h++;
key_mode_l = 0;
}
else
{
key_mode_l++;
if(key_mode_l == 1)
{
key_value = 2;
key_press_time = key_mode_h;
printf("key %d %d\r\n",key_value,key_press_time);
}
key_mode_h = 0;
}
break;
default:
break;
}
io_adc_data[bt_io_index] += adc_temp;
if(gear_read_cnt == 3)
{
for(gear_num_index=0;gear_num_index<7;gear_num_index++)
{
if(gear_data[gear_num_index]>2)
break;
}
gear_num = gear_num_index;
gear_read_cnt = 0;
for(uint8_t i=0;i<8;i++)
{
io_adc_value[i] = (io_adc_data[i]>>2);
switch(i)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5://key set
break;
case 7://key mode
break;
default:
break;
}
}
// printf("Gear %d \r\n",gear_num);
memset(gear_data,0,sizeof(gear_data));
memset(io_adc_data,0,sizeof(io_adc_data));
}
if( bt_io_index == 7)
gear_read_cnt++;
bt_io_index++;
bt_io_index %= 8;
//bit7 = BT_PA7 bit6 = BT_PA6 bit5 = BT_PA5 bit4 = BT_PA4
btdm_host_send_vendor_cmd(0x18, 1, &bt_io_cmd[bt_io_index]);
}
void start_adc(void)
{
// adc_soft_trigger_convert(3);
// while(!adc_get_channel_valid_status(3));
// uint16_t adc_result = adc_get_channel_data(3);
//// uint16_t vbat_vol = adc_result * 4 * 3300 / 1023;
// io_adc_data[bt_io_index] =
// printf("adc ch %d = %d \r\n", bt_io_index,adc_result*33/10);
}
void read_mileage(void)
{
uint32_t size,data;
size = flashdb_get(FDB_KEY_TOTAL_MILEAGE, (void *)&data, 4);
if(size)
{
User_param.TOTAL_mileage = data;
}
else
{
User_param.TOTAL_mileage = 0;
flashdb_set(FDB_KEY_TOTAL_MILEAGE,(uint8_t *)&User_param.TOTAL_mileage,4);
}
printf("Read Total Mileage :%d\r\n",User_param.TOTAL_mileage);
size = flashdb_get(FDB_KEY_SP_CNT, (void *)&data, 4);
if(size)
{
User_param.SP_CNT = data;
}
else
{
User_param.SP_CNT = 0;
flashdb_set(FDB_KEY_SP_CNT,(uint8_t *)&User_param.TOTAL_mileage,4);
}
printf("Read SP CNT :%d\r\n",User_param.TOTAL_mileage);
size = flashdb_get(FDB_KEY_TRIP_MILEAGE, (void *)&data, 4);
if(size)
{
User_param.TRIP_mileage = data;
}
else
{
User_param.TRIP_mileage = 0;
flashdb_set(FDB_KEY_TRIP_MILEAGE,(uint8_t *)&User_param.TRIP_mileage,4);
}
printf("Read TRIP Mileage :%d\r\n",User_param.TRIP_mileage);
size = flashdb_get(FDB_KEY_UNIT_MODE, (void *)&data, 4);
if(size)
{
User_param.UNIT_MODE = data;
}
else
{
User_param.UNIT_MODE = 0;
flashdb_set(FDB_KEY_UNIT_MODE,(uint8_t *)&User_param.UNIT_MODE,4);
}
printf("Read UNIT :%d\r\n",User_param.UNIT_MODE);
}
void save_total_mileage(void)
{
uint32_t i;
for(i=0;i<8;i++)
if(flashdb_set(FDB_KEY_TOTAL_MILEAGE,(uint8_t *)&User_param.TOTAL_mileage,4) == FDB_NO_ERR)
break;
for(i=0;i<8;i++)
if(flashdb_set(FDB_KEY_TOTAL_MILEAGE,(uint8_t *)&User_param.SP_CNT,4) == FDB_NO_ERR)
break;
}
void save_trip_mileage(void)
{
uint32_t i;
for(i=0;i<8;i++)
if(flashdb_set(FDB_KEY_TRIP_MILEAGE,(uint8_t *)&User_param.TRIP_mileage,4) == FDB_NO_ERR)
break;
}
void save_unit(void)
{
uint32_t i;
for(i=0;i<8;i++)
if(flashdb_set(FDB_KEY_UNIT_MODE,(uint8_t *)&User_param.UNIT_MODE,4) == FDB_NO_ERR)
break;
}
void io_adc_init(void)
{
adc_InitConfig_t ADC_Config;
__SYSTEM_ADC_CLK_ENABLE();
pmu_adc_power_ctrl(true);
pmu_vbe_power_ctrl(true);
ADC_Config.ADC_Reference = ADC_REF_IOLDO;
ADC_Config.ADC_TriggerMode = ADC_SOFTWARE_TRIGGER;
// adc_set_channel_maping(0, ADC_CHANNEL_MAP_PMU_P4);
// adc_set_channel_maping(1, ADC_CHANNEL_MAP_PMU_P5);
// adc_set_channel_maping(2, ADC_CHANNEL_MAP_PMU_P6);
adc_set_channel_maping(3, ADC_CHANNEL_MAP_PMU_P7);
// adc_set_channel_maping(4, ADC_CHANNEL_MAP_VABT);
// adc_set_channel_maping(5, ADC_CHANNEL_MAP_VBE);
adc_init(ADC_Config);
// adc_soft_trigger_convert(3);
// while(!adc_get_channel_valid_status(3));
// uint16_t adc_result = adc_get_channel_data(3);
//// uint16_t vbat_vol = adc_result * 4 * 3300 / 1023;
//
// printf("adc %d \r\n",adc_result*33/10);
}
#endif

View File

@ -0,0 +1,116 @@
#ifndef _APP_IO_H
#define _APP_IO_H
#include <stdint.h>
//#include "uart_command.h"
#include "timers.h"
/* ********************************************** */
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF>ء<EFBFBD>
// <20><><EFBFBD>
// <20><><EFBFBD>أ<EFBFBD>
/* ********************************************** */
#define CMYEAR ((((__DATE__[7]-'0')*10+(__DATE__[8]-'0'))*10 + (__DATE__[9]-'0'))*10+(__DATE__[10]-'0'))
#define CMMONTH (__DATE__[2]=='n'?(__DATE__[1]=='u'?6:1) \
:__DATE__[2]=='b'?2 \
:__DATE__[2]=='r'?(__DATE__[0]=='M'?3:4) \
:__DATE__[2]=='y'?5 \
:__DATE__[2]=='n'?6 \
:__DATE__[2]=='l'?7 \
:__DATE__[2]=='g'?8 \
:__DATE__[2]=='p'?9 \
:__DATE__[2]=='t'?10 \
:__DATE__[2]=='v'?11:12)
#define CMDAY ((__DATE__[4]==' '?0:__DATE__[4]-'0')*10 + (__DATE__[5]-'0'))
#define FDB_KEY_TOTAL_MILEAGE 0x00030002 //add by hsp 2024.03.04
#define FDB_KEY_TRIP_MILEAGE 0x00030003 //add by hsp 2024.03.04
#define FDB_KEY_UNIT_MODE 0x00030004 //add by hsp 2024.03.04
#define FDB_KEY_SP_CNT 0x00030005 //add by hsp 2024.03.04
#define FDB_KEY_RUN_TIME 0x00030006
#define FDB_PEER_MAC 0x00030007 //add by xk 2024.03.21
//struct button_msg_t
//{
// uint32_t button_index;
// uint8_t button_type;
// uint8_t button_cnt; // only for multi click
//};
//enum button_type_t
//{
// BUTTON_PRESSED,
// BUTTON_RELEASED,
// BUTTON_SHORT_PRESSED,
// BUTTON_MULTI_PRESSED,
// BUTTON_LONG_PRESSED,
// BUTTON_LONG_PRESSING,
// BUTTON_LONG_RELEASED,
// BUTTON_LONG_LONG_PRESSED,
// BUTTON_LONG_LONG_RELEASED,
// BUTTON_COMB_PRESSED,
// BUTTON_COMB_RELEASED,
// BUTTON_COMB_SHORT_PRESSED,
// BUTTON_COMB_LONG_PRESSED,
// BUTTON_COMB_LONG_PRESSING,
// BUTTON_COMB_LONG_RELEASED,
// BUTTON_COMB_LONG_LONG_PRESSED,
// BUTTON_COMB_LONG_LONG_RELEASED,
//};
//enum button_index_t
//{
// // BUTTON_DISPLAY,
// // BUTTON_HIGH_LOW,
// // BUTTON_START,
// // BUTTON_RESET,
// BUTTON_DISPLAY = 5,
// BUTTON_HIGH_LOW = 113,
// BUTTON_START = 119,
// BUTTON_RESET = 120,
// BUTTON_LONG_PAIRING = 105,
//};
struct User_data_TypeDef
{
uint32_t TOTAL_mileage;
uint32_t TRIP_mileage;
uint32_t TIME;
uint8_t TOAL_TRIP_MODE;
uint8_t UNIT_MODE;
uint8_t SP_CNT;
// uint32_t write;
};
//
#define LONGKEYTIME 30//60 //60*50=3000ms
//
void project_init(void);
void comm_task_event_handler(uint8_t *data, uint16_t length);
void a36_button_event_handler(void * param);
void sleep_task_event_handler(void * param);
void button_send_event(uint8_t event, uint32_t button, uint8_t cnt);
void read_mileage(void);
void save_total_mileage(void);
void save_trip_mileage(void);
void save_unit(void);
//uint8_t command_Process(struct UART_COMM *buf);
void lcd_power_on(void);
void lcd_power_off(void);
void save_run_time(void);
void fule_adc_init(void);
uint32_t get_speed(void);
uint32_t get_tach(void);
void get_io_status(void);
//void sp_timer_start_handler( TimerHandle_t xTimer );
//void io_read_en( void );
void io_adc_init(void);
void start_adc(void);
void pri_power_on(void);
extern void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data);
extern uint32_t system_get_curr_time(void);
extern volatile unsigned int CPU_RunTime;
#endif // _APP_IO_H

View File

@ -0,0 +1,8 @@
2024.04.17 新建mx_app
apply 应用 lvgl文件
common 通用 包括通用函数
driver 封装的通用接口 例如spi 串口
pack 协议封装
parser 协议解析 包括协议解析和封装解析
store 存储 多应用的系统函数(发电机/摩托车仪表)

View File

@ -0,0 +1,338 @@
#include "lvgl.h"
#include "interface.h"
#include "mxc_meter.h"
/*********************************
**һЩ״̬<D7B4><CCAC><EFBFBD><EFBFBD>
*********************************/
void Set_sys_power_on_self_test(uint8_t value)
{
daily_get_UiData()->power_on_self_test = value;
}
uint8_t Get_sys_power_on_self_test(void)
{
return daily_get_UiData()->power_on_self_test;
}
void Set_sys_softwar_host(uint8_t value)
{
daily_get_UiData()->softwar_host = value;
}
uint8_t Get_sys_softwar_host(void)
{
return daily_get_UiData()->softwar_host;
}
void Set_sys_softwar_order(uint8_t value)
{
daily_get_UiData()->softwar_order = value;
}
uint8_t Get_sys_softwar_order(void)
{
return daily_get_UiData()->softwar_order;
}
void Set_sys_language(uint8_t value)
{
daily_get_UiData()->save_info.language = value;
}
uint8_t Get_sys_language(void)
{
return daily_get_UiData()->save_info.language;
}
void Set_sys_theme(uint8_t value)
{
daily_get_UiData()->save_info.theme = value;
}
uint8_t Get_sys_theme(void)
{
return daily_get_UiData()->save_info.theme;
}
void Set_sys_theme_state(uint8_t value)
{
daily_get_UiData()->save_info.theme_state = value;
}
uint8_t Get_sys_theme_state(void)
{
return daily_get_UiData()->save_info.theme_state;
}
void Set_sys_light_value(uint8_t value)
{
daily_get_UiData()->save_info.light_value = value;
}
uint8_t Get_sys_light_value(void)
{
return daily_get_UiData()->save_info.light_value;
}
void Set_sys_bt_on_off(uint8_t value)
{
daily_get_UiData()->save_info.bt_on_off = value;
}
uint8_t Get_sys_bt_on_off(void)
{
return daily_get_UiData()->save_info.bt_on_off;
}
void Set_sys_bt_state(uint8_t value)
{
daily_get_UiData()->save_info.bt_state = value;
}
uint8_t Get_sys_bt_state(void)
{
return daily_get_UiData()->save_info.bt_state;
}
void Set_sys_veer_hint(uint8_t value)
{
daily_get_UiData()->veer_hint = value;
}
uint8_t Get_sys_veer_hint(void)
{
return daily_get_UiData()->veer_hint;
}
void Set_sys_lamplight(uint8_t value)
{
daily_get_UiData()->lamplight = value;
}
uint8_t Get_sys_lamplight(void)
{
return daily_get_UiData()->lamplight;
}
void Set_sys_light_perception_value(uint8_t value)
{
daily_get_UiData()->light_perception_value = value;
}
uint8_t Get_sys_light_perception_value(void)
{
return daily_get_UiData()->light_perception_value;
}
void Set_sys_return_demo(uint8_t value)
{
daily_get_UiData()->return_demo = value;
}
uint8_t Get_sys_return_demo(void)
{
return daily_get_UiData()->return_demo;
}
/*********************************
**<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
*********************************/
void Set_sys_veer(uint8_t value)
{
daily_get_UiData()->veer = value;
}
uint8_t Get_sys_veer(void)
{
return daily_get_UiData()->veer;
}
void Set_sys_velocity(uint16_t value)
{
daily_get_UiData()->velocity = value;
}
uint16_t Get_sys_velocity(void)
{
return daily_get_UiData()->velocity;
}
void Set_sys_max_velocity(uint16_t value)
{
daily_get_UiData()->max_velocity = value;
}
uint16_t Get_sys_max_velocity(void)
{
return daily_get_UiData()->max_velocity;
}
void Set_sys_verage_velocity(uint16_t value)
{
daily_get_UiData()->verage_velocity = value;
}
uint16_t Get_sys_verage_velocity(void)
{
return daily_get_UiData()->verage_velocity;
}
void Set_sys_veer_velocity(uint16_t value)
{
daily_get_UiData()->veer_velocity = value;
}
uint16_t Get_sys_veer_velocity(void)
{
return daily_get_UiData()->veer_velocity;
}
void Set_sys_grade(uint8_t value)
{
daily_get_UiData()->grade = value;
}
uint8_t Get_sys_grade(void)
{
return daily_get_UiData()->grade;
}
void Set_sys_oil(uint8_t value)
{
daily_get_UiData()->oil = value;
}
uint8_t Get_sys_oil(void)
{
return daily_get_UiData()->oil;
}
void Set_sys_temp(uint8_t value)
{
daily_get_UiData()->temp = value;
}
uint8_t Get_sys_temp(void)
{
return daily_get_UiData()->temp;
}
void Set_sys_trip_mileage(double value)
{
daily_get_UiData()->trip_mileage = value;
}
double Get_sys_trip_mileage(void)
{
return daily_get_UiData()->trip_mileage;
}
void Set_sys_total_mileage(uint32_t value)
{
daily_get_UiData()->total_mileage = value;
}
uint32_t Get_sys_total_mileage(void)
{
return daily_get_UiData()->total_mileage;
}
void Set_sys_voltage(double value)
{
daily_get_UiData()->voltage = value;
}
double Get_sys_voltage(void)
{
return daily_get_UiData()->voltage;
}
/*********************************
**<2A><><EFBFBD><EFBFBD><EFBFBD>źŵ<C5BA>
*********************************/
void Set_sys_engine(uint8_t value)
{
daily_get_UiData()->warning.engine = value;
}
uint8_t Get_sys_engine(void)
{
return daily_get_UiData()->warning.engine;
}
void Set_sys_machine_oil(uint8_t value)
{
daily_get_UiData()->warning.machine_oil = value;
}
uint8_t Get_sys_machine_oil(void)
{
return daily_get_UiData()->warning.machine_oil;
}
void Set_sys_abs(uint8_t value)
{
daily_get_UiData()->warning.abs = value;
}
uint8_t Get_sys_abs(void)
{
return daily_get_UiData()->warning.abs;
}
void Set_sys_tcs(uint8_t value)
{
daily_get_UiData()->warning.tcs = value;
}
uint8_t Get_sys_tcs(void)
{
return daily_get_UiData()->warning.tcs;
}
void Set_sys_fan(uint8_t value)
{
daily_get_UiData()->warning.fan = value;
}
uint8_t Get_sys_fan(void)
{
return daily_get_UiData()->warning.fan;
}
void Set_sys_null(uint8_t value)
{
daily_get_UiData()->warning.null = value;
}
uint8_t Get_sys_null(void)
{
return daily_get_UiData()->warning.null;
}
/*********************************
**<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*********************************/
void Set_sys_now_defect_code(uint32_t value)
{
daily_get_UiData()->now_defect_code = value;
}
uint32_t Get_sys_now_defect_code(void)
{
return daily_get_UiData()->now_defect_code;
}
void Set_sys_his_defect_code(uint32_t value)
{
daily_get_UiData()->his_defect_code = value;
}
uint32_t Get_sys_his_defect_code(void)
{
return daily_get_UiData()->his_defect_code;
}

View File

@ -0,0 +1,817 @@
#include "lvgl.h"
#include "img_def.h"
#include "demo.h"
//#include "lv_common_function.h"
#include "img_basic.h"
#include "spde_ipc.h"
#include "mxc_meter.h"
#include "interface.h"
#include "lv_common_function.h"
#include "menu_list.h"
static uint8_t background_style = 0;
#define M_PI 3.14
static int center_x = 242, center_y = 119;
static int radius = 51;
static double start_angle = 0;
static double end_angle = 0;
static float progress =0.0;
#define TEST_FUN 0
#define HOME_KEY_BIT 0x08
#define ENTER_KEY_BIT 0x10
#define UP_KEY_BIT 0x20
#define DOWN_KEY_BIT 0x40
#define END_KEY_BIT 0x80
#define SHORT_KEY_BIT 0x01
#define MULTI_KEY_BIT 0x02
#define LONG_KEY_BIT 0x04
#define KEY_CODE_HOME HOME_KEY_BIT|SHORT_KEY_BIT //0000 1001 0x09
#define KEY_CODE_ENTER ENTER_KEY_BIT|SHORT_KEY_BIT //0001 0001 0x11
static const char show_scale_x[13]={22,-18,-53,-74,-75,-60,-25,18 ,62 ,99,120,126,118};
static const char show_scale_y[13]={120,110,81,40, -3 ,-44,-76,-88,-81,-61,-22,20,60};
extern lv_timer_t * time_refresh_timer;
lv_obj_t *meter;
lv_meter_indicator_t * indic;
lv_meter_indicator_t * indic1;
lv_obj_t * oil_meter;
lv_meter_indicator_t *oil_indic1;
lv_meter_indicator_t *oil_indic2;
lv_obj_t * temp_meter;
lv_meter_indicator_t *temp_indic1;
lv_meter_indicator_t *temp_indic2;
static int speed_angle = 0;
static int speed_value = 0;
static int bar_value = 0;
static int gear_value = 0;
#define CANVAS_WIDTH 200
#define CANVAS_HEIGHT 200
void creatRootObj(void);
void Enter_screen_id(lv_obj_t *parent_main);
void lv_demo(lv_obj_t *parent, lv_point_t *top);
extern lv_indev_t * indev_keypad;
extern lv_group_t * lv_get_keypad_group(void);
#if 0
void win_init(void){
uint8_t ui_mode = 0;
creatRootObj();
lv_group_t * scr_key_group =get_key_group();
lv_indev_set_group(indev_keypad, scr_key_group);
//lv_win32_add_all_input_devices_to_group(scr_key_group);
system_date_init();
ui_mode = spde_ipc_get_ui_mode();
switch (ui_mode)
{
case UI_MODE_NORMAL:
Enter_screen_id(get_root_win());
break;
case UI_MODE_CHARGE:
break;
case UI_MODE_OTA:
break;
case UI_MODE_POWER_OFF:
break;
case UI_MODE_POWER_ON:
break;
case UI_MODE_CHARGE_FULL:
break;
default:
Enter_screen_id(get_root_win());
break;
}
}
void Enter_screen_id(lv_obj_t *parent_main){
daily_data_t *local_data = daily_get_UiData();
Set_UI_page_id(get_top_history_win());
if(local_data->ui_page_id == IDLE_CONTROL_WIN_ID)
{
printf("enter_demo . \n");
lv_demo(parent_main,NULL);
// enter_control_main_win(parent_main);
}
else if(local_data->ui_page_id == PAGE_MAINMENU_WIN_ID)
{
printf("enter_list . \n");
// enter_mainmenu_win(parent_main);
}
}
void demo_refresh_timer_cb(lv_timer_t *t){
lv_obj_t *parent = t->user_data;
if(!lv_obj_is_valid(parent)){
printf("parent lv_obj_is_valid fail.\n");
return;
}
if(parent ==NULL){
printf("parent ==NULL\n");
return;
}
//if(Get_sys_power_on_self_test() ==0)
//return;
static int num=0,bar_num=0,peed_num=0,gear_num=0,mileage=0;
uint8_t scale_num;
//指针刷新
lv_obj_t * ui_Arc1 = lv_obj_get_child(parent,5);
lv_obj_t * hand_img = lv_obj_get_child(parent,6);
lv_obj_t * speed = lv_obj_get_child(parent,7);
lv_obj_t * gear = lv_obj_get_child(parent,8);
lv_obj_t * gear_null = lv_obj_get_child(parent,9);
lv_obj_t * tcs = lv_obj_get_child(parent,10);
lv_obj_t * time_label = lv_obj_get_child(parent,11);
lv_obj_t * max_speed = lv_obj_get_child(parent,12);
lv_obj_t * avg_speed = lv_obj_get_child(parent,13);
lv_obj_t * trip_mileage = lv_obj_get_child(parent,14);
lv_obj_t * odo_mileage = lv_obj_get_child(parent,15);
lv_img_set_angle(hand_img,speed_angle);
lv_arc_set_value(ui_Arc1, (speed_angle/25));
//lv_arc_set_value(ui_Arc1, (speed_angle/25));
lv_label_set_text_fmt(speed, "%d",speed_value);
lv_label_set_text_fmt(gear, "%d",gear_value);
if(gear_value !=7){
lv_obj_clear_flag(gear,LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(gear_null,LV_OBJ_FLAG_HIDDEN );
}else{
lv_obj_clear_flag(gear_null,LV_OBJ_FLAG_HIDDEN );
lv_obj_add_flag(gear,LV_OBJ_FLAG_HIDDEN );
}
lv_label_set_text(time_label, GetCurTimeString());
lv_label_set_text_fmt(max_speed, "%d",speed_value);
lv_label_set_text_fmt(avg_speed, "%d",speed_value);
lv_label_set_text_fmt(trip_mileage, "%d",mileage);
lv_label_set_text_fmt(odo_mileage, "%d",mileage);
scale_num = (speed_angle/250) ;
lv_meter_set_indicator_end_value(meter, indic1, speed_angle/20);
if(bar_value <60){
lv_meter_set_indicator_end_value(oil_meter, oil_indic1, bar_value);
lv_meter_set_indicator_end_value(oil_meter, oil_indic2, 60);
}else{
lv_meter_set_indicator_end_value(oil_meter, oil_indic1, 60);
lv_meter_set_indicator_end_value(oil_meter, oil_indic2, bar_value);
}
if(bar_value<210){
lv_meter_set_indicator_end_value(temp_meter, temp_indic1, bar_value);
lv_meter_set_indicator_end_value(temp_meter, temp_indic2, 210);
}else{
lv_meter_set_indicator_end_value(temp_meter, temp_indic1, 210);
lv_meter_set_indicator_end_value(temp_meter, temp_indic2, bar_value);
}
//转速指针
if(num%2==0)
speed_angle+=20;
else
speed_angle-=20;
if(speed_angle>=3000|| speed_angle ==0)
num++;
//速度
if(peed_num%2==0)
speed_value+=1;
else
speed_value-=1;
if(speed_value>=255 || speed_value ==0)
peed_num++;
//档位
if(gear_num%2==0)
gear_value+=1;
else
gear_value-=1;
if(gear_value>=7 || gear_value ==0){
gear_num++;
}
//温度油量
if(bar_num%2 ==0)
bar_value+=2;
else
bar_value-=2;
if(bar_value>=270 || bar_value==0)
bar_num++;
mileage++;
if(mileage>=888888)
mileage=0;
}
static void demo_win_event_handle(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
uint8_t key_code = 0;
//printf("demo_win_event_handle.\n");
if (code == LV_EVENT_KEY)
{
uint32_t *key = lv_event_get_param(e);
key_code = (uint8_t)*key;
printf("demo - key_code = %d. code = 0x%02d \n",key_code,code);
switch(key_code)
{
case LV_KEY_ENTER:
printf("LV_KEY_ENTER.\n");
//close_time_refresh_timer();
close_ui_refresh_timer();
close_all_win();
if (time_refresh_timer != NULL)
{
lv_timer_del(time_refresh_timer);
time_refresh_timer = NULL;
}
enter_mainmenu_win(get_root_win());
break;
default:
break;
}
}
}
//LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo1_src[5] =
//{
//IMG_DM1_BG_1,
//IMG_DM1_BG_2,
//IMG_DM1_BG_3,
//IMG_DM1_BG_4,
//IMG_DM1_BG_5,
//};
//LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* arc_test_src[4] =
//{
//IMG_SPEED_ARC_1,
//IMG_SPEED_ARC_2,
//IMG_SPEED_ARC_3,
//};
//LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_bg2_src[6] =
//{
//IMG_DM1_BAR_BG_1,
//IMG_DM1_BAR_BG_2,
//IMG_DM1_BAR_BG_3,
//};
void lv_demo(lv_obj_t *parent, lv_point_t *top){
// start_angle = atan2(center_y - 143, 199 - center_x) * 180 / M_PI;
// end_angle = atan2(center_y - 143, 284 - center_x) * 180 / M_PI;
// if(!lv_obj_is_valid(parent))
// return;
if(!lv_obj_is_valid(parent))
return;
UI_PARENT_INIT(parent);
printf("enter lv_demo .\r\n");
lv_obj_t *win2_screen = lv_obj_create(parent);
lv_obj_set_style_pad_all(win2_screen, 0, 0);
lv_obj_set_style_border_width(win2_screen, 0, 0);
lv_obj_set_style_opa(win2_screen, LV_OPA_100, 0);
lv_obj_set_scrollbar_mode(win2_screen, LV_SCROLLBAR_MODE_ACTIVE);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_GESTURE_BUBBLE);
// lv_obj_set_size(win2_screen, 320, 170);
lv_obj_set_size(win2_screen,LV_PCT(100),LV_PCT(100));
lv_obj_set_style_radius(win2_screen, 0, 0);
lv_obj_set_style_bg_color(win2_screen, lv_color_black(), NULL);
// UI_PARENT_INIT(win2_screen);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_SCROLLABLE );
//背景
lv_obj_t* panel_bg_img1 = lv_moto_img_big_create(win2_screen,panel_demo1_src,176,2,5,0);
//arc外边框
lv_obj_t* panel_bg_img2 = lv_moto_img_big_create(win2_screen,panel_bg2_src,15,17,3,0);//0
// //刻度
// lv_obj_t* panel_bg_img3 = lv_moto_img_big_create(parent,panel_bg3_src,25,25,3,0);//0
// bar
meter = lv_meter_create(win2_screen);
lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR); //meterԲ<72>IJ<EFBFBD><C4B2><EFBFBD>ʾ
lv_obj_remove_style(meter, NULL, LV_PART_MAIN);
lv_obj_set_size(meter, 228, 228);
lv_obj_align(meter,LV_ALIGN_CENTER,-109,-3);
lv_meter_scale_t * scale = lv_meter_add_scale(meter);
lv_meter_set_scale_ticks(meter, scale, 0, 1, 5, lv_palette_main(LV_PALETTE_GREY));
lv_meter_set_scale_range(meter, scale, 0, 150, 300, 90);
indic1 = lv_meter_add_arc(meter, scale, 18, lv_color_hex(0x62d5f9), 0);
// indic = lv_meter_add_needle_line(meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10);
//oil bar
oil_meter= lv_meter_create(win2_screen);
lv_obj_remove_style(oil_meter, NULL, LV_PART_MAIN);
lv_obj_remove_style(oil_meter, NULL, LV_PART_INDICATOR);
lv_meter_scale_t * oil_scale;
oil_scale = lv_meter_add_scale(oil_meter);
lv_meter_set_scale_range(oil_meter, oil_scale, 0, 270, 270, 90);
lv_meter_set_scale_ticks(oil_meter, oil_scale, 0, 3, 12, lv_color_white());
oil_indic1 = lv_meter_add_arc(oil_meter, oil_scale, 6, lv_color_hex(0xff0000), 0);
lv_meter_set_indicator_start_value(oil_meter, oil_indic1, 0);
// lv_meter_set_indicator_end_value(oil_meter, oil_indic1, 60);//设置范围
lv_meter_set_indicator_end_value(oil_meter, oil_indic1, 0);//设置范围
oil_indic2 = lv_meter_add_arc(oil_meter, oil_scale, 6, lv_color_hex(0x00ff00), 0);
lv_meter_set_indicator_start_value(oil_meter, oil_indic2, 60);
// lv_meter_set_indicator_end_value(oil_meter, oil_indic2, 270);
lv_meter_set_indicator_end_value(oil_meter, oil_indic2, 60);//初始值
lv_obj_update_layout(win2_screen);
lv_obj_set_size(oil_meter, 45, 45);
lv_obj_align(oil_meter,LV_ALIGN_TOP_LEFT,140,217);
//temp bar
temp_meter = lv_meter_create(win2_screen);
lv_obj_remove_style(temp_meter, NULL, LV_PART_MAIN);
lv_obj_remove_style(temp_meter, NULL, LV_PART_INDICATOR);
lv_meter_scale_t * temp_scale;
temp_scale = lv_meter_add_scale(temp_meter);
lv_meter_set_scale_range(temp_meter, temp_scale, 0, 270, 270, 90);
lv_meter_set_scale_ticks(temp_meter, temp_scale, 0, 3, 12, lv_color_white());
temp_indic1 = lv_meter_add_arc(temp_meter, temp_scale, 6, lv_color_hex(0x0070BB), 0);
lv_meter_set_indicator_start_value(temp_meter, temp_indic1, 0);
// lv_meter_set_indicator_end_value(temp_meter, temp_indic1, 210);
lv_meter_set_indicator_end_value(temp_meter, temp_indic1, 0);
temp_indic2 = lv_meter_add_arc(temp_meter, temp_scale, 6, lv_color_hex(0xff0000), 0);
lv_meter_set_indicator_start_value(temp_meter, temp_indic2, 210);
// lv_meter_set_indicator_end_value(temp_meter, temp_indic2, 270);
lv_meter_set_indicator_end_value(temp_meter, temp_indic2, 210);
lv_obj_update_layout(win2_screen);
lv_obj_set_size(temp_meter, 45, 45);
lv_obj_align(temp_meter,LV_ALIGN_TOP_LEFT,180,191);
lv_obj_t * ui_Arc1 = lv_arc_create(win2_screen);
lv_obj_set_width(ui_Arc1, 230);
lv_obj_set_height(ui_Arc1, 230);
lv_obj_set_x(ui_Arc1, 16);
lv_obj_set_y(ui_Arc1, 17);
lv_arc_set_range(ui_Arc1, 0, 120);
lv_arc_set_value(ui_Arc1, 0);
lv_arc_set_bg_angles(ui_Arc1, 0, 300);
lv_arc_set_rotation(ui_Arc1, 90);
lv_obj_set_style_arc_opa(ui_Arc1, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_arc_color(ui_Arc1, lv_color_hex(0x9393FF), LV_PART_INDICATOR | LV_STATE_DEFAULT);
lv_obj_set_style_arc_opa(ui_Arc1, 255, LV_PART_INDICATOR | LV_STATE_DEFAULT);
lv_obj_set_style_arc_width(ui_Arc1, 30, LV_PART_INDICATOR | LV_STATE_DEFAULT);
lv_obj_set_style_arc_rounded(ui_Arc1, false, LV_PART_INDICATOR | LV_STATE_DEFAULT);
lv_obj_set_style_arc_img_src(ui_Arc1, &speed_arc, LV_PART_INDICATOR | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(ui_Arc1, 0, LV_PART_KNOB | LV_STATE_DEFAULT);
lv_obj_remove_style(ui_Arc1, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/
lv_obj_clear_flag(ui_Arc1, LV_OBJ_FLAG_CLICKABLE); /*To not allow adjusting by click*/
//指针
lv_obj_t *hand_img = lv_img_create(win2_screen);//4
lv_img_set_src(hand_img,IMG_POINTER2);
lv_obj_align(hand_img,LV_ALIGN_CENTER,-108,93);
lv_img_set_pivot(hand_img, 3, -81);
lv_img_set_angle(hand_img, 0);
lv_obj_t * speed = lv_label_create(win2_screen);
lv_obj_set_style_text_align(speed, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_center(speed);
lv_obj_set_pos(speed,-105,-10);
lv_obj_set_style_text_font(speed,LV_FONT_MXC_WRYH_CT_72PX,0);
lv_label_set_text_fmt(speed, "%d",speed_value);
lv_obj_t * gear = lv_label_create(win2_screen);
lv_obj_set_pos(gear, 120, 180);
//lv_obj_align_to(gear,panel_bg_img2,LV_ALIGN_CENTER,25,75);
lv_obj_set_style_text_font(gear,LV_FONT_MXC_WRYH_CT_30PX,0);
// lv_label_set_text_fmt(gear, "%d",gear_value);
lv_obj_t * gear_null = lv_img_create(win2_screen);
lv_obj_set_pos(gear_null, 120, 183);
//lv_obj_align_to(gear_null,panel_bg_img2,LV_ALIGN_CENTER,-5,58);
lv_img_set_src(gear_null, IMG_DM1_NULL);
lv_obj_t * tcs = lv_img_create(win2_screen);
lv_obj_align(tcs,LV_ALIGN_BOTTOM_LEFT,10,-10);
lv_img_set_src(tcs, IMG_DM1_TCS);
lv_obj_t * time_label = lv_label_create(win2_screen);
lv_obj_set_pos(time_label, 10, 10);
lv_obj_set_style_text_font(time_label,LV_FONT_MXC_WRYH_CT_20PX,0);
lv_label_set_text(time_label, GetCurTimeString());
lv_obj_t * max_speed = lv_label_create(win2_screen);
//lv_obj_set_pos(max_speed, -30, 20);
lv_obj_set_pos(max_speed, -50, 20);
lv_obj_set_align(max_speed, LV_ALIGN_TOP_RIGHT);
lv_obj_set_style_text_font(max_speed,LV_FONT_MXC_WRYH_CT_30PX,0);
lv_label_set_text(max_speed,"255");
lv_obj_t * avg_speed = lv_label_create(win2_screen);
//lv_obj_set_pos(avg_speed, -30, -30);
lv_obj_set_pos(avg_speed, -50, -35);
lv_obj_set_align(avg_speed, LV_ALIGN_RIGHT_MID);
lv_obj_set_style_text_font(avg_speed,LV_FONT_MXC_WRYH_CT_30PX,0);
lv_label_set_text(avg_speed, "254");
lv_obj_t * trip = lv_label_create(win2_screen);
lv_obj_set_pos(trip, -30, 40);
lv_obj_set_align(trip, LV_ALIGN_RIGHT_MID);
lv_obj_set_style_text_font(trip,LV_FONT_MXC_WRYH_CT_30PX,0);
lv_label_set_text(trip, "888888");
lv_obj_t * total = lv_label_create(win2_screen);
lv_obj_set_pos(total, -30, -20);
lv_obj_set_align(total, LV_ALIGN_BOTTOM_RIGHT);
lv_obj_set_style_text_font(total,LV_FONT_MXC_WRYH_CT_30PX,0);
lv_label_set_text(total, "888888");
lv_obj_t * img_oil = lv_img_create(win2_screen);
lv_obj_align_to(img_oil,oil_meter,LV_ALIGN_CENTER,-7,-7);
lv_img_set_src(img_oil, IMG_DM1_OIL);
lv_obj_t * img_temp = lv_img_create(win2_screen);
lv_obj_align_to(img_temp,temp_meter,LV_ALIGN_CENTER,-7,-7);
lv_img_set_src(img_temp, IMG_DM1_TEMP);
lv_obj_t * speed_uint = lv_label_create(win2_screen);
lv_obj_set_pos(speed_uint, 90, 64);
//lv_obj_align_to(speed_uint,panel_bg_img2,LV_ALIGN_CENTER,-10,-40);
lv_obj_set_style_text_font(speed_uint,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(speed_uint, "1000r/min");
lv_obj_t * speed_uint2 = lv_label_create(win2_screen);
lv_obj_set_pos(speed_uint2, 110, 160);
//lv_obj_align_to(speed_uint2,panel_bg_img2,LV_ALIGN_CENTER,10,50);
lv_obj_set_style_text_font(speed_uint2,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(speed_uint2, "km/h");
lv_obj_t * speed_uint3 = lv_label_create(win2_screen);
lv_obj_set_pos(speed_uint3, 435, 28);
lv_obj_set_style_text_font(speed_uint3,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(speed_uint3, "km/h");
lv_obj_t * speed_uint4 = lv_label_create(win2_screen);
lv_obj_set_pos(speed_uint4, 435, 98);
lv_obj_set_style_text_font(speed_uint4,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(speed_uint4, "km/h");
lv_obj_t * mileage_uint1 = lv_label_create(win2_screen);
lv_obj_set_pos(mileage_uint1, 450, 173);
lv_obj_set_style_text_font(mileage_uint1,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(mileage_uint1, "km");
lv_obj_t * mileage_uint2 = lv_label_create(win2_screen);
lv_obj_set_pos(mileage_uint2, 450, 238);
lv_obj_set_style_text_font(mileage_uint2,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(mileage_uint2, "km");
lv_obj_t * max_speed_label = lv_label_create(win2_screen);
lv_obj_set_pos(max_speed_label, 300, 25);
lv_obj_set_style_text_font(max_speed_label,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(max_speed_label, "最高时速:");
lv_obj_t * avg_speed_label = lv_label_create(win2_screen);
lv_obj_set_pos(avg_speed_label, 300, 90);
// lv_obj_set_align(avg_speed_label, LV_ALIGN_RIGHT_MID);
lv_obj_set_style_text_font(avg_speed_label,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(avg_speed_label, "平均时速:");
lv_obj_t * trip_label = lv_label_create(win2_screen);
lv_obj_set_pos(trip_label, 300, 140);
lv_obj_set_style_text_font(trip_label,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(trip_label, "小计里程:");
lv_obj_t * total_label = lv_label_create(win2_screen);
lv_obj_set_pos(total_label, 299, 210);
lv_obj_set_style_text_font(total_label,LV_FONT_MXC_WRYH_CT_16PX,0);
lv_label_set_text(total_label, "总计里程:");
//self_checking_animo(win2_screen);
lv_group_t *demo_group = lv_get_keypad_group();
lv_group_remove_all_objs(demo_group);
lv_group_add_obj(demo_group, win2_screen);
lv_obj_add_flag(win2_screen, LV_STATE_FOCUSED );
lv_obj_add_flag(win2_screen, LV_STATE_FOCUS_KEY );
lv_obj_add_state(win2_screen, LV_STATE_FOCUSED );
lv_obj_add_state(win2_screen, LV_STATE_FOCUS_KEY );
//lv_obj_add_flag(win2_screen, LV_OBJ_FLAG_EVENT_BUBBLE);
lv_obj_add_event_cb(win2_screen, demo_win_event_handle, LV_EVENT_KEY, NULL);
printf("lv_demo ok .\r\n");
// lv_timer_t * ui_refresh_timer = get_ui_refresh_timer();
time_refresh_timer = lv_timer_create(demo_refresh_timer_cb,50,win2_screen);
}
#endif
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo1_src[5] =
{
IMG_DEMO1_1,
IMG_DEMO1_2,
IMG_DEMO1_3,
IMG_DEMO1_4,
IMG_DEMO1_5,
};
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo2_src[5] =
{
IMG_DEMO2_1,
IMG_DEMO2_2,
IMG_DEMO2_3,
IMG_DEMO2_4,
IMG_DEMO2_5,
};
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo3_src[5] =
{
IMG_DEMO3_1,
IMG_DEMO3_2,
IMG_DEMO3_3,
IMG_DEMO3_4,
IMG_DEMO3_5,
};
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo4_src[5] =
{
IMG_DEMO4_1,
IMG_DEMO4_2,
IMG_DEMO4_3,
IMG_DEMO4_4,
IMG_DEMO4_5,
};
/*
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo5_src[5] =
{
IMG_DEMO5_1,
IMG_DEMO5_2,
IMG_DEMO5_3,
IMG_DEMO5_4,
IMG_DEMO5_5,
};
/*
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo6_src[5] =
{
IMG_DEMO6_1,
IMG_DEMO6_2,
IMG_DEMO6_3,
IMG_DEMO6_4,
IMG_DEMO6_5,
};
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo7_src[5] =
{
IMG_DEMO7_1,
IMG_DEMO7_2,
IMG_DEMO7_3,
IMG_DEMO7_4,
IMG_DEMO7_5,
};
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* panel_demo8_src[5] =
{
IMG_DEMO8_1,
IMG_DEMO8_2,
IMG_DEMO8_3,
IMG_DEMO8_4,
IMG_DEMO8_5,
};*/
static uint8_t num = 0;
#define TEST_IMG 5
void demo_refresh_timer_cb(lv_timer_t *t){
lv_obj_t *parent = t->user_data;
if(!lv_obj_is_valid(parent)){
printf("parent lv_obj_is_valid fail.\n");
return;
}
if(parent ==NULL){
printf("parent ==NULL\n");
return;
}
lv_obj_t * img = lv_obj_get_child(parent,0);
printf("num ==%d .\r\n",num);
switch(num){
case 0:
for(uint8_t i=0;i<TEST_IMG;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo2_src[i]);
}
num++;
break;
case 1:
for(uint8_t i=0;i<TEST_IMG;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo3_src[i]);
}
num++;
break;
case 2:
for(uint8_t i=0;i<TEST_IMG;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo4_src[i]);
}
num++;
break;
/*case 3:
for(uint8_t i=0;i<TEST_IMG-1;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo5_src[i]);
}
num++;
break;
/*case 4:
for(uint8_t i=0;i<TEST_IMG;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo6_src[i]);
}
num++;
break;*/
default:
for(uint8_t i=0;i<TEST_IMG;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo1_src[i]);
}
num=0;
break;
}
}
static void demo_win_event_handle(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *parent = lv_event_get_target(e);
uint8_t key_code = 0;
//printf("demo_win_event_handle.\n");
if (code == LV_EVENT_KEY)
{
uint32_t *key = lv_event_get_param(e);
key_code = (uint8_t)*key;
printf("demo - key_code = %d. code = 0x%02d \n",key_code,code);
switch(key_code)
{
case LV_KEY_ENTER:
//num++;
printf("num ==%d .\r\n",num);
lv_obj_t * img = lv_obj_get_child(parent,0);
switch(num){
case 0:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo2_src[i]);
}
num++;
break;
case 1:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo3_src[i]);
}
num++;
break;
case 2:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo4_src[i]);
}
num++;
break;
/*case 3:
for(uint8_t i=0;i<5-1;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo5_src[i]);
}
num++;
break;
case 4:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo6_src[i]);
}
num++;
break;
case 5:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo8_src[i]);
}
num++;
break;
case 6:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo8_src[i]);
}
num++;
break;*/
default:
for(uint8_t i=0;i<5;i++){
lv_obj_t * img1 = lv_obj_get_child(img, i);
lv_img_set_src(img1, panel_demo1_src[i]);
}
num=0;
break;
}
}
}
}
void lv_demo(lv_obj_t *parent, lv_point_t *top){
if(!lv_obj_is_valid(parent))
return;
UI_PARENT_INIT(parent);
printf("enter test_demo .\r\n");
lv_obj_t *win2_screen = lv_obj_create(parent);
lv_obj_set_style_pad_all(win2_screen, 0, 0);
lv_obj_set_style_border_width(win2_screen, 0, 0);
lv_obj_set_style_opa(win2_screen, LV_OPA_100, 0);
lv_obj_set_scrollbar_mode(win2_screen, LV_SCROLLBAR_MODE_ACTIVE);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_GESTURE_BUBBLE);
// lv_obj_set_size(win2_screen, 320, 170);
lv_obj_set_size(win2_screen,LV_PCT(100),LV_PCT(100));
lv_obj_set_style_radius(win2_screen, 0, 0);
lv_obj_set_style_bg_color(win2_screen, lv_color_black(), NULL);
// UI_PARENT_INIT(win2_screen);
lv_obj_clear_flag(win2_screen, LV_OBJ_FLAG_SCROLLABLE );
lv_obj_t* panel_bg_img = lv_moto_img_big_create(win2_screen,panel_demo1_src,0,0,5,0);
lv_group_t *demo_group = lv_get_keypad_group();
lv_group_remove_all_objs(demo_group);
lv_group_add_obj(demo_group, win2_screen);
lv_obj_add_flag(win2_screen, LV_STATE_FOCUSED );
lv_obj_add_flag(win2_screen, LV_STATE_FOCUS_KEY );
lv_obj_add_state(win2_screen, LV_STATE_FOCUSED );
lv_obj_add_state(win2_screen, LV_STATE_FOCUS_KEY );
//lv_obj_add_flag(win2_screen, LV_OBJ_FLAG_EVENT_BUBBLE);
lv_obj_add_event_cb(win2_screen, demo_win_event_handle, LV_EVENT_KEY, NULL);
//time_refresh_timer = lv_timer_create(demo_refresh_timer_cb,1000,win2_screen);
}

View File

@ -0,0 +1,8 @@
#ifndef __DEMO_H__
#define __DEMO_H__
void lv_demo_func(lv_obj_t *parent, lv_point_t *top);
#endif

Some files were not shown because too many files have changed in this diff Show More