[FL-2183] [FL-2209] Dolphin Deeds, Level up, assets generation, refactoring (#965)
* Desktop: cleanup headers * Get loader pubsub via record * [FL-2183] Dolphin refactoring 2022.01 * Restruct animations assets structure * Rename assets * Cleanup headers * Update Recording animation * Add BadBattery animation * Provide loader's pubsub via record * Fix load/unload animations * Scripts: add flipper format support, initial dolphin packager rework. Assets: internal and external dolphin. * Sync internal meta.txt and manifest.txt * Reorder, rename dolphin assets * Split essential generated assets * Add ReadMe for dolphin assets * Separate essential blocking animations * Scripts: full dolphin validation before packaging * Assets, Scripts: dolphin external resources packer * Github: update codeowners * Scripts: proper slots handling in dolphin animation meta * Scripts: correct frames enumeration and fix compiled assets. * [FL-2209] Add Dolphin Deeds points and many more * Remove excess frame_rate * Change dolphin assets directory * Scripts: add internal resource support to dolphin compiler * Scripts: add internal assets generation, renaming * Scripts: correct assert, renaming * Code cleanup, documentation, fixes * Update Levelup animations * Rename essential -> blocking * Fix Unlocked hint * Scripts: rewrite Templite compiller, replace regexps with token parser, split block types into code and variable blocks. Update dolphin templates. * Documentation: add key combos description and use information * Scripts: cleanup templit, more debug info and add dev comment Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									53e7415d12
								
							
						
					
					
						commit
						84410c83b5
					
				
							
								
								
									
										4
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| # Who owns all the code by default | # Who owns all the fish by default | ||||||
| 
 | 
 | ||||||
| * @skotopes @DrZlo13 | * @skotopes @DrZlo13 | ||||||
| 
 | 
 | ||||||
| @ -8,7 +8,7 @@ applications/accessor/** @skotopes @DrZlo13 | |||||||
| applications/loader/** @skotopes @DrZlo13 @gornekich | applications/loader/** @skotopes @DrZlo13 @gornekich | ||||||
| applications/bt/** @skotopes @DrZlo13 | applications/bt/** @skotopes @DrZlo13 | ||||||
| applications/cli/** @skotopes @DrZlo13 | applications/cli/** @skotopes @DrZlo13 | ||||||
| applications/dolphin/** @skotopes @DrZlo13 @itsyourbedtime | applications/dolphin/** @skotopes @DrZlo13 | ||||||
| applications/gpio-tester/** @skotopes @DrZlo13 | applications/gpio-tester/** @skotopes @DrZlo13 | ||||||
| applications/gui/** @skotopes @DrZlo13 | applications/gui/** @skotopes @DrZlo13 | ||||||
| applications/gui-test/** @skotopes @DrZlo13 | applications/gui-test/** @skotopes @DrZlo13 | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ | |||||||
| #include <furi_hal_usb_hid.h> | #include <furi_hal_usb_hid.h> | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| #include "bad_usb_script.h" | #include "bad_usb_script.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define TAG "BadUSB" | #define TAG "BadUSB" | ||||||
| #define WORKER_TAG TAG "Worker" | #define WORKER_TAG TAG "Worker" | ||||||
| @ -442,6 +443,7 @@ static int32_t bad_usb_worker(void* context) { | |||||||
|             if(flags & WorkerEvtEnd) { |             if(flags & WorkerEvtEnd) { | ||||||
|                 break; |                 break; | ||||||
|             } else if(flags & WorkerEvtToggle) { // Start executing script
 |             } else if(flags & WorkerEvtToggle) { // Start executing script
 | ||||||
|  |                 DOLPHIN_DEED(DolphinDeedBadUsbPlayScript); | ||||||
|                 delay_val = 0; |                 delay_val = 0; | ||||||
|                 bad_usb->buf_len = 0; |                 bad_usb->buf_len = 0; | ||||||
|                 bad_usb->st.line_cur = 0; |                 bad_usb->st.line_cur = 0; | ||||||
|  | |||||||
| @ -1,23 +1,30 @@ | |||||||
| #include "animation_manager.h" | #include <gui/view_stack.h> | ||||||
| #include "furi_hal_delay.h" |  | ||||||
| #include "portmacro.h" |  | ||||||
| #include "views/bubble_animation_view.h" |  | ||||||
| #include "animation_storage.h" |  | ||||||
| 
 |  | ||||||
| #include <cmsis_os2.h> |  | ||||||
| #include <dolphin/dolphin.h> |  | ||||||
| #include <furi/check.h> |  | ||||||
| #include <furi/pubsub.h> |  | ||||||
| #include <furi/record.h> |  | ||||||
| #include <m-string.h> |  | ||||||
| #include <power/power_service/power.h> |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  | #include <furi.h> | ||||||
|  | #include <m-string.h> | ||||||
|  | #include <portmacro.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
|  | #include <power/power_service/power.h> | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| #include <dolphin/dolphin_i.h> | #include <assets_icons.h> | ||||||
| #include <storage/filesystem_api_defines.h> | 
 | ||||||
|  | #include "views/bubble_animation_view.h" | ||||||
|  | #include "views/one_shot_animation_view.h" | ||||||
|  | #include "animation_storage.h" | ||||||
|  | #include "animation_manager.h" | ||||||
| 
 | 
 | ||||||
| #define TAG "AnimationManager" | #define TAG "AnimationManager" | ||||||
| 
 | 
 | ||||||
|  | #define HARDCODED_ANIMATION_NAME "L1_Tv_128x47" | ||||||
|  | #define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" | ||||||
|  | #define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" | ||||||
|  | 
 | ||||||
|  | #define NO_DB_ANIMATION_NAME "L0_NoDb_128x51" | ||||||
|  | #define BAD_SD_ANIMATION_NAME "L0_SdBad_128x51" | ||||||
|  | #define SD_OK_ANIMATION_NAME "L0_SdOk_128x51" | ||||||
|  | #define URL_ANIMATION_NAME "L0_Url_128x51" | ||||||
|  | #define NEW_MAIL_ANIMATION_NAME "L0_NewMail_128x51" | ||||||
|  | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     AnimationManagerStateIdle, |     AnimationManagerStateIdle, | ||||||
|     AnimationManagerStateBlocked, |     AnimationManagerStateBlocked, | ||||||
| @ -29,10 +36,13 @@ struct AnimationManager { | |||||||
|     bool sd_show_url; |     bool sd_show_url; | ||||||
|     bool sd_shown_no_db; |     bool sd_shown_no_db; | ||||||
|     bool sd_shown_sd_ok; |     bool sd_shown_sd_ok; | ||||||
|  |     bool levelup_pending; | ||||||
|  |     bool levelup_active; | ||||||
|     AnimationManagerState state; |     AnimationManagerState state; | ||||||
|     FuriPubSubSubscription* pubsub_subscription_storage; |     FuriPubSubSubscription* pubsub_subscription_storage; | ||||||
|     FuriPubSubSubscription* pubsub_subscription_dolphin; |     FuriPubSubSubscription* pubsub_subscription_dolphin; | ||||||
|     BubbleAnimationView* animation_view; |     BubbleAnimationView* animation_view; | ||||||
|  |     OneShotView* one_shot_view; | ||||||
|     osTimerId_t idle_animation_timer; |     osTimerId_t idle_animation_timer; | ||||||
|     StorageAnimation* current_animation; |     StorageAnimation* current_animation; | ||||||
|     AnimationManagerInteractCallback interact_callback; |     AnimationManagerInteractCallback interact_callback; | ||||||
| @ -41,6 +51,7 @@ struct AnimationManager { | |||||||
|     void* context; |     void* context; | ||||||
|     string_t freezed_animation_name; |     string_t freezed_animation_name; | ||||||
|     int32_t freezed_animation_time_left; |     int32_t freezed_animation_time_left; | ||||||
|  |     ViewStack* view_stack; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static StorageAnimation* | static StorageAnimation* | ||||||
| @ -50,6 +61,11 @@ static void animation_manager_replace_current_animation( | |||||||
|     StorageAnimation* storage_animation); |     StorageAnimation* storage_animation); | ||||||
| static void animation_manager_start_new_idle(AnimationManager* animation_manager); | static void animation_manager_start_new_idle(AnimationManager* animation_manager); | ||||||
| static bool animation_manager_check_blocking(AnimationManager* animation_manager); | static bool animation_manager_check_blocking(AnimationManager* animation_manager); | ||||||
|  | static bool animation_manager_is_valid_idle_animation( | ||||||
|  |     const StorageAnimationManifestInfo* info, | ||||||
|  |     const DolphinStats* stats); | ||||||
|  | static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager); | ||||||
|  | static void animation_manager_switch_to_animation_view(AnimationManager* animation_manager); | ||||||
| 
 | 
 | ||||||
| void animation_manager_set_context(AnimationManager* animation_manager, void* context) { | void animation_manager_set_context(AnimationManager* animation_manager, void* context) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| @ -101,12 +117,26 @@ static void animation_manager_interact_callback(void* context) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* reaction to animation_manager->interact_callback() */ | /* reaction to animation_manager->check_blocking_callback() */ | ||||||
| void animation_manager_check_blocking_process(AnimationManager* animation_manager) { | void animation_manager_check_blocking_process(AnimationManager* animation_manager) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| 
 | 
 | ||||||
|     if(animation_manager->state == AnimationManagerStateIdle) { |     if(animation_manager->state == AnimationManagerStateIdle) { | ||||||
|         animation_manager_check_blocking(animation_manager); |         bool blocked = animation_manager_check_blocking(animation_manager); | ||||||
|  | 
 | ||||||
|  |         if(!blocked) { | ||||||
|  |             Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|  |             DolphinStats stats = dolphin_stats(dolphin); | ||||||
|  |             furi_record_close("dolphin"); | ||||||
|  | 
 | ||||||
|  |             const StorageAnimationManifestInfo* manifest_info = | ||||||
|  |                 animation_storage_get_meta(animation_manager->current_animation); | ||||||
|  |             bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); | ||||||
|  | 
 | ||||||
|  |             if(!valid) { | ||||||
|  |                 animation_manager_start_new_idle(animation_manager); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -119,13 +149,24 @@ void animation_manager_new_idle_process(AnimationManager* animation_manager) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* reaction to animation_manager->check_blocking_callback() */ | /* reaction to animation_manager->interact_callback() */ | ||||||
| void animation_manager_interact_process(AnimationManager* animation_manager) { | void animation_manager_interact_process(AnimationManager* animation_manager) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| 
 | 
 | ||||||
|     if(animation_manager->state == AnimationManagerStateBlocked) { |     if(animation_manager->levelup_pending) { | ||||||
|         /* check if new blocking animation has to be displayed */ |         animation_manager->levelup_pending = false; | ||||||
|  |         animation_manager->levelup_active = true; | ||||||
|  |         animation_manager_switch_to_one_shot_view(animation_manager); | ||||||
|  |         Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|  |         dolphin_upgrade_level(dolphin); | ||||||
|  |         furi_record_close("dolphin"); | ||||||
|  |     } else if(animation_manager->levelup_active) { | ||||||
|  |         animation_manager->levelup_active = false; | ||||||
|  |         animation_manager_start_new_idle(animation_manager); | ||||||
|  |         animation_manager_switch_to_animation_view(animation_manager); | ||||||
|  |     } else if(animation_manager->state == AnimationManagerStateBlocked) { | ||||||
|         bool blocked = animation_manager_check_blocking(animation_manager); |         bool blocked = animation_manager_check_blocking(animation_manager); | ||||||
|  | 
 | ||||||
|         if(!blocked) { |         if(!blocked) { | ||||||
|             animation_manager_start_new_idle(animation_manager); |             animation_manager_start_new_idle(animation_manager); | ||||||
|         } |         } | ||||||
| @ -152,22 +193,26 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
| 
 | 
 | ||||||
|     if(sd_status == FSE_INTERNAL) { |     if(sd_status == FSE_INTERNAL) { | ||||||
|         blocking_animation = animation_storage_find_animation(BAD_SD_ANIMATION_NAME); |         blocking_animation = animation_storage_find_animation(BAD_SD_ANIMATION_NAME); | ||||||
|  |         furi_assert(blocking_animation); | ||||||
|     } else if(sd_status == FSE_NOT_READY) { |     } else if(sd_status == FSE_NOT_READY) { | ||||||
|         animation_manager->sd_shown_sd_ok = false; |         animation_manager->sd_shown_sd_ok = false; | ||||||
|         animation_manager->sd_shown_no_db = false; |         animation_manager->sd_shown_no_db = false; | ||||||
|     } else if(sd_status == FSE_OK) { |     } else if(sd_status == FSE_OK) { | ||||||
|         if(!animation_manager->sd_shown_sd_ok) { |         if(!animation_manager->sd_shown_sd_ok) { | ||||||
|             blocking_animation = animation_storage_find_animation(SD_OK_ANIMATION_NAME); |             blocking_animation = animation_storage_find_animation(SD_OK_ANIMATION_NAME); | ||||||
|  |             furi_assert(blocking_animation); | ||||||
|             animation_manager->sd_shown_sd_ok = true; |             animation_manager->sd_shown_sd_ok = true; | ||||||
|         } else if(!animation_manager->sd_shown_no_db) { |         } else if(!animation_manager->sd_shown_no_db) { | ||||||
|             bool db_exists = storage_common_stat(storage, "/ext/Manifest", NULL) == FSE_OK; |             bool db_exists = storage_common_stat(storage, "/ext/Manifest", NULL) == FSE_OK; | ||||||
|             if(!db_exists) { |             if(!db_exists) { | ||||||
|                 blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); |                 blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); | ||||||
|  |                 furi_assert(blocking_animation); | ||||||
|                 animation_manager->sd_shown_no_db = true; |                 animation_manager->sd_shown_no_db = true; | ||||||
|                 animation_manager->sd_show_url = true; |                 animation_manager->sd_show_url = true; | ||||||
|             } |             } | ||||||
|         } else if(animation_manager->sd_show_url) { |         } else if(animation_manager->sd_show_url) { | ||||||
|             blocking_animation = animation_storage_find_animation(URL_ANIMATION_NAME); |             blocking_animation = animation_storage_find_animation(URL_ANIMATION_NAME); | ||||||
|  |             furi_assert(blocking_animation); | ||||||
|             animation_manager->sd_show_url = false; |             animation_manager->sd_show_url = false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -176,13 +221,17 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close("dolphin"); | ||||||
|     if(!blocking_animation && stats.level_up_is_pending) { |     if(!blocking_animation && stats.level_up_is_pending) { | ||||||
|         blocking_animation = animation_storage_find_animation(LEVELUP_ANIMATION_NAME); |         blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME); | ||||||
|  |         furi_assert(blocking_animation); | ||||||
|  |         if(blocking_animation) { | ||||||
|  |             animation_manager->levelup_pending = true; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(blocking_animation) { |     if(blocking_animation) { | ||||||
|         osTimerStop(animation_manager->idle_animation_timer); |         osTimerStop(animation_manager->idle_animation_timer); | ||||||
|         animation_manager_replace_current_animation(animation_manager, blocking_animation); |         animation_manager_replace_current_animation(animation_manager, blocking_animation); | ||||||
|         /* no starting timer because its blocking animation */ |         /* no timer starting because this is blocking animation */ | ||||||
|         animation_manager->state = AnimationManagerStateBlocked; |         animation_manager->state = AnimationManagerStateBlocked; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -199,7 +248,7 @@ static void animation_manager_replace_current_animation( | |||||||
| 
 | 
 | ||||||
|     const BubbleAnimation* animation = animation_storage_get_bubble_animation(storage_animation); |     const BubbleAnimation* animation = animation_storage_get_bubble_animation(storage_animation); | ||||||
|     bubble_animation_view_set_animation(animation_manager->animation_view, animation); |     bubble_animation_view_set_animation(animation_manager->animation_view, animation); | ||||||
|     const char* new_name = string_get_cstr(animation_storage_get_meta(storage_animation)->name); |     const char* new_name = animation_storage_get_meta(storage_animation)->name; | ||||||
|     FURI_LOG_I(TAG, "Select \'%s\' animation", new_name); |     FURI_LOG_I(TAG, "Select \'%s\' animation", new_name); | ||||||
|     animation_manager->current_animation = storage_animation; |     animation_manager->current_animation = storage_animation; | ||||||
| 
 | 
 | ||||||
| @ -209,9 +258,11 @@ static void animation_manager_replace_current_animation( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| AnimationManager* animation_manager_alloc(void) { | AnimationManager* animation_manager_alloc(void) { | ||||||
|     animation_storage_initialize_internal_animations(); |  | ||||||
|     AnimationManager* animation_manager = furi_alloc(sizeof(AnimationManager)); |     AnimationManager* animation_manager = furi_alloc(sizeof(AnimationManager)); | ||||||
|     animation_manager->animation_view = bubble_animation_view_alloc(); |     animation_manager->animation_view = bubble_animation_view_alloc(); | ||||||
|  |     animation_manager->view_stack = view_stack_alloc(); | ||||||
|  |     View* animation_view = bubble_animation_get_view(animation_manager->animation_view); | ||||||
|  |     view_stack_add_view(animation_manager->view_stack, animation_view); | ||||||
|     string_init(animation_manager->freezed_animation_name); |     string_init(animation_manager->freezed_animation_name); | ||||||
| 
 | 
 | ||||||
|     animation_manager->idle_animation_timer = |     animation_manager->idle_animation_timer = | ||||||
| @ -251,6 +302,8 @@ void animation_manager_free(AnimationManager* animation_manager) { | |||||||
|     furi_record_close("storage"); |     furi_record_close("storage"); | ||||||
| 
 | 
 | ||||||
|     string_clear(animation_manager->freezed_animation_name); |     string_clear(animation_manager->freezed_animation_name); | ||||||
|  |     View* animation_view = bubble_animation_get_view(animation_manager->animation_view); | ||||||
|  |     view_stack_remove_view(animation_manager->view_stack, animation_view); | ||||||
|     bubble_animation_view_free(animation_manager->animation_view); |     bubble_animation_view_free(animation_manager->animation_view); | ||||||
|     osTimerDelete(animation_manager->idle_animation_timer); |     osTimerDelete(animation_manager->idle_animation_timer); | ||||||
| } | } | ||||||
| @ -258,7 +311,39 @@ void animation_manager_free(AnimationManager* animation_manager) { | |||||||
| View* animation_manager_get_animation_view(AnimationManager* animation_manager) { | View* animation_manager_get_animation_view(AnimationManager* animation_manager) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| 
 | 
 | ||||||
|     return bubble_animation_get_view(animation_manager->animation_view); |     return view_stack_get_view(animation_manager->view_stack); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool animation_manager_is_valid_idle_animation( | ||||||
|  |     const StorageAnimationManifestInfo* info, | ||||||
|  |     const DolphinStats* stats) { | ||||||
|  |     furi_assert(info); | ||||||
|  |     furi_assert(info->name); | ||||||
|  | 
 | ||||||
|  |     bool result = true; | ||||||
|  | 
 | ||||||
|  |     if(!strcmp(info->name, BAD_BATTERY_ANIMATION_NAME)) { | ||||||
|  |         Power* power = furi_record_open("power"); | ||||||
|  |         bool battery_is_well = power_is_battery_healthy(power); | ||||||
|  |         furi_record_close("power"); | ||||||
|  | 
 | ||||||
|  |         result = !battery_is_well; | ||||||
|  |     } | ||||||
|  |     if(!strcmp(info->name, NO_SD_ANIMATION_NAME)) { | ||||||
|  |         Storage* storage = furi_record_open("storage"); | ||||||
|  |         FS_Error sd_status = storage_sd_status(storage); | ||||||
|  |         furi_record_close("storage"); | ||||||
|  | 
 | ||||||
|  |         result = (sd_status == FSE_NOT_READY); | ||||||
|  |     } | ||||||
|  |     if((stats->butthurt < info->min_butthurt) || (stats->butthurt > info->max_butthurt)) { | ||||||
|  |         result = false; | ||||||
|  |     } | ||||||
|  |     if((stats->level < info->min_level) || (stats->level > info->max_level)) { | ||||||
|  |         result = false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static StorageAnimation* | static StorageAnimation* | ||||||
| @ -267,40 +352,25 @@ static StorageAnimation* | |||||||
|     StorageAnimationList_init(animation_list); |     StorageAnimationList_init(animation_list); | ||||||
|     animation_storage_fill_animation_list(&animation_list); |     animation_storage_fill_animation_list(&animation_list); | ||||||
| 
 | 
 | ||||||
|     Power* power = furi_record_open("power"); |  | ||||||
|     bool battery_is_well = power_is_battery_healthy(power); |  | ||||||
|     furi_record_close("power"); |  | ||||||
| 
 |  | ||||||
|     Storage* storage = furi_record_open("storage"); |  | ||||||
|     FS_Error sd_status = storage_sd_status(storage); |  | ||||||
|     furi_record_close("storage"); |  | ||||||
| 
 |  | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|  |     furi_record_close("dolphin"); | ||||||
|     uint32_t whole_weight = 0; |     uint32_t whole_weight = 0; | ||||||
| 
 | 
 | ||||||
|     StorageAnimationList_it_t it; |     StorageAnimationList_it_t it; | ||||||
|     for(StorageAnimationList_it(it, animation_list); !StorageAnimationList_end_p(it);) { |     for(StorageAnimationList_it(it, animation_list); !StorageAnimationList_end_p(it);) { | ||||||
|         StorageAnimation* storage_animation = *StorageAnimationList_ref(it); |         StorageAnimation* storage_animation = *StorageAnimationList_ref(it); | ||||||
|         const StorageAnimationMeta* meta = animation_storage_get_meta(storage_animation); |         const StorageAnimationManifestInfo* manifest_info = | ||||||
|         bool skip_animation = false; |             animation_storage_get_meta(storage_animation); | ||||||
|         if(battery_is_well && !string_cmp_str(meta->name, BAD_BATTERY_ANIMATION_NAME)) { |         bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); | ||||||
|             skip_animation = true; |  | ||||||
|         } else if((sd_status != FSE_NOT_READY) && !string_cmp_str(meta->name, NO_SD_ANIMATION_NAME)) { |  | ||||||
|             skip_animation = true; |  | ||||||
|         } else if((stats.butthurt < meta->min_butthurt) || (stats.butthurt > meta->max_butthurt)) { |  | ||||||
|             skip_animation = true; |  | ||||||
|         } else if((stats.level < meta->min_level) || (stats.level > meta->max_level)) { |  | ||||||
|             skip_animation = true; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         if(skip_animation) { |         if(valid) { | ||||||
|  |             whole_weight += manifest_info->weight; | ||||||
|  |             StorageAnimationList_next(it); | ||||||
|  |         } else { | ||||||
|             animation_storage_free_storage_animation(&storage_animation); |             animation_storage_free_storage_animation(&storage_animation); | ||||||
|             /* remove and increase iterator */ |             /* remove and increase iterator */ | ||||||
|             StorageAnimationList_remove(animation_list, it); |             StorageAnimationList_remove(animation_list, it); | ||||||
|         } else { |  | ||||||
|             whole_weight += meta->weight; |  | ||||||
|             StorageAnimationList_next(it); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -325,11 +395,10 @@ static StorageAnimation* | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     StorageAnimationList_clear(animation_list); |     StorageAnimationList_clear(animation_list); | ||||||
|     furi_record_close("dolphin"); |  | ||||||
| 
 | 
 | ||||||
|     /* cache animation, if failed - choose reliable animation */ |     /* cache animation, if failed - choose reliable animation */ | ||||||
|     if(!animation_storage_get_bubble_animation(selected)) { |     if(!animation_storage_get_bubble_animation(selected)) { | ||||||
|         const char* name = string_get_cstr(animation_storage_get_meta(selected)->name); |         const char* name = animation_storage_get_meta(selected)->name; | ||||||
|         FURI_LOG_E(TAG, "Can't upload animation described in manifest: \'%s\'", name); |         FURI_LOG_E(TAG, "Can't upload animation described in manifest: \'%s\'", name); | ||||||
|         animation_storage_free_storage_animation(&selected); |         animation_storage_free_storage_animation(&selected); | ||||||
|         selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME); |         selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME); | ||||||
| @ -362,9 +431,15 @@ void animation_manager_unload_and_stall_animation(AnimationManager* animation_ma | |||||||
|         furi_assert(0); |         furi_assert(0); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     StorageAnimationMeta* meta = animation_storage_get_meta(animation_manager->current_animation); |     FURI_LOG_I( | ||||||
|  |         TAG, | ||||||
|  |         "Unload animation \'%s\'", | ||||||
|  |         animation_storage_get_meta(animation_manager->current_animation)->name); | ||||||
|  | 
 | ||||||
|  |     StorageAnimationManifestInfo* meta = | ||||||
|  |         animation_storage_get_meta(animation_manager->current_animation); | ||||||
|     /* copy str, not move, because it can be internal animation */ |     /* copy str, not move, because it can be internal animation */ | ||||||
|     string_set(animation_manager->freezed_animation_name, meta->name); |     string_set_str(animation_manager->freezed_animation_name, meta->name); | ||||||
| 
 | 
 | ||||||
|     bubble_animation_freeze(animation_manager->animation_view); |     bubble_animation_freeze(animation_manager->animation_view); | ||||||
|     animation_storage_free_storage_animation(&animation_manager->current_animation); |     animation_storage_free_storage_animation(&animation_manager->current_animation); | ||||||
| @ -394,18 +469,27 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m | |||||||
|             StorageAnimation* restore_animation = animation_storage_find_animation( |             StorageAnimation* restore_animation = animation_storage_find_animation( | ||||||
|                 string_get_cstr(animation_manager->freezed_animation_name)); |                 string_get_cstr(animation_manager->freezed_animation_name)); | ||||||
|             if(restore_animation) { |             if(restore_animation) { | ||||||
|                 animation_manager_replace_current_animation(animation_manager, restore_animation); |                 Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|                 animation_manager->state = AnimationManagerStateIdle; |                 DolphinStats stats = dolphin_stats(dolphin); | ||||||
|  |                 furi_record_close("dolphin"); | ||||||
|  |                 const StorageAnimationManifestInfo* manifest_info = | ||||||
|  |                     animation_storage_get_meta(restore_animation); | ||||||
|  |                 bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); | ||||||
|  |                 if(valid) { | ||||||
|  |                     animation_manager_replace_current_animation( | ||||||
|  |                         animation_manager, restore_animation); | ||||||
|  |                     animation_manager->state = AnimationManagerStateIdle; | ||||||
| 
 | 
 | ||||||
|                 if(animation_manager->freezed_animation_time_left) { |                     if(animation_manager->freezed_animation_time_left) { | ||||||
|                     osTimerStart( |                         osTimerStart( | ||||||
|                         animation_manager->idle_animation_timer, |                             animation_manager->idle_animation_timer, | ||||||
|                         animation_manager->freezed_animation_time_left); |                             animation_manager->freezed_animation_time_left); | ||||||
|                 } else { |                     } else { | ||||||
|                     const BubbleAnimation* animation = animation_storage_get_bubble_animation( |                         const BubbleAnimation* animation = animation_storage_get_bubble_animation( | ||||||
|                         animation_manager->current_animation); |                             animation_manager->current_animation); | ||||||
|                     osTimerStart( |                         osTimerStart( | ||||||
|                         animation_manager->idle_animation_timer, animation->duration * 1000); |                             animation_manager->idle_animation_timer, animation->duration * 1000); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 FURI_LOG_E( |                 FURI_LOG_E( | ||||||
| @ -423,12 +507,47 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m | |||||||
|     if(!animation_manager->current_animation) { |     if(!animation_manager->current_animation) { | ||||||
|         animation_manager_start_new_idle(animation_manager); |         animation_manager_start_new_idle(animation_manager); | ||||||
|     } |     } | ||||||
|     FURI_LOG_D( |     FURI_LOG_I( | ||||||
|         TAG, |         TAG, | ||||||
|         "Load & Continue with \'%s\'", |         "Load animation \'%s\'", | ||||||
|         string_get_cstr(animation_storage_get_meta(animation_manager->current_animation)->name)); |         animation_storage_get_meta(animation_manager->current_animation)->name); | ||||||
| 
 | 
 | ||||||
|     bubble_animation_unfreeze(animation_manager->animation_view); |     bubble_animation_unfreeze(animation_manager->animation_view); | ||||||
|     string_reset(animation_manager->freezed_animation_name); |     string_reset(animation_manager->freezed_animation_name); | ||||||
|     furi_assert(animation_manager->current_animation); |     furi_assert(animation_manager->current_animation); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager) { | ||||||
|  |     furi_assert(animation_manager); | ||||||
|  |     furi_assert(!animation_manager->one_shot_view); | ||||||
|  |     Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|  |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|  |     furi_record_close("dolphin"); | ||||||
|  | 
 | ||||||
|  |     animation_manager->one_shot_view = one_shot_view_alloc(); | ||||||
|  |     one_shot_view_set_interact_callback( | ||||||
|  |         animation_manager->one_shot_view, animation_manager_interact_callback, animation_manager); | ||||||
|  |     View* prev_view = bubble_animation_get_view(animation_manager->animation_view); | ||||||
|  |     View* next_view = one_shot_view_get_view(animation_manager->one_shot_view); | ||||||
|  |     view_stack_remove_view(animation_manager->view_stack, prev_view); | ||||||
|  |     view_stack_add_view(animation_manager->view_stack, next_view); | ||||||
|  |     if(stats.level == 1) { | ||||||
|  |         one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup1_128x64); | ||||||
|  |     } else if(stats.level == 2) { | ||||||
|  |         one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup2_128x64); | ||||||
|  |     } else { | ||||||
|  |         furi_assert(0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void animation_manager_switch_to_animation_view(AnimationManager* animation_manager) { | ||||||
|  |     furi_assert(animation_manager); | ||||||
|  |     furi_assert(animation_manager->one_shot_view); | ||||||
|  | 
 | ||||||
|  |     View* prev_view = one_shot_view_get_view(animation_manager->one_shot_view); | ||||||
|  |     View* next_view = bubble_animation_get_view(animation_manager->animation_view); | ||||||
|  |     view_stack_remove_view(animation_manager->view_stack, prev_view); | ||||||
|  |     view_stack_add_view(animation_manager->view_stack, next_view); | ||||||
|  |     one_shot_view_free(animation_manager->one_shot_view); | ||||||
|  |     animation_manager->one_shot_view = NULL; | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,34 +1,35 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "dolphin/dolphin.h" |  | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| typedef struct AnimationManager AnimationManager; | typedef struct AnimationManager AnimationManager; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t x; |     uint8_t x; | ||||||
|     uint8_t y; |     uint8_t y; | ||||||
|     const char* str; |     const char* text; | ||||||
|     Align horizontal; |     Align align_h; | ||||||
|     Align vertical; |     Align align_v; | ||||||
| } Bubble; | } Bubble; | ||||||
| 
 | 
 | ||||||
| typedef struct FrameBubble { | typedef struct FrameBubble { | ||||||
|     Bubble bubble; |     Bubble bubble; | ||||||
|     uint8_t starts_at_frame; |     uint8_t start_frame; | ||||||
|     uint8_t ends_at_frame; |     uint8_t end_frame; | ||||||
|     struct FrameBubble* next_bubble; |     const struct FrameBubble* next_bubble; | ||||||
| } FrameBubble; | } FrameBubble; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     FrameBubble** frame_bubbles; |     const FrameBubble* const* frame_bubble_sequences; | ||||||
|     uint8_t frame_bubbles_count; |     uint8_t frame_bubble_sequences_count; | ||||||
|     const Icon** icons; |     const Icon icon_animation; | ||||||
|  |     uint8_t frame_order[20]; | ||||||
|     uint8_t passive_frames; |     uint8_t passive_frames; | ||||||
|     uint8_t active_frames; |     uint8_t active_frames; | ||||||
|     uint8_t active_cycles; |     uint8_t active_cycles; | ||||||
|     uint8_t frame_rate; |  | ||||||
|     uint16_t duration; |     uint16_t duration; | ||||||
|     uint16_t active_cooldown; |     uint16_t active_cooldown; | ||||||
| } BubbleAnimation; | } BubbleAnimation; | ||||||
|  | |||||||
| @ -1,34 +1,86 @@ | |||||||
| #include "animation_manager.h" |  | ||||||
| #include "file_worker.h" |  | ||||||
| #include "flipper_file.h" |  | ||||||
| #include "furi/common_defines.h" |  | ||||||
| #include "furi/memmgr.h" |  | ||||||
| #include "furi/record.h" |  | ||||||
| #include "animation_storage.h" |  | ||||||
| #include "gui/canvas.h" |  | ||||||
| #include "m-string.h" |  | ||||||
| #include "pb.h" |  | ||||||
| #include "pb_decode.h" |  | ||||||
| #include "storage/filesystem_api_defines.h" |  | ||||||
| #include "storage/storage.h" |  | ||||||
| #include "animation_storage_i.h" |  | ||||||
| #include <stdint.h> |  | ||||||
| #include <gui/icon_i.h> |  | ||||||
| 
 | 
 | ||||||
| // Read documentation before using it
 | #include <stdint.h> | ||||||
|  | #include <flipper_file.h> | ||||||
|  | #include <furi.h> | ||||||
| #include <furi/dangerous_defines.h> | #include <furi/dangerous_defines.h> | ||||||
|  | #include <storage/storage.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
|  | #include <m-string.h> | ||||||
|  | 
 | ||||||
|  | #include "animation_manager.h" | ||||||
|  | #include "animation_storage.h" | ||||||
|  | #include "animation_storage_i.h" | ||||||
|  | #include <assets_dolphin_internal.h> | ||||||
|  | #include <assets_dolphin_blocking.h> | ||||||
| 
 | 
 | ||||||
| #define ANIMATION_META_FILE "meta.txt" | #define ANIMATION_META_FILE "meta.txt" | ||||||
| #define ANIMATION_DIR "/ext/dolphin/animations" | #define ANIMATION_DIR "/ext/dolphin" | ||||||
| #define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" | #define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" | ||||||
| #define TAG "AnimationStorage" | #define TAG "AnimationStorage" | ||||||
| #define DEBUG_PB 0 |  | ||||||
| 
 | 
 | ||||||
| static void animation_storage_free_bubbles(BubbleAnimation* animation); | static void animation_storage_free_bubbles(BubbleAnimation* animation); | ||||||
| static void animation_storage_free_frames(BubbleAnimation* animation); | static void animation_storage_free_frames(BubbleAnimation* animation); | ||||||
| static void animation_storage_free_animation(BubbleAnimation** storage_animation); | static void animation_storage_free_animation(BubbleAnimation** storage_animation); | ||||||
| static BubbleAnimation* animation_storage_load_animation(const char* name); | static BubbleAnimation* animation_storage_load_animation(const char* name); | ||||||
| 
 | 
 | ||||||
|  | static bool animation_storage_load_single_manifest_info( | ||||||
|  |     StorageAnimationManifestInfo* manifest_info, | ||||||
|  |     const char* name) { | ||||||
|  |     furi_assert(manifest_info); | ||||||
|  | 
 | ||||||
|  |     bool result = false; | ||||||
|  |     Storage* storage = furi_record_open("storage"); | ||||||
|  |     FlipperFile* file = flipper_file_alloc(storage); | ||||||
|  |     flipper_file_set_strict_mode(file, true); | ||||||
|  |     string_t read_string; | ||||||
|  |     string_init(read_string); | ||||||
|  | 
 | ||||||
|  |     do { | ||||||
|  |         uint32_t u32value; | ||||||
|  |         if(FSE_OK != storage_sd_status(storage)) break; | ||||||
|  |         if(!flipper_file_open_existing(file, ANIMATION_MANIFEST_FILE)) break; | ||||||
|  | 
 | ||||||
|  |         if(!flipper_file_read_header(file, read_string, &u32value)) break; | ||||||
|  |         if(string_cmp_str(read_string, "Flipper Animation Manifest")) break; | ||||||
|  | 
 | ||||||
|  |         manifest_info->name = NULL; | ||||||
|  | 
 | ||||||
|  |         /* skip other animation names */ | ||||||
|  |         flipper_file_set_strict_mode(file, false); | ||||||
|  |         while(flipper_file_read_string(file, "Name", read_string) && | ||||||
|  |               string_cmp_str(read_string, name)) | ||||||
|  |             ; | ||||||
|  |         if(string_cmp_str(read_string, name)) break; | ||||||
|  |         flipper_file_set_strict_mode(file, true); | ||||||
|  | 
 | ||||||
|  |         manifest_info->name = furi_alloc(string_size(read_string) + 1); | ||||||
|  |         strcpy((char*)manifest_info->name, string_get_cstr(read_string)); | ||||||
|  | 
 | ||||||
|  |         if(!flipper_file_read_uint32(file, "Min butthurt", &u32value, 1)) break; | ||||||
|  |         manifest_info->min_butthurt = u32value; | ||||||
|  |         if(!flipper_file_read_uint32(file, "Max butthurt", &u32value, 1)) break; | ||||||
|  |         manifest_info->max_butthurt = u32value; | ||||||
|  |         if(!flipper_file_read_uint32(file, "Min level", &u32value, 1)) break; | ||||||
|  |         manifest_info->min_level = u32value; | ||||||
|  |         if(!flipper_file_read_uint32(file, "Max level", &u32value, 1)) break; | ||||||
|  |         manifest_info->max_level = u32value; | ||||||
|  |         if(!flipper_file_read_uint32(file, "Weight", &u32value, 1)) break; | ||||||
|  |         manifest_info->weight = u32value; | ||||||
|  |         result = true; | ||||||
|  |     } while(0); | ||||||
|  | 
 | ||||||
|  |     if(!result && manifest_info->name) { | ||||||
|  |         free((void*)manifest_info->name); | ||||||
|  |     } | ||||||
|  |     string_clear(read_string); | ||||||
|  |     flipper_file_close(file); | ||||||
|  |     flipper_file_free(file); | ||||||
|  | 
 | ||||||
|  |     furi_record_close("storage"); | ||||||
|  | 
 | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void animation_storage_fill_animation_list(StorageAnimationList_t* animation_list) { | void animation_storage_fill_animation_list(StorageAnimationList_t* animation_list) { | ||||||
|     furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); |     furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); | ||||||
|     furi_assert(!StorageAnimationList_size(*animation_list)); |     furi_assert(!StorageAnimationList_size(*animation_list)); | ||||||
| @ -37,8 +89,8 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis | |||||||
|     FlipperFile* file = flipper_file_alloc(storage); |     FlipperFile* file = flipper_file_alloc(storage); | ||||||
|     /* Forbid skipping fields */ |     /* Forbid skipping fields */ | ||||||
|     flipper_file_set_strict_mode(file, true); |     flipper_file_set_strict_mode(file, true); | ||||||
|     string_t header; |     string_t read_string; | ||||||
|     string_init(header); |     string_init(read_string); | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         uint32_t u32value; |         uint32_t u32value; | ||||||
| @ -46,24 +98,28 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis | |||||||
| 
 | 
 | ||||||
|         if(FSE_OK != storage_sd_status(storage)) break; |         if(FSE_OK != storage_sd_status(storage)) break; | ||||||
|         if(!flipper_file_open_existing(file, ANIMATION_MANIFEST_FILE)) break; |         if(!flipper_file_open_existing(file, ANIMATION_MANIFEST_FILE)) break; | ||||||
|         if(!flipper_file_read_header(file, header, &u32value)) break; |         if(!flipper_file_read_header(file, read_string, &u32value)) break; | ||||||
|         if(string_cmp_str(header, "Flipper Animation Manifest")) break; |         if(string_cmp_str(read_string, "Flipper Animation Manifest")) break; | ||||||
|         do { |         do { | ||||||
|             storage_animation = furi_alloc(sizeof(StorageAnimation)); |             storage_animation = furi_alloc(sizeof(StorageAnimation)); | ||||||
|             storage_animation->external = true; |             storage_animation->external = true; | ||||||
|             storage_animation->animation = NULL; |             storage_animation->animation = NULL; | ||||||
|  |             storage_animation->manifest_info.name = NULL; | ||||||
|  | 
 | ||||||
|  |             if(!flipper_file_read_string(file, "Name", read_string)) break; | ||||||
|  |             storage_animation->manifest_info.name = furi_alloc(string_size(read_string) + 1); | ||||||
|  |             strcpy((char*)storage_animation->manifest_info.name, string_get_cstr(read_string)); | ||||||
| 
 | 
 | ||||||
|             if(!flipper_file_read_string(file, "Name", storage_animation->meta.name)) break; |  | ||||||
|             if(!flipper_file_read_uint32(file, "Min butthurt", &u32value, 1)) break; |             if(!flipper_file_read_uint32(file, "Min butthurt", &u32value, 1)) break; | ||||||
|             storage_animation->meta.min_butthurt = u32value; |             storage_animation->manifest_info.min_butthurt = u32value; | ||||||
|             if(!flipper_file_read_uint32(file, "Max butthurt", &u32value, 1)) break; |             if(!flipper_file_read_uint32(file, "Max butthurt", &u32value, 1)) break; | ||||||
|             storage_animation->meta.max_butthurt = u32value; |             storage_animation->manifest_info.max_butthurt = u32value; | ||||||
|             if(!flipper_file_read_uint32(file, "Min level", &u32value, 1)) break; |             if(!flipper_file_read_uint32(file, "Min level", &u32value, 1)) break; | ||||||
|             storage_animation->meta.min_level = u32value; |             storage_animation->manifest_info.min_level = u32value; | ||||||
|             if(!flipper_file_read_uint32(file, "Max level", &u32value, 1)) break; |             if(!flipper_file_read_uint32(file, "Max level", &u32value, 1)) break; | ||||||
|             storage_animation->meta.max_level = u32value; |             storage_animation->manifest_info.max_level = u32value; | ||||||
|             if(!flipper_file_read_uint32(file, "Weight", &u32value, 1)) break; |             if(!flipper_file_read_uint32(file, "Weight", &u32value, 1)) break; | ||||||
|             storage_animation->meta.weight = u32value; |             storage_animation->manifest_info.weight = u32value; | ||||||
| 
 | 
 | ||||||
|             StorageAnimationList_push_back(*animation_list, storage_animation); |             StorageAnimationList_push_back(*animation_list, storage_animation); | ||||||
|         } while(1); |         } while(1); | ||||||
| @ -71,13 +127,13 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis | |||||||
|         animation_storage_free_storage_animation(&storage_animation); |         animation_storage_free_storage_animation(&storage_animation); | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     string_clear(header); |     string_clear(read_string); | ||||||
|     flipper_file_close(file); |     flipper_file_close(file); | ||||||
|     flipper_file_free(file); |     flipper_file_free(file); | ||||||
| 
 | 
 | ||||||
|     // add hard-coded animations
 |     // add hard-coded animations
 | ||||||
|     for(int i = 0; i < COUNT_OF(StorageAnimationInternal); ++i) { |     for(int i = 0; i < dolphin_internal_size; ++i) { | ||||||
|         StorageAnimationList_push_back(*animation_list, &StorageAnimationInternal[i]); |         StorageAnimationList_push_back(*animation_list, (StorageAnimation*)&dolphin_internal[i]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close("storage"); | ||||||
| @ -88,41 +144,45 @@ StorageAnimation* animation_storage_find_animation(const char* name) { | |||||||
|     furi_assert(strlen(name)); |     furi_assert(strlen(name)); | ||||||
|     StorageAnimation* storage_animation = NULL; |     StorageAnimation* storage_animation = NULL; | ||||||
| 
 | 
 | ||||||
|     /* look through internal animations */ |     for(int i = 0; i < dolphin_blocking_size; ++i) { | ||||||
|     for(int i = 0; i < COUNT_OF(StorageAnimationInternal); ++i) { |         if(!strcmp(dolphin_blocking[i].manifest_info.name, name)) { | ||||||
|         if(!string_cmp_str(StorageAnimationInternal[i].meta.name, name)) { |             storage_animation = (StorageAnimation*)&dolphin_blocking[i]; | ||||||
|             storage_animation = &StorageAnimationInternal[i]; |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if(!storage_animation) { | ||||||
|  |         for(int i = 0; i < dolphin_internal_size; ++i) { | ||||||
|  |             if(!strcmp(dolphin_internal[i].manifest_info.name, name)) { | ||||||
|  |                 storage_animation = (StorageAnimation*)&dolphin_internal[i]; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /* look through external animations */ |     /* look through external animations */ | ||||||
|     if(!storage_animation) { |     if(!storage_animation) { | ||||||
|         BubbleAnimation* animation = animation_storage_load_animation(name); |         storage_animation = furi_alloc(sizeof(StorageAnimation)); | ||||||
|  |         storage_animation->external = true; | ||||||
| 
 | 
 | ||||||
|         if(animation != NULL) { |         bool result = false; | ||||||
|             storage_animation = furi_alloc(sizeof(StorageAnimation)); |         result = | ||||||
|             storage_animation->animation = animation; |             animation_storage_load_single_manifest_info(&storage_animation->manifest_info, name); | ||||||
|             storage_animation->external = true; |         if(result) { | ||||||
|             /* meta data takes part in random animation selection, so it
 |             storage_animation->animation = animation_storage_load_animation(name); | ||||||
|              * doesn't need here as we exactly know which animation we need, |             result = !!storage_animation->animation; | ||||||
|              * that's why we can ignore reading manifest.txt file |         } | ||||||
|              * filling meta data by zeroes */ |         if(!result) { | ||||||
|             storage_animation->meta.min_butthurt = 0; |             animation_storage_free_storage_animation(&storage_animation); | ||||||
|             storage_animation->meta.max_butthurt = 0; |  | ||||||
|             storage_animation->meta.min_level = 0; |  | ||||||
|             storage_animation->meta.max_level = 0; |  | ||||||
|             storage_animation->meta.weight = 0; |  | ||||||
|             string_init_set_str(storage_animation->meta.name, name); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return storage_animation; |     return storage_animation; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| StorageAnimationMeta* animation_storage_get_meta(StorageAnimation* storage_animation) { | StorageAnimationManifestInfo* animation_storage_get_meta(StorageAnimation* storage_animation) { | ||||||
|     furi_assert(storage_animation); |     furi_assert(storage_animation); | ||||||
|     return &storage_animation->meta; |     return &storage_animation->manifest_info; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const BubbleAnimation* | const BubbleAnimation* | ||||||
| @ -138,7 +198,7 @@ void animation_storage_cache_animation(StorageAnimation* storage_animation) { | |||||||
|     if(storage_animation->external) { |     if(storage_animation->external) { | ||||||
|         if(!storage_animation->animation) { |         if(!storage_animation->animation) { | ||||||
|             storage_animation->animation = |             storage_animation->animation = | ||||||
|                 animation_storage_load_animation(string_get_cstr(storage_animation->meta.name)); |                 animation_storage_load_animation(storage_animation->manifest_info.name); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -161,7 +221,9 @@ void animation_storage_free_storage_animation(StorageAnimation** storage_animati | |||||||
|     if((*storage_animation)->external) { |     if((*storage_animation)->external) { | ||||||
|         animation_storage_free_animation((BubbleAnimation**)&(*storage_animation)->animation); |         animation_storage_free_animation((BubbleAnimation**)&(*storage_animation)->animation); | ||||||
| 
 | 
 | ||||||
|         string_clear((*storage_animation)->meta.name); |         if((*storage_animation)->manifest_info.name) { | ||||||
|  |             free((void*)(*storage_animation)->manifest_info.name); | ||||||
|  |         } | ||||||
|         free(*storage_animation); |         free(*storage_animation); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -188,41 +250,15 @@ static bool animation_storage_cast_align(string_t align_str, Align* align) { | |||||||
| 
 | 
 | ||||||
| static void animation_storage_free_frames(BubbleAnimation* animation) { | static void animation_storage_free_frames(BubbleAnimation* animation) { | ||||||
|     furi_assert(animation); |     furi_assert(animation); | ||||||
|     furi_assert(animation->icons); |  | ||||||
| 
 | 
 | ||||||
|     const Icon** icons = animation->icons; |     const Icon* icon = &animation->icon_animation; | ||||||
|     uint16_t frames = animation->active_frames + animation->passive_frames; |     for(int i = 0; i < icon->frame_count; ++i) { | ||||||
|     furi_assert(frames > 0); |         if(icon->frames[i]) { | ||||||
| 
 |             free((void*)icon->frames[i]); | ||||||
|     for(int i = 0; i < frames; ++i) { |  | ||||||
|         if(!icons[i]) continue; |  | ||||||
| 
 |  | ||||||
|         const Icon* icon = icons[i]; |  | ||||||
|         free((void*)icon->frames[0]); |  | ||||||
|         free(icon->frames); |  | ||||||
|         free((void*)icon); |  | ||||||
|         for(int j = i; j < frames; ++j) { |  | ||||||
|             if(icons[j] == icon) { |  | ||||||
|                 icons[j] = NULL; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     free(animation->icons); |  | ||||||
|     animation->icons = NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static Icon* animation_storage_alloc_icon(size_t frame_size) { |  | ||||||
|     Icon* icon = furi_alloc(sizeof(Icon)); |  | ||||||
|     icon->frames = furi_alloc(sizeof(const uint8_t*)); |  | ||||||
|     icon->frames[0] = furi_alloc(frame_size); |  | ||||||
|     return icon; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void animation_storage_free_icon(Icon* icon) { |  | ||||||
|     free((void*)icon->frames[0]); |  | ||||||
|     free(icon->frames); |     free(icon->frames); | ||||||
|     free(icon); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool animation_storage_load_frames( | static bool animation_storage_load_frames( | ||||||
| @ -230,22 +266,25 @@ static bool animation_storage_load_frames( | |||||||
|     const char* name, |     const char* name, | ||||||
|     BubbleAnimation* animation, |     BubbleAnimation* animation, | ||||||
|     uint32_t* frame_order, |     uint32_t* frame_order, | ||||||
|     uint32_t width, |     uint8_t width, | ||||||
|     uint32_t height) { |     uint8_t height) { | ||||||
|     furi_assert(!animation->icons); |  | ||||||
|     uint16_t frame_order_size = animation->passive_frames + animation->active_frames; |     uint16_t frame_order_size = animation->passive_frames + animation->active_frames; | ||||||
| 
 | 
 | ||||||
|     bool frames_ok = false; |     bool frames_ok = false; | ||||||
|     animation->icons = furi_alloc(sizeof(const Icon*) * frame_order_size); |  | ||||||
|     File* file = storage_file_alloc(storage); |     File* file = storage_file_alloc(storage); | ||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
|     string_t filename; |     string_t filename; | ||||||
|     string_init(filename); |     string_init(filename); | ||||||
|     size_t max_filesize = ROUND_UP_TO(width, 8) * height + 1; |     size_t max_filesize = ROUND_UP_TO(width, 8) * height + 1; | ||||||
|  |     Icon* icon = (Icon*)&animation->icon_animation; | ||||||
|  |     FURI_CONST_ASSIGN(icon->frame_count, frame_order_size); | ||||||
|  |     FURI_CONST_ASSIGN(icon->frame_rate, 0); | ||||||
|  |     FURI_CONST_ASSIGN(icon->height, height); | ||||||
|  |     FURI_CONST_ASSIGN(icon->width, width); | ||||||
|  | 
 | ||||||
|  |     icon->frames = furi_alloc(sizeof(const uint8_t*) * frame_order_size); | ||||||
| 
 | 
 | ||||||
|     for(int i = 0; i < frame_order_size; ++i) { |     for(int i = 0; i < frame_order_size; ++i) { | ||||||
|         if(animation->icons[i]) continue; |  | ||||||
| 
 |  | ||||||
|         frames_ok = false; |         frames_ok = false; | ||||||
|         string_printf(filename, ANIMATION_DIR "/%s/frame_%d.bm", name, frame_order[i]); |         string_printf(filename, ANIMATION_DIR "/%s/frame_%d.bm", name, frame_order[i]); | ||||||
| 
 | 
 | ||||||
| @ -265,24 +304,12 @@ static bool animation_storage_load_frames( | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Icon* icon = animation_storage_alloc_icon(file_info.size); |         icon->frames[i] = furi_alloc(file_info.size); | ||||||
|         if(storage_file_read(file, (void*)icon->frames[0], file_info.size) != file_info.size) { |         if(storage_file_read(file, (void*)icon->frames[i], file_info.size) != file_info.size) { | ||||||
|             FURI_LOG_E(TAG, "Read failed: \'%s\'", string_get_cstr(filename)); |             FURI_LOG_E(TAG, "Read failed: \'%s\'", string_get_cstr(filename)); | ||||||
|             animation_storage_free_icon(icon); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         storage_file_close(file); |         storage_file_close(file); | ||||||
|         FURI_CONST_ASSIGN(icon->frame_count, 1); |  | ||||||
|         FURI_CONST_ASSIGN(icon->frame_rate, 0); |  | ||||||
|         FURI_CONST_ASSIGN(icon->height, height); |  | ||||||
|         FURI_CONST_ASSIGN(icon->width, width); |  | ||||||
| 
 |  | ||||||
|         /* Claim 1 allocation for 1 files blob and several links to it */ |  | ||||||
|         for(int j = i; j < frame_order_size; ++j) { |  | ||||||
|             if(frame_order[i] == frame_order[j]) { |  | ||||||
|                 animation->icons[j] = icon; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         frames_ok = true; |         frames_ok = true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -295,11 +322,10 @@ static bool animation_storage_load_frames( | |||||||
|             height, |             height, | ||||||
|             file_info.size); |             file_info.size); | ||||||
|         animation_storage_free_frames(animation); |         animation_storage_free_frames(animation); | ||||||
|         animation->icons = NULL; |  | ||||||
|     } else { |     } else { | ||||||
|         for(int i = 0; i < frame_order_size; ++i) { |         furi_check(animation->icon_animation.frames); | ||||||
|             furi_check(animation->icons[i]); |         for(int i = 0; i < animation->icon_animation.frame_count; ++i) { | ||||||
|             furi_check(animation->icons[i]->frames[0]); |             furi_check(animation->icon_animation.frames[i]); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -314,72 +340,73 @@ static bool animation_storage_load_bubbles(BubbleAnimation* animation, FlipperFi | |||||||
|     string_t str; |     string_t str; | ||||||
|     string_init(str); |     string_init(str); | ||||||
|     bool success = false; |     bool success = false; | ||||||
|     furi_assert(!animation->frame_bubbles); |     furi_assert(!animation->frame_bubble_sequences); | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         if(!flipper_file_read_uint32(ff, "Bubble slots", &u32value, 1)) break; |         if(!flipper_file_read_uint32(ff, "Bubble slots", &u32value, 1)) break; | ||||||
|         if(u32value > 20) break; |         if(u32value > 20) break; | ||||||
|         animation->frame_bubbles_count = u32value; |         animation->frame_bubble_sequences_count = u32value; | ||||||
|         if(animation->frame_bubbles_count == 0) { |         if(animation->frame_bubble_sequences_count == 0) { | ||||||
|             animation->frame_bubbles = NULL; |             animation->frame_bubble_sequences = NULL; | ||||||
|             success = true; |             success = true; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         animation->frame_bubbles = |         animation->frame_bubble_sequences = | ||||||
|             furi_alloc(sizeof(FrameBubble*) * animation->frame_bubbles_count); |             furi_alloc(sizeof(FrameBubble*) * animation->frame_bubble_sequences_count); | ||||||
| 
 | 
 | ||||||
|         uint32_t current_slot = 0; |         uint32_t current_slot = 0; | ||||||
|         for(int i = 0; i < animation->frame_bubbles_count; ++i) { |         for(int i = 0; i < animation->frame_bubble_sequences_count; ++i) { | ||||||
|             animation->frame_bubbles[i] = furi_alloc(sizeof(FrameBubble)); |             FURI_CONST_ASSIGN_PTR( | ||||||
|  |                 animation->frame_bubble_sequences[i], furi_alloc(sizeof(FrameBubble))); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         FrameBubble* bubble = animation->frame_bubbles[0]; |         const FrameBubble* bubble = animation->frame_bubble_sequences[0]; | ||||||
|         int8_t index = -1; |         int8_t index = -1; | ||||||
|         for(;;) { |         for(;;) { | ||||||
|             if(!flipper_file_read_uint32(ff, "Slot", ¤t_slot, 1)) break; |             if(!flipper_file_read_uint32(ff, "Slot", ¤t_slot, 1)) break; | ||||||
|             if((current_slot != 0) && (index == -1)) break; |             if((current_slot != 0) && (index == -1)) break; | ||||||
| 
 | 
 | ||||||
|             if(current_slot == index) { |             if(current_slot == index) { | ||||||
|                 bubble->next_bubble = furi_alloc(sizeof(FrameBubble)); |                 FURI_CONST_ASSIGN_PTR(bubble->next_bubble, furi_alloc(sizeof(FrameBubble))); | ||||||
|                 bubble = bubble->next_bubble; |                 bubble = bubble->next_bubble; | ||||||
|             } else if(current_slot == index + 1) { |             } else if(current_slot == index + 1) { | ||||||
|                 ++index; |                 ++index; | ||||||
|                 bubble = animation->frame_bubbles[index]; |                 bubble = animation->frame_bubble_sequences[index]; | ||||||
|             } else { |             } else { | ||||||
|                 /* slots have to start from 0, be ascending sorted, and
 |                 /* slots have to start from 0, be ascending sorted, and
 | ||||||
|                  * have exact number of slots as specified in "Bubble slots" */ |                  * have exact number of slots as specified in "Bubble slots" */ | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if(index >= animation->frame_bubbles_count) break; |             if(index >= animation->frame_bubble_sequences_count) break; | ||||||
| 
 | 
 | ||||||
|             if(!flipper_file_read_uint32(ff, "X", &u32value, 1)) break; |             if(!flipper_file_read_uint32(ff, "X", &u32value, 1)) break; | ||||||
|             bubble->bubble.x = u32value; |             FURI_CONST_ASSIGN(bubble->bubble.x, u32value); | ||||||
|             if(!flipper_file_read_uint32(ff, "Y", &u32value, 1)) break; |             if(!flipper_file_read_uint32(ff, "Y", &u32value, 1)) break; | ||||||
|             bubble->bubble.y = u32value; |             FURI_CONST_ASSIGN(bubble->bubble.y, u32value); | ||||||
| 
 | 
 | ||||||
|             if(!flipper_file_read_string(ff, "Text", str)) break; |             if(!flipper_file_read_string(ff, "Text", str)) break; | ||||||
|             if(string_size(str) > 100) break; |             if(string_size(str) > 100) break; | ||||||
| 
 | 
 | ||||||
|             string_replace_all_str(str, "\\n", "\n"); |             string_replace_all_str(str, "\\n", "\n"); | ||||||
| 
 | 
 | ||||||
|             bubble->bubble.str = furi_alloc(string_size(str) + 1); |             FURI_CONST_ASSIGN_PTR(bubble->bubble.text, furi_alloc(string_size(str) + 1)); | ||||||
|             strcpy((char*)bubble->bubble.str, string_get_cstr(str)); |             strcpy((char*)bubble->bubble.text, string_get_cstr(str)); | ||||||
| 
 | 
 | ||||||
|             if(!flipper_file_read_string(ff, "AlignH", str)) break; |             if(!flipper_file_read_string(ff, "AlignH", str)) break; | ||||||
|             if(!animation_storage_cast_align(str, &bubble->bubble.horizontal)) break; |             if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_h)) break; | ||||||
|             if(!flipper_file_read_string(ff, "AlignV", str)) break; |             if(!flipper_file_read_string(ff, "AlignV", str)) break; | ||||||
|             if(!animation_storage_cast_align(str, &bubble->bubble.vertical)) break; |             if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_v)) break; | ||||||
| 
 | 
 | ||||||
|             if(!flipper_file_read_uint32(ff, "StartFrame", &u32value, 1)) break; |             if(!flipper_file_read_uint32(ff, "StartFrame", &u32value, 1)) break; | ||||||
|             bubble->starts_at_frame = u32value; |             FURI_CONST_ASSIGN(bubble->start_frame, u32value); | ||||||
|             if(!flipper_file_read_uint32(ff, "EndFrame", &u32value, 1)) break; |             if(!flipper_file_read_uint32(ff, "EndFrame", &u32value, 1)) break; | ||||||
|             bubble->ends_at_frame = u32value; |             FURI_CONST_ASSIGN(bubble->end_frame, u32value); | ||||||
|         } |         } | ||||||
|         success = (index + 1) == animation->frame_bubbles_count; |         success = (index + 1) == animation->frame_bubble_sequences_count; | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     if(!success) { |     if(!success) { | ||||||
|         if(animation->frame_bubbles) { |         if(animation->frame_bubble_sequences) { | ||||||
|             FURI_LOG_E(TAG, "Failed to load animation bubbles"); |             FURI_LOG_E(TAG, "Failed to load animation bubbles"); | ||||||
|             animation_storage_free_bubbles(animation); |             animation_storage_free_bubbles(animation); | ||||||
|         } |         } | ||||||
| @ -402,7 +429,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { | |||||||
|     flipper_file_set_strict_mode(ff, true); |     flipper_file_set_strict_mode(ff, true); | ||||||
|     string_t str; |     string_t str; | ||||||
|     string_init(str); |     string_init(str); | ||||||
|     animation->frame_bubbles = NULL; |     animation->frame_bubble_sequences = NULL; | ||||||
| 
 | 
 | ||||||
|     bool success = false; |     bool success = false; | ||||||
|     do { |     do { | ||||||
| @ -424,8 +451,17 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { | |||||||
|         animation->active_frames = u32value; |         animation->active_frames = u32value; | ||||||
| 
 | 
 | ||||||
|         uint8_t frames = animation->passive_frames + animation->active_frames; |         uint8_t frames = animation->passive_frames + animation->active_frames; | ||||||
|  |         uint32_t count = 0; | ||||||
|  |         if(!flipper_file_get_value_count(ff, "Frames order", &count)) break; | ||||||
|  |         if((count != frames) || (frames > COUNT_OF(animation->frame_order))) { | ||||||
|  |             FURI_LOG_E(TAG, "Error loading animation: frames order"); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         u32array = furi_alloc(sizeof(uint32_t) * frames); |         u32array = furi_alloc(sizeof(uint32_t) * frames); | ||||||
|         if(!flipper_file_read_uint32(ff, "Frames order", u32array, frames)) break; |         if(!flipper_file_read_uint32(ff, "Frames order", u32array, frames)) break; | ||||||
|  |         for(int i = 0; i < frames; ++i) { | ||||||
|  |             animation->frame_order[i] = u32array[i]; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         /* passive and active frames must be loaded up to this point */ |         /* passive and active frames must be loaded up to this point */ | ||||||
|         if(!animation_storage_load_frames(storage, name, animation, u32array, width, height)) |         if(!animation_storage_load_frames(storage, name, animation, u32array, width, height)) | ||||||
| @ -434,7 +470,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { | |||||||
|         if(!flipper_file_read_uint32(ff, "Active cycles", &u32value, 1)) break; |         if(!flipper_file_read_uint32(ff, "Active cycles", &u32value, 1)) break; | ||||||
|         animation->active_cycles = u32value; |         animation->active_cycles = u32value; | ||||||
|         if(!flipper_file_read_uint32(ff, "Frame rate", &u32value, 1)) break; |         if(!flipper_file_read_uint32(ff, "Frame rate", &u32value, 1)) break; | ||||||
|         animation->frame_rate = u32value; |         FURI_CONST_ASSIGN(animation->icon_animation.frame_rate, u32value); | ||||||
|         if(!flipper_file_read_uint32(ff, "Duration", &u32value, 1)) break; |         if(!flipper_file_read_uint32(ff, "Duration", &u32value, 1)) break; | ||||||
|         animation->duration = u32value; |         animation->duration = u32value; | ||||||
|         if(!flipper_file_read_uint32(ff, "Active cooldown", &u32value, 1)) break; |         if(!flipper_file_read_uint32(ff, "Active cooldown", &u32value, 1)) break; | ||||||
| @ -460,10 +496,10 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void animation_storage_free_bubbles(BubbleAnimation* animation) { | static void animation_storage_free_bubbles(BubbleAnimation* animation) { | ||||||
|     if(!animation->frame_bubbles) return; |     if(!animation->frame_bubble_sequences) return; | ||||||
| 
 | 
 | ||||||
|     for(int i = 0; i < animation->frame_bubbles_count;) { |     for(int i = 0; i < animation->frame_bubble_sequences_count;) { | ||||||
|         FrameBubble** bubble = &animation->frame_bubbles[i]; |         const FrameBubble* const* bubble = &animation->frame_bubble_sequences[i]; | ||||||
| 
 | 
 | ||||||
|         if((*bubble) == NULL) break; |         if((*bubble) == NULL) break; | ||||||
| 
 | 
 | ||||||
| @ -471,15 +507,15 @@ static void animation_storage_free_bubbles(BubbleAnimation* animation) { | |||||||
|             bubble = &(*bubble)->next_bubble; |             bubble = &(*bubble)->next_bubble; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if((*bubble)->bubble.str) { |         if((*bubble)->bubble.text) { | ||||||
|             free((void*)(*bubble)->bubble.str); |             free((void*)(*bubble)->bubble.text); | ||||||
|         } |         } | ||||||
|         if((*bubble) == animation->frame_bubbles[i]) { |         if((*bubble) == animation->frame_bubble_sequences[i]) { | ||||||
|             ++i; |             ++i; | ||||||
|         } |         } | ||||||
|         free(*bubble); |         free((void*)*bubble); | ||||||
|         *bubble = NULL; |         FURI_CONST_ASSIGN_PTR(*bubble, NULL); | ||||||
|     } |     } | ||||||
|     free(animation->frame_bubbles); |     free((void*)animation->frame_bubble_sequences); | ||||||
|     animation->frame_bubbles = NULL; |     animation->frame_bubble_sequences = NULL; | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,15 +4,6 @@ | |||||||
| #include "views/bubble_animation_view.h" | #include "views/bubble_animation_view.h" | ||||||
| #include <m-string.h> | #include <m-string.h> | ||||||
| 
 | 
 | ||||||
| #define HARDCODED_ANIMATION_NAME "tv" |  | ||||||
| #define NO_SD_ANIMATION_NAME "no_sd" |  | ||||||
| #define BAD_BATTERY_ANIMATION_NAME "bad_battery" |  | ||||||
| #define NO_DB_ANIMATION_NAME "no_db" |  | ||||||
| #define BAD_SD_ANIMATION_NAME "bad_sd" |  | ||||||
| #define SD_OK_ANIMATION_NAME "sd_ok" |  | ||||||
| #define URL_ANIMATION_NAME "url" |  | ||||||
| #define LEVELUP_ANIMATION_NAME "level" |  | ||||||
| 
 |  | ||||||
| /** Main structure to handle animation data.
 | /** Main structure to handle animation data.
 | ||||||
|  * Contains all, including animation playing data (BubbleAnimation), |  * Contains all, including animation playing data (BubbleAnimation), | ||||||
|  * data for random animation selection (StorageAnimationMeta) and |  * data for random animation selection (StorageAnimationMeta) and | ||||||
| @ -20,13 +11,13 @@ | |||||||
| typedef struct StorageAnimation StorageAnimation; | typedef struct StorageAnimation StorageAnimation; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     string_t name; |     const char* name; | ||||||
|     uint8_t min_butthurt; |     uint8_t min_butthurt; | ||||||
|     uint8_t max_butthurt; |     uint8_t max_butthurt; | ||||||
|     uint8_t min_level; |     uint8_t min_level; | ||||||
|     uint8_t max_level; |     uint8_t max_level; | ||||||
|     uint8_t weight; |     uint8_t weight; | ||||||
| } StorageAnimationMeta; | } StorageAnimationManifestInfo; | ||||||
| 
 | 
 | ||||||
| /** Container to return available animations list */ | /** Container to return available animations list */ | ||||||
| LIST_DEF(StorageAnimationList, StorageAnimation*, M_PTR_OPLIST) | LIST_DEF(StorageAnimationList, StorageAnimation*, M_PTR_OPLIST) | ||||||
| @ -81,7 +72,7 @@ StorageAnimation* animation_storage_find_animation(const char* name); | |||||||
|  * @storage_animation       item of whom we have to extract meta. |  * @storage_animation       item of whom we have to extract meta. | ||||||
|  * @return                  meta itself |  * @return                  meta itself | ||||||
|  */ |  */ | ||||||
| StorageAnimationMeta* animation_storage_get_meta(StorageAnimation* storage_animation); | StorageAnimationManifestInfo* animation_storage_get_meta(StorageAnimation* storage_animation); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Free storage_animation, which previously acquired |  * Free storage_animation, which previously acquired | ||||||
|  | |||||||
| @ -1,195 +1,9 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include "animation_storage.h" | #include "animation_storage.h" | ||||||
| #include "assets_icons.h" |  | ||||||
| #include "animation_manager.h" | #include "animation_manager.h" | ||||||
| #include "gui/canvas.h" |  | ||||||
| 
 | 
 | ||||||
| struct StorageAnimation { | struct StorageAnimation { | ||||||
|     const BubbleAnimation* animation; |     const BubbleAnimation* animation; | ||||||
|     bool external; |     bool external; | ||||||
|     StorageAnimationMeta meta; |     StorageAnimationManifestInfo manifest_info; | ||||||
| }; | }; | ||||||
| 
 |  | ||||||
| // Hard-coded, always available idle animation
 |  | ||||||
| FrameBubble tv_bubble1 = { |  | ||||||
|     .bubble = |  | ||||||
|         {.x = 1, |  | ||||||
|          .y = 23, |  | ||||||
|          .str = "Take the red pill", |  | ||||||
|          .horizontal = AlignRight, |  | ||||||
|          .vertical = AlignBottom}, |  | ||||||
|     .starts_at_frame = 7, |  | ||||||
|     .ends_at_frame = 9, |  | ||||||
|     .next_bubble = NULL, |  | ||||||
| }; |  | ||||||
| FrameBubble tv_bubble2 = { |  | ||||||
|     .bubble = |  | ||||||
|         {.x = 1, |  | ||||||
|          .y = 23, |  | ||||||
|          .str = "I can joke better", |  | ||||||
|          .horizontal = AlignRight, |  | ||||||
|          .vertical = AlignBottom}, |  | ||||||
|     .starts_at_frame = 7, |  | ||||||
|     .ends_at_frame = 9, |  | ||||||
|     .next_bubble = NULL, |  | ||||||
| }; |  | ||||||
| FrameBubble* tv_bubbles[] = {&tv_bubble1, &tv_bubble2}; |  | ||||||
| const Icon* tv_icons[] = { |  | ||||||
|     &I_tv1, |  | ||||||
|     &I_tv2, |  | ||||||
|     &I_tv3, |  | ||||||
|     &I_tv4, |  | ||||||
|     &I_tv5, |  | ||||||
|     &I_tv6, |  | ||||||
|     &I_tv7, |  | ||||||
|     &I_tv8, |  | ||||||
| }; |  | ||||||
| const BubbleAnimation tv_bubble_animation = { |  | ||||||
|     .icons = tv_icons, |  | ||||||
|     .frame_bubbles = tv_bubbles, |  | ||||||
|     .frame_bubbles_count = COUNT_OF(tv_bubbles), |  | ||||||
|     .passive_frames = 6, |  | ||||||
|     .active_frames = 2, |  | ||||||
|     .active_cycles = 2, |  | ||||||
|     .frame_rate = 2, |  | ||||||
|     .duration = 3600, |  | ||||||
|     .active_cooldown = 5, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // System animation - no SD card
 |  | ||||||
| const Icon* no_sd_icons[] = { |  | ||||||
|     &I_no_sd1, |  | ||||||
|     &I_no_sd2, |  | ||||||
|     &I_no_sd1, |  | ||||||
|     &I_no_sd2, |  | ||||||
|     &I_no_sd1, |  | ||||||
|     &I_no_sd3, |  | ||||||
|     &I_no_sd4, |  | ||||||
|     &I_no_sd5, |  | ||||||
|     &I_no_sd4, |  | ||||||
|     &I_no_sd6, |  | ||||||
| }; |  | ||||||
| FrameBubble no_sd_bubble = { |  | ||||||
|     .bubble = |  | ||||||
|         {.x = 40, |  | ||||||
|          .y = 18, |  | ||||||
|          .str = "Need an\nSD card", |  | ||||||
|          .horizontal = AlignRight, |  | ||||||
|          .vertical = AlignBottom}, |  | ||||||
|     .starts_at_frame = 0, |  | ||||||
|     .ends_at_frame = 9, |  | ||||||
|     .next_bubble = NULL, |  | ||||||
| }; |  | ||||||
| FrameBubble* no_sd_bubbles[] = {&no_sd_bubble}; |  | ||||||
| const BubbleAnimation no_sd_bubble_animation = { |  | ||||||
|     .icons = no_sd_icons, |  | ||||||
|     .frame_bubbles = no_sd_bubbles, |  | ||||||
|     .frame_bubbles_count = COUNT_OF(no_sd_bubbles), |  | ||||||
|     .passive_frames = 10, |  | ||||||
|     .active_frames = 0, |  | ||||||
|     .frame_rate = 2, |  | ||||||
|     .duration = 3600, |  | ||||||
|     .active_cooldown = 0, |  | ||||||
|     .active_cycles = 0, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // BLOCKING ANIMATION - no_db, bad_sd, sd_ok, url
 |  | ||||||
| const Icon* no_db_icons[] = { |  | ||||||
|     &I_no_databases1, |  | ||||||
|     &I_no_databases2, |  | ||||||
|     &I_no_databases3, |  | ||||||
|     &I_no_databases4, |  | ||||||
| }; |  | ||||||
| const BubbleAnimation no_db_bubble_animation = { |  | ||||||
|     .icons = no_db_icons, |  | ||||||
|     .passive_frames = COUNT_OF(no_db_icons), |  | ||||||
|     .frame_rate = 2, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const Icon* bad_sd_icons[] = { |  | ||||||
|     &I_card_bad1, |  | ||||||
|     &I_card_bad2, |  | ||||||
| }; |  | ||||||
| const BubbleAnimation bad_sd_bubble_animation = { |  | ||||||
|     .icons = bad_sd_icons, |  | ||||||
|     .passive_frames = COUNT_OF(bad_sd_icons), |  | ||||||
|     .frame_rate = 2, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const Icon* url_icons[] = { |  | ||||||
|     &I_url1, |  | ||||||
|     &I_url2, |  | ||||||
|     &I_url3, |  | ||||||
|     &I_url4, |  | ||||||
| }; |  | ||||||
| const BubbleAnimation url_bubble_animation = { |  | ||||||
|     .icons = url_icons, |  | ||||||
|     .passive_frames = COUNT_OF(url_icons), |  | ||||||
|     .frame_rate = 2, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const Icon* sd_ok_icons[] = { |  | ||||||
|     &I_card_ok1, |  | ||||||
|     &I_card_ok2, |  | ||||||
|     &I_card_ok3, |  | ||||||
|     &I_card_ok4, |  | ||||||
| }; |  | ||||||
| const BubbleAnimation sd_ok_bubble_animation = { |  | ||||||
|     .icons = sd_ok_icons, |  | ||||||
|     .passive_frames = COUNT_OF(sd_ok_icons), |  | ||||||
|     .frame_rate = 2, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static StorageAnimation StorageAnimationInternal[] = { |  | ||||||
|     {.animation = &tv_bubble_animation, |  | ||||||
|      .external = false, |  | ||||||
|      .meta = |  | ||||||
|          { |  | ||||||
|              .min_butthurt = 0, |  | ||||||
|              .max_butthurt = 11, |  | ||||||
|              .min_level = 1, |  | ||||||
|              .max_level = 3, |  | ||||||
|              .weight = 3, |  | ||||||
|          }}, |  | ||||||
|     {.animation = &no_sd_bubble_animation, |  | ||||||
|      .external = false, |  | ||||||
|      .meta = |  | ||||||
|          { |  | ||||||
|              .min_butthurt = 0, |  | ||||||
|              .max_butthurt = 14, |  | ||||||
|              .min_level = 1, |  | ||||||
|              .max_level = 3, |  | ||||||
|              .weight = 6, |  | ||||||
|          }}, |  | ||||||
|     { |  | ||||||
|         .animation = &no_db_bubble_animation, |  | ||||||
|         .external = false, |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         .animation = &bad_sd_bubble_animation, |  | ||||||
|         .external = false, |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         .animation = &sd_ok_bubble_animation, |  | ||||||
|         .external = false, |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         .animation = &url_bubble_animation, |  | ||||||
|         .external = false, |  | ||||||
|     }, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void animation_storage_initialize_internal_animations(void) { |  | ||||||
|     /* not in constructor - no memory pool yet */ |  | ||||||
|     /* called in 1 thread - no need in double check */ |  | ||||||
|     static bool initialized = false; |  | ||||||
|     if(!initialized) { |  | ||||||
|         initialized = true; |  | ||||||
|         string_init_set_str(StorageAnimationInternal[0].meta.name, HARDCODED_ANIMATION_NAME); |  | ||||||
|         string_init_set_str(StorageAnimationInternal[1].meta.name, NO_SD_ANIMATION_NAME); |  | ||||||
|         string_init_set_str(StorageAnimationInternal[2].meta.name, NO_DB_ANIMATION_NAME); |  | ||||||
|         string_init_set_str(StorageAnimationInternal[3].meta.name, BAD_SD_ANIMATION_NAME); |  | ||||||
|         string_init_set_str(StorageAnimationInternal[4].meta.name, SD_OK_ANIMATION_NAME); |  | ||||||
|         string_init_set_str(StorageAnimationInternal[5].meta.name, URL_ANIMATION_NAME); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -1,23 +1,19 @@ | |||||||
| 
 | 
 | ||||||
| #include "cmsis_os2.h" |  | ||||||
| #include "../animation_manager.h" | #include "../animation_manager.h" | ||||||
| #include "../animation_storage.h" | #include "../animation_storage.h" | ||||||
| #include "furi_hal_delay.h" | #include "bubble_animation_view.h" | ||||||
| #include "furi_hal_resources.h" | 
 | ||||||
| #include "furi/check.h" | #include <furi_hal.h> | ||||||
| #include "furi/memmgr.h" |  | ||||||
| #include "gui/canvas.h" |  | ||||||
| #include "gui/elements.h" |  | ||||||
| #include "gui/view.h" |  | ||||||
| #include "input/input.h" |  | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include "portmacro.h" | #include <gui/canvas.h> | ||||||
| #include <gui/icon.h> | #include <gui/elements.h> | ||||||
|  | #include <gui/view.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
|  | #include <input/input.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <FreeRTOS.h> | #include <FreeRTOS.h> | ||||||
| #include <timers.h> | #include <timers.h> | ||||||
| #include "bubble_animation_view.h" | #include <furi/dangerous_defines.h> | ||||||
| #include <gui/icon_i.h> |  | ||||||
| 
 | 
 | ||||||
| #define ACTIVE_SHIFT 2 | #define ACTIVE_SHIFT 2 | ||||||
| 
 | 
 | ||||||
| @ -43,7 +39,7 @@ struct BubbleAnimationView { | |||||||
| static void bubble_animation_activate(BubbleAnimationView* view, bool force); | static void bubble_animation_activate(BubbleAnimationView* view, bool force); | ||||||
| static void bubble_animation_activate_right_now(BubbleAnimationView* view); | static void bubble_animation_activate_right_now(BubbleAnimationView* view); | ||||||
| 
 | 
 | ||||||
| static uint8_t bubble_animation_get_icon_index(BubbleAnimationViewModel* model) { | static uint8_t bubble_animation_get_frame_index(BubbleAnimationViewModel* model) { | ||||||
|     furi_assert(model); |     furi_assert(model); | ||||||
|     uint8_t icon_index = 0; |     uint8_t icon_index = 0; | ||||||
|     const BubbleAnimation* animation = model->current; |     const BubbleAnimation* animation = model->current; | ||||||
| @ -57,7 +53,7 @@ static uint8_t bubble_animation_get_icon_index(BubbleAnimationViewModel* model) | |||||||
|     } |     } | ||||||
|     furi_assert(icon_index < (animation->passive_frames + animation->active_frames)); |     furi_assert(icon_index < (animation->passive_frames + animation->active_frames)); | ||||||
| 
 | 
 | ||||||
|     return icon_index; |     return animation->frame_order[icon_index]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void bubble_animation_draw_callback(Canvas* canvas, void* model_) { | static void bubble_animation_draw_callback(Canvas* canvas, void* model_) { | ||||||
| @ -79,23 +75,26 @@ static void bubble_animation_draw_callback(Canvas* canvas, void* model_) { | |||||||
| 
 | 
 | ||||||
|     furi_assert(model->current_frame < 255); |     furi_assert(model->current_frame < 255); | ||||||
| 
 | 
 | ||||||
|     const Icon* icon = animation->icons[bubble_animation_get_icon_index(model)]; |     uint8_t index = bubble_animation_get_frame_index(model); | ||||||
|     furi_assert(icon); |     uint8_t width = icon_get_width(&animation->icon_animation); | ||||||
|     uint8_t y_offset = canvas_height(canvas) - icon_get_height(icon); |     uint8_t height = icon_get_height(&animation->icon_animation); | ||||||
|     canvas_draw_icon(canvas, 0, y_offset, icon); |     uint8_t y_offset = canvas_height(canvas) - height; | ||||||
|  |     canvas_draw_bitmap( | ||||||
|  |         canvas, 0, y_offset, width, height, animation->icon_animation.frames[index]); | ||||||
| 
 | 
 | ||||||
|     const FrameBubble* bubble = model->current_bubble; |     const FrameBubble* bubble = model->current_bubble; | ||||||
|     if(bubble) { |     if(bubble) { | ||||||
|         if((model->current_frame >= bubble->starts_at_frame) && |         if((model->current_frame >= bubble->start_frame) && | ||||||
|            (model->current_frame <= bubble->ends_at_frame)) { |            (model->current_frame <= bubble->end_frame)) { | ||||||
|             const Bubble* b = &bubble->bubble; |             const Bubble* b = &bubble->bubble; | ||||||
|             elements_bubble_str(canvas, b->x, b->y, b->str, b->horizontal, b->vertical); |             elements_bubble_str(canvas, b->x, b->y, b->text, b->align_h, b->align_v); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static FrameBubble* bubble_animation_pick_bubble(BubbleAnimationViewModel* model, bool active) { | static const FrameBubble* | ||||||
|     FrameBubble* bubble = NULL; |     bubble_animation_pick_bubble(BubbleAnimationViewModel* model, bool active) { | ||||||
|  |     const FrameBubble* bubble = NULL; | ||||||
| 
 | 
 | ||||||
|     if((model->active_bubbles == 0) && (model->passive_bubbles == 0)) { |     if((model->active_bubbles == 0) && (model->passive_bubbles == 0)) { | ||||||
|         return NULL; |         return NULL; | ||||||
| @ -104,10 +103,11 @@ static FrameBubble* bubble_animation_pick_bubble(BubbleAnimationViewModel* model | |||||||
|     uint8_t index = random() % (active ? model->active_bubbles : model->passive_bubbles); |     uint8_t index = random() % (active ? model->active_bubbles : model->passive_bubbles); | ||||||
|     const BubbleAnimation* animation = model->current; |     const BubbleAnimation* animation = model->current; | ||||||
| 
 | 
 | ||||||
|     for(int i = 0; i < animation->frame_bubbles_count; ++i) { |     for(int i = 0; i < animation->frame_bubble_sequences_count; ++i) { | ||||||
|         if((animation->frame_bubbles[i]->starts_at_frame < animation->passive_frames) ^ active) { |         if((animation->frame_bubble_sequences[i]->start_frame < animation->passive_frames) ^ | ||||||
|  |            active) { | ||||||
|             if(!index) { |             if(!index) { | ||||||
|                 bubble = animation->frame_bubbles[i]; |                 bubble = animation->frame_bubble_sequences[i]; | ||||||
|             } |             } | ||||||
|             --index; |             --index; | ||||||
|         } |         } | ||||||
| @ -135,10 +135,6 @@ static bool bubble_animation_input_callback(InputEvent* event, void* context) { | |||||||
|                 animation_view->interact_callback(animation_view->interact_callback_context); |                 animation_view->interact_callback(animation_view->interact_callback_context); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } else if(event->key == InputKeyBack) { |  | ||||||
|         /* Prevent back button to fall down to common handler - leaving
 |  | ||||||
|          * application, so consume */ |  | ||||||
|         consumed = true; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return consumed; |     return consumed; | ||||||
| @ -190,7 +186,7 @@ static void bubble_animation_activate_right_now(BubbleAnimationView* view) { | |||||||
|     if(model->current && (model->current->active_frames > 0) && (!model->freeze_frame)) { |     if(model->current && (model->current->active_frames > 0) && (!model->freeze_frame)) { | ||||||
|         model->current_frame = model->current->passive_frames; |         model->current_frame = model->current->passive_frames; | ||||||
|         model->current_bubble = bubble_animation_pick_bubble(model, true); |         model->current_bubble = bubble_animation_pick_bubble(model, true); | ||||||
|         frame_rate = model->current->frame_rate; |         frame_rate = model->current->icon_animation.frame_rate; | ||||||
|     } |     } | ||||||
|     view_commit_model(view->view, true); |     view_commit_model(view->view, true); | ||||||
| 
 | 
 | ||||||
| @ -222,7 +218,7 @@ static void bubble_animation_next_frame(BubbleAnimationViewModel* model) { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(model->current_bubble) { |         if(model->current_bubble) { | ||||||
|             if(model->current_frame > model->current_bubble->ends_at_frame) { |             if(model->current_frame > model->current_bubble->end_frame) { | ||||||
|                 model->current_bubble = model->current_bubble->next_bubble; |                 model->current_bubble = model->current_bubble->next_bubble; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -251,7 +247,11 @@ static void bubble_animation_timer_callback(void* context) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Icon* bubble_animation_clone_frame(const Icon* icon_orig) { | /* always freeze first passive frame, because
 | ||||||
|  |  * animation is always activated at unfreezing and played | ||||||
|  |  * passive frame first, and 2 frames after - active | ||||||
|  |  */ | ||||||
|  | static Icon* bubble_animation_clone_first_frame(const Icon* icon_orig) { | ||||||
|     furi_assert(icon_orig); |     furi_assert(icon_orig); | ||||||
|     furi_assert(icon_orig->frames); |     furi_assert(icon_orig->frames); | ||||||
|     furi_assert(icon_orig->frames[0]); |     furi_assert(icon_orig->frames[0]); | ||||||
| @ -268,6 +268,7 @@ static Icon* bubble_animation_clone_frame(const Icon* icon_orig) { | |||||||
|     size_t max_bitmap_size = ROUND_UP_TO(icon_orig->width, 8) * icon_orig->height + 1; |     size_t max_bitmap_size = ROUND_UP_TO(icon_orig->width, 8) * icon_orig->height + 1; | ||||||
|     icon_clone->frames[0] = furi_alloc(max_bitmap_size); |     icon_clone->frames[0] = furi_alloc(max_bitmap_size); | ||||||
|     memcpy((void*)icon_clone->frames[0], icon_orig->frames[0], max_bitmap_size); |     memcpy((void*)icon_clone->frames[0], icon_orig->frames[0], max_bitmap_size); | ||||||
|  |     FURI_CONST_ASSIGN(icon_clone->frame_count, 1); | ||||||
| 
 | 
 | ||||||
|     return icon_clone; |     return icon_clone; | ||||||
| } | } | ||||||
| @ -288,7 +289,7 @@ static void bubble_animation_enter(void* context) { | |||||||
|     bubble_animation_activate(view, false); |     bubble_animation_activate(view, false); | ||||||
| 
 | 
 | ||||||
|     BubbleAnimationViewModel* model = view_get_model(view->view); |     BubbleAnimationViewModel* model = view_get_model(view->view); | ||||||
|     uint8_t frame_rate = model->current->frame_rate; |     uint8_t frame_rate = model->current->icon_animation.frame_rate; | ||||||
|     view_commit_model(view->view, false); |     view_commit_model(view->view, false); | ||||||
| 
 | 
 | ||||||
|     if(frame_rate) { |     if(frame_rate) { | ||||||
| @ -353,8 +354,8 @@ void bubble_animation_view_set_animation( | |||||||
|     model->active_ended_at = xTaskGetTickCount() - (model->current->active_cooldown * 1000); |     model->active_ended_at = xTaskGetTickCount() - (model->current->active_cooldown * 1000); | ||||||
|     model->active_bubbles = 0; |     model->active_bubbles = 0; | ||||||
|     model->passive_bubbles = 0; |     model->passive_bubbles = 0; | ||||||
|     for(int i = 0; i < new_animation->frame_bubbles_count; ++i) { |     for(int i = 0; i < new_animation->frame_bubble_sequences_count; ++i) { | ||||||
|         if(new_animation->frame_bubbles[i]->starts_at_frame < new_animation->passive_frames) { |         if(new_animation->frame_bubble_sequences[i]->start_frame < new_animation->passive_frames) { | ||||||
|             ++model->passive_bubbles; |             ++model->passive_bubbles; | ||||||
|         } else { |         } else { | ||||||
|             ++model->active_bubbles; |             ++model->active_bubbles; | ||||||
| @ -367,7 +368,7 @@ void bubble_animation_view_set_animation( | |||||||
|     model->active_cycle = 0; |     model->active_cycle = 0; | ||||||
|     view_commit_model(view->view, true); |     view_commit_model(view->view, true); | ||||||
| 
 | 
 | ||||||
|     osTimerStart(view->timer, 1000 / new_animation->frame_rate); |     osTimerStart(view->timer, 1000 / new_animation->icon_animation.frame_rate); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void bubble_animation_freeze(BubbleAnimationView* view) { | void bubble_animation_freeze(BubbleAnimationView* view) { | ||||||
| @ -376,12 +377,7 @@ void bubble_animation_freeze(BubbleAnimationView* view) { | |||||||
|     BubbleAnimationViewModel* model = view_get_model(view->view); |     BubbleAnimationViewModel* model = view_get_model(view->view); | ||||||
|     furi_assert(model->current); |     furi_assert(model->current); | ||||||
|     furi_assert(!model->freeze_frame); |     furi_assert(!model->freeze_frame); | ||||||
|     /* always freeze first passive frame, because
 |     model->freeze_frame = bubble_animation_clone_first_frame(&model->current->icon_animation); | ||||||
|      * animation is always activated at unfreezing and played |  | ||||||
|      * passive frame first, and 2 frames after - active |  | ||||||
|      */ |  | ||||||
|     uint8_t icon_index = 0; |  | ||||||
|     model->freeze_frame = bubble_animation_clone_frame(model->current->icons[icon_index]); |  | ||||||
|     model->current = NULL; |     model->current = NULL; | ||||||
|     view_commit_model(view->view, false); |     view_commit_model(view->view, false); | ||||||
|     osTimerStop(view->timer); |     osTimerStop(view->timer); | ||||||
| @ -395,8 +391,7 @@ void bubble_animation_unfreeze(BubbleAnimationView* view) { | |||||||
|     furi_assert(model->freeze_frame); |     furi_assert(model->freeze_frame); | ||||||
|     bubble_animation_release_frame(&model->freeze_frame); |     bubble_animation_release_frame(&model->freeze_frame); | ||||||
|     furi_assert(model->current); |     furi_assert(model->current); | ||||||
|     furi_assert(model->current->icons); |     frame_rate = model->current->icon_animation.frame_rate; | ||||||
|     frame_rate = model->current->frame_rate; |  | ||||||
|     view_commit_model(view->view, true); |     view_commit_model(view->view, true); | ||||||
| 
 | 
 | ||||||
|     osTimerStart(view->timer, 1000 / frame_rate); |     osTimerStart(view->timer, 1000 / frame_rate); | ||||||
|  | |||||||
							
								
								
									
										130
									
								
								applications/desktop/animations/views/one_shot_animation_view.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								applications/desktop/animations/views/one_shot_animation_view.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,130 @@ | |||||||
|  | 
 | ||||||
|  | #include "one_shot_animation_view.h" | ||||||
|  | #include <furi.h> | ||||||
|  | #include <portmacro.h> | ||||||
|  | #include <gui/canvas.h> | ||||||
|  | #include <gui/view.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | typedef void (*OneShotInteractCallback)(void*); | ||||||
|  | 
 | ||||||
|  | struct OneShotView { | ||||||
|  |     View* view; | ||||||
|  |     TimerHandle_t update_timer; | ||||||
|  |     OneShotInteractCallback interact_callback; | ||||||
|  |     void* interact_callback_context; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     const Icon* icon; | ||||||
|  |     uint32_t index; | ||||||
|  |     bool block_input; | ||||||
|  | } OneShotViewModel; | ||||||
|  | 
 | ||||||
|  | static void one_shot_view_update_timer_callback(TimerHandle_t xTimer) { | ||||||
|  |     OneShotView* view = (void*)pvTimerGetTimerID(xTimer); | ||||||
|  | 
 | ||||||
|  |     OneShotViewModel* model = view_get_model(view->view); | ||||||
|  |     if((model->index + 1) < model->icon->frame_count) { | ||||||
|  |         ++model->index; | ||||||
|  |     } else { | ||||||
|  |         model->block_input = false; | ||||||
|  |         model->index = model->icon->frame_count - 2; | ||||||
|  |     } | ||||||
|  |     view_commit_model(view->view, true); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void one_shot_view_draw(Canvas* canvas, void* model_) { | ||||||
|  |     furi_assert(canvas); | ||||||
|  |     furi_assert(model_); | ||||||
|  | 
 | ||||||
|  |     OneShotViewModel* model = model_; | ||||||
|  |     furi_check(model->index < model->icon->frame_count); | ||||||
|  |     uint8_t y_offset = canvas_height(canvas) - model->icon->height; | ||||||
|  |     canvas_draw_bitmap( | ||||||
|  |         canvas, | ||||||
|  |         0, | ||||||
|  |         y_offset, | ||||||
|  |         model->icon->width, | ||||||
|  |         model->icon->height, | ||||||
|  |         model->icon->frames[model->index]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool one_shot_view_input(InputEvent* event, void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     furi_assert(event); | ||||||
|  | 
 | ||||||
|  |     OneShotView* view = context; | ||||||
|  |     bool consumed = false; | ||||||
|  | 
 | ||||||
|  |     OneShotViewModel* model = view_get_model(view->view); | ||||||
|  |     consumed = model->block_input; | ||||||
|  |     view_commit_model(view->view, false); | ||||||
|  | 
 | ||||||
|  |     if(!consumed) { | ||||||
|  |         if(event->key == InputKeyRight) { | ||||||
|  |             /* Right button reserved for animation activation, so consume */ | ||||||
|  |             consumed = true; | ||||||
|  |             if(event->type == InputTypeShort) { | ||||||
|  |                 if(view->interact_callback) { | ||||||
|  |                     view->interact_callback(view->interact_callback_context); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return consumed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | OneShotView* one_shot_view_alloc(void) { | ||||||
|  |     OneShotView* view = furi_alloc(sizeof(OneShotView)); | ||||||
|  |     view->view = view_alloc(); | ||||||
|  |     view->update_timer = | ||||||
|  |         xTimerCreate("Update timer", 1000, pdTRUE, view, one_shot_view_update_timer_callback); | ||||||
|  | 
 | ||||||
|  |     view_allocate_model(view->view, ViewModelTypeLocking, sizeof(OneShotViewModel)); | ||||||
|  |     view_set_context(view->view, view); | ||||||
|  |     view_set_draw_callback(view->view, one_shot_view_draw); | ||||||
|  |     view_set_input_callback(view->view, one_shot_view_input); | ||||||
|  | 
 | ||||||
|  |     return view; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void one_shot_view_free(OneShotView* view) { | ||||||
|  |     furi_assert(view); | ||||||
|  | 
 | ||||||
|  |     xTimerDelete(view->update_timer, portMAX_DELAY); | ||||||
|  |     view_free(view->view); | ||||||
|  |     view->view = NULL; | ||||||
|  |     free(view); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void one_shot_view_set_interact_callback( | ||||||
|  |     OneShotView* view, | ||||||
|  |     OneShotInteractCallback callback, | ||||||
|  |     void* context) { | ||||||
|  |     furi_assert(view); | ||||||
|  | 
 | ||||||
|  |     view->interact_callback_context = context; | ||||||
|  |     view->interact_callback = callback; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void one_shot_view_start_animation(OneShotView* view, const Icon* icon) { | ||||||
|  |     furi_assert(view); | ||||||
|  |     furi_assert(icon); | ||||||
|  |     furi_check(icon->frame_count >= 2); | ||||||
|  | 
 | ||||||
|  |     OneShotViewModel* model = view_get_model(view->view); | ||||||
|  |     model->index = 0; | ||||||
|  |     model->icon = icon; | ||||||
|  |     model->block_input = true; | ||||||
|  |     view_commit_model(view->view, true); | ||||||
|  |     xTimerChangePeriod(view->update_timer, 1000 / model->icon->frame_rate, portMAX_DELAY); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | View* one_shot_view_get_view(OneShotView* view) { | ||||||
|  |     furi_assert(view); | ||||||
|  | 
 | ||||||
|  |     return view->view; | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <furi.h> | ||||||
|  | #include <gui/view.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | typedef void (*OneShotInteractCallback)(void*); | ||||||
|  | typedef struct OneShotView OneShotView; | ||||||
|  | 
 | ||||||
|  | OneShotView* one_shot_view_alloc(void); | ||||||
|  | void one_shot_view_free(OneShotView* view); | ||||||
|  | void one_shot_view_set_interact_callback( | ||||||
|  |     OneShotView* view, | ||||||
|  |     OneShotInteractCallback callback, | ||||||
|  |     void* context); | ||||||
|  | void one_shot_view_start_animation(OneShotView* view, const Icon* icon); | ||||||
|  | View* one_shot_view_get_view(OneShotView* view); | ||||||
| @ -1,17 +1,16 @@ | |||||||
| #include "assets_icons.h" |  | ||||||
| #include "cmsis_os2.h" |  | ||||||
| #include "desktop/desktop.h" |  | ||||||
| #include "desktop_i.h" |  | ||||||
| #include "gui/view_composed.h" |  | ||||||
| #include <dolphin/dolphin.h> |  | ||||||
| #include <furi/pubsub.h> |  | ||||||
| #include <furi/record.h> |  | ||||||
| #include "portmacro.h" |  | ||||||
| #include "storage/filesystem_api_defines.h" |  | ||||||
| #include "storage/storage.h" |  | ||||||
| #include <stdint.h> |  | ||||||
| #include <power/power_service/power.h> |  | ||||||
| #include "animations/animation_manager.h" | #include "animations/animation_manager.h" | ||||||
|  | #include "desktop/scenes/desktop_scene.h" | ||||||
|  | #include "desktop/scenes/desktop_scene_i.h" | ||||||
|  | #include "desktop/views/desktop_locked.h" | ||||||
|  | #include "desktop_i.h" | ||||||
|  | 
 | ||||||
|  | #include <storage/storage.h> | ||||||
|  | #include <assets_icons.h> | ||||||
|  | #include <gui/view_stack.h> | ||||||
|  | #include <furi.h> | ||||||
|  | #include <furi_hal.h> | ||||||
|  | #include <portmacro.h> | ||||||
|  | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| static void desktop_lock_icon_callback(Canvas* canvas, void* context) { | static void desktop_lock_icon_callback(Canvas* canvas, void* context) { | ||||||
|     furi_assert(canvas); |     furi_assert(canvas); | ||||||
| @ -50,44 +49,27 @@ Desktop* desktop_alloc() { | |||||||
|     view_dispatcher_set_navigation_event_callback( |     view_dispatcher_set_navigation_event_callback( | ||||||
|         desktop->view_dispatcher, desktop_back_event_callback); |         desktop->view_dispatcher, desktop_back_event_callback); | ||||||
| 
 | 
 | ||||||
|     desktop->dolphin_view = animation_manager_get_animation_view(desktop->animation_manager); |  | ||||||
| 
 |  | ||||||
|     desktop->main_view_composed = view_composed_alloc(); |  | ||||||
|     desktop->main_view = desktop_main_alloc(); |  | ||||||
|     view_composed_tie_views( |  | ||||||
|         desktop->main_view_composed, |  | ||||||
|         desktop->dolphin_view, |  | ||||||
|         desktop_main_get_view(desktop->main_view)); |  | ||||||
|     view_composed_top_enable(desktop->main_view_composed, true); |  | ||||||
| 
 |  | ||||||
|     desktop->locked_view_composed = view_composed_alloc(); |  | ||||||
|     desktop->locked_view = desktop_locked_alloc(); |     desktop->locked_view = desktop_locked_alloc(); | ||||||
|     view_composed_tie_views( |  | ||||||
|         desktop->locked_view_composed, |  | ||||||
|         desktop->dolphin_view, |  | ||||||
|         desktop_locked_get_view(desktop->locked_view)); |  | ||||||
|     view_composed_top_enable(desktop->locked_view_composed, true); |  | ||||||
| 
 |  | ||||||
|     desktop->lock_menu = desktop_lock_menu_alloc(); |     desktop->lock_menu = desktop_lock_menu_alloc(); | ||||||
|     desktop->debug_view = desktop_debug_alloc(); |     desktop->debug_view = desktop_debug_alloc(); | ||||||
|     desktop->first_start_view = desktop_first_start_alloc(); |     desktop->first_start_view = desktop_first_start_alloc(); | ||||||
|     desktop->hw_mismatch_popup = popup_alloc(); |     desktop->hw_mismatch_popup = popup_alloc(); | ||||||
|     desktop->code_input = code_input_alloc(); |     desktop->code_input = code_input_alloc(); | ||||||
|  |     desktop->main_view_stack = view_stack_alloc(); | ||||||
|  |     desktop->main_view = desktop_main_alloc(); | ||||||
|  |     View* dolphin_view = animation_manager_get_animation_view(desktop->animation_manager); | ||||||
|  |     view_stack_add_view(desktop->main_view_stack, desktop_main_get_view(desktop->main_view)); | ||||||
|  |     view_stack_add_view(desktop->main_view_stack, dolphin_view); | ||||||
|  |     view_stack_add_view(desktop->main_view_stack, desktop_locked_get_view(desktop->locked_view)); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_add_view( |     view_dispatcher_add_view( | ||||||
|         desktop->view_dispatcher, |         desktop->view_dispatcher, DesktopViewMain, view_stack_get_view(desktop->main_view_stack)); | ||||||
|         DesktopViewMain, |  | ||||||
|         view_composed_get_view(desktop->main_view_composed)); |  | ||||||
|     view_dispatcher_add_view( |     view_dispatcher_add_view( | ||||||
|         desktop->view_dispatcher, |         desktop->view_dispatcher, | ||||||
|         DesktopViewLockMenu, |         DesktopViewLockMenu, | ||||||
|         desktop_lock_menu_get_view(desktop->lock_menu)); |         desktop_lock_menu_get_view(desktop->lock_menu)); | ||||||
|     view_dispatcher_add_view( |     view_dispatcher_add_view( | ||||||
|         desktop->view_dispatcher, DesktopViewDebug, desktop_debug_get_view(desktop->debug_view)); |         desktop->view_dispatcher, DesktopViewDebug, desktop_debug_get_view(desktop->debug_view)); | ||||||
|     view_dispatcher_add_view( |  | ||||||
|         desktop->view_dispatcher, |  | ||||||
|         DesktopViewLocked, |  | ||||||
|         view_composed_get_view(desktop->locked_view_composed)); |  | ||||||
|     view_dispatcher_add_view( |     view_dispatcher_add_view( | ||||||
|         desktop->view_dispatcher, |         desktop->view_dispatcher, | ||||||
|         DesktopViewFirstStart, |         DesktopViewFirstStart, | ||||||
| @ -123,8 +105,8 @@ void desktop_free(Desktop* desktop) { | |||||||
|     scene_manager_free(desktop->scene_manager); |     scene_manager_free(desktop->scene_manager); | ||||||
| 
 | 
 | ||||||
|     animation_manager_free(desktop->animation_manager); |     animation_manager_free(desktop->animation_manager); | ||||||
|     view_composed_free(desktop->main_view_composed); |     view_stack_free(desktop->main_view_stack); | ||||||
|     view_composed_free(desktop->locked_view_composed); |     view_stack_free(desktop->locked_view_stack); | ||||||
|     desktop_main_free(desktop->main_view); |     desktop_main_free(desktop->main_view); | ||||||
|     desktop_lock_menu_free(desktop->lock_menu); |     desktop_lock_menu_free(desktop->lock_menu); | ||||||
|     desktop_locked_free(desktop->locked_view); |     desktop_locked_free(desktop->locked_view); | ||||||
| @ -163,15 +145,14 @@ int32_t desktop_srv(void* p) { | |||||||
|         SAVE_DESKTOP_SETTINGS(&desktop->settings); |         SAVE_DESKTOP_SETTINGS(&desktop->settings); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); |  | ||||||
| 
 |  | ||||||
|     if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { |     if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { | ||||||
|         furi_hal_usb_disable(); |         furi_hal_usb_disable(); | ||||||
|         scene_manager_set_scene_state( |         scene_manager_set_scene_state( | ||||||
|             desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); |             desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedWithPin); | ||||||
|         scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); | ||||||
|  | 
 | ||||||
|     if(desktop_is_first_start()) { |     if(desktop_is_first_start()) { | ||||||
|         scene_manager_next_scene(desktop->scene_manager, DesktopSceneFirstStart); |         scene_manager_next_scene(desktop->scene_manager, DesktopSceneFirstStart); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,31 +1,21 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "cmsis_os2.h" |  | ||||||
| #include "desktop.h" | #include "desktop.h" | ||||||
| 
 |  | ||||||
| #include "animations/animation_manager.h" | #include "animations/animation_manager.h" | ||||||
| #include "gui/view_composed.h" |  | ||||||
| #include <furi.h> |  | ||||||
| #include <furi_hal.h> |  | ||||||
| 
 |  | ||||||
| #include <gui/gui.h> |  | ||||||
| #include <gui/view_dispatcher.h> |  | ||||||
| #include <gui/modules/popup.h> |  | ||||||
| #include <gui/modules/code_input.h> |  | ||||||
| #include <gui/scene_manager.h> |  | ||||||
| #include <assets_icons.h> |  | ||||||
| #include <storage/storage.h> |  | ||||||
| #include <power/power_service/power.h> |  | ||||||
| 
 |  | ||||||
| #include "views/desktop_main.h" | #include "views/desktop_main.h" | ||||||
| #include "views/desktop_first_start.h" | #include "views/desktop_first_start.h" | ||||||
| #include "views/desktop_lock_menu.h" | #include "views/desktop_lock_menu.h" | ||||||
| #include "views/desktop_locked.h" | #include "views/desktop_locked.h" | ||||||
| #include "views/desktop_debug.h" | #include "views/desktop_debug.h" | ||||||
| 
 |  | ||||||
| #include "scenes/desktop_scene.h" |  | ||||||
| #include "desktop/desktop_settings/desktop_settings.h" | #include "desktop/desktop_settings/desktop_settings.h" | ||||||
| #include <gui/icon.h> | 
 | ||||||
|  | #include <furi.h> | ||||||
|  | #include <gui/gui.h> | ||||||
|  | #include <gui/view_stack.h> | ||||||
|  | #include <gui/view_dispatcher.h> | ||||||
|  | #include <gui/modules/popup.h> | ||||||
|  | #include <gui/modules/code_input.h> | ||||||
|  | #include <gui/scene_manager.h> | ||||||
| 
 | 
 | ||||||
| #define STATUS_BAR_Y_SHIFT 13 | #define STATUS_BAR_Y_SHIFT 13 | ||||||
| 
 | 
 | ||||||
| @ -54,12 +44,11 @@ struct Desktop { | |||||||
|     DesktopDebugView* debug_view; |     DesktopDebugView* debug_view; | ||||||
|     CodeInput* code_input; |     CodeInput* code_input; | ||||||
| 
 | 
 | ||||||
|     View* dolphin_view; |  | ||||||
|     DesktopMainView* main_view; |     DesktopMainView* main_view; | ||||||
|     DesktopLockedView* locked_view; |     DesktopLockedView* locked_view; | ||||||
| 
 | 
 | ||||||
|     ViewComposed* main_view_composed; |     ViewStack* main_view_stack; | ||||||
|     ViewComposed* locked_view_composed; |     ViewStack* locked_view_stack; | ||||||
| 
 | 
 | ||||||
|     DesktopSettings settings; |     DesktopSettings settings; | ||||||
|     PinCode pincode_buffer; |     PinCode pincode_buffer; | ||||||
| @ -69,8 +58,6 @@ struct Desktop { | |||||||
|     AnimationManager* animation_manager; |     AnimationManager* animation_manager; | ||||||
|     osSemaphoreId_t unload_animation_semaphore; |     osSemaphoreId_t unload_animation_semaphore; | ||||||
|     FuriPubSubSubscription* app_start_stop_subscription; |     FuriPubSubSubscription* app_start_stop_subscription; | ||||||
| 
 |  | ||||||
|     char* text_buffer; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| Desktop* desktop_alloc(); | Desktop* desktop_alloc(); | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| #include "desktop_settings_app.h" | #include "desktop_settings_app.h" | ||||||
|  | #include <furi.h> | ||||||
|  | #include "scenes/desktop_settings_scene.h" | ||||||
| 
 | 
 | ||||||
| static bool desktop_settings_custom_event_callback(void* context, uint32_t event) { | static bool desktop_settings_custom_event_callback(void* context, uint32_t event) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|  | |||||||
| @ -1,8 +1,6 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <furi.h> |  | ||||||
| #include <gui/gui.h> | #include <gui/gui.h> | ||||||
| #include <gui/view.h> |  | ||||||
| #include <gui/view_dispatcher.h> | #include <gui/view_dispatcher.h> | ||||||
| #include <gui/scene_manager.h> | #include <gui/scene_manager.h> | ||||||
| #include <gui/modules/submenu.h> | #include <gui/modules/submenu.h> | ||||||
| @ -10,8 +8,6 @@ | |||||||
| 
 | 
 | ||||||
| #include "desktop_settings.h" | #include "desktop_settings.h" | ||||||
| 
 | 
 | ||||||
| #include "scenes/desktop_settings_scene.h" |  | ||||||
| 
 |  | ||||||
| typedef enum { | typedef enum { | ||||||
|     CodeEventsSetPin, |     CodeEventsSetPin, | ||||||
|     CodeEventsChangePin, |     CodeEventsChangePin, | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #include "../desktop_settings_app.h" | #include "../desktop_settings_app.h" | ||||||
| #include "applications.h" | #include "applications.h" | ||||||
| #include "desktop/desktop_settings/desktop_settings.h" | #include "desktop_settings_scene.h" | ||||||
| 
 | 
 | ||||||
| static void desktop_settings_scene_favorite_submenu_callback(void* context, uint32_t index) { | static void desktop_settings_scene_favorite_submenu_callback(void* context, uint32_t index) { | ||||||
|     DesktopSettingsApp* app = context; |     DesktopSettingsApp* app = context; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| #include "../desktop_settings_app.h" | #include "../desktop_settings_app.h" | ||||||
| #include "desktop/desktop_settings/desktop_settings.h" | #include "desktop_settings_scene.h" | ||||||
| 
 | 
 | ||||||
| #define SCENE_EXIT_EVENT (0U) | #define SCENE_EXIT_EVENT (0U) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../desktop_settings_app.h" | #include "../desktop_settings_app.h" | ||||||
| #include "applications.h" | #include "applications.h" | ||||||
|  | #include "desktop_settings_scene.h" | ||||||
| 
 | 
 | ||||||
| static void desktop_settings_scene_pincode_menu_submenu_callback(void* context, uint32_t index) { | static void desktop_settings_scene_pincode_menu_submenu_callback(void* context, uint32_t index) { | ||||||
|     DesktopSettingsApp* app = context; |     DesktopSettingsApp* app = context; | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										1
									
								
								applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -1,5 +1,6 @@ | |||||||
| #include "../desktop_settings_app.h" | #include "../desktop_settings_app.h" | ||||||
| #include "applications.h" | #include "applications.h" | ||||||
|  | #include "desktop_settings_scene.h" | ||||||
| 
 | 
 | ||||||
| enum DesktopSettingsStartSubmenuIndex { | enum DesktopSettingsStartSubmenuIndex { | ||||||
|     DesktopSettingsStartSubmenuIndexFavorite, |     DesktopSettingsStartSubmenuIndexFavorite, | ||||||
|  | |||||||
| @ -1,6 +1,5 @@ | |||||||
| ADD_SCENE(desktop, main, Main) | ADD_SCENE(desktop, main, Main) | ||||||
| ADD_SCENE(desktop, lock_menu, LockMenu) | ADD_SCENE(desktop, lock_menu, LockMenu) | ||||||
| ADD_SCENE(desktop, locked, Locked) |  | ||||||
| ADD_SCENE(desktop, debug, Debug) | ADD_SCENE(desktop, debug, Debug) | ||||||
| ADD_SCENE(desktop, first_start, FirstStart) | ADD_SCENE(desktop, first_start, FirstStart) | ||||||
| ADD_SCENE(desktop, hw_mismatch, HwMismatch) | ADD_SCENE(desktop, hw_mismatch, HwMismatch) | ||||||
|  | |||||||
| @ -1,8 +1,11 @@ | |||||||
| #include "../desktop_i.h" | 
 | ||||||
| #include "../views/desktop_debug.h" |  | ||||||
| #include <dolphin/dolphin.h> | #include <dolphin/dolphin.h> | ||||||
| #include <dolphin/helpers/dolphin_deed.h> | #include <dolphin/helpers/dolphin_deed.h> | ||||||
| 
 | 
 | ||||||
|  | #include "../desktop_i.h" | ||||||
|  | #include "../views/desktop_debug.h" | ||||||
|  | #include "desktop_scene.h" | ||||||
|  | 
 | ||||||
| void desktop_scene_debug_callback(DesktopEvent event, void* context) { | void desktop_scene_debug_callback(DesktopEvent event, void* context) { | ||||||
|     Desktop* desktop = (Desktop*)context; |     Desktop* desktop = (Desktop*)context; | ||||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); |     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); | ||||||
| @ -31,13 +34,13 @@ bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) { | |||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case DesktopDebugEventDeed: |         case DesktopDebugEventDeed: | ||||||
|             dolphin_deed(dolphin, DolphinDeedIButtonEmulate); |             dolphin_deed(dolphin, DolphinDeedIbuttonEmulate); | ||||||
|             desktop_debug_get_dolphin_data(desktop->debug_view); |             desktop_debug_get_dolphin_data(desktop->debug_view); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case DesktopDebugEventWrongDeed: |         case DesktopDebugEventWrongDeed: | ||||||
|             dolphin_deed(dolphin, DolphinDeedWrong); |             dolphin_deed(dolphin, DolphinDeedIbuttonRead); | ||||||
|             desktop_debug_get_dolphin_data(desktop->debug_view); |             desktop_debug_get_dolphin_data(desktop->debug_view); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | #include <furi_hal.h> | ||||||
|  | 
 | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| 
 | 
 | ||||||
| #define DesktopFaultEventExit 0x00FF00FF | #define DesktopFaultEventExit 0x00FF00FF | ||||||
|  | |||||||
| @ -1,3 +1,6 @@ | |||||||
|  | #include <power/power_service/power.h> | ||||||
|  | #include <storage/storage.h> | ||||||
|  | 
 | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "../views/desktop_first_start.h" | #include "../views/desktop_first_start.h" | ||||||
| #include "../views/desktop_events.h" | #include "../views/desktop_events.h" | ||||||
|  | |||||||
| @ -1,6 +1,9 @@ | |||||||
| #include "../desktop_i.h" | #include <gui/scene_manager.h> | ||||||
| #include <furi_hal_version.h> | #include <furi_hal_version.h> | ||||||
| 
 | 
 | ||||||
|  | #include "desktop_scene.h" | ||||||
|  | #include "../desktop_i.h" | ||||||
|  | 
 | ||||||
| #define HW_MISMATCH_BACK_EVENT (0UL) | #define HW_MISMATCH_BACK_EVENT (0UL) | ||||||
| 
 | 
 | ||||||
| void desktop_scene_hw_mismatch_callback(void* context) { | void desktop_scene_hw_mismatch_callback(void* context) { | ||||||
| @ -11,11 +14,14 @@ void desktop_scene_hw_mismatch_callback(void* context) { | |||||||
| void desktop_scene_hw_mismatch_on_enter(void* context) { | void desktop_scene_hw_mismatch_on_enter(void* context) { | ||||||
|     Desktop* desktop = (Desktop*)context; |     Desktop* desktop = (Desktop*)context; | ||||||
|     furi_assert(desktop); |     furi_assert(desktop); | ||||||
|     furi_assert(!desktop->text_buffer); |  | ||||||
|     Popup* popup = desktop->hw_mismatch_popup; |     Popup* popup = desktop->hw_mismatch_popup; | ||||||
|     desktop->text_buffer = furi_alloc(256); | 
 | ||||||
|  |     char* text_buffer = furi_alloc(256); | ||||||
|  |     scene_manager_set_scene_state( | ||||||
|  |         desktop->scene_manager, DesktopSceneHwMismatch, (uint32_t)text_buffer); | ||||||
|  | 
 | ||||||
|     snprintf( |     snprintf( | ||||||
|         desktop->text_buffer, |         text_buffer, | ||||||
|         256, |         256, | ||||||
|         "HW target: %d\nFW target: %d", |         "HW target: %d\nFW target: %d", | ||||||
|         furi_hal_version_get_hw_target(), |         furi_hal_version_get_hw_target(), | ||||||
| @ -23,8 +29,7 @@ void desktop_scene_hw_mismatch_on_enter(void* context) { | |||||||
|     popup_set_context(popup, desktop); |     popup_set_context(popup, desktop); | ||||||
|     popup_set_header( |     popup_set_header( | ||||||
|         popup, "!!!! HW Mismatch !!!!", 60, 14 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); |         popup, "!!!! HW Mismatch !!!!", 60, 14 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); | ||||||
|     popup_set_text( |     popup_set_text(popup, text_buffer, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); | ||||||
|         popup, desktop->text_buffer, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); |  | ||||||
|     popup_set_callback(popup, desktop_scene_hw_mismatch_callback); |     popup_set_callback(popup, desktop_scene_hw_mismatch_callback); | ||||||
|     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); |     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); | ||||||
| } | } | ||||||
| @ -50,12 +55,13 @@ bool desktop_scene_hw_mismatch_on_event(void* context, SceneManagerEvent event) | |||||||
| void desktop_scene_hw_mismatch_on_exit(void* context) { | void desktop_scene_hw_mismatch_on_exit(void* context) { | ||||||
|     Desktop* desktop = (Desktop*)context; |     Desktop* desktop = (Desktop*)context; | ||||||
|     furi_assert(desktop); |     furi_assert(desktop); | ||||||
|     furi_assert(desktop->text_buffer); |  | ||||||
|     Popup* popup = desktop->hw_mismatch_popup; |     Popup* popup = desktop->hw_mismatch_popup; | ||||||
|     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); |     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); | ||||||
|     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); |     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); | ||||||
|     popup_set_callback(popup, NULL); |     popup_set_callback(popup, NULL); | ||||||
|     popup_set_context(popup, NULL); |     popup_set_context(popup, NULL); | ||||||
|     free(desktop->text_buffer); |     char* text_buffer = | ||||||
|     desktop->text_buffer = NULL; |         (char*)scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneHwMismatch); | ||||||
|  |     free(text_buffer); | ||||||
|  |     scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneHwMismatch, 0); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								applications/desktop/scenes/desktop_scene_i.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								applications/desktop/scenes/desktop_scene_i.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     DesktopMainSceneStateUnlocked, | ||||||
|  |     DesktopMainSceneStateLockedWithPin, | ||||||
|  |     DesktopMainSceneStateLockedNoPin, | ||||||
|  | } DesktopMainSceneState; | ||||||
| @ -1,8 +1,11 @@ | |||||||
| #include "../desktop_i.h" |  | ||||||
| #include "../views/desktop_lock_menu.h" |  | ||||||
| #include <toolbox/saved_struct.h> | #include <toolbox/saved_struct.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
|  | #include "../desktop_i.h" | ||||||
|  | #include "../views/desktop_lock_menu.h" | ||||||
|  | #include "desktop_scene_i.h" | ||||||
|  | #include "desktop_scene.h" | ||||||
|  | 
 | ||||||
| void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { | void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { | ||||||
|     Desktop* desktop = (Desktop*)context; |     Desktop* desktop = (Desktop*)context; | ||||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); |     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); | ||||||
| @ -26,17 +29,15 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { | |||||||
|         switch(event.event) { |         switch(event.event) { | ||||||
|         case DesktopLockMenuEventLock: |         case DesktopLockMenuEventLock: | ||||||
|             scene_manager_set_scene_state( |             scene_manager_set_scene_state( | ||||||
|                 desktop->scene_manager, DesktopSceneLocked, DesktopLockedNoPin); |                 desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedNoPin); | ||||||
|             scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); |             scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|         case DesktopLockMenuEventPinLock: |         case DesktopLockMenuEventPinLock: | ||||||
|             if(desktop->settings.pincode.length > 0) { |             if(desktop->settings.pincode.length > 0) { | ||||||
|                 furi_hal_rtc_set_flag(FuriHalRtcFlagLock); |  | ||||||
|                 furi_hal_usb_disable(); |  | ||||||
|                 scene_manager_set_scene_state( |                 scene_manager_set_scene_state( | ||||||
|                     desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); |                     desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedWithPin); | ||||||
|                 scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); |                 scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); | ||||||
|             } else { |             } else { | ||||||
|                 scene_manager_next_scene(desktop->scene_manager, DesktopScenePinSetup); |                 scene_manager_next_scene(desktop->scene_manager, DesktopScenePinSetup); | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -1,101 +0,0 @@ | |||||||
| #include "../desktop_i.h" |  | ||||||
| #include "../views/desktop_locked.h" |  | ||||||
| #include "desktop/views/desktop_main.h" |  | ||||||
| 
 |  | ||||||
| void desktop_scene_locked_callback(DesktopEvent event, void* context) { |  | ||||||
|     Desktop* desktop = (Desktop*)context; |  | ||||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void desktop_scene_locked_new_idle_animation_callback(void* context) { |  | ||||||
|     furi_assert(context); |  | ||||||
|     Desktop* desktop = context; |  | ||||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopLockedEventCheckAnimation); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_scene_locked_on_enter(void* context) { |  | ||||||
|     Desktop* desktop = (Desktop*)context; |  | ||||||
|     DesktopLockedView* locked_view = desktop->locked_view; |  | ||||||
| 
 |  | ||||||
|     animation_manager_set_new_idle_callback( |  | ||||||
|         desktop->animation_manager, desktop_scene_locked_new_idle_animation_callback); |  | ||||||
|     desktop_locked_set_callback(locked_view, desktop_scene_locked_callback, desktop); |  | ||||||
|     desktop_locked_reset_door_pos(locked_view); |  | ||||||
|     desktop_locked_update_hint_timeout(locked_view); |  | ||||||
| 
 |  | ||||||
|     uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopViewLocked); |  | ||||||
| 
 |  | ||||||
|     desktop_locked_with_pin(desktop->locked_view, state == DesktopLockedWithPin); |  | ||||||
| 
 |  | ||||||
|     view_port_enabled_set(desktop->lock_viewport, true); |  | ||||||
|     osTimerStart(locked_view->timer, osKernelGetTickFreq() / 16); |  | ||||||
| 
 |  | ||||||
|     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewLocked); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static bool desktop_scene_locked_check_pin(Desktop* desktop, DesktopEvent event) { |  | ||||||
|     bool match = false; |  | ||||||
| 
 |  | ||||||
|     size_t length = desktop->pincode_buffer.length; |  | ||||||
|     length = code_input_push(desktop->pincode_buffer.data, length, event); |  | ||||||
|     desktop->pincode_buffer.length = length; |  | ||||||
| 
 |  | ||||||
|     match = code_input_compare( |  | ||||||
|         desktop->pincode_buffer.data, |  | ||||||
|         length, |  | ||||||
|         desktop->settings.pincode.data, |  | ||||||
|         desktop->settings.pincode.length); |  | ||||||
| 
 |  | ||||||
|     if(match) { |  | ||||||
|         desktop->pincode_buffer.length = 0; |  | ||||||
|         furi_hal_usb_enable(); |  | ||||||
|         furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); |  | ||||||
|         desktop_main_unlocked(desktop->main_view); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return match; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { |  | ||||||
|     Desktop* desktop = (Desktop*)context; |  | ||||||
| 
 |  | ||||||
|     bool consumed = false; |  | ||||||
|     if(event.type == SceneManagerEventTypeCustom) { |  | ||||||
|         switch(event.event) { |  | ||||||
|         case DesktopLockedEventUnlock: |  | ||||||
|             scene_manager_set_scene_state( |  | ||||||
|                 desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked); |  | ||||||
|             scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); |  | ||||||
|             consumed = true; |  | ||||||
|             break; |  | ||||||
|         case DesktopLockedEventUpdate: |  | ||||||
|             desktop_locked_manage_redraw(desktop->locked_view); |  | ||||||
|             consumed = true; |  | ||||||
|             break; |  | ||||||
|         case DesktopLockedEventInputReset: |  | ||||||
|             desktop->pincode_buffer.length = 0; |  | ||||||
|             break; |  | ||||||
|         case DesktopLockedEventCheckAnimation: |  | ||||||
|             animation_manager_check_blocking_process(desktop->animation_manager); |  | ||||||
|             consumed = true; |  | ||||||
|             break; |  | ||||||
|         default: |  | ||||||
|             if(desktop_scene_locked_check_pin(desktop, event.event)) { |  | ||||||
|                 scene_manager_set_scene_state( |  | ||||||
|                     desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked); |  | ||||||
|                 scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); |  | ||||||
|                 consumed = true; |  | ||||||
|             } |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return consumed; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_scene_locked_on_exit(void* context) { |  | ||||||
|     Desktop* desktop = (Desktop*)context; |  | ||||||
|     animation_manager_set_new_idle_callback(desktop->animation_manager, NULL); |  | ||||||
|     desktop_locked_reset_counter(desktop->locked_view); |  | ||||||
|     osTimerStop(desktop->locked_view->timer); |  | ||||||
| } |  | ||||||
| @ -1,17 +1,14 @@ | |||||||
| #include "../desktop_i.h" | #include <furi.h> | ||||||
| #include "../views/desktop_main.h" | #include <furi_hal.h> | ||||||
| #include "applications.h" | #include <applications.h> | ||||||
| #include "assets_icons.h" | #include <assets_icons.h> | ||||||
| #include "cmsis_os2.h" |  | ||||||
| #include "desktop/desktop.h" |  | ||||||
| #include "desktop/views/desktop_events.h" |  | ||||||
| #include "dolphin/dolphin.h" |  | ||||||
| #include "furi/pubsub.h" |  | ||||||
| #include "furi/record.h" |  | ||||||
| #include "furi/thread.h" |  | ||||||
| #include "storage/storage_glue.h" |  | ||||||
| #include <loader/loader.h> | #include <loader/loader.h> | ||||||
| #include <m-list.h> | 
 | ||||||
|  | #include "desktop/desktop_i.h" | ||||||
|  | #include "desktop/views/desktop_main.h" | ||||||
|  | #include "desktop_scene.h" | ||||||
|  | #include "desktop_scene_i.h" | ||||||
|  | 
 | ||||||
| #define MAIN_VIEW_DEFAULT (0UL) | #define MAIN_VIEW_DEFAULT (0UL) | ||||||
| 
 | 
 | ||||||
| static void desktop_scene_main_app_started_callback(const void* message, void* context) { | static void desktop_scene_main_app_started_callback(const void* message, void* context) { | ||||||
| @ -81,17 +78,31 @@ void desktop_scene_main_on_enter(void* context) { | |||||||
|         desktop->animation_manager, desktop_scene_main_check_animation_callback); |         desktop->animation_manager, desktop_scene_main_check_animation_callback); | ||||||
|     animation_manager_set_interact_callback( |     animation_manager_set_interact_callback( | ||||||
|         desktop->animation_manager, desktop_scene_main_interact_animation_callback); |         desktop->animation_manager, desktop_scene_main_interact_animation_callback); | ||||||
|  |     desktop_locked_set_callback(desktop->locked_view, desktop_scene_main_callback, desktop); | ||||||
| 
 | 
 | ||||||
|     furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); |     furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); | ||||||
|  |     Loader* loader = furi_record_open("loader"); | ||||||
|     desktop->app_start_stop_subscription = furi_pubsub_subscribe( |     desktop->app_start_stop_subscription = furi_pubsub_subscribe( | ||||||
|         loader_get_pubsub(), desktop_scene_main_app_started_callback, desktop); |         loader_get_pubsub(loader), desktop_scene_main_app_started_callback, desktop); | ||||||
|  |     furi_record_close("loader"); | ||||||
| 
 | 
 | ||||||
|     desktop_main_set_callback(main_view, desktop_scene_main_callback, desktop); |     desktop_main_set_callback(main_view, desktop_scene_main_callback, desktop); | ||||||
|     view_port_enabled_set(desktop->lock_viewport, false); |  | ||||||
| 
 | 
 | ||||||
|     if(scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain) == |     DesktopMainSceneState state = | ||||||
|        DesktopMainEventUnlocked) { |         scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain); | ||||||
|         desktop_main_unlocked(desktop->main_view); |     if(state == DesktopMainSceneStateLockedNoPin) { | ||||||
|  |         desktop_locked_lock(desktop->locked_view); | ||||||
|  |         view_port_enabled_set(desktop->lock_viewport, true); | ||||||
|  |     } else if(state == DesktopMainSceneStateLockedWithPin) { | ||||||
|  |         LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||||
|  |         furi_assert(desktop->settings.pincode.length > 0); | ||||||
|  |         desktop_locked_lock_pincode(desktop->locked_view, desktop->settings.pincode); | ||||||
|  |         view_port_enabled_set(desktop->lock_viewport, true); | ||||||
|  |         furi_hal_rtc_set_flag(FuriHalRtcFlagLock); | ||||||
|  |         furi_hal_usb_disable(); | ||||||
|  |     } else { | ||||||
|  |         furi_assert(state == DesktopMainSceneStateUnlocked); | ||||||
|  |         view_port_enabled_set(desktop->lock_viewport, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain); |     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain); | ||||||
| @ -120,22 +131,22 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { | |||||||
| 
 | 
 | ||||||
|         case DesktopMainEventOpenArchive: |         case DesktopMainEventOpenArchive: | ||||||
| #ifdef APP_ARCHIVE | #ifdef APP_ARCHIVE | ||||||
|             animation_manager_unload_and_stall_animation(desktop->animation_manager); |  | ||||||
|             desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE); |             desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE); | ||||||
|             animation_manager_load_and_continue_animation(desktop->animation_manager); |  | ||||||
| #endif | #endif | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case DesktopMainEventOpenFavorite: |         case DesktopMainEventOpenFavorite: | ||||||
|             LOAD_DESKTOP_SETTINGS(&desktop->settings); |             LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||||
|             animation_manager_unload_and_stall_animation(desktop->animation_manager); |  | ||||||
|             if(desktop->settings.favorite < FLIPPER_APPS_COUNT) { |             if(desktop->settings.favorite < FLIPPER_APPS_COUNT) { | ||||||
|                 desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]); |                 Loader* loader = furi_record_open("loader"); | ||||||
|  |                 LoaderStatus status = | ||||||
|  |                     loader_start(loader, FLIPPER_APPS[desktop->settings.favorite].name, NULL); | ||||||
|  |                 furi_check(status == LoaderStatusOk); | ||||||
|  |                 furi_record_close("loader"); | ||||||
|             } else { |             } else { | ||||||
|                 FURI_LOG_E("DesktopSrv", "Can't find favorite application"); |                 FURI_LOG_E("DesktopSrv", "Can't find favorite application"); | ||||||
|             } |             } | ||||||
|             animation_manager_load_and_continue_animation(desktop->animation_manager); |  | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
| @ -160,6 +171,18 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { | |||||||
|             animation_manager_load_and_continue_animation(desktop->animation_manager); |             animation_manager_load_and_continue_animation(desktop->animation_manager); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|  |         case DesktopMainEventUnlocked: | ||||||
|  |             consumed = true; | ||||||
|  |             furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); | ||||||
|  |             furi_hal_usb_enable(); | ||||||
|  |             view_port_enabled_set(desktop->lock_viewport, false); | ||||||
|  |             scene_manager_set_scene_state( | ||||||
|  |                 desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateUnlocked); | ||||||
|  |             break; | ||||||
|  |         case DesktopMainEventUpdate: | ||||||
|  |             desktop_locked_update(desktop->locked_view); | ||||||
|  |             consumed = true; | ||||||
|  |             break; | ||||||
| 
 | 
 | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
| @ -177,7 +200,9 @@ void desktop_scene_main_on_exit(void* context) { | |||||||
|      * is finished, that's why we can be sure there is no task waiting |      * is finished, that's why we can be sure there is no task waiting | ||||||
|      * for start/stop semaphore |      * for start/stop semaphore | ||||||
|      */ |      */ | ||||||
|     furi_pubsub_unsubscribe(loader_get_pubsub(), desktop->app_start_stop_subscription); |     Loader* loader = furi_record_open("loader"); | ||||||
|  |     furi_pubsub_unsubscribe(loader_get_pubsub(loader), desktop->app_start_stop_subscription); | ||||||
|  |     furi_record_close("loader"); | ||||||
|     furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); |     furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); | ||||||
| 
 | 
 | ||||||
|     animation_manager_set_new_idle_callback(desktop->animation_manager, NULL); |     animation_manager_set_new_idle_callback(desktop->animation_manager, NULL); | ||||||
| @ -185,5 +210,4 @@ void desktop_scene_main_on_exit(void* context) { | |||||||
|     animation_manager_set_interact_callback(desktop->animation_manager, NULL); |     animation_manager_set_interact_callback(desktop->animation_manager, NULL); | ||||||
|     animation_manager_set_context(desktop->animation_manager, desktop); |     animation_manager_set_context(desktop->animation_manager, desktop); | ||||||
|     scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneMain, MAIN_VIEW_DEFAULT); |     scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneMain, MAIN_VIEW_DEFAULT); | ||||||
|     desktop_main_reset_hint(desktop->main_view); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
|  | #include <toolbox/version.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <furi_hal.h> | ||||||
|  | 
 | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_debug.h" | #include "desktop_debug.h" | ||||||
| 
 |  | ||||||
| #include "dolphin/helpers/dolphin_state.h" | #include "dolphin/helpers/dolphin_state.h" | ||||||
| #include "dolphin/dolphin.h" | #include "dolphin/dolphin.h" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,12 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <gui/gui_i.h> | #include <stdint.h> | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| #include <gui/canvas.h> |  | ||||||
| #include <gui/elements.h> |  | ||||||
| #include <furi.h> |  | ||||||
| #include <storage/storage.h> |  | ||||||
| #include <time.h> |  | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
| 
 | 
 | ||||||
| typedef struct DesktopDebugView DesktopDebugView; | typedef struct DesktopDebugView DesktopDebugView; | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ typedef enum { | |||||||
|     DesktopMainEventOpenFavorite, |     DesktopMainEventOpenFavorite, | ||||||
|     DesktopMainEventOpenMenu, |     DesktopMainEventOpenMenu, | ||||||
|     DesktopMainEventOpenDebug, |     DesktopMainEventOpenDebug, | ||||||
|  |     DesktopMainEventUpdate, | ||||||
|     DesktopMainEventUnlocked, |     DesktopMainEventUnlocked, | ||||||
|     DesktopMainEventRightShort, |     DesktopMainEventRightShort, | ||||||
|     DesktopMainEventCheckAnimation, |     DesktopMainEventCheckAnimation, | ||||||
| @ -14,8 +15,6 @@ typedef enum { | |||||||
|     DesktopMainEventBeforeAppStarted, |     DesktopMainEventBeforeAppStarted, | ||||||
|     DesktopMainEventAfterAppFinished, |     DesktopMainEventAfterAppFinished, | ||||||
|     DesktopLockedEventUnlock, |     DesktopLockedEventUnlock, | ||||||
|     DesktopLockedEventUpdate, |  | ||||||
|     DesktopLockedEventInputReset, |  | ||||||
|     DesktopLockedEventCheckAnimation, |     DesktopLockedEventCheckAnimation, | ||||||
|     DesktopLockedEventMax, |     DesktopLockedEventMax, | ||||||
|     DesktopDebugEventDeed, |     DesktopDebugEventDeed, | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <furi_hal.h> | ||||||
|  | #include <gui/elements.h> | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_first_start.h" | #include "desktop_first_start.h" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <gui/gui_i.h> |  | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| #include <gui/canvas.h> | 
 | ||||||
| #include <gui/elements.h> |  | ||||||
| #include <furi.h> |  | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
| 
 | 
 | ||||||
| typedef struct DesktopFirstStartView DesktopFirstStartView; | typedef struct DesktopFirstStartView DesktopFirstStartView; | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <gui/elements.h> | ||||||
|  | 
 | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_lock_menu.h" | #include "desktop_lock_menu.h" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,6 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <gui/gui_i.h> |  | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| #include <gui/canvas.h> |  | ||||||
| #include <gui/elements.h> |  | ||||||
| #include <furi.h> |  | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
| 
 | 
 | ||||||
| #define HINT_TIMEOUT 2 | #define HINT_TIMEOUT 2 | ||||||
|  | |||||||
| @ -1,6 +1,42 @@ | |||||||
|  | #include "desktop/desktop_settings/desktop_settings.h" | ||||||
|  | #include "furi/check.h" | ||||||
|  | #include "gui/view.h" | ||||||
|  | #include "portmacro.h" | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <gui/gui_i.h> | ||||||
|  | #include <gui/elements.h> | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_locked.h" | #include "desktop_locked.h" | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #define DOOR_MOVING_INTERVAL_MS (1000 / 16) | ||||||
|  | #define UNLOCKED_HINT_TIMEOUT_MS (2000) | ||||||
|  | 
 | ||||||
|  | struct DesktopLockedView { | ||||||
|  |     View* view; | ||||||
|  |     DesktopLockedViewCallback callback; | ||||||
|  |     void* context; | ||||||
|  | 
 | ||||||
|  |     TimerHandle_t timer; | ||||||
|  |     uint8_t lock_count; | ||||||
|  |     uint32_t lock_lastpress; | ||||||
|  | 
 | ||||||
|  |     PinCode pincode; | ||||||
|  |     PinCode pincode_input; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint32_t hint_icon_expire_at; | ||||||
|  |     bool unlocked_hint; | ||||||
|  |     bool locked; | ||||||
|  |     bool pin_locked; | ||||||
|  | 
 | ||||||
|  |     int8_t door_left_x; | ||||||
|  |     int8_t door_right_x; | ||||||
|  |     bool animation_seq_end; | ||||||
|  | } DesktopLockedViewModel; | ||||||
|  | 
 | ||||||
|  | static void desktop_locked_unlock(DesktopLockedView* locked_view); | ||||||
| 
 | 
 | ||||||
| void desktop_locked_set_callback( | void desktop_locked_set_callback( | ||||||
|     DesktopLockedView* locked_view, |     DesktopLockedView* locked_view, | ||||||
| @ -12,98 +48,69 @@ void desktop_locked_set_callback( | |||||||
|     locked_view->context = context; |     locked_view->context = context; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void locked_view_timer_callback(void* context) { | void locked_view_timer_callback(TimerHandle_t timer) { | ||||||
|     DesktopLockedView* locked_view = context; |     DesktopLockedView* locked_view = pvTimerGetTimerID(timer); | ||||||
|     locked_view->callback(DesktopLockedEventUpdate, locked_view->context); |     locked_view->callback(DesktopMainEventUpdate, locked_view->context); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view) { | static void desktop_locked_update_hint_icon_timeout(DesktopLockedView* locked_view) { | ||||||
|     with_view_model( |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |     model->hint_icon_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); | ||||||
|             model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); |     view_commit_model(locked_view->view, true); | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_locked_reset_door_pos(DesktopLockedView* locked_view) { | static void desktop_locked_reset_door_pos(DesktopLockedView* locked_view) { | ||||||
|     with_view_model( |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |     model->animation_seq_end = false; | ||||||
|             model->animation_seq_end = false; |     model->door_left_x = DOOR_L_POS; | ||||||
|             model->door_left_x = DOOR_L_POS; |     model->door_right_x = DOOR_R_POS; | ||||||
|             model->door_right_x = DOOR_R_POS; |     view_commit_model(locked_view->view, true); | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_locked_manage_redraw(DesktopLockedView* locked_view) { | void desktop_locked_update(DesktopLockedView* locked_view) { | ||||||
|     bool animation_seq_end; |     bool stop_timer = false; | ||||||
| 
 | 
 | ||||||
|     with_view_model( |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |     if(model->locked) { | ||||||
|             model->animation_seq_end = !model->door_left_x; |         if(model->door_left_x != DOOR_L_POS_MAX) { | ||||||
|             animation_seq_end = model->animation_seq_end; |             model->door_left_x = CLAMP(model->door_left_x + 5, DOOR_L_POS_MAX, DOOR_L_POS); | ||||||
|  |             model->door_right_x = CLAMP(model->door_right_x - 5, DOOR_R_POS, DOOR_R_POS_MIN); | ||||||
|  |         } else { | ||||||
|  |             model->animation_seq_end = true; | ||||||
|  |         } | ||||||
|  |         stop_timer = model->animation_seq_end; | ||||||
|  |     } else { | ||||||
|  |         model->unlocked_hint = false; | ||||||
|  |         stop_timer = true; | ||||||
|  |     } | ||||||
|  |     view_commit_model(locked_view->view, true); | ||||||
| 
 | 
 | ||||||
|             if(!model->animation_seq_end) { |     if(stop_timer) { | ||||||
|                 model->door_left_x = CLAMP(model->door_left_x + 5, DOOR_L_POS_MAX, DOOR_L_POS); |         xTimerStop(locked_view->timer, portMAX_DELAY); | ||||||
|                 model->door_right_x = CLAMP(model->door_right_x - 5, DOOR_R_POS, DOOR_R_POS_MIN); |  | ||||||
|             } else { |  | ||||||
|                 model->hint_expire_at = !model->hint_expire_at; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|     if(animation_seq_end) { |  | ||||||
|         osTimerStop(locked_view->timer); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_locked_reset_counter(DesktopLockedView* locked_view) { | void desktop_locked_draw(Canvas* canvas, void* model) { | ||||||
|     locked_view->lock_count = 0; |  | ||||||
|     locked_view->lock_lastpress = 0; |  | ||||||
| 
 |  | ||||||
|     with_view_model( |  | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |  | ||||||
|             model->hint_expire_at = 0; |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_locked_with_pin(DesktopLockedView* locked_view, bool locked) { |  | ||||||
|     with_view_model( |  | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |  | ||||||
|             model->pin_lock = locked; |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_locked_render(Canvas* canvas, void* model) { |  | ||||||
|     DesktopLockedViewModel* m = model; |     DesktopLockedViewModel* m = model; | ||||||
|     uint32_t now = osKernelGetTickCount(); |     uint32_t now = osKernelGetTickCount(); | ||||||
|     canvas_set_color(canvas, ColorBlack); |     canvas_set_color(canvas, ColorBlack); | ||||||
| 
 | 
 | ||||||
|     if(!m->animation_seq_end) { |     if(m->locked) { | ||||||
|         canvas_draw_icon(canvas, m->door_left_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); |  | ||||||
|         canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if(m->animation && m->animation_seq_end) { |  | ||||||
|         if(m->status_bar_background_black) { |  | ||||||
|             canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); |  | ||||||
|         } |  | ||||||
|         canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if(now < m->hint_expire_at) { |  | ||||||
|         if(!m->animation_seq_end) { |         if(!m->animation_seq_end) { | ||||||
|  |             canvas_draw_icon(canvas, m->door_left_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); | ||||||
|  |             canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); | ||||||
|             canvas_set_font(canvas, FontPrimary); |             canvas_set_font(canvas, FontPrimary); | ||||||
|             elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); |             elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); | ||||||
| 
 |         } else if((now < m->hint_icon_expire_at) && !m->pin_locked) { | ||||||
|         } else if(!m->pin_lock) { |  | ||||||
|             canvas_set_font(canvas, FontSecondary); |             canvas_set_font(canvas, FontSecondary); | ||||||
|             canvas_draw_icon(canvas, 13, 2 + STATUS_BAR_Y_SHIFT, &I_LockPopup_100x49); |             canvas_draw_icon(canvas, 13, 2 + STATUS_BAR_Y_SHIFT, &I_LockPopup_100x49); | ||||||
|             elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); |             elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); | ||||||
|         } |         } | ||||||
|  |     } else { | ||||||
|  |         if(m->unlocked_hint) { | ||||||
|  |             canvas_set_font(canvas, FontPrimary); | ||||||
|  |             elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -116,85 +123,72 @@ bool desktop_locked_input(InputEvent* event, void* context) { | |||||||
|     furi_assert(event); |     furi_assert(event); | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     DesktopLockedView* locked_view = context; |     DesktopLockedView* locked_view = context; | ||||||
| 
 |     bool locked = false; | ||||||
|     uint32_t press_time = 0; |  | ||||||
|     bool locked_with_pin = false; |     bool locked_with_pin = false; | ||||||
|  |     uint32_t press_time = xTaskGetTickCount(); | ||||||
| 
 | 
 | ||||||
|     with_view_model( |     { | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |         DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|             locked_with_pin = model->pin_lock; |         bool changed = false; | ||||||
|             return false; |         locked = model->locked; | ||||||
|         }); |         locked_with_pin = model->pin_locked; | ||||||
| 
 |         if(!locked && model->unlocked_hint && event->type == InputTypePress) { | ||||||
|     if(event->type == InputTypeShort) { |             model->unlocked_hint = false; | ||||||
|         if(locked_with_pin) { |             changed = true; | ||||||
|             press_time = osKernelGetTickCount(); |  | ||||||
| 
 |  | ||||||
|             if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT * 3) { |  | ||||||
|                 locked_view->lock_lastpress = press_time; |  | ||||||
|                 locked_view->callback(DesktopLockedEventInputReset, locked_view->context); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             locked_view->callback(event->key, locked_view->context); |  | ||||||
|         } else { |  | ||||||
|             desktop_locked_update_hint_timeout(locked_view); |  | ||||||
| 
 |  | ||||||
|             if(event->key == InputKeyBack) { |  | ||||||
|                 press_time = osKernelGetTickCount(); |  | ||||||
|                 // check if pressed sequentially
 |  | ||||||
|                 if(press_time - locked_view->lock_lastpress < UNLOCK_RST_TIMEOUT) { |  | ||||||
|                     locked_view->lock_lastpress = press_time; |  | ||||||
|                     locked_view->lock_count++; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if(locked_view->lock_count == UNLOCK_CNT) { |  | ||||||
|                     locked_view->lock_count = 0; |  | ||||||
|                     locked_view->callback(DesktopLockedEventUnlock, locked_view->context); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|  |         view_commit_model(locked_view->view, changed); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|         if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT) { |     if(!locked || (event->type != InputTypeShort)) { | ||||||
|  |         return locked; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT) { | ||||||
|  |         locked_view->lock_lastpress = press_time; | ||||||
|  |         locked_view->lock_count = 0; | ||||||
|  |         locked_view->pincode_input.length = 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(locked_with_pin) { | ||||||
|  |         locked_view->pincode_input.length = code_input_push( | ||||||
|  |             locked_view->pincode_input.data, locked_view->pincode_input.length, event->key); | ||||||
|  |         bool match = code_input_compare( | ||||||
|  |             locked_view->pincode_input.data, | ||||||
|  |             locked_view->pincode_input.length, | ||||||
|  |             locked_view->pincode.data, | ||||||
|  |             locked_view->pincode.length); | ||||||
|  | 
 | ||||||
|  |         if(match) { | ||||||
|  |             desktop_locked_unlock(locked_view); | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         if(event->key == InputKeyBack) { | ||||||
|             locked_view->lock_lastpress = press_time; |             locked_view->lock_lastpress = press_time; | ||||||
|  |             locked_view->lock_count++; | ||||||
|  |             if(locked_view->lock_count == UNLOCK_CNT) { | ||||||
|  |                 desktop_locked_unlock(locked_view); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             desktop_locked_update_hint_icon_timeout(locked_view); | ||||||
|             locked_view->lock_count = 0; |             locked_view->lock_count = 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     // All events consumed
 |  | ||||||
|     return true; |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void desktop_locked_enter(void* context) { |     locked_view->lock_lastpress = press_time; | ||||||
|     DesktopLockedView* locked_view = context; |  | ||||||
| 
 | 
 | ||||||
|     with_view_model( |     return locked; | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_start(model->animation); |  | ||||||
|             return false; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_locked_exit(void* context) { |  | ||||||
|     DesktopLockedView* locked_view = context; |  | ||||||
| 
 |  | ||||||
|     with_view_model( |  | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_stop(model->animation); |  | ||||||
|             return false; |  | ||||||
|         }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| DesktopLockedView* desktop_locked_alloc() { | DesktopLockedView* desktop_locked_alloc() { | ||||||
|     DesktopLockedView* locked_view = furi_alloc(sizeof(DesktopLockedView)); |     DesktopLockedView* locked_view = furi_alloc(sizeof(DesktopLockedView)); | ||||||
|     locked_view->view = view_alloc(); |     locked_view->view = view_alloc(); | ||||||
|     locked_view->timer = |     locked_view->timer = | ||||||
|         osTimerNew(locked_view_timer_callback, osTimerPeriodic, locked_view, NULL); |         xTimerCreate("Locked view", 1000 / 16, pdTRUE, locked_view, locked_view_timer_callback); | ||||||
| 
 | 
 | ||||||
|     view_allocate_model(locked_view->view, ViewModelTypeLocking, sizeof(DesktopLockedViewModel)); |     view_allocate_model(locked_view->view, ViewModelTypeLocking, sizeof(DesktopLockedViewModel)); | ||||||
|     view_set_context(locked_view->view, locked_view); |     view_set_context(locked_view->view, locked_view); | ||||||
|     view_set_draw_callback(locked_view->view, (ViewDrawCallback)desktop_locked_render); |     view_set_draw_callback(locked_view->view, (ViewDrawCallback)desktop_locked_draw); | ||||||
|     view_set_input_callback(locked_view->view, desktop_locked_input); |     view_set_input_callback(locked_view->view, desktop_locked_input); | ||||||
|     view_set_enter_callback(locked_view->view, desktop_locked_enter); |  | ||||||
|     view_set_exit_callback(locked_view->view, desktop_locked_exit); |  | ||||||
| 
 | 
 | ||||||
|     return locked_view; |     return locked_view; | ||||||
| } | } | ||||||
| @ -205,3 +199,37 @@ void desktop_locked_free(DesktopLockedView* locked_view) { | |||||||
|     view_free(locked_view->view); |     view_free(locked_view->view); | ||||||
|     free(locked_view); |     free(locked_view); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void desktop_locked_lock(DesktopLockedView* locked_view) { | ||||||
|  |     locked_view->pincode.length = 0; | ||||||
|  |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|  |     model->locked = true; | ||||||
|  |     model->pin_locked = false; | ||||||
|  |     view_commit_model(locked_view->view, true); | ||||||
|  |     desktop_locked_reset_door_pos(locked_view); | ||||||
|  |     xTimerChangePeriod(locked_view->timer, DOOR_MOVING_INTERVAL_MS, portMAX_DELAY); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void desktop_locked_lock_pincode(DesktopLockedView* locked_view, PinCode pincode) { | ||||||
|  |     locked_view->pincode = pincode; | ||||||
|  |     locked_view->pincode_input.length = 0; | ||||||
|  |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|  |     model->locked = true; | ||||||
|  |     model->pin_locked = true; | ||||||
|  |     view_commit_model(locked_view->view, true); | ||||||
|  |     desktop_locked_reset_door_pos(locked_view); | ||||||
|  |     xTimerChangePeriod(locked_view->timer, DOOR_MOVING_INTERVAL_MS, portMAX_DELAY); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void desktop_locked_unlock(DesktopLockedView* locked_view) { | ||||||
|  |     furi_assert(locked_view); | ||||||
|  | 
 | ||||||
|  |     locked_view->lock_count = 0; | ||||||
|  |     DesktopLockedViewModel* model = view_get_model(locked_view->view); | ||||||
|  |     model->locked = false; | ||||||
|  |     model->pin_locked = false; | ||||||
|  |     model->unlocked_hint = true; | ||||||
|  |     view_commit_model(locked_view->view, true); | ||||||
|  |     locked_view->callback(DesktopMainEventUnlocked, locked_view->context); | ||||||
|  |     xTimerChangePeriod(locked_view->timer, UNLOCKED_HINT_TIMEOUT_MS, portMAX_DELAY); | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,14 +1,11 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <gui/gui_i.h> | #include <desktop/desktop_settings/desktop_settings.h> | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| #include <gui/canvas.h> |  | ||||||
| #include <gui/elements.h> |  | ||||||
| #include <furi.h> |  | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
| 
 | 
 | ||||||
| #define UNLOCK_RST_TIMEOUT 300 | #define UNLOCK_RST_TIMEOUT 300 | ||||||
| #define UNLOCK_CNT 2 // 3 actually
 | #define UNLOCK_CNT 3 | ||||||
| 
 | 
 | ||||||
| #define DOOR_L_POS -57 | #define DOOR_L_POS -57 | ||||||
| #define DOOR_L_POS_MAX 0 | #define DOOR_L_POS_MAX 0 | ||||||
| @ -24,40 +21,16 @@ typedef struct DesktopLockedView DesktopLockedView; | |||||||
| 
 | 
 | ||||||
| typedef void (*DesktopLockedViewCallback)(DesktopEvent event, void* context); | typedef void (*DesktopLockedViewCallback)(DesktopEvent event, void* context); | ||||||
| 
 | 
 | ||||||
| struct DesktopLockedView { |  | ||||||
|     View* view; |  | ||||||
|     DesktopLockedViewCallback callback; |  | ||||||
|     void* context; |  | ||||||
| 
 |  | ||||||
|     osTimerId_t timer; |  | ||||||
|     uint8_t lock_count; |  | ||||||
|     uint32_t lock_lastpress; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     IconAnimation* animation; |  | ||||||
|     uint32_t hint_expire_at; |  | ||||||
| 
 |  | ||||||
|     bool status_bar_background_black; |  | ||||||
|     uint8_t scene_num; |  | ||||||
|     int8_t door_left_x; |  | ||||||
|     int8_t door_right_x; |  | ||||||
|     bool animation_seq_end; |  | ||||||
| 
 |  | ||||||
|     bool pin_lock; |  | ||||||
| } DesktopLockedViewModel; |  | ||||||
| 
 |  | ||||||
| void desktop_locked_set_callback( | void desktop_locked_set_callback( | ||||||
|     DesktopLockedView* locked_view, |     DesktopLockedView* locked_view, | ||||||
|     DesktopLockedViewCallback callback, |     DesktopLockedViewCallback callback, | ||||||
|     void* context); |     void* context); | ||||||
| 
 | 
 | ||||||
| void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view); | void desktop_locked_update(DesktopLockedView* locked_view); | ||||||
| void desktop_locked_reset_counter(DesktopLockedView* locked_view); |  | ||||||
| void desktop_locked_reset_door_pos(DesktopLockedView* locked_view); |  | ||||||
| void desktop_locked_manage_redraw(DesktopLockedView* locked_view); |  | ||||||
| 
 | 
 | ||||||
| View* desktop_locked_get_view(DesktopLockedView* locked_view); | View* desktop_locked_get_view(DesktopLockedView* locked_view); | ||||||
| DesktopLockedView* desktop_locked_alloc(); | DesktopLockedView* desktop_locked_alloc(); | ||||||
| void desktop_locked_free(DesktopLockedView* locked_view); | void desktop_locked_free(DesktopLockedView* locked_view); | ||||||
| void desktop_locked_with_pin(DesktopLockedView* lock_menu, bool locked); | 
 | ||||||
|  | void desktop_locked_lock_pincode(DesktopLockedView* locked_view, PinCode pincode); | ||||||
|  | void desktop_locked_lock(DesktopLockedView* locked_view); | ||||||
|  | |||||||
| @ -1,13 +1,19 @@ | |||||||
| #include "dolphin/dolphin.h" | #include <gui/gui_i.h> | ||||||
| #include "furi/record.h" | #include <gui/view.h> | ||||||
| #include "gui/canvas.h" | #include <gui/elements.h> | ||||||
| #include "gui/view.h" | #include <gui/canvas.h> | ||||||
| #include "gui/view_composed.h" |  | ||||||
| #include "input/input.h" |  | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <input/input.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
|  | 
 | ||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_main.h" | #include "desktop_main.h" | ||||||
| //#include "../animations/views/bubble_animation_view.h"
 | 
 | ||||||
|  | struct DesktopMainView { | ||||||
|  |     View* view; | ||||||
|  |     DesktopMainViewCallback callback; | ||||||
|  |     void* context; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| void desktop_main_set_callback( | void desktop_main_set_callback( | ||||||
|     DesktopMainView* main_view, |     DesktopMainView* main_view, | ||||||
| @ -19,59 +25,6 @@ void desktop_main_set_callback( | |||||||
|     main_view->context = context; |     main_view->context = context; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_main_reset_hint(DesktopMainView* main_view) { |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             model->hint_expire_at = 0; |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_main_switch_dolphin_animation( |  | ||||||
|     DesktopMainView* main_view, |  | ||||||
|     const Icon* icon, |  | ||||||
|     bool status_bar_background_black) { |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_free(model->animation); |  | ||||||
|             model->animation = icon_animation_alloc(icon); |  | ||||||
|             view_tie_icon_animation(main_view->view, model->animation); |  | ||||||
|             icon_animation_start(model->animation); |  | ||||||
|             model->icon = NULL; |  | ||||||
|             model->status_bar_background_black = status_bar_background_black; |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon) { |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_free(model->animation); |  | ||||||
|             model->animation = NULL; |  | ||||||
|             model->icon = icon; |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_main_render(Canvas* canvas, void* model) { |  | ||||||
|     DesktopMainViewModel* m = model; |  | ||||||
|     uint32_t now = osKernelGetTickCount(); |  | ||||||
| 
 |  | ||||||
|     if(m->status_bar_background_black) { |  | ||||||
|         canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); |  | ||||||
|     } |  | ||||||
|     if(m->icon) { |  | ||||||
|         canvas_draw_icon(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->icon); |  | ||||||
|     } else if(m->animation) { |  | ||||||
|         canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if(now < m->hint_expire_at) { |  | ||||||
|         canvas_set_font(canvas, FontPrimary); |  | ||||||
|         elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| View* desktop_main_get_view(DesktopMainView* main_view) { | View* desktop_main_get_view(DesktopMainView* main_view) { | ||||||
|     furi_assert(main_view); |     furi_assert(main_view); | ||||||
|     return main_view->view; |     return main_view->view; | ||||||
| @ -100,40 +53,16 @@ bool desktop_main_input(InputEvent* event, void* context) { | |||||||
|         consumed = true; |         consumed = true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     desktop_main_reset_hint(main_view); |  | ||||||
| 
 |  | ||||||
|     return consumed; |     return consumed; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_main_enter(void* context) { |  | ||||||
|     DesktopMainView* main_view = context; |  | ||||||
| 
 |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_start(model->animation); |  | ||||||
|             return false; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void desktop_main_exit(void* context) { |  | ||||||
|     DesktopMainView* main_view = context; |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             if(model->animation) icon_animation_stop(model->animation); |  | ||||||
|             return false; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| DesktopMainView* desktop_main_alloc() { | DesktopMainView* desktop_main_alloc() { | ||||||
|     DesktopMainView* main_view = furi_alloc(sizeof(DesktopMainView)); |     DesktopMainView* main_view = furi_alloc(sizeof(DesktopMainView)); | ||||||
| 
 | 
 | ||||||
|     main_view->view = view_alloc(); |     main_view->view = view_alloc(); | ||||||
|     view_allocate_model(main_view->view, ViewModelTypeLocking, sizeof(DesktopMainViewModel)); |     view_allocate_model(main_view->view, ViewModelTypeLockFree, 1); | ||||||
|     view_set_context(main_view->view, main_view); |     view_set_context(main_view->view, main_view); | ||||||
|     view_set_draw_callback(main_view->view, (ViewDrawCallback)desktop_main_render); |  | ||||||
|     view_set_input_callback(main_view->view, desktop_main_input); |     view_set_input_callback(main_view->view, desktop_main_input); | ||||||
|     view_set_enter_callback(main_view->view, desktop_main_enter); |  | ||||||
|     view_set_exit_callback(main_view->view, desktop_main_exit); |  | ||||||
| 
 | 
 | ||||||
|     return main_view; |     return main_view; | ||||||
| } | } | ||||||
| @ -143,11 +72,3 @@ void desktop_main_free(DesktopMainView* main_view) { | |||||||
|     view_free(main_view->view); |     view_free(main_view->view); | ||||||
|     free(main_view); |     free(main_view); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| void desktop_main_unlocked(DesktopMainView* main_view) { |  | ||||||
|     with_view_model( |  | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |  | ||||||
|             model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); |  | ||||||
|             return true; |  | ||||||
|         }); |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -1,31 +1,12 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "gui/view_composed.h" |  | ||||||
| #include <gui/gui_i.h> |  | ||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| #include <gui/canvas.h> |  | ||||||
| #include <gui/elements.h> |  | ||||||
| #include <furi.h> |  | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
| 
 | 
 | ||||||
| typedef struct DesktopMainView DesktopMainView; | typedef struct DesktopMainView DesktopMainView; | ||||||
| 
 | 
 | ||||||
| typedef void (*DesktopMainViewCallback)(DesktopEvent event, void* context); | typedef void (*DesktopMainViewCallback)(DesktopEvent event, void* context); | ||||||
| 
 | 
 | ||||||
| struct DesktopMainView { |  | ||||||
|     View* view; |  | ||||||
|     DesktopMainViewCallback callback; |  | ||||||
|     void* context; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     IconAnimation* animation; |  | ||||||
|     const Icon* icon; |  | ||||||
|     uint8_t scene_num; |  | ||||||
|     bool status_bar_background_black; |  | ||||||
|     uint32_t hint_expire_at; |  | ||||||
| } DesktopMainViewModel; |  | ||||||
| 
 |  | ||||||
| void desktop_main_set_callback( | void desktop_main_set_callback( | ||||||
|     DesktopMainView* main_view, |     DesktopMainView* main_view, | ||||||
|     DesktopMainViewCallback callback, |     DesktopMainViewCallback callback, | ||||||
| @ -34,10 +15,3 @@ void desktop_main_set_callback( | |||||||
| View* desktop_main_get_view(DesktopMainView* main_view); | View* desktop_main_get_view(DesktopMainView* main_view); | ||||||
| DesktopMainView* desktop_main_alloc(); | DesktopMainView* desktop_main_alloc(); | ||||||
| void desktop_main_free(DesktopMainView* main_view); | void desktop_main_free(DesktopMainView* main_view); | ||||||
| void desktop_main_switch_dolphin_animation( |  | ||||||
|     DesktopMainView* main_view, |  | ||||||
|     const Icon* icon, |  | ||||||
|     bool status_bar_background_black); |  | ||||||
| void desktop_main_unlocked(DesktopMainView* main_view); |  | ||||||
| void desktop_main_reset_hint(DesktopMainView* main_view); |  | ||||||
| void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon); |  | ||||||
|  | |||||||
| @ -1,13 +1,18 @@ | |||||||
| #include "dolphin/dolphin.h" | #include "dolphin/dolphin.h" | ||||||
| #include "desktop/desktop.h" |  | ||||||
| #include "dolphin/helpers/dolphin_state.h" | #include "dolphin/helpers/dolphin_state.h" | ||||||
| #include "dolphin_i.h" | #include "dolphin_i.h" | ||||||
| #include "furi/pubsub.h" | #include "portmacro.h" | ||||||
| #include "sys/_stdint.h" | #include "projdefs.h" | ||||||
|  | #include <furi_hal.h> | ||||||
|  | #include <stdint.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #define DOLPHIN_TIMEGATE 86400 // one day
 |  | ||||||
| #define DOLPHIN_LOCK_EVENT_FLAG (0x1) | #define DOLPHIN_LOCK_EVENT_FLAG (0x1) | ||||||
| 
 | 
 | ||||||
|  | #define TAG "Dolphin" | ||||||
|  | #define HOURS_IN_TICKS(x) ((x)*60 * 60 * 1000) | ||||||
|  | 
 | ||||||
|  | static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin); | ||||||
|  | 
 | ||||||
| void dolphin_deed(Dolphin* dolphin, DolphinDeed deed) { | void dolphin_deed(Dolphin* dolphin, DolphinDeed deed) { | ||||||
|     furi_assert(dolphin); |     furi_assert(dolphin); | ||||||
|     DolphinEvent event; |     DolphinEvent event; | ||||||
| @ -39,12 +44,51 @@ void dolphin_flush(Dolphin* dolphin) { | |||||||
|     dolphin_event_send_wait(dolphin, &event); |     dolphin_event_send_wait(dolphin, &event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void dolphin_butthurt_timer_callback(TimerHandle_t xTimer) { | ||||||
|  |     Dolphin* dolphin = pvTimerGetTimerID(xTimer); | ||||||
|  |     furi_assert(dolphin); | ||||||
|  | 
 | ||||||
|  |     DolphinEvent event; | ||||||
|  |     event.type = DolphinEventTypeIncreaseButthurt; | ||||||
|  |     dolphin_event_send_async(dolphin, &event); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void dolphin_flush_timer_callback(TimerHandle_t xTimer) { | ||||||
|  |     Dolphin* dolphin = pvTimerGetTimerID(xTimer); | ||||||
|  |     furi_assert(dolphin); | ||||||
|  | 
 | ||||||
|  |     DolphinEvent event; | ||||||
|  |     event.type = DolphinEventTypeFlush; | ||||||
|  |     dolphin_event_send_async(dolphin, &event); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void dolphin_clear_limits_timer_callback(TimerHandle_t xTimer) { | ||||||
|  |     Dolphin* dolphin = pvTimerGetTimerID(xTimer); | ||||||
|  |     furi_assert(dolphin); | ||||||
|  | 
 | ||||||
|  |     xTimerChangePeriod(dolphin->clear_limits_timer, HOURS_IN_TICKS(24), portMAX_DELAY); | ||||||
|  | 
 | ||||||
|  |     DolphinEvent event; | ||||||
|  |     event.type = DolphinEventTypeClearLimits; | ||||||
|  |     dolphin_event_send_async(dolphin, &event); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Dolphin* dolphin_alloc() { | Dolphin* dolphin_alloc() { | ||||||
|     Dolphin* dolphin = furi_alloc(sizeof(Dolphin)); |     Dolphin* dolphin = furi_alloc(sizeof(Dolphin)); | ||||||
| 
 | 
 | ||||||
|     dolphin->state = dolphin_state_alloc(); |     dolphin->state = dolphin_state_alloc(); | ||||||
|     dolphin->event_queue = osMessageQueueNew(8, sizeof(DolphinEvent), NULL); |     dolphin->event_queue = osMessageQueueNew(8, sizeof(DolphinEvent), NULL); | ||||||
|     dolphin->pubsub = furi_pubsub_alloc(); |     dolphin->pubsub = furi_pubsub_alloc(); | ||||||
|  |     dolphin->butthurt_timer = xTimerCreate( | ||||||
|  |         "Butthurt timer", HOURS_IN_TICKS(2 * 24), pdTRUE, dolphin, dolphin_butthurt_timer_callback); | ||||||
|  |     dolphin->flush_timer = | ||||||
|  |         xTimerCreate("Flush timer", 30 * 1000, pdFALSE, dolphin, dolphin_flush_timer_callback); | ||||||
|  |     dolphin->clear_limits_timer = xTimerCreate( | ||||||
|  |         "Clear limits timer", | ||||||
|  |         HOURS_IN_TICKS(24), | ||||||
|  |         pdTRUE, | ||||||
|  |         dolphin, | ||||||
|  |         dolphin_clear_limits_timer_callback); | ||||||
| 
 | 
 | ||||||
|     return dolphin; |     return dolphin; | ||||||
| } | } | ||||||
| @ -83,50 +127,72 @@ void dolphin_event_release(Dolphin* dolphin, DolphinEvent* event) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void dolphin_check_butthurt(DolphinState* state) { |  | ||||||
|     furi_assert(state); |  | ||||||
|     float diff_time = difftime(state->data.timestamp, dolphin_state_timestamp()); |  | ||||||
| 
 |  | ||||||
|     if((fabs(diff_time)) > DOLPHIN_TIMEGATE) { |  | ||||||
|         dolphin_state_butthurted(state); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin) { | FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin) { | ||||||
|     return dolphin->pubsub; |     return dolphin->pubsub; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) { | ||||||
|  |     furi_assert(dolphin); | ||||||
|  |     TickType_t now_ticks = xTaskGetTickCount(); | ||||||
|  |     TickType_t timer_expires_at = xTimerGetExpiryTime(dolphin->clear_limits_timer); | ||||||
|  | 
 | ||||||
|  |     if((timer_expires_at - now_ticks) > HOURS_IN_TICKS(0.1)) { | ||||||
|  |         FuriHalRtcDateTime date; | ||||||
|  |         furi_hal_rtc_get_datetime(&date); | ||||||
|  |         TickType_t now_time_in_ms = ((date.hour * 60 + date.minute) * 60 + date.second) * 1000; | ||||||
|  |         TickType_t time_to_clear_limits = 0; | ||||||
|  | 
 | ||||||
|  |         if(date.hour < 5) { | ||||||
|  |             time_to_clear_limits = HOURS_IN_TICKS(5) - now_time_in_ms; | ||||||
|  |         } else { | ||||||
|  |             time_to_clear_limits = HOURS_IN_TICKS(24 + 5) - now_time_in_ms; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         xTimerChangePeriod(dolphin->clear_limits_timer, time_to_clear_limits, portMAX_DELAY); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int32_t dolphin_srv(void* p) { | int32_t dolphin_srv(void* p) { | ||||||
|     Dolphin* dolphin = dolphin_alloc(); |     Dolphin* dolphin = dolphin_alloc(); | ||||||
|     furi_record_create("dolphin", dolphin); |     furi_record_create("dolphin", dolphin); | ||||||
| 
 | 
 | ||||||
|     dolphin_state_load(dolphin->state); |     dolphin_state_load(dolphin->state); | ||||||
|  |     xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); | ||||||
|  |     dolphin_update_clear_limits_timer_period(dolphin); | ||||||
|  |     xTimerReset(dolphin->clear_limits_timer, portMAX_DELAY); | ||||||
| 
 | 
 | ||||||
|     DolphinEvent event; |     DolphinEvent event; | ||||||
|     while(1) { |     while(1) { | ||||||
|         if(osMessageQueueGet(dolphin->event_queue, &event, NULL, 60000) == osOK) { |         if(osMessageQueueGet(dolphin->event_queue, &event, NULL, HOURS_IN_TICKS(1)) == osOK) { | ||||||
|             if(event.type == DolphinEventTypeDeed) { |             if(event.type == DolphinEventTypeDeed) { | ||||||
|                 if(dolphin_state_on_deed(dolphin->state, event.deed)) { |                 dolphin_state_on_deed(dolphin->state, event.deed); | ||||||
|                     DolphinPubsubEvent event = DolphinPubsubEventUpdate; |                 DolphinPubsubEvent event = DolphinPubsubEventUpdate; | ||||||
|                     furi_pubsub_publish(dolphin->pubsub, &event); |                 furi_pubsub_publish(dolphin->pubsub, &event); | ||||||
|                 } |                 xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); | ||||||
|  |                 xTimerReset(dolphin->flush_timer, portMAX_DELAY); | ||||||
|             } else if(event.type == DolphinEventTypeStats) { |             } else if(event.type == DolphinEventTypeStats) { | ||||||
|                 // TODO: correct icounter/butthurt changing, stub till then
 |                 event.stats->icounter = dolphin->state->data.icounter; | ||||||
|                 event.stats->icounter = 0; |                 event.stats->butthurt = dolphin->state->data.butthurt; | ||||||
|                 event.stats->butthurt = 0; |  | ||||||
|                 event.stats->timestamp = dolphin->state->data.timestamp; |                 event.stats->timestamp = dolphin->state->data.timestamp; | ||||||
|                 event.stats->level = 1; |                 event.stats->level = dolphin_get_level(dolphin->state->data.icounter); | ||||||
|                 event.stats->level_up_is_pending = 0; |                 event.stats->level_up_is_pending = | ||||||
|  |                     !dolphin_state_xp_to_levelup(dolphin->state->data.icounter); | ||||||
|             } else if(event.type == DolphinEventTypeFlush) { |             } else if(event.type == DolphinEventTypeFlush) { | ||||||
|                 // TODO: correct icounter/butthurt changing, stub till then
 |                 FURI_LOG_I(TAG, "Flush stats"); | ||||||
|                 dolphin->state->data.butthurt = 0; |                 dolphin_state_save(dolphin->state); | ||||||
|                 dolphin->state->data.icounter = 0; |             } else if(event.type == DolphinEventTypeClearLimits) { | ||||||
|  |                 FURI_LOG_I(TAG, "Clear limits"); | ||||||
|  |                 dolphin_state_clear_limits(dolphin->state); | ||||||
|  |                 dolphin_state_save(dolphin->state); | ||||||
|  |             } else if(event.type == DolphinEventTypeIncreaseButthurt) { | ||||||
|  |                 FURI_LOG_I(TAG, "Increase butthurt"); | ||||||
|  |                 dolphin_state_butthurted(dolphin->state); | ||||||
|                 dolphin_state_save(dolphin->state); |                 dolphin_state_save(dolphin->state); | ||||||
|             } |             } | ||||||
|             dolphin_event_release(dolphin, &event); |             dolphin_event_release(dolphin, &event); | ||||||
|         } else { |         } else { | ||||||
|             dolphin_check_butthurt(dolphin->state); |             /* once per hour check rtc time is not changed */ | ||||||
|             dolphin_state_save(dolphin->state); |             dolphin_update_clear_limits_timer_period(dolphin); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,6 +5,10 @@ | |||||||
| #include "helpers/dolphin_deed.h" | #include "helpers/dolphin_deed.h" | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| typedef struct Dolphin Dolphin; | typedef struct Dolphin Dolphin; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -19,6 +23,13 @@ typedef enum { | |||||||
|     DolphinPubsubEventUpdate, |     DolphinPubsubEventUpdate, | ||||||
| } DolphinPubsubEvent; | } DolphinPubsubEvent; | ||||||
| 
 | 
 | ||||||
|  | #define DOLPHIN_DEED(deed)                                        \ | ||||||
|  |     do {                                                          \ | ||||||
|  |         Dolphin* dolphin = (Dolphin*)furi_record_open("dolphin"); \ | ||||||
|  |         dolphin_deed(dolphin, deed);                              \ | ||||||
|  |         furi_record_close("dolphin");                             \ | ||||||
|  |     } while(0) | ||||||
|  | 
 | ||||||
| /** Deed complete notification. Call it on deed completion.
 | /** Deed complete notification. Call it on deed completion.
 | ||||||
|  * See dolphin_deed.h for available deeds. In futures it will become part of assets. |  * See dolphin_deed.h for available deeds. In futures it will become part of assets. | ||||||
|  * Thread safe, async |  * Thread safe, async | ||||||
| @ -38,3 +49,7 @@ void dolphin_flush(Dolphin* dolphin); | |||||||
| void dolphin_upgrade_level(Dolphin* dolphin); | void dolphin_upgrade_level(Dolphin* dolphin); | ||||||
| 
 | 
 | ||||||
| FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin); | FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -11,9 +11,8 @@ typedef enum { | |||||||
|     DolphinEventTypeDeed, |     DolphinEventTypeDeed, | ||||||
|     DolphinEventTypeStats, |     DolphinEventTypeStats, | ||||||
|     DolphinEventTypeFlush, |     DolphinEventTypeFlush, | ||||||
|     DolphinEventTypeAnimationStartNewIdle, |     DolphinEventTypeIncreaseButthurt, | ||||||
|     DolphinEventTypeAnimationCheckBlocking, |     DolphinEventTypeClearLimits, | ||||||
|     DolphinEventTypeAnimationInteract, |  | ||||||
| } DolphinEventType; | } DolphinEventType; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -31,6 +30,9 @@ struct Dolphin { | |||||||
|     // Queue
 |     // Queue
 | ||||||
|     osMessageQueueId_t event_queue; |     osMessageQueueId_t event_queue; | ||||||
|     FuriPubSub* pubsub; |     FuriPubSub* pubsub; | ||||||
|  |     TimerHandle_t butthurt_timer; | ||||||
|  |     TimerHandle_t flush_timer; | ||||||
|  |     TimerHandle_t clear_limits_timer; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| Dolphin* dolphin_alloc(); | Dolphin* dolphin_alloc(); | ||||||
|  | |||||||
| @ -1,14 +1,65 @@ | |||||||
| #include "dolphin_deed.h" | #include "dolphin_deed.h" | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
| static const DolphinDeedWeight dolphin_deed_weights[DolphinDeedMax] = { | static const DolphinDeedWeight dolphin_deed_weights[] = { | ||||||
|     {1, -1, 60}, |     {1, DolphinAppSubGhz}, // DolphinDeedSubGhzReceiverInfo
 | ||||||
|     {1, -1, 60}, |     {3, DolphinAppSubGhz}, // DolphinDeedSubGhzSave
 | ||||||
|     {1, -1, 60}, |     {1, DolphinAppSubGhz}, // DolphinDeedSubGhzRawRec
 | ||||||
|     {-1, 1, 60}, |     {2, DolphinAppSubGhz}, // DolphinDeedSubGhzAddManually
 | ||||||
|  |     {2, DolphinAppSubGhz}, // DolphinDeedSubGhzSend
 | ||||||
|  |     {1, DolphinAppSubGhz}, // DolphinDeedSubGhzFrequencyAnalyzer
 | ||||||
|  | 
 | ||||||
|  |     {1, DolphinAppRfid}, // DolphinDeedRfidRead
 | ||||||
|  |     {3, DolphinAppRfid}, // DolphinDeedRfidReadSuccess
 | ||||||
|  |     {3, DolphinAppRfid}, // DolphinDeedRfidSave
 | ||||||
|  |     {2, DolphinAppRfid}, // DolphinDeedRfidEmulate
 | ||||||
|  |     {2, DolphinAppRfid}, // DolphinDeedRfidAdd
 | ||||||
|  | 
 | ||||||
|  |     {1, DolphinAppNfc}, // DolphinDeedNfcRead
 | ||||||
|  |     {3, DolphinAppNfc}, // DolphinDeedNfcReadSuccess
 | ||||||
|  |     {3, DolphinAppNfc}, // DolphinDeedNfcSave
 | ||||||
|  |     {2, DolphinAppNfc}, // DolphinDeedNfcEmulate
 | ||||||
|  |     {2, DolphinAppNfc}, // DolphinDeedNfcAdd
 | ||||||
|  | 
 | ||||||
|  |     {1, DolphinAppIr}, // DolphinDeedIrSend
 | ||||||
|  |     {3, DolphinAppIr}, // DolphinDeedIrLearnSuccess
 | ||||||
|  |     {3, DolphinAppIr}, // DolphinDeedIrSave
 | ||||||
|  |     {2, DolphinAppIr}, // DolphinDeedIrBruteForce
 | ||||||
|  | 
 | ||||||
|  |     {1, DolphinAppIbutton}, // DolphinDeedIbuttonRead
 | ||||||
|  |     {3, DolphinAppIbutton}, // DolphinDeedIbuttonReadSuccess
 | ||||||
|  |     {3, DolphinAppIbutton}, // DolphinDeedIbuttonSave
 | ||||||
|  |     {2, DolphinAppIbutton}, // DolphinDeedIbuttonEmulate
 | ||||||
|  |     {2, DolphinAppIbutton}, // DolphinDeedIbuttonAdd
 | ||||||
|  | 
 | ||||||
|  |     {3, DolphinAppBadusb}, // DolphinDeedBadUsbPlayScript
 | ||||||
|  |     {3, DolphinAppU2f}, // DolphinDeedU2fAuthorized
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed) { | static uint8_t dolphin_deed_limits[] = { | ||||||
|     furi_assert(deed < DolphinDeedMax); |     15, // DolphinAppSubGhz
 | ||||||
|     return &dolphin_deed_weights[deed]; |     15, // DolphinAppRfid
 | ||||||
|  |     15, // DolphinAppNfc
 | ||||||
|  |     15, // DolphinAppIr
 | ||||||
|  |     15, // DolphinAppIbutton
 | ||||||
|  |     15, // DolphinAppBadusb
 | ||||||
|  |     15, // DolphinAppU2f
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | _Static_assert(COUNT_OF(dolphin_deed_weights) == DolphinDeedMAX, "dolphin_deed_weights size error"); | ||||||
|  | _Static_assert(COUNT_OF(dolphin_deed_limits) == DolphinAppMAX, "dolphin_deed_limits size error"); | ||||||
|  | 
 | ||||||
|  | uint8_t dolphin_deed_get_weight(DolphinDeed deed) { | ||||||
|  |     furi_check(deed < DolphinDeedMAX); | ||||||
|  |     return dolphin_deed_weights[deed].icounter; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DolphinApp dolphin_deed_get_app(DolphinDeed deed) { | ||||||
|  |     furi_check(deed < DolphinDeedMAX); | ||||||
|  |     return dolphin_deed_weights[deed].app; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t dolphin_deed_get_app_limit(DolphinApp app) { | ||||||
|  |     furi_check(app < DolphinAppMAX); | ||||||
|  |     return dolphin_deed_limits[app]; | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,23 +2,73 @@ | |||||||
| 
 | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| /* Countable deed that affects icounter*/ | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     // iButton
 |     DolphinAppSubGhz, | ||||||
|     DolphinDeedIButtonRead, |     DolphinAppRfid, | ||||||
|     DolphinDeedIButtonWrite, |     DolphinAppNfc, | ||||||
|     DolphinDeedIButtonEmulate, |     DolphinAppIr, | ||||||
|     // for debug
 |     DolphinAppIbutton, | ||||||
|     DolphinDeedWrong, |     DolphinAppBadusb, | ||||||
|     // Special value, do not use
 |     DolphinAppU2f, | ||||||
|     DolphinDeedMax |     DolphinAppMAX, | ||||||
|  | } DolphinApp; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     DolphinDeedSubGhzReceiverInfo, | ||||||
|  |     DolphinDeedSubGhzSave, | ||||||
|  |     DolphinDeedSubGhzRawRec, | ||||||
|  |     DolphinDeedSubGhzAddManually, | ||||||
|  |     DolphinDeedSubGhzSend, | ||||||
|  |     DolphinDeedSubGhzFrequencyAnalyzer, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedRfidRead, | ||||||
|  |     DolphinDeedRfidReadSuccess, | ||||||
|  |     DolphinDeedRfidSave, | ||||||
|  |     DolphinDeedRfidEmulate, | ||||||
|  |     DolphinDeedRfidAdd, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedNfcRead, | ||||||
|  |     DolphinDeedNfcReadSuccess, | ||||||
|  |     DolphinDeedNfcSave, | ||||||
|  |     DolphinDeedNfcEmulate, | ||||||
|  |     DolphinDeedNfcAdd, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedIrSend, | ||||||
|  |     DolphinDeedIrLearnSuccess, | ||||||
|  |     DolphinDeedIrSave, | ||||||
|  |     DolphinDeedIrBruteForce, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedIbuttonRead, | ||||||
|  |     DolphinDeedIbuttonReadSuccess, | ||||||
|  |     DolphinDeedIbuttonSave, | ||||||
|  |     DolphinDeedIbuttonEmulate, | ||||||
|  |     DolphinDeedIbuttonAdd, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedBadUsbPlayScript, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedU2fAuthorized, | ||||||
|  | 
 | ||||||
|  |     DolphinDeedMAX | ||||||
| } DolphinDeed; | } DolphinDeed; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     int32_t icounter; // how many icounter get by Deed
 |     uint8_t icounter; | ||||||
|     int32_t butthurt; // how many icounter get by Deed
 |     DolphinApp app; | ||||||
|     uint32_t limit_value; // how many deeds in limit interval
 |  | ||||||
|     uint32_t limit_interval; // interval, in minutes
 |  | ||||||
| } DolphinDeedWeight; | } DolphinDeedWeight; | ||||||
| 
 | 
 | ||||||
| const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed); | typedef struct { | ||||||
|  |     DolphinApp app; | ||||||
|  |     uint8_t icounter_limit; | ||||||
|  | } DolphinDeedLimits; | ||||||
|  | 
 | ||||||
|  | DolphinApp dolphin_deed_get_app(DolphinDeed deed); | ||||||
|  | uint8_t dolphin_deed_get_app_limit(DolphinApp app); | ||||||
|  | uint8_t dolphin_deed_get_weight(DolphinDeed deed); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "dolphin_state.h" | #include "dolphin_state.h" | ||||||
|  | #include "dolphin/helpers/dolphin_deed.h" | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| @ -10,9 +11,8 @@ | |||||||
| #define DOLPHIN_STATE_PATH "/int/dolphin.state" | #define DOLPHIN_STATE_PATH "/int/dolphin.state" | ||||||
| #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 | #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 | ||||||
| #define DOLPHIN_STATE_HEADER_VERSION 0x01 | #define DOLPHIN_STATE_HEADER_VERSION 0x01 | ||||||
| #define DOLPHIN_LVL_THRESHOLD 20.0f | #define LEVEL2_THRESHOLD 735 | ||||||
| #define LEVEL2_THRESHOLD 20 | #define LEVEL3_THRESHOLD 2940 | ||||||
| #define LEVEL3_THRESHOLD 100 |  | ||||||
| #define BUTTHURT_MAX 14 | #define BUTTHURT_MAX 14 | ||||||
| #define BUTTHURT_MIN 0 | #define BUTTHURT_MIN 0 | ||||||
| 
 | 
 | ||||||
| @ -125,50 +125,68 @@ uint32_t dolphin_state_xp_to_levelup(uint32_t icounter) { | |||||||
|     return threshold - icounter; |     return threshold - icounter; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) { | void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) { | ||||||
|     const DolphinDeedWeight* deed_weight = dolphin_deed_weight(deed); |     DolphinApp app = dolphin_deed_get_app(deed); | ||||||
|     int32_t icounter = dolphin_state->data.icounter + deed_weight->icounter; |     int8_t weight_limit = | ||||||
|     bool level_up = false; |         dolphin_deed_get_app_limit(app) - dolphin_state->data.icounter_daily_limit[app]; | ||||||
|     bool mood_changed = false; |     uint8_t deed_weight = CLAMP(dolphin_deed_get_weight(deed), weight_limit, 0); | ||||||
| 
 |  | ||||||
|     if(icounter <= 0) { |  | ||||||
|         icounter = 0; |  | ||||||
|         if(dolphin_state->data.icounter == 0) { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     uint8_t xp_to_levelup = dolphin_state_xp_to_levelup(dolphin_state->data.icounter); |     uint8_t xp_to_levelup = dolphin_state_xp_to_levelup(dolphin_state->data.icounter); | ||||||
|     if(xp_to_levelup) { |     if(xp_to_levelup) { | ||||||
|         level_up = true; |         deed_weight = MIN(xp_to_levelup, deed_weight); | ||||||
|         dolphin_state->data.icounter += MIN(xp_to_levelup, deed_weight->icounter); |         dolphin_state->data.icounter += deed_weight; | ||||||
|  |         dolphin_state->data.icounter_daily_limit[app] += deed_weight; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     uint32_t new_butthurt = CLAMP( |     /* decrease butthurt:
 | ||||||
|         ((int32_t)dolphin_state->data.butthurt) + deed_weight->butthurt, |      * 0 deeds accumulating --> 0 butthurt | ||||||
|         BUTTHURT_MAX, |      * +1....+15 deeds accumulating --> -1 butthurt | ||||||
|         BUTTHURT_MIN); |      * +16...+30 deeds accumulating --> -1 butthurt | ||||||
|  |      * +31...+45 deeds accumulating --> -1 butthurt | ||||||
|  |      * +46...... deeds accumulating --> -1 butthurt | ||||||
|  |      * -4 butthurt per day is maximum | ||||||
|  |      * */ | ||||||
|  |     uint8_t butthurt_icounter_level_old = dolphin_state->data.butthurt_daily_limit / 15 + | ||||||
|  |                                           !!(dolphin_state->data.butthurt_daily_limit % 15); | ||||||
|  |     dolphin_state->data.butthurt_daily_limit = | ||||||
|  |         CLAMP(dolphin_state->data.butthurt_daily_limit + deed_weight, 46, 0); | ||||||
|  |     uint8_t butthurt_icounter_level_new = dolphin_state->data.butthurt_daily_limit / 15 + | ||||||
|  |                                           !!(dolphin_state->data.butthurt_daily_limit % 15); | ||||||
|  |     int32_t new_butthurt = ((int32_t)dolphin_state->data.butthurt) - | ||||||
|  |                            (butthurt_icounter_level_old != butthurt_icounter_level_new); | ||||||
|  |     new_butthurt = CLAMP(new_butthurt, BUTTHURT_MAX, BUTTHURT_MIN); | ||||||
| 
 | 
 | ||||||
|     if(!!dolphin_state->data.butthurt != !!new_butthurt) { |  | ||||||
|         mood_changed = true; |  | ||||||
|     } |  | ||||||
|     dolphin_state->data.butthurt = new_butthurt; |     dolphin_state->data.butthurt = new_butthurt; | ||||||
|     dolphin_state->data.timestamp = dolphin_state_timestamp(); |     dolphin_state->data.timestamp = dolphin_state_timestamp(); | ||||||
|     dolphin_state->dirty = true; |     dolphin_state->dirty = true; | ||||||
| 
 | 
 | ||||||
|     return level_up || mood_changed; |     FURI_LOG_D( | ||||||
|  |         TAG, | ||||||
|  |         "icounter %d, butthurt %d", | ||||||
|  |         dolphin_state->data.icounter, | ||||||
|  |         dolphin_state->data.butthurt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void dolphin_state_butthurted(DolphinState* dolphin_state) { | void dolphin_state_butthurted(DolphinState* dolphin_state) { | ||||||
|     if(dolphin_state->data.butthurt < BUTTHURT_MAX) { |     if(dolphin_state->data.butthurt < BUTTHURT_MAX) { | ||||||
|         dolphin_state->data.butthurt++; |         dolphin_state->data.butthurt++; | ||||||
|         FURI_LOG_I("DolphinState", "Increasing butthurt"); |  | ||||||
|         dolphin_state->data.timestamp = dolphin_state_timestamp(); |         dolphin_state->data.timestamp = dolphin_state_timestamp(); | ||||||
|         dolphin_state->dirty = true; |         dolphin_state->dirty = true; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void dolphin_state_increase_level(DolphinState* dolphin_state) { | void dolphin_state_increase_level(DolphinState* dolphin_state) { | ||||||
|  |     furi_assert(dolphin_state_is_levelup(dolphin_state->data.icounter)); | ||||||
|     ++dolphin_state->data.icounter; |     ++dolphin_state->data.icounter; | ||||||
|     dolphin_state->dirty = true; |     dolphin_state->dirty = true; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void dolphin_state_clear_limits(DolphinState* dolphin_state) { | ||||||
|  |     furi_assert(dolphin_state); | ||||||
|  | 
 | ||||||
|  |     for(int i = 0; i < DolphinAppMAX; ++i) { | ||||||
|  |         dolphin_state->data.icounter_daily_limit[i] = 0; | ||||||
|  |     } | ||||||
|  |     dolphin_state->data.butthurt_daily_limit = 0; | ||||||
|  |     dolphin_state->dirty = true; | ||||||
|  | } | ||||||
|  | |||||||
| @ -7,10 +7,8 @@ | |||||||
| 
 | 
 | ||||||
| typedef struct DolphinState DolphinState; | typedef struct DolphinState DolphinState; | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint32_t limit_ibutton; |     uint8_t icounter_daily_limit[DolphinAppMAX]; | ||||||
|     uint32_t limit_nfc; |     uint8_t butthurt_daily_limit; | ||||||
|     uint32_t limit_ir; |  | ||||||
|     uint32_t limit_rfid; |  | ||||||
| 
 | 
 | ||||||
|     uint32_t flags; |     uint32_t flags; | ||||||
|     uint32_t icounter; |     uint32_t icounter; | ||||||
| @ -31,11 +29,11 @@ bool dolphin_state_save(DolphinState* dolphin_state); | |||||||
| 
 | 
 | ||||||
| bool dolphin_state_load(DolphinState* dolphin_state); | bool dolphin_state_load(DolphinState* dolphin_state); | ||||||
| 
 | 
 | ||||||
| void dolphin_state_clear(DolphinState* dolphin_state); | void dolphin_state_clear_limits(DolphinState* dolphin_state); | ||||||
| 
 | 
 | ||||||
| uint64_t dolphin_state_timestamp(); | uint64_t dolphin_state_timestamp(); | ||||||
| 
 | 
 | ||||||
| bool dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); | void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); | ||||||
| 
 | 
 | ||||||
| void dolphin_state_butthurted(DolphinState* dolphin_state); | void dolphin_state_butthurted(DolphinState* dolphin_state); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								applications/gui/canvas.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										17
									
								
								applications/gui/canvas.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -4,6 +4,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
|  | #include <stdint.h> | ||||||
| #include <u8g2_glue.h> | #include <u8g2_glue.h> | ||||||
| 
 | 
 | ||||||
| const CanvasFontParameters canvas_font_params[FontTotalNumber] = { | const CanvasFontParameters canvas_font_params[FontTotalNumber] = { | ||||||
| @ -202,6 +203,22 @@ uint8_t canvas_glyph_width(Canvas* canvas, char symbol) { | |||||||
|     return u8g2_GetGlyphWidth(&canvas->fb, symbol); |     return u8g2_GetGlyphWidth(&canvas->fb, symbol); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void canvas_draw_bitmap( | ||||||
|  |     Canvas* canvas, | ||||||
|  |     uint8_t x, | ||||||
|  |     uint8_t y, | ||||||
|  |     uint8_t width, | ||||||
|  |     uint8_t height, | ||||||
|  |     const uint8_t* compressed_bitmap_data) { | ||||||
|  |     furi_assert(canvas); | ||||||
|  | 
 | ||||||
|  |     x += canvas->offset_x; | ||||||
|  |     y += canvas->offset_y; | ||||||
|  |     uint8_t* bitmap_data = NULL; | ||||||
|  |     furi_hal_compress_icon_decode(compressed_bitmap_data, &bitmap_data); | ||||||
|  |     u8g2_DrawXBM(&canvas->fb, x, y, width, height, bitmap_data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void canvas_draw_icon_animation( | void canvas_draw_icon_animation( | ||||||
|     Canvas* canvas, |     Canvas* canvas, | ||||||
|     uint8_t x, |     uint8_t x, | ||||||
|  | |||||||
| @ -178,6 +178,23 @@ uint16_t canvas_string_width(Canvas* canvas, const char* str); | |||||||
|  */ |  */ | ||||||
| uint8_t canvas_glyph_width(Canvas* canvas, char symbol); | uint8_t canvas_glyph_width(Canvas* canvas, char symbol); | ||||||
| 
 | 
 | ||||||
|  | /** Draw bitmap picture at position defined by x,y.
 | ||||||
|  |  * | ||||||
|  |  * @param      canvas                   Canvas instance | ||||||
|  |  * @param      x                        x coordinate | ||||||
|  |  * @param      y                        y coordinate | ||||||
|  |  * @param      width                    width of bitmap | ||||||
|  |  * @param      height                   height of bitmap | ||||||
|  |  * @param      compressed_bitmap_data   compressed bitmap data | ||||||
|  |  */ | ||||||
|  | void canvas_draw_bitmap( | ||||||
|  |     Canvas* canvas, | ||||||
|  |     uint8_t x, | ||||||
|  |     uint8_t y, | ||||||
|  |     uint8_t width, | ||||||
|  |     uint8_t height, | ||||||
|  |     const uint8_t* compressed_bitmap_data); | ||||||
|  | 
 | ||||||
| /** Draw animation at position defined by x,y.
 | /** Draw animation at position defined by x,y.
 | ||||||
|  * |  * | ||||||
|  * @param      canvas          Canvas instance |  * @param      canvas          Canvas instance | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
|  * GUI: internal Icon API |  * GUI: internal Icon API | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #pragma once | ||||||
| #include "icon.h" | #include "icon.h" | ||||||
| 
 | 
 | ||||||
| struct Icon { | struct Icon { | ||||||
|  | |||||||
| @ -1,166 +0,0 @@ | |||||||
| #include "gui/view.h" |  | ||||||
| #include "furi/memmgr.h" |  | ||||||
| #include "view_composed.h" |  | ||||||
| #include "view_i.h" |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     View* bottom; |  | ||||||
|     View* top; |  | ||||||
|     bool top_enabled; |  | ||||||
| } ViewComposedModel; |  | ||||||
| 
 |  | ||||||
| struct ViewComposed { |  | ||||||
|     View* view; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void view_composed_draw(Canvas* canvas, void* model); |  | ||||||
| static bool view_composed_input(InputEvent* event, void* context); |  | ||||||
| 
 |  | ||||||
| static void view_composed_update_callback(View* view_top_or_bottom, void* context) { |  | ||||||
|     furi_assert(view_top_or_bottom); |  | ||||||
|     furi_assert(context); |  | ||||||
| 
 |  | ||||||
|     View* view_composed_view = context; |  | ||||||
|     view_composed_view->update_callback( |  | ||||||
|         view_composed_view, view_composed_view->update_callback_context); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void view_composed_enter(void* context) { |  | ||||||
|     furi_assert(context); |  | ||||||
| 
 |  | ||||||
|     ViewComposed* view_composed = context; |  | ||||||
|     ViewComposedModel* model = view_get_model(view_composed->view); |  | ||||||
| 
 |  | ||||||
|     /* if more than 1 composed views hold same view it has to reassign update_callback_context */ |  | ||||||
|     if(model->bottom) { |  | ||||||
|         view_set_update_callback_context(model->bottom, view_composed->view); |  | ||||||
|         if(model->bottom->enter_callback) { |  | ||||||
|             model->bottom->enter_callback(model->bottom->context); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if(model->top) { |  | ||||||
|         view_set_update_callback_context(model->top, view_composed->view); |  | ||||||
|         if(model->top->enter_callback) { |  | ||||||
|             model->top->enter_callback(model->top->context); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     view_commit_model(view_composed->view, false); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void view_composed_exit(void* context) { |  | ||||||
|     furi_assert(context); |  | ||||||
| 
 |  | ||||||
|     ViewComposed* view_composed = context; |  | ||||||
|     ViewComposedModel* model = view_get_model(view_composed->view); |  | ||||||
| 
 |  | ||||||
|     if(model->bottom) { |  | ||||||
|         if(model->bottom->exit_callback) { |  | ||||||
|             model->bottom->exit_callback(model->bottom->context); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if(model->top) { |  | ||||||
|         if(model->top->exit_callback) { |  | ||||||
|             model->top->exit_callback(model->top->context); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     view_commit_model(view_composed->view, false); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ViewComposed* view_composed_alloc(void) { |  | ||||||
|     ViewComposed* view_composed = furi_alloc(sizeof(ViewComposed)); |  | ||||||
|     view_composed->view = view_alloc(); |  | ||||||
| 
 |  | ||||||
|     view_allocate_model(view_composed->view, ViewModelTypeLocking, sizeof(ViewComposedModel)); |  | ||||||
|     view_set_draw_callback(view_composed->view, view_composed_draw); |  | ||||||
|     view_set_input_callback(view_composed->view, view_composed_input); |  | ||||||
|     view_set_context(view_composed->view, view_composed); |  | ||||||
|     view_set_enter_callback(view_composed->view, view_composed_enter); |  | ||||||
|     view_set_exit_callback(view_composed->view, view_composed_exit); |  | ||||||
|     return view_composed; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void view_composed_free(ViewComposed* view_composed) { |  | ||||||
|     furi_assert(view_composed); |  | ||||||
| 
 |  | ||||||
|     ViewComposedModel* view_composed_model = view_get_model(view_composed->view); |  | ||||||
|     view_set_update_callback(view_composed_model->bottom, NULL); |  | ||||||
|     view_set_update_callback_context(view_composed_model->bottom, NULL); |  | ||||||
|     view_set_update_callback(view_composed_model->top, NULL); |  | ||||||
|     view_set_update_callback_context(view_composed_model->top, NULL); |  | ||||||
|     view_commit_model(view_composed->view, true); |  | ||||||
| 
 |  | ||||||
|     view_free(view_composed->view); |  | ||||||
|     free(view_composed); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void view_composed_draw(Canvas* canvas, void* model) { |  | ||||||
|     furi_assert(model); |  | ||||||
| 
 |  | ||||||
|     ViewComposedModel* view_composed_model = model; |  | ||||||
| 
 |  | ||||||
|     view_draw(view_composed_model->bottom, canvas); |  | ||||||
|     if(view_composed_model->top_enabled && view_composed_model->top) { |  | ||||||
|         view_draw(view_composed_model->top, canvas); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static bool view_composed_input(InputEvent* event, void* context) { |  | ||||||
|     furi_assert(event); |  | ||||||
|     furi_assert(context); |  | ||||||
| 
 |  | ||||||
|     ViewComposed* view_composed = context; |  | ||||||
|     ViewComposedModel* view_composed_model = view_get_model(view_composed->view); |  | ||||||
|     bool consumed = false; |  | ||||||
| 
 |  | ||||||
|     if(view_composed_model->top_enabled && view_composed_model->top) { |  | ||||||
|         consumed = view_input(view_composed_model->top, event); |  | ||||||
|     } |  | ||||||
|     if(!consumed) { |  | ||||||
|         consumed = view_input(view_composed_model->bottom, event); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     view_commit_model(view_composed->view, false); |  | ||||||
| 
 |  | ||||||
|     return consumed; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void view_composed_top_enable(ViewComposed* view_composed, bool enable) { |  | ||||||
|     furi_assert(view_composed); |  | ||||||
| 
 |  | ||||||
|     ViewComposedModel* view_composed_model = view_get_model(view_composed->view); |  | ||||||
|     bool update = (view_composed_model->top_enabled != enable); |  | ||||||
|     view_composed_model->top_enabled = enable; |  | ||||||
|     view_commit_model(view_composed->view, update); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void view_composed_tie_views(ViewComposed* view_composed, View* view_bottom, View* view_top) { |  | ||||||
|     furi_assert(view_composed); |  | ||||||
|     furi_assert(view_bottom); |  | ||||||
| 
 |  | ||||||
|     ViewComposedModel* view_composed_model = view_get_model(view_composed->view); |  | ||||||
| 
 |  | ||||||
|     if(view_composed_model->bottom) { |  | ||||||
|         view_set_update_callback(view_composed_model->bottom, NULL); |  | ||||||
|         view_set_update_callback_context(view_composed_model->bottom, NULL); |  | ||||||
|     } |  | ||||||
|     if(view_composed_model->top) { |  | ||||||
|         view_set_update_callback(view_composed_model->top, NULL); |  | ||||||
|         view_set_update_callback_context(view_composed_model->top, NULL); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     view_composed_model->bottom = view_bottom; |  | ||||||
|     view_set_update_callback(view_bottom, view_composed_update_callback); |  | ||||||
|     view_set_update_callback_context(view_bottom, view_composed->view); |  | ||||||
|     view_composed_model->top = view_top; |  | ||||||
|     view_set_update_callback(view_top, view_composed_update_callback); |  | ||||||
|     view_set_update_callback_context(view_top, view_composed->view); |  | ||||||
| 
 |  | ||||||
|     view_commit_model(view_composed->view, true); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| View* view_composed_get_view(ViewComposed* view_composed) { |  | ||||||
|     furi_assert(view_composed); |  | ||||||
|     return view_composed->view; |  | ||||||
| } |  | ||||||
| @ -1,12 +0,0 @@ | |||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <stdbool.h> |  | ||||||
| #include "view.h" |  | ||||||
| 
 |  | ||||||
| typedef struct ViewComposed ViewComposed; |  | ||||||
| 
 |  | ||||||
| ViewComposed* view_composed_alloc(void); |  | ||||||
| void view_composed_free(ViewComposed* view_composed); |  | ||||||
| void view_composed_top_enable(ViewComposed* view_composed, bool enable); |  | ||||||
| void view_composed_tie_views(ViewComposed* view_composed, View* view_bottom, View* view_top); |  | ||||||
| View* view_composed_get_view(ViewComposed* view_composed); |  | ||||||
							
								
								
									
										165
									
								
								applications/gui/view_stack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								applications/gui/view_stack.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,165 @@ | |||||||
|  | #include "gui/view.h" | ||||||
|  | #include "furi/memmgr.h" | ||||||
|  | #include "view_stack.h" | ||||||
|  | #include "view_i.h" | ||||||
|  | 
 | ||||||
|  | #define MAX_VIEWS 3 | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     View* views[MAX_VIEWS]; | ||||||
|  | } ViewStackModel; | ||||||
|  | 
 | ||||||
|  | struct ViewStack { | ||||||
|  |     View* view; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void view_stack_draw(Canvas* canvas, void* model); | ||||||
|  | static bool view_stack_input(InputEvent* event, void* context); | ||||||
|  | 
 | ||||||
|  | static void view_stack_update_callback(View* view_top_or_bottom, void* context) { | ||||||
|  |     furi_assert(view_top_or_bottom); | ||||||
|  |     furi_assert(context); | ||||||
|  | 
 | ||||||
|  |     View* view_stack_view = context; | ||||||
|  |     if(view_stack_view->update_callback) { | ||||||
|  |         view_stack_view->update_callback( | ||||||
|  |             view_stack_view, view_stack_view->update_callback_context); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void view_stack_enter(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  | 
 | ||||||
|  |     ViewStack* view_stack = context; | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  | 
 | ||||||
|  |     /* if more than 1 composite views hold same view they have to reassign update_callback_context */ | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(model->views[i]) { | ||||||
|  |             view_set_update_callback_context(model->views[i], view_stack->view); | ||||||
|  |             if(model->views[i]->enter_callback) { | ||||||
|  |                 model->views[i]->enter_callback(model->views[i]->context); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     view_commit_model(view_stack->view, false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void view_stack_exit(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  | 
 | ||||||
|  |     ViewStack* view_stack = context; | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  | 
 | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(model->views[i] && model->views[i]->exit_callback) { | ||||||
|  |             model->views[i]->exit_callback(model->views[i]->context); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     view_commit_model(view_stack->view, false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ViewStack* view_stack_alloc(void) { | ||||||
|  |     ViewStack* view_stack = furi_alloc(sizeof(ViewStack)); | ||||||
|  |     view_stack->view = view_alloc(); | ||||||
|  | 
 | ||||||
|  |     view_allocate_model(view_stack->view, ViewModelTypeLocking, sizeof(ViewStackModel)); | ||||||
|  |     view_set_draw_callback(view_stack->view, view_stack_draw); | ||||||
|  |     view_set_input_callback(view_stack->view, view_stack_input); | ||||||
|  |     view_set_context(view_stack->view, view_stack); | ||||||
|  |     view_set_enter_callback(view_stack->view, view_stack_enter); | ||||||
|  |     view_set_exit_callback(view_stack->view, view_stack_exit); | ||||||
|  |     return view_stack; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void view_stack_free(ViewStack* view_stack) { | ||||||
|  |     furi_assert(view_stack); | ||||||
|  | 
 | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(model->views[i]) { | ||||||
|  |             view_set_update_callback(model->views[i], NULL); | ||||||
|  |             view_set_update_callback_context(model->views[i], NULL); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     view_commit_model(view_stack->view, false); | ||||||
|  | 
 | ||||||
|  |     view_free(view_stack->view); | ||||||
|  |     free(view_stack); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void view_stack_draw(Canvas* canvas, void* _model) { | ||||||
|  |     furi_assert(_model); | ||||||
|  | 
 | ||||||
|  |     ViewStackModel* model = _model; | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(model->views[i]) { | ||||||
|  |             view_draw(model->views[i], canvas); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool view_stack_input(InputEvent* event, void* context) { | ||||||
|  |     furi_assert(event); | ||||||
|  |     furi_assert(context); | ||||||
|  | 
 | ||||||
|  |     bool consumed = false; | ||||||
|  |     ViewStack* view_stack = context; | ||||||
|  | 
 | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  |     for(int i = MAX_VIEWS - 1; !consumed && (i >= 0); --i) { | ||||||
|  |         if(model->views[i]) { | ||||||
|  |             consumed = view_input(model->views[i], event); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     view_commit_model(view_stack->view, false); | ||||||
|  | 
 | ||||||
|  |     return consumed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void view_stack_add_view(ViewStack* view_stack, View* view) { | ||||||
|  |     furi_assert(view_stack); | ||||||
|  |     furi_assert(view); | ||||||
|  | 
 | ||||||
|  |     bool result = false; | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(!model->views[i]) { | ||||||
|  |             model->views[i] = view; | ||||||
|  |             view_set_update_callback(model->views[i], view_stack_update_callback); | ||||||
|  |             view_set_update_callback_context(model->views[i], view_stack->view); | ||||||
|  |             result = true; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     view_commit_model(view_stack->view, result); | ||||||
|  |     furi_assert(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void view_stack_remove_view(ViewStack* view_stack, View* view) { | ||||||
|  |     furi_assert(view_stack); | ||||||
|  |     furi_assert(view); | ||||||
|  | 
 | ||||||
|  |     /* Removing view on-the-go is dangerous, but it is protected with
 | ||||||
|  |      * Locking model, so system is consistent at any time. */ | ||||||
|  |     bool result = false; | ||||||
|  |     ViewStackModel* model = view_get_model(view_stack->view); | ||||||
|  |     for(int i = 0; i < MAX_VIEWS; ++i) { | ||||||
|  |         if(model->views[i] == view) { | ||||||
|  |             view_set_update_callback(model->views[i], NULL); | ||||||
|  |             view_set_update_callback_context(model->views[i], NULL); | ||||||
|  |             model->views[i] = NULL; | ||||||
|  |             result = true; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     view_commit_model(view_stack->view, result); | ||||||
|  |     furi_assert(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | View* view_stack_get_view(ViewStack* view_stack) { | ||||||
|  |     furi_assert(view_stack); | ||||||
|  |     return view_stack->view; | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								applications/gui/view_stack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								applications/gui/view_stack.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | /**
 | ||||||
|  |  * @file view_stack.h | ||||||
|  |  * GUI: ViewStack API | ||||||
|  |  * | ||||||
|  |  * ViewStack accumulates several Views in one stack. | ||||||
|  |  * Draw callbacks are called sequenctially starting from | ||||||
|  |  * first added. Input callbacks are called in reverse order. | ||||||
|  |  * Consumed input is not passed on underlying layers. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include "view.h" | ||||||
|  | 
 | ||||||
|  | /** ViewStack, anonymous type. */ | ||||||
|  | typedef struct ViewStack ViewStack; | ||||||
|  | 
 | ||||||
|  | /** Allocate and init ViewStack
 | ||||||
|  |  * | ||||||
|  |  * @return      ViewStack instance | ||||||
|  |  */ | ||||||
|  | ViewStack* view_stack_alloc(void); | ||||||
|  | 
 | ||||||
|  | /** Free ViewStack instance
 | ||||||
|  |  * | ||||||
|  |  * @param       view_stack  instance | ||||||
|  |  */ | ||||||
|  | void view_stack_free(ViewStack* view_stack); | ||||||
|  | 
 | ||||||
|  | /** Get View of ViewStack.
 | ||||||
|  |  * Should this View to any view manager such as | ||||||
|  |  * ViewDispatcher or ViewHolder. | ||||||
|  |  * | ||||||
|  |  * @param       view_stack  instance | ||||||
|  |  */ | ||||||
|  | View* view_stack_get_view(ViewStack* view_stack); | ||||||
|  | 
 | ||||||
|  | /** Add View to ViewStack.
 | ||||||
|  |  * Adds View on top of ViewStack. | ||||||
|  |  * | ||||||
|  |  * @param       view_stack  instance | ||||||
|  |  * @view        view        view to add | ||||||
|  |  */ | ||||||
|  | void view_stack_add_view(ViewStack* view_stack, View* view); | ||||||
|  | 
 | ||||||
|  | /** Remove any View in ViewStack.
 | ||||||
|  |  * If no View to remove found - ignore. | ||||||
|  |  * | ||||||
|  |  * @param       view_stack  instance | ||||||
|  |  * @view        view        view to remove | ||||||
|  |  */ | ||||||
|  | void view_stack_remove_view(ViewStack* view_stack, View* view); | ||||||
| @ -3,6 +3,7 @@ | |||||||
| #include "../ibutton_view_manager.h" | #include "../ibutton_view_manager.h" | ||||||
| #include "../ibutton_event.h" | #include "../ibutton_event.h" | ||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneAddValue::on_enter(iButtonApp* app) { | void iButtonSceneAddValue::on_enter(iButtonApp* app) { | ||||||
|     iButtonAppViewManager* view_manager = app->get_view_manager(); |     iButtonAppViewManager* view_manager = app->get_view_manager(); | ||||||
| @ -20,6 +21,7 @@ bool iButtonSceneAddValue::on_event(iButtonApp* app, iButtonEvent* event) { | |||||||
|     bool consumed = false; |     bool consumed = false; | ||||||
| 
 | 
 | ||||||
|     if(event->type == iButtonEvent::Type::EventTypeByteEditResult) { |     if(event->type == iButtonEvent::Type::EventTypeByteEditResult) { | ||||||
|  |         DOLPHIN_DEED(DolphinDeedIbuttonAdd); | ||||||
|         app->switch_to_next_scene(iButtonApp::Scene::SceneSaveName); |         app->switch_to_next_scene(iButtonApp::Scene::SceneSaveName); | ||||||
|         consumed = true; |         consumed = true; | ||||||
|     } |     } | ||||||
| @ -42,4 +44,4 @@ void iButtonSceneAddValue::byte_input_callback(void* context) { | |||||||
|     event.type = iButtonEvent::Type::EventTypeByteEditResult; |     event.type = iButtonEvent::Type::EventTypeByteEditResult; | ||||||
|     memcpy(app->get_key()->get_data(), this->new_key_data, app->get_key()->get_type_data_size()); |     memcpy(app->get_key()->get_data(), this->new_key_data, app->get_key()->get_type_data_size()); | ||||||
|     app->get_view_manager()->send_event(&event); |     app->get_view_manager()->send_event(&event); | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
| #include "../ibutton_view_manager.h" | #include "../ibutton_view_manager.h" | ||||||
| #include "../ibutton_event.h" | #include "../ibutton_event.h" | ||||||
| #include "../ibutton_key.h" | #include "../ibutton_key.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneEmulate::on_enter(iButtonApp* app) { | void iButtonSceneEmulate::on_enter(iButtonApp* app) { | ||||||
| @ -12,6 +13,7 @@ void iButtonSceneEmulate::on_enter(iButtonApp* app) { | |||||||
|     uint8_t* key_data = key->get_data(); |     uint8_t* key_data = key->get_data(); | ||||||
|     const char* key_name = key->get_name(); |     const char* key_name = key->get_name(); | ||||||
|     uint8_t line_count = 2; |     uint8_t line_count = 2; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIbuttonEmulate); | ||||||
| 
 | 
 | ||||||
|     // check that stored key has name
 |     // check that stored key has name
 | ||||||
|     if(strcmp(key_name, "") != 0) { |     if(strcmp(key_name, "") != 0) { | ||||||
| @ -90,4 +92,4 @@ void iButtonSceneEmulate::on_exit(iButtonApp* app) { | |||||||
|     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); |     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); | ||||||
|     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); |     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); | ||||||
|     popup_set_icon(popup, 0, 0, NULL); |     popup_set_icon(popup, 0, 0, NULL); | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,10 +2,12 @@ | |||||||
| #include "../ibutton_app.h" | #include "../ibutton_app.h" | ||||||
| #include "../ibutton_view_manager.h" | #include "../ibutton_view_manager.h" | ||||||
| #include "../ibutton_event.h" | #include "../ibutton_event.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneRead::on_enter(iButtonApp* app) { | void iButtonSceneRead::on_enter(iButtonApp* app) { | ||||||
|     iButtonAppViewManager* view_manager = app->get_view_manager(); |     iButtonAppViewManager* view_manager = app->get_view_manager(); | ||||||
|     Popup* popup = view_manager->get_popup(); |     Popup* popup = view_manager->get_popup(); | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIbuttonRead); | ||||||
| 
 | 
 | ||||||
|     popup_set_header(popup, "iButton", 95, 26, AlignCenter, AlignBottom); |     popup_set_header(popup, "iButton", 95, 26, AlignCenter, AlignBottom); | ||||||
|     popup_set_text(popup, "waiting\nfor key ...", 95, 30, AlignCenter, AlignTop); |     popup_set_text(popup, "waiting\nfor key ...", 95, 30, AlignCenter, AlignTop); | ||||||
| @ -50,4 +52,4 @@ void iButtonSceneRead::on_exit(iButtonApp* app) { | |||||||
|     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); |     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); | ||||||
|     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); |     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); | ||||||
|     popup_set_icon(popup, 0, 0, NULL); |     popup_set_icon(popup, 0, 0, NULL); | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,12 +2,14 @@ | |||||||
| #include "../ibutton_app.h" | #include "../ibutton_app.h" | ||||||
| #include "../ibutton_view_manager.h" | #include "../ibutton_view_manager.h" | ||||||
| #include "../ibutton_event.h" | #include "../ibutton_event.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneReadSuccess::on_enter(iButtonApp* app) { | void iButtonSceneReadSuccess::on_enter(iButtonApp* app) { | ||||||
|     iButtonAppViewManager* view_manager = app->get_view_manager(); |     iButtonAppViewManager* view_manager = app->get_view_manager(); | ||||||
|     DialogEx* dialog_ex = view_manager->get_dialog_ex(); |     DialogEx* dialog_ex = view_manager->get_dialog_ex(); | ||||||
|     auto callback = cbc::obtain_connector(this, &iButtonSceneReadSuccess::dialog_ex_callback); |     auto callback = cbc::obtain_connector(this, &iButtonSceneReadSuccess::dialog_ex_callback); | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIbuttonReadSuccess); | ||||||
| 
 | 
 | ||||||
|     iButtonKey* key = app->get_key(); |     iButtonKey* key = app->get_key(); | ||||||
|     uint8_t* key_data = key->get_data(); |     uint8_t* key_data = key->get_data(); | ||||||
| @ -87,4 +89,4 @@ void iButtonSceneReadSuccess::dialog_ex_callback(DialogExResult result, void* co | |||||||
|     event.payload.dialog_result = result; |     event.payload.dialog_result = result; | ||||||
| 
 | 
 | ||||||
|     app->get_view_manager()->send_event(&event); |     app->get_view_manager()->send_event(&event); | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,12 +3,14 @@ | |||||||
| #include "../ibutton_view_manager.h" | #include "../ibutton_view_manager.h" | ||||||
| #include "../ibutton_event.h" | #include "../ibutton_event.h" | ||||||
| #include "../ibutton_key.h" | #include "../ibutton_key.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneSaveSuccess::on_enter(iButtonApp* app) { | void iButtonSceneSaveSuccess::on_enter(iButtonApp* app) { | ||||||
|     iButtonAppViewManager* view_manager = app->get_view_manager(); |     iButtonAppViewManager* view_manager = app->get_view_manager(); | ||||||
|     Popup* popup = view_manager->get_popup(); |     Popup* popup = view_manager->get_popup(); | ||||||
|     auto callback = cbc::obtain_connector(this, &iButtonSceneSaveSuccess::popup_callback); |     auto callback = cbc::obtain_connector(this, &iButtonSceneSaveSuccess::popup_callback); | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIbuttonSave); | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); | ||||||
|     popup_set_text(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); |     popup_set_text(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); | ||||||
| @ -51,4 +53,4 @@ void iButtonSceneSaveSuccess::popup_callback(void* context) { | |||||||
|     iButtonEvent event; |     iButtonEvent event; | ||||||
|     event.type = iButtonEvent::Type::EventTypeBack; |     event.type = iButtonEvent::Type::EventTypeBack; | ||||||
|     app->get_view_manager()->send_event(&event); |     app->get_view_manager()->send_event(&event); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,10 +1,12 @@ | |||||||
| #include "../irda_app.h" | #include "../irda_app.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void IrdaAppSceneLearnDone::on_enter(IrdaApp* app) { | void IrdaAppSceneLearnDone::on_enter(IrdaApp* app) { | ||||||
|     IrdaAppViewManager* view_manager = app->get_view_manager(); |     IrdaAppViewManager* view_manager = app->get_view_manager(); | ||||||
|     Popup* popup = view_manager->get_popup(); |     Popup* popup = view_manager->get_popup(); | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIrSave); | ||||||
| 
 | 
 | ||||||
|     if(app->get_learn_new_remote()) { |     if(app->get_learn_new_remote()) { | ||||||
|         popup_set_text(popup, "New remote\ncreated!", 5, 7, AlignLeft, AlignTop); |         popup_set_text(popup, "New remote\ncreated!", 5, 7, AlignLeft, AlignTop); | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| #include <file_worker_cpp.h> | #include <file_worker_cpp.h> | ||||||
| #include "irda.h" | #include "irda.h" | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| static void dialog_result_callback(DialogExResult result, void* context) { | static void dialog_result_callback(DialogExResult result, void* context) { | ||||||
|     auto app = static_cast<IrdaApp*>(context); |     auto app = static_cast<IrdaApp*>(context); | ||||||
| @ -17,6 +18,7 @@ void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) { | |||||||
|     IrdaAppViewManager* view_manager = app->get_view_manager(); |     IrdaAppViewManager* view_manager = app->get_view_manager(); | ||||||
|     DialogEx* dialog_ex = view_manager->get_dialog_ex(); |     DialogEx* dialog_ex = view_manager->get_dialog_ex(); | ||||||
| 
 | 
 | ||||||
|  |     DOLPHIN_DEED(DolphinDeedIrLearnSuccess); | ||||||
|     app->notify_green_on(); |     app->notify_green_on(); | ||||||
| 
 | 
 | ||||||
|     auto signal = app->get_received_signal(); |     auto signal = app->get_received_signal(); | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| #include "gui/modules/button_menu.h" | #include "gui/modules/button_menu.h" | ||||||
| #include "input/input.h" | #include "input/input.h" | ||||||
| #include "irda_worker.h" | #include "irda_worker.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     ButtonIndexPlus = -2, |     ButtonIndexPlus = -2, | ||||||
| @ -106,6 +107,7 @@ bool IrdaAppSceneRemote::on_event(IrdaApp* app, IrdaAppEvent* event) { | |||||||
|                         app->get_irda_worker(), &button_signal.get_message()); |                         app->get_irda_worker(), &button_signal.get_message()); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  |                 DOLPHIN_DEED(DolphinDeedIrSend); | ||||||
|                 irda_worker_tx_start(app->get_irda_worker()); |                 irda_worker_tx_start(app->get_irda_worker()); | ||||||
|             } else if(!pressed && button_pressed) { |             } else if(!pressed && button_pressed) { | ||||||
|                 button_pressed = false; |                 button_pressed = false; | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../irda_app.h" | #include "../irda_app.h" | ||||||
| #include "assets_icons.h" | #include "assets_icons.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include "gui/modules/button_menu.h" | #include "gui/modules/button_menu.h" | ||||||
| #include "gui/modules/button_panel.h" | #include "gui/modules/button_panel.h" | ||||||
| #include "../view/irda_app_brut_view.h" | #include "../view/irda_app_brut_view.h" | ||||||
| @ -84,6 +85,7 @@ bool IrdaAppSceneUniversalCommon::on_event(IrdaApp* app, IrdaAppEvent* event) { | |||||||
|         if(event->type == IrdaAppEvent::Type::ButtonPanelPressed) { |         if(event->type == IrdaAppEvent::Type::ButtonPanelPressed) { | ||||||
|             int record_amount = 0; |             int record_amount = 0; | ||||||
|             if(brute_force.start_bruteforce(event->payload.menu_index, record_amount)) { |             if(brute_force.start_bruteforce(event->payload.menu_index, record_amount)) { | ||||||
|  |                 DOLPHIN_DEED(DolphinDeedIrBruteForce); | ||||||
|                 brute_force_started = true; |                 brute_force_started = true; | ||||||
|                 show_popup(app, record_amount); |                 show_popup(app, record_amount); | ||||||
|             } else { |             } else { | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| #include "lfrfid_app_scene_emulate.h" | #include "lfrfid_app_scene_emulate.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void LfRfidAppSceneEmulate::on_enter(LfRfidApp* app, bool need_restore) { | void LfRfidAppSceneEmulate::on_enter(LfRfidApp* app, bool need_restore) { | ||||||
|     string_init(data_string); |     string_init(data_string); | ||||||
| 
 | 
 | ||||||
|  |     DOLPHIN_DEED(DolphinDeedRfidEmulate); | ||||||
|     const uint8_t* data = app->worker.key.get_data(); |     const uint8_t* data = app->worker.key.get_data(); | ||||||
| 
 | 
 | ||||||
|     for(uint8_t i = 0; i < app->worker.key.get_type_data_count(); i++) { |     for(uint8_t i = 0; i < app->worker.key.get_type_data_count(); i++) { | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| #include "lfrfid_app_scene_read.h" | #include "lfrfid_app_scene_read.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void LfRfidAppSceneRead::on_enter(LfRfidApp* app, bool need_restore) { | void LfRfidAppSceneRead::on_enter(LfRfidApp* app, bool need_restore) { | ||||||
|     auto popup = app->view_controller.get<PopupVM>(); |     auto popup = app->view_controller.get<PopupVM>(); | ||||||
| 
 | 
 | ||||||
|  |     DOLPHIN_DEED(DolphinDeedRfidRead); | ||||||
|     popup->set_header("Reading\nLF RFID", 89, 34, AlignCenter, AlignTop); |     popup->set_header("Reading\nLF RFID", 89, 34, AlignCenter, AlignTop); | ||||||
|     popup->set_icon(0, 3, &I_RFIDDolphinReceive_97x61); |     popup->set_icon(0, 3, &I_RFIDDolphinReceive_97x61); | ||||||
| 
 | 
 | ||||||
| @ -15,6 +17,7 @@ bool LfRfidAppSceneRead::on_event(LfRfidApp* app, LfRfidApp::Event* event) { | |||||||
| 
 | 
 | ||||||
|     if(event->type == LfRfidApp::EventType::Tick) { |     if(event->type == LfRfidApp::EventType::Tick) { | ||||||
|         if(app->worker.read()) { |         if(app->worker.read()) { | ||||||
|  |             DOLPHIN_DEED(DolphinDeedRfidReadSuccess); | ||||||
|             notification_message(app->notification, &sequence_success); |             notification_message(app->notification, &sequence_success); | ||||||
|             app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::ReadSuccess); |             app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::ReadSuccess); | ||||||
|         } else { |         } else { | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "lfrfid_app_scene_save_data.h" | #include "lfrfid_app_scene_save_data.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| static void print_buffer(const uint8_t* buffer) { | static void print_buffer(const uint8_t* buffer) { | ||||||
|     for(uint8_t i = 0; i < LFRFID_KEY_SIZE; i++) { |     for(uint8_t i = 0; i < LFRFID_KEY_SIZE; i++) { | ||||||
| @ -40,6 +41,7 @@ bool LfRfidAppSceneSaveData::on_event(LfRfidApp* app, LfRfidApp::Event* event) { | |||||||
| 
 | 
 | ||||||
|     if(event->type == LfRfidApp::EventType::Next) { |     if(event->type == LfRfidApp::EventType::Next) { | ||||||
|         key.set_data(new_key_data, key.get_type_data_count()); |         key.set_data(new_key_data, key.get_type_data_count()); | ||||||
|  |         DOLPHIN_DEED(DolphinDeedRfidAdd); | ||||||
|         app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::SaveName); |         app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::SaveName); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,12 @@ | |||||||
| #include "lfrfid_app_scene_save_success.h" | #include "lfrfid_app_scene_save_success.h" | ||||||
|  | #include <gui/scene_manager.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
|  | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| void LfRfidAppSceneSaveSuccess::on_enter(LfRfidApp* app, bool need_restore) { | void LfRfidAppSceneSaveSuccess::on_enter(LfRfidApp* app, bool need_restore) { | ||||||
|     auto popup = app->view_controller.get<PopupVM>(); |     auto popup = app->view_controller.get<PopupVM>(); | ||||||
| 
 | 
 | ||||||
|  |     DOLPHIN_DEED(DolphinDeedRfidSave); | ||||||
|     popup->set_icon(32, 5, &I_DolphinNice_96x59); |     popup->set_icon(32, 5, &I_DolphinNice_96x59); | ||||||
|     popup->set_text("Saved!", 13, 22, AlignLeft, AlignBottom); |     popup->set_text("Saved!", 13, 22, AlignLeft, AlignBottom); | ||||||
|     popup->set_context(app); |     popup->set_context(app); | ||||||
| @ -43,4 +47,4 @@ void LfRfidAppSceneSaveSuccess::timeout_callback(void* context) { | |||||||
|     LfRfidApp::Event event; |     LfRfidApp::Event event; | ||||||
|     event.type = LfRfidApp::EventType::Back; |     event.type = LfRfidApp::EventType::Back; | ||||||
|     app->view_controller.send_event(&event); |     app->view_controller.send_event(&event); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include <furi/pubsub.h> | #include <furi.h> | ||||||
| #include "loader/loader.h" | #include "loader/loader.h" | ||||||
| #include "loader_i.h" | #include "loader_i.h" | ||||||
| 
 | 
 | ||||||
| @ -464,11 +464,12 @@ int32_t loader_srv(void* p) { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     furi_record_destroy("loader"); | ||||||
|     loader_free(loader_instance); |     loader_free(loader_instance); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| FuriPubSub* loader_get_pubsub() { | FuriPubSub* loader_get_pubsub(Loader* instance) { | ||||||
|     return loader_instance->pubsub; |     return instance->pubsub; | ||||||
| } | } | ||||||
|  | |||||||
| @ -46,4 +46,4 @@ void loader_show_menu(); | |||||||
| void loader_update_menu(); | void loader_update_menu(); | ||||||
| 
 | 
 | ||||||
| /** Show primary loader */ | /** Show primary loader */ | ||||||
| FuriPubSub* loader_get_pubsub(); | FuriPubSub* loader_get_pubsub(Loader* instance); | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_MF_UL_DATA_NOT_CHANGED (0UL) | #define NFC_MF_UL_DATA_NOT_CHANGED (0UL) | ||||||
| #define NFC_MF_UL_DATA_CHANGED (1UL) | #define NFC_MF_UL_DATA_CHANGED (1UL) | ||||||
| @ -11,6 +12,7 @@ void nfc_emulate_mifare_ul_worker_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_emulate_mifare_ul_on_enter(void* context) { | void nfc_scene_emulate_mifare_ul_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcEmulate); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void nfc_scene_emulate_uid_on_enter(void* context) { | void nfc_scene_emulate_uid_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcEmulate); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_READ_CARD_CUSTOM_EVENT (10UL) | #define NFC_READ_CARD_CUSTOM_EVENT (10UL) | ||||||
| 
 | 
 | ||||||
| @ -9,6 +10,7 @@ void nfc_read_card_worker_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_card_on_enter(void* context) { | void nfc_scene_read_card_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcRead); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void nfc_scene_read_card_success_widget_callback( | void nfc_scene_read_card_success_widget_callback( | ||||||
|     GuiButtonType result, |     GuiButtonType result, | ||||||
| @ -17,6 +18,7 @@ void nfc_scene_read_card_success_on_enter(void* context) { | |||||||
|     string_t uid_str; |     string_t uid_str; | ||||||
|     string_init(data_str); |     string_init(data_str); | ||||||
|     string_init(uid_str); |     string_init(uid_str); | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||||
| 
 | 
 | ||||||
|     // Send notification
 |     // Send notification
 | ||||||
|     notification_message(nfc->notifications, &sequence_success); |     notification_message(nfc->notifications, &sequence_success); | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_READ_EMV_APP_CUSTOM_EVENT (10UL) | #define NFC_READ_EMV_APP_CUSTOM_EVENT (10UL) | ||||||
| 
 | 
 | ||||||
| @ -9,6 +10,7 @@ void nfc_read_emv_app_worker_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_emv_app_on_enter(void* context) { | void nfc_scene_read_emv_app_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcRead); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
| #include "../helpers/nfc_emv_parser.h" | #include "../helpers/nfc_emv_parser.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_SCENE_READ_SUCCESS_SHIFT "              " | #define NFC_SCENE_READ_SUCCESS_SHIFT "              " | ||||||
| 
 | 
 | ||||||
| @ -11,6 +12,7 @@ void nfc_scene_read_emv_app_success_dialog_callback(DialogExResult result, void* | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_emv_app_success_on_enter(void* context) { | void nfc_scene_read_emv_app_success_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; |     NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_READ_EMV_DATA_CUSTOM_EVENT (10UL) | #define NFC_READ_EMV_DATA_CUSTOM_EVENT (10UL) | ||||||
| 
 | 
 | ||||||
| @ -9,6 +10,7 @@ void nfc_read_emv_data_worker_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_emv_data_on_enter(void* context) { | void nfc_scene_read_emv_data_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcRead); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
| #include "../helpers/nfc_emv_parser.h" | #include "../helpers/nfc_emv_parser.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void nfc_scene_read_emv_data_success_widget_callback( | void nfc_scene_read_emv_data_success_widget_callback( | ||||||
|     GuiButtonType result, |     GuiButtonType result, | ||||||
| @ -15,6 +16,7 @@ void nfc_scene_read_emv_data_success_on_enter(void* context) { | |||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|     NfcEmvData* emv_data = &nfc->dev->dev_data.emv_data; |     NfcEmvData* emv_data = &nfc->dev->dev_data.emv_data; | ||||||
|     NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; |     NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||||
| 
 | 
 | ||||||
|     // Setup Custom Widget view
 |     // Setup Custom Widget view
 | ||||||
|     // Add frame
 |     // Add frame
 | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_READ_MIFARE_UL_CUSTOM_EVENT (10UL) | #define NFC_READ_MIFARE_UL_CUSTOM_EVENT (10UL) | ||||||
| 
 | 
 | ||||||
| @ -9,6 +10,7 @@ void nfc_read_mifare_ul_worker_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_mifare_ul_on_enter(void* context) { | void nfc_scene_read_mifare_ul_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcRead); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_SCENE_READ_SUCCESS_SHIFT "              " | #define NFC_SCENE_READ_SUCCESS_SHIFT "              " | ||||||
| #define NFC_SCENE_READ_MF_UL_CUSTOM_EVENT (0UL) | #define NFC_SCENE_READ_MF_UL_CUSTOM_EVENT (0UL) | ||||||
| @ -22,6 +23,7 @@ void nfc_scene_read_mifare_ul_success_text_box_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_read_mifare_ul_success_on_enter(void* context) { | void nfc_scene_read_mifare_ul_success_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||||
| 
 | 
 | ||||||
|     // Send notification
 |     // Send notification
 | ||||||
|     notification_message(nfc->notifications, &sequence_success); |     notification_message(nfc->notifications, &sequence_success); | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define SCENE_SAVE_SUCCESS_CUSTOM_EVENT (0UL) | #define SCENE_SAVE_SUCCESS_CUSTOM_EVENT (0UL) | ||||||
| 
 | 
 | ||||||
| @ -9,6 +10,7 @@ void nfc_scene_save_success_popup_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_scene_save_success_on_enter(void* context) { | void nfc_scene_save_success_on_enter(void* context) { | ||||||
|     Nfc* nfc = (Nfc*)context; |     Nfc* nfc = (Nfc*)context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedNfcSave); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| #define SCENE_SET_UID_CUSTOM_EVENT (0UL) | #define SCENE_SET_UID_CUSTOM_EVENT (0UL) | ||||||
| 
 | 
 | ||||||
| @ -30,6 +31,7 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) { | |||||||
| 
 | 
 | ||||||
|     if(event.type == SceneManagerEventTypeCustom) { |     if(event.type == SceneManagerEventTypeCustom) { | ||||||
|         if(event.event == SCENE_SET_UID_CUSTOM_EVENT) { |         if(event.event == SCENE_SET_UID_CUSTOM_EVENT) { | ||||||
|  |             DOLPHIN_DEED(DolphinDeedNfcAdd); | ||||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); |             scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../views/subghz_frequency_analyzer.h" | #include "../views/subghz_frequency_analyzer.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void subghz_scene_frequency_analyzer_callback(SubghzCustomEvent event, void* context) { | void subghz_scene_frequency_analyzer_callback(SubghzCustomEvent event, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| @ -9,6 +10,7 @@ void subghz_scene_frequency_analyzer_callback(SubghzCustomEvent event, void* con | |||||||
| 
 | 
 | ||||||
| void subghz_scene_frequency_analyzer_on_enter(void* context) { | void subghz_scene_frequency_analyzer_on_enter(void* context) { | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedSubGhzFrequencyAnalyzer); | ||||||
|     subghz_frequency_analyzer_set_callback( |     subghz_frequency_analyzer_set_callback( | ||||||
|         subghz->subghz_frequency_analyzer, subghz_scene_frequency_analyzer_callback, subghz); |         subghz->subghz_frequency_analyzer, subghz_scene_frequency_analyzer_callback, subghz); | ||||||
|     view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewFrequencyAnalyzer); |     view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewFrequencyAnalyzer); | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../views/subghz_read_raw.h" | #include "../views/subghz_read_raw.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include <lib/subghz/protocols/subghz_protocol_raw.h> | #include <lib/subghz/protocols/subghz_protocol_raw.h> | ||||||
| #include <lib/subghz/subghz_parser.h> | #include <lib/subghz/subghz_parser.h> | ||||||
| #include <lib/toolbox/path.h> | #include <lib/toolbox/path.h> | ||||||
| @ -199,6 +200,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { | |||||||
|                     if(!subghz_tx_start(subghz)) { |                     if(!subghz_tx_start(subghz)) { | ||||||
|                         scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); |                         scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); | ||||||
|                     } else { |                     } else { | ||||||
|  |                         DOLPHIN_DEED(DolphinDeedSubGhzSend); | ||||||
|                         subghz->state_notifications = SubGhzNotificationStateTX; |                         subghz->state_notifications = SubGhzNotificationStateTX; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @ -240,6 +242,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { | |||||||
|                        RAW_FILE_NAME, |                        RAW_FILE_NAME, | ||||||
|                        subghz->txrx->frequency, |                        subghz->txrx->frequency, | ||||||
|                        string_get_cstr(subghz->error_str))) { |                        string_get_cstr(subghz->error_str))) { | ||||||
|  |                     DOLPHIN_DEED(DolphinDeedSubGhzRawRec); | ||||||
|                     if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || |                     if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || | ||||||
|                        (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { |                        (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { | ||||||
|                         subghz_begin(subghz, subghz->txrx->preset); |                         subghz_begin(subghz, subghz->txrx->preset); | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../helpers/subghz_custom_event.h" | #include "../helpers/subghz_custom_event.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { | void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| @ -39,6 +40,7 @@ static bool subghz_scene_receiver_info_update_parser(void* context) { | |||||||
| void subghz_scene_receiver_info_on_enter(void* context) { | void subghz_scene_receiver_info_on_enter(void* context) { | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
| 
 | 
 | ||||||
|  |     DOLPHIN_DEED(DolphinDeedSubGhzReceiverInfo); | ||||||
|     if(subghz_scene_receiver_info_update_parser(subghz)) { |     if(subghz_scene_receiver_info_update_parser(subghz)) { | ||||||
|         string_t frequency_str; |         string_t frequency_str; | ||||||
|         string_t modulation_str; |         string_t modulation_str; | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../helpers/subghz_custom_event.h" | #include "../helpers/subghz_custom_event.h" | ||||||
|  | #include "dolphin/helpers/dolphin_deed.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void subghz_scene_save_success_popup_callback(void* context) { | void subghz_scene_save_success_popup_callback(void* context) { | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
| @ -8,6 +10,7 @@ void subghz_scene_save_success_popup_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| void subghz_scene_save_success_on_enter(void* context) { | void subghz_scene_save_success_on_enter(void* context) { | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedSubGhzSave); | ||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = subghz->popup; |     Popup* popup = subghz->popup; | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../lib/subghz/protocols/subghz_protocol_keeloq.h" | #include "../lib/subghz/protocols/subghz_protocol_keeloq.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| enum SubmenuIndex { | enum SubmenuIndex { | ||||||
|     SubmenuIndexPricenton, |     SubmenuIndexPricenton, | ||||||
| @ -192,6 +193,7 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { | |||||||
|             subghz->txrx->frequency = subghz_frequencies[subghz_frequencies_433_92]; |             subghz->txrx->frequency = subghz_frequencies[subghz_frequencies_433_92]; | ||||||
|             subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; |             subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; | ||||||
|             subghz_file_name_clear(subghz); |             subghz_file_name_clear(subghz); | ||||||
|  |             DOLPHIN_DEED(DolphinDeedSubGhzAddManually); | ||||||
|             scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); |             scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #include "../subghz_i.h" | #include "../subghz_i.h" | ||||||
| #include "../views/subghz_transmitter.h" | #include "../views/subghz_transmitter.h" | ||||||
| #include <lib/subghz/protocols/subghz_protocol_keeloq.h> | #include <lib/subghz/protocols/subghz_protocol_keeloq.h> | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
| void subghz_scene_transmitter_callback(SubghzCustomEvent event, void* context) { | void subghz_scene_transmitter_callback(SubghzCustomEvent event, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| @ -50,6 +51,7 @@ bool subghz_scene_transmitter_update_data_show(void* context) { | |||||||
| 
 | 
 | ||||||
| void subghz_scene_transmitter_on_enter(void* context) { | void subghz_scene_transmitter_on_enter(void* context) { | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
|  |     DOLPHIN_DEED(DolphinDeedSubGhzSend); | ||||||
|     if(!subghz_scene_transmitter_update_data_show(subghz)) { |     if(!subghz_scene_transmitter_update_data_show(subghz)) { | ||||||
|         view_dispatcher_send_custom_event( |         view_dispatcher_send_custom_event( | ||||||
|             subghz->view_dispatcher, SubghzCustomEventViewTransmitterError); |             subghz->view_dispatcher, SubghzCustomEventViewTransmitterError); | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "../u2f_app_i.h" | #include "../u2f_app_i.h" | ||||||
| #include "../views/u2f_view.h" | #include "../views/u2f_view.h" | ||||||
|  | #include <dolphin/dolphin.h> | ||||||
| #include "furi_hal.h" | #include "furi_hal.h" | ||||||
| #include "../u2f.h" | #include "../u2f.h" | ||||||
| 
 | 
 | ||||||
| @ -63,6 +64,7 @@ bool u2f_scene_main_on_event(void* context, SceneManagerEvent event) { | |||||||
|         } else if(event.event == U2fCustomEventWink) { |         } else if(event.event == U2fCustomEventWink) { | ||||||
|             notification_message(app->notifications, &sequence_blink_green_10); |             notification_message(app->notifications, &sequence_blink_green_10); | ||||||
|         } else if(event.event == U2fCustomEventAuthSuccess) { |         } else if(event.event == U2fCustomEventAuthSuccess) { | ||||||
|  |             DOLPHIN_DEED(DolphinDeedU2fAuthorized); | ||||||
|             osTimerStart(app->timer, U2F_SUCCESS_TIMEOUT); |             osTimerStart(app->timer, U2F_SUCCESS_TIMEOUT); | ||||||
|             app->event_cur = U2fCustomEventNone; |             app->event_cur = U2fCustomEventNone; | ||||||
|             u2f_view_set_state(app->u2f_view, U2fMsgSuccess); |             u2f_view_set_state(app->u2f_view, U2fMsgSuccess); | ||||||
|  | |||||||
| @ -20,14 +20,18 @@ $(PROTOBUF) &: $(PROTOBUF_SOURCES) $(PROTOBUF_COMPILER) | |||||||
| .PHONY: protobuf | .PHONY: protobuf | ||||||
| protobuf: $(PROTOBUF) | protobuf: $(PROTOBUF) | ||||||
| 
 | 
 | ||||||
| $(DOLPHIN_OUTPUT_DIR): $(DOLPHIN_SOURCE_DIR) | $(DOLPHIN_EXTERNAL_OUTPUT_DIR): $(DOLPHIN_SOURCE_DIR) | ||||||
| 	@echo "\tDOLPHIN" | 	@echo "\tDOLPHIN blocking" | ||||||
| 	@$(ASSETS_COMPILLER) dolphin "$(DOLPHIN_SOURCE_DIR)" "$(DOLPHIN_OUTPUT_DIR)" | 	@$(ASSETS_COMPILLER) dolphin -s dolphin_blocking "$(DOLPHIN_SOURCE_DIR)/blocking" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)" | ||||||
|  | 	@echo "\tDOLPHIN internal" | ||||||
|  | 	@$(ASSETS_COMPILLER) dolphin -s dolphin_internal "$(DOLPHIN_SOURCE_DIR)/internal" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)" | ||||||
|  | 	@echo "\tDOLPHIN external" | ||||||
|  | 	@$(ASSETS_COMPILLER) dolphin "$(DOLPHIN_SOURCE_DIR)/external" "$(DOLPHIN_EXTERNAL_OUTPUT_DIR)" | ||||||
| 
 | 
 | ||||||
| .PHONY: dolphin | .PHONY: dolphin | ||||||
| dolphin: $(DOLPHIN_OUTPUT_DIR) | dolphin: $(DOLPHIN_EXTERNAL_OUTPUT_DIR) | ||||||
| 
 | 
 | ||||||
| clean: | clean: | ||||||
| 	@echo "\tCLEAN\t" | 	@echo "\tCLEAN\t" | ||||||
| 	@$(RM) $(ASSETS_COMPILED_DIR)/* | 	@$(RM) $(ASSETS_COMPILED_DIR)/* | ||||||
| 	@$(RM) -rf $(DOLPHIN_OUTPUT_DIR) | 	@$(RM) -rf $(DOLPHIN_EXTERNAL_OUTPUT_DIR) | ||||||
|  | |||||||
| @ -6,8 +6,9 @@ ASSETS_SOURCE_DIR	:= $(ASSETS_DIR)/icons | |||||||
| ASSETS_SOURCES		+= $(shell find $(ASSETS_SOURCE_DIR) -type f -iname '*.png' -or -iname 'frame_rate') | ASSETS_SOURCES		+= $(shell find $(ASSETS_SOURCE_DIR) -type f -iname '*.png' -or -iname 'frame_rate') | ||||||
| ASSETS				+= $(ASSETS_COMPILED_DIR)/assets_icons.c | ASSETS				+= $(ASSETS_COMPILED_DIR)/assets_icons.c | ||||||
| 
 | 
 | ||||||
| DOLPHIN_SOURCE_DIR	:= $(ASSETS_DIR)/dolphin | DOLPHIN_SOURCE_DIR			:= $(ASSETS_DIR)/dolphin | ||||||
| DOLPHIN_OUTPUT_DIR	:= $(ASSETS_DIR)/resources/dolphin | DOLPHIN_INTERNAL_OUTPUT_DIR	:= $(ASSETS_COMPILED_DIR) | ||||||
|  | DOLPHIN_EXTERNAL_OUTPUT_DIR	:= $(ASSETS_DIR)/resources/dolphin | ||||||
| 
 | 
 | ||||||
| PROTOBUF_SOURCE_DIR		:= $(ASSETS_DIR)/protobuf | PROTOBUF_SOURCE_DIR		:= $(ASSETS_DIR)/protobuf | ||||||
| PROTOBUF_COMPILER		:= $(PROJECT_ROOT)/lib/nanopb/generator/nanopb_generator.py | PROTOBUF_COMPILER		:= $(PROJECT_ROOT)/lib/nanopb/generator/nanopb_generator.py | ||||||
|  | |||||||
							
								
								
									
										320
									
								
								assets/compiled/assets_dolphin_blocking.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								assets/compiled/assets_dolphin_blocking.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,320 @@ | |||||||
|  | #include <assets_dolphin_blocking.h> | ||||||
|  | #include <desktop/animations/animation_storage_i.h> | ||||||
|  | #include <desktop/animations/animation_manager.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NoDb_128x51_0[] = { | ||||||
|  |     0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x7,0x7,0xbd,0xc2,0x3c,0xaf,0x2a,0x7,0xff,0xf3,0xfc,0x7,0xb6,0x22,0x44,0xf,0x2d,0x7,0xff,0x1d,0xfb,0x7,0xa6,0x2,0x73,0x8,0x91,0x63,0x27,0x70,0x7e,0x85,0xff,0xf7,0xf7,0x7,0xa5,0x2,0x95,0x70,0x91,0x54,0xb1,0x50,0x4f,0x86,0xff,0xfb,0xef,0x7,0xb6,0x2,0x45,0x42,0x7,0x9f,0xfc,0x1e,0xe3,0xf1,0xf,0x9f,0x7e,0x3f,0xdf,0x1f,0xad,0x24,0xbe,0x38,0xc8,0x5c,0x1c,0x1e,0x3e,0xfe,0xf1,0xfe,0xc1,0xe3,0xff,0x7,0xe7,0x0,0x5a,0x22,0xf5,0x7,0xc6,0xfc,0x1f,0xa5,0xf7,0x7,0xc6,0xfc,0x1e,0xff,0xe6,0xd1,0x40,0x68,0x17,0xff,0xff,0x9c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xff,0x70,0xc1,0xeb,0xc0,0x2,0x1c,0x13,0xa0,0xdf,0x1c,0x0,0x3e,0xfe,0xf,0xf1,0x83,0x83,0xda,0x11,0x2,0x80,0x42,0x1,0xe5,0xff,0x87,0xdf,0x81,0xeb,0x18,0x81,0xc0,0x23,0x0,0xf3,0x8f,0xdf,0x1,0xeb,0xa8,0x99,0x59,0xe7,0x0,0xf3,0x9f,0xde,0x1,0xeb,0x48,0xa5,0x64,0x6f,0x0,0xf3,0xbf,0x83,0xda,0x11,0x4a,0xf8,0x87,0xd3,0xfe,0xf,0x88,0x88,0xfd,0x4,0x2,0xf,0x69,0x95,0x84,0xbe,0x80,0xf7,0x3f,0xb0,0x3f,0xc1,0xf0,0xbf,0x40,0x7c,0xe0,0x1,0x24,0xdf,0x1f,0x0,0x10,0xa7,0xee,0xf5,0x7,0x98,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NoDb_128x51_1[] = { | ||||||
|  |     0x1,0x0,0x45,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x1f,0xfe,0x3,0xda,0xe1,0x1e,0x57,0x95,0x3,0xff,0xe7,0xf9,0x83,0xdb,0x11,0x22,0x7,0x96,0x83,0xff,0x3b,0xf7,0x3,0xd3,0x1,0x39,0x84,0x48,0xb1,0x93,0xb8,0x3f,0x43,0xff,0xed,0xef,0x83,0xd2,0x81,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc3,0xff,0xf6,0xdf,0x83,0xdb,0x1,0x22,0xa1,0x3,0xcf,0xfc,0xf,0x71,0xf8,0x87,0xce,0xff,0x1f,0xbf,0x8f,0xd6,0x92,0x5f,0x1c,0x64,0x2e,0xe,0xf,0x1f,0x7d,0xf8,0xff,0x60,0xf1,0xff,0x83,0xf3,0x80,0x2d,0x11,0x7a,0x83,0xe0,0x9c,0x20,0xfc,0x2f,0xb8,0x3e,0x37,0xc0,0xf7,0xff,0x36,0x8a,0x2,0xbf,0x1f,0xee,0x7c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xfd,0xc3,0xc1,0xeb,0xc0,0x2,0x1c,0x11,0x7e,0x3e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf5,0x84,0x40,0xa0,0x10,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7a,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xef,0xf7,0x0,0x7a,0xea,0x26,0x56,0x79,0xc0,0x3c,0xff,0xf6,0x0,0x7a,0xd2,0x29,0x59,0x1b,0xc0,0x3d,0x2c,0x23,0xf6,0xa5,0x7c,0x43,0xeb,0x63,0x7,0xbc,0x44,0x7e,0x84,0x1,0x7,0xb4,0xca,0xc2,0x5f,0x40,0x7b,0x9f,0xd8,0x1f,0xe0,0xf8,0x5f,0xa0,0x3e,0x70,0x0,0x92,0x6f,0x8f,0x80,0x8,0x53,0xf7,0x7a,0x83,0xcc,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NoDb_128x51_2[] = { | ||||||
|  |     0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe3,0xff,0xc0,0x7a,0x60,0x27,0x30,0x89,0x16,0x32,0x77,0x7,0xe8,0x7f,0xfc,0xff,0x30,0x7a,0x50,0x29,0x57,0x9,0x15,0x4b,0x15,0x4,0xf8,0x7f,0xe7,0x7e,0xe0,0x7b,0x60,0x24,0x54,0x20,0x79,0xfb,0x7b,0xe0,0xf6,0x1f,0x88,0x7d,0x22,0xdb,0xf1,0xfa,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe3,0xee,0xdf,0x1f,0xef,0xe1,0x7f,0xff,0xdf,0x81,0xf7,0xc0,0xbf,0x80,0x8,0x1f,0x83,0xe1,0x7,0xea,0x78,0x43,0xfe,0xf,0x6f,0xf2,0xe8,0xa0,0x2b,0xf1,0xff,0x1b,0xd4,0xe0,0x30,0x10,0x21,0x40,0x97,0xe2,0xf,0x7e,0x0,0x10,0xe0,0x8b,0xf1,0xfe,0xe7,0xc1,0xf6,0x8f,0x1f,0xdc,0x3c,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0x3c,0xe,0xfc,0xf,0x58,0xc4,0xe,0x1,0x18,0x7,0x94,0x7e,0x39,0x7c,0x7,0xae,0xa2,0x65,0x67,0x9c,0x3,0xcb,0xff,0x3f,0xbc,0x3,0xd6,0x91,0x4a,0xc8,0xde,0x1,0xe7,0x7f,0xb8,0xf,0xda,0x95,0xf1,0xf,0xa7,0xfe,0xc0,0xf,0x78,0x88,0xfc,0xc0,0x3,0x61,0x7,0xb4,0xca,0xc2,0x5f,0x30,0x0,0xd8,0xcf,0xf8,0x40,0x20,0x7f,0x83,0xd5,0x7e,0x80,0xf9,0xc0,0x2,0x49,0xbe,0x3e,0x0,0x21,0x4f,0xdd,0xea,0xf,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NoDb_128x51_3[] = { | ||||||
|  |     0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe0,0xe0,0xf5,0xc0,0x4e,0x61,0x12,0x2c,0x64,0xee,0xf,0xd0,0xff,0xfe,0x7f,0x80,0xf4,0xa0,0x52,0xae,0x12,0x2a,0x96,0x2a,0x9,0xf0,0xff,0xe3,0xbf,0x60,0xf6,0xc0,0x48,0xa8,0x40,0xf2,0xbf,0xfe,0xfe,0xe0,0xf6,0x1f,0x88,0x7c,0xf7,0xf1,0xdf,0x78,0xfd,0x69,0x25,0xf1,0xc6,0x42,0xe0,0xe0,0xf1,0xf7,0xfb,0x8f,0xf7,0xf0,0xef,0xff,0xfb,0xc0,0xfb,0xe0,0x77,0xef,0xe0,0x11,0x7,0xe6,0xfc,0x1f,0xdf,0xf0,0xff,0x83,0xdf,0xfc,0xba,0x28,0xd,0x3,0x7f,0xff,0x37,0xa9,0xc0,0x60,0x20,0x42,0x81,0x68,0x1,0xf1,0xc0,0x2,0x1c,0x13,0xa1,0x7f,0xff,0xf9,0xc1,0xf6,0xbf,0x1f,0xf7,0xc,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0xce,0x0,0x1e,0xd1,0x88,0x1c,0x2,0x30,0xf,0x28,0x3c,0x1c,0x1e,0xda,0x89,0x95,0x9e,0x70,0xf,0x2f,0xfc,0x3e,0xfc,0xf,0x5a,0x45,0x2b,0x23,0x78,0x7,0x9c,0x7e,0xf8,0x3f,0x6a,0x57,0xc4,0x3e,0x93,0xfb,0xc0,0x3d,0xe2,0x23,0xf3,0xff,0xdf,0xc1,0xef,0x32,0xb0,0x97,0xcc,0x0,0x20,0xf6,0x3f,0xb0,0x80,0x81,0xfe,0xf,0x55,0xfa,0x3,0xe7,0x0,0x9,0x26,0xf8,0xf8,0x0,0x85,0x3f,0x77,0xa8,0x3c,0xc1,0x2a,0x0,0xf0,0x7,0x80,0x3c,0x1,0x40 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L0_NoDb_128x51[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L0_NoDb_128x51_0, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NoDb_128x51_1, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NoDb_128x51_2, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NoDb_128x51_3, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L0_NoDb_128x51 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 51, | ||||||
|  |         .frame_count = 4, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L0_NoDb_128x51 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 2, 3 }, | ||||||
|  |     .passive_frames = 4, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 0, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = NULL, | ||||||
|  |     .frame_bubble_sequences_count = 0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdBad_128x51_0[] = { | ||||||
|  |     0x1,0x0,0x1,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x83,0xfe,0x1,0xfb,0xf9,0xf0,0x83,0xf6,0x19,0xc6,0x7,0xb0,0xe8,0xe0,0x34,0xf,0xfc,0x1b,0x90,0xf,0x69,0x80,0xc,0xa0,0x5a,0xf,0xfc,0xd8,0x1e,0xf1,0x80,0x19,0x41,0x3a,0x5,0xd1,0xfe,0x3,0xec,0xff,0x51,0x8b,0x84,0x8a,0x4,0xf,0xcc,0x44,0x4a,0xc,0xf,0xd8,0x54,0x38,0x1f,0xb0,0x68,0xf0,0x7f,0xc7,0xfe,0x5f,0xf0,0x7e,0x1f,0xfc,0x1f,0xd3,0x85,0xf9,0x83,0xe8,0x14,0x70,0x1f,0x0,0x10,0xa7,0xe0,0xf5,0x5,0x18,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdBad_128x51_1[] = { | ||||||
|  |     0x1,0x0,0x12,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x81,0xfc,0x1,0xfb,0xf8,0xe0,0x83,0xf2,0xff,0x4c,0xc3,0x3,0xd8,0x74,0x70,0x15,0xf8,0xe1,0xa1,0x0,0xf6,0x98,0x0,0xca,0x5,0xa0,0x9f,0xc5,0xa1,0x20,0xf6,0x8c,0x0,0xca,0x9,0xd0,0xbb,0xcf,0xb3,0x17,0xb0,0x7d,0x7c,0x3e,0xf3,0xff,0xc0,0x3d,0xee,0x12,0x28,0x10,0x3c,0x7d,0xee,0x1,0xbe,0x83,0xdb,0x11,0x12,0x83,0x2f,0xec,0x1e,0x30,0xa8,0x70,0x3f,0x60,0xd1,0xe0,0xff,0x83,0xf4,0x7f,0xc5,0xf4,0x7,0xd1,0xfd,0x1,0xfe,0xf,0x99,0xc2,0xfc,0xc1,0xf4,0xa,0x38,0xf,0x80,0x8,0x53,0xf0,0x7a,0x82,0x8c,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L0_SdBad_128x51[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdBad_128x51_0, | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdBad_128x51_1, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L0_SdBad_128x51 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 51, | ||||||
|  |         .frame_count = 2, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L0_SdBad_128x51 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1 }, | ||||||
|  |     .passive_frames = 2, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 0, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = NULL, | ||||||
|  |     .frame_bubble_sequences_count = 0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdOk_128x51_0[] = { | ||||||
|  |     0x1,0x0,0x19,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x0,0x7f,0xf7,0xfe,0xe0,0xfe,0x1f,0xef,0x0,0xfe,0x80,0xa5,0x75,0x14,0x6,0x80,0xf,0x99,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdOk_128x51_1[] = { | ||||||
|  |     0x1,0x0,0x1e,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0xe,0xff,0x8c,0x1f,0xd8,0x70,0x7f,0x63,0xc1,0xfb,0xbf,0xcf,0x9f,0xc8,0x14,0xae,0xa2,0x80,0xd0,0x11,0xe8,0x0,0x49,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdOk_128x51_2[] = { | ||||||
|  |     0x1,0x0,0x22,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe5,0x7d,0x3f,0xd8,0x3c,0x7e,0x77,0xc0,0x7d,0xf0,0x3b,0xf6,0x30,0x7f,0x41,0xef,0xc0,0xfd,0x87,0x93,0xc8,0x1f,0x5b,0xfc,0xf9,0xfc,0x81,0x4a,0xea,0x28,0xd,0x1,0x1e,0x80,0x4,0x98,0x0,0xca,0x4,0xbf,0x50,0x2,0x46,0x1a,0xa7,0xd0,0x6f,0xb8,0x3d,0xbe,0xf,0xf7,0x7,0x93,0x40,0x60,0x40,0xf2,0x83,0xff,0x1,0xef,0x88,0x89,0x41,0x81,0xe4,0x0,0x10,0x7c,0x42,0xa1,0xc0,0xfd,0x83,0x47,0x83,0xfe,0xf,0xd1,0xff,0x17,0xd4,0x1f,0x27,0xf5,0x7,0xf8,0x3e,0x27,0xb,0xf3,0x7,0xd0,0x28,0xe0,0x3e,0x0,0x21,0x4f,0xc1,0xea,0xa,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_SdOk_128x51_3[] = { | ||||||
|  |     0x1,0x0,0x26,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0x8d,0xcc,0x1e,0x33,0xe,0x74,0x63,0xf,0x49,0x2f,0x8e,0x32,0x17,0x7,0x7,0x95,0xc4,0xff,0x60,0xf1,0xf9,0xde,0x1,0xf7,0xc0,0xef,0xd8,0xef,0x80,0xfd,0x83,0xdf,0x81,0xfb,0xf,0x2f,0x90,0x3e,0xb7,0xf9,0xf3,0xf9,0x2,0x95,0xd4,0x50,0x1a,0x2,0x3d,0x0,0x9,0x30,0x1,0x94,0x9,0x7e,0xa0,0x4,0x8c,0x35,0x4f,0xa0,0xdf,0x70,0x7b,0x7c,0x1f,0xee,0xf,0x26,0x80,0xc0,0x81,0xe5,0x7,0xfe,0x3,0xdf,0x11,0x12,0x83,0x3,0xc8,0x0,0x20,0xf8,0x85,0x43,0x81,0xfb,0x6,0x8f,0x7,0xfc,0x1f,0xa3,0xfe,0x2f,0xa8,0x3e,0x4f,0xea,0xf,0xf0,0x7c,0x4e,0x17,0xe6,0xf,0xa0,0x51,0xc0,0x7c,0x0,0x42,0x9f,0x83,0xd4,0x14,0x60,0x95,0x0,0x78,0x3,0xc0,0x1e,0x0,0xa0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L0_SdOk_128x51[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdOk_128x51_0, | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdOk_128x51_1, | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdOk_128x51_2, | ||||||
|  | 
 | ||||||
|  |     _A_L0_SdOk_128x51_3, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L0_SdOk_128x51 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 51, | ||||||
|  |         .frame_count = 4, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L0_SdOk_128x51 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 2, 3 }, | ||||||
|  |     .passive_frames = 4, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 0, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = NULL, | ||||||
|  |     .frame_bubble_sequences_count = 0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_Url_128x51_0[] = { | ||||||
|  |     0x1,0x0,0x33,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xd6,0xe,0xf,0x29,0xf0,0x20,0x60,0x30,0x1d,0x40,0x10,0x8e,0x63,0xff,0xfc,0xff,0x1,0xe3,0x47,0x7,0x9c,0x90,0x1e,0x7a,0xf,0xfe,0x3b,0xf7,0x7f,0xc0,0x6b,0xa9,0x1c,0x7d,0xcc,0xcf,0x49,0xce,0xe0,0xe6,0x60,0x9d,0xb,0xff,0xef,0xee,0xf,0x1d,0xe5,0x22,0x53,0x25,0xa4,0xeb,0x2a,0x52,0x2d,0x2c,0x13,0xe1,0xbf,0xfe,0xfb,0xc1,0xe3,0x8f,0x7,0x95,0xe7,0x48,0xf,0x1d,0xe8,0x3c,0xbf,0xe0,0xf2,0xcf,0x3,0xca,0x12,0xf,0x2c,0x28,0x3c,0x7b,0xf1,0xfe,0xf8,0x3c,0x7b,0xd7,0xe,0x3c,0xe6,0x63,0xa5,0xe7,0x72,0x63,0x30,0x30,0x78,0xfb,0xfb,0xc5,0xf1,0x0,0x89,0x64,0x40,0x3,0x42,0x1,0x90,0x3c,0x7f,0xe0,0xf2,0x3f,0x88,0x3d,0xf8,0x2,0xd1,0x0,0x8a,0x7e,0x81,0xe3,0xbf,0x7,0xe9,0x7c,0xc1,0xf9,0xbf,0x7,0xc7,0xe1,0xb4,0x30,0x1a,0x5,0xff,0xff,0xe7,0x7,0xbc,0x18,0x4,0x30,0x25,0xf8,0xff,0xb8,0x60,0xf7,0x81,0x80,0x85,0x7e,0x2d,0xf1,0xc0,0x3,0xef,0xe0,0xff,0x18,0x38,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0xf0,0xfb,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xe3,0xf7,0xc0,0x7b,0xca,0xa7,0x0,0xf3,0x9f,0xde,0x1,0xef,0x1a,0xbc,0x3,0xce,0xfe,0xf,0x80,0xfa,0xff,0xc1,0xf0,0x3f,0x51,0x0,0x97,0xf4,0x1f,0x7,0xf5,0x7,0xf8,0x3e,0x60,0xeb,0xf2,0x7,0xdf,0xf9,0xbe,0x5e,0x0,0x79,0x4f,0xc1,0xed,0xfc,0x5,0x8,0x25,0x80,0x1e,0x0,0xf0,0x7,0x80,0x24 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_Url_128x51_1[] = { | ||||||
|  |     0x1,0x0,0x33,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xd6,0x3f,0xfc,0x7,0x8c,0xf8,0x10,0x30,0x18,0xe,0xa0,0x8,0x47,0x31,0xff,0xf9,0xfe,0x60,0xf1,0xa3,0x83,0xce,0x48,0xf,0x3d,0x7,0xfe,0x77,0xee,0xbf,0xe0,0x35,0xd4,0x8e,0x3e,0xe6,0x67,0xa4,0xe7,0x70,0x73,0x30,0x4e,0x87,0xff,0xdb,0xdf,0x7,0x8e,0xf2,0x91,0x29,0x92,0xd2,0x75,0x95,0x29,0x16,0x96,0x9,0xf0,0xff,0xfd,0xb7,0xe0,0xf1,0xc7,0x83,0xca,0xf3,0xa4,0x7,0x8e,0xf4,0x1e,0x5f,0xe0,0x79,0x67,0x81,0xe5,0x9,0x7,0x96,0x14,0x1e,0x37,0xf8,0xfd,0xfc,0x1e,0x3d,0xeb,0x87,0x1e,0x73,0x31,0xd2,0xf3,0xb9,0x31,0x98,0x18,0x3c,0x7d,0xf7,0xe2,0xf8,0x80,0x44,0xb2,0x20,0x1,0xa1,0x0,0xc8,0x1e,0x3f,0xf0,0x79,0x1f,0xc4,0x1e,0xfc,0x1,0x68,0x80,0x5,0x3f,0x40,0xf1,0x27,0x8,0x3f,0xb,0xe6,0xf,0xcd,0xf0,0x3e,0x3f,0xd,0xa1,0x80,0xaf,0xc7,0xfb,0x9f,0x7,0xbc,0x18,0x4,0x30,0x25,0xf8,0xfe,0xe1,0xe0,0xf7,0x81,0x80,0x85,0x7e,0x5e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf6,0xe1,0xe2,0x61,0x0,0xf2,0xff,0xcf,0xef,0x0,0xf6,0x91,0xd2,0xa3,0x0,0xf3,0xbf,0xdc,0x1,0xef,0x2a,0x9c,0x3,0xcf,0xff,0x60,0x7,0xbc,0x6a,0xf0,0xf,0x4b,0x8,0x7f,0xac,0x63,0xfd,0x20,0x9,0x7f,0x41,0xf0,0x7f,0x50,0x7f,0x83,0xe6,0xe,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x7,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x1,0xe0,0xf,0x0,0x78,0x2,0x40 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_Url_128x51_2[] = { | ||||||
|  |     0x1,0x0,0x2e,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xe6,0x7c,0x8,0x18,0xc,0x7,0x50,0x4,0x23,0x98,0x83,0xd2,0x8e,0xf,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0xff,0xf2,0xff,0x80,0xd7,0x52,0x38,0xfb,0x99,0x9e,0x93,0x9d,0xc1,0xcc,0xc1,0x3a,0x1f,0xff,0x3f,0xcc,0x1e,0x3b,0xca,0x44,0xa6,0x4b,0x49,0xd6,0x54,0xa4,0x5a,0x58,0x27,0xc3,0xff,0x3b,0xf7,0x3,0xc7,0x1e,0xf,0x2b,0xce,0x90,0x1e,0x3b,0xd0,0x79,0x7b,0x7b,0xe0,0xf1,0xcf,0x3,0xca,0x12,0xf,0x2c,0x28,0x3c,0xa2,0xdb,0xf0,0x78,0xf7,0xae,0x1c,0x79,0xcc,0xc7,0x4b,0xce,0xe4,0xc6,0x60,0x60,0xf1,0xf7,0x6f,0x8b,0xe2,0x1,0x12,0xc8,0x80,0x6,0x84,0x3,0x2f,0x85,0xff,0xff,0x7e,0x3f,0x98,0x3d,0xf8,0x17,0xf0,0x1,0x27,0xe8,0x1e,0x23,0xe1,0x7,0xea,0x78,0x43,0xfe,0xf,0x7f,0xc2,0xe8,0x60,0x2b,0xf1,0xff,0x4,0x4,0x1e,0xd0,0x60,0x10,0xc0,0x97,0xe2,0xf,0x98,0x18,0x8,0x57,0xe5,0xfd,0xcf,0x83,0xed,0x1e,0x3f,0xb8,0x78,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbc,0xf0,0x3b,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xa3,0xf1,0xcb,0xe0,0x3d,0xe5,0x53,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7b,0xc6,0xaf,0x0,0xf3,0xbf,0xdc,0x3,0xfb,0xff,0xb0,0xf,0xf0,0x0,0x36,0x12,0xfe,0x0,0x6,0xc6,0x7f,0xc2,0x1,0x3,0xfc,0x1e,0xd0,0x75,0xf9,0x3,0xef,0xfc,0xdf,0x2f,0x0,0x3c,0xa7,0xe0,0xf6,0xfe,0x2,0x84,0x12,0xc0,0xf,0x0,0x78,0x3,0xc0,0x12 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_Url_128x51_3[] = { | ||||||
|  |     0x1,0x0,0x31,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xe6,0x7c,0x8,0x18,0xc,0x7,0x50,0x4,0x23,0x98,0x83,0xd2,0x8e,0xf,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0x38,0x3c,0x70,0x1a,0xea,0x47,0x1f,0x73,0x33,0xd2,0x73,0xb8,0x39,0x98,0x27,0x43,0xff,0xf9,0xfe,0x3,0xc7,0x79,0x48,0x94,0xc9,0x69,0x3a,0xca,0x94,0x8b,0x4b,0x4,0xf8,0x7f,0xf1,0xdf,0xb0,0x78,0xe3,0xc1,0xe5,0x79,0xd2,0x3,0xc7,0x7a,0xf,0x1b,0xff,0xef,0xee,0xf,0x1c,0xf0,0x3c,0xa1,0x20,0xf2,0xc2,0x83,0xc7,0x7f,0x1d,0xf7,0x83,0xc7,0xbd,0x70,0xe3,0xce,0x66,0x3a,0x5e,0x77,0x26,0x33,0x3,0x7,0x8f,0xbf,0xdc,0x5f,0x10,0x8,0x96,0x44,0x0,0x34,0x20,0x19,0x7c,0x3b,0xff,0xfe,0xf1,0xfc,0xc1,0xef,0xc0,0xef,0xdf,0xc0,0x22,0x9f,0xa0,0x78,0xef,0xc1,0xfd,0xff,0xf,0xf8,0x3e,0x3f,0xb,0xa1,0x80,0xd0,0x37,0xff,0xf3,0x78,0x83,0xda,0xc,0x2,0x18,0x16,0x80,0x1f,0x50,0x30,0x10,0xaf,0xc6,0xff,0xff,0xf3,0x83,0xed,0x7e,0x3f,0xee,0x18,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0x38,0x0,0x7b,0xc8,0xe9,0x51,0x80,0x79,0x41,0xe0,0xe0,0xf8,0x95,0x4e,0x1,0xe5,0xff,0x87,0xdf,0x81,0xef,0x1a,0xbc,0x3,0xce,0x3f,0x7c,0xf,0xec,0xfe,0xf0,0x3f,0xcf,0xfd,0xfc,0x1e,0xe5,0xf5,0x0,0x8,0x3d,0xcf,0xea,0x20,0x20,0x7f,0x83,0xda,0xe,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x7,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x1,0xe0,0xf,0x0,0x78,0x2,0x40 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L0_Url_128x51[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L0_Url_128x51_0, | ||||||
|  | 
 | ||||||
|  |     _A_L0_Url_128x51_1, | ||||||
|  | 
 | ||||||
|  |     _A_L0_Url_128x51_2, | ||||||
|  | 
 | ||||||
|  |     _A_L0_Url_128x51_3, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L0_Url_128x51 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 51, | ||||||
|  |         .frame_count = 4, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L0_Url_128x51 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 2, 3 }, | ||||||
|  |     .passive_frames = 4, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 0, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = NULL, | ||||||
|  |     .frame_bubble_sequences_count = 0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NewMail_128x51_0[] = { | ||||||
|  |     0x1,0x0,0x50,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0x6,0xf8,0x40,0x40,0x63,0x30,0xfb,0x73,0x61,0x80,0xf7,0xfe,0x41,0xc0,0x63,0x70,0x9b,0x73,0x1,0xf1,0xfe,0x87,0x83,0xf7,0xff,0x1f,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0xdf,0x7e,0xf,0x39,0xb7,0x60,0x1e,0xf8,0xc,0xfc,0xfc,0x9e,0x53,0x7f,0xc1,0x14,0x81,0xeb,0xbf,0x7,0xa4,0xc2,0x6,0xa,0x2f,0xf8,0x0,0xc1,0xe9,0xf6,0x98,0x83,0xcb,0x80,0x1f,0x80,0x2,0xd0,0x11,0x24,0xf,0xc8,0x10,0x14,0xe1,0xf1,0xe0,0x7c,0x41,0xf,0xef,0xc,0xe3,0x6c,0x6c,0x20,0xf2,0x84,0x27,0xde,0x39,0xc7,0x7,0xa4,0x40,0x1e,0x7f,0xd3,0xc9,0x47,0x2c,0xfb,0x30,0x79,0xc8,0x9,0xe6,0xdf,0x3d,0xe0,0x3d,0x68,0x4,0x43,0x2,0x1e,0xb3,0xcd,0xb3,0x90,0x82,0x8b,0x0,0xa,0x29,0x0,0x3c,0xfd,0x93,0x6d,0xb0,0x3c,0xe0,0x2,0xa2,0x88,0x3,0xce,0x98,0xf,0x10,0x51,0x2,0x45,0x0,0x50,0x80,0x7b,0x5b,0xc1,0xe6,0x80,0x28,0x20,0x3c,0xd1,0xec,0x1c,0x10,0x20,0xc0,0x81,0xf6,0x80,0x28,0x8,0x3e,0xe6,0x7,0xe1,0x7,0xe5,0x21,0xa6,0x40,0xfb,0xc2,0x1f,0x84,0x9e,0x9f,0xef,0xf8,0x0,0x4e,0x2,0x6f,0x28,0xc,0x40,0xde,0x63,0x41,0x9,0x91,0xec,0x51,0xe5,0x2,0x84,0x23,0xcf,0x80,0x2d,0x33,0xd8,0xab,0xca,0x9,0x4,0x57,0x98,0x3d,0xc1,0x43,0xf8,0x81,0xb3,0xcf,0x81,0x8,0x16,0xc,0x20,0x1e,0x4e,0xf4,0x7,0x9c,0x62,0x7,0x0,0x8c,0x3,0xc9,0x1c,0x40,0x1,0xa0,0x83,0xcb,0x51,0x32,0xb3,0xce,0x1,0xe4,0xae,0x20,0x0,0xd0,0x81,0xe5,0x48,0xa5,0x64,0x6f,0x0,0xf2,0x67,0x10,0x0,0x68,0x83,0xf3,0xa5,0x7c,0x43,0xe6,0xee,0x20,0x0,0xa8,0xc4,0x1e,0x71,0x11,0xf9,0xa1,0x8e,0x1,0x50,0x7,0x9c,0xca,0xc2,0x5f,0x23,0xb2,0x40,0x2c,0x7,0xf8,0xc0,0x2d,0x48,0x0,0x33,0xf0,0x7c,0x0,0x23,0x80,0xbf,0x50,0x4,0xa,0x10,0x98,0x80,0x6,0x7,0x98,0x3a,0x80,0x1e,0x0,0xf0,0x7,0x80,0x14 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NewMail_128x51_1[] = { | ||||||
|  |     0x1,0x0,0x5d,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0xa,0x98,0x7d,0xb9,0xb0,0xc0,0x7d,0xdc,0x26,0xdc,0xc0,0x7f,0x83,0xe3,0xe1,0x1,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0x13,0xfd,0xf,0x80,0x7f,0x20,0xe0,0xf2,0x9b,0x76,0x1,0xe9,0xc0,0x80,0xdc,0x2,0x46,0x4f,0x19,0xbf,0xe0,0x2a,0x40,0x1,0x9c,0x7f,0xb1,0xf0,0x3f,0xfc,0x7c,0x1e,0x73,0x8,0x18,0x38,0xb0,0x1c,0x7f,0xfd,0xfe,0x79,0xbf,0x7,0x9f,0xda,0x62,0xf,0x3b,0x87,0xf3,0xff,0xff,0xe3,0xe7,0xe7,0xe6,0x68,0xe7,0x3,0x84,0x0,0x3b,0xf0,0x7c,0x60,0x1,0xc6,0xf,0xae,0x0,0x3e,0x21,0x9c,0x6d,0x8d,0x84,0xa,0x34,0x0,0x7c,0x47,0x38,0xe0,0xf4,0x41,0xa4,0x3e,0x3c,0xf,0x2b,0x3e,0xcc,0x1e,0x70,0x40,0x79,0x9f,0xcf,0x78,0xf,0x58,0x42,0xc9,0xa0,0x1a,0xcf,0x36,0xce,0x42,0xf,0x28,0x80,0x3c,0xff,0xaa,0x92,0xf6,0x4d,0xb6,0xc0,0xf3,0xd0,0x13,0x8d,0xbe,0x74,0xc0,0x78,0x81,0x4a,0x81,0x40,0xf,0x10,0x11,0x1,0xe5,0x6f,0x5,0x16,0x0,0x14,0x52,0x0,0x79,0x80,0x14,0x12,0x22,0x42,0x88,0x3,0xef,0xfc,0x3f,0x18,0x78,0x3e,0xf0,0x82,0xe1,0x82,0x3,0xee,0x90,0x3,0x18,0x10,0x3e,0xe6,0xe,0x31,0x80,0x83,0xcc,0x6e,0x5f,0xf2,0x58,0x82,0x45,0x20,0x40,0xf3,0xa,0x8,0x4c,0xa0,0x40,0xf2,0x58,0x10,0xbc,0xf8,0x2,0xd3,0x66,0x8,0x24,0x5a,0x4,0x4f,0x30,0x7c,0x8,0xc4,0x44,0x20,0xf3,0x84,0x2,0x6,0x10,0xf,0x34,0x7b,0x70,0x23,0x10,0x38,0x4,0x60,0x1e,0x4a,0xf7,0xe0,0x6a,0x26,0x56,0x79,0xc0,0x3c,0x99,0xef,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x48,0x1,0xe5,0x80,0x1f,0xa5,0x2b,0xe2,0x1f,0x33,0xf1,0x0,0x6,0x82,0xf,0x48,0x88,0xfc,0xcf,0xc4,0x0,0x1a,0x10,0x3c,0xe6,0x56,0x12,0xf9,0x9f,0x88,0x0,0x34,0x43,0xfc,0x9f,0x88,0x0,0x2d,0x31,0x7,0xc2,0xd8,0xe0,0x15,0x0,0x79,0x2f,0xd4,0x2c,0x90,0xb,0x1,0x8c,0x9b,0xc4,0xdf,0x20,0x32,0x7f,0xe7,0xe1,0x32,0x3,0x98,0x71,0x0,0x1e,0x0,0xf0,0x7,0x80,0x2c | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NewMail_128x51_2[] = { | ||||||
|  |     0x1,0x0,0x79,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x1,0xfc,0x20,0x20,0xfd,0x84,0x40,0x81,0xfb,0xf6,0x86,0x83,0xf7,0xf3,0x13,0x3,0x24,0xc3,0xed,0xcd,0x86,0x1,0xcf,0x81,0xfe,0xb7,0x83,0xd2,0xe1,0x36,0xe6,0x3,0xd2,0x41,0xff,0xcf,0x83,0xf3,0xb1,0xff,0xbf,0xc0,0xc0,0xe7,0xb0,0xfb,0x76,0x60,0xc0,0x73,0xf2,0x7f,0xff,0xf0,0x40,0x7a,0x4d,0xbb,0x0,0xf4,0xfd,0x83,0xc6,0x36,0x82,0x39,0x84,0xdf,0xf1,0x7,0x7,0x16,0x3,0xf8,0xf,0x19,0x3f,0xf0,0x12,0x40,0xf1,0x98,0xd,0xcc,0x1c,0x40,0x2,0x87,0x9b,0xce,0x62,0xf,0x31,0xda,0x7f,0xe3,0xe8,0xd8,0x7,0xa6,0xfc,0x1f,0x25,0x33,0xc0,0x67,0xe7,0xe0,0xf8,0x82,0x83,0xcf,0x7e,0xf,0x28,0x67,0x1b,0x63,0x61,0x5,0x16,0x1c,0x9a,0x5b,0xf0,0x79,0xc7,0x38,0xe0,0xf3,0xe0,0x1c,0xd0,0x1e,0x96,0x7d,0x98,0x3c,0xa8,0x0,0xf8,0xde,0x3,0xd5,0x46,0x90,0xf8,0xf0,0xc,0x75,0x9e,0x6d,0x9c,0x84,0x1e,0x58,0x41,0xf9,0x4f,0xcf,0xe7,0xec,0x9b,0x6d,0x81,0xe7,0x8,0xf,0x9f,0xf9,0x3e,0x54,0xc0,0x78,0xb1,0x4a,0x81,0x10,0x7,0x9f,0xf4,0x8a,0x40,0xf2,0xb7,0x83,0xca,0x40,0x4f,0x36,0xf9,0x80,0x16,0x81,0xc0,0x1f,0x95,0xfe,0x80,0x9e,0x8a,0x6,0x0,0x8,0x52,0x0,0x7d,0x40,0x5,0x45,0x10,0x7,0xdc,0x8,0xd8,0x30,0x80,0x7d,0xff,0x20,0x1e,0x8,0x38,0x3c,0xff,0xc4,0x82,0x15,0x88,0x24,0x69,0x0,0x31,0x81,0x3,0xcb,0x0,0x62,0x38,0x10,0x3c,0xa6,0x0,0xa2,0x7,0x97,0x0,0x5a,0x70,0x40,0x79,0x24,0x8,0x1f,0x8b,0x2,0x17,0x9f,0x2,0x10,0x2c,0x18,0x40,0x3c,0xc0,0x62,0x2,0x10,0x79,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xc2,0xc2,0x17,0x10,0x79,0xea,0x26,0x56,0x79,0xc0,0x3c,0xd1,0xed,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x2b,0xdc,0x7e,0x34,0xaf,0x88,0x7c,0xd1,0x46,0x4,0x30,0x79,0x44,0x47,0xe6,0xef,0x40,0x7a,0x4c,0xac,0x25,0xf3,0x3f,0x10,0x0,0x68,0x27,0xf9,0x3f,0x10,0x0,0x68,0x40,0xf9,0x3f,0x10,0x0,0x68,0x80,0xf2,0x5f,0xb1,0xf8,0x80,0x2,0xd3,0x12,0x18,0xb7,0x89,0xbe,0x61,0x63,0x80,0x54,0x0,0x64,0xf,0x31,0xb3,0x40,0x2c,0x0,0x54,0x0,0x18,0x99,0x3f,0xf3,0xf0,0x7c,0x0,0x3c,0x1,0xc0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L0_NewMail_128x51_3[] = { | ||||||
|  |     0x1,0x0,0x77,0x1,0x0,0x1f,0xe2,0x6,0xf,0xd8,0x24,0x10,0x1f,0xbf,0xa8,0x58,0x3f,0x7f,0xb1,0x70,0x76,0x60,0x3f,0xd2,0xf0,0x7e,0x50,0x3f,0xf5,0xf0,0x7e,0x68,0x3f,0xfb,0xf0,0x7e,0x74,0x3f,0xf7,0xf8,0x8,0x1c,0xe6,0x1f,0x6e,0x6c,0x30,0xc,0x5f,0xcf,0xf8,0x0,0xa0,0xe0,0x82,0xb8,0x4d,0xb9,0x80,0xf3,0x3e,0x20,0x10,0xc1,0xff,0xb0,0xfb,0x76,0x60,0xc0,0xfc,0x9b,0x76,0x1,0xf9,0x30,0x9b,0xfe,0x8,0xc7,0x84,0x27,0x14,0xff,0xe8,0x61,0x20,0x78,0xcc,0x1b,0x6,0x1f,0x4f,0xe0,0x64,0x8d,0xe3,0x31,0x7,0xc7,0xfa,0x1e,0xed,0x90,0x21,0xff,0xe3,0xe0,0xf8,0x1f,0xa6,0xfc,0x1f,0x26,0x33,0xc0,0x67,0xe7,0xe0,0x41,0x86,0x71,0xb6,0x36,0x10,0x59,0x41,0x41,0xe7,0xbf,0x7,0x94,0x73,0x8e,0xf,0x3c,0x0,0x7d,0x1,0xe9,0x67,0xd9,0x83,0xcb,0x81,0x87,0x1f,0x96,0xfc,0x1e,0x7b,0xc0,0x7a,0x50,0x12,0x66,0x1f,0x4d,0x67,0x9b,0x67,0x21,0x7,0x90,0xbc,0xe0,0x10,0xf8,0xf0,0xc,0x7d,0x93,0x6d,0xb0,0x3c,0xcf,0xf1,0x4c,0x7,0x8a,0xd4,0xa8,0x18,0x83,0xf9,0xa7,0xcc,0x1e,0x56,0xf0,0x79,0x44,0x3,0xe7,0xfd,0x22,0x98,0x1,0x28,0x12,0x2,0x79,0xfc,0x5,0x24,0xf,0x6a,0x0,0x11,0xc1,0xed,0x80,0x1f,0x98,0x3e,0xa0,0x2,0xa2,0x88,0x3,0xee,0x4,0x6c,0x18,0x40,0x3c,0xff,0xc2,0x82,0xd,0x88,0x24,0x70,0x90,0x9,0x4,0x10,0x1e,0x58,0x2,0x91,0xc0,0x81,0xe5,0x48,0x1,0x8c,0x8,0x1e,0x5c,0x1,0x69,0xa7,0x4,0x12,0x33,0x0,0xd1,0x3,0xed,0x20,0x40,0xf4,0x84,0xb,0x6,0x10,0xf,0x38,0x40,0xd8,0x81,0xe7,0x18,0x81,0xc0,0x23,0x0,0xf3,0x68,0x11,0x3c,0xf8,0x1a,0x89,0x95,0x9e,0x70,0xf,0x31,0x30,0x88,0x84,0x1e,0x74,0x8a,0x56,0x46,0xf0,0xf,0x34,0x7b,0xf,0xc6,0x95,0xf1,0xf,0x9e,0x0,0xac,0x52,0x0,0x7a,0xc4,0x47,0xe6,0xcf,0x70,0x78,0xcc,0xac,0x25,0xf3,0x77,0xa1,0xfe,0x8f,0xc4,0x0,0x1a,0x8,0x3e,0x4f,0xc4,0x0,0x1a,0x10,0x3c,0x97,0xec,0x7e,0x20,0x0,0xd1,0x6,0x64,0xde,0x26,0xf9,0x9f,0x88,0x0,0x2d,0x31,0x0,0x8,0x3c,0xcb,0x44,0x26,0x38,0x5,0x40,0x8,0x60,0x4,0x23,0x24,0x2,0xc0,0xf,0x81,0xb2,0x7f,0xe7,0xe0,0xf8,0x0,0x70 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L0_NewMail_128x51[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L0_NewMail_128x51_0, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NewMail_128x51_1, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NewMail_128x51_2, | ||||||
|  | 
 | ||||||
|  |     _A_L0_NewMail_128x51_3, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L0_NewMail_128x51 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 51, | ||||||
|  |         .frame_count = 4, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L0_NewMail_128x51 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 2, 3, 2, 1 }, | ||||||
|  |     .passive_frames = 6, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 0, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = NULL, | ||||||
|  |     .frame_bubble_sequences_count = 0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const StorageAnimation dolphin_blocking[] = { | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L0_NoDb_128x51, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L0_NoDb_128x51", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 0, | ||||||
|  |             .min_level = 0, | ||||||
|  |             .max_level = 0, | ||||||
|  |             .weight = 0, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L0_SdBad_128x51, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L0_SdBad_128x51", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 0, | ||||||
|  |             .min_level = 0, | ||||||
|  |             .max_level = 0, | ||||||
|  |             .weight = 0, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L0_SdOk_128x51, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L0_SdOk_128x51", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 0, | ||||||
|  |             .min_level = 0, | ||||||
|  |             .max_level = 0, | ||||||
|  |             .weight = 0, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L0_Url_128x51, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L0_Url_128x51", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 0, | ||||||
|  |             .min_level = 0, | ||||||
|  |             .max_level = 0, | ||||||
|  |             .weight = 0, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L0_NewMail_128x51, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L0_NewMail_128x51", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 0, | ||||||
|  |             .min_level = 0, | ||||||
|  |             .max_level = 0, | ||||||
|  |             .weight = 0, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const size_t dolphin_blocking_size = COUNT_OF(dolphin_blocking); | ||||||
							
								
								
									
										7
									
								
								assets/compiled/assets_dolphin_blocking.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								assets/compiled/assets_dolphin_blocking.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stddef.h> | ||||||
|  | #include <desktop/animations/animation_storage_i.h> | ||||||
|  | 
 | ||||||
|  | extern const StorageAnimation dolphin_blocking[]; | ||||||
|  | extern const size_t dolphin_blocking_size; | ||||||
							
								
								
									
										324
									
								
								assets/compiled/assets_dolphin_internal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								assets/compiled/assets_dolphin_internal.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,324 @@ | |||||||
|  | #include <assets_dolphin_internal.h> | ||||||
|  | #include <desktop/animations/animation_storage_i.h> | ||||||
|  | #include <desktop/animations/animation_manager.h> | ||||||
|  | #include <gui/icon_i.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_0[] = { | ||||||
|  |     0x1,0x0,0xca,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0xa,0x8a,0x8,0x24,0x21,0x31,0x40,0x38,0x0,0x81,0x2d,0x20,0x8,0x41,0xeb,0x38,0x7,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x2,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x82,0x60,0x2f,0xe0,0xf7,0xa8,0x78,0x66,0x7,0x61,0x81,0x58,0x11,0xa3,0x2,0xc0,0x43,0xce,0x47,0x48,0x8f,0x25,0x8a,0x5,0x30,0x80,0x41,0x90,0x64,0xf,0x43,0xf9,0xc0,0x7f,0x5,0xb1,0x81,0x78,0x27,0xe0,0xf1,0xff,0xff,0xc7,0x2,0xba,0x20,0x30,0xc0,0x7e,0x10,0x3f,0x4,0x9f,0xc1,0x1f,0x22,0x8e,0x10,0x1e,0x56,0x1,0x39,0x2,0xc6,0xc1,0x26,0xf0,0x48,0xc4,0xc3,0x82,0x7,0x94,0x78,0x1e,0x5c,0x8,0x1f,0x2,0x27,0xc0,0xa0,0x8d,0x8a,0x7,0x0,0xf0,0x38,0x8a,0x8,0x55,0x12,0xf8,0xf0,0x11,0xc3,0x10,0x80,0xa3,0x44,0xec,0x41,0x71,0x30,0x8b,0x1c,0x81,0xe7,0xf0,0x9f,0xae,0x48,0x1e,0x20,0x43,0x7,0x96,0x80,0xa,0x34,0x0,0x51,0xc4,0x16,0x46,0xf,0xa9,0x7,0xd0,0x1e,0xbf,0x2,0x58,0x83,0xd6,0x18,0x5f,0x10,0x79,0xff,0x20,0xe0,0xf1,0x27,0x9d,0x2,0x9,0x7c,0x63,0x88,0x3c,0xbf,0xd0,0xf0,0x7a,0xe0,0x21,0x6,0xe1,0x16,0xe,0xf,0xff,0xfd,0xfb,0xaa,0xc7,0xfe,0xa6,0x10,0x78,0x9b,0xce,0x19,0x9c,0xff,0xa3,0x4,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc0,0x30,0x80,0x3,0x3f,0xf,0x97,0xe0,0x54,0x22,0xf1,0x45,0x88,0x3d,0x39,0xe0,0xf1,0xc0,0x15,0x87,0xff,0x3,0x26,0x8f,0x81,0xf8,0x64,0x61,0x7,0x8d,0xc0,0xa,0x3f,0xc0,0xa0,0x8f,0x10,0x0,0x3f,0x30,0x78,0xc3,0x82,0xe7,0x40,0x7,0xb7,0xd2,0x7f,0xf0,0xe0,0x83,0xd7,0xf8,0xe,0x3b,0xff,0xdf,0xbf,0xf,0xd3,0x18,0x8c,0x1e,0x3c,0x30,0x79,0xe7,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xb3,0x3c,0x6,0x0,0x1e,0x7e,0xf0,0x78,0xd3,0xe9,0x39,0x26,0x38,0x83,0xc6,0x80,0xf,0x4f,0x9f,0xdf,0x3e,0x5,0x23,0xe8,0x83,0xc4,0x40,0x24,0x63,0xfe,0x3,0xc4,0xa,0x51,0x80,0x7a,0x7,0xcd,0x84,0x31,0xf1,0x61,0x47,0x1,0xe5,0x10,0x7,0xbc,0x8,0x18,0x31,0xe0,0x10,0xd8,0x1,0xf1,0x4,0x6,0x8,0xfc,0xae,0xf,0x31,0xf3,0x83,0xd4,0x78,0x3c,0x6,0x99,0x6f,0x1,0xe3,0xc3,0xb,0xf,0xe0,0x1e,0x56,0x6,0x18,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x68,0x8f,0x9c,0x3e,0xae,0x64,0x80,0x4e,0x1,0xe2,0x4f,0x60,0x7a,0xc8,0x1,0xfe,0x2f,0x20,0x7f,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_1[] = { | ||||||
|  |     0x1,0x0,0xcc,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x8,0x88,0x88,0x41,0x63,0x20,0x7,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x5,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0xf,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x8,0xae,0x8,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x1,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x80,0xf5,0xf8,0x44,0x60,0x10,0xe0,0xf9,0xc8,0x21,0x85,0xf1,0x7,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0x40,0x82,0x5f,0x26,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x10,0x83,0x70,0x8b,0x7,0x3f,0xff,0xfe,0xfd,0xd6,0x24,0xa6,0x10,0x78,0x9b,0xce,0x19,0xbc,0xff,0xa3,0x4,0x1e,0x51,0xd0,0x59,0x70,0x54,0x87,0xf8,0x67,0x9f,0xfe,0x7e,0x1f,0x2f,0xc6,0xc,0x4a,0x4d,0x41,0x7,0xa7,0x3c,0x12,0x38,0x3,0x18,0xff,0xe0,0xf8,0x5,0xca,0x0,0x7,0xe0,0xf,0x1b,0x80,0x14,0x7f,0x90,0x10,0x79,0x7,0xd3,0xe6,0xf,0x18,0x70,0x5c,0xe8,0x0,0xf6,0xfa,0x4f,0xfe,0x1c,0x10,0x7a,0xff,0x1,0xc7,0x7f,0xfb,0xf7,0xe1,0xfa,0x63,0x11,0x83,0xc4,0x3c,0x99,0xff,0xbc,0x7f,0x61,0x79,0xbf,0x2c,0xcf,0x1,0x87,0x7,0x9f,0xbc,0x1e,0x34,0xfa,0x4e,0x4a,0x2,0xf,0x2e,0x6,0x4,0x9c,0x9f,0x75,0x30,0x80,0x8,0x1e,0x5e,0x3,0x8,0x80,0xb,0xf8,0xf,0x10,0x29,0x7e,0x1,0xe5,0x60,0xc0,0x6,0xd,0x84,0x31,0xf1,0x61,0x7f,0x1,0xe5,0x30,0x7,0xbc,0x8,0x18,0x25,0x2,0xb0,0x3,0xe2,0x8,0xc,0x1b,0xf8,0x8,0x6e,0x11,0x8c,0x7,0x9c,0x1e,0xb1,0x88,0x7,0x0,0x9e,0x5b,0xc0,0x78,0xf0,0xe1,0xe4,0x81,0x7,0x95,0x81,0x86,0x3f,0xf7,0x78,0xcf,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0xf,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x0,0x7f,0x8b,0xc8,0x1f,0xc0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_2[] = { | ||||||
|  |     0x1,0x0,0xc1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0xa,0x8a,0x8,0x24,0x21,0x31,0x40,0x38,0x0,0x81,0x2d,0x20,0x8,0x41,0xeb,0x38,0x7,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x2,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x7,0xd5,0x43,0xc3,0x30,0x3b,0x9,0xbc,0xe0,0x58,0x8,0x79,0xc8,0xe9,0x11,0xe4,0xb1,0x3,0xd1,0x4,0xb4,0x83,0xf9,0xa8,0xce,0x5,0xe0,0x9f,0x83,0xc7,0xff,0xff,0xbf,0xae,0x8c,0xc,0x20,0x1,0x81,0xf8,0x24,0xfe,0x8,0xf9,0x14,0x70,0x80,0xf2,0xb0,0x8,0xce,0x3d,0x60,0x93,0x78,0x24,0x68,0x21,0xc1,0x2,0x8c,0x1e,0x70,0x3e,0x4,0x4f,0x81,0x41,0x7,0x8c,0xa,0x7,0x0,0xf0,0xf,0x8c,0xaa,0x25,0xf1,0xe0,0x23,0x86,0x21,0x1,0x46,0x89,0xd8,0x80,0x3,0x30,0x9,0x98,0x3c,0xfe,0x13,0xf5,0xc9,0x40,0x3f,0x10,0x90,0x7a,0xe8,0x0,0xa3,0x40,0x7,0x9c,0x1e,0xc,0xf,0xc1,0xe8,0xfd,0x1,0xeb,0xf0,0x25,0x88,0x3c,0xd1,0x23,0xfc,0x2f,0x88,0x3c,0xff,0x90,0x70,0x78,0x93,0xc8,0x4,0x3e,0xb,0xfb,0x1c,0x41,0xe5,0xfe,0x87,0x83,0xdb,0x81,0xe1,0x4,0x8f,0xc3,0x7,0xff,0xfe,0xfd,0xd5,0x44,0xa6,0x11,0x90,0xce,0x3e,0x1,0x51,0x86,0x67,0x3f,0xe2,0x71,0x7,0x94,0x74,0x1e,0x30,0x8f,0xe0,0x78,0x5a,0x43,0xb8,0x64,0x1f,0xfe,0x7e,0x1f,0x2f,0xc4,0x4e,0x1,0xe,0x73,0xf,0xc0,0x1e,0x9c,0xf0,0x79,0x44,0x3c,0x1c,0x8,0x19,0x34,0x7c,0xa,0x93,0x23,0x8,0x3c,0xdf,0x42,0xf,0x30,0xfa,0x7c,0xc1,0xe3,0x1e,0x40,0x9,0x3c,0x68,0x0,0xf6,0xfa,0x4f,0xfe,0x13,0x99,0x30,0x9c,0x81,0xe3,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xfd,0xa7,0xe0,0xf4,0xe1,0x83,0xcf,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe0,0x79,0x48,0x30,0x18,0x0,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe6,0x98,0xe2,0xf,0x1a,0x0,0x3d,0x3e,0x7f,0x7c,0xf8,0x14,0x91,0xc5,0x20,0x10,0x9,0xb8,0xff,0x80,0xf1,0x2,0x94,0x60,0x1e,0x81,0xf3,0x61,0xc,0x7c,0x58,0x51,0xc0,0x79,0x44,0x1,0xef,0x2,0x6,0xc,0x78,0x4,0x36,0x0,0x7c,0x41,0x1,0x82,0x3f,0x2b,0x84,0x23,0x1,0xe7,0x7,0xa8,0xf0,0x78,0xa,0x31,0x80,0x6f,0x1,0xe3,0xc3,0xb,0xf,0xe0,0x1e,0x56,0x5,0x68,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x80,0xb,0xc4,0x3e,0xae,0x64,0x80,0x4e,0x1,0xe2,0x4f,0x60,0x7a,0xb8,0xc4,0x1f,0xe5,0xf7,0x7,0xc0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_3[] = { | ||||||
|  |     0x1,0x0,0xc0,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x4,0xfc,0x1e,0x3f,0xf0,0x1,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x4,0x7c,0x54,0x30,0x4f,0x3,0x98,0x42,0x22,0x0,0x28,0xf4,0x80,0x1e,0x33,0xf1,0x60,0xc1,0xa3,0x87,0x41,0x81,0x83,0xce,0x7,0xc0,0x89,0xf0,0x28,0xe0,0xf1,0x8d,0x3,0x7,0xc0,0xe,0x33,0xa8,0x97,0xc7,0x81,0x83,0x2e,0xf,0x94,0x14,0x37,0x80,0x79,0xcc,0x2,0x66,0xf,0x28,0x28,0xe4,0x97,0xcc,0xf,0x3d,0x1,0xec,0x8a,0x2,0x9e,0x43,0x68,0x83,0xcc,0x2e,0x44,0xe4,0xf2,0x2e,0x4c,0x1e,0x3f,0x8,0x8c,0x2,0x1c,0x1f,0x39,0xe5,0xf2,0xd,0x18,0x7,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0xc2,0x87,0xf3,0x11,0x82,0xf,0x2f,0xf4,0x3e,0x7f,0x10,0x7,0x9c,0x4,0x42,0x22,0xf1,0xf8,0x67,0xff,0xff,0xdf,0xba,0xa8,0x83,0x23,0x80,0x8,0x8c,0x38,0x9e,0x30,0xcd,0xe7,0xfd,0x18,0x20,0xf2,0x8e,0x83,0xcc,0x8a,0x50,0x2f,0xc3,0x20,0xff,0xf3,0xf0,0xf9,0xe0,0x4,0xa5,0x1,0xf8,0x3,0xd3,0x9e,0xf,0x31,0x38,0xc1,0xc0,0x84,0x79,0x32,0x30,0x83,0xc6,0xe1,0x1,0xfe,0x7f,0x20,0x21,0x43,0x0,0x1f,0xcc,0x1e,0x30,0xef,0xf3,0xa8,0x60,0x14,0x0,0x7b,0x7d,0x27,0xff,0xe,0x8,0x9c,0xc1,0xe3,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x42,0xf,0x30,0xf2,0x67,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xf,0x29,0x6,0x3,0xe,0xf,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x92,0x80,0x41,0xe3,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x1,0x3,0xcb,0xc0,0x96,0x20,0x0,0xff,0x1,0xe2,0x5,0x2f,0xc0,0x3c,0xac,0x9,0x41,0x0,0x13,0x8,0x63,0xe2,0xc2,0xfe,0x3,0xca,0x60,0xf,0x78,0x10,0x30,0x4a,0x5,0x60,0x7,0xc4,0x10,0x18,0x37,0xf0,0x10,0xdc,0x23,0x18,0xf,0x38,0x3d,0x63,0x10,0xe,0x1,0x3c,0xb7,0x80,0xf1,0xe1,0xc3,0xc9,0x2,0xf,0x2b,0x3,0xc,0x7f,0xf0,0x38,0x4,0xfe,0x1e,0xf,0x1d,0x7c,0xcb,0xf6,0xf,0x14,0xb2,0x3d,0xc9,0xcc,0x3e,0x70,0xfa,0xb9,0x92,0x1,0x38,0x7,0x89,0x3d,0x81,0xeb,0x20,0x7,0xf8,0xbc,0x81,0xfc | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_4[] = { | ||||||
|  |     0x1,0x0,0xcb,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x61,0x10,0x74,0x63,0xf6,0x9,0x37,0x82,0x46,0x26,0x18,0x34,0x71,0x64,0x90,0x2e,0x4,0xf,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0x97,0x4,0xfa,0x67,0x51,0x2f,0x8f,0x0,0x32,0x31,0xf,0x28,0x2c,0x63,0xa,0xd3,0x30,0x8a,0xe0,0x81,0xe5,0x5,0x77,0x2c,0x20,0xca,0x25,0xd1,0x7,0x96,0x81,0x2c,0x44,0xe2,0xb,0x88,0x1c,0x55,0x24,0xf,0x25,0xd9,0x3,0xce,0x41,0xf4,0x1b,0x10,0x3c,0xbe,0x11,0x18,0x4,0x38,0x1e,0x90,0xc8,0x7c,0x58,0x1e,0x7f,0xcf,0x3f,0x2,0x12,0xa9,0x28,0x5,0x2,0x8,0x19,0x20,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x4,0xf3,0xf8,0x60,0xff,0xff,0xdf,0xba,0xc4,0x94,0xc2,0xf,0x13,0x79,0xc3,0x33,0x9f,0xf8,0x7,0x80,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc3,0x3c,0xff,0xf3,0xf0,0xf9,0x7e,0x5,0x42,0xd7,0x16,0xa0,0x83,0xd3,0x9e,0xf,0x1c,0x3,0x50,0x7f,0xf0,0x32,0x68,0xf8,0x5,0x4,0x0,0x1f,0x80,0x3c,0x6e,0x0,0x51,0xfe,0x40,0x41,0xe4,0x1f,0x4f,0x98,0x3c,0x61,0xc1,0x73,0xa0,0x3,0xdb,0xe9,0x3f,0xf8,0x70,0x41,0xeb,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x46,0xf,0x1e,0x18,0x3c,0xf3,0xff,0x78,0xfe,0xc2,0xf3,0x7e,0x59,0x9e,0x3,0x0,0xf,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x93,0x10,0xa4,0x14,0x0,0x7a,0x7c,0xfe,0xf9,0xf0,0x29,0x1f,0x44,0x1e,0x22,0x1,0x23,0x1f,0xf0,0x1e,0x20,0x52,0x76,0x88,0x3c,0xc3,0xe6,0xc2,0x18,0xf8,0xb0,0xa3,0x80,0xf2,0x88,0x3,0xdd,0xc2,0x51,0xe0,0x10,0xd8,0x1,0xf1,0x4,0x6,0x8,0xfc,0xae,0x10,0x8c,0x7,0x9c,0x1e,0xa3,0xc1,0xe0,0x34,0xcb,0x78,0xf,0x1e,0x18,0x58,0x7f,0x0,0xf2,0xb0,0x30,0xc6,0xfe,0xf,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x98,0x7c,0xe1,0xf5,0x73,0x24,0x2,0x70,0xf,0x12,0x7b,0x3,0xd6,0x40,0xf,0xf1,0x79,0x3,0xf8 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_5[] = { | ||||||
|  |     0x1,0x0,0xd1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x8,0x88,0x88,0x41,0x63,0x20,0x7,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x5,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0xf,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x8,0xae,0x8,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x1,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x9f,0x3,0xe8,0x83,0xcb,0xe1,0x11,0x80,0x43,0x83,0xe7,0x20,0x86,0x43,0xe2,0x60,0xf3,0xfe,0x79,0xf8,0x10,0x98,0x30,0x3c,0xa8,0x2,0xf1,0x3c,0x8,0x3c,0xbf,0xd0,0xf9,0xfc,0x40,0x1e,0x78,0x6,0x39,0xfc,0x33,0xff,0xff,0xef,0xdd,0x62,0x4a,0x61,0x7,0x89,0xbc,0x41,0xe3,0xc,0xde,0x7f,0xd1,0x82,0xf,0x28,0xe8,0x80,0xb8,0x30,0x32,0x78,0xc0,0xbf,0xc,0xf3,0xff,0xcf,0xc3,0xe5,0xf8,0xc1,0x89,0x49,0xa8,0x20,0xf4,0xe7,0x82,0x47,0x0,0x63,0x1f,0xfc,0x1f,0x0,0xb9,0x40,0x0,0xfc,0x1,0xe3,0x70,0x2,0x8f,0xf2,0x2,0xf,0x20,0xfa,0x7c,0xc1,0xe3,0xe,0xb,0x9d,0x0,0x1e,0xdf,0x49,0xff,0xc3,0x82,0xf,0x5f,0xe0,0x38,0xef,0xff,0x7e,0xfc,0x3f,0x4c,0x62,0x30,0x78,0x87,0x93,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe5,0x99,0xe0,0x30,0xe0,0xf3,0xf7,0x83,0xc6,0x9f,0x49,0xc9,0x40,0x41,0xe5,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x1,0x3,0xcb,0xc0,0x61,0x10,0x1,0x7f,0x1,0xe2,0x5,0x2f,0xc0,0x3c,0xac,0x18,0x0,0xc1,0xb0,0x86,0x3e,0x2c,0x2f,0xe0,0x3c,0xa6,0x0,0xf7,0x81,0x3,0x4,0xa0,0x56,0x0,0x7c,0x3f,0x6,0x1,0x7f,0x1,0xd,0xc2,0x31,0x80,0xf3,0x83,0xd6,0x31,0x0,0xe0,0x13,0xcb,0x78,0xf,0x1e,0x1c,0x3c,0x90,0x20,0xf2,0xb0,0x30,0xc7,0xff,0x3,0x80,0x4f,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0xf,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x0,0x7f,0x8b,0xc8,0x1f,0xc0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_6[] = { | ||||||
|  |     0x1,0x0,0xc1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x4,0xfc,0x1e,0x3f,0xf0,0x1,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x4,0x7c,0x54,0x30,0x4f,0x3,0x98,0x58,0x49,0x1e,0xb0,0x49,0xbc,0x12,0x31,0x60,0xc1,0xa3,0x8b,0x24,0x0,0xc,0xf,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0xc0,0x2c,0x0,0xe3,0x3a,0x89,0x7c,0x78,0x1,0x91,0x88,0x79,0x41,0x43,0x18,0x7,0x9c,0xc0,0x26,0x60,0xf2,0x82,0xbb,0x8f,0xf0,0x41,0x14,0x99,0x83,0xcb,0x40,0x7b,0x20,0x60,0xc1,0x2f,0xc8,0x34,0x7,0x98,0x5c,0x81,0xe5,0x80,0x8f,0xfd,0x1,0xeb,0xf0,0x88,0xc0,0x21,0xc2,0xc3,0xf0,0x43,0xcf,0x62,0xf,0x3f,0xe7,0x9f,0x81,0x9,0x4f,0xb,0x20,0x90,0xe2,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0x57,0x4,0x22,0x10,0x20,0xfc,0x30,0x7f,0xff,0xef,0xdd,0x54,0x51,0xf3,0xe0,0x9b,0xd2,0x19,0x9c,0xff,0x8e,0x4,0x1e,0x51,0xd8,0x2,0xcc,0x78,0x9,0x71,0x69,0xe,0xe1,0x90,0x7f,0xf9,0xf8,0xe4,0x6f,0x1f,0x81,0x50,0xb5,0xc6,0x3,0xf0,0x7,0xa7,0x3c,0x1e,0x38,0x1,0x0,0xb8,0x4,0x9a,0x3e,0x6,0x4a,0x7c,0x1,0xe3,0x70,0x2,0x8f,0xf1,0xae,0x43,0xc3,0x0,0xf,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x1,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x3,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x7,0x9f,0xc,0x1e,0x79,0xff,0xbc,0x7f,0x61,0x79,0x68,0x8,0x0,0x64,0x18,0xc,0x0,0x3c,0xfd,0xe0,0xf1,0xa7,0xd2,0x72,0x4c,0x41,0x7,0x8d,0x0,0x1e,0x9f,0x3f,0xbe,0x7c,0xa,0x47,0xd1,0x7,0x88,0x80,0x48,0xc7,0xfc,0x7,0x88,0x14,0xa3,0x0,0xf4,0xf,0x9b,0x8,0x63,0xe2,0xc2,0x8e,0x3,0xca,0x20,0xf,0x77,0x8,0xc0,0x23,0xc0,0x21,0xb0,0x3,0xe2,0x8,0xc,0x11,0xf9,0x5c,0x21,0x18,0xf,0x38,0x3d,0x47,0x83,0xc0,0x51,0x8c,0x3,0x78,0xf,0x1e,0x18,0x58,0x7f,0x0,0xf2,0xb0,0x30,0xc6,0xfe,0xf,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x44,0x7c,0xe1,0xf5,0x73,0x24,0x2,0x70,0xf,0x12,0x7b,0x3,0xd6,0x40,0xf,0xf1,0x79,0x3,0xf8 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_Tv_128x47_7[] = { | ||||||
|  |     0x1,0x0,0xcd,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x7f,0x8,0x1f,0x82,0x7e,0xf,0x1f,0xf8,0x0,0xa1,0xf0,0xf,0xf0,0x14,0xe1,0xde,0x9,0x3f,0x82,0x3e,0x2a,0x18,0x27,0x81,0xcc,0x21,0x11,0x27,0x14,0xc2,0x40,0xf,0x19,0xf8,0xb0,0x60,0xd1,0xc3,0xa0,0xc0,0xc1,0xe5,0x74,0xe0,0x70,0x22,0x7c,0xa,0x38,0x3c,0x63,0x40,0xc1,0xf0,0x13,0x8f,0xf9,0x1,0x2f,0x8f,0x3,0x6,0x5c,0x1f,0x28,0x28,0x6f,0x0,0xf3,0xfc,0xd,0x85,0x12,0x20,0xf2,0x82,0x81,0x86,0x3c,0xc,0x17,0xc8,0x92,0xc8,0x1e,0x7a,0x3,0xd9,0x6,0x46,0x9,0x7e,0x22,0xd,0xfc,0x1e,0xaa,0xb2,0x20,0x8c,0x13,0x0,0x1d,0x1c,0x38,0x18,0x41,0xe5,0xf0,0x88,0xc0,0x21,0xc1,0xf1,0xa,0xf,0x83,0x1f,0x1,0x9,0x8,0x3c,0xbf,0x9e,0x7e,0x4,0x26,0xc,0xc8,0x3f,0xc7,0xfd,0x3a,0x20,0xf2,0xff,0x43,0xe7,0xf1,0x0,0x78,0xae,0x9,0xc6,0x7f,0xc,0xff,0xff,0xfb,0xf7,0x55,0x94,0x7d,0xe4,0x20,0xf4,0x86,0x6f,0x3f,0xe3,0x81,0x7,0x94,0x74,0xc4,0x53,0x7,0x11,0x8d,0x4,0x0,0x73,0xf2,0x48,0xde,0x3f,0x1c,0x31,0x28,0xc0,0x20,0x3f,0x0,0x7a,0x73,0xc1,0x23,0x80,0x83,0xe0,0x3f,0xe0,0x21,0x5c,0xa9,0x18,0x41,0xe3,0x70,0x2,0x8f,0xf9,0x80,0x23,0xc4,0x0,0xf,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x1,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x3,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x7,0x98,0x79,0x33,0xff,0x78,0xfe,0xc2,0xf2,0xd0,0x10,0x0,0xc8,0x30,0x18,0x70,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe4,0x9e,0x22,0xf,0x1e,0x6,0x4,0x9c,0x9f,0x75,0x30,0x80,0x8,0x1e,0x5e,0x3,0x8,0x80,0xb,0xf8,0xf,0x10,0x29,0x7e,0x1,0xe5,0x60,0x42,0x8,0x0,0x98,0x43,0x1f,0x16,0x17,0xf0,0x1e,0x53,0x0,0x7b,0xc0,0x81,0x82,0x50,0x2b,0x0,0x3e,0x20,0x80,0xc1,0xbf,0x80,0x86,0xe1,0x18,0xc0,0x79,0xc1,0xeb,0x18,0x80,0x70,0x9,0xe5,0xbc,0x7,0x8f,0xe,0x1e,0x48,0x10,0x79,0x58,0x18,0x63,0xff,0x81,0xc0,0x27,0xf0,0xf0,0x78,0xeb,0xe6,0x5f,0xb0,0x78,0xa5,0x91,0xee,0x4e,0x61,0xf3,0x87,0xd5,0xcc,0x90,0x9,0xc0,0x3c,0x49,0xec,0xf,0x59,0x0,0x3f,0xc5,0xe4,0xf,0xe0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L1_Tv_128x47[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_0, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_1, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_2, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_3, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_4, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_5, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_6, | ||||||
|  | 
 | ||||||
|  |     _A_L1_Tv_128x47_7, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_Tv_128x47_bubble_0_0; | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_Tv_128x47_bubble_1_0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble* const L1_Tv_128x47_bubble_sequences[] = { | ||||||
|  | 
 | ||||||
|  |     &L1_Tv_128x47_bubble_0_0, | ||||||
|  | 
 | ||||||
|  |     &L1_Tv_128x47_bubble_1_0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_Tv_128x47_bubble_0_0 = { | ||||||
|  |     .bubble = { | ||||||
|  |         .x = 1, | ||||||
|  |         .y = 23, | ||||||
|  |         .text = "Take the red pill", | ||||||
|  |         .align_h = AlignRight, | ||||||
|  |         .align_v = AlignBottom, | ||||||
|  |     }, | ||||||
|  |     .start_frame = 7, | ||||||
|  |     .end_frame = 9, | ||||||
|  |     .next_bubble = NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_Tv_128x47_bubble_1_0 = { | ||||||
|  |     .bubble = { | ||||||
|  |         .x = 1, | ||||||
|  |         .y = 23, | ||||||
|  |         .text = "I can joke better", | ||||||
|  |         .align_h = AlignRight, | ||||||
|  |         .align_v = AlignBottom, | ||||||
|  |     }, | ||||||
|  |     .start_frame = 7, | ||||||
|  |     .end_frame = 9, | ||||||
|  |     .next_bubble = NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L1_Tv_128x47 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 47, | ||||||
|  |         .frame_count = 8, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L1_Tv_128x47 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 2, 3, 4, 5, 6, 7 }, | ||||||
|  |     .passive_frames = 6, | ||||||
|  |     .active_frames = 2, | ||||||
|  |     .active_cooldown = 5, | ||||||
|  |     .active_cycles = 2, | ||||||
|  |     .duration = 3600, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = L1_Tv_128x47_bubble_sequences, | ||||||
|  |     .frame_bubble_sequences_count = COUNT_OF(L1_Tv_128x47_bubble_sequences), | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_BadBattery_128x47_0[] = { | ||||||
|  |     0x1,0x0,0xb,0x1,0x0,0x47,0xfb,0xfe,0x0,0x2b,0x38,0x3e,0x60,0x40,0x43,0xbf,0x3,0xe7,0xa5,0xf3,0xff,0xf9,0x2f,0xf5,0x60,0xff,0x5a,0x81,0xf3,0xa,0x2,0x18,0x7e,0x81,0xe9,0xea,0x87,0x8b,0xf7,0xad,0x1d,0x7,0xef,0xaa,0x30,0x2f,0xd0,0xfd,0x62,0xa6,0x30,0x9,0x84,0x18,0x7f,0x50,0xa8,0xdc,0x2,0xc1,0x3,0x2f,0xdc,0x3a,0x1,0xc0,0x80,0x9f,0xec,0x1e,0x61,0xfb,0x17,0x98,0x7e,0x89,0xe8,0x9f,0xf5,0xff,0x87,0xfc,0xff,0x69,0xf4,0x8f,0x83,0xe3,0xc5,0x1,0xff,0x40,0xd7,0xf7,0xfa,0x83,0xfc,0x60,0xe1,0xfb,0x7,0x8f,0xfc,0x1e,0x23,0xfa,0xff,0x2,0x8c,0xbf,0x40,0xf4,0x3f,0xd0,0x7f,0xfe,0x5c,0xff,0xff,0xd2,0xa2,0x1f,0xaf,0x9,0x34,0x40,0x3,0x7e,0x7,0x46,0x3,0x8f,0xff,0x0,0x15,0x9c,0x1f,0x1c,0xe,0x7c,0x4,0x57,0x20,0x2,0xa0,0x4b,0xc1,0xd9,0x0,0x90,0x47,0x81,0xfb,0x10,0x87,0x3,0xf6,0x10,0x5e,0x30,0x5,0x61,0x20,0xa0,0xfd,0xa1,0x3,0xfa,0x4c,0xf,0x64,0x29,0x80,0xe,0x3e,0xf,0xe0,0x7,0x97,0x9f,0x8f,0x18,0xb3,0x62,0xe6,0xd6,0xed,0xc,0x6c,0x1e,0xfb,0x7e,0xb5,0x6f,0xbb,0xd4,0xa7,0xef,0x7d,0x70,0x78,0x84,0xe6,0x71,0xe6,0xf7,0x53,0xa0,0x21,0xf1,0xa1,0x77,0xaa,0x52,0xed,0xe,0x6a,0xf,0xb0,0x82,0xd2,0x29,0x32,0x4a,0x94,0x7,0x6f,0xda,0xf,0x8f,0x5a,0xdd,0xbd,0xbd,0x41,0xea,0x11,0x99,0xc5,0x3f,0xc9,0x8e,0x1f,0x8c,0x5a,0xb4,0x3f,0x1b,0x7d,0x87,0x1a,0x2f,0x19,0x8,0x7c,0xb1,0x46,0xf8,0x7,0x8e,0x76,0x71,0x49,0xf2,0x64,0x81,0xf2,0x5f,0x60,0x7f,0x80 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_BadBattery_128x47_1[] = { | ||||||
|  |     0x1,0x0,0x11,0x1,0x0,0x47,0xfb,0xfe,0x0,0x2b,0x38,0x3e,0x60,0x40,0x43,0xbf,0x3,0xe7,0xa5,0xf3,0xff,0xf9,0x2f,0xf5,0x60,0xff,0x5a,0x81,0xf3,0xa,0x2,0x18,0x7e,0x81,0xe9,0xea,0x87,0x8b,0xf7,0xad,0x1d,0x7,0xef,0xaa,0x30,0x2f,0xd0,0xfd,0x62,0xa6,0x30,0x9,0x84,0x18,0x7f,0x50,0xa8,0xdc,0x2,0xc1,0x3,0x2f,0xdc,0x3a,0x1,0xc0,0x80,0x9f,0xec,0x1e,0x61,0xfb,0x17,0x98,0x7e,0x89,0xe8,0x9f,0xf5,0xff,0x87,0xfc,0xff,0x70,0xf,0xe4,0x5,0x3e,0x31,0xf0,0x7c,0x78,0xa0,0x3c,0x28,0x1a,0xfe,0xff,0x50,0x7f,0x8c,0x1c,0x3f,0x60,0xf1,0xfc,0x83,0xc4,0x7f,0x5f,0xe8,0x7f,0xfc,0x1e,0x25,0xfa,0x7,0x89,0xff,0x41,0xe8,0x1f,0xaf,0x97,0x3f,0xff,0xf4,0xa8,0x87,0xeb,0xc2,0x3d,0x10,0x0,0xdf,0x81,0xd1,0x80,0xe3,0xff,0xc0,0x5,0x67,0x7,0xc7,0x3,0x9e,0x9d,0x10,0x5,0xd0,0x25,0xe0,0xec,0x80,0x48,0x23,0xc0,0xfd,0x88,0x43,0x81,0xfb,0x8,0x2f,0x18,0x2,0xb0,0x90,0x50,0x7e,0xd0,0x81,0xfd,0x26,0x7,0xb2,0x14,0xc0,0x7,0x1f,0x7,0xf0,0x3,0xcb,0xcf,0xc7,0x8c,0x59,0xb1,0x73,0x6b,0x76,0x86,0x36,0xf,0x7d,0xbf,0x5a,0xb7,0xdd,0xea,0x53,0xf7,0xbe,0xb8,0x3c,0x42,0x73,0x38,0xf3,0x7b,0xa9,0xd0,0x10,0xf8,0xd0,0xbb,0xd5,0x29,0x76,0x87,0x35,0x7,0xd8,0x41,0x69,0x14,0x99,0x25,0x4a,0x3,0xb7,0xed,0x7,0xc7,0xad,0x6e,0xde,0xde,0xa0,0xf5,0x8,0xcc,0xe2,0x9f,0xe4,0xc7,0xf,0xc6,0x2d,0x5a,0x1f,0x8d,0xbe,0xc3,0x8d,0x17,0x8c,0x84,0x3e,0x58,0xa3,0x7c,0x3,0xc7,0x3b,0x38,0xa4,0xf9,0x32,0x40,0xf9,0x2f,0xb0,0x3f,0xc0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L1_BadBattery_128x47[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L1_BadBattery_128x47_0, | ||||||
|  | 
 | ||||||
|  |     _A_L1_BadBattery_128x47_1, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_BadBattery_128x47_bubble_0_0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble* const L1_BadBattery_128x47_bubble_sequences[] = { | ||||||
|  | 
 | ||||||
|  |     &L1_BadBattery_128x47_bubble_0_0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_BadBattery_128x47_bubble_0_0 = { | ||||||
|  |     .bubble = { | ||||||
|  |         .x = 4, | ||||||
|  |         .y = 21, | ||||||
|  |         .text = "I feel so sick!\nI'm dying...", | ||||||
|  |         .align_h = AlignRight, | ||||||
|  |         .align_v = AlignCenter, | ||||||
|  |     }, | ||||||
|  |     .start_frame = 0, | ||||||
|  |     .end_frame = 1, | ||||||
|  |     .next_bubble = NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L1_BadBattery_128x47 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 47, | ||||||
|  |         .frame_count = 2, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L1_BadBattery_128x47 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1 }, | ||||||
|  |     .passive_frames = 2, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 3600, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = L1_BadBattery_128x47_bubble_sequences, | ||||||
|  |     .frame_bubble_sequences_count = COUNT_OF(L1_BadBattery_128x47_bubble_sequences), | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_0[] = { | ||||||
|  |     0x1,0x0,0x49,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x8,0x3f,0x80,0x22,0x70,0x40,0x10,0xc1,0x80,0x43,0xf4,0x7,0x8f,0x2,0xf,0x10,0xec,0x4,0x8,0x1e,0x38,0x3,0x89,0x7f,0x19,0xe7,0x10,0x90,0xb,0x8,0x1e,0x37,0x81,0x29,0x3,0xd8,0x98,0x40,0xf1,0x1a,0x98,0x3d,0x2c,0x0,0xf3,0xf2,0x78,0x16,0x24,0xf,0x5c,0x4,0xff,0xc0,0x3a,0x18,0xc4,0x7c,0x8,0x40,0xf6,0x45,0x8c,0xf8,0xfe,0x5f,0xc0,0x7b,0xd0,0x28,0x10,0x4e,0x4,0x3e,0xc1,0x80,0xff,0x8f,0xdc,0x1e,0x4c,0x81,0x3,0x8c,0xfc,0x1f,0x1c,0x2,0x49,0x40,0x3f,0xce,0xd1,0x7,0xc2,0xc0,0xff,0xc1,0x43,0x7,0xd4,0x8,0x8,0x60,0xff,0xfc,0x3,0xca,0x7,0x80,0xb0,0x2,0x8c,0xda,0x40,0x7,0xb0,0x83,0xfb,0xfc,0xb,0x30,0x7a,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_1[] = { | ||||||
|  |     0x1,0x0,0x42,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x0,0x7a,0xc1,0x0,0x43,0x6,0x1,0xf,0xd0,0x1e,0x3c,0x0,0x78,0xf8,0x2,0x44,0xf,0x1c,0x1,0xc4,0xbf,0x8c,0xf4,0x88,0x76,0x0,0x62,0xf,0x1b,0xc0,0x94,0x81,0xed,0x20,0x1e,0x88,0x3c,0x46,0xe6,0xf,0x72,0xe8,0xf9,0x3c,0xb,0x12,0x7,0xb5,0x80,0x1e,0x51,0x88,0xff,0x80,0x7f,0x18,0x9,0xf8,0x2c,0x42,0x23,0xfc,0x7,0xca,0x70,0x67,0xd6,0xc,0x7,0xfc,0x7f,0x14,0xa,0x4,0x13,0x81,0x8f,0xff,0xcf,0xc1,0xf6,0xd9,0x1f,0xfb,0xb4,0x41,0xf1,0xc0,0x2d,0x17,0xf8,0x6,0x40,0xf8,0x5,0x14,0x9,0x6a,0x60,0xff,0xfc,0x3,0xc8,0x4e,0x20,0xf4,0x36,0x90,0x1,0xf0,0x16,0x0,0x7e,0xc0,0x2c,0x20,0xf7 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_2[] = { | ||||||
|  |     0x1,0x0,0x41,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0xb,0xc4,0x3,0xa0,0xf,0xbb,0x6,0xe2,0x1,0xe8,0x7,0xdf,0xc3,0xf9,0x0,0xfa,0x3,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0xb,0x0,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0xf,0x14,0xfd,0xe4,0x8,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x1,0x95,0x22,0x4,0xf,0x1f,0xcc,0xbc,0x1e,0xb4,0x0,0x91,0x49,0x20,0x3f,0xf,0xff,0x2,0x3e,0xf,0x59,0x0,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x4,0x8a,0x93,0x2,0x5f,0x8e,0x3e,0x0,0xf,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x3,0x0,0xf,0x58,0x20,0x8,0x60,0xd8,0x8,0x27,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0xf,0x7f,0xc0,0x64,0x81,0xe3,0x1f,0x7,0xc4,0x13,0xec,0x10,0x1f,0x27,0x80,0x4e,0x60,0xf6,0x84,0x40,0xa0,0x1d,0x8f,0xf8,0x90,0x81,0xf0,0x2d,0x1f,0x7,0xc5,0x62,0x60,0xf5,0x8c,0x3,0xce,0x3f,0x70,0x7,0xc7,0x82,0x1e,0x5b,0x15,0x78,0xcf,0x1,0xf1,0x20,0x84,0x60,0x21,0xe0,0xf1,0x2f,0xcc,0x42,0x20,0xd8,0x1a,0x1f,0x2,0x1e,0xf,0xb0,0x49,0x1b,0xe6,0x21,0xf0,0x5,0x17,0xf8,0xde,0x7f,0x80,0x79,0x40,0xc1,0xe3,0x30,0x5,0x15,0xf5,0x6c,0x8f,0xb5,0x7,0x98,0x78,0xc1,0xff,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_3[] = { | ||||||
|  |     0x1,0x0,0x45,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0xb,0xc4,0x3,0xa0,0xf,0xbb,0x6,0xe2,0x1,0xe8,0x7,0xdf,0xc3,0xf9,0x0,0xfa,0x3,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0xb,0x0,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0xf,0x14,0xfd,0xe4,0x8,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x1,0x95,0x22,0x4,0xf,0x1f,0xcc,0xbc,0x1e,0xb4,0x0,0x91,0x49,0x20,0x3f,0xf,0xff,0x2,0x3e,0xf,0x59,0x0,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x4,0x8a,0x93,0x2,0x5f,0x8e,0x3e,0x0,0xf,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x3,0x0,0xf,0x58,0x20,0x8,0x60,0xd8,0x8,0x27,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0xf,0x7f,0xc0,0x64,0x81,0xe2,0x17,0x30,0x7a,0xc1,0x3e,0xc1,0x1,0xf2,0x78,0x16,0x26,0xf,0x68,0x44,0xa,0x1,0x18,0x8f,0xf8,0x7,0xf0,0xf,0x11,0x68,0x9f,0xc7,0xf8,0xf,0x88,0xc0,0x3c,0xac,0x18,0xf,0xf8,0xfe,0x3c,0x10,0xf2,0xd8,0x83,0x85,0xfa,0x20,0xf7,0x90,0x42,0x30,0x10,0xf8,0x7,0xf8,0x4,0x20,0xf7,0x88,0x44,0x1b,0x3,0x3,0xff,0x17,0x88,0x1f,0x20,0x91,0x8f,0xa5,0x4c,0x1e,0xdf,0x0,0x51,0x1c,0x84,0x0,0x5f,0x80,0x79,0x9,0xc6,0x21,0x30,0x5,0x11,0xb4,0x80,0xe,0xf,0xf0,0x7c,0x80 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_4[] = { | ||||||
|  |     0x1,0x0,0x3d,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x7,0xf8,0x10,0xfa,0x0,0xfc,0xe0,0x40,0x3d,0x0,0xfc,0xf0,0x40,0x3e,0x80,0xfb,0x98,0x7c,0x20,0x1f,0xce,0x4c,0x9b,0xce,0xf,0x8f,0x85,0xfc,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0x9,0xf8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xa4,0xe1,0x8f,0x83,0xcb,0x4c,0x2f,0x78,0x18,0x10,0xc1,0xe2,0x5f,0xbc,0x81,0x8,0x72,0x90,0x3e,0x88,0x3d,0x70,0x0,0x32,0xa4,0x40,0x81,0xe3,0xf9,0x97,0x83,0xd6,0x80,0x12,0x29,0x24,0x7,0xe1,0xff,0x22,0x8,0x3d,0x64,0x1,0x22,0xc9,0x41,0x1,0xe3,0x81,0x87,0x83,0xd6,0x20,0x12,0x2a,0x4c,0x9,0x7e,0x38,0xf8,0x0,0x3d,0x61,0x2,0x33,0x84,0xfa,0x2f,0xf8,0xc,0x0,0x3d,0x60,0x80,0x21,0x83,0x60,0x20,0x9f,0x40,0x78,0xf0,0x1,0xef,0x80,0x38,0x97,0xf1,0x9f,0x0,0xf1,0xbc,0x23,0xcc,0x1e,0x9f,0x80,0xc9,0x3,0xc5,0x5a,0x20,0xf7,0x82,0x7d,0x82,0x3,0xe4,0xf0,0x9,0xcc,0x1e,0xd0,0x88,0x14,0x3,0xb1,0xff,0x12,0x10,0x3e,0x5,0xa3,0xe0,0xf8,0xac,0x4c,0x1e,0xb1,0x80,0x79,0xc7,0xee,0x0,0xf8,0xf0,0x43,0xcb,0x62,0xaf,0x19,0xe0,0x3e,0x24,0x10,0x8c,0x4,0x3c,0x1e,0x25,0xf9,0x88,0x44,0x1b,0x3,0x43,0xe0,0x43,0xc1,0xf6,0x9,0x23,0x7c,0xc4,0x3e,0x0,0xa2,0xff,0x1b,0xcf,0xf0,0xf,0x28,0x18,0x3c,0x66,0x0,0xa2,0xbe,0xad,0x91,0xf6,0xa0,0xf3,0xf,0x18,0x3f,0xe0,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint8_t _A_L1_NoSd_128x49_5[] = { | ||||||
|  |     0x1,0x0,0x43,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x0,0x7a,0xc1,0x0,0x43,0x6,0x1,0xf,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x6f,0x0,0x52,0x7,0xaf,0xe0,0x32,0x40,0xf1,0x8f,0x83,0xe2,0x9,0xf6,0x8,0xf,0x93,0xc0,0x27,0x30,0x7b,0x42,0x20,0x50,0xe,0xc7,0xfc,0x48,0x40,0xf8,0x16,0x8f,0x83,0xe2,0xb1,0x30,0x7a,0xc6,0x1,0xe7,0x1f,0xb8,0x3,0xe3,0xc1,0xf,0x2d,0x8a,0xbc,0x67,0x80,0xf8,0x90,0x42,0x30,0x10,0xf0,0x78,0x97,0xe6,0x21,0x10,0x64,0xd,0xf,0x80,0xfd,0x10,0x7d,0x2,0x48,0xdf,0x31,0xf,0x80,0x28,0xbf,0xc6,0xf3,0xfc,0x3,0xca,0x6,0xf,0x19,0x80,0x28,0xaf,0xab,0x64,0x7d,0xa8,0x3c,0xc3,0xc6,0xf,0xf8,0x0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint8_t *_A_L1_NoSd_128x49[] = { | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_0, | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_1, | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_2, | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_3, | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_4, | ||||||
|  | 
 | ||||||
|  |     _A_L1_NoSd_128x49_5, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_NoSd_128x49_bubble_0_0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble* const L1_NoSd_128x49_bubble_sequences[] = { | ||||||
|  | 
 | ||||||
|  |     &L1_NoSd_128x49_bubble_0_0, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const FrameBubble L1_NoSd_128x49_bubble_0_0 = { | ||||||
|  |     .bubble = { | ||||||
|  |         .x = 40, | ||||||
|  |         .y = 18, | ||||||
|  |         .text = "Need an\nSD card", | ||||||
|  |         .align_h = AlignRight, | ||||||
|  |         .align_v = AlignBottom, | ||||||
|  |     }, | ||||||
|  |     .start_frame = 0, | ||||||
|  |     .end_frame = 9, | ||||||
|  |     .next_bubble = NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const BubbleAnimation BA_L1_NoSd_128x49 = { | ||||||
|  |     .icon_animation = { | ||||||
|  |         .width = 128, | ||||||
|  |         .height = 49, | ||||||
|  |         .frame_count = 6, | ||||||
|  |         .frame_rate = 2, | ||||||
|  |         .frames = _A_L1_NoSd_128x49 | ||||||
|  |     }, | ||||||
|  |     .frame_order = { 0, 1, 0, 1, 0, 2, 3, 4, 3, 5 }, | ||||||
|  |     .passive_frames = 10, | ||||||
|  |     .active_frames = 0, | ||||||
|  |     .active_cooldown = 0, | ||||||
|  |     .active_cycles = 0, | ||||||
|  |     .duration = 3600, | ||||||
|  | 
 | ||||||
|  |     .frame_bubble_sequences = L1_NoSd_128x49_bubble_sequences, | ||||||
|  |     .frame_bubble_sequences_count = COUNT_OF(L1_NoSd_128x49_bubble_sequences), | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const StorageAnimation dolphin_internal[] = { | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L1_Tv_128x47, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L1_Tv_128x47", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 14, | ||||||
|  |             .min_level = 1, | ||||||
|  |             .max_level = 3, | ||||||
|  |             .weight = 3, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L1_BadBattery_128x47, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L1_BadBattery_128x47", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 14, | ||||||
|  |             .min_level = 1, | ||||||
|  |             .max_level = 3, | ||||||
|  |             .weight = 3, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         .animation = &BA_L1_NoSd_128x49, | ||||||
|  |         .manifest_info = { | ||||||
|  |             .name = "L1_NoSd_128x49", | ||||||
|  |             .min_butthurt = 0, | ||||||
|  |             .max_butthurt = 14, | ||||||
|  |             .min_level = 1, | ||||||
|  |             .max_level = 3, | ||||||
|  |             .weight = 6, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const size_t dolphin_internal_size = COUNT_OF(dolphin_internal); | ||||||
							
								
								
									
										7
									
								
								assets/compiled/assets_dolphin_internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								assets/compiled/assets_dolphin_internal.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stddef.h> | ||||||
|  | #include <desktop/animations/animation_storage_i.h> | ||||||
|  | 
 | ||||||
|  | extern const StorageAnimation dolphin_internal[]; | ||||||
|  | extern const size_t dolphin_internal_size; | ||||||
| @ -8,89 +8,31 @@ const uint8_t *_I_Certification1_103x23[] = {_I_Certification1_103x23_0}; | |||||||
| const uint8_t _I_Certification2_119x30_0[] = {0x01,0x00,0x3c,0x01,0x00,0x5c,0x06,0x01,0x40,0x07,0x5e,0x0b,0xff,0x20,0x07,0x5d,0x92,0x01,0x13,0x03,0xa4,0x70,0x06,0x5f,0xe0,0x10,0xc6,0x20,0x10,0xc8,0x1c,0xce,0x70,0x07,0x19,0xf0,0x08,0x70,0x10,0x18,0x1c,0x03,0xe1,0xff,0x83,0x83,0x84,0x34,0x57,0xf0,0x10,0xd8,0x03,0x23,0x00,0x1c,0x8c,0x08,0x1c,0x30,0xf0,0xc8,0xf8,0xc1,0xc3,0x10,0x00,0x90,0x48,0x60,0x70,0x3d,0x98,0x90,0x70,0x1c,0x10,0x70,0xc2,0x03,0x65,0xa0,0xc0,0x07,0x47,0xe6,0x6d,0x1e,0x07,0x04,0x06,0x20,0xe3,0x90,0x5f,0x41,0xc9,0xe0,0xc0,0x08,0x46,0x09,0x18,0x41,0x0c,0x82,0x44,0x0e,0x11,0x61,0x5c,0x27,0xd0,0x70,0x70,0xc5,0xc1,0xc3,0x40,0x8a,0x17,0x84,0x94,0x53,0x0a,0x0c,0x1a,0x01,0xe2,0x88,0x7e,0x01,0xc3,0x08,0x80,0xff,0xcd,0x05,0xb8,0x80,0x43,0xa0,0x11,0xe8,0x80,0x84,0x43,0xa5,0xfe,0x98,0xa1,0x86,0xb9,0x00,0x8e,0x9c,0x47,0xe0,0x5d,0x1a,0x04,0x88,0x8e,0x20,0x02,0x97,0x60,0x27,0x40,0xe1,0x03,0x95,0x02,0x82,0x0e,0x49,0x35,0x0a,0x65,0x00,0xe1,0x28,0x04,0xfe,0x38,0x05,0xc8,0xf8,0xe3,0xf0,0x09,0x3c,0x8a,0xe4,0x0e,0x4e,0x02,0xe0,0x7f,0xff,0x39,0xfe,0x02,0x47,0x14,0xf1,0x0b,0x13,0x41,0xc0,0x52,0x0c,0xc2,0x61,0xc0,0x90,0xc3,0x38,0x50,0x1e,0x27,0xfe,0x8f,0x00,0xc8,0x48,0x20,0xc0,0xe3,0x40,0x0e,0x04,0x1c,0x98,0x8d,0x04,0x28,0x1c,0x4a,0x31,0x00,0x0c,0x0e,0x11,0x38,0x59,0x8c,0x12,0x7f,0x12,0x81,0xfc,0x27,0xf7,0x08,0x05,0x06,0x01,0x07,0x07,0x1c,0x08,0x6c,0x20,0xe2,0x98,0x40,0x27,0xd0,0x08,0x34,0x42,0x70,0xef,0x13,0xa8,0xd0,0x05,0x84,0x1d,0x10,0x00,0xc1,0xdf,0x43,0x0c,0x41,0x1a,0xcc,0x47,0x63,0xff,0x00,0x0c,0x0c,0xe4,0x2d,0x91,0x00,0x17,0xf8,0x1c,0x3c,0x00,0x71,0x09,0xc7,0xfc,0x0d,0x30,0x06,0x7f,0x3f,0xea,0x11,0x07,0x78,0x3b,0xc1,0xd6,}; | const uint8_t _I_Certification2_119x30_0[] = {0x01,0x00,0x3c,0x01,0x00,0x5c,0x06,0x01,0x40,0x07,0x5e,0x0b,0xff,0x20,0x07,0x5d,0x92,0x01,0x13,0x03,0xa4,0x70,0x06,0x5f,0xe0,0x10,0xc6,0x20,0x10,0xc8,0x1c,0xce,0x70,0x07,0x19,0xf0,0x08,0x70,0x10,0x18,0x1c,0x03,0xe1,0xff,0x83,0x83,0x84,0x34,0x57,0xf0,0x10,0xd8,0x03,0x23,0x00,0x1c,0x8c,0x08,0x1c,0x30,0xf0,0xc8,0xf8,0xc1,0xc3,0x10,0x00,0x90,0x48,0x60,0x70,0x3d,0x98,0x90,0x70,0x1c,0x10,0x70,0xc2,0x03,0x65,0xa0,0xc0,0x07,0x47,0xe6,0x6d,0x1e,0x07,0x04,0x06,0x20,0xe3,0x90,0x5f,0x41,0xc9,0xe0,0xc0,0x08,0x46,0x09,0x18,0x41,0x0c,0x82,0x44,0x0e,0x11,0x61,0x5c,0x27,0xd0,0x70,0x70,0xc5,0xc1,0xc3,0x40,0x8a,0x17,0x84,0x94,0x53,0x0a,0x0c,0x1a,0x01,0xe2,0x88,0x7e,0x01,0xc3,0x08,0x80,0xff,0xcd,0x05,0xb8,0x80,0x43,0xa0,0x11,0xe8,0x80,0x84,0x43,0xa5,0xfe,0x98,0xa1,0x86,0xb9,0x00,0x8e,0x9c,0x47,0xe0,0x5d,0x1a,0x04,0x88,0x8e,0x20,0x02,0x97,0x60,0x27,0x40,0xe1,0x03,0x95,0x02,0x82,0x0e,0x49,0x35,0x0a,0x65,0x00,0xe1,0x28,0x04,0xfe,0x38,0x05,0xc8,0xf8,0xe3,0xf0,0x09,0x3c,0x8a,0xe4,0x0e,0x4e,0x02,0xe0,0x7f,0xff,0x39,0xfe,0x02,0x47,0x14,0xf1,0x0b,0x13,0x41,0xc0,0x52,0x0c,0xc2,0x61,0xc0,0x90,0xc3,0x38,0x50,0x1e,0x27,0xfe,0x8f,0x00,0xc8,0x48,0x20,0xc0,0xe3,0x40,0x0e,0x04,0x1c,0x98,0x8d,0x04,0x28,0x1c,0x4a,0x31,0x00,0x0c,0x0e,0x11,0x38,0x59,0x8c,0x12,0x7f,0x12,0x81,0xfc,0x27,0xf7,0x08,0x05,0x06,0x01,0x07,0x07,0x1c,0x08,0x6c,0x20,0xe2,0x98,0x40,0x27,0xd0,0x08,0x34,0x42,0x70,0xef,0x13,0xa8,0xd0,0x05,0x84,0x1d,0x10,0x00,0xc1,0xdf,0x43,0x0c,0x41,0x1a,0xcc,0x47,0x63,0xff,0x00,0x0c,0x0c,0xe4,0x2d,0x91,0x00,0x17,0xf8,0x1c,0x3c,0x00,0x71,0x09,0xc7,0xfc,0x0d,0x30,0x06,0x7f,0x3f,0xea,0x11,0x07,0x78,0x3b,0xc1,0xd6,}; | ||||||
| const uint8_t *_I_Certification2_119x30[] = {_I_Certification2_119x30_0}; | const uint8_t *_I_Certification2_119x30[] = {_I_Certification2_119x30_0}; | ||||||
| 
 | 
 | ||||||
| const uint8_t _I_card_bad1_0[] = {0x01,0x00,0x01,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfe,0x01,0x82,0x04,0x0c,0x4a,0x01,0x70,0x8f,0x01,0x46,0x08,0x0f,0x5e,0x30,0x24,0x60,0x50,0x0c,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x04,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x03,0xcf,0x01,0x22,0xa1,0x03,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x00,0x1d,0x01,0x3f,0xd3,0x05,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x02,0x7f,0xf9,0x93,0x87,0xde,0x11,0x00,0x07,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x01,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x01,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x00,0x30,0x7f,0xf0,0x01,0xff,0xff,0x83,0xfe,0x01,0xfb,0xf9,0xf0,0x83,0xf6,0x19,0xc6,0x07,0xb0,0xe8,0xe0,0x34,0x0f,0xfc,0x1b,0x90,0x0f,0x69,0x80,0x0c,0xa0,0x5a,0x0f,0xfc,0xd8,0x1e,0xf1,0x80,0x19,0x41,0x3a,0x05,0xd1,0xfe,0x03,0xec,0xff,0x51,0x8b,0x84,0x8a,0x04,0x0f,0xcc,0x44,0x4a,0x0c,0x0f,0xd8,0x54,0x38,0x1f,0xb0,0x68,0xf0,0x7f,0xc7,0xfe,0x5f,0xf0,0x7e,0x1f,0xfc,0x1f,0xd3,0x85,0xf9,0x83,0xe8,0x14,0x70,0x1f,0x00,0x10,0xa7,0xe0,0xf5,0x05,0x18,0x25,0x40,0x1e,0x00,0xf0,0x07,0x80,0x28,}; | const uint8_t _A_Levelup1_128x64_0[] = {0x01,0x00,0x22,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x38,0x1f,0xe0,0x1d,0x97,0xff,0xe7,0x1c,0x1f,0x99,0xf8,0x1c,0xe0,0x1f,0x96,0x78,0x07,0x03,0xf8,0x0f,0xb8,0xdc,0x02,0x01,0xfb,0x07,0xdc,0x14,0x1e,0x3f,0x40,0x7d,0xc0,0x81,0xe3,0xe8,0x2f,0x5c,0x04,0x1e,0x3d,0x00,0x7d,0x6f,0xc1,0xc3,0x00,0xd0,0x03,0xea,0xbe,0x0f,0xf0,0x79,0x50,0x01,0xf5,0x2f,0x07,0xf8,0x38,0x63,0xf8,0x0f,0xf1,0x7a,0x62,0x10,0x0c,0x04,0x80,0x1f,0x59,0xf8,0xf8,0xb4,0x6f,0x80,0xfa,0xb7,0xcc,0x20,0x12,0x0f,0x34,0x03,0xfa,0x0f,0x88,0xbd,0x00,0x1e,0x3e,0x30,0x7d,0x42,0xf0,0x10,0x18,0x87,0x9c,0x1f,0x70,0x08,0x16,0x43,0xfe,0x0f,0xaf,0x5c,0x02,0x18,0x0f,0xc8,0xdc,0x0e,0x20,0x0f,0xc8,0x5c,0x31,0x7a,0x37,0xf0,0x7d,0xa3,0xc6,0x81,0x3f,0x37,0xdc,0x82,0x01,0xc0,0x49,0x09,0xff,0x61,0x00,0xfa,0x97,0x9f,0xc6,0x00,0x32,0x10,0x7d,0x40,0x20,0xc0,0xfc,0xaf,0xc0,0x23,0x0f,0x01,0x07,0xd6,0xfe,0x01,0xe0,0x07,0xe5,0xfc,0x7c,0x30,0xf0,0x7d,0xff,0xe0,0x41,0xe2,0x07,0xdc,0x14,0x1f,0xd0,0xd0,0x7f,0x45,0x45,0xfe,0x0f,0xf0,0x7f,0x17,0xd3,0xf4,0x7f,0x98,0x18,0x3f,0xc1,0xe7,0xf4,0x57,0xc8,0xbd,0x01,0xff,0xe8,0x6f,0xc8,0x3d,0x3a,0x0f,0xf9,0x67,0x88,0x00,0xb4,0x00,0xf8,0x8b,0x83,0xd2,0x80,0x0f,0x88,0x48,0x3d,0x30,0x1f,0xc0,0x6a,0xe3,0xef,0xf0,0x60,0x7a,0x40,0x3e,0x60,0xf5,0xbb,0xe0,0x20,0x20,0xf4,0x80,0xf3,0x01,0xeb,0x8b,0xbf,0x82,0x84,0x1e,0x93,0x0c,0x00,0x3d,0x21,0x60,0xa2,0x07,0xa7,0x02,0xfe,0x0f,0xd2,0x88,0xff,0x81,0xe6,}; | ||||||
| const uint8_t *_I_card_bad1[] = {_I_card_bad1_0}; | const uint8_t _A_Levelup1_128x64_1[] = {0x01,0x00,0x02,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xf8,0x17,0x59,0xfe,0xf8,0x6b,0x37,0xf9,0xf0,0x32,0x7e,0xc1,0xac,0x02,0x19,0xff,0xfe,0x03,0xfc,0x11,0x5c,0xfe,0x7f,0xfe,0xf1,0x8c,0x2e,0x3d,0xce,0x80,0xe7,0x3e,0xff,0x90,0x7c,0xc3,0xe6,0x10,0x0b,0x07,0xfb,0xf0,0x61,0x8c,0x7c,0x3e,0x19,0x00,0xc0,0x43,0x6f,0xc1,0xe8,0xbf,0xe3,0xa0,0x50,0x08,0x04,0x0a,0xfe,0x83,0x7f,0xdf,0xf6,0x09,0x01,0x07,0x8e,0x11,0x25,0x1f,0x7f,0x7e,0x00,0x1c,0x30,0x09,0x41,0xfd,0xc0,0x03,0x1f,0xa0,0x03,0xca,0x21,0xfe,0x30,0x45,0xfe,0x90,0x0f,0x3f,0xe7,0xf4,0x1e,0xff,0x79,0x00,0x3c,0xa4,0x1b,0xc4,0xf4,0xca,0x01,0xe5,0xa0,0xfc,0x03,0xe6,0x20,0x0f,0x2a,0x00,0x3c,0x7c,0xef,0x96,0xbf,0xcc,0x81,0xc3,0xf8,0x07,0x93,0x0d,0xaf,0xbf,0xf5,0x70,0xc0,0x20,0x94,0x1d,0xc4,0x3f,0xf9,0xef,0x08,0x2f,0xf0,0x7e,0x5e,0x2c,0x17,0xf3,0xee,0x6f,0x89,0xc0,0x3c,0xb0,0x7f,0xc7,0x93,0x83,0x87,0xf1,0x07,0x80,0x79,0x70,0xbf,0x80,0x7b,0xc9,0xe0,0x13,0x86,0xf8,0xff,0x70,0xbc,0x0f,0x80,0x3d,0xb0,0xfa,0x18,0xe1,0x40,0x7f,0xb0,0x58,0x4f,0xf3,0xff,0xdf,0x08,0x2c,0x0e,0x18,0xc0,0x10,0x78,0xc0,0x7f,0xdb,0xfd,0xf8,0x3d,0x74,0x70,0x4c,0x04,0x07,0xfb,0x03,0x84,0xe3,0xfe,0xe0,0xf6,0x87,0xf9,0x20,0x10,0x6f,0xd4,0x0b,0x03,0xe7,0xf9,0xf7,0xce,0x47,0x7b,0xbf,0x67,0xe2,0x90,0x38,0x05,0xfe,0x03,0xc9,0xff,0xfe,0xfd,0xee,0x23,0x9f,0xff,0x27,0xd0,0xc2,0xf8,0xfc,0x20,0x18,0x16,0x6b,0xff,0xf3,0xf0,0xe6,0x81,0xca,0x7c,0x00,0xf5,0x22,0x0c,0x02,0x15,0x20,0x07,0x94,0x04,0x1e,0xd7,0xf8,0xfe,0x82,0x14,0x6f,0x10,0x00,0xea,0x51,0xe3,0xf3,0x08,0x26,0x7a,0x03,0x12,0x37,0x88,0x7c,0x91,0xe3,0xe7,0x3f,0xb4,0x48,0xde,0x21,0xf2,0xff,0x7f,0xf9,0xe7,0xf6,0x91,0x40,0x2f,0x01,0xf2,0x07,0xba,0x58,0x68,0x43,0xe2,0x0f,0x88,0xbc,0x7d,0xff,0xb0,0x79,0xf3,0xe1,0x78,0x20,0x79,0xc0,0x47,0xc2,0x8f,0x43,0xf0,0xe8,0xe0,0x44,0xe2,0x0f,0x8f,0xdf,0xc6,0xae,0x35,0x28,0xb7,0xc6,0x05,0x02,0x07,0x97,0x07,0xff,0xf1,0x17,0x20,0x10,0x74,0xe0,0xe3,0x80,0x72,0x67,0xff,0x82,0xf2,0xfc,0xe1,0xec,0xe1,0x00,0x15,0x0a,0x1e,0x60,0x12,0x72,0x70,0xe5,0xe0,0xf4,0x85,0x41,0x83,0xcb,0x37,0x83,0xe1,0xc5,0xe9,0x04,0x81,0x07,0xc7,0xde,0x0f,0x2a,0x5c,0x3b,0x40,0x0f,0x4d,0x24,0x83,0x3d,0xbf,0x30,0x1e,0x2e,0x39,0x40,0x07,0xa4,0x22,0x01,0x67,0xcf,0x8b,0xce,0x17,0x83,0x91,0x03,0xd2,0x61,0x2a,0xcc,0xf3,0x81,0xe9,0x1c,0x8c,0x03,0xd3,0x81,0x00,0xc3,0x18,0x12,0x2f,0xe0,0x83,0x83,0xd2,0x01,0xff,0xc0,0x83,0xd4,0x12,0x20,0xf5,0x80,0x60,0x01,0xe2,0x50,0x29,0x78,0x3d,0x98,0x63,0x40,0x48,0xa0,0x3e,0xac,0xc0,0xf3,0xa0,0x83,0xe2,0x41,0xc0,0x3f,0x9e,0x04,0x1f,0x3e,0x0f,0xc8,0x80,0xa0,0x60,0x81,0x07,0xb6,0x42,0x85,0xfc,0x0f,0x90,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_2[] = {0x01,0x00,0xc1,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x3f,0xe4,0x1f,0xdf,0x40,0x43,0xf3,0xc0,0xa9,0x7f,0xfb,0x03,0xdf,0x66,0x05,0x4d,0xff,0xbc,0x1e,0xf3,0xbf,0xf0,0x14,0xe3,0xf7,0x8f,0xf7,0xc4,0x1e,0xb1,0x3f,0xe0,0x14,0xe1,0xf9,0x02,0x0b,0xc5,0xc1,0xeb,0xcc,0xff,0x03,0xda,0x1e,0x0f,0x48,0x3f,0xbf,0xfd,0xf8,0x07,0xad,0xfc,0x1e,0x57,0xff,0xf4,0x0f,0xe7,0xff,0x07,0xaf,0x8e,0xff,0xf8,0xed,0xc7,0xee,0x1f,0xc8,0x18,0x34,0x41,0xeb,0xc3,0x9f,0xfc,0x3f,0x70,0xfe,0x07,0xfe,0x01,0x9c,0x0b,0x88,0x88,0x41,0xe7,0x1f,0xc8,0x5f,0xe0,0x7c,0x08,0x7c,0x03,0xf9,0x7f,0x9e,0x07,0xd3,0x8f,0x17,0x80,0x7e,0xe0,0x2f,0x71,0x85,0x7f,0xa7,0xf1,0xe0,0x7a,0x63,0xe7,0xf0,0x09,0x99,0x34,0x42,0x03,0xfb,0x9f,0xa5,0xd3,0xf1,0x3f,0xbf,0xc1,0x38,0x10,0x1c,0xe6,0xaa,0x04,0x1f,0x10,0xf2,0x7e,0x26,0xff,0x88,0x74,0xc2,0x01,0x60,0x0f,0x8d,0xfc,0x5c,0x2c,0x23,0xff,0x4c,0xed,0x18,0xe8,0x64,0x03,0x01,0xa9,0xc1,0x5e,0xf3,0xc1,0xf4,0x9f,0xcc,0xf8,0x10,0x48,0x10,0x74,0x60,0x58,0x0b,0xfe,0x32,0xfe,0xbe,0x50,0x78,0x97,0x8b,0x49,0xc0,0xf7,0xe0,0x14,0xc4,0xbe,0x3c,0x06,0x00,0x1c,0x30,0x08,0x46,0x02,0x78,0x0f,0x20,0x01,0xdf,0xb0,0x14,0x00,0x79,0x64,0x21,0x41,0x11,0x07,0x23,0x30,0x60,0x00,0xf3,0x88,0x00,0x87,0x81,0xbf,0x07,0x9e,0x73,0xdf,0x01,0x90,0x03,0xcb,0x40,0x53,0x19,0x02,0x3d,0x23,0x3f,0xf0,0x7a,0x00,0xc8,0x1e,0x5c,0x70,0x78,0xc6,0xb9,0xd0,0x11,0x59,0x0c,0xc7,0x51,0x0a,0x80,0x03,0x07,0x16,0x02,0x13,0xc0,0x83,0xd4,0x04,0x38,0xef,0xff,0x8f,0xfa,0x0f,0x18,0x3a,0x6c,0x43,0x22,0x00,0x1c,0x06,0xaa,0x14,0xd9,0x1f,0x38,0xfc,0xa1,0xa4,0x81,0x84,0x03,0xcc,0x02,0x3f,0xf0,0x71,0x80,0x06,0x02,0x1f,0x5d,0x14,0x2b,0xf0,0x0f,0x51,0x80,0xc1,0x01,0xe5,0x00,0x0b,0x0f,0xe7,0xf6,0x0f,0x5c,0x50,0x3d,0x35,0x3e,0x07,0x59,0x03,0x8a,0xff,0x0f,0x80,0x51,0x13,0xe7,0x01,0xf8,0x7b,0xff,0xa0,0xf2,0x87,0xff,0xe3,0xd2,0x8e,0x20,0x3c,0xa3,0x1a,0x9f,0x87,0x1e,0xff,0xde,0xc7,0x8b,0x47,0xd2,0x1f,0x10,0x7a,0x07,0xc7,0x8f,0x3f,0xff,0x61,0xff,0xff,0x7e,0xfc,0x1f,0x40,0x1f,0x5f,0x07,0x9d,0xfa,0x3e,0x37,0xf9,0x87,0xc6,0x02,0x0f,0x18,0xe4,0x07,0x80,0x0c,0x24,0xf9,0x14,0x04,0x3e,0x31,0xf7,0x58,0xc7,0xf5,0x38,0x0f,0x1b,0xbd,0x00,0x03,0x00,0xc2,0x03,0xca,0x1e,0x23,0x1f,0x80,0x28,0x73,0xe0,0x21,0xf9,0xff,0x70,0x30,0x41,0x90,0xe0,0x20,0xfa,0x98,0x17,0xf3,0xee,0x0f,0x2f,0xe7,0x83,0xdf,0x01,0x4f,0xac,0x03,0xfc,0x0f,0x10,0xe8,0xa4,0xc9,0x5e,0xba,0x96,0xf8,0x87,0x87,0xcf,0xf1,0xff,0xf1,0xe7,0x80,0xf1,0x88,0x3f,0x88,0x3e,0x3f,0xfe,0x7f,0x7f,0xcf,0xf9,0xff,0xc0,0xa3,0x1a,0x08,0x24,0x82,0x00,0x01,0x1d,0x4e,0x0b,0x3f,0xc7,0xf3,0xfc,0xff,0x9f,0xf9,0x08,0xa8,0x41,0xe8,0xdf,0x18,0x7f,0x07,0xcf,0x78,0x1e,0x8d,0xfe,0x00,0x1f,0x5c,0x0c,0x2a,0x0f,0xe0,0xbb,0xc7,0x0f,0xc7,0x00,0x83,0x0f,0x44,0x82,0x30,0x30,0x38,0xf8,0x22,0x78,0x00,0x70,0xf3,0xf0,0x1a,0xa0,0x7a,0x60,0xe1,0x50,0xaf,0x84,0x07,0xc0,0x0f,0x1d,0xb8,0x5c,0x60,0xbc,0x06,0x70,0x81,0x06,0x01,0x60,0xf0,0x28,0x85,0x64,0x34,0xad,0x46,0x2a,0x09,0x80,0xfc,0xc3,0x20,0x18,0x9d,0x56,0x48,0x32,0x3f,0x80,0xf8,0xe2,0xa0,0x36,0x00,0x78,0xc1,0xd6,0x23,0x31,0x80,0x63,0x01,0xe3,0xb8,0xfd,0xff,0xe1,0x10,0xe8,0xc2,0x7c,0x56,0x45,0xc1,0xc0,0x60,0xe0,0x52,0xae,0x41,0xb8,0x61,0x1f,0x08,0x38,0x30,0x60,0xc5,0xd1,0x80,0xdf,0xf0,0x06,0x12,0x17,0x89,0x64,0x57,0xe5,0xf8,0x60,0x9d,0x03,0x44,0x61,0x10,0x7b,0x00,0x10,0xea,0x25,0xf1,0x07,0x8a,0xbc,0xc1,0xeb,0xa0,0xd5,0x42,0x97,0xc3,0xff,0x54,0x88,0x3d,0xc1,0x25,0xfe,0x5f,0x88,0x94,0x80,0x0d,0x90,0xd5,0x4a,0x81,0xc3,0xfe,0xce,0x03,0xe2,0x10,0x1f,0x2f,0xff,0xe2,0x7f,0x01,0x06,0xa8,0x18,0x74,0x83,0xf1,0xfb,0x7f,0xff,0x33,0xf8,0x30,0xfd,0x41,0xe2,0xe1,0x25,0x79,0x41,0xcf,0x62,0x0f,0x5f,0xc6,0xa3,0x55,0x8a,0x07,0x90,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_3[] = {0x01,0x00,0x0a,0x03,0x8f,0xc0,0xb8,0x1f,0xfb,0xfd,0xe2,0x7f,0xf8,0x02,0x0f,0xff,0xff,0x03,0xff,0x00,0xc6,0xff,0x36,0xe0,0x47,0xfd,0xff,0x08,0xff,0xf3,0xff,0x3f,0x05,0x8f,0xf0,0x1e,0x5f,0xf8,0xfe,0x02,0xfb,0xff,0xf8,0x43,0xff,0x99,0xfd,0xf8,0x44,0x81,0xe7,0x17,0x88,0x7d,0x37,0xe0,0xf2,0x87,0xe7,0xff,0xe0,0x11,0xfe,0x83,0xca,0x1f,0x20,0xf8,0x0f,0x46,0x0f,0xfe,0x83,0xf6,0xff,0xfc,0xf0,0xfa,0x47,0xec,0x1e,0x08,0xf8,0x3c,0xa0,0x7c,0x3f,0xff,0x9c,0x1e,0x93,0xf8,0x06,0x02,0x1f,0xf8,0x2c,0x8c,0x07,0xc1,0xff,0xfd,0x83,0xdb,0xc1,0x07,0xfc,0x40,0x6f,0xda,0x0d,0x47,0xff,0xf2,0x0f,0x4b,0xf8,0x7c,0x60,0xda,0x88,0x0c,0x72,0x01,0xb0,0xff,0xe0,0x01,0xe9,0xff,0x80,0x68,0x21,0xff,0xa9,0x06,0x02,0x01,0xf2,0xbf,0x40,0x12,0x44,0x1f,0x2b,0x82,0xa1,0x7d,0x11,0xf8,0x05,0xf8,0x1e,0x74,0x7f,0x80,0xc0,0x75,0x50,0xa8,0x04,0x83,0xf0,0x0f,0x1b,0xe1,0x48,0x6f,0xfb,0x78,0x38,0x3c,0x40,0x09,0xfc,0x81,0x83,0xcb,0xfb,0xbf,0xbf,0xcb,0xbe,0x1a,0x8d,0x56,0xaa,0x55,0x80,0x85,0x18,0xc4,0x5e,0xb3,0xce,0x00,0x7d,0x7b,0x80,0x21,0xdf,0xcf,0xef,0xee,0x72,0x2f,0x8e,0xaa,0x01,0xa8,0xd1,0x62,0xa7,0xfa,0x0c,0x06,0x7d,0x82,0x33,0x8f,0x3d,0xfe,0x04,0x18,0x15,0x68,0xc0,0x1e,0xa2,0x02,0x1f,0x0f,0xff,0xbf,0x3f,0xe3,0xcf,0xc7,0x63,0xca,0xd5,0xe7,0xb5,0x58,0xa8,0x3e,0xa3,0x80,0x8e,0x29,0xfe,0x3c,0x2e,0x30,0x0b,0x85,0x56,0xea,0x73,0x11,0x10,0xd8,0x01,0xe5,0xcf,0x9f,0xcf,0xf5,0x50,0x2d,0x61,0x80,0x75,0x38,0xa2,0x28,0xda,0x09,0x63,0x9f,0x1f,0x0c,0xf8,0x3e,0x35,0x6a,0xad,0x54,0x3a,0x20,0x01,0xba,0x7f,0xf7,0xf9,0xff,0xbc,0xfe,0x7c,0x9c,0x1d,0x58,0x7c,0x74,0xd0,0xad,0x16,0xab,0x71,0xbf,0xef,0xfb,0xc1,0xe3,0x0c,0x1d,0x08,0x78,0x6a,0xb0,0xd0,0xf9,0x66,0x3f,0xbf,0xff,0x3f,0x9c,0x9c,0x3a,0x8e,0x50,0x78,0x75,0x59,0xa8,0x50,0x0c,0x7c,0x9f,0xff,0xcf,0x9f,0xe3,0x07,0x0b,0x8d,0x00,0x3e,0x51,0x50,0xf9,0x7c,0x3e,0x7f,0x99,0x3f,0xe2,0x0f,0x2a,0x5f,0x10,0x00,0xb1,0x4c,0x31,0xf8,0x7c,0x77,0x10,0x3f,0xe4,0x3c,0x2e,0x36,0x00,0xf9,0x4d,0x43,0xe5,0xe0,0x9c,0xfb,0xa0,0x7e,0x88,0x78,0x68,0x76,0x41,0xe2,0xb5,0x17,0x86,0x05,0xf8,0xcc,0x7f,0xe0,0x3f,0xc8,0x30,0x5c,0x6a,0x01,0xf2,0xaa,0x87,0xcb,0xf1,0xc2,0xff,0xc0,0x00,0x22,0x3e,0x50,0x01,0x42,0xaf,0x1d,0x09,0xfe,0x00,0x1e,0x20,0x01,0xac,0x07,0x8b,0xaa,0x07,0x29,0xe7,0x0a,0x1e,0x0f,0x20,0xfc,0x4a,0xa7,0x9e,0x85,0xa8,0xf0,0xc2,0xe5,0x54,0x1f,0x9c,0x04,0x3e,0x5e,0x00,0x18,0xf1,0xe0,0x3a,0x06,0xf1,0xb8,0x08,0x7e,0x33,0x8a,0x04,0x02,0x51,0xe3,0x4f,0x90,0x7d,0xc0,0x07,0xfa,0x80,0x68,0xe1,0x5e,0xc0,0xf1,0x6e,0x83,0xe4,0x0e,0x28,0x57,0xe3,0xce,0x18,0x1e,0xa0,0x78,0xab,0xa1,0xf6,0xfc,0x7f,0xf0,0x72,0xa0,0xfa,0xca,0xa5,0x50,0x08,0x46,0x01,0x46,0x3f,0xf3,0x18,0x87,0xf3,0xbf,0x00,0xd5,0x7b,0x37,0xfa,0xaf,0x56,0xff,0x53,0x82,0x0f,0x8c,0x83,0x51,0x02,0xff,0x5f,0xc2,0x63,0xd4,0xaf,0xa7,0x86,0xbe,0x1f,0x6d,0xf5,0xff,0x51,0x2a,0xd6,0x6b,0xc7,0xe3,0xaf,0xd4,0xe0,0x03,0xe2,0x06,0x18,0x17,0xf2,0xf6,0x7f,0xd2,0x78,0xea,0x21,0x49,0xf4,0x80,0xe0,0x35,0x40,0x11,0x0f,0x97,0xfc,0x30,0x21,0xfb,0xbf,0x43,0xc3,0xed,0x81,0x0e,0x90,0x7c,0xa7,0xd1,0xf1,0xf9,0x5d,0x6a,0xa0,0x11,0x0f,0xb4,0xf2,0x7c,0x57,0x16,0xfa,0xe2,0x80,0xa7,0x00,0x9c,0x07,0xca,0xac,0x3f,0x35,0x30,0x80,0x19,0x6e,0x3a,0xef,0x52,0xf8,0x75,0x5a,0xbd,0x10,0x80,0x90,0x43,0xe0,0x98,0x04,0x45,0x3a,0x2b,0xe1,0xaa,0xc1,0x60,0x16,0x00,0xe9,0xfd,0x2d,0x1a,0xac,0x56,0xbb,0x55,0xfb,0x01,0x0e,0x2f,0x45,0xb2,0x0f,0x8c,0x2a,0x01,0xfc,0xec,0x40,0x6c,0x01,0xf1,0xab,0xb0,0x46,0x6b,0x00,0xee,0x27,0xd3,0x51,0x0e,0xdc,0x07,0x07,0x56,0x02,0x1f,0x5e,0x03,0x56,0x1f,0x1d,0x04,0x2b,0xfd,0x59,0xfa,0xd5,0xcb,0x83,0x57,0x01,0x95,0xff,0xaa,0x1f,0x3f,0xfe,0xdc,0x2a,0x21,0xc1,0xfd,0x1e,0xce,0xd5,0x0a,0x85,0x10,0x06,0x7b,0x53,0x3e,0x18,0x01,0x43,0xe7,0xc0,0x7d,0x90,0x7c,0x40,0x09,0x2a,0x94,0x4a,0x17,0xe3,0xe3,0xb5,0x87,0xa0,0xc2,0x20,0x01,0xc0,0x78,0x7b,0xe1,0xc5,0x00,0x16,0x68,0x42,0x3a,0xae,0x17,0xc7,0x3e,0x1f,0x88,0x68,0xf8,0xfe,0x10,0x13,0xb1,0x00,0x0c,0x0c,0x3a,0x65,0x48,0x8f,0xc7,0xf0,0xdd,0x57,0x0c,0x7f,0x14,0x22,0x5f,0x5d,0x5f,0xeb,0x51,0xaa,0xd1,0x07,0xc7,0xf8,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_4[] = {0x01,0x00,0x7e,0x02,0xff,0x80,0x3c,0x01,0xf1,0xff,0xe0,0x3f,0x7d,0xff,0xd1,0x0f,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2d,0xff,0xee,0x0f,0xef,0x47,0xff,0xfc,0x06,0x2d,0xf8,0x3d,0xe0,0x3e,0x49,0x3f,0xc0,0xfc,0x7f,0x8f,0xfc,0xed,0x02,0x37,0xff,0xc5,0xbe,0x01,0xf0,0xaf,0xe0,0xc1,0xe7,0xe0,0xff,0xc0,0xc2,0xe3,0x1f,0xf8,0x4f,0xe0,0x17,0x0b,0xf5,0x81,0x34,0x40,0xf1,0xb8,0xc1,0x38,0x1f,0xd8,0x3f,0xe2,0x73,0x00,0xf7,0xc7,0xe4,0x02,0xb1,0xff,0xcf,0xf0,0x02,0x81,0xc0,0x77,0xe0,0x37,0xf8,0x47,0x82,0xff,0x0e,0x6e,0x1c,0x1d,0xc4,0x3e,0x08,0x0d,0xfb,0x80,0x2e,0x1f,0x00,0x08,0x60,0x06,0x02,0xc3,0xc0,0x41,0x23,0x81,0x04,0x89,0x38,0x6c,0x11,0xfc,0x04,0x3c,0x1e,0x3f,0x78,0x3c,0x0e,0x01,0xc0,0x83,0xff,0xa0,0x60,0x52,0x8c,0x88,0x45,0x00,0x63,0x02,0xe2,0x6a,0xe3,0xc0,0x41,0x00,0x09,0xf8,0xd2,0x63,0x4f,0x04,0x1d,0xfc,0x1e,0x65,0xd2,0x01,0x09,0xc8,0x60,0xd0,0x0d,0x66,0xab,0x54,0x45,0x10,0x00,0xfb,0x3f,0xff,0x3f,0x8f,0xcf,0xd9,0xf9,0x87,0xd4,0x06,0xc5,0x03,0x8a,0x03,0xc7,0xf9,0xcf,0xf3,0xdf,0xfc,0xfc,0x4f,0xfc,0x2e,0x01,0xab,0x0f,0x88,0x90,0x45,0xe5,0x87,0x1f,0x94,0x02,0x9f,0x08,0xca,0x01,0x8a,0x9f,0x15,0x07,0x8d,0xe3,0x80,0x0f,0x30,0xc8,0xf0,0x03,0xc3,0xaa,0x8d,0x14,0x13,0x9f,0xfb,0x07,0x8c,0x02,0x21,0xd0,0x0b,0x15,0x7e,0x2a,0x51,0x1b,0x07,0xfb,0xcd,0xff,0xe1,0x9f,0x8b,0x40,0x1f,0x29,0x50,0x78,0xa7,0x93,0x9c,0x87,0xfe,0x03,0x1f,0x5f,0x90,0x7c,0xa7,0xf5,0x5a,0x84,0x07,0x7c,0x95,0x1f,0xbb,0x48,0x41,0xe3,0xb0,0x0f,0x95,0xa8,0x3e,0x51,0xe7,0x00,0xdf,0xe6,0x0a,0xf1,0x82,0x29,0xce,0xff,0x55,0xaa,0xc0,0x60,0x90,0x0c,0x04,0x7f,0xfd,0xfd,0x20,0x0e,0xa0,0x3e,0x5a,0xa2,0xf9,0x9a,0x47,0x8e,0x19,0x14,0xf0,0xfe,0x58,0xe7,0x54,0xaa,0x84,0x13,0xdf,0xfb,0x12,0x88,0x7e,0x4b,0x43,0xe3,0xb7,0xc0,0x2a,0x9f,0xd0,0xf9,0x8f,0xc5,0xe4,0x9c,0x38,0x18,0x10,0x5b,0xc4,0xe0,0x50,0x79,0x60,0x40,0x63,0x40,0x0f,0xbd,0x50,0x26,0xaf,0x71,0x0f,0x16,0xe8,0x16,0xd1,0xfb,0x85,0xc2,0x00,0x1f,0x50,0x80,0xd5,0x22,0x20,0xf1,0xff,0x7e,0x3f,0x01,0xfb,0xec,0x7f,0xef,0x12,0x08,0x07,0xf0,0x3e,0x71,0x58,0x24,0x16,0x28,0x1e,0x20,0x40,0xf8,0xe0,0x3e,0xcd,0xfe,0xab,0xd5,0xbf,0x0f,0xad,0x6d,0x3e,0x41,0xf5,0xa8,0xd5,0x60,0xa0,0x11,0x67,0x8e,0xfa,0xfe,0x0f,0x1d,0x66,0xbc,0x7e,0x3a,0xf0,0xfa,0xff,0xe3,0xe0,0x11,0x0f,0xad,0x56,0x8b,0x41,0xaa,0xc5,0x60,0x1f,0xb8,0x4e,0x5c,0x1e,0x29,0xf9,0xe0,0x7f,0xe1,0xb1,0xf8,0x7a,0xfd,0xc3,0xe3,0x05,0xb0,0x43,0xf8,0x17,0xf6,0xf8,0x87,0xe6,0x61,0x04,0xf0,0x46,0x20,0x15,0x50,0xfc,0x04,0xca,0xe4,0x15,0x26,0xfd,0x40,0x22,0x00,0x21,0xa8,0xa5,0x08,0x00,0x35,0x3a,0xad,0x50,0xbc,0x20,0x01,0xb0,0x00,0xcb,0x5d,0xea,0x5f,0x0e,0xaa,0x06,0x1f,0x5f,0xc4,0xc2,0x01,0x15,0x0f,0x1f,0xfe,0xaf,0x55,0xb2,0x9f,0xc8,0x1e,0x36,0x88,0x06,0x03,0x5d,0xaa,0xfd,0x80,0x86,0x17,0x00,0xd8,0x07,0xcf,0xdd,0xf9,0xa8,0xf9,0x43,0xe9,0x3f,0xaa,0xff,0x08,0x02,0x61,0x1f,0xf6,0xae,0x1d,0xb8,0x0e,0x0e,0xac,0x04,0x3e,0xbc,0x06,0xac,0x3c,0x58,0x0f,0xff,0xec,0x3a,0x80,0x04,0xaa,0x20,0xc7,0xc1,0x4f,0xd9,0x9e,0x84,0x38,0x3f,0xa4,0x09,0xda,0x87,0xe7,0x08,0xfb,0x87,0xa2,0xff,0x55,0xa8,0x18,0x0b,0x4e,0x1f,0x30,0x02,0x4a,0x90,0x09,0xef,0x0f,0xc1,0x84,0x60,0xb4,0x16,0xe0,0xf7,0x43,0x8a,0x00,0x28,0xd0,0x7d,0x0c,0x22,0x00,0x7a,0x79,0x78,0x55,0x62,0x10,0x1d,0x58,0x75,0x40,0xc3,0x06,0x60,0xab,0x75,0x1c,0x2b,0x55,0xa0,0xb0,0x4c,0xbe,0xba,0xbf,0xd0,0x79,0x40,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_5[] = {0x01,0x00,0x79,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0xff,0xfb,0xcf,0xc0,0xc9,0xf0,0xf1,0x84,0x1e,0xff,0xfe,0x80,0xff,0x3f,0xb7,0xbf,0xe7,0x3c,0x1c,0xdb,0xff,0xfc,0xff,0xfc,0x1b,0x80,0x02,0x73,0xf5,0xf9,0xf8,0xff,0xff,0x8f,0x9f,0xfc,0x0b,0xde,0xe5,0xdd,0xba,0xf3,0xbe,0x3c,0x78,0x08,0xf5,0xe6,0x3a,0xcd,0x56,0xaa,0xc3,0xf0,0xa7,0xe0,0x3f,0xff,0xe1,0xf2,0x5f,0x20,0x15,0x6a,0xad,0x57,0x07,0xf3,0x87,0xf8,0x3f,0xfe,0x11,0x02,0x4d,0xe0,0x1a,0xbd,0x76,0xaf,0x0d,0xff,0x80,0x7c,0x3f,0xbc,0x70,0x7a,0x4f,0xf0,0x41,0xe1,0xaa,0xfb,0x67,0xf0,0x02,0x70,0x9c,0x4c,0x7c,0x33,0xfe,0x3e,0xa8,0x3e,0x31,0xa8,0x78,0x3c,0x89,0xc9,0xd0,0xff,0xd1,0xea,0xb5,0x7a,0xbc,0x56,0x01,0x00,0xfe,0x03,0xd4,0x2c,0x3a,0xf2,0xf0,0xea,0xa5,0x40,0xf1,0x9c,0x1f,0xdb,0x1f,0x67,0x0f,0x94,0xd6,0x01,0x04,0x80,0x18,0x07,0x7f,0xef,0x07,0x94,0x3f,0x64,0x1f,0x2b,0x50,0x7c,0x46,0x25,0xfd,0xef,0xb7,0x47,0x3f,0x0c,0xa8,0x07,0xc8,0xc2,0x30,0x10,0x78,0xfc,0x08,0x09,0x18,0xd4,0x6a,0x90,0x03,0xaa,0x06,0x8c,0x70,0x60,0x47,0xd2,0xff,0xcc,0xfb,0x01,0xd2,0xef,0xd5,0x20,0x37,0xf0,0x78,0xfe,0xc2,0x05,0xc7,0x83,0xfa,0x35,0x46,0x21,0xdd,0x40,0x30,0x10,0xfc,0x63,0xd4,0x5f,0x03,0xef,0x07,0x8d,0xd7,0xab,0x55,0xae,0xdd,0x6a,0xb8,0x58,0x7e,0xff,0xce,0x1d,0x12,0x10,0xfc,0xe0,0xfa,0xcf,0xd6,0xa8,0x02,0x24,0xe1,0x81,0xb7,0x84,0xdc,0x57,0xf9,0x7c,0x02,0xab,0x75,0x00,0x0d,0x56,0x82,0x10,0x10,0x78,0xc3,0xde,0x25,0x06,0x3b,0x0e,0xeb,0x55,0xea,0xfd,0x1b,0x8a,0xff,0x7f,0xbf,0x2c,0xc7,0xe7,0x0e,0x80,0x75,0x2a,0xb7,0x7a,0xbd,0x76,0x8b,0x05,0x80,0x06,0xc6,0xf8,0xb2,0x1b,0x1a,0x58,0x83,0xec,0x6e,0x41,0x70,0xd5,0x0b,0xc2,0x00,0x10,0xf9,0x08,0x04,0x7a,0x5f,0xf8,0x60,0x7c,0xb7,0xe1,0xf1,0xff,0x87,0xca,0x01,0xfd,0x07,0x96,0x26,0x07,0x40,0xfa,0xb1,0x47,0xbf,0x7f,0xa2,0xb0,0x0b,0xf1,0x7f,0x10,0x8f,0x82,0x0f,0x00,0xd6,0x7b,0xcf,0xe3,0xaf,0x0f,0x96,0x03,0xff,0x39,0xff,0x63,0x7f,0xf1,0xf3,0xf9,0x00,0x4a,0x82,0x01,0x1c,0x07,0x7c,0xc4,0x38,0x71,0x88,0xc0,0x75,0x83,0xf2,0x0f,0x9c,0x02,0x0c,0x21,0x17,0x01,0x41,0xea,0x85,0xf2,0x00,0x12,0x84,0xb0,0x0d,0x11,0xff,0xcf,0xa0,0xba,0xcd,0x50,0x00,0x83,0xe7,0x00,0xe0,0x7c,0x57,0xe3,0x78,0x9c,0x55,0x07,0xe7,0x55,0x8a,0xd0,0x02,0x43,0xe0,0xfe,0x7d,0xff,0xfe,0x9b,0xc0,0x7e,0x60,0x13,0x07,0x01,0x5e,0x2a,0xc3,0xd3,0x43,0x0a,0x04,0x42,0x05,0x8c,0xc1,0xc7,0xfe,0x1a,0xef,0x56,0xa9,0x82,0x30,0x30,0xfa,0x08,0x4a,0x1d,0x40,0xaa,0xb0,0x06,0xbb,0x55,0x82,0xd4,0x2c,0xa4,0x21,0x80,0x7c,0x20,0x76,0x83,0x20,0xeb,0xb5,0x5f,0xb0,0x10,0xc2,0xe0,0x1b,0x00,0xe9,0x2c,0x47,0xb1,0x01,0x0b,0x8f,0x56,0xaf,0x5f,0xaa,0xcd,0x6a,0x9d,0xca,0xa3,0x84,0xf5,0x10,0xed,0xc0,0x70,0x75,0x60,0x21,0xf5,0xe0,0x35,0x6c,0x13,0xbf,0x56,0xfe,0xb5,0x72,0xe0,0xd5,0xc0,0x65,0x7f,0xea,0xd1,0x20,0x14,0x0f,0x84,0xff,0x6e,0x7a,0x10,0xe0,0xfe,0x90,0x27,0x6a,0x1f,0x97,0x82,0x7e,0x19,0x20,0x03,0x8f,0x86,0x01,0xe7,0xbf,0xeb,0x43,0xe6,0x00,0x49,0x50,0x38,0x7f,0x9c,0xff,0xfd,0xbc,0x3d,0x13,0x5a,0xa9,0x38,0x78,0xf9,0xce,0xf0,0x71,0x40,0x05,0x1a,0x2f,0x0f,0x7f,0xff,0xf9,0xd8,0x07,0xe2,0x9b,0x50,0x80,0x33,0x47,0xc7,0x00,0xd5,0x87,0x54,0x0c,0x30,0x61,0xf8,0xdf,0xfe,0xc0,0xf1,0x6e,0xa3,0x85,0x0c,0x03,0x1c,0x10,0x0a,0xc8,0x4b,0xeb,0xab,0xfd,0x37,0x4e,0x77,0xfe,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_6[] = {0x01,0x00,0x38,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x5f,0x78,0x37,0x20,0x3f,0xc0,0x7e,0x4f,0xff,0xde,0x3e,0x38,0xae,0xf9,0xf0,0x5c,0xe8,0x7e,0xf8,0xf3,0x3c,0x45,0x83,0xdc,0x1f,0xb8,0x6e,0x23,0x01,0xfd,0x1f,0xdc,0x0a,0x09,0x01,0xfd,0x03,0xaa,0xff,0x01,0x07,0x8f,0xd0,0x1f,0x5b,0xf8,0x00,0x3c,0x7d,0x00,0xfa,0xaf,0x83,0xcb,0xa0,0x0e,0x9f,0xb8,0x3c,0x60,0x50,0x20,0x7d,0xcb,0xc1,0xe5,0xa0,0xdb,0x83,0xe3,0xc6,0x0f,0x4d,0xff,0xdc,0x3f,0x11,0x70,0x79,0x50,0x23,0xe0,0xe7,0xfe,0x83,0xd7,0x7e,0x2f,0x8f,0xe4,0x2e,0x00,0x80,0x1c,0x06,0xf9,0x1b,0x1f,0xcc,0x5c,0x1c,0x1e,0x38,0xfd,0xf6,0x0f,0xbe,0xb3,0x5b,0xfd,0xf2,0x97,0x08,0xff,0xe1,0xf2,0x1e,0xec,0x38,0xfd,0xff,0x12,0x5c,0x84,0x06,0x99,0x20,0xfa,0xff,0x81,0xed,0xfb,0xfd,0xc9,0x6a,0x10,0x0a,0x84,0x80,0x58,0x9e,0xf3,0x7a,0x55,0x66,0x12,0x0b,0x05,0x40,0x1e,0x5f,0x11,0x0b,0x75,0x66,0x12,0x2b,0x15,0x63,0x7a,0x07,0x1f,0x80,0xf4,0xca,0x05,0xd5,0x88,0x48,0xa8,0x55,0x80,0x40,0xdf,0x3e,0x1f,0x30,0x60,0xff,0xb0,0xfe,0x3f,0xf0,0x3d,0x6e,0xf1,0xef,0xc7,0xec,0x40,0x58,0x7e,0x1f,0xbf,0xab,0x11,0x80,0x50,0x2b,0x81,0xf1,0x87,0xff,0x0c,0x49,0x07,0xc1,0xf5,0x63,0xf0,0x0e,0x05,0x7c,0x7e,0x30,0x70,0x71,0x35,0x0a,0x7f,0x02,0xd2,0xe7,0xff,0xfc,0xf9,0x78,0x7c,0x7c,0x7f,0xf8,0xf8,0x44,0xaf,0xb7,0xeb,0x14,0x92,0x9f,0x00,0xe8,0x49,0xf9,0xb3,0xdf,0x01,0x64,0x40,0x42,0x1e,0x1f,0xe5,0xda,0x89,0x30,0x80,0x58,0x22,0x1f,0x58,0xff,0xe2,0xf7,0xfc,0xf0,0x83,0xca,0x01,0x78,0xc2,0x0f,0xca,0x1f,0xfd,0x87,0xff,0xaf,0xbf,0xc1,0x90,0xff,0xe3,0xb0,0x0f,0x84,0x12,0x20,0x5f,0x18,0x07,0xf5,0x56,0x5f,0xcf,0xfe,0xff,0xbf,0x18,0x07,0x94,0x82,0x00,0x01,0x1f,0xe8,0x30,0x7f,0xbe,0xcf,0xf5,0xef,0xfd,0x38,0x83,0x70,0xa0,0xa0,0xf3,0x80,0xfe,0x38,0x56,0xf0,0x90,0xff,0xff,0x31,0x08,0x7c,0x10,0x3e,0x80,0xf1,0xa1,0x9b,0x87,0xef,0xfd,0xf9,0xc0,0x20,0xf1,0x88,0x30,0xf4,0x48,0x23,0x03,0xbf,0x79,0xe0,0x7f,0xe2,0x18,0xfc,0xf8,0x10,0x3f,0x80,0x3d,0x67,0x90,0x18,0x04,0x73,0xf8,0x10,0x1d,0x9c,0x0e,0xe1,0x05,0xe0,0x40,0x0a,0xa3,0x05,0x41,0x8c,0x00,0x04,0x2f,0x21,0xa5,0xc3,0xb2,0x10,0x4c,0x07,0xe6,0x19,0x00,0x84,0xc0,0x32,0x00,0xf1,0x80,0x78,0x3d,0xf8,0xb8,0x0d,0x80,0x1e,0x30,0x78,0x7c,0x02,0x63,0x00,0xc6,0x29,0x87,0xe0,0xb0,0x18,0x5c,0x3a,0x31,0x04,0x2e,0x08,0x08,0x78,0x38,0x0c,0x1e,0xe2,0x01,0xfe,0xf8,0x83,0xc7,0xe1,0x07,0x06,0x0c,0x1a,0x06,0x12,0x1b,0xfe,0x03,0x01,0x0f,0xf7,0x7f,0xfd,0x91,0x71,0xa0,0x83,0xc7,0xf0,0x3a,0x25,0x98,0xf0,0x21,0x69,0x01,0xe0,0x83,0xd0,0x00,0x80,0xf1,0x88,0xf6,0x3f,0x18,0x79,0x78,0x3e,0x14,0x62,0x6e,0x1b,0xc4,0x7e,0x4e,0x0f,0xaf,0x85,0xc7,0xf1,0x3f,0xa1,0x83,0x14,0x00,0x4a,0x31,0xf0,0x40,0xc1,0xe3,0x87,0x07,0xc7,0x20,0x04,0x30,0xee,0x7c,0xbe,0x06,0xb6,0x10,0x02,0x01,0x87,0xe9,0xc3,0x87,0xfe,0x23,0x77,0xc8,0x2c,0x18,0x7e,0xa0,0xf1,0xfd,0xf9,0xe3,0xf7,0x0b,0xdf,0xf0,0xf6,0x40,0xf5,0xfc,0x5c,0x27,0x93,0xc5,0x70,0xff,0xc0,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_7[] = {0x01,0x00,0xd0,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x05,0xfd,0x83,0xfb,0xbe,0x20,0xf0,0xff,0x83,0x72,0x01,0xfe,0x07,0xdf,0xf6,0x3f,0xff,0xf8,0x83,0xf3,0xcf,0x03,0xe7,0x40,0xff,0xc0,0xf9,0xfc,0x46,0x61,0x93,0x00,0xfe,0x41,0xa2,0x1c,0x0e,0xf0,0x3e,0xaf,0xb0,0x19,0x06,0x03,0xba,0x0f,0xad,0xfc,0x02,0x81,0x00,0xed,0x83,0xea,0xbe,0x0f,0x2f,0xa8,0x3e,0xa5,0xf0,0x0c,0x04,0x03,0xd4,0x0f,0xdf,0xc7,0xad,0xb5,0x51,0x70,0x78,0xc1,0xfa,0xdb,0xf0,0x84,0xc5,0xff,0xdc,0x08,0x07,0x60,0x3f,0x50,0xb8,0x0c,0x86,0x81,0xb0,0x0f,0xcf,0xef,0x17,0x7c,0x89,0x50,0x37,0x00,0xfa,0xa5,0xe0,0xa1,0x98,0x20,0x7d,0x78,0x28,0xb1,0xd8,0x2e,0x0a,0xa0,0xe3,0x10,0xfc,0x49,0x63,0xf0,0x9c,0x25,0xc2,0x17,0xfa,0x07,0xc6,0x97,0x3d,0x0a,0x82,0x5f,0xc3,0xf3,0xff,0xd2,0xff,0xa1,0x5c,0x0b,0x81,0x3e,0xb4,0x40,0xf1,0x98,0x78,0x37,0xc1,0xf9,0x07,0x94,0x23,0x81,0xbe,0xff,0x03,0xe2,0x85,0xff,0x85,0x41,0xb0,0x00,0xe1,0xfe,0x83,0x56,0x7e,0x0f,0x1b,0xef,0x36,0x03,0x9c,0x17,0xc5,0xff,0xdd,0x82,0xfd,0x4f,0xe0,0x1a,0x3e,0xf0,0xfe,0x70,0x51,0xc8,0x07,0x03,0x80,0x3e,0x9f,0xfc,0x0a,0x17,0x00,0x90,0x70,0x3f,0xbf,0x70,0x7c,0xc1,0x20,0x11,0x0a,0x01,0x34,0x7d,0xe3,0xe5,0x03,0x88,0x3c,0xa1,0x00,0xf2,0xf1,0x87,0xe6,0x03,0x06,0x90,0x03,0xc7,0xf7,0xe7,0x07,0xbc,0x03,0x0d,0x01,0x07,0x90,0x81,0x7f,0x00,0xf3,0xbc,0x10,0x04,0x1e,0x5f,0x10,0x79,0xfc,0x11,0xe2,0x0f,0x10,0x00,0xc2,0x01,0xe3,0x7f,0x50,0x27,0x82,0x7f,0xdc,0x07,0x9c,0x10,0x18,0x84,0x12,0x07,0x8f,0xf0,0x1e,0x70,0x2f,0xec,0xfd,0x22,0x5e,0x00,0x10,0xf0,0x7f,0x82,0xf4,0x80,0xef,0x63,0xe0,0xf1,0xdf,0x94,0x4a,0x0f,0xf0,0x07,0xa4,0x03,0xfb,0xc7,0xff,0xfd,0xe1,0xe2,0x22,0x8f,0xf2,0x2f,0xf0,0x10,0x79,0xfe,0xc7,0xc5,0x71,0xe0,0x28,0x0c,0x1e,0xfc,0xf0,0x58,0xe0,0x4a,0x87,0xbe,0x07,0x1c,0x03,0xeb,0xff,0xdb,0x8f,0x08,0xc4,0x7b,0xf0,0x7b,0x52,0xc1,0x83,0x0f,0xff,0xfc,0xf3,0x7f,0xfa,0x78,0x3d,0x3d,0x3f,0xfa,0x20,0x3c,0x71,0xea,0x31,0xb2,0xff,0xa6,0x60,0xf4,0xc8,0xc7,0xe8,0x7d,0x01,0xe9,0xe1,0x60,0x30,0xc0,0x7a,0x58,0x7c,0x14,0x0f,0x07,0x84,0xc8,0x50,0x5f,0xf4,0x0c,0x1e,0x98,0x18,0xfc,0x82,0x00,0x6e,0x38,0x28,0x35,0x14,0x05,0x00,0x90,0x7c,0x20,0x7f,0xe4,0x80,0xc2,0xd7,0x64,0x0f,0x58,0x87,0xc1,0x64,0x39,0xff,0xfc,0x20,0x1f,0x31,0x8b,0xf6,0x78,0xe0,0x31,0x70,0x7c,0x5a,0x26,0x1f,0x8c,0x7a,0x40,0x41,0xf3,0xf4,0xf0,0x40,0x70,0x04,0xf1,0x97,0x83,0xe3,0xf5,0xe1,0x83,0x98,0x08,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_8[] = {0x01,0x00,0xe6,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x00,0xbf,0xb0,0x7f,0x88,0x3c,0x3f,0xe1,0x0f,0x00,0x5c,0x3f,0xc0,0x1f,0xdf,0x8c,0x7c,0x1f,0x97,0xfb,0xf7,0x83,0xf8,0x21,0x10,0x04,0xe7,0xf0,0x30,0x7f,0x98,0x7e,0xed,0xf0,0x08,0x47,0xb0,0x1e,0x7c,0xf8,0x4c,0xcb,0xe6,0x0f,0x38,0xbc,0x02,0x21,0xd0,0x03,0x9e,0x3f,0x93,0x33,0x07,0xa4,0x2e,0x01,0x20,0xdc,0x07,0xcc,0x1e,0xf0,0x50,0x78,0xd1,0x80,0xe7,0x4f,0x84,0xc9,0xbf,0x20,0x62,0xff,0x40,0xa0,0x14,0x0c,0x0f,0xfb,0xde,0x0f,0x2e,0x4c,0x9c,0x1e,0xdc,0x08,0x07,0xf4,0x1e,0x5c,0xfe,0x44,0x1f,0xf0,0x7e,0x38,0x0f,0xfa,0x81,0x10,0xfe,0xf1,0xc1,0xe7,0xcf,0xfe,0x03,0xca,0xfd,0x01,0x80,0xc8,0x64,0x1f,0xa0,0xf9,0xc2,0x79,0xc0,0xf2,0xbf,0xff,0x30,0x17,0xc8,0x95,0x00,0x1e,0x60,0x06,0xdf,0x50,0x30,0x51,0x4a,0x0c,0x11,0x3d,0x3b,0xe9,0x04,0x7e,0x13,0x42,0xfe,0x0e,0x4c,0x00,0xb5,0xfd,0x04,0xce,0x15,0x04,0x83,0x24,0x07,0x9f,0x83,0xce,0x48,0x29,0xff,0x20,0x78,0xd7,0xb4,0x16,0x38,0x94,0x12,0x03,0xf4,0x07,0x8f,0xcf,0x39,0x3c,0x07,0x98,0x7c,0x6e,0x71,0x44,0x00,0xfa,0x01,0xe5,0xc9,0x07,0xb7,0xfe,0x29,0x20,0x07,0x9e,0x0f,0x92,0x2f,0x40,0x79,0xc6,0x30,0x1e,0xb0,0xfa,0x5b,0xda,0xe4,0x0f,0x38,0x3d,0x83,0xd8,0x0f,0x2f,0x18,0x3d,0x64,0x1f,0xfe,0x94,0x02,0x30,0x3f,0x30,0x78,0x9b,0xd2,0x81,0xfe,0x9d,0xc0,0x20,0x80,0xf1,0x87,0xe0,0xbe,0xf2,0x0a,0x40,0xfc,0xf0,0x11,0xc8,0x64,0x02,0x04,0x6f,0x14,0x7c,0x40,0x20,0xb0,0x88,0x01,0xfc,0x81,0xf3,0x02,0x80,0x1f,0xc7,0xf4,0x0f,0xc9,0x80,0x3f,0x30,0x10,0x02,0x00,0xff,0x41,0xf5,0x00,0xc1,0xc0,0xf0,0x1f,0xe0,0x7d,0xdf,0x20,0x14,0x00,0x41,0x43,0xc1,0x03,0x80,0x07,0xa8,0x00,0x54,0x62,0x00,0x1f,0x98,0x08,0x6f,0xe0,0xf7,0xe8,0x02,0x0a,0x1a,0x1f,0x21,0xb1,0x03,0xd3,0xb0,0x0f,0x28,0x30,0x1c,0x8a,0xc4,0x0f,0x4e,0xa0,0x3f,0x85,0xe7,0x06,0xce,0x62,0x01,0xe7,0x4f,0x07,0xc6,0x8b,0x09,0x01,0x07,0x8e,0xfe,0x5e,0x5f,0x70,0x78,0xe0,0xa0,0x61,0xf2,0x07,0xa5,0x80,0x1e,0x98,0x18,0x38,0x3c,0xa2,0xe0,0xf4,0xef,0xef,0xc3,0xee,0x0f,0x4d,0x01,0xe0,0x7f,0xc3,0xf5,0xff,0xc2,0xc1,0xed,0xfc,0x2f,0xaf,0x7e,0x0a,0x0f,0x39,0x00,0x60,0x8f,0xe9,0xf7,0xf8,0xbf,0x44,0x00,0x54,0x0f,0xd0,0x40,0x51,0xeb,0x78,0x80,0x83,0xd3,0xe8,0x1f,0x18,0x72,0xfd,0x33,0xe0,0xe3,0x07,0x8f,0x20,0x1e,0x23,0x22,0x6f,0x95,0x9c,0x1e,0xb3,0x0f,0xff,0xe3,0xf6,0x0c,0x13,0xa0,0xff,0xe3,0x34,0x00,0x7a,0x70,0x20,0x1f,0x78,0x38,0x18,0x78,0x1f,0xf8,0x0c,0x18,0x1e,0xb0,0x0f,0xff,0xa1,0x44,0x40,0x01,0xff,0x40,0x41,0xed,0x00,0xf4,0x7f,0x7b,0xe0,0xf2,0x2e,0x88,0x3e,0x3c,0x61,0xf3,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_9[] = {0x01,0x00,0xd6,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x01,0x3d,0xe0,0xff,0x06,0xe4,0x0f,0xf0,0x0f,0xab,0xf8,0x04,0x7f,0x9c,0x7c,0x18,0x7a,0xf3,0xf0,0xf9,0xc0,0x7f,0x2c,0xff,0x0e,0x07,0xb8,0x1f,0x71,0xb8,0x04,0x0f,0xda,0x09,0x3e,0x7c,0x26,0x65,0xf3,0x07,0x9c,0x16,0x01,0x0c,0xfd,0x03,0xcf,0x1f,0xc9,0x99,0x83,0xd2,0x05,0x00,0x88,0x71,0x0e,0x26,0x0f,0x59,0x7d,0xea,0x03,0x00,0x90,0x6f,0x81,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xc0,0x20,0x14,0x0a,0x08,0x3d,0x39,0x32,0x70,0x7b,0x60,0x30,0x1f,0xee,0x39,0x3c,0xb9,0x10,0x7f,0xc0,0x3c,0xab,0xf0,0x09,0xfd,0x03,0x21,0xfe,0x80,0x83,0xcf,0x9f,0xfc,0x2b,0x15,0x7f,0x81,0xc0,0x90,0x48,0x3f,0xa1,0xf3,0x84,0xf3,0x81,0xe5,0x7f,0x97,0xc8,0x23,0xd1,0x10,0x78,0xa8,0x66,0x5f,0x90,0xb0,0xc2,0xa4,0x3c,0x20,0x7d,0x54,0x33,0xf0,0x68,0x14,0xe8,0x1f,0x31,0x7e,0x46,0xce,0x09,0x02,0xe3,0x7f,0x87,0xc3,0x83,0xce,0x48,0x29,0xff,0x20,0x79,0x7a,0x2c,0x70,0x5c,0x14,0x07,0xfa,0x0f,0x1f,0x9e,0x72,0x78,0x0f,0x5b,0x9c,0x16,0x81,0x00,0x60,0x88,0x3c,0x79,0x20,0xf6,0xbf,0xc1,0x66,0x00,0xf3,0xc1,0xf2,0x45,0xec,0x0f,0x18,0x67,0x03,0xf6,0x1f,0x4b,0x78,0x18,0x7f,0xf0,0xbe,0x47,0xfe,0x09,0x03,0xf8,0x03,0xcf,0xc6,0x0f,0x5e,0x87,0xff,0x85,0x00,0xfc,0x5f,0x41,0xe8,0x6f,0x38,0x5e,0x42,0x1f,0x3f,0x80,0x7f,0x27,0xdf,0xe8,0x7e,0x0b,0xef,0x20,0xa4,0x0f,0xca,0x17,0x20,0x81,0x41,0x20,0x17,0xfb,0xfa,0x3e,0x21,0x7c,0x08,0x0b,0xc0,0x77,0xe0,0xe8,0x07,0x8c,0x00,0x1e,0x3e,0x0e,0xf8,0x3a,0x3e,0xe0,0xf3,0xfc,0x2f,0xa4,0x1e,0x49,0xd1,0xe7,0x40,0xd7,0xe2,0x00,0x6f,0x18,0x3c,0x70,0x1c,0x18,0x1f,0xfd,0x7e,0x21,0xf9,0x80,0x7f,0xa0,0x28,0xf2,0xff,0xc3,0xc1,0x03,0x80,0x07,0xa8,0x40,0x61,0xeb,0xf1,0xff,0xfc,0xc0,0x42,0x75,0x30,0x79,0x80,0x04,0x1e,0x50,0xd0,0xf9,0x11,0x88,0x1e,0xa2,0xf2,0x83,0x01,0x88,0x8c,0x40,0xf4,0xe0,0x7f,0x01,0xfb,0x30,0x1c,0x14,0x1b,0x39,0x88,0x07,0xc7,0x38,0x1e,0x7a,0x2c,0x24,0x04,0x1e,0xdc,0x01,0xf1,0x03,0xcb,0x05,0x03,0x07,0xb7,0xf0,0x1e,0xb8,0x18,0x38,0x3c,0xa0,0xa0,0xf2,0xfc,0x07,0xe8,0x1e,0x7e,0x0f,0xa8,0xfe,0x41,0xe7,0x00,0xfa,0x17,0xe6,0x04,0x0f,0x3f,0x60,0x3c,0xcf,0xea,0x0f,0xeb,0xfc,0x04,0x1e,0x7d,0x80,0x79,0x43,0x97,0xe8,0x0f,0x91,0x59,0x37,0xcb,0x7e,0xce,0x4d,0x40,0x3c,0x8e,0x65,0xbf,0x07,0x9d,0x00,0x1e,0xd0,0x75,0x39,0x01,0x46,0xbe,0x0f,0x4a,0x40,0x3c,0x80,0x0b,0x2f,0x80,0x48,0x01,0xe5,0x88,0x24,0x08,0x01,0xa2,0xe0,0xf4,0x84,0x13,0x08,0x00,0x80,}; | ||||||
|  | const uint8_t _A_Levelup1_128x64_10[] = {0x01,0x00,0xde,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x09,0xef,0x06,0xe4,0x0f,0xf0,0x0f,0xcb,0xff,0xf3,0x8f,0xc7,0x07,0xde,0x7e,0x1f,0x38,0x0f,0xe5,0x9f,0xe1,0xc0,0xf7,0x03,0xee,0x37,0x00,0x81,0xff,0x4a,0x27,0xcf,0x84,0xcc,0xbe,0x63,0xd2,0xff,0xc1,0x60,0x10,0xcf,0xd0,0x5c,0xf1,0xfc,0x99,0x98,0x3d,0x20,0x50,0x08,0x87,0x10,0x3e,0x60,0xf5,0x9f,0xdf,0xa0,0x30,0x09,0x06,0xf8,0x1e,0x74,0xf8,0x4c,0x9b,0xf2,0x1f,0x2d,0xfc,0x02,0x01,0x40,0xa0,0xff,0xce,0x25,0x4f,0xe4,0xc9,0xc1,0xed,0x80,0xc0,0x7f,0xb5,0x64,0xf2,0xe4,0x41,0xff,0x04,0x62,0xaf,0xc0,0x27,0xf4,0x0c,0x85,0xfa,0x22,0x62,0x10,0x78,0xf3,0xff,0x80,0xf3,0xe0,0x70,0x24,0x12,0x0f,0xe8,0x7c,0xe1,0x3c,0xe0,0x79,0xcb,0xe4,0x11,0xe8,0x88,0x3c,0x56,0x33,0x2f,0xc8,0x58,0x61,0x52,0x1e,0x12,0xc6,0x3f,0xd2,0xfa,0x86,0x7e,0x0d,0x02,0x9d,0x2b,0xa6,0x2f,0xc8,0xd9,0xc1,0x20,0x5c,0x66,0x08,0xf3,0xf0,0x79,0xc9,0x05,0x3f,0xe4,0x1f,0x18,0xbf,0xa2,0xc7,0x05,0xc1,0x40,0x4b,0xc5,0xf3,0xce,0x4f,0x01,0xeb,0x73,0x82,0xd0,0x20,0x0c,0x11,0x07,0x8f,0x24,0x1e,0xd7,0xf8,0x2c,0xc0,0x1e,0x78,0x3e,0x48,0xbc,0xab,0xff,0x40,0x79,0xc3,0x38,0x1f,0xb0,0xfa,0x5b,0xc0,0xc3,0xfe,0x85,0xf2,0x3f,0xf0,0x48,0x1f,0xc0,0x1e,0x7e,0x30,0x7a,0xf4,0x3f,0xfc,0x28,0x07,0xe0,0x9e,0x60,0xf1,0x37,0x9c,0x2f,0x21,0x0f,0x9f,0xc0,0x3f,0x9f,0xef,0xfc,0x3f,0x05,0xf7,0x90,0x52,0x09,0xe5,0x0b,0x90,0x40,0xa0,0x90,0x0b,0xfa,0x3e,0x61,0x7c,0x08,0x0b,0xc0,0x77,0xe0,0xfa,0x80,0x03,0xc7,0xc1,0xdf,0x07,0xef,0xe1,0x9d,0x00,0xf3,0x4e,0x8f,0x3a,0x06,0x4f,0x10,0x03,0x7d,0xc1,0xe3,0x80,0xe0,0xc0,0xff,0xe6,0xf1,0x0f,0xcc,0x03,0xfd,0x01,0x47,0x91,0xc0,0x41,0x03,0x80,0x07,0xa8,0x40,0x61,0xeb,0xf1,0xff,0xfc,0xc0,0x42,0x76,0x30,0x79,0x80,0x04,0x1e,0x50,0xd0,0xf9,0x11,0x88,0x1e,0xa2,0xf2,0x83,0x01,0x88,0x8c,0x40,0xf4,0xe0,0x7f,0x01,0xfb,0x30,0x1c,0x94,0x1b,0x39,0x88,0x07,0xc7,0x38,0x1e,0x7a,0x2c,0x24,0x04,0x1e,0xdc,0x0f,0xdc,0xfc,0x92,0x20,0xf1,0xc1,0x40,0xc1,0xed,0xfc,0xfd,0x87,0xd3,0x03,0x07,0x07,0x94,0x14,0x1e,0x5f,0x80,0x7a,0x87,0xd0,0x1e,0x7e,0x0f,0xaa,0x20,0x87,0xec,0x0f,0x38,0x07,0xd0,0x1e,0x65,0xf5,0x81,0x03,0xcf,0xd8,0x0f,0x33,0xfa,0x83,0xfa,0xff,0x01,0x07,0x9f,0x60,0x1e,0x50,0xe5,0xfa,0x03,0xe4,0x56,0x46,0x52,0xdf,0xb3,0x93,0x50,0x0f,0x26,0x91,0x6f,0xc1,0xe7,0x40,0x07,0xb4,0x1d,0x4e,0x40,0x51,0xaf,0x83,0xd2,0x90,0x0f,0x20,0x02,0xcb,0xe0,0x12,0x00,0x79,0x62,0x09,0x02,0x00,0x68,0xb8,0x3d,0x21,0x04,0xc2,0x00,0x20,}; | ||||||
|  | const uint8_t *_A_Levelup1_128x64[] = {_A_Levelup1_128x64_0,_A_Levelup1_128x64_1,_A_Levelup1_128x64_2,_A_Levelup1_128x64_3,_A_Levelup1_128x64_4,_A_Levelup1_128x64_5,_A_Levelup1_128x64_6,_A_Levelup1_128x64_7,_A_Levelup1_128x64_8,_A_Levelup1_128x64_9,_A_Levelup1_128x64_10}; | ||||||
| 
 | 
 | ||||||
| const uint8_t _I_card_bad2_0[] = {0x01,0x00,0x12,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfe,0x01,0x82,0x04,0x0c,0x4a,0x01,0x70,0x8f,0x01,0x46,0x08,0x0f,0x5e,0x30,0x24,0x60,0x50,0x0c,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x04,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x03,0xcf,0x01,0x22,0xa1,0x03,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x00,0x1d,0x01,0x3f,0xd3,0x05,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x02,0x7f,0xf9,0x93,0x87,0xde,0x11,0x00,0x07,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x01,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x01,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x00,0x30,0x7f,0xf0,0x01,0xff,0xff,0x81,0xfc,0x01,0xfb,0xf8,0xe0,0x83,0xf2,0xff,0x4c,0xc3,0x03,0xd8,0x74,0x70,0x15,0xf8,0xe1,0xa1,0x00,0xf6,0x98,0x00,0xca,0x05,0xa0,0x9f,0xc5,0xa1,0x20,0xf6,0x8c,0x00,0xca,0x09,0xd0,0xbb,0xcf,0xb3,0x17,0xb0,0x7d,0x7c,0x3e,0xf3,0xff,0xc0,0x3d,0xee,0x12,0x28,0x10,0x3c,0x7d,0xee,0x01,0xbe,0x83,0xdb,0x11,0x12,0x83,0x2f,0xec,0x1e,0x30,0xa8,0x70,0x3f,0x60,0xd1,0xe0,0xff,0x83,0xf4,0x7f,0xc5,0xf4,0x07,0xd1,0xfd,0x01,0xfe,0x0f,0x99,0xc2,0xfc,0xc1,0xf4,0x0a,0x38,0x0f,0x80,0x08,0x53,0xf0,0x7a,0x82,0x8c,0x12,0xa0,0x0f,0x00,0x78,0x03,0xc0,0x14,}; | const uint8_t _A_Levelup2_128x64_0[] = {0x01,0x00,0x34,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x38,0x1f,0xe0,0x1d,0x97,0xff,0xe7,0x1c,0x1f,0x99,0xf8,0x1c,0xfc,0x1f,0x96,0x7f,0x87,0x03,0xf8,0x0f,0xb8,0xdc,0x22,0x01,0xfb,0x07,0xdc,0x16,0x09,0x00,0xfa,0x03,0xee,0x1d,0x02,0x80,0x7a,0x0b,0xd7,0x31,0x07,0x8f,0x40,0x1f,0x5b,0xfa,0x04,0x06,0x01,0xa0,0x07,0xd5,0x7f,0x00,0x0f,0xe8,0x26,0x06,0x7f,0x40,0x07,0xd4,0xbe,0x05,0x42,0xa0,0x03,0xf2,0x03,0x24,0xcf,0xe0,0x3f,0xc5,0xe9,0x88,0x50,0x72,0x92,0x0c,0x08,0x3e,0x73,0xf1,0xf9,0x0d,0x22,0xf9,0x82,0x07,0xcd,0xbe,0x61,0x10,0x94,0x79,0xa0,0x5f,0xd0,0x7c,0x45,0xe8,0x11,0x09,0x27,0x8c,0x1f,0x50,0xb3,0xf0,0xc5,0x3c,0xe0,0xfb,0x80,0x40,0xb2,0x9f,0xf0,0x7d,0x7a,0xe0,0x10,0xc0,0x7e,0x46,0xe0,0x77,0x00,0x7e,0x42,0xe1,0x98,0x0d,0x2d,0xfc,0x1f,0x71,0x08,0x05,0x3a,0x7f,0x01,0x37,0xd4,0x81,0xfa,0x39,0xf8,0x01,0xfe,0xe0,0x12,0x0a,0x40,0x3e,0xa5,0xef,0xe2,0x98,0x03,0xee,0x01,0x06,0x80,0x10,0x84,0x1f,0x35,0xf8,0x04,0x62,0x00,0x00,0x10,0x7c,0xef,0xe0,0x1e,0x00,0x7e,0x5f,0xc7,0xc3,0x0f,0x07,0xda,0x6c,0x43,0xc4,0x0f,0xb8,0x28,0x3f,0xa1,0xa0,0xfe,0x8a,0x8b,0xfc,0x1f,0xe0,0xfe,0x2f,0xa7,0xe8,0xff,0x30,0x30,0x7f,0x83,0xcf,0xe8,0xaf,0x91,0x7a,0x03,0xff,0xd0,0xdf,0x90,0x7a,0x74,0x1f,0xf2,0xcf,0x10,0x01,0x68,0x01,0xf1,0x17,0x07,0xa5,0x00,0x1f,0x10,0x90,0x7a,0x60,0x3f,0x80,0xd5,0xc7,0xdf,0xe0,0xc0,0xf4,0x80,0x7c,0xc1,0xeb,0x77,0xc0,0x40,0x41,0xe9,0x01,0xe6,0x03,0xd7,0x17,0x7f,0x05,0x08,0x3d,0x26,0x18,0x00,0x7a,0x42,0xc1,0x44,0x0f,0x4e,0x05,0xfc,0x1f,0xa5,0x11,0xff,0x03,0xcc,}; | ||||||
| const uint8_t *_I_card_bad2[] = {_I_card_bad2_0}; | const uint8_t _A_Levelup2_128x64_1[] = {0x01,0x00,0x17,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xf8,0x17,0x59,0xfe,0xf8,0x6b,0x37,0xf9,0xf0,0x32,0x7e,0xc1,0xac,0x02,0x19,0xff,0xfe,0x03,0xfc,0x11,0x5c,0xfe,0x7f,0xfe,0xf1,0x8c,0x2e,0x3d,0xce,0x80,0xe7,0xbe,0xff,0x90,0x7c,0xc3,0xe6,0x18,0x0b,0x0f,0xfb,0xf0,0x61,0x8c,0x7c,0x3e,0x19,0x40,0xc0,0x43,0x6f,0xc1,0xe8,0xbf,0xe3,0xa1,0x52,0x08,0x04,0x0a,0xfe,0x83,0x7f,0xdf,0xf6,0x09,0x05,0x88,0x40,0x30,0x89,0x28,0xfb,0xfb,0xf0,0x10,0x40,0x78,0xca,0x0f,0xee,0x00,0x18,0xfd,0x02,0x05,0x08,0x80,0x44,0x3f,0xc6,0x08,0xbf,0xd2,0x3f,0xc0,0xf2,0xfe,0x7f,0x41,0xef,0xf7,0x90,0x40,0xe1,0xf0,0x09,0x06,0xf1,0x3d,0x3a,0x88,0x04,0x63,0xf1,0xa3,0xfc,0x03,0xe6,0xa1,0x10,0x90,0x41,0x28,0x80,0xf1,0xf3,0xbe,0x5a,0xff,0xb2,0x88,0x50,0x3f,0x54,0x80,0x78,0xb0,0xda,0xfb,0xff,0xd8,0x42,0x30,0x50,0x5a,0x8e,0xe2,0x1f,0xfc,0xf7,0x84,0x17,0xf9,0x68,0x84,0x40,0xbc,0x79,0x2f,0xe7,0xdc,0xdf,0x17,0x88,0x46,0x07,0xc5,0xa3,0xfe,0x3c,0x9e,0xff,0x38,0xfc,0x41,0xf0,0x3e,0x5d,0x2f,0xe0,0x1e,0xf2,0x78,0x04,0xe2,0x19,0x80,0xfe,0xe9,0x78,0x1f,0x00,0x7b,0x61,0xf4,0x31,0xc7,0xf8,0xff,0x64,0xb0,0x9f,0xe7,0xff,0xbe,0x10,0x58,0x1b,0xf8,0x81,0xe3,0x01,0xff,0x6f,0xf7,0xe0,0xf5,0xd1,0xc1,0x30,0x18,0x1f,0xec,0x4e,0x13,0x8f,0xfb,0x83,0xda,0x1f,0xe4,0x80,0x65,0xbf,0x71,0x2c,0x0f,0x9f,0xe7,0xdf,0x39,0x1d,0xee,0xfd,0x9f,0x8a,0x40,0xfc,0x17,0xf8,0x4f,0x27,0xff,0xfb,0xf7,0xb8,0x8e,0x7f,0xfc,0x9f,0x43,0x21,0x90,0x0f,0x82,0x08,0x59,0xaf,0xff,0xcf,0xc3,0xa2,0x10,0x0c,0x04,0x1a,0x53,0xe0,0x07,0xa9,0x10,0x60,0x10,0xa9,0x04,0x02,0x01,0x01,0x80,0x83,0xda,0xff,0x1f,0xd0,0x42,0xa8,0x00,0xf1,0x80,0x6a,0x51,0xe3,0xf3,0x08,0x26,0x7a,0x03,0x12,0xc0,0x40,0x44,0x04,0x8f,0x1f,0x39,0xfd,0xa2,0x50,0x08,0x30,0x7c,0xbf,0xdf,0xfe,0x79,0xfd,0xa4,0x50,0x0b,0xc0,0x7c,0x81,0xee,0x96,0x1a,0x10,0xf8,0x83,0xe2,0x2f,0x1f,0x7f,0xec,0x1e,0x7c,0xf8,0x5e,0x08,0x1e,0x70,0x11,0xf0,0xa3,0xd0,0xfc,0x3a,0x38,0x11,0x38,0x83,0xe3,0xf7,0xf1,0xab,0x8d,0x4a,0x2d,0xf1,0x81,0x40,0x81,0xe5,0xc1,0xff,0xfc,0x45,0xc8,0x04,0x1d,0x38,0x38,0xe0,0x1c,0x99,0xff,0xe0,0xbc,0xbf,0x38,0x7c,0x0c,0x1e,0x74,0x28,0x79,0x80,0x49,0xc9,0xc3,0x97,0x83,0xd2,0x15,0x06,0x0f,0x2c,0xde,0x0f,0x87,0x17,0xa4,0x12,0x04,0x1f,0x1f,0x78,0x3c,0xa9,0x70,0xed,0x00,0x3d,0x34,0x92,0x0c,0xf6,0xfc,0xc0,0x78,0xb8,0xe5,0x00,0x1e,0x90,0x88,0x05,0x9f,0x3e,0x2f,0x38,0x5e,0x0e,0x44,0x0f,0x49,0x84,0xab,0x33,0xce,0x07,0xa4,0x72,0x30,0x0f,0x4e,0x04,0x03,0x0c,0x60,0x48,0xbf,0x82,0x0e,0x0f,0x48,0x07,0xff,0x02,0x0f,0x50,0x48,0x83,0xd6,0x01,0x80,0x07,0x89,0x40,0xa5,0xe0,0xf6,0x61,0x8d,0x01,0x22,0x80,0xfa,0xb3,0x03,0xce,0x82,0x0f,0x89,0x07,0x00,0xfe,0x78,0x10,0x7c,0xf8,0x3f,0x22,0x02,0x81,0x82,0x04,0x1e,0xd9,0x0a,0x17,0xf0,0x3e,0x40,}; | ||||||
| 
 | const uint8_t _A_Levelup2_128x64_2[] = {0x01,0x00,0xed,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x3f,0xe4,0x1f,0xdf,0x40,0x43,0xf3,0xc0,0xa9,0x7f,0xfb,0x03,0xdf,0x66,0x05,0x4d,0xff,0xbc,0x1e,0xf3,0xbf,0xf0,0x14,0xe3,0xf7,0x8f,0xf7,0xc4,0x1e,0xb1,0x3f,0xe0,0x14,0xe1,0xf9,0x02,0x0b,0xc5,0xc1,0xeb,0xcc,0xff,0x03,0xda,0x1e,0x0f,0x48,0x3f,0xbf,0xfd,0xf8,0x07,0xad,0xfc,0x1e,0x57,0xff,0xf4,0x0f,0xe7,0xff,0x07,0xaf,0x8e,0xff,0xf8,0xed,0xc7,0xee,0x1f,0xc8,0x18,0x34,0x41,0xeb,0xc3,0x9f,0xfc,0x3f,0x70,0xfe,0x07,0xfe,0x01,0x9c,0x0b,0x88,0x88,0x41,0xe7,0x1f,0xc8,0x5f,0xe0,0x7c,0x08,0x7c,0x03,0xf9,0x7f,0x9e,0x07,0xd3,0x8f,0x17,0x80,0x5e,0xde,0xe5,0x0a,0xff,0x4f,0xe3,0xc0,0xf4,0xc7,0xcf,0xe0,0x11,0x32,0x68,0x84,0x07,0xf7,0x3f,0x4b,0xa7,0xe2,0x7f,0x7f,0x82,0x70,0x20,0xb9,0xdd,0x54,0x08,0x3e,0x21,0xe4,0xfc,0x4d,0xff,0x10,0xe9,0x86,0x22,0xc0,0x1f,0x1b,0xf8,0xb8,0x58,0x47,0xfe,0x99,0xda,0x31,0xd0,0xcc,0x46,0x03,0x53,0x82,0xbd,0xe7,0x83,0xe9,0x3f,0x99,0xf0,0x20,0x90,0x28,0x24,0x06,0x05,0x80,0xbf,0xe3,0x2f,0xeb,0xe5,0x07,0x8c,0x04,0x02,0x3a,0x4e,0x07,0xbf,0x00,0xa6,0x25,0xf1,0xe0,0x30,0x10,0x00,0x78,0xc2,0x30,0x13,0xc0,0x79,0x00,0x0e,0xfd,0x80,0xa0,0x03,0xcb,0x21,0x0a,0x08,0x88,0x39,0x19,0x83,0x00,0x07,0x8c,0x0a,0x05,0x10,0x30,0x0f,0x03,0x7e,0x0f,0x3c,0xe7,0xbe,0x03,0x20,0x07,0x96,0x82,0x05,0x00,0x90,0x23,0xd2,0x33,0xff,0x07,0xa0,0x0c,0x41,0xe7,0xc7,0x07,0x8c,0x6b,0x9d,0x01,0x15,0x88,0x3c,0x68,0x1a,0x88,0x54,0x00,0x18,0x38,0xb0,0x10,0x9e,0x04,0x1e,0xa1,0xf1,0xc7,0x7f,0xfc,0x7f,0xd0,0x78,0xc1,0xe0,0x18,0x00,0xc8,0xa0,0x07,0x01,0xaa,0x85,0x36,0x47,0xce,0x3f,0x28,0x69,0x20,0x71,0x10,0x70,0x78,0xe3,0xc2,0xc3,0xff,0x07,0x18,0x00,0x60,0x38,0x0a,0x54,0x23,0xff,0x87,0xc8,0x68,0xa1,0x5f,0x80,0x7a,0x8c,0x06,0x49,0x90,0x80,0xd3,0x24,0x01,0x61,0xfc,0xfe,0xc1,0xeb,0x8a,0x92,0x54,0x20,0x15,0x09,0x06,0xa7,0xc0,0xeb,0x20,0x71,0x5f,0xe1,0xf0,0x0a,0xa4,0xc2,0x41,0x60,0xa8,0x40,0x7e,0x1e,0xff,0xe8,0x3c,0xa1,0xff,0xf8,0xf4,0xa3,0xa9,0x30,0x91,0x58,0xab,0x1a,0x9f,0x87,0x1e,0xff,0xde,0xc7,0x8b,0x47,0xd2,0x1f,0x1e,0xa4,0x42,0x45,0x42,0xac,0x07,0xc7,0x8f,0x3f,0xff,0x61,0xff,0xff,0x7e,0xfc,0x1f,0x40,0x0f,0x41,0xf8,0xf9,0xdf,0xa3,0xe3,0x7f,0x98,0x7c,0x62,0x2e,0x21,0xae,0x40,0x78,0x00,0xc2,0x4f,0x91,0x40,0x43,0xe3,0x1f,0x75,0x8d,0x7f,0x53,0x80,0xf1,0xbb,0xd0,0x00,0x30,0x0d,0x26,0x7f,0xff,0xcf,0x97,0xc0,0x60,0x1f,0x00,0x50,0x82,0x07,0xff,0xf3,0xfe,0xe0,0x64,0x94,0xf8,0x07,0x42,0x4f,0xa9,0x81,0x7f,0x3e,0xe0,0xf2,0xfe,0x78,0x3d,0xf0,0x1a,0x24,0xc2,0x01,0x60,0x88,0x07,0xc7,0xfc,0x0f,0x10,0xe8,0xa4,0xca,0x01,0x84,0x1f,0x94,0x3f,0x52,0xdf,0x10,0xf0,0xf9,0xfe,0x3f,0xfe,0x3c,0xf2,0x01,0x04,0x88,0x17,0xc5,0xe4,0x30,0x02,0x20,0xf7,0xfc,0xff,0x9f,0xfc,0x0a,0x31,0xa0,0x82,0x48,0x20,0x00,0x11,0xd4,0xe0,0xb3,0xfc,0x7f,0x3f,0xcf,0xf9,0xff,0x90,0xc0,0x03,0xe2,0x0f,0x36,0xf8,0xc3,0xf8,0x3e,0x7b,0xc0,0xf4,0x6f,0xf0,0x00,0xfa,0xe0,0x61,0x50,0x7f,0x05,0xde,0x38,0x7e,0x38,0x04,0x18,0x7a,0x24,0x11,0x81,0x81,0xc7,0xc1,0x13,0xc0,0x03,0x87,0x9f,0x80,0xd5,0x03,0xd3,0x07,0x0a,0x85,0x7c,0x20,0x3e,0x00,0x78,0xed,0xc2,0xe3,0x05,0xe0,0x40,0x23,0x00,0x41,0x41,0x8f,0x81,0x44,0x2b,0x21,0xa5,0x6a,0x31,0x50,0x4c,0x07,0xe6,0x19,0x00,0xc4,0xea,0xb2,0x41,0x91,0xfc,0x07,0xc7,0x15,0x01,0xb0,0x03,0xc6,0x0e,0xe4,0x19,0x8c,0x03,0x18,0x0f,0x1d,0xc7,0xef,0xff,0x08,0x87,0x46,0x20,0x86,0xc1,0x01,0x0f,0x07,0x01,0x83,0x81,0x4a,0xb9,0x06,0xe1,0x84,0x7c,0x20,0xe0,0xc1,0x83,0x17,0x46,0x03,0x7f,0xc0,0x18,0x48,0x5e,0x25,0x91,0x47,0x88,0xdc,0x40,0x82,0x00,0x1a,0x06,0x88,0xc2,0x20,0xf6,0x00,0x21,0xd4,0x4b,0xe2,0x0f,0x15,0x79,0x83,0xd7,0x41,0xaa,0x85,0x2f,0x87,0xfe,0xa9,0x10,0x7b,0x82,0x4b,0xfc,0xbf,0x11,0x29,0x00,0x1b,0x21,0xaa,0x95,0x03,0x87,0xfd,0x94,0x07,0xc4,0x20,0x3e,0x5f,0xff,0xc4,0x2e,0x02,0x0d,0x50,0x30,0xe9,0x07,0xe3,0xf6,0xff,0xfe,0x61,0x70,0x61,0xfa,0x83,0xc5,0xc2,0x4a,0xf2,0x81,0x9e,0xc4,0x1e,0xbf,0x8d,0x46,0xab,0x14,0x0f,0x20,}; | ||||||
| const uint8_t _I_card_ok1_0[] = {0x01,0x00,0x19,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x00,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x00,0x7f,0xf7,0xfe,0xe0,0xfe,0x1f,0xef,0x00,0xfe,0x80,0xa5,0x75,0x14,0x06,0x80,0x0f,0x99,0x80,0x0c,0xa0,0x4b,0xf5,0x00,0x24,0x61,0xaa,0x7d,0x06,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x06,0x04,0x0f,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x01,0x07,0xc4,0x2a,0x1c,0x0f,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x02,0x8e,0x03,0xe0,0x02,0x14,0xfc,0x1e,0xa0,0xa3,0x04,0xa8,0x03,0xc0,0x1e,0x00,0xf0,0x05,0x00,}; | const uint8_t _A_Levelup2_128x64_3[] = {0x01,0x00,0x2d,0x03,0x8f,0xc0,0xb8,0x1f,0xfb,0xfd,0xe2,0x7f,0xf8,0x02,0x0f,0xff,0xff,0x03,0xff,0x00,0xc6,0xff,0x36,0xe0,0x47,0xfd,0xff,0x08,0xff,0xf3,0xff,0x3f,0x05,0x8f,0xf0,0x1e,0x5f,0xf8,0xfe,0x02,0xfb,0xff,0xf8,0x43,0xff,0x99,0xfd,0xf8,0x44,0x81,0xe7,0x17,0x88,0x7d,0x37,0xe0,0xf2,0x87,0xe7,0xff,0xe0,0x11,0xfe,0x83,0xca,0x1f,0x20,0xf8,0x0f,0x46,0x0f,0xfe,0x83,0xf6,0xff,0xfc,0xf0,0xfa,0x47,0xec,0x1e,0x08,0xf8,0x3c,0xa0,0x7c,0x3f,0xff,0x9c,0x1e,0x93,0xf8,0x06,0x02,0x1f,0xf8,0x2c,0x8c,0x07,0xc1,0xff,0xfd,0x83,0xdb,0xc1,0x07,0xfc,0x40,0x6f,0xda,0x0d,0x47,0xff,0xf2,0x0f,0x4b,0xf8,0x7c,0x60,0xda,0x88,0x0c,0x72,0x01,0xb0,0xff,0xe0,0x01,0xe9,0xff,0x80,0x68,0x21,0xff,0xa9,0x06,0x02,0x01,0xf2,0xbf,0x40,0x12,0x44,0x1f,0x2b,0x82,0xa1,0x7d,0x11,0xf8,0x05,0xf8,0x1e,0x74,0x7f,0x80,0xc0,0x75,0x50,0xa8,0x04,0x83,0xf0,0x0f,0x1b,0xe1,0x48,0x6f,0xfb,0x78,0x38,0x3c,0x40,0x09,0xfc,0x81,0x83,0xcb,0xfb,0xbf,0xbf,0xcb,0xbe,0x1a,0x8d,0x56,0xaa,0x55,0x80,0x85,0x18,0xc4,0x5e,0xb3,0xce,0x00,0x7d,0x7b,0x80,0x21,0xdf,0xcf,0xef,0xee,0x72,0x2f,0x8e,0xaa,0x01,0xa8,0xd1,0x62,0xa7,0xfa,0x0c,0x06,0x7d,0x82,0x33,0x8f,0x3d,0xfe,0x04,0x18,0x15,0x68,0xc0,0x1e,0xa2,0x02,0x1f,0x0f,0xff,0xbf,0x3f,0xe3,0xcf,0xc7,0x63,0xca,0xd7,0xe7,0xf5,0x58,0xa8,0x3e,0xa3,0x80,0x8e,0x29,0xfe,0x3c,0x2e,0x30,0x0b,0x87,0x76,0xea,0x73,0x11,0x10,0xd8,0x01,0xe5,0xcf,0x9f,0xcf,0xf5,0x50,0x2d,0x61,0x80,0x75,0x38,0xa2,0x28,0xda,0x09,0x63,0x9f,0x1f,0x0c,0xf8,0x3e,0x35,0x6a,0xad,0x54,0x3a,0x20,0x01,0xba,0x7f,0xf7,0xf9,0xff,0xbc,0xfe,0x7c,0x9c,0x1d,0x5e,0xbb,0x57,0xa6,0x85,0x68,0xb5,0x5b,0x8d,0xff,0x7f,0xde,0x0f,0x18,0x60,0xe8,0x43,0xc3,0x55,0x86,0x87,0xcb,0x31,0xfd,0xff,0xf9,0xfc,0xe4,0xe1,0xd4,0x72,0xb5,0x41,0xf1,0xcd,0x42,0x88,0x63,0xe4,0xff,0xfe,0x7c,0xff,0x18,0x38,0x5c,0x68,0x15,0x5a,0xbd,0x5e,0x2a,0x1f,0x2f,0x87,0xcf,0xf3,0x27,0xfc,0x41,0xe5,0x4b,0xe2,0x00,0x16,0x29,0x86,0x3f,0x0f,0x8e,0xe2,0x07,0xfc,0x87,0x85,0xc6,0xc0,0x1f,0x29,0xa8,0x7c,0xbc,0x13,0x9f,0x74,0x0f,0xd1,0x0f,0x0d,0x0e,0xc8,0x3c,0x56,0xa2,0xf0,0xc0,0xbf,0x19,0x8f,0xfc,0x07,0xf9,0x06,0x0b,0x8d,0x40,0x3e,0x55,0x50,0xf9,0x7e,0x38,0x5f,0xf8,0x00,0x04,0x47,0xc6,0x80,0x10,0x21,0x42,0xaf,0x1d,0x09,0xfe,0x00,0x1e,0x20,0x01,0xec,0x07,0x46,0xab,0xdf,0x03,0x94,0xf3,0x85,0x0f,0x07,0x90,0x7c,0x7d,0x5a,0xaf,0xfe,0xbf,0x74,0x1f,0x19,0x54,0xf3,0xd0,0xb5,0x1e,0x1a,0xdc,0xfa,0xb5,0x5a,0xed,0xd6,0x02,0x1f,0x2f,0x00,0x0c,0x78,0xf0,0x1d,0x03,0x78,0x7f,0x5a,0xa0,0x08,0xea,0x47,0xe3,0x38,0xa0,0x40,0x25,0x1e,0x34,0xf9,0x55,0x2e,0xa0,0x01,0xaa,0x87,0xc8,0x00,0x7f,0xa8,0x06,0x8e,0x15,0xfc,0x1e,0x0f,0xab,0xf4,0x1f,0x20,0x71,0x42,0xbf,0x1e,0x70,0xc0,0xf5,0x2a,0xb7,0x7a,0xbd,0x74,0x3e,0xdf,0x8f,0xfe,0x0e,0x54,0x1f,0x59,0x54,0xaa,0x01,0x08,0xc0,0x28,0xc7,0xfe,0x63,0x10,0xf8,0x80,0x04,0x3f,0x08,0x81,0xd5,0x7f,0x37,0xe1,0xf1,0xff,0xea,0x70,0x41,0xf1,0x90,0x6a,0x20,0x5f,0xeb,0xf8,0x4c,0x7e,0x9d,0xff,0xff,0x7e,0xfe,0x1f,0x6d,0xf5,0xff,0x51,0x2a,0xd6,0x7b,0xcf,0xe3,0xaf,0xd4,0xe0,0x03,0xe2,0xa3,0x18,0x17,0xf2,0xf6,0x7f,0x3a,0xa9,0xfe,0x09,0xe3,0xa8,0x85,0x6b,0x07,0xe5,0xaf,0x80,0xe0,0x35,0x40,0x11,0x0f,0x97,0xfc,0x30,0x35,0x42,0xf9,0x07,0xde,0xfd,0x0f,0x0f,0x93,0xf0,0xb5,0x58,0x10,0xe9,0x07,0xca,0x7d,0x1f,0x1f,0xec,0xf2,0x7c,0x57,0x10,0xfa,0x6a,0x71,0x40,0x53,0x80,0x4e,0x03,0xe5,0x56,0x1f,0x9a,0x98,0x40,0x0c,0xb7,0x1d,0x77,0xab,0x54,0xc1,0x1d,0x5e,0x88,0x40,0x48,0x21,0xf0,0x4c,0x02,0x23,0x55,0xea,0xaf,0x86,0xab,0x05,0x80,0x58,0x03,0xa7,0xf4,0xb4,0x6a,0xb1,0x5a,0xed,0x57,0xec,0x04,0x38,0xbd,0x16,0xc8,0x3e,0x30,0xa8,0x07,0xf3,0xb1,0x01,0xb0,0x07,0xc6,0xaf,0x5f,0xaa,0xcd,0x60,0x1d,0xc4,0xfa,0x6a,0x21,0xdb,0x80,0xe0,0xea,0xc0,0x43,0xeb,0xc0,0x6a,0xc3,0xe3,0xa0,0x85,0x7f,0xab,0x3f,0x5a,0xb9,0x70,0x6a,0xe0,0x32,0xbf,0xf5,0x43,0xe7,0xff,0xdb,0x85,0x44,0x38,0x3f,0xa3,0xd9,0xda,0xa1,0x50,0xa2,0x00,0xcf,0x6a,0x67,0xc3,0x00,0x28,0x7c,0xf8,0x1a,0xf0,0xf9,0x80,0x12,0x55,0x28,0x94,0x2f,0xc7,0xc7,0x6b,0x0f,0x41,0x84,0x40,0x03,0x80,0xf0,0xf7,0xc3,0x8a,0x00,0x2c,0xd0,0x84,0x75,0x5c,0x2f,0x8e,0x7c,0x3f,0x10,0xd1,0xf1,0xfc,0x20,0x27,0x62,0x00,0x18,0x18,0x74,0xca,0x91,0x1f,0x8f,0xe1,0xba,0xae,0x18,0xfe,0x28,0x44,0xbe,0xba,0xbf,0xd6,0xa3,0x55,0xa2,0x0f,0x8f,0xf0,}; | ||||||
| const uint8_t *_I_card_ok1[] = {_I_card_ok1_0}; | const uint8_t _A_Levelup2_128x64_4[] = {0x01,0x00,0x90,0x02,0xff,0x80,0x3c,0x01,0xf1,0xff,0xe0,0x3f,0x7d,0xff,0xd1,0x0f,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2d,0xff,0xee,0x0f,0xef,0x47,0xff,0xfc,0x06,0x2d,0xf8,0x3d,0xe0,0x3e,0x49,0x3f,0xc0,0xfc,0x7f,0x8f,0xfc,0xed,0x02,0x37,0xff,0xc5,0xbe,0x01,0xf0,0xaf,0xe0,0xc1,0xe7,0xe0,0xff,0xc0,0xc2,0xe3,0x1f,0xf8,0x4f,0xe0,0x17,0x0b,0xf5,0x81,0x34,0x40,0xf1,0xb8,0xc1,0x38,0x1f,0xd8,0x3f,0xe2,0x73,0x00,0xf7,0xc7,0xe4,0x02,0xb1,0xff,0xcf,0xf0,0x02,0x81,0xc0,0x77,0xe0,0x37,0xf8,0x47,0x82,0xff,0x0e,0x6e,0x1c,0x1d,0xc4,0x3e,0x08,0x0c,0x0b,0x80,0x2e,0x1f,0x00,0x08,0x60,0x06,0x02,0xc3,0xc0,0x41,0xe4,0x09,0x12,0x70,0xd8,0x23,0xf8,0x08,0x78,0x3c,0x7e,0xf0,0x78,0x1c,0x03,0x81,0x07,0xff,0x40,0xc0,0xa5,0x19,0x10,0x8a,0x00,0xc6,0x05,0xc4,0xd7,0xc7,0xc0,0x82,0x00,0x13,0xf1,0xa4,0xc6,0x9e,0x08,0x3b,0xf8,0x3c,0xcb,0xa4,0x02,0x13,0x90,0xc1,0xa0,0x1a,0xcd,0x56,0xa8,0x84,0x50,0x0f,0x67,0xff,0xe7,0xf1,0xf9,0xfb,0x3f,0x30,0xfa,0x80,0xd8,0xa0,0x71,0x40,0x78,0xff,0x39,0xfe,0x7b,0xff,0x9f,0x89,0xff,0x85,0xc0,0x35,0x7a,0xed,0x58,0x90,0x45,0xe5,0x87,0x1f,0x94,0x02,0x9f,0x08,0xca,0x01,0x8a,0x9f,0x15,0x07,0x8d,0xe3,0x80,0x0f,0x30,0xc8,0xf0,0x35,0x41,0xf1,0x8d,0x14,0x13,0x9f,0xfb,0x07,0x8c,0x02,0x21,0xd0,0x0b,0x15,0x7e,0x2a,0x51,0x1b,0x07,0xfb,0xcd,0xff,0xe1,0x9f,0x8b,0x40,0x5e,0x1d,0x54,0xa8,0x3c,0x53,0xc9,0xce,0x43,0xff,0x01,0x44,0x93,0xc4,0x5a,0xc5,0x55,0xa8,0x40,0x77,0xd1,0xe8,0x07,0xdd,0xa4,0x20,0xf1,0xd8,0x07,0xca,0xd4,0x1f,0x28,0xf3,0x80,0x6f,0xf3,0x05,0x78,0xc1,0x14,0xe7,0x7f,0xaa,0xd5,0x60,0x30,0x48,0x06,0x02,0x3f,0xfe,0xfe,0x90,0x07,0x51,0xaa,0x40,0x0e,0xa8,0xbe,0x66,0x91,0xe3,0x86,0x45,0x3c,0x3f,0x96,0x39,0xd5,0x2a,0xa1,0x04,0xf7,0xfe,0xc4,0xa3,0xe8,0xd5,0x7f,0xf5,0xfb,0xa0,0xfa,0x16,0x87,0xc7,0x6f,0x80,0x55,0x3f,0xa1,0xf3,0x1f,0x8b,0xc9,0x38,0x70,0x30,0x20,0xeb,0x3f,0x5a,0xa0,0x08,0xb8,0x0c,0x1e,0x58,0x10,0x18,0xd0,0x03,0xef,0x54,0x09,0xab,0x9c,0x77,0x5a,0xaf,0x57,0xe8,0x16,0xd1,0xfb,0x85,0xc2,0x00,0x1f,0x50,0x80,0xd5,0x22,0x20,0xf1,0xff,0x7e,0x3f,0x01,0xfb,0xec,0x7f,0xef,0x12,0x00,0x78,0x87,0xce,0x2b,0x04,0x82,0xc5,0x03,0xc4,0x08,0x1f,0x1c,0x07,0xf9,0xbf,0x0f,0x8b,0x60,0x43,0xe9,0x5b,0x4f,0x90,0x7d,0x6a,0x35,0x58,0x28,0x04,0x59,0xe3,0xbe,0xbf,0x83,0xc7,0x59,0xef,0x3f,0x8e,0xbc,0x3e,0xbf,0xf8,0xf8,0x04,0x43,0xeb,0x55,0xa2,0xd0,0x6a,0xb1,0x58,0x07,0xee,0x13,0x97,0x07,0x8e,0xb0,0x7e,0x41,0xf5,0xe0,0x7f,0xe1,0xb1,0xf8,0x7a,0xfd,0xc3,0xe3,0x05,0xb0,0x43,0xf8,0x17,0xf6,0xf8,0xeb,0x35,0x40,0x02,0x0f,0xa4,0xc2,0x09,0xe0,0x8c,0x40,0x2a,0xa1,0xf8,0x09,0x95,0xc8,0x2a,0x41,0xf9,0x00,0x0c,0x40,0x04,0x35,0x14,0xa1,0x00,0x06,0xa7,0x55,0xaa,0x17,0x84,0x00,0x36,0x00,0x19,0x6b,0xbd,0x5a,0xa6,0x08,0xc0,0xc3,0xeb,0xf8,0x98,0x40,0x22,0xa1,0xe3,0xff,0xd5,0xea,0xb6,0x53,0xf9,0x03,0xc6,0xd1,0x00,0xc0,0x6b,0xb5,0x5f,0xb0,0x10,0xc2,0xe0,0x1b,0x00,0xf9,0xfb,0xbf,0x35,0x1f,0x28,0x7d,0x27,0xf5,0x5f,0xe1,0x00,0x4c,0x23,0xfe,0xd5,0xc3,0xb7,0x01,0xc1,0xd5,0x80,0x87,0xd7,0x80,0xd5,0x87,0x8b,0x01,0xff,0xfd,0x87,0x50,0x00,0x95,0x44,0x18,0xf8,0x29,0xfb,0x33,0xd0,0x87,0x07,0xf4,0x81,0x3b,0x50,0xfc,0xe1,0x1f,0x70,0xf4,0x5f,0xea,0xb5,0x03,0x01,0x69,0xc3,0xe6,0x00,0x49,0x52,0x01,0x3d,0xe1,0xf8,0x30,0x8c,0x16,0x82,0xdc,0x1e,0x68,0x71,0x40,0x05,0x1a,0x0f,0xa1,0x84,0x40,0x0f,0x4f,0x2f,0x0a,0xac,0x42,0x03,0xab,0x0e,0xa8,0x18,0x60,0xcc,0x15,0x6e,0xa3,0x85,0x6a,0xb4,0x16,0x09,0x97,0xd7,0x57,0xfa,0x0f,0x28,}; | ||||||
| 
 | const uint8_t _A_Levelup2_128x64_5[] = {0x01,0x00,0x9c,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0xff,0xfb,0xcf,0xff,0xf0,0x3f,0xc0,0x18,0x7e,0x1e,0x30,0x83,0xdf,0xef,0xd0,0x0e,0x27,0xf6,0xf7,0xfc,0xe7,0x83,0x9b,0x7f,0xff,0x8f,0xff,0xa4,0x63,0x1c,0xe3,0xea,0xf3,0xd1,0xc0,0x20,0xe7,0xc6,0x84,0x2f,0x5b,0x97,0xfe,0xef,0xca,0xf8,0xf1,0xe0,0x20,0xd6,0xff,0x4c,0x7d,0x9a,0xad,0xd5,0x87,0xe1,0x4f,0xc0,0x7f,0xff,0xc3,0xe4,0xbe,0x40,0x2e,0xd5,0x5b,0xae,0x0f,0xe7,0x0f,0xf0,0x7f,0xfc,0x22,0x04,0x9b,0xc0,0x35,0x7a,0xad,0x56,0x1b,0xff,0x00,0xf8,0x7f,0x78,0xe0,0xf4,0x9f,0xe0,0xaa,0xa0,0x01,0xd6,0xcf,0xe0,0x04,0xe1,0x38,0x98,0xf8,0x67,0xfc,0x70,0xf0,0xea,0xa3,0x50,0xf0,0x79,0x13,0x93,0xa1,0xff,0xa3,0xd5,0xc3,0xe3,0x17,0x80,0x40,0x3f,0x80,0xf5,0x0b,0x0e,0xbf,0x56,0x02,0x19,0x70,0x3c,0x67,0x07,0xf6,0xc7,0xd9,0xee,0xa5,0xf1,0x9a,0xc0,0x20,0x90,0x03,0x00,0xef,0xfd,0xe0,0xf2,0x87,0xec,0x37,0x5a,0xaf,0x55,0xa8,0x3e,0x23,0x12,0xfe,0xf7,0xdb,0xa3,0x9f,0x86,0x74,0x2b,0xb5,0x5e,0xa8,0x08,0x60,0x20,0xf1,0xf8,0x10,0x12,0x11,0xa8,0xd7,0x17,0xc7,0x56,0x0d,0x18,0xe0,0xc0,0x8f,0xa5,0xff,0x89,0xf6,0x0b,0xe5,0xdf,0xaa,0x40,0x6f,0xe0,0xf1,0xfd,0xb7,0x0e,0x07,0xe8,0xd5,0x7f,0xb5,0x7b,0xa8,0x06,0x02,0x1f,0x8c,0xf1,0xb0,0x47,0xc7,0xef,0x07,0x8f,0xd7,0xaf,0x57,0xaf,0xdf,0xea,0xb8,0x58,0x7e,0xff,0xce,0x1d,0x12,0x10,0xfc,0xe0,0x7e,0xcf,0xd6,0xab,0xf5,0xba,0x27,0x0c,0x0d,0xbc,0x26,0xe2,0xbf,0xcb,0xe0,0x15,0x5b,0xed,0x5f,0xef,0x55,0xa0,0x84,0x04,0x1e,0x30,0xf7,0x89,0x41,0x8e,0xc2,0x7f,0x2f,0xd1,0xb8,0xaf,0xf7,0xfb,0xf2,0xcc,0x7e,0x70,0xe8,0x07,0x52,0xab,0x57,0xab,0xd7,0x68,0xb0,0x58,0x00,0x6c,0x6f,0x8b,0x21,0xb1,0xa5,0x88,0x3e,0xc6,0xe4,0x17,0x0d,0x53,0xaa,0x1f,0x51,0x00,0x8f,0x4b,0xff,0x0c,0x0f,0x96,0xfc,0x3e,0x3f,0xf0,0xf9,0x40,0x3f,0xa0,0xf2,0xc4,0xc0,0xe8,0x1f,0x5e,0xef,0xff,0xbf,0x7d,0xa2,0xb0,0x0b,0xf1,0x7f,0x10,0x8f,0x82,0x0f,0x00,0xd7,0x7f,0xf5,0x7f,0xed,0x7c,0x0c,0x3c,0x38,0x0f,0xfc,0xe7,0xfd,0x8d,0xff,0xc7,0xcf,0xe2,0xff,0x2a,0xa8,0x7c,0x68,0x38,0x0e,0xf9,0x88,0x70,0xe3,0x11,0x80,0xeb,0xf7,0xfa,0xbf,0x76,0xbc,0x4c,0x20,0x01,0x83,0x08,0x45,0xc0,0x50,0x76,0xe8,0x80,0x11,0x42,0x58,0x06,0x88,0xff,0xe7,0xd0,0x5d,0x5b,0xf8,0x40,0x02,0x77,0x10,0x01,0x70,0x3e,0x2b,0xf1,0xbc,0x4e,0x2b,0xb7,0x5a,0xbd,0xdd,0x06,0x31,0x5a,0x00,0x7c,0x7c,0x1f,0xcf,0xbf,0xff,0xd3,0x78,0xdd,0x87,0x8b,0xd4,0x1f,0x48,0x04,0xc1,0xc0,0x57,0x81,0xd0,0xa7,0xc6,0xab,0x05,0xa0,0x18,0x44,0x20,0x58,0xcc,0x1c,0x7f,0xe1,0xab,0xf5,0x6b,0x84,0x42,0x1f,0x51,0x09,0x43,0xa8,0x17,0x51,0xe0,0x90,0x86,0x0b,0x50,0xb2,0x90,0x86,0x01,0xf0,0x81,0xda,0x0c,0x82,0x5f,0x1f,0xfe,0xbf,0x54,0xf6,0x1d,0x80,0x74,0x96,0x23,0xd8,0x80,0x85,0xc7,0xab,0x57,0xaf,0xd5,0x66,0xb5,0x4e,0xe5,0x51,0xc2,0x7a,0x88,0x76,0xe0,0x78,0x3a,0xbd,0x77,0xab,0xdc,0x26,0x16,0x09,0xdf,0xab,0x7f,0x52,0xd8,0x97,0xce,0xab,0x7f,0xea,0xd1,0x20,0x14,0x0f,0x84,0xff,0x6e,0x7b,0x11,0xf8,0xfe,0x80,0x83,0xae,0xd5,0x5a,0x87,0xe5,0xe0,0x9f,0xd5,0xdb,0x43,0x5d,0x5e,0x11,0x88,0x40,0xe2,0x3e,0x18,0x07,0x9e,0xff,0xad,0x5e,0x18,0x00,0x83,0xe3,0x2a,0x07,0x0f,0xf3,0x9f,0xff,0xb7,0x85,0xc4,0xb8,0x21,0xf2,0x13,0x8c,0xd6,0xaa,0x4e,0x1e,0x3e,0x73,0x9d,0xba,0x10,0x37,0xaa,0x34,0x5e,0x1e,0xff,0xff,0xf3,0xb0,0x1e,0x88,0x7d,0x7a,0xb4,0xda,0x84,0x01,0x9a,0x3e,0x38,0x02,0x68,0x40,0x0d,0x07,0x1f,0x8d,0xff,0xec,0x0f,0x1a,0xb0,0x7d,0xaa,0xb0,0x33,0x00,0xc7,0x04,0x02,0xb2,0x10,0xf3,0x7e,0x9b,0xa7,0x3b,0xff,0x00,}; | ||||||
| const uint8_t _I_card_ok2_0[] = {0x01,0x00,0x1e,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x00,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x0e,0xff,0x8c,0x1f,0xd8,0x70,0x7f,0x63,0xc1,0xfb,0xbf,0xcf,0x9f,0xc8,0x14,0xae,0xa2,0x80,0xd0,0x11,0xe8,0x00,0x49,0x80,0x0c,0xa0,0x4b,0xf5,0x00,0x24,0x61,0xaa,0x7d,0x06,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x06,0x04,0x0f,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x01,0x07,0xc4,0x2a,0x1c,0x0f,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x02,0x8e,0x03,0xe0,0x02,0x14,0xfc,0x1e,0xa0,0xa3,0x04,0xa8,0x03,0xc0,0x1e,0x00,0xf0,0x05,0x00,}; | const uint8_t _A_Levelup2_128x64_6[] = {0x01,0x00,0x54,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x5f,0x78,0x37,0x20,0x3f,0xc0,0x7e,0x4f,0xff,0xde,0x3e,0x38,0xae,0xf9,0xf0,0x1c,0xe0,0x7e,0xf8,0xf3,0x3f,0xfd,0x9f,0xdc,0x1f,0xbe,0x6c,0x03,0x31,0xfd,0x1f,0xdc,0xca,0x01,0x60,0xfd,0x03,0xaa,0xff,0x09,0x80,0x60,0x3e,0x80,0xfa,0xdf,0xc1,0x20,0x10,0x0f,0x48,0x3e,0xab,0xf0,0x20,0x78,0xf4,0x81,0xd3,0xf7,0x07,0xfc,0xbf,0x03,0xff,0x87,0xe9,0x36,0xe0,0xf8,0xf1,0xcb,0xec,0x30,0x09,0x86,0x93,0x7f,0xf7,0x0f,0xc6,0x5e,0x21,0x00,0xa0,0x52,0x23,0xe0,0xe7,0xfe,0x83,0xc6,0x10,0x6f,0x1a,0x46,0xfc,0x5f,0x1f,0xcc,0x59,0xbc,0xb1,0x3b,0xe4,0x6c,0x03,0xc6,0x0e,0x0f,0x1c,0x7e,0xfb,0x07,0xdf,0x59,0xad,0xfe,0xf9,0x4b,0x84,0x7f,0xb0,0x79,0x0f,0x76,0x1c,0x7e,0xff,0x8d,0x2e,0x5e,0x07,0x4e,0x97,0xfd,0x7f,0xc0,0xf6,0xfd,0xfe,0xec,0xb5,0x88,0x17,0x4a,0x60,0x2c,0x4f,0x79,0xbd,0x2a,0xb3,0x88,0x17,0x8a,0xa0,0x0f,0x2f,0x88,0x85,0xaa,0xb3,0x08,0x15,0x8a,0xa1,0xbd,0x03,0x8f,0xc0,0x7a,0x65,0x02,0xea,0xc4,0x20,0x54,0x2a,0xc0,0x20,0x6f,0x9f,0x0f,0x98,0x30,0x7f,0xd8,0x7f,0x1f,0xf8,0x1e,0xb7,0x78,0xf7,0xe3,0xf6,0x20,0x2c,0x3f,0x0f,0xdf,0xd5,0x88,0x83,0xc6,0xb8,0x1f,0x18,0x7f,0xf0,0xc4,0x90,0x7c,0x1d,0x56,0x3f,0x02,0xe1,0x55,0xc7,0xe3,0x07,0x07,0x13,0x50,0xa7,0xf0,0x2d,0x2e,0x63,0xff,0xcf,0x94,0x07,0xc7,0xc7,0xff,0x8f,0x84,0x4a,0xfb,0x7e,0xb1,0x49,0xab,0xf0,0x1e,0xa4,0x9f,0x97,0x3d,0xf0,0x16,0x44,0x04,0x21,0xe1,0xfe,0x5d,0xa8,0xb3,0x08,0x0d,0x92,0x21,0xf5,0x8f,0xfe,0x2f,0x7f,0xcf,0x08,0x3c,0xa0,0x17,0x8c,0x2c,0x7e,0x03,0xc4,0x87,0xfd,0x61,0xff,0xeb,0xef,0xf0,0x64,0x3f,0xf8,0xec,0x02,0xe1,0x05,0x88,0x40,0x68,0x90,0x0f,0xaa,0xac,0xbf,0x9f,0xfd,0xff,0x7e,0x30,0x0f,0x18,0x4c,0x82,0x05,0x22,0xc0,0x7d,0x01,0x83,0xfd,0xf6,0x7f,0xaf,0x7f,0xe9,0xc4,0x1a,0x84,0x0f,0x48,0x27,0xe3,0x85,0x6f,0x09,0x0f,0xff,0xf3,0x10,0x87,0xc1,0x22,0x20,0xf2,0xa0,0x03,0xc6,0x86,0x6e,0x1f,0xbf,0xf7,0xe7,0x00,0x83,0xc6,0x22,0x34,0x08,0x14,0x48,0x1e,0x37,0xef,0x3c,0x0f,0xfc,0x43,0x1f,0x9f,0x02,0x07,0xf0,0x90,0x83,0x04,0x44,0x30,0x49,0xe4,0x06,0x01,0x1c,0xfe,0x04,0x07,0x67,0x03,0xb8,0x48,0x78,0x10,0x48,0xc8,0x3c,0x60,0x16,0x08,0x00,0x08,0x5e,0x43,0x4b,0x87,0x64,0x24,0x38,0x0f,0xec,0x36,0x41,0x0c,0x80,0x64,0x01,0xe3,0x00,0xf0,0x7b,0xf1,0x70,0x1b,0x04,0x47,0x01,0x07,0x87,0xd0,0x26,0x90,0x0c,0x64,0xc2,0x01,0xf0,0x58,0x0c,0x2e,0x1c,0x4f,0x18,0x04,0x06,0x09,0x40,0xe2,0x60,0x30,0x7b,0x88,0x07,0xfb,0xe2,0x0f,0x1f,0x84,0x1c,0x1e,0x30,0x68,0x19,0x48,0x6f,0xf8,0x0c,0x04,0x3f,0xdd,0xff,0xf6,0x45,0xe4,0x10,0x08,0x4c,0x03,0xf1,0x00,0x47,0x8c,0x82,0x81,0xc0,0x85,0xa4,0x07,0x82,0x0f,0x40,0x00,0x83,0xd2,0x23,0xd8,0xfc,0x61,0xe5,0xe0,0xf1,0x85,0x03,0xd4,0x10,0x26,0xe1,0xbc,0x47,0xe4,0xe0,0xf6,0x81,0x03,0xcb,0xe1,0x71,0xfc,0x4f,0xe8,0x71,0x00,0x7b,0x50,0x01,0x03,0xe0,0x81,0x83,0xc7,0x0f,0x08,0x07,0xb6,0x03,0x90,0x05,0x18,0x77,0x3e,0x5f,0x03,0x83,0x83,0xda,0x01,0xf7,0xe1,0xc3,0xff,0x11,0xbb,0xe4,0x16,0x0c,0x0f,0x7f,0xdf,0x9e,0x3f,0x70,0xbd,0xff,0x0f,0x64,0x0f,0x5f,0xc5,0xc2,0x79,0x3c,0x57,0x0f,0xfc,}; | ||||||
| const uint8_t *_I_card_ok2[] = {_I_card_ok2_0}; | const uint8_t _A_Levelup2_128x64_7[] = {0x01,0x00,0xf7,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x05,0xfd,0x83,0xfb,0xbe,0x20,0xf0,0xff,0x83,0x72,0x01,0xfe,0x07,0xdf,0xf6,0x3f,0xff,0xf8,0x83,0xf3,0xcf,0xf8,0xe7,0xc0,0xff,0xc0,0xf9,0xfc,0x46,0x60,0xd3,0x00,0xfe,0x41,0xa0,0x3c,0x0e,0xf0,0x3e,0xaf,0xb8,0x18,0x06,0x03,0xba,0x0f,0xad,0xfd,0x06,0x01,0x00,0xed,0x9e,0xee,0x80,0x0f,0x1f,0xa8,0x3e,0xb5,0xf2,0x00,0x78,0xfa,0x81,0xfb,0xf8,0xf5,0xb6,0xab,0x2e,0x0f,0x18,0x3f,0x5b,0x7e,0x10,0x9c,0xbf,0xfb,0x01,0x00,0xec,0x07,0xeb,0x17,0x01,0xa0,0xc0,0x76,0x01,0xf9,0x07,0x8d,0xf2,0x45,0x02,0x07,0xdd,0x2f,0x05,0x14,0x82,0x68,0x01,0xf3,0xe0,0xa2,0xe0,0xe1,0xb0,0x4b,0x03,0x8c,0x43,0xf1,0x25,0xa1,0xc2,0x61,0x16,0x08,0x5f,0xe8,0x1f,0x1a,0x59,0xe4,0x2b,0x11,0x6f,0x0f,0xcf,0xff,0x4b,0x24,0x85,0x5a,0x2e,0x04,0xfa,0xd1,0x03,0xc6,0x31,0xa0,0xdf,0x07,0xe7,0x44,0x2f,0x18,0x67,0x03,0x7d,0xfe,0x07,0xc5,0x0a,0x87,0x0a,0x89,0x60,0x01,0xc3,0xfd,0x06,0xac,0xff,0xff,0x46,0xc1,0xf3,0x64,0xf9,0xc1,0x7c,0x5f,0xfd,0xd8,0x6f,0x14,0xfe,0x51,0xa3,0xef,0x0f,0xe7,0x15,0x1c,0x80,0x7a,0x38,0x03,0xe9,0xff,0xc2,0xa1,0x70,0x09,0x47,0x03,0xfb,0xf7,0x07,0xc4,0x4a,0x09,0x00,0x8c,0x50,0x09,0xa3,0xef,0x1f,0x28,0x1c,0x41,0xe5,0x08,0x07,0x97,0x8c,0x3f,0x30,0x18,0x34,0x80,0x1e,0x3f,0xbf,0x38,0x3d,0xe0,0x18,0x68,0x08,0x3c,0x84,0x0b,0xf8,0x18,0x89,0x38,0x6f,0x10,0x08,0x80,0x3c,0xbe,0x20,0xf3,0xf8,0x4f,0xf7,0xf0,0x68,0x00,0x00,0x61,0x00,0xf1,0xbf,0xa8,0x13,0xc1,0x3f,0xce,0x40,0x81,0xe5,0x04,0x06,0x21,0x04,0x81,0xe3,0xbc,0x2f,0x08,0x00,0x60,0x5f,0x99,0xfa,0x44,0xbc,0x00,0x21,0xe0,0xff,0x37,0xf1,0x80,0x79,0x40,0x76,0xf1,0xf0,0x78,0xef,0xca,0x25,0x07,0xf8,0x6f,0xec,0x00,0xf2,0x80,0x7a,0x78,0xff,0xff,0xbc,0x3c,0x44,0x51,0xfe,0x46,0xff,0x81,0x01,0x07,0x98,0xf8,0xae,0x3c,0x05,0x01,0xef,0xe8,0x05,0x03,0x07,0x8f,0x3c,0x16,0x38,0x12,0xa1,0xef,0x81,0xed,0xb7,0x1e,0x11,0x88,0xc3,0xeb,0xed,0xff,0xd2,0xc1,0x83,0x0f,0xff,0xfc,0xf3,0x7f,0xfa,0x7c,0x84,0x7e,0x60,0xf1,0xa2,0x03,0xc7,0x1e,0xa3,0x1b,0x2f,0xfa,0x66,0x0f,0x4c,0xac,0x7e,0x87,0xd0,0x1e,0x9e,0x16,0x03,0x0c,0xd0,0x9b,0xce,0xc7,0xe0,0xa0,0x78,0x3c,0x3f,0xb0,0x78,0xc1,0x7f,0xd0,0x3c,0x88,0x3c,0xf0,0x71,0xf9,0x04,0x00,0xdc,0x70,0x58,0x44,0x02,0xa2,0x0f,0x38,0x1c,0x22,0x41,0xf0,0x81,0xff,0x92,0x03,0x0b,0x07,0x8d,0x28,0x1e,0x70,0x18,0x44,0x43,0xe0,0xb2,0x1c,0xff,0xfe,0x10,0x0f,0x19,0x50,0x3d,0x22,0x11,0x08,0xc5,0xfb,0x3c,0x70,0x18,0xbb,0x74,0x64,0xc0,0xf5,0xb4,0x4c,0x3f,0x18,0xf4,0x80,0x83,0xca,0x2c,0x0f,0x49,0x07,0xd3,0xc1,0x01,0xc0,0x13,0xc6,0x5e,0x9c,0x10,0x7a,0xd0,0x3f,0x5e,0x18,0x39,0x80,0x80,}; | ||||||
| 
 | const uint8_t _A_Levelup2_128x64_8[] = {0x01,0x00,0x02,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x00,0xbf,0xb0,0x7f,0x88,0x3c,0x3f,0xe1,0x0f,0x00,0x5c,0x3f,0xc0,0x1f,0xdf,0x8c,0x7c,0x1f,0x97,0xf8,0x77,0xf3,0xf8,0x21,0x10,0x04,0xe7,0xe0,0x30,0x2f,0x98,0x7e,0xed,0xf0,0x18,0x0f,0xb0,0x1e,0x7c,0xf8,0x4c,0xcb,0xe6,0x0f,0x38,0xb8,0x3c,0x7a,0x00,0x73,0xc7,0xf2,0x66,0x60,0xf4,0x85,0xe0,0x60,0x1a,0x00,0xf9,0x83,0xde,0x0b,0x82,0x80,0x50,0x00,0xe7,0x4f,0x84,0xc9,0xbf,0x20,0x62,0xff,0x40,0xa8,0x50,0x0f,0xc7,0xfb,0xde,0x0f,0x2e,0x4c,0x9c,0x1e,0xf0,0x6f,0xe8,0x3c,0xb9,0xfc,0x88,0x3f,0xe0,0xfc,0x70,0x1f,0xf4,0x02,0x03,0xfd,0xe3,0x83,0xcf,0x9f,0xfc,0x07,0x95,0xf8,0xbc,0x25,0x01,0xfd,0x07,0xce,0x13,0xce,0x07,0x95,0xff,0xf9,0x80,0xbe,0x0c,0x04,0x1e,0x60,0x06,0xdf,0x50,0x30,0x52,0x48,0x04,0x11,0x3d,0x3b,0xe9,0x06,0x0e,0x53,0x00,0x60,0x88,0x3e,0x2b,0xfa,0x0a,0x14,0x68,0xc0,0x29,0x01,0xe7,0xe0,0xf3,0x92,0x0a,0x7f,0xc8,0x1e,0x35,0xed,0x04,0xf0,0x1e,0x30,0x1f,0xa0,0x3c,0x7e,0x79,0xc9,0xe0,0x3c,0xc3,0xe3,0x24,0x85,0x70,0x20,0x1e,0x80,0x79,0x72,0x41,0xf1,0x30,0x80,0x83,0xcb,0x07,0xc9,0x17,0xa7,0x7c,0x5e,0x30,0xaf,0xc6,0x0b,0xd6,0x1f,0x4b,0x7b,0x5c,0x81,0xe3,0xc2,0x85,0x43,0xac,0xbe,0xc0,0x79,0x78,0xc1,0xeb,0x20,0x81,0xe2,0xe0,0x31,0xa1,0xf9,0x83,0xc4,0xde,0x94,0x1f,0x15,0xed,0x1e,0x20,0xf1,0x87,0xe0,0xbe,0xf2,0x0a,0x41,0x3c,0xf0,0x31,0xc8,0x64,0x02,0x04,0x6f,0x14,0x7c,0x40,0xa0,0xb0,0x83,0xf9,0x83,0xe2,0x09,0x02,0x80,0x1f,0xc7,0xf4,0x0f,0x98,0x40,0x3c,0x66,0x00,0xfb,0x88,0x60,0x20,0x04,0x01,0xfe,0x83,0xe6,0x41,0x00,0xc1,0xc0,0xf0,0x1f,0xe0,0x7d,0xdf,0x20,0x14,0x00,0x41,0x43,0xe0,0x10,0x0c,0x00,0x18,0xad,0xe0,0xf1,0x00,0x0e,0x80,0x10,0x5f,0x30,0x10,0xdf,0xc0,0xc5,0x97,0x8c,0x03,0xcb,0xa0,0x08,0x28,0x68,0x7c,0x86,0xc5,0x17,0x83,0x83,0xcb,0x30,0x0f,0x28,0x30,0x1c,0x8a,0xc5,0x17,0x37,0x08,0x00,0x6e,0x80,0xfa,0x82,0x01,0xcb,0x20,0x28,0x28,0x36,0x73,0x10,0x0f,0x45,0x68,0x83,0xdb,0x45,0x84,0x80,0x83,0xc7,0x7f,0x17,0x4e,0x09,0x7c,0x81,0xe9,0x82,0x81,0x87,0xcd,0x78,0x20,0xf7,0xc0,0xc1,0xc1,0xe7,0x40,0x80,0x83,0xcb,0xbd,0xbf,0x0f,0xc5,0x00,0xc0,0x41,0xf2,0xff,0x0f,0xd7,0xff,0x1b,0x07,0xb7,0xf0,0xbe,0xbd,0xf9,0x28,0x3c,0xfc,0x01,0x82,0x3f,0xa7,0xdf,0xe3,0x22,0x07,0x9f,0x03,0xf4,0x10,0x14,0x7a,0xde,0x24,0x20,0xf4,0xfa,0x07,0xc6,0x1c,0xbf,0x4c,0xfc,0x82,0x40,0x5f,0x2e,0x07,0x20,0x1e,0x23,0x22,0x6f,0x95,0x9c,0x1e,0xb3,0x0f,0xff,0xe3,0xf6,0x0c,0x13,0xa0,0xff,0xe3,0x20,0xf5,0x4a,0x0f,0xdd,0xce,0x5c,0x0f,0xfc,0x06,0x0d,0x40,0xc8,0x11,0xca,0x81,0x00,0xff,0xfa,0x1c,0x44,0x00,0x1f,0xf4,0x24,0x1e,0xd0,0x4f,0x47,0xf7,0xbe,0x0f,0x28,0x0c,0x22,0x81,0x50,0x07,0xa4,0x0b,0xd1,0xe3,0x0f,0x98,}; | ||||||
| const uint8_t _I_card_ok3_0[] = {0x01,0x00,0x22,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe5,0x7d,0x3f,0xd8,0x3c,0x7e,0x77,0xc0,0x7d,0xf0,0x3b,0xf6,0x30,0x7f,0x41,0xef,0xc0,0xfd,0x87,0x93,0xc8,0x1f,0x5b,0xfc,0xf9,0xfc,0x81,0x4a,0xea,0x28,0x0d,0x01,0x1e,0x80,0x04,0x98,0x00,0xca,0x04,0xbf,0x50,0x02,0x46,0x1a,0xa7,0xd0,0x6f,0xb8,0x3d,0xbe,0x0f,0xf7,0x07,0x93,0x40,0x60,0x40,0xf2,0x83,0xff,0x01,0xef,0x88,0x89,0x41,0x81,0xe4,0x00,0x10,0x7c,0x42,0xa1,0xc0,0xfd,0x83,0x47,0x83,0xfe,0x0f,0xd1,0xff,0x17,0xd4,0x1f,0x27,0xf5,0x07,0xf8,0x3e,0x27,0x0b,0xf3,0x07,0xd0,0x28,0xe0,0x3e,0x00,0x21,0x4f,0xc1,0xea,0x0a,0x30,0x4a,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x50,}; | const uint8_t _A_Levelup2_128x64_9[] = {0x01,0x00,0xfb,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x01,0x3d,0xe0,0xff,0x06,0xe4,0x07,0xe0,0x0f,0xab,0xff,0xfe,0x7f,0xfe,0xe7,0xe0,0xc3,0xd7,0xdf,0x80,0xce,0x03,0xf9,0x67,0x80,0x71,0xbd,0xc0,0xfb,0xad,0xc0,0x20,0x3e,0xd0,0x49,0xf3,0xe1,0x33,0x2f,0x98,0x3c,0xe8,0xb8,0x08,0x07,0xe8,0x1e,0x78,0xfe,0x4c,0xcc,0x1e,0x98,0x2a,0x04,0x03,0x88,0x71,0x30,0x7a,0xcb,0xef,0x58,0x10,0x78,0xee,0x01,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xe0,0x24,0x10,0x0a,0x30,0x3d,0x39,0x32,0x70,0x7a,0x40,0x24,0x30,0x0c,0x0f,0xfb,0x8e,0x4f,0x2e,0x44,0x1f,0xf0,0x0f,0x2a,0xfc,0x02,0x7f,0x80,0xc0,0x7f,0xa0,0x20,0xf3,0xe7,0xff,0x0a,0xc5,0x5f,0xe0,0x00,0x06,0x01,0xfd,0x0f,0x9c,0x27,0x9c,0x0f,0x2b,0xfc,0xbe,0x41,0x1e,0x90,0xc0,0x7f,0xaa,0x19,0x97,0xe4,0x2c,0x31,0x28,0x17,0x08,0x1f,0x5d,0x0e,0x04,0x3a,0x05,0x3a,0x07,0xcc,0x5e,0x91,0xa1,0x86,0x41,0x38,0xdf,0xe1,0xf0,0xe0,0xf3,0x92,0x0a,0x7f,0xc8,0x1e,0x52,0x88,0xf4,0x17,0x08,0x40,0x10,0x78,0xfc,0xf3,0x93,0xc0,0x7a,0xc4,0xa0,0xb4,0x86,0x09,0x03,0xc7,0x92,0x0f,0x8f,0xc0,0x3c,0xf0,0x7c,0x91,0x7c,0x43,0x38,0x3f,0xb0,0xfa,0x5b,0xc0,0xc3,0xff,0x9d,0x93,0xc6,0x09,0x7f,0xf9,0x03,0xcf,0xc6,0x0f,0x4a,0x5f,0x43,0xe1,0xc2,0xc0,0x7f,0x2f,0xa0,0xf4,0x37,0x9e,0x2f,0x21,0x0d,0x9f,0xc0,0x3f,0xf3,0xef,0xf4,0x3f,0x05,0xf7,0x90,0x52,0x07,0xe5,0x0b,0x90,0xc0,0xa0,0x90,0x0b,0xfd,0xfd,0x1f,0x10,0xbe,0x14,0x06,0x01,0x80,0xdf,0x83,0xa0,0x1e,0x30,0x40,0x78,0xf8,0x3b,0xe0,0xe8,0xfb,0xc2,0xe1,0x00,0xf1,0xfc,0x2f,0xa4,0x1e,0x54,0x08,0x07,0x3a,0x06,0xbf,0x10,0x03,0x78,0xc1,0xe3,0x80,0xe0,0xc0,0xff,0xeb,0xf1,0x0f,0xbc,0x34,0xba,0x3f,0xe8,0x0f,0xc1,0x10,0x50,0xf8,0x01,0x5c,0x41,0xe5,0x12,0x81,0x01,0xc4,0xf8,0x2b,0xf1,0xff,0xfc,0xc0,0x42,0x75,0x39,0x11,0x38,0x40,0x04,0x0f,0x28,0x68,0x7c,0x88,0xc5,0xc2,0x07,0x1c,0x00,0x5e,0x50,0x60,0x31,0x11,0x8a,0x05,0x03,0x03,0x97,0x03,0xf8,0x0f,0x98,0x60,0x1c,0xa6,0x03,0x82,0x83,0x67,0x31,0x00,0xf4,0x98,0x03,0xcb,0x9c,0x0f,0x3d,0x16,0x12,0x02,0x0f,0x3e,0x00,0xb8,0x87,0xc4,0x0f,0x2c,0x14,0x0c,0x1e,0x70,0x02,0x00,0xff,0x01,0xeb,0x81,0x83,0x83,0xd2,0x1c,0xbf,0x10,0xfe,0x44,0x9b,0xe3,0xf5,0x1f,0xd0,0x3c,0xa0,0x1f,0x42,0xfc,0xce,0xa0,0x10,0x90,0x78,0xfb,0x01,0xe6,0x7f,0x5a,0x30,0x3f,0x6f,0xf8,0x18,0x04,0x14,0x0e,0x3d,0x80,0x79,0x15,0x85,0x7e,0x77,0xf8,0x0e,0x05,0xe0,0x20,0xf4,0x15,0x93,0x7c,0xb7,0xf0,0x0c,0x13,0xc0,0xb5,0x00,0xf2,0x39,0x96,0xfc,0x1e,0x74,0x40,0x7b,0x41,0xd4,0xe4,0x05,0x1a,0xf8,0x3c,0x60,0x20,0x81,0xa4,0x03,0xc8,0x00,0xb2,0xf8,0x04,0xa0,0x1e,0x58,0x82,0x40,0x80,0x1a,0x2e,0x2b,0x13,0x39,0x42,0x09,0x84,0x00,0x40,}; | ||||||
| const uint8_t *_I_card_ok3[] = {_I_card_ok3_0}; | const uint8_t _A_Levelup2_128x64_10[] = {0x01,0x00,0x06,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x09,0xef,0x06,0xe4,0x07,0xe0,0x0f,0xc9,0xff,0xfb,0x9f,0xc7,0x07,0xdf,0x7e,0x03,0x38,0x0f,0xe5,0x9e,0x01,0xc6,0xf7,0x03,0xee,0xb7,0x00,0x80,0xff,0x4a,0x27,0xcf,0x84,0xcc,0xbe,0x60,0x51,0xbf,0xff,0xe8,0xb8,0x08,0x07,0xe8,0x2e,0x78,0xfe,0x4c,0xcc,0x1e,0x98,0x2a,0x04,0x03,0x88,0x1f,0x30,0x7a,0xcf,0xef,0xd8,0x10,0x78,0xee,0x01,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xe0,0x24,0x10,0x0a,0x37,0xfc,0xe2,0x54,0xfe,0x4c,0x9c,0x1e,0x90,0x09,0x0c,0x03,0x03,0xfe,0xd5,0x93,0xcb,0x91,0x07,0xfc,0x11,0x8a,0xbf,0x00,0x9f,0xe0,0x30,0x17,0xe8,0x89,0x88,0x41,0xe3,0xcf,0xfe,0x03,0xcf,0x80,0x00,0x18,0x07,0xf4,0x3e,0x70,0x9e,0x70,0x3c,0xe5,0xf2,0x08,0xf4,0x85,0x00,0x2b,0x19,0x97,0xe4,0x2c,0x31,0x28,0x17,0x09,0x63,0x1f,0xe9,0x7f,0x43,0x81,0x0e,0x81,0x4e,0x95,0xd3,0x17,0xa4,0x68,0x61,0x90,0x46,0x09,0x73,0xf0,0x79,0xc9,0x05,0x3f,0xe4,0x1f,0x18,0xbc,0xa2,0x3d,0x05,0xc2,0x30,0x4b,0x9f,0xf3,0xce,0x4f,0x01,0xeb,0x12,0x82,0xd2,0x18,0x24,0x0f,0x1e,0x48,0x3e,0x3f,0x00,0xf3,0xc1,0xf2,0x45,0xe5,0x5f,0xfa,0x0b,0xce,0x19,0xc1,0xfd,0x87,0xd2,0xde,0x06,0x1f,0xf4,0xec,0x9e,0x30,0x4b,0xff,0xc8,0x1e,0x7e,0x30,0x7a,0x52,0xfa,0x1f,0x0e,0x16,0x03,0xf8,0x4f,0x30,0x78,0x9b,0xcf,0x17,0x90,0x86,0xcf,0xe0,0x01,0x61,0xff,0xc3,0xf0,0x5f,0x79,0x05,0x20,0x9e,0x50,0xb9,0x0c,0x0a,0x09,0x00,0xbf,0xa3,0xe6,0x17,0xc2,0x80,0xc0,0x30,0x1b,0xf0,0x7d,0x41,0x01,0xe3,0xe0,0xef,0x83,0xea,0x10,0x0f,0x1f,0xc3,0x3a,0x01,0xe7,0x40,0x80,0x73,0xa0,0x64,0xf1,0x00,0x37,0xdc,0x1e,0x38,0x0e,0x0c,0x0f,0xfe,0x6f,0x10,0x03,0xc3,0x4b,0xa3,0xfe,0x80,0xfc,0x11,0x02,0x70,0x18,0x01,0x5c,0x41,0xe5,0x12,0x81,0x01,0xc7,0xfd,0x0f,0x5f,0x8f,0xff,0xe6,0x02,0x13,0xb1,0xc8,0x89,0xc2,0x00,0x20,0x79,0x43,0x43,0xe4,0x46,0x2e,0x10,0x38,0xe0,0x02,0xf2,0x83,0x01,0x88,0x8c,0x50,0x28,0x18,0x1c,0xb8,0x1f,0xc0,0x7c,0xc3,0x00,0xe5,0x30,0x1c,0x94,0x1b,0x39,0x88,0x07,0xa4,0xc0,0x1e,0x5c,0xe0,0x79,0xe8,0xb0,0x90,0x10,0x79,0xf0,0x05,0xc5,0xfb,0x9f,0x92,0x44,0x1e,0x38,0x28,0x18,0x3c,0xe0,0x04,0x01,0xfe,0x7e,0xc3,0xe9,0x81,0x83,0x83,0xd2,0x1c,0xbf,0x10,0x7a,0x87,0xda,0x24,0xdf,0x1f,0xaa,0x20,0x87,0xee,0x0f,0x28,0x07,0xd0,0x1e,0x65,0xf5,0x9d,0x40,0x21,0x20,0xf1,0xf6,0x03,0xcc,0xfe,0xb4,0x60,0x7e,0xdf,0xf0,0x30,0x08,0x28,0x1c,0x7b,0x00,0xf2,0x2b,0x0a,0xfc,0xef,0xf0,0x1c,0x0b,0xc0,0x41,0xe8,0x2b,0x23,0x29,0x6f,0xe0,0x18,0x27,0x81,0x6a,0x01,0xe4,0xd2,0x2d,0xf8,0x3c,0xe8,0x80,0xf6,0x83,0xa9,0xc8,0x0a,0x35,0xf0,0x78,0xc0,0x41,0x03,0x48,0x07,0x90,0x01,0x65,0xf0,0x09,0x40,0x3c,0xb1,0x04,0x81,0x00,0x34,0x5c,0x56,0x26,0x72,0x84,0x13,0x08,0x00,0x80,}; | ||||||
| 
 | const uint8_t *_A_Levelup2_128x64[] = {_A_Levelup2_128x64_0,_A_Levelup2_128x64_1,_A_Levelup2_128x64_2,_A_Levelup2_128x64_3,_A_Levelup2_128x64_4,_A_Levelup2_128x64_5,_A_Levelup2_128x64_6,_A_Levelup2_128x64_7,_A_Levelup2_128x64_8,_A_Levelup2_128x64_9,_A_Levelup2_128x64_10}; | ||||||
| const uint8_t _I_card_ok4_0[] = {0x01,0x00,0x26,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0x8d,0xcc,0x1e,0x33,0x0e,0x74,0x63,0x0f,0x49,0x2f,0x8e,0x32,0x17,0x07,0x07,0x95,0xc4,0xff,0x60,0xf1,0xf9,0xde,0x01,0xf7,0xc0,0xef,0xd8,0xef,0x80,0xfd,0x83,0xdf,0x81,0xfb,0x0f,0x2f,0x90,0x3e,0xb7,0xf9,0xf3,0xf9,0x02,0x95,0xd4,0x50,0x1a,0x02,0x3d,0x00,0x09,0x30,0x01,0x94,0x09,0x7e,0xa0,0x04,0x8c,0x35,0x4f,0xa0,0xdf,0x70,0x7b,0x7c,0x1f,0xee,0x0f,0x26,0x80,0xc0,0x81,0xe5,0x07,0xfe,0x03,0xdf,0x11,0x12,0x83,0x03,0xc8,0x00,0x20,0xf8,0x85,0x43,0x81,0xfb,0x06,0x8f,0x07,0xfc,0x1f,0xa3,0xfe,0x2f,0xa8,0x3e,0x4f,0xea,0x0f,0xf0,0x7c,0x4e,0x17,0xe6,0x0f,0xa0,0x51,0xc0,0x7c,0x00,0x42,0x9f,0x83,0xd4,0x14,0x60,0x95,0x00,0x78,0x03,0xc0,0x1e,0x00,0xa0,}; |  | ||||||
| const uint8_t *_I_card_ok4[] = {_I_card_ok4_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_databases1_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xf9,0x07,0x07,0xbd,0xc2,0x3c,0xaf,0x2a,0x07,0xff,0xf3,0xfc,0x07,0xb6,0x22,0x44,0x0f,0x2d,0x07,0xff,0x1d,0xfb,0x07,0xa6,0x02,0x73,0x08,0x91,0x63,0x27,0x70,0x7e,0x85,0xff,0xf7,0xf7,0x07,0xa5,0x02,0x95,0x70,0x91,0x54,0xb1,0x50,0x4f,0x86,0xff,0xfb,0xef,0x07,0xb6,0x02,0x45,0x42,0x07,0x9f,0xfc,0x1e,0xe3,0xf1,0x0f,0x9f,0x7e,0x3f,0xdf,0x1f,0xad,0x24,0xbe,0x38,0xc8,0x5c,0x1c,0x1e,0x3e,0xfe,0xf1,0xfe,0xc1,0xe3,0xff,0x07,0xe7,0x00,0x5a,0x22,0xf5,0x07,0xc6,0xfc,0x1f,0xa5,0xf7,0x07,0xc6,0xfc,0x1e,0xff,0xe6,0xd1,0x40,0x68,0x17,0xff,0xff,0x9c,0x1e,0xb8,0x08,0x08,0x10,0xa0,0x4b,0xf1,0xff,0x70,0xc1,0xeb,0xc0,0x02,0x1c,0x13,0xa0,0xdf,0x1c,0x00,0x3e,0xfe,0x0f,0xf1,0x83,0x83,0xda,0x11,0x02,0x80,0x42,0x01,0xe5,0xff,0x87,0xdf,0x81,0xeb,0x18,0x81,0xc0,0x23,0x00,0xf3,0x8f,0xdf,0x01,0xeb,0xa8,0x99,0x59,0xe7,0x00,0xf3,0x9f,0xde,0x01,0xeb,0x48,0xa5,0x64,0x6f,0x00,0xf3,0xbf,0x83,0xda,0x11,0x4a,0xf8,0x87,0xd3,0xfe,0x0f,0x88,0x88,0xfd,0x04,0x02,0x0f,0x69,0x95,0x84,0xbe,0x80,0xf7,0x3f,0xb0,0x3f,0xc1,0xf0,0xbf,0x40,0x7c,0xe0,0x01,0x24,0xdf,0x1f,0x00,0x10,0xa7,0xee,0xf5,0x07,0x98,0x25,0x40,0x1e,0x00,0xf0,0x07,0x80,0x28,}; |  | ||||||
| const uint8_t *_I_no_databases1[] = {_I_no_databases1_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_databases2_0[] = {0x01,0x00,0x45,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xf9,0x1f,0xfe,0x03,0xda,0xe1,0x1e,0x57,0x95,0x03,0xff,0xe7,0xf9,0x83,0xdb,0x11,0x22,0x07,0x96,0x83,0xff,0x3b,0xf7,0x03,0xd3,0x01,0x39,0x84,0x48,0xb1,0x93,0xb8,0x3f,0x43,0xff,0xed,0xef,0x83,0xd2,0x81,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc3,0xff,0xf6,0xdf,0x83,0xdb,0x01,0x22,0xa1,0x03,0xcf,0xfc,0x0f,0x71,0xf8,0x87,0xce,0xff,0x1f,0xbf,0x8f,0xd6,0x92,0x5f,0x1c,0x64,0x2e,0x0e,0x0f,0x1f,0x7d,0xf8,0xff,0x60,0xf1,0xff,0x83,0xf3,0x80,0x2d,0x11,0x7a,0x83,0xe0,0x9c,0x20,0xfc,0x2f,0xb8,0x3e,0x37,0xc0,0xf7,0xff,0x36,0x8a,0x02,0xbf,0x1f,0xee,0x7c,0x1e,0xb8,0x08,0x08,0x10,0xa0,0x4b,0xf1,0xfd,0xc3,0xc1,0xeb,0xc0,0x02,0x1c,0x11,0x7e,0x3e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf5,0x84,0x40,0xa0,0x10,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7a,0xc6,0x20,0x70,0x08,0xc0,0x3c,0xef,0xf7,0x00,0x7a,0xea,0x26,0x56,0x79,0xc0,0x3c,0xff,0xf6,0x00,0x7a,0xd2,0x29,0x59,0x1b,0xc0,0x3d,0x2c,0x23,0xf6,0xa5,0x7c,0x43,0xeb,0x63,0x07,0xbc,0x44,0x7e,0x84,0x01,0x07,0xb4,0xca,0xc2,0x5f,0x40,0x7b,0x9f,0xd8,0x1f,0xe0,0xf8,0x5f,0xa0,0x3e,0x70,0x00,0x92,0x6f,0x8f,0x80,0x08,0x53,0xf7,0x7a,0x83,0xcc,0x12,0xa0,0x0f,0x00,0x78,0x03,0xc0,0x14,}; |  | ||||||
| const uint8_t *_I_no_databases2[] = {_I_no_databases2_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_databases3_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xfe,0x0a,0x5b,0x84,0x79,0x5e,0x54,0x00,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe3,0xff,0xc0,0x7a,0x60,0x27,0x30,0x89,0x16,0x32,0x77,0x07,0xe8,0x7f,0xfc,0xff,0x30,0x7a,0x50,0x29,0x57,0x09,0x15,0x4b,0x15,0x04,0xf8,0x7f,0xe7,0x7e,0xe0,0x7b,0x60,0x24,0x54,0x20,0x79,0xfb,0x7b,0xe0,0xf6,0x1f,0x88,0x7d,0x22,0xdb,0xf1,0xfa,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe3,0xee,0xdf,0x1f,0xef,0xe1,0x7f,0xff,0xdf,0x81,0xf7,0xc0,0xbf,0x80,0x08,0x1f,0x83,0xe1,0x07,0xea,0x78,0x43,0xfe,0x0f,0x6f,0xf2,0xe8,0xa0,0x2b,0xf1,0xff,0x1b,0xd4,0xe0,0x30,0x10,0x21,0x40,0x97,0xe2,0x0f,0x7e,0x00,0x10,0xe0,0x8b,0xf1,0xfe,0xe7,0xc1,0xf6,0x8f,0x1f,0xdc,0x3c,0x1e,0xd0,0x88,0x14,0x02,0x10,0x0f,0x2f,0x3c,0x0e,0xfc,0x0f,0x58,0xc4,0x0e,0x01,0x18,0x07,0x94,0x7e,0x39,0x7c,0x07,0xae,0xa2,0x65,0x67,0x9c,0x03,0xcb,0xff,0x3f,0xbc,0x03,0xd6,0x91,0x4a,0xc8,0xde,0x01,0xe7,0x7f,0xb8,0x0f,0xda,0x95,0xf1,0x0f,0xa7,0xfe,0xc0,0x0f,0x78,0x88,0xfc,0xc0,0x03,0x61,0x07,0xb4,0xca,0xc2,0x5f,0x30,0x00,0xd8,0xcf,0xf8,0x40,0x20,0x7f,0x83,0xd5,0x7e,0x80,0xf9,0xc0,0x02,0x49,0xbe,0x3e,0x00,0x21,0x4f,0xdd,0xea,0x0f,0x30,0x4a,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x50,}; |  | ||||||
| const uint8_t *_I_no_databases3[] = {_I_no_databases3_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_databases4_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xfe,0x0a,0x5b,0x84,0x79,0x5e,0x54,0x00,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe0,0xe0,0xf5,0xc0,0x4e,0x61,0x12,0x2c,0x64,0xee,0x0f,0xd0,0xff,0xfe,0x7f,0x80,0xf4,0xa0,0x52,0xae,0x12,0x2a,0x96,0x2a,0x09,0xf0,0xff,0xe3,0xbf,0x60,0xf6,0xc0,0x48,0xa8,0x40,0xf2,0xbf,0xfe,0xfe,0xe0,0xf6,0x1f,0x88,0x7c,0xf7,0xf1,0xdf,0x78,0xfd,0x69,0x25,0xf1,0xc6,0x42,0xe0,0xe0,0xf1,0xf7,0xfb,0x8f,0xf7,0xf0,0xef,0xff,0xfb,0xc0,0xfb,0xe0,0x77,0xef,0xe0,0x11,0x07,0xe6,0xfc,0x1f,0xdf,0xf0,0xff,0x83,0xdf,0xfc,0xba,0x28,0x0d,0x03,0x7f,0xff,0x37,0xa9,0xc0,0x60,0x20,0x42,0x81,0x68,0x01,0xf1,0xc0,0x02,0x1c,0x13,0xa1,0x7f,0xff,0xf9,0xc1,0xf6,0xbf,0x1f,0xf7,0x0c,0x1e,0xd0,0x88,0x14,0x02,0x10,0x0f,0x2f,0xce,0x00,0x1e,0xd1,0x88,0x1c,0x02,0x30,0x0f,0x28,0x3c,0x1c,0x1e,0xda,0x89,0x95,0x9e,0x70,0x0f,0x2f,0xfc,0x3e,0xfc,0x0f,0x5a,0x45,0x2b,0x23,0x78,0x07,0x9c,0x7e,0xf8,0x3f,0x6a,0x57,0xc4,0x3e,0x93,0xfb,0xc0,0x3d,0xe2,0x23,0xf3,0xff,0xdf,0xc1,0xef,0x32,0xb0,0x97,0xcc,0x00,0x20,0xf6,0x3f,0xb0,0x80,0x81,0xfe,0x0f,0x55,0xfa,0x03,0xe7,0x00,0x09,0x26,0xf8,0xf8,0x00,0x85,0x3f,0x77,0xa8,0x3c,0xc1,0x2a,0x00,0xf0,0x07,0x80,0x3c,0x01,0x40,}; |  | ||||||
| const uint8_t *_I_no_databases4[] = {_I_no_databases4_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd1_0[] = {0x01,0x00,0x49,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x08,0x3f,0x80,0x22,0x70,0x40,0x10,0xc1,0x80,0x43,0xf4,0x07,0x8f,0x02,0x0f,0x10,0xec,0x04,0x08,0x1e,0x38,0x03,0x89,0x7f,0x19,0xe7,0x10,0x90,0x0b,0x08,0x1e,0x37,0x81,0x29,0x03,0xd8,0x98,0x40,0xf1,0x1a,0x98,0x3d,0x2c,0x00,0xf3,0xf2,0x78,0x16,0x24,0x0f,0x5c,0x04,0xff,0xc0,0x3a,0x18,0xc4,0x7c,0x08,0x40,0xf6,0x45,0x8c,0xf8,0xfe,0x5f,0xc0,0x7b,0xd0,0x28,0x10,0x4e,0x04,0x3e,0xc1,0x80,0xff,0x8f,0xdc,0x1e,0x4c,0x81,0x03,0x8c,0xfc,0x1f,0x1c,0x02,0x49,0x40,0x3f,0xce,0xd1,0x07,0xc2,0xc0,0xff,0xc1,0x43,0x07,0xd4,0x08,0x08,0x60,0xff,0xfc,0x03,0xca,0x07,0x80,0xb0,0x02,0x8c,0xda,0x40,0x07,0xb0,0x83,0xfb,0xfc,0x0b,0x30,0x7a,0x00,}; |  | ||||||
| const uint8_t *_I_no_sd1[] = {_I_no_sd1_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd2_0[] = {0x01,0x00,0x42,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x00,0x7a,0xc1,0x00,0x43,0x06,0x01,0x0f,0xd0,0x1e,0x3c,0x00,0x78,0xf8,0x02,0x44,0x0f,0x1c,0x01,0xc4,0xbf,0x8c,0xf4,0x88,0x76,0x00,0x62,0x0f,0x1b,0xc0,0x94,0x81,0xed,0x20,0x1e,0x88,0x3c,0x46,0xe6,0x0f,0x72,0xe8,0xf9,0x3c,0x0b,0x12,0x07,0xb5,0x80,0x1e,0x51,0x88,0xff,0x80,0x7f,0x18,0x09,0xf8,0x2c,0x42,0x23,0xfc,0x07,0xca,0x70,0x67,0xd6,0x0c,0x07,0xfc,0x7f,0x14,0x0a,0x04,0x13,0x81,0x8f,0xff,0xcf,0xc1,0xf6,0xd9,0x1f,0xfb,0xb4,0x41,0xf1,0xc0,0x2d,0x17,0xf8,0x06,0x40,0xf8,0x05,0x14,0x09,0x6a,0x60,0xff,0xfc,0x03,0xc8,0x4e,0x20,0xf4,0x36,0x90,0x01,0xf0,0x16,0x00,0x7e,0xc0,0x2c,0x20,0xf7,}; |  | ||||||
| const uint8_t *_I_no_sd2[] = {_I_no_sd2_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd3_0[] = {0x01,0x00,0x41,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0x0b,0xc4,0x03,0xa0,0x0f,0xbb,0x06,0xe2,0x01,0xe8,0x07,0xdf,0xc3,0xf9,0x00,0xfa,0x03,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0x0b,0x00,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0x0f,0x14,0xfd,0xe4,0x08,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x01,0x95,0x22,0x04,0x0f,0x1f,0xcc,0xbc,0x1e,0xb4,0x00,0x91,0x49,0x20,0x3f,0x0f,0xff,0x02,0x3e,0x0f,0x59,0x00,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x04,0x8a,0x93,0x02,0x5f,0x8e,0x3e,0x00,0x0f,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x03,0x00,0x0f,0x58,0x20,0x08,0x60,0xd8,0x08,0x27,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0x0f,0x7f,0xc0,0x64,0x81,0xe3,0x1f,0x07,0xc4,0x13,0xec,0x10,0x1f,0x27,0x80,0x4e,0x60,0xf6,0x84,0x40,0xa0,0x1d,0x8f,0xf8,0x90,0x81,0xf0,0x2d,0x1f,0x07,0xc5,0x62,0x60,0xf5,0x8c,0x03,0xce,0x3f,0x70,0x07,0xc7,0x82,0x1e,0x5b,0x15,0x78,0xcf,0x01,0xf1,0x20,0x84,0x60,0x21,0xe0,0xf1,0x2f,0xcc,0x42,0x20,0xd8,0x1a,0x1f,0x02,0x1e,0x0f,0xb0,0x49,0x1b,0xe6,0x21,0xf0,0x05,0x17,0xf8,0xde,0x7f,0x80,0x79,0x40,0xc1,0xe3,0x30,0x05,0x15,0xf5,0x6c,0x8f,0xb5,0x07,0x98,0x78,0xc1,0xff,0x00,}; |  | ||||||
| const uint8_t *_I_no_sd3[] = {_I_no_sd3_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd4_0[] = {0x01,0x00,0x45,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0x0b,0xc4,0x03,0xa0,0x0f,0xbb,0x06,0xe2,0x01,0xe8,0x07,0xdf,0xc3,0xf9,0x00,0xfa,0x03,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0x0b,0x00,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0x0f,0x14,0xfd,0xe4,0x08,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x01,0x95,0x22,0x04,0x0f,0x1f,0xcc,0xbc,0x1e,0xb4,0x00,0x91,0x49,0x20,0x3f,0x0f,0xff,0x02,0x3e,0x0f,0x59,0x00,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x04,0x8a,0x93,0x02,0x5f,0x8e,0x3e,0x00,0x0f,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x03,0x00,0x0f,0x58,0x20,0x08,0x60,0xd8,0x08,0x27,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0x0f,0x7f,0xc0,0x64,0x81,0xe2,0x17,0x30,0x7a,0xc1,0x3e,0xc1,0x01,0xf2,0x78,0x16,0x26,0x0f,0x68,0x44,0x0a,0x01,0x18,0x8f,0xf8,0x07,0xf0,0x0f,0x11,0x68,0x9f,0xc7,0xf8,0x0f,0x88,0xc0,0x3c,0xac,0x18,0x0f,0xf8,0xfe,0x3c,0x10,0xf2,0xd8,0x83,0x85,0xfa,0x20,0xf7,0x90,0x42,0x30,0x10,0xf8,0x07,0xf8,0x04,0x20,0xf7,0x88,0x44,0x1b,0x03,0x03,0xff,0x17,0x88,0x1f,0x20,0x91,0x8f,0xa5,0x4c,0x1e,0xdf,0x00,0x51,0x1c,0x84,0x00,0x5f,0x80,0x79,0x09,0xc6,0x21,0x30,0x05,0x11,0xb4,0x80,0x0e,0x0f,0xf0,0x7c,0x80,}; |  | ||||||
| const uint8_t *_I_no_sd4[] = {_I_no_sd4_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd5_0[] = {0x01,0x00,0x3d,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x07,0xf8,0x10,0xfa,0x00,0xfc,0xe0,0x40,0x3d,0x00,0xfc,0xf0,0x40,0x3e,0x80,0xfb,0x98,0x7c,0x20,0x1f,0xce,0x4c,0x9b,0xce,0x0f,0x8f,0x85,0xfc,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x09,0xf8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xa4,0xe1,0x8f,0x83,0xcb,0x4c,0x2f,0x78,0x18,0x10,0xc1,0xe2,0x5f,0xbc,0x81,0x08,0x72,0x90,0x3e,0x88,0x3d,0x70,0x00,0x32,0xa4,0x40,0x81,0xe3,0xf9,0x97,0x83,0xd6,0x80,0x12,0x29,0x24,0x07,0xe1,0xff,0x22,0x08,0x3d,0x64,0x01,0x22,0xc9,0x41,0x01,0xe3,0x81,0x87,0x83,0xd6,0x20,0x12,0x2a,0x4c,0x09,0x7e,0x38,0xf8,0x00,0x3d,0x61,0x02,0x33,0x84,0xfa,0x2f,0xf8,0x0c,0x00,0x3d,0x60,0x80,0x21,0x83,0x60,0x20,0x9f,0x40,0x78,0xf0,0x01,0xef,0x80,0x38,0x97,0xf1,0x9f,0x00,0xf1,0xbc,0x23,0xcc,0x1e,0x9f,0x80,0xc9,0x03,0xc5,0x5a,0x20,0xf7,0x82,0x7d,0x82,0x03,0xe4,0xf0,0x09,0xcc,0x1e,0xd0,0x88,0x14,0x03,0xb1,0xff,0x12,0x10,0x3e,0x05,0xa3,0xe0,0xf8,0xac,0x4c,0x1e,0xb1,0x80,0x79,0xc7,0xee,0x00,0xf8,0xf0,0x43,0xcb,0x62,0xaf,0x19,0xe0,0x3e,0x24,0x10,0x8c,0x04,0x3c,0x1e,0x25,0xf9,0x88,0x44,0x1b,0x03,0x43,0xe0,0x43,0xc1,0xf6,0x09,0x23,0x7c,0xc4,0x3e,0x00,0xa2,0xff,0x1b,0xcf,0xf0,0x0f,0x28,0x18,0x3c,0x66,0x00,0xa2,0xbe,0xad,0x91,0xf6,0xa0,0xf3,0x0f,0x18,0x3f,0xe0,0x00,}; |  | ||||||
| const uint8_t *_I_no_sd5[] = {_I_no_sd5_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_no_sd6_0[] = {0x01,0x00,0x43,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x00,0x7a,0xc1,0x00,0x43,0x06,0x01,0x0f,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x6f,0x00,0x52,0x07,0xaf,0xe0,0x32,0x40,0xf1,0x8f,0x83,0xe2,0x09,0xf6,0x08,0x0f,0x93,0xc0,0x27,0x30,0x7b,0x42,0x20,0x50,0x0e,0xc7,0xfc,0x48,0x40,0xf8,0x16,0x8f,0x83,0xe2,0xb1,0x30,0x7a,0xc6,0x01,0xe7,0x1f,0xb8,0x03,0xe3,0xc1,0x0f,0x2d,0x8a,0xbc,0x67,0x80,0xf8,0x90,0x42,0x30,0x10,0xf0,0x78,0x97,0xe6,0x21,0x10,0x64,0x0d,0x0f,0x80,0xfd,0x10,0x7d,0x02,0x48,0xdf,0x31,0x0f,0x80,0x28,0xbf,0xc6,0xf3,0xfc,0x03,0xca,0x06,0x0f,0x19,0x80,0x28,0xaf,0xab,0x64,0x7d,0xa8,0x3c,0xc3,0xc6,0x0f,0xf8,0x00,}; |  | ||||||
| const uint8_t *_I_no_sd6[] = {_I_no_sd6_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv1_0[] = {0x01,0x00,0xca,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0x0a,0x8a,0x08,0x24,0x21,0x31,0x40,0x38,0x00,0x81,0x2d,0x20,0x08,0x41,0xeb,0x38,0x07,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x02,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x82,0x60,0x2f,0xe0,0xf7,0xa8,0x78,0x66,0x07,0x61,0x81,0x58,0x11,0xa3,0x02,0xc0,0x43,0xce,0x47,0x48,0x8f,0x25,0x8a,0x05,0x30,0x80,0x41,0x90,0x64,0x0f,0x43,0xf9,0xc0,0x7f,0x05,0xb1,0x81,0x78,0x27,0xe0,0xf1,0xff,0xff,0xc7,0x02,0xba,0x20,0x30,0xc0,0x7e,0x10,0x3f,0x04,0x9f,0xc1,0x1f,0x22,0x8e,0x10,0x1e,0x56,0x01,0x39,0x02,0xc6,0xc1,0x26,0xf0,0x48,0xc4,0xc3,0x82,0x07,0x94,0x78,0x1e,0x5c,0x08,0x1f,0x02,0x27,0xc0,0xa0,0x8d,0x8a,0x07,0x00,0xf0,0x38,0x8a,0x08,0x55,0x12,0xf8,0xf0,0x11,0xc3,0x10,0x80,0xa3,0x44,0xec,0x41,0x71,0x30,0x8b,0x1c,0x81,0xe7,0xf0,0x9f,0xae,0x48,0x1e,0x20,0x43,0x07,0x96,0x80,0x0a,0x34,0x00,0x51,0xc4,0x16,0x46,0x0f,0xa9,0x07,0xd0,0x1e,0xbf,0x02,0x58,0x83,0xd6,0x18,0x5f,0x10,0x79,0xff,0x20,0xe0,0xf1,0x27,0x9d,0x02,0x09,0x7c,0x63,0x88,0x3c,0xbf,0xd0,0xf0,0x7a,0xe0,0x21,0x06,0xe1,0x16,0x0e,0x0f,0xff,0xfd,0xfb,0xaa,0xc7,0xfe,0xa6,0x10,0x78,0x9b,0xce,0x19,0x9c,0xff,0xa3,0x04,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc0,0x30,0x80,0x03,0x3f,0x0f,0x97,0xe0,0x54,0x22,0xf1,0x45,0x88,0x3d,0x39,0xe0,0xf1,0xc0,0x15,0x87,0xff,0x03,0x26,0x8f,0x81,0xf8,0x64,0x61,0x07,0x8d,0xc0,0x0a,0x3f,0xc0,0xa0,0x8f,0x10,0x00,0x3f,0x30,0x78,0xc3,0x82,0xe7,0x40,0x07,0xb7,0xd2,0x7f,0xf0,0xe0,0x83,0xd7,0xf8,0x0e,0x3b,0xff,0xdf,0xbf,0x0f,0xd3,0x18,0x8c,0x1e,0x3c,0x30,0x79,0xe7,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xb3,0x3c,0x06,0x00,0x1e,0x7e,0xf0,0x78,0xd3,0xe9,0x39,0x26,0x38,0x83,0xc6,0x80,0x0f,0x4f,0x9f,0xdf,0x3e,0x05,0x23,0xe8,0x83,0xc4,0x40,0x24,0x63,0xfe,0x03,0xc4,0x0a,0x51,0x80,0x7a,0x07,0xcd,0x84,0x31,0xf1,0x61,0x47,0x01,0xe5,0x10,0x07,0xbc,0x08,0x18,0x31,0xe0,0x10,0xd8,0x01,0xf1,0x04,0x06,0x08,0xfc,0xae,0x0f,0x31,0xf3,0x83,0xd4,0x78,0x3c,0x06,0x99,0x6f,0x01,0xe3,0xc3,0x0b,0x0f,0xe0,0x1e,0x56,0x06,0x18,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x68,0x8f,0x9c,0x3e,0xae,0x64,0x80,0x4e,0x01,0xe2,0x4f,0x60,0x7a,0xc8,0x01,0xfe,0x2f,0x20,0x7f,0x00,}; |  | ||||||
| const uint8_t *_I_tv1[] = {_I_tv1_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv2_0[] = {0x01,0x00,0xcc,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x08,0x88,0x88,0x41,0x63,0x20,0x07,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x05,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0x0f,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x08,0xae,0x08,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x01,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x80,0xf5,0xf8,0x44,0x60,0x10,0xe0,0xf9,0xc8,0x21,0x85,0xf1,0x07,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0x40,0x82,0x5f,0x26,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x10,0x83,0x70,0x8b,0x07,0x3f,0xff,0xfe,0xfd,0xd6,0x24,0xa6,0x10,0x78,0x9b,0xce,0x19,0xbc,0xff,0xa3,0x04,0x1e,0x51,0xd0,0x59,0x70,0x54,0x87,0xf8,0x67,0x9f,0xfe,0x7e,0x1f,0x2f,0xc6,0x0c,0x4a,0x4d,0x41,0x07,0xa7,0x3c,0x12,0x38,0x03,0x18,0xff,0xe0,0xf8,0x05,0xca,0x00,0x07,0xe0,0x0f,0x1b,0x80,0x14,0x7f,0x90,0x10,0x79,0x07,0xd3,0xe6,0x0f,0x18,0x70,0x5c,0xe8,0x00,0xf6,0xfa,0x4f,0xfe,0x1c,0x10,0x7a,0xff,0x01,0xc7,0x7f,0xfb,0xf7,0xe1,0xfa,0x63,0x11,0x83,0xc4,0x3c,0x99,0xff,0xbc,0x7f,0x61,0x79,0xbf,0x2c,0xcf,0x01,0x87,0x07,0x9f,0xbc,0x1e,0x34,0xfa,0x4e,0x4a,0x02,0x0f,0x2e,0x06,0x04,0x9c,0x9f,0x75,0x30,0x80,0x08,0x1e,0x5e,0x03,0x08,0x80,0x0b,0xf8,0x0f,0x10,0x29,0x7e,0x01,0xe5,0x60,0xc0,0x06,0x0d,0x84,0x31,0xf1,0x61,0x7f,0x01,0xe5,0x30,0x07,0xbc,0x08,0x18,0x25,0x02,0xb0,0x03,0xe2,0x08,0x0c,0x1b,0xf8,0x08,0x6e,0x11,0x8c,0x07,0x9c,0x1e,0xb1,0x88,0x07,0x00,0x9e,0x5b,0xc0,0x78,0xf0,0xe1,0xe4,0x81,0x07,0x95,0x81,0x86,0x3f,0xf7,0x78,0xcf,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0x0f,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x00,0x7f,0x8b,0xc8,0x1f,0xc0,}; |  | ||||||
| const uint8_t *_I_tv2[] = {_I_tv2_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv3_0[] = {0x01,0x00,0xc1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0x0a,0x8a,0x08,0x24,0x21,0x31,0x40,0x38,0x00,0x81,0x2d,0x20,0x08,0x41,0xeb,0x38,0x07,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x02,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x07,0xd5,0x43,0xc3,0x30,0x3b,0x09,0xbc,0xe0,0x58,0x08,0x79,0xc8,0xe9,0x11,0xe4,0xb1,0x03,0xd1,0x04,0xb4,0x83,0xf9,0xa8,0xce,0x05,0xe0,0x9f,0x83,0xc7,0xff,0xff,0xbf,0xae,0x8c,0x0c,0x20,0x01,0x81,0xf8,0x24,0xfe,0x08,0xf9,0x14,0x70,0x80,0xf2,0xb0,0x08,0xce,0x3d,0x60,0x93,0x78,0x24,0x68,0x21,0xc1,0x02,0x8c,0x1e,0x70,0x3e,0x04,0x4f,0x81,0x41,0x07,0x8c,0x0a,0x07,0x00,0xf0,0x0f,0x8c,0xaa,0x25,0xf1,0xe0,0x23,0x86,0x21,0x01,0x46,0x89,0xd8,0x80,0x03,0x30,0x09,0x98,0x3c,0xfe,0x13,0xf5,0xc9,0x40,0x3f,0x10,0x90,0x7a,0xe8,0x00,0xa3,0x40,0x07,0x9c,0x1e,0x0c,0x0f,0xc1,0xe8,0xfd,0x01,0xeb,0xf0,0x25,0x88,0x3c,0xd1,0x23,0xfc,0x2f,0x88,0x3c,0xff,0x90,0x70,0x78,0x93,0xc8,0x04,0x3e,0x0b,0xfb,0x1c,0x41,0xe5,0xfe,0x87,0x83,0xdb,0x81,0xe1,0x04,0x8f,0xc3,0x07,0xff,0xfe,0xfd,0xd5,0x44,0xa6,0x11,0x90,0xce,0x3e,0x01,0x51,0x86,0x67,0x3f,0xe2,0x71,0x07,0x94,0x74,0x1e,0x30,0x8f,0xe0,0x78,0x5a,0x43,0xb8,0x64,0x1f,0xfe,0x7e,0x1f,0x2f,0xc4,0x4e,0x01,0x0e,0x73,0x0f,0xc0,0x1e,0x9c,0xf0,0x79,0x44,0x3c,0x1c,0x08,0x19,0x34,0x7c,0x0a,0x93,0x23,0x08,0x3c,0xdf,0x42,0x0f,0x30,0xfa,0x7c,0xc1,0xe3,0x1e,0x40,0x09,0x3c,0x68,0x00,0xf6,0xfa,0x4f,0xfe,0x13,0x99,0x30,0x9c,0x81,0xe3,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xfd,0xa7,0xe0,0xf4,0xe1,0x83,0xcf,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe0,0x79,0x48,0x30,0x18,0x00,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe6,0x98,0xe2,0x0f,0x1a,0x00,0x3d,0x3e,0x7f,0x7c,0xf8,0x14,0x91,0xc5,0x20,0x10,0x09,0xb8,0xff,0x80,0xf1,0x02,0x94,0x60,0x1e,0x81,0xf3,0x61,0x0c,0x7c,0x58,0x51,0xc0,0x79,0x44,0x01,0xef,0x02,0x06,0x0c,0x78,0x04,0x36,0x00,0x7c,0x41,0x01,0x82,0x3f,0x2b,0x84,0x23,0x01,0xe7,0x07,0xa8,0xf0,0x78,0x0a,0x31,0x80,0x6f,0x01,0xe3,0xc3,0x0b,0x0f,0xe0,0x1e,0x56,0x05,0x68,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x80,0x0b,0xc4,0x3e,0xae,0x64,0x80,0x4e,0x01,0xe2,0x4f,0x60,0x7a,0xb8,0xc4,0x1f,0xe5,0xf7,0x07,0xc0,}; |  | ||||||
| const uint8_t *_I_tv3[] = {_I_tv3_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv4_0[] = {0x01,0x00,0xc0,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x04,0xfc,0x1e,0x3f,0xf0,0x01,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x04,0x7c,0x54,0x30,0x4f,0x03,0x98,0x42,0x22,0x00,0x28,0xf4,0x80,0x1e,0x33,0xf1,0x60,0xc1,0xa3,0x87,0x41,0x81,0x83,0xce,0x07,0xc0,0x89,0xf0,0x28,0xe0,0xf1,0x8d,0x03,0x07,0xc0,0x0e,0x33,0xa8,0x97,0xc7,0x81,0x83,0x2e,0x0f,0x94,0x14,0x37,0x80,0x79,0xcc,0x02,0x66,0x0f,0x28,0x28,0xe4,0x97,0xcc,0x0f,0x3d,0x01,0xec,0x8a,0x02,0x9e,0x43,0x68,0x83,0xcc,0x2e,0x44,0xe4,0xf2,0x2e,0x4c,0x1e,0x3f,0x08,0x8c,0x02,0x1c,0x1f,0x39,0xe5,0xf2,0x0d,0x18,0x07,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0xc2,0x87,0xf3,0x11,0x82,0x0f,0x2f,0xf4,0x3e,0x7f,0x10,0x07,0x9c,0x04,0x42,0x22,0xf1,0xf8,0x67,0xff,0xff,0xdf,0xba,0xa8,0x83,0x23,0x80,0x08,0x8c,0x38,0x9e,0x30,0xcd,0xe7,0xfd,0x18,0x20,0xf2,0x8e,0x83,0xcc,0x8a,0x50,0x2f,0xc3,0x20,0xff,0xf3,0xf0,0xf9,0xe0,0x04,0xa5,0x01,0xf8,0x03,0xd3,0x9e,0x0f,0x31,0x38,0xc1,0xc0,0x84,0x79,0x32,0x30,0x83,0xc6,0xe1,0x01,0xfe,0x7f,0x20,0x21,0x43,0x00,0x1f,0xcc,0x1e,0x30,0xef,0xf3,0xa8,0x60,0x14,0x00,0x7b,0x7d,0x27,0xff,0x0e,0x08,0x9c,0xc1,0xe3,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x42,0x0f,0x30,0xf2,0x67,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0x0f,0x29,0x06,0x03,0x0e,0x0f,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x92,0x80,0x41,0xe3,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x01,0x03,0xcb,0xc0,0x96,0x20,0x00,0xff,0x01,0xe2,0x05,0x2f,0xc0,0x3c,0xac,0x09,0x41,0x00,0x13,0x08,0x63,0xe2,0xc2,0xfe,0x03,0xca,0x60,0x0f,0x78,0x10,0x30,0x4a,0x05,0x60,0x07,0xc4,0x10,0x18,0x37,0xf0,0x10,0xdc,0x23,0x18,0x0f,0x38,0x3d,0x63,0x10,0x0e,0x01,0x3c,0xb7,0x80,0xf1,0xe1,0xc3,0xc9,0x02,0x0f,0x2b,0x03,0x0c,0x7f,0xf0,0x38,0x04,0xfe,0x1e,0x0f,0x1d,0x7c,0xcb,0xf6,0x0f,0x14,0xb2,0x3d,0xc9,0xcc,0x3e,0x70,0xfa,0xb9,0x92,0x01,0x38,0x07,0x89,0x3d,0x81,0xeb,0x20,0x07,0xf8,0xbc,0x81,0xfc,}; |  | ||||||
| const uint8_t *_I_tv4[] = {_I_tv4_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv5_0[] = {0x01,0x00,0xcb,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x61,0x10,0x74,0x63,0xf6,0x09,0x37,0x82,0x46,0x26,0x18,0x34,0x71,0x64,0x90,0x2e,0x04,0x0f,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0x97,0x04,0xfa,0x67,0x51,0x2f,0x8f,0x00,0x32,0x31,0x0f,0x28,0x2c,0x63,0x0a,0xd3,0x30,0x8a,0xe0,0x81,0xe5,0x05,0x77,0x2c,0x20,0xca,0x25,0xd1,0x07,0x96,0x81,0x2c,0x44,0xe2,0x0b,0x88,0x1c,0x55,0x24,0x0f,0x25,0xd9,0x03,0xce,0x41,0xf4,0x1b,0x10,0x3c,0xbe,0x11,0x18,0x04,0x38,0x1e,0x90,0xc8,0x7c,0x58,0x1e,0x7f,0xcf,0x3f,0x02,0x12,0xa9,0x28,0x05,0x02,0x08,0x19,0x20,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x04,0xf3,0xf8,0x60,0xff,0xff,0xdf,0xba,0xc4,0x94,0xc2,0x0f,0x13,0x79,0xc3,0x33,0x9f,0xf8,0x07,0x80,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc3,0x3c,0xff,0xf3,0xf0,0xf9,0x7e,0x05,0x42,0xd7,0x16,0xa0,0x83,0xd3,0x9e,0x0f,0x1c,0x03,0x50,0x7f,0xf0,0x32,0x68,0xf8,0x05,0x04,0x00,0x1f,0x80,0x3c,0x6e,0x00,0x51,0xfe,0x40,0x41,0xe4,0x1f,0x4f,0x98,0x3c,0x61,0xc1,0x73,0xa0,0x03,0xdb,0xe9,0x3f,0xf8,0x70,0x41,0xeb,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x46,0x0f,0x1e,0x18,0x3c,0xf3,0xff,0x78,0xfe,0xc2,0xf3,0x7e,0x59,0x9e,0x03,0x00,0x0f,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x93,0x10,0xa4,0x14,0x00,0x7a,0x7c,0xfe,0xf9,0xf0,0x29,0x1f,0x44,0x1e,0x22,0x01,0x23,0x1f,0xf0,0x1e,0x20,0x52,0x76,0x88,0x3c,0xc3,0xe6,0xc2,0x18,0xf8,0xb0,0xa3,0x80,0xf2,0x88,0x03,0xdd,0xc2,0x51,0xe0,0x10,0xd8,0x01,0xf1,0x04,0x06,0x08,0xfc,0xae,0x10,0x8c,0x07,0x9c,0x1e,0xa3,0xc1,0xe0,0x34,0xcb,0x78,0x0f,0x1e,0x18,0x58,0x7f,0x00,0xf2,0xb0,0x30,0xc6,0xfe,0x0f,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x98,0x7c,0xe1,0xf5,0x73,0x24,0x02,0x70,0x0f,0x12,0x7b,0x03,0xd6,0x40,0x0f,0xf1,0x79,0x03,0xf8,}; |  | ||||||
| const uint8_t *_I_tv5[] = {_I_tv5_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv6_0[] = {0x01,0x00,0xd1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x08,0x88,0x88,0x41,0x63,0x20,0x07,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x05,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0x0f,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x08,0xae,0x08,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x01,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x9f,0x03,0xe8,0x83,0xcb,0xe1,0x11,0x80,0x43,0x83,0xe7,0x20,0x86,0x43,0xe2,0x60,0xf3,0xfe,0x79,0xf8,0x10,0x98,0x30,0x3c,0xa8,0x02,0xf1,0x3c,0x08,0x3c,0xbf,0xd0,0xf9,0xfc,0x40,0x1e,0x78,0x06,0x39,0xfc,0x33,0xff,0xff,0xef,0xdd,0x62,0x4a,0x61,0x07,0x89,0xbc,0x41,0xe3,0x0c,0xde,0x7f,0xd1,0x82,0x0f,0x28,0xe8,0x80,0xb8,0x30,0x32,0x78,0xc0,0xbf,0x0c,0xf3,0xff,0xcf,0xc3,0xe5,0xf8,0xc1,0x89,0x49,0xa8,0x20,0xf4,0xe7,0x82,0x47,0x00,0x63,0x1f,0xfc,0x1f,0x00,0xb9,0x40,0x00,0xfc,0x01,0xe3,0x70,0x02,0x8f,0xf2,0x02,0x0f,0x20,0xfa,0x7c,0xc1,0xe3,0x0e,0x0b,0x9d,0x00,0x1e,0xdf,0x49,0xff,0xc3,0x82,0x0f,0x5f,0xe0,0x38,0xef,0xff,0x7e,0xfc,0x3f,0x4c,0x62,0x30,0x78,0x87,0x93,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe5,0x99,0xe0,0x30,0xe0,0xf3,0xf7,0x83,0xc6,0x9f,0x49,0xc9,0x40,0x41,0xe5,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x01,0x03,0xcb,0xc0,0x61,0x10,0x01,0x7f,0x01,0xe2,0x05,0x2f,0xc0,0x3c,0xac,0x18,0x00,0xc1,0xb0,0x86,0x3e,0x2c,0x2f,0xe0,0x3c,0xa6,0x00,0xf7,0x81,0x03,0x04,0xa0,0x56,0x00,0x7c,0x3f,0x06,0x01,0x7f,0x01,0x0d,0xc2,0x31,0x80,0xf3,0x83,0xd6,0x31,0x00,0xe0,0x13,0xcb,0x78,0x0f,0x1e,0x1c,0x3c,0x90,0x20,0xf2,0xb0,0x30,0xc7,0xff,0x03,0x80,0x4f,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0x0f,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x00,0x7f,0x8b,0xc8,0x1f,0xc0,}; |  | ||||||
| const uint8_t *_I_tv6[] = {_I_tv6_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv7_0[] = {0x01,0x00,0xc1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x04,0xfc,0x1e,0x3f,0xf0,0x01,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x04,0x7c,0x54,0x30,0x4f,0x03,0x98,0x58,0x49,0x1e,0xb0,0x49,0xbc,0x12,0x31,0x60,0xc1,0xa3,0x8b,0x24,0x00,0x0c,0x0f,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0xc0,0x2c,0x00,0xe3,0x3a,0x89,0x7c,0x78,0x01,0x91,0x88,0x79,0x41,0x43,0x18,0x07,0x9c,0xc0,0x26,0x60,0xf2,0x82,0xbb,0x8f,0xf0,0x41,0x14,0x99,0x83,0xcb,0x40,0x7b,0x20,0x60,0xc1,0x2f,0xc8,0x34,0x07,0x98,0x5c,0x81,0xe5,0x80,0x8f,0xfd,0x01,0xeb,0xf0,0x88,0xc0,0x21,0xc2,0xc3,0xf0,0x43,0xcf,0x62,0x0f,0x3f,0xe7,0x9f,0x81,0x09,0x4f,0x0b,0x20,0x90,0xe2,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0x57,0x04,0x22,0x10,0x20,0xfc,0x30,0x7f,0xff,0xef,0xdd,0x54,0x51,0xf3,0xe0,0x9b,0xd2,0x19,0x9c,0xff,0x8e,0x04,0x1e,0x51,0xd8,0x02,0xcc,0x78,0x09,0x71,0x69,0x0e,0xe1,0x90,0x7f,0xf9,0xf8,0xe4,0x6f,0x1f,0x81,0x50,0xb5,0xc6,0x03,0xf0,0x07,0xa7,0x3c,0x1e,0x38,0x01,0x00,0xb8,0x04,0x9a,0x3e,0x06,0x4a,0x7c,0x01,0xe3,0x70,0x02,0x8f,0xf1,0xae,0x43,0xc3,0x00,0x0f,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x01,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x03,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x07,0x9f,0x0c,0x1e,0x79,0xff,0xbc,0x7f,0x61,0x79,0x68,0x08,0x00,0x64,0x18,0x0c,0x00,0x3c,0xfd,0xe0,0xf1,0xa7,0xd2,0x72,0x4c,0x41,0x07,0x8d,0x00,0x1e,0x9f,0x3f,0xbe,0x7c,0x0a,0x47,0xd1,0x07,0x88,0x80,0x48,0xc7,0xfc,0x07,0x88,0x14,0xa3,0x00,0xf4,0x0f,0x9b,0x08,0x63,0xe2,0xc2,0x8e,0x03,0xca,0x20,0x0f,0x77,0x08,0xc0,0x23,0xc0,0x21,0xb0,0x03,0xe2,0x08,0x0c,0x11,0xf9,0x5c,0x21,0x18,0x0f,0x38,0x3d,0x47,0x83,0xc0,0x51,0x8c,0x03,0x78,0x0f,0x1e,0x18,0x58,0x7f,0x00,0xf2,0xb0,0x30,0xc6,0xfe,0x0f,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x44,0x7c,0xe1,0xf5,0x73,0x24,0x02,0x70,0x0f,0x12,0x7b,0x03,0xd6,0x40,0x0f,0xf1,0x79,0x03,0xf8,}; |  | ||||||
| const uint8_t *_I_tv7[] = {_I_tv7_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_tv8_0[] = {0x01,0x00,0xcd,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x7f,0x08,0x1f,0x82,0x7e,0x0f,0x1f,0xf8,0x00,0xa1,0xf0,0x0f,0xf0,0x14,0xe1,0xde,0x09,0x3f,0x82,0x3e,0x2a,0x18,0x27,0x81,0xcc,0x21,0x11,0x27,0x14,0xc2,0x40,0x0f,0x19,0xf8,0xb0,0x60,0xd1,0xc3,0xa0,0xc0,0xc1,0xe5,0x74,0xe0,0x70,0x22,0x7c,0x0a,0x38,0x3c,0x63,0x40,0xc1,0xf0,0x13,0x8f,0xf9,0x01,0x2f,0x8f,0x03,0x06,0x5c,0x1f,0x28,0x28,0x6f,0x00,0xf3,0xfc,0x0d,0x85,0x12,0x20,0xf2,0x82,0x81,0x86,0x3c,0x0c,0x17,0xc8,0x92,0xc8,0x1e,0x7a,0x03,0xd9,0x06,0x46,0x09,0x7e,0x22,0x0d,0xfc,0x1e,0xaa,0xb2,0x20,0x8c,0x13,0x00,0x1d,0x1c,0x38,0x18,0x41,0xe5,0xf0,0x88,0xc0,0x21,0xc1,0xf1,0x0a,0x0f,0x83,0x1f,0x01,0x09,0x08,0x3c,0xbf,0x9e,0x7e,0x04,0x26,0x0c,0xc8,0x3f,0xc7,0xfd,0x3a,0x20,0xf2,0xff,0x43,0xe7,0xf1,0x00,0x78,0xae,0x09,0xc6,0x7f,0x0c,0xff,0xff,0xfb,0xf7,0x55,0x94,0x7d,0xe4,0x20,0xf4,0x86,0x6f,0x3f,0xe3,0x81,0x07,0x94,0x74,0xc4,0x53,0x07,0x11,0x8d,0x04,0x00,0x73,0xf2,0x48,0xde,0x3f,0x1c,0x31,0x28,0xc0,0x20,0x3f,0x00,0x7a,0x73,0xc1,0x23,0x80,0x83,0xe0,0x3f,0xe0,0x21,0x5c,0xa9,0x18,0x41,0xe3,0x70,0x02,0x8f,0xf9,0x80,0x23,0xc4,0x00,0x0f,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x01,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x03,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x07,0x98,0x79,0x33,0xff,0x78,0xfe,0xc2,0xf2,0xd0,0x10,0x00,0xc8,0x30,0x18,0x70,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe4,0x9e,0x22,0x0f,0x1e,0x06,0x04,0x9c,0x9f,0x75,0x30,0x80,0x08,0x1e,0x5e,0x03,0x08,0x80,0x0b,0xf8,0x0f,0x10,0x29,0x7e,0x01,0xe5,0x60,0x42,0x08,0x00,0x98,0x43,0x1f,0x16,0x17,0xf0,0x1e,0x53,0x00,0x7b,0xc0,0x81,0x82,0x50,0x2b,0x00,0x3e,0x20,0x80,0xc1,0xbf,0x80,0x86,0xe1,0x18,0xc0,0x79,0xc1,0xeb,0x18,0x80,0x70,0x09,0xe5,0xbc,0x07,0x8f,0x0e,0x1e,0x48,0x10,0x79,0x58,0x18,0x63,0xff,0x81,0xc0,0x27,0xf0,0xf0,0x78,0xeb,0xe6,0x5f,0xb0,0x78,0xa5,0x91,0xee,0x4e,0x61,0xf3,0x87,0xd5,0xcc,0x90,0x09,0xc0,0x3c,0x49,0xec,0x0f,0x59,0x00,0x3f,0xc5,0xe4,0x0f,0xe0,}; |  | ||||||
| const uint8_t *_I_tv8[] = {_I_tv8_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_url1_0[] = {0x01,0x00,0x33,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xd6,0x0e,0x0f,0x29,0xf0,0x20,0x60,0x30,0x1d,0x40,0x10,0x8e,0x63,0xff,0xfc,0xff,0x01,0xe3,0x47,0x07,0x9c,0x90,0x1e,0x7a,0x0f,0xfe,0x3b,0xf7,0x7f,0xc0,0x6b,0xa9,0x1c,0x7d,0xcc,0xcf,0x49,0xce,0xe0,0xe6,0x60,0x9d,0x0b,0xff,0xef,0xee,0x0f,0x1d,0xe5,0x22,0x53,0x25,0xa4,0xeb,0x2a,0x52,0x2d,0x2c,0x13,0xe1,0xbf,0xfe,0xfb,0xc1,0xe3,0x8f,0x07,0x95,0xe7,0x48,0x0f,0x1d,0xe8,0x3c,0xbf,0xe0,0xf2,0xcf,0x03,0xca,0x12,0x0f,0x2c,0x28,0x3c,0x7b,0xf1,0xfe,0xf8,0x3c,0x7b,0xd7,0x0e,0x3c,0xe6,0x63,0xa5,0xe7,0x72,0x63,0x30,0x30,0x78,0xfb,0xfb,0xc5,0xf1,0x00,0x89,0x64,0x40,0x03,0x42,0x01,0x90,0x3c,0x7f,0xe0,0xf2,0x3f,0x88,0x3d,0xf8,0x02,0xd1,0x00,0x8a,0x7e,0x81,0xe3,0xbf,0x07,0xe9,0x7c,0xc1,0xf9,0xbf,0x07,0xc7,0xe1,0xb4,0x30,0x1a,0x05,0xff,0xff,0xe7,0x07,0xbc,0x18,0x04,0x30,0x25,0xf8,0xff,0xb8,0x60,0xf7,0x81,0x80,0x85,0x7e,0x2d,0xf1,0xc0,0x03,0xef,0xe0,0xff,0x18,0x38,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0xf0,0xfb,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xe3,0xf7,0xc0,0x7b,0xca,0xa7,0x00,0xf3,0x9f,0xde,0x01,0xef,0x1a,0xbc,0x03,0xce,0xfe,0x0f,0x80,0xfa,0xff,0xc1,0xf0,0x3f,0x51,0x00,0x97,0xf4,0x1f,0x07,0xf5,0x07,0xf8,0x3e,0x60,0xeb,0xf2,0x07,0xdf,0xf9,0xbe,0x5e,0x00,0x79,0x4f,0xc1,0xed,0xfc,0x05,0x08,0x25,0x80,0x1e,0x00,0xf0,0x07,0x80,0x24,}; |  | ||||||
| const uint8_t *_I_url1[] = {_I_url1_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_url2_0[] = {0x01,0x00,0x33,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xd6,0x3f,0xfc,0x07,0x8c,0xf8,0x10,0x30,0x18,0x0e,0xa0,0x08,0x47,0x31,0xff,0xf9,0xfe,0x60,0xf1,0xa3,0x83,0xce,0x48,0x0f,0x3d,0x07,0xfe,0x77,0xee,0xbf,0xe0,0x35,0xd4,0x8e,0x3e,0xe6,0x67,0xa4,0xe7,0x70,0x73,0x30,0x4e,0x87,0xff,0xdb,0xdf,0x07,0x8e,0xf2,0x91,0x29,0x92,0xd2,0x75,0x95,0x29,0x16,0x96,0x09,0xf0,0xff,0xfd,0xb7,0xe0,0xf1,0xc7,0x83,0xca,0xf3,0xa4,0x07,0x8e,0xf4,0x1e,0x5f,0xe0,0x79,0x67,0x81,0xe5,0x09,0x07,0x96,0x14,0x1e,0x37,0xf8,0xfd,0xfc,0x1e,0x3d,0xeb,0x87,0x1e,0x73,0x31,0xd2,0xf3,0xb9,0x31,0x98,0x18,0x3c,0x7d,0xf7,0xe2,0xf8,0x80,0x44,0xb2,0x20,0x01,0xa1,0x00,0xc8,0x1e,0x3f,0xf0,0x79,0x1f,0xc4,0x1e,0xfc,0x01,0x68,0x80,0x05,0x3f,0x40,0xf1,0x27,0x08,0x3f,0x0b,0xe6,0x0f,0xcd,0xf0,0x3e,0x3f,0x0d,0xa1,0x80,0xaf,0xc7,0xfb,0x9f,0x07,0xbc,0x18,0x04,0x30,0x25,0xf8,0xfe,0xe1,0xe0,0xf7,0x81,0x80,0x85,0x7e,0x5e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf6,0xe1,0xe2,0x61,0x00,0xf2,0xff,0xcf,0xef,0x00,0xf6,0x91,0xd2,0xa3,0x00,0xf3,0xbf,0xdc,0x01,0xef,0x2a,0x9c,0x03,0xcf,0xff,0x60,0x07,0xbc,0x6a,0xf0,0x0f,0x4b,0x08,0x7f,0xac,0x63,0xfd,0x20,0x09,0x7f,0x41,0xf0,0x7f,0x50,0x7f,0x83,0xe6,0x0e,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x07,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x01,0xe0,0x0f,0x00,0x78,0x02,0x40,}; |  | ||||||
| const uint8_t *_I_url2[] = {_I_url2_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_url3_0[] = {0x01,0x00,0x2e,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xe6,0x7c,0x08,0x18,0x0c,0x07,0x50,0x04,0x23,0x98,0x83,0xd2,0x8e,0x0f,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0xff,0xf2,0xff,0x80,0xd7,0x52,0x38,0xfb,0x99,0x9e,0x93,0x9d,0xc1,0xcc,0xc1,0x3a,0x1f,0xff,0x3f,0xcc,0x1e,0x3b,0xca,0x44,0xa6,0x4b,0x49,0xd6,0x54,0xa4,0x5a,0x58,0x27,0xc3,0xff,0x3b,0xf7,0x03,0xc7,0x1e,0x0f,0x2b,0xce,0x90,0x1e,0x3b,0xd0,0x79,0x7b,0x7b,0xe0,0xf1,0xcf,0x03,0xca,0x12,0x0f,0x2c,0x28,0x3c,0xa2,0xdb,0xf0,0x78,0xf7,0xae,0x1c,0x79,0xcc,0xc7,0x4b,0xce,0xe4,0xc6,0x60,0x60,0xf1,0xf7,0x6f,0x8b,0xe2,0x01,0x12,0xc8,0x80,0x06,0x84,0x03,0x2f,0x85,0xff,0xff,0x7e,0x3f,0x98,0x3d,0xf8,0x17,0xf0,0x01,0x27,0xe8,0x1e,0x23,0xe1,0x07,0xea,0x78,0x43,0xfe,0x0f,0x7f,0xc2,0xe8,0x60,0x2b,0xf1,0xff,0x04,0x04,0x1e,0xd0,0x60,0x10,0xc0,0x97,0xe2,0x0f,0x98,0x18,0x08,0x57,0xe5,0xfd,0xcf,0x83,0xed,0x1e,0x3f,0xb8,0x78,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbc,0xf0,0x3b,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xa3,0xf1,0xcb,0xe0,0x3d,0xe5,0x53,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7b,0xc6,0xaf,0x00,0xf3,0xbf,0xdc,0x03,0xfb,0xff,0xb0,0x0f,0xf0,0x00,0x36,0x12,0xfe,0x00,0x06,0xc6,0x7f,0xc2,0x01,0x03,0xfc,0x1e,0xd0,0x75,0xf9,0x03,0xef,0xfc,0xdf,0x2f,0x00,0x3c,0xa7,0xe0,0xf6,0xfe,0x02,0x84,0x12,0xc0,0x0f,0x00,0x78,0x03,0xc0,0x12,}; |  | ||||||
| const uint8_t *_I_url3[] = {_I_url3_0}; |  | ||||||
| 
 |  | ||||||
| const uint8_t _I_url4_0[] = {0x01,0x00,0x31,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xe6,0x7c,0x08,0x18,0x0c,0x07,0x50,0x04,0x23,0x98,0x83,0xd2,0x8e,0x0f,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0x38,0x3c,0x70,0x1a,0xea,0x47,0x1f,0x73,0x33,0xd2,0x73,0xb8,0x39,0x98,0x27,0x43,0xff,0xf9,0xfe,0x03,0xc7,0x79,0x48,0x94,0xc9,0x69,0x3a,0xca,0x94,0x8b,0x4b,0x04,0xf8,0x7f,0xf1,0xdf,0xb0,0x78,0xe3,0xc1,0xe5,0x79,0xd2,0x03,0xc7,0x7a,0x0f,0x1b,0xff,0xef,0xee,0x0f,0x1c,0xf0,0x3c,0xa1,0x20,0xf2,0xc2,0x83,0xc7,0x7f,0x1d,0xf7,0x83,0xc7,0xbd,0x70,0xe3,0xce,0x66,0x3a,0x5e,0x77,0x26,0x33,0x03,0x07,0x8f,0xbf,0xdc,0x5f,0x10,0x08,0x96,0x44,0x00,0x34,0x20,0x19,0x7c,0x3b,0xff,0xfe,0xf1,0xfc,0xc1,0xef,0xc0,0xef,0xdf,0xc0,0x22,0x9f,0xa0,0x78,0xef,0xc1,0xfd,0xff,0x0f,0xf8,0x3e,0x3f,0x0b,0xa1,0x80,0xd0,0x37,0xff,0xf3,0x78,0x83,0xda,0x0c,0x02,0x18,0x16,0x80,0x1f,0x50,0x30,0x10,0xaf,0xc6,0xff,0xff,0xf3,0x83,0xed,0x7e,0x3f,0xee,0x18,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0x38,0x00,0x7b,0xc8,0xe9,0x51,0x80,0x79,0x41,0xe0,0xe0,0xf8,0x95,0x4e,0x01,0xe5,0xff,0x87,0xdf,0x81,0xef,0x1a,0xbc,0x03,0xce,0x3f,0x7c,0x0f,0xec,0xfe,0xf0,0x3f,0xcf,0xfd,0xfc,0x1e,0xe5,0xf5,0x00,0x08,0x3d,0xcf,0xea,0x20,0x20,0x7f,0x83,0xda,0x0e,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x07,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x01,0xe0,0x0f,0x00,0x78,0x02,0x40,}; |  | ||||||
| const uint8_t *_I_url4[] = {_I_url4_0}; |  | ||||||
| 
 | 
 | ||||||
| const uint8_t _I_125_10px_0[] = {0x00,0xE0,0x00,0x00,0x01,0x0E,0x02,0x31,0x02,0x45,0x02,0x91,0x00,0xAA,0x00,0x92,0x00,0x44,0x00,0x38,0x00,}; | const uint8_t _I_125_10px_0[] = {0x00,0xE0,0x00,0x00,0x01,0x0E,0x02,0x31,0x02,0x45,0x02,0x91,0x00,0xAA,0x00,0x92,0x00,0x44,0x00,0x38,0x00,}; | ||||||
| const uint8_t *_I_125_10px[] = {_I_125_10px_0}; | const uint8_t *_I_125_10px[] = {_I_125_10px_0}; | ||||||
| @ -675,34 +617,8 @@ const uint8_t *_I_iButtonKey_49x44[] = {_I_iButtonKey_49x44_0}; | |||||||
| 
 | 
 | ||||||
| const Icon I_Certification1_103x23 = {.width=103,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Certification1_103x23}; | const Icon I_Certification1_103x23 = {.width=103,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Certification1_103x23}; | ||||||
| const Icon I_Certification2_119x30 = {.width=119,.height=30,.frame_count=1,.frame_rate=0,.frames=_I_Certification2_119x30}; | const Icon I_Certification2_119x30 = {.width=119,.height=30,.frame_count=1,.frame_rate=0,.frames=_I_Certification2_119x30}; | ||||||
| const Icon I_card_bad1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_bad1}; | const Icon A_Levelup1_128x64 = {.width=128,.height=64,.frame_count=11,.frame_rate=2,.frames=_A_Levelup1_128x64}; | ||||||
| const Icon I_card_bad2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_bad2}; | const Icon A_Levelup2_128x64 = {.width=128,.height=64,.frame_count=11,.frame_rate=2,.frames=_A_Levelup2_128x64}; | ||||||
| const Icon I_card_ok1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok1}; |  | ||||||
| const Icon I_card_ok2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok2}; |  | ||||||
| const Icon I_card_ok3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok3}; |  | ||||||
| const Icon I_card_ok4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok4}; |  | ||||||
| const Icon I_no_databases1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases1}; |  | ||||||
| const Icon I_no_databases2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases2}; |  | ||||||
| const Icon I_no_databases3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases3}; |  | ||||||
| const Icon I_no_databases4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases4}; |  | ||||||
| const Icon I_no_sd1 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd1}; |  | ||||||
| const Icon I_no_sd2 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd2}; |  | ||||||
| const Icon I_no_sd3 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd3}; |  | ||||||
| const Icon I_no_sd4 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd4}; |  | ||||||
| const Icon I_no_sd5 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd5}; |  | ||||||
| const Icon I_no_sd6 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd6}; |  | ||||||
| const Icon I_tv1 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv1}; |  | ||||||
| const Icon I_tv2 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv2}; |  | ||||||
| const Icon I_tv3 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv3}; |  | ||||||
| const Icon I_tv4 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv4}; |  | ||||||
| const Icon I_tv5 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv5}; |  | ||||||
| const Icon I_tv6 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv6}; |  | ||||||
| const Icon I_tv7 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv7}; |  | ||||||
| const Icon I_tv8 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv8}; |  | ||||||
| const Icon I_url1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url1}; |  | ||||||
| const Icon I_url2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url2}; |  | ||||||
| const Icon I_url3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url3}; |  | ||||||
| const Icon I_url4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url4}; |  | ||||||
| const Icon I_125_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_125_10px}; | const Icon I_125_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_125_10px}; | ||||||
| const Icon I_Nfc_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Nfc_10px}; | const Icon I_Nfc_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Nfc_10px}; | ||||||
| const Icon I_ble_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ble_10px}; | const Icon I_ble_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ble_10px}; | ||||||
|  | |||||||
| @ -3,34 +3,8 @@ | |||||||
| 
 | 
 | ||||||
| extern const Icon I_Certification1_103x23; | extern const Icon I_Certification1_103x23; | ||||||
| extern const Icon I_Certification2_119x30; | extern const Icon I_Certification2_119x30; | ||||||
| extern const Icon I_card_bad1; | extern const Icon A_Levelup1_128x64; | ||||||
| extern const Icon I_card_bad2; | extern const Icon A_Levelup2_128x64; | ||||||
| extern const Icon I_card_ok1; |  | ||||||
| extern const Icon I_card_ok2; |  | ||||||
| extern const Icon I_card_ok3; |  | ||||||
| extern const Icon I_card_ok4; |  | ||||||
| extern const Icon I_no_databases1; |  | ||||||
| extern const Icon I_no_databases2; |  | ||||||
| extern const Icon I_no_databases3; |  | ||||||
| extern const Icon I_no_databases4; |  | ||||||
| extern const Icon I_no_sd1; |  | ||||||
| extern const Icon I_no_sd2; |  | ||||||
| extern const Icon I_no_sd3; |  | ||||||
| extern const Icon I_no_sd4; |  | ||||||
| extern const Icon I_no_sd5; |  | ||||||
| extern const Icon I_no_sd6; |  | ||||||
| extern const Icon I_tv1; |  | ||||||
| extern const Icon I_tv2; |  | ||||||
| extern const Icon I_tv3; |  | ||||||
| extern const Icon I_tv4; |  | ||||||
| extern const Icon I_tv5; |  | ||||||
| extern const Icon I_tv6; |  | ||||||
| extern const Icon I_tv7; |  | ||||||
| extern const Icon I_tv8; |  | ||||||
| extern const Icon I_url1; |  | ||||||
| extern const Icon I_url2; |  | ||||||
| extern const Icon I_url3; |  | ||||||
| extern const Icon I_url4; |  | ||||||
| extern const Icon I_125_10px; | extern const Icon I_125_10px; | ||||||
| extern const Icon I_Nfc_10px; | extern const Icon I_Nfc_10px; | ||||||
| extern const Icon I_ble_10px; | extern const Icon I_ble_10px; | ||||||
|  | |||||||
							
								
								
									
										81
									
								
								assets/dolphin/ReadMe.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								assets/dolphin/ReadMe.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | |||||||
|  | # Dolphin assets | ||||||
|  | 
 | ||||||
|  | Dolphin assets are split into 3 parts: | ||||||
|  | 
 | ||||||
|  | - essential - Essential animations that are used for blocking system notifications. They are packed to `assets_dolphin_essential.[h,c]`. | ||||||
|  | - internal  - Internal animations that are used for idle dolphin animation. Converted to `assets_dolphin_internal.[h,c]`. | ||||||
|  | - external  - External animations that are used for idle dolphin animation. Packed to resource folder and placed on SD card. | ||||||
|  | 
 | ||||||
|  | # Files | ||||||
|  | 
 | ||||||
|  | - `manifest.txt` - contains animations enumeration that is used for random animation selection. Starting point for Dolphin. | ||||||
|  | - `meta.txt`     - contains data that describes how animation is drawn. | ||||||
|  | - `frame_X.bm`   - Flipper Compressed Bitmap. | ||||||
|  | 
 | ||||||
|  | ## File manifest.txt | ||||||
|  | 
 | ||||||
|  | Flipper Format File with ordered keys. | ||||||
|  | 
 | ||||||
|  | Header: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | Filetype: Flipper Animation Manifest | ||||||
|  | Version: 1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - `Name` - name of animation. Must be exact animation directory name. | ||||||
|  | - `Min butthurt`, `Max butthurt` - range of dolphin's butthurt for this animation. | ||||||
|  | - `Min level`, `Max level` - range of dolphin's level for this animation. If 0, this animation doesn't participate in random idle animation selection and can only be selected by exact name. | ||||||
|  | - `Weight` - chance of this animation to be choosen at random animation selection. | ||||||
|  | 
 | ||||||
|  | Some animations can be excluded from participation in random animation selection, such as `L1_NoSd_128x49`. | ||||||
|  | 
 | ||||||
|  | ## File meta.txt | ||||||
|  | 
 | ||||||
|  | Flipper Format File with ordered keys. | ||||||
|  | 
 | ||||||
|  | Header: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | Filetype: Flipper Animation | ||||||
|  | Version: 1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - `Width` - animation width in px (<= 128) | ||||||
|  | - `Height` - animation height in px (<= 64) | ||||||
|  | - `Passive frames` - number of bitmap frames for passive animation state | ||||||
|  | - `Active frames` - number of bitmap frames for active animation state (can be 0) | ||||||
|  | - `Frames order` - order of bitmap frames where first N frames are passive and following M are active. Each X number in order refers to bitmap frame, with name frame\_X.bm. This file must exist. Any X number can be repeated to refer same frame in animation. | ||||||
|  | - `Active cycles` - cycles to repeat of N active frames for full active period. E.g. if frames for active cycles are 6 and 7, and active cycles is 3, so full active period plays 6 7 6 7 6 7. Full period of passive + active period are called *total period*. | ||||||
|  | - `Frame rate` - number of frames to play for 1 second. | ||||||
|  | - `Duration` - total amount of seconds to play 1 animation. | ||||||
|  | - `Active cooldown` - amount of seconds (after passive mode) to pass before entering next active mode. | ||||||
|  | 
 | ||||||
|  | - `Bubble slots` - amount of bubble sequences. | ||||||
|  | - Any bubble sequence plays whole sequence during active mode. There can be many bubble sequences and bubbles inside it. Bubbles in 1 bubble sequence have to reside in 1 slot. Bubbles order in 1 bubble sequence is determined by occurance in file. As soon as frame index goes out of EndFrame index of bubble - next animation bubble is choosen. There can also be free of bubbles frames between 2 bubbles. | ||||||
|  | 
 | ||||||
|  | - `Slot` - number to unite bubbles for same sequence. | ||||||
|  | - `X`, `Y` - are coordinates of left top corner of bubble. | ||||||
|  | - `Text` - text in bubble. New line is `\n` | ||||||
|  | - `AlignH` - horizontal place of bubble corner (Left, Center, Right) | ||||||
|  | - `AlignV` - vertical place of bubble corner (Top, Center, Bottom) | ||||||
|  | - `StartFrame`, `EndFrame` - frame index range inside whole period to show bubble. | ||||||
|  | 
 | ||||||
|  | ### Understanding of frame indexes | ||||||
|  | 
 | ||||||
|  | For example we have | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | Passive frames: 6 | ||||||
|  | Active frames: 2 | ||||||
|  | Frames order: 0 1 2 3 4 5 6 7 | ||||||
|  | Active cycles: 4 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then we have indexes | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  |                         passive(6)            active (2 * 4) | ||||||
|  | Real frames order:   0  1  2  3  4  5     6  7  6  7  6  7  6  7 | ||||||
|  | Frames indexes:      0  1  2  3  4  5     6  7  8  9  10 11 12 13 | ||||||
|  | ``` | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.7 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.7 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.7 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.7 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.7 KiB | 
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Albert Kharisov
						Albert Kharisov