From d42977ea9b9a478d94370cc7659c70e853c181a7 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Sat, 7 Jan 2023 13:15:12 +0100 Subject: [PATCH 01/64] Release candidate passed QC --- fbt_options.py | 2 +- scripts/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fbt_options.py b/fbt_options.py index ab917ac2c..a54f2595f 100644 --- a/fbt_options.py +++ b/fbt_options.py @@ -14,7 +14,7 @@ DEBUG = 0 # Suffix to add to files when building distribution # If OS environment has DIST_SUFFIX set, it will be used instead -DIST_SUFFIX = "XFW-0036_12312022" +DIST_SUFFIX = "XFW-0037_01072023" # Coprocessor firmware COPRO_OB_DATA = "scripts/ob.data" diff --git a/scripts/version.py b/scripts/version.py index f003cc256..74c2f4a04 100644 --- a/scripts/version.py +++ b/scripts/version.py @@ -14,7 +14,7 @@ class GitVersion: self.gitlist = [("commit", "rev-parse --short HEAD"), ("branch", "rev-parse --abbrev-ref") , ("branch_num", "rev-list -count HEAD")] def get_version_info(self): - commit = branch = branch_num = "XFW-0036" + commit = branch = branch_num = "XFW-0037" # We dont use an `or` in commands that we expect to fail. It will serve no function. # We also dont try;exept an entire block of code. This is bad practise. We only try the single part that we expect to fail! From 8366cd4edbf2c04f22f9cf2f002e1233729797eb Mon Sep 17 00:00:00 2001 From: jbohack Date: Sat, 7 Jan 2023 21:51:28 -0500 Subject: [PATCH 02/64] added lowes & walgreens subghz playlist files --- assets/resources/subghz/playlist/Lowes_playlist.txt | 7 +++++++ assets/resources/subghz/playlist/Walgreens_playlist.txt | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 assets/resources/subghz/playlist/Lowes_playlist.txt create mode 100644 assets/resources/subghz/playlist/Walgreens_playlist.txt diff --git a/assets/resources/subghz/playlist/Lowes_playlist.txt b/assets/resources/subghz/playlist/Lowes_playlist.txt new file mode 100644 index 000000000..b0909e441 --- /dev/null +++ b/assets/resources/subghz/playlist/Lowes_playlist.txt @@ -0,0 +1,7 @@ +# Lowes Playlist +sub: /ext/subghz/Stores/Lowes/Packaged_Rugs.sub +sub: /ext/subghz/Stores/Lowes/Outdoor_Power_Equipment_Desk.sub +sub: /ext/subghz/Stores/Lowes/Flooring_Desk.sub +sub: /ext/subghz/Stores/Lowes/Electrical.sub +sub: /ext/subghz/Stores/Lowes/Blind_Cutting.sub +sub: /ext/subghz/Stores/Lowes/Appliance_Desk.sub \ No newline at end of file diff --git a/assets/resources/subghz/playlist/Walgreens_playlist.txt b/assets/resources/subghz/playlist/Walgreens_playlist.txt new file mode 100644 index 000000000..2671e1584 --- /dev/null +++ b/assets/resources/subghz/playlist/Walgreens_playlist.txt @@ -0,0 +1,4 @@ +# Walgreens Playlist +sub: /ext/subghz/Stores/Walgreens/Walgreens_Cough.sub +sub: /ext/subghz/Stores/Walgreens/Walgreens_Skincare.sub +sub: /ext/subghz/Stores/Walgreens/Walgreens_Vitamin.sub \ No newline at end of file From 16e1c71041b59e7a21211e7a0ca0e79f658f80a2 Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 01:07:44 -0500 Subject: [PATCH 03/64] removed sfw mode from settings --> desktop since it is accessible from quick menu --- .../scenes/desktop_settings_scene_start.c | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 6e5c72624..9124ce287 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -10,7 +10,6 @@ #define SCENE_EVENT_SELECT_PIN_SETUP 2 #define SCENE_EVENT_SELECT_AUTO_LOCK_DELAY 3 #define SCENE_EVENT_SELECT_BATTERY_DISPLAY 4 -#define SCENE_EVENT_SELECT_SFWMODE 5 #define AUTO_LOCK_DELAY_COUNT 9 const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { @@ -39,14 +38,6 @@ const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = {0, 1, 2, 3, uint8_t origBattDisp_value = 0; -#define SFWMODE_COUNT 2 -const char* const sfwmode_text[SFWMODE_COUNT] = { - "OFF", - "ON", -}; - -const uint32_t sfwmode_value[SFWMODE_COUNT] = {0, 1}; - static void desktop_settings_scene_start_var_list_enter_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); @@ -68,14 +59,6 @@ static void desktop_settings_scene_start_battery_view_changed(VariableItem* item app->settings.displayBatteryPercentage = index; } -static void desktop_settings_scene_start_sfwmode_changed(VariableItem* item) { - DesktopSettingsApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, sfwmode_text[index]); - app->settings.is_sfwmode = sfwmode_value[index]; -} - void desktop_settings_scene_start_on_enter(void* context) { DesktopSettingsApp* app = context; VariableItemList* variable_item_list = app->variable_item_list; @@ -118,17 +101,6 @@ void desktop_settings_scene_start_on_enter(void* context) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, battery_view_count_text[value_index]); - item = variable_item_list_add( - variable_item_list, - "SFW Content Only", - SFWMODE_COUNT, - desktop_settings_scene_start_sfwmode_changed, - app); - - value_index = value_index_uint32(app->settings.is_sfwmode, sfwmode_value, SFWMODE_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, sfwmode_text[value_index]); - variable_item_list_set_enter_callback( variable_item_list, desktop_settings_scene_start_var_list_enter_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewVarItemList); @@ -165,9 +137,6 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent sme) case SCENE_EVENT_SELECT_BATTERY_DISPLAY: consumed = true; break; - case SCENE_EVENT_SELECT_SFWMODE: - consumed = true; - break; } } return consumed; From a17006580448e4cfbf031ad4335a968a90d1606e Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 04:19:36 -0500 Subject: [PATCH 04/64] added pong & asteroids https://github.com/antirez/flipper-asteroids https://github.com/nmrr/flipperzero-pong --- applications/plugins/asteroids/app.c | 689 ++++++++++++++++++ applications/plugins/asteroids/appicon.png | Bin 0 -> 145 bytes .../plugins/asteroids/application.fam | 12 + applications/plugins/pong/application.fam | 13 + applications/plugins/pong/flipper_pong.c | 298 ++++++++ applications/plugins/pong/pong.png | Bin 0 -> 6459 bytes 6 files changed, 1012 insertions(+) create mode 100644 applications/plugins/asteroids/app.c create mode 100644 applications/plugins/asteroids/appicon.png create mode 100644 applications/plugins/asteroids/application.fam create mode 100644 applications/plugins/pong/application.fam create mode 100644 applications/plugins/pong/flipper_pong.c create mode 100644 applications/plugins/pong/pong.png diff --git a/applications/plugins/asteroids/app.c b/applications/plugins/asteroids/app.c new file mode 100644 index 000000000..1a3945fd7 --- /dev/null +++ b/applications/plugins/asteroids/app.c @@ -0,0 +1,689 @@ +/* Copyright (C) 2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef PI +#define PI 3.14159265358979f +#endif + +#define TAG "Asteroids" // Used for logging +#define DEBUG_MSG 1 +#define SCREEN_XRES 128 +#define SCREEN_YRES 64 +#define GAME_START_LIVES 3 + +/* The game uses the OK button both to fire and to accelerate the ship. + * This makes it a lot more playable since the finger does not have to + * move between two keys. However it is important that the extra time the + * player needs to press the button to accelerate instead of just firing + * is precisely selected to provide a smooth experience. After a few + * attempts, it looks like 70 milliseconds is the right spot. */ +#define SHIP_ACCELERATION_KEYPRESS_TIME 70 + +/* ============================ Data structures ============================= */ + +typedef struct Ship { + float x, /* Ship x position. */ + y, /* Ship y position. */ + vx, /* x velocity. */ + vy, /* y velocity. */ + rot; /* Current rotation. 2*PI full rotation. */ +} Ship; + +typedef struct Bullet { + float x, y, vx, vy; /* Fields like in ship. */ + uint32_t ttl; /* Time to live, in ticks. */ +} Bullet; + +typedef struct Asteroid { + float x, y, vx, vy, rot, /* Fields like ship. */ + rot_speed, /* Angular velocity (rot speed and sense). */ + size; /* Asteroid size. */ + uint8_t shape_seed; /* Seed to give random shape. */ +} Asteroid; + +#define MAXBUL 10 /* Max bullets on the screen. */ +#define MAXAST 32 /* Max asteroids on the screen. */ +#define SHIP_HIT_ANIMATION_LEN 15 +typedef struct AsteroidsApp { + /* GUI */ + Gui *gui; + ViewPort *view_port; /* We just use a raw viewport and we render + everything into the low level canvas. */ + FuriMessageQueue *event_queue; /* Key press events go here. */ + + /* Game state. */ + int running; /* Once false exists the app. */ + bool gameover; /* Game over status. */ + uint32_t ticks; /* Game ticks. Increments at each refresh. */ + uint32_t score; /* Game score. */ + uint32_t lives; /* Number of lives in the current game. */ + uint32_t ship_hit; /* When non zero, the ship was hit by an asteroid + and we need to show an animation as long as + its value is non-zero (and decrease it's value + at each tick of animation). */ + + /* Ship state. */ + struct Ship ship; + + /* Bullets state. */ + struct Bullet bullets[MAXBUL]; /* Each bullet state. */ + int bullets_num; /* Active bullets. */ + uint32_t last_bullet_tick; /* Tick the last bullet was fired. */ + + /* Asteroids state. */ + Asteroid asteroids[MAXAST]; /* Each asteroid state. */ + int asteroids_num; /* Active asteroids. */ + + uint32_t pressed[InputKeyMAX]; /* pressed[id] is true if pressed. + Each array item contains the time + in milliseconds the key was pressed. */ + bool fire; /* Short press detected: fire a bullet. */ +} AsteroidsApp; + +/* ============================== Prototypes ================================ */ + +// Only functions called before their definition are here. + +void restart_game_after_gameover(AsteroidsApp *app); +uint32_t key_pressed_time(AsteroidsApp *app, InputKey key); + +/* ============================ 2D drawing ================================== */ + +/* This structure represents a polygon of at most POLY_MAX points. + * The function draw_poly() is able to render it on the screen, rotated + * by the amount specified. */ +#define POLY_MAX 8 +typedef struct Poly { + float x[POLY_MAX]; + float y[POLY_MAX]; + uint32_t points; /* Number of points actually populated. */ +} Poly; + +/* Define the polygons we use. */ +Poly ShipPoly = { + {-3, 0, 3}, + {-3, 6, -3}, + 3 +}; + +Poly ShipFirePoly = { + {-1.5, 0, 1.5}, + {-3, -6, -3}, + 3 +}; + +/* Rotate the point of the polygon 'poly' and store the new rotated + * polygon in 'rot'. The polygon is rotated by an angle 'a', with + * center at 0,0. */ +void rotate_poly(Poly *rot, Poly *poly, float a) { + /* We want to compute sin(a) and cos(a) only one time + * for every point to rotate. It's a slow operation. */ + float sin_a = (float)sin(a); + float cos_a = (float)cos(a); + for (uint32_t j = 0; j < poly->points; j++) { + rot->x[j] = poly->x[j]*cos_a - poly->y[j]*sin_a; + rot->y[j] = poly->y[j]*cos_a + poly->x[j]*sin_a; + } + rot->points = poly->points; +} + +/* This is an 8 bit LFSR we use to generate a predictable and fast + * pseudorandom sequence of numbers, to give a different shape to + * each asteroid. */ +void lfsr_next(unsigned char *prev) { + unsigned char lsb = *prev & 1; + *prev = *prev >> 1; + if (lsb == 1) *prev ^= 0b11000111; + *prev ^= *prev<<7; /* Mix things a bit more. */ +} + +/* Render the polygon 'poly' at x,y, rotated by the specified angle. */ +void draw_poly(Canvas *const canvas, Poly *poly, uint8_t x, uint8_t y, float a) +{ + Poly rot; + rotate_poly(&rot,poly,a); + canvas_set_color(canvas, ColorBlack); + for (uint32_t j = 0; j < rot.points; j++) { + uint32_t a = j; + uint32_t b = j+1; + if (b == rot.points) b = 0; + canvas_draw_line(canvas,x+rot.x[a],y+rot.y[a], + x+rot.x[b],y+rot.y[b]); + } +} + +/* A bullet is just a + pixels pattern. A single pixel is not + * visible enough. */ +void draw_bullet(Canvas *const canvas, Bullet *b) { + canvas_draw_dot(canvas,b->x-1,b->y); + canvas_draw_dot(canvas,b->x+1,b->y); + canvas_draw_dot(canvas,b->x,b->y); + canvas_draw_dot(canvas,b->x,b->y-1); + canvas_draw_dot(canvas,b->x,b->y+1); +} + +/* Draw an asteroid. The asteroid shapes is computed on the fly and + * is not stored in a permanent shape structure. In order to generate + * the shape, we use an initial fixed shape that we resize according + * to the asteroid size, perturbed according to the asteroid shape + * seed, and finally draw it rotated of the right amount. */ +void draw_asteroid(Canvas *const canvas, Asteroid *ast) { + Poly ap; + + /* Start with what is kinda of a circle. Note that this could be + * stored into a template and copied here, to avoid computing + * sin() / cos(). But the Flipper can handle it without problems. */ + uint8_t r = ast->shape_seed; + for (int j = 0; j < 8; j++) { + float a = (PI*2)/8*j; + + /* Before generating the point, to make the shape unique generate + * a random factor between .7 and 1.3 to scale the distance from + * the center. However this asteroid should have its unique shape + * that remains always the same, so we use a predictable PRNG + * implemented by an 8 bit shift register. */ + lfsr_next(&r); + float scaling = .7+((float)r/255*.6); + + ap.x[j] = (float)sin(a) * ast->size * scaling; + ap.y[j] = (float)cos(a) * ast->size * scaling; + } + ap.points = 8; + draw_poly(canvas,&ap,ast->x,ast->y,ast->rot); +} + +/* Draw small ships in the top-right part of the screen, one for + * each left live. */ +void draw_left_lives(Canvas *const canvas, AsteroidsApp *app) { + int lives = app->lives; + int x = SCREEN_XRES-5; + + Poly mini_ship = { + {-2, 0, 2}, + {-2, 4, -2}, + 3 + }; + while(lives--) { + draw_poly(canvas,&mini_ship,x,6,PI); + x -= 6; + } +} + +/* Given the current position, update it according to the velocity and + * wrap it back to the other side if the object went over the screen. */ +void update_pos_by_velocity(float *x, float *y, float vx, float vy) { + /* Return back from one side to the other of the screen. */ + *x += vx; + *y += vy; + if (*x >= SCREEN_XRES) *x = 0; + else if (*x < 0) *x = SCREEN_XRES-1; + if (*y >= SCREEN_YRES) *y = 0; + else if (*y < 0) *y = SCREEN_YRES-1; +} + +/* Render the current game screen. */ +void render_callback(Canvas *const canvas, void *ctx) { + AsteroidsApp *app = ctx; + + /* Clear screen. */ + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 0, 0, SCREEN_XRES-1, SCREEN_YRES-1); + + /* Draw score. */ + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + char score[32]; + snprintf(score,sizeof(score),"%lu",app->score); + canvas_draw_str(canvas, 0, 8, score); + + /* Draw left ships. */ + draw_left_lives(canvas,app); + + /* Draw ship, asteroids, bullets. */ + draw_poly(canvas,&ShipPoly,app->ship.x,app->ship.y,app->ship.rot); + if (key_pressed_time(app,InputKeyOk) > SHIP_ACCELERATION_KEYPRESS_TIME) + draw_poly(canvas,&ShipFirePoly,app->ship.x,app->ship.y,app->ship.rot); + + for (int j = 0; j < app->bullets_num; j++) + draw_bullet(canvas,&app->bullets[j]); + + for (int j = 0; j < app->asteroids_num; j++) + draw_asteroid(canvas,&app->asteroids[j]); + + /* Game over text. */ + if (app->gameover) { + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 28, 35, "GAME OVER"); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 25, 50, "Press OK to restart"); + } +} + +/* ============================ Game logic ================================== */ + +float distance(float x1, float y1, float x2, float y2) { + float dx = x1-x2; + float dy = y1-y2; + return sqrt(dx*dx+dy*dy); +} + +/* Detect a collision between the object at x1,y1 of radius r1 and + * the object at x2, y2 of radius r2. A factor < 1 will make the + * function detect the collision even if the objects are yet not + * relly touching, while a factor > 1 will make it detect the collision + * only after they are a bit overlapping. It basically is used to + * rescale the distance. + * + * Note that in this simplified 2D world, objects are all considered + * spheres (this is why this function only takes the radius). This + * is, after all, kinda accurate for asteroids, for bullets, and + * even for the ship "core" itself. */ +bool objects_are_colliding(float x1, float y1, float r1, + float x2, float y2, float r2, + float factor) +{ + /* The objects are colliding if the distance between object 1 and 2 + * is smaller than the sum of the two radiuses r1 and r2. + * So it would be like: sqrt((x1-x2)^2+(y1-y2)^2) < r1+r2. + * However we can avoid computing the sqrt (which is slow) by + * squaring the second term and removing the square root, making + * the comparison like this: + * + * (x1-x2)^2+(y1-y2)^2 < (r1+r2)^2. */ + float dx = (x1-x2)*factor; + float dy = (y1-y2)*factor; + float rsum = r1+r2; + return dx*dx+dy*dy < rsum*rsum; +} + +/* Create a new bullet headed in the same direction of the ship. */ +void ship_fire_bullet(AsteroidsApp *app) { + if (app->bullets_num == MAXBUL) return; + Bullet *b = &app->bullets[app->bullets_num]; + b->x = app->ship.x; + b->y = app->ship.y; + b->vx = -sin(app->ship.rot); + b->vy = cos(app->ship.rot); + + /* Ship should fire from its head, not in the middle. */ + b->x += b->vx*5; + b->y += b->vy*5; + + /* Give the bullet some velocity (for now the vector is just + * normalized to 1). */ + b->vx *= 3; + b->vy *= 3; + + /* It's more realistic if we add the velocity vector of the + * ship, too. Otherwise if the ship is going fast the bullets + * will be slower, which is not how the world works. */ + b->vx += app->ship.vx; + b->vy += app->ship.vy; + + b->ttl = 50; /* The bullet will disappear after N ticks. */ + app->bullets_num++; +} + +/* Remove the specified bullet by id (index in the array). */ +void remove_bullet(AsteroidsApp *app, int bid) { + /* Replace the top bullet with the empty space left + * by the removal of this bullet. This way we always take the + * array dense, which is an advantage when looping. */ + int n = --app->bullets_num; + if (n && bid != n) app->bullets[bid] = app->bullets[n]; +} + +/* Create a new asteroid, away from the ship. Return the + * pointer to the asteroid object, so that the caller can change + * certain things of the asteroid if needed. */ +Asteroid *add_asteroid(AsteroidsApp *app) { + if (app->asteroids_num == MAXAST) return NULL; + float size = 4+rand()%15; + float min_distance = 20; + float x,y; + do { + x = rand() % SCREEN_XRES; + y = rand() % SCREEN_YRES; + } while(distance(app->ship.x,app->ship.y,x,y) < min_distance+size); + Asteroid *a = &app->asteroids[app->asteroids_num++]; + a->x = x; + a->y = y; + a->vx = 2*(-.5 + ((float)rand()/RAND_MAX)); + a->vy = 2*(-.5 + ((float)rand()/RAND_MAX)); + a->size = size; + a->rot = 0; + a->rot_speed = ((float)rand()/RAND_MAX)/10; + if (app->ticks & 1) a->rot_speed = -(a->rot_speed); + a->shape_seed = rand() & 255; + return a; +} + +/* Remove the specified asteroid by id (index in the array). */ +void remove_asteroid(AsteroidsApp *app, int id) { + /* Replace the top asteroid with the empty space left + * by the removal of this one. This way we always take the + * array dense, which is an advantage when looping. */ + int n = --app->asteroids_num; + if (n && id != n) app->asteroids[id] = app->asteroids[n]; +} + +/* Called when an asteroid was reached by a bullet. The asteroid + * hit is the one with the specified 'id'. */ +void asteroid_was_hit(AsteroidsApp *app, int id) { + float sizelimit = 6; // Smaller than that, they disappear in one shot. + Asteroid *a = &app->asteroids[id]; + + /* Asteroid is large enough to break into fragments. */ + float size = a->size; + float x = a->x, y = a->y; + remove_asteroid(app,id); + if (size > sizelimit) { + int max_fragments = size / sizelimit; + int fragments = 2+rand()%max_fragments; + float newsize = size/fragments; + if (newsize < 2) newsize = 2; + for (int j = 0; j < fragments; j++) { + a = add_asteroid(app); + if (a == NULL) break; // Too many asteroids on screen. + a->x = x + -(size/2) + rand() % (int)newsize; + a->y = y + -(size/2) + rand() % (int)newsize; + a->size = newsize; + } + } else { + app->score++; + } +} + +/* Set game over state. When in game-over mode, the game displays a + * game over text with a background of many asteroids floating around. */ +void game_over(AsteroidsApp *app) { + restart_game_after_gameover(app); + app->gameover = true; + int asteroids = 8; + while(asteroids-- && add_asteroid(app) != NULL); +} + +/* Function called when a collision between the asteroid and the + * ship is detected. */ +void ship_was_hit(AsteroidsApp *app) { + app->ship_hit = SHIP_HIT_ANIMATION_LEN; + if (app->lives) { + app->lives--; + } else { + game_over(app); + } +} + +/* Restart game after the ship is hit. Will reset the ship position, bullets + * and asteroids to restart the game. */ +void restart_game(AsteroidsApp *app) { + app->ship.x = SCREEN_XRES / 2; + app->ship.y = SCREEN_YRES / 2; + app->ship.rot = PI; /* Start headed towards top. */ + app->ship.vx = 0; + app->ship.vy = 0; + app->bullets_num = 0; + app->last_bullet_tick = 0; + app->asteroids_num = 0; +} + +/* Called after game over to restart the game. This function + * also calls restart_game(). */ +void restart_game_after_gameover(AsteroidsApp *app) { + app->gameover = false; + app->ticks = 0; + app->score = 0; + app->ship_hit = 0; + app->lives = GAME_START_LIVES-1; /* -1 to account for current one. */ + restart_game(app); +} + +/* Move bullets. */ +void update_bullets_position(AsteroidsApp *app) { + for (int j = 0; j < app->bullets_num; j++) { + update_pos_by_velocity(&app->bullets[j].x,&app->bullets[j].y, + app->bullets[j].vx,app->bullets[j].vy); + if (--app->bullets[j].ttl == 0) { + remove_bullet(app,j); + j--; /* Process this bullet index again: the removal will + fill it with the top bullet to take the array dense. */ + } + } +} + +/* Move asteroids. */ +void update_asteroids_position(AsteroidsApp *app) { + for (int j = 0; j < app->asteroids_num; j++) { + update_pos_by_velocity(&app->asteroids[j].x,&app->asteroids[j].y, + app->asteroids[j].vx,app->asteroids[j].vy); + app->asteroids[j].rot += app->asteroids[j].rot_speed; + if (app->asteroids[j].rot < 0) app->asteroids[j].rot = 2*PI; + else if (app->asteroids[j].rot > 2*PI) app->asteroids[j].rot = 0; + } +} + +/* Collision detection and game state update based on collisions. */ +void detect_collisions(AsteroidsApp *app) { + /* Detect collision between bullet and asteroid. */ + for (int j = 0; j < app->bullets_num; j++) { + Bullet *b = &app->bullets[j]; + for (int i = 0; i < app->asteroids_num; i++) { + Asteroid *a = &app->asteroids[i]; + if (objects_are_colliding(a->x, a->y, a->size, + b->x, b->y, 1.5, 1)) + { + asteroid_was_hit(app,i); + remove_bullet(app,j); + /* The bullet no longer exist. Break the loop. + * However we want to start processing from the + * same bullet index, since now it is used by + * another bullet (see remove_bullet()). */ + j--; /* Scan this j value again. */ + break; + } + } + } + + /* Detect collision between ship and asteroid. */ + for (int j = 0; j < app->asteroids_num; j++) { + Asteroid *a = &app->asteroids[j]; + if (objects_are_colliding(a->x, a->y, a->size, + app->ship.x, app->ship.y, 4, 1)) + { + ship_was_hit(app); + break; + } + } +} + +/* This is the main game execution function, called 10 times for + * second (with the Flipper screen latency, an higher FPS does not + * make sense). In this function we update the position of objects based + * on velocity. Detect collisions. Update the score and so forth. + * + * Each time this function is called, app->tick is incremented. */ +void game_tick(void *ctx) { + AsteroidsApp *app = ctx; + + /* There are two special screens: + * + * 1. Ship was hit, we frozen the game as long as ship_hit isn't zero + * again, and show an animation of a rotating ship. */ + if (app->ship_hit) { + app->ship.rot += 0.5; + app->ship_hit--; + view_port_update(app->view_port); + if (app->ship_hit == 0) { + restart_game(app); + } + return; + } else if (app->gameover) { + /* 2. Game over. We need to update only background asteroids. In this + * state the game just displays a GAME OVER text with the floating + * asteroids in background. */ + if (key_pressed_time(app,InputKeyOk) > 100) { + restart_game_after_gameover(app); + } + update_asteroids_position(app); + view_port_update(app->view_port); + return; + } + + /* Handle key presses. */ + if (app->pressed[InputKeyLeft]) app->ship.rot -= .35; + if (app->pressed[InputKeyRight]) app->ship.rot += .35; + if (key_pressed_time(app,InputKeyOk) > SHIP_ACCELERATION_KEYPRESS_TIME) { + app->ship.vx -= 0.5*(float)sin(app->ship.rot); + app->ship.vy += 0.5*(float)cos(app->ship.rot); + } else if (app->pressed[InputKeyDown]) { + app->ship.vx *= 0.75; + app->ship.vy *= 0.75; + } + + /* Fire a bullet if needed. app->fire is set in + * asteroids_update_keypress_state() since depends on exact + * pressure timing. */ + if (app->fire) { + uint32_t bullet_min_period = 200; // In milliseconds + uint32_t now = furi_get_tick(); + if (now - app->last_bullet_tick >= bullet_min_period) { + ship_fire_bullet(app); + app->last_bullet_tick = now; + } + app->fire = false; + } + + /* Update positions and detect collisions. */ + update_pos_by_velocity(&app->ship.x,&app->ship.y,app->ship.vx,app->ship.vy); + update_bullets_position(app); + update_asteroids_position(app); + detect_collisions(app); + + /* From time to time, create a new asteroid. The more asteroids + * already on the screen, the smaller probability of creating + * a new one. */ + if (app->asteroids_num == 0 || + (random() % 5000) < (30/(1+app->asteroids_num))) + { + add_asteroid(app); + } + + app->ticks++; + view_port_update(app->view_port); +} + +/* ======================== Flipper specific code =========================== */ + +/* Here all we do is putting the events into the queue that will be handled + * in the while() loop of the app entry point function. */ +void input_callback(InputEvent* input_event, void* ctx) +{ + AsteroidsApp *app = ctx; + furi_message_queue_put(app->event_queue,input_event,FuriWaitForever); +} + +/* Allocate the application state and initialize a number of stuff. + * This is called in the entry point to create the application state. */ +AsteroidsApp* asteroids_app_alloc() { + AsteroidsApp *app = malloc(sizeof(AsteroidsApp)); + + app->gui = furi_record_open(RECORD_GUI); + app->view_port = view_port_alloc(); + view_port_draw_callback_set(app->view_port, render_callback, app); + view_port_input_callback_set(app->view_port, input_callback, app); + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + app->event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + + app->running = 1; /* Turns 0 when back is pressed. */ + restart_game_after_gameover(app); + memset(app->pressed,0,sizeof(app->pressed)); + return app; +} + +/* Free what the application allocated. It is not clear to me if the + * Flipper OS, once the application exits, will be able to reclaim space + * even if we forget to free something here. */ +void asteroids_app_free(AsteroidsApp *app) { + furi_assert(app); + + // View related. + view_port_enabled_set(app->view_port, false); + gui_remove_view_port(app->gui, app->view_port); + view_port_free(app->view_port); + furi_record_close(RECORD_GUI); + furi_message_queue_free(app->event_queue); + app->gui = NULL; + + free(app); +} + +/* Return the time in milliseconds the specified key is continuously + * pressed. Or 0 if it is not pressed. */ +uint32_t key_pressed_time(AsteroidsApp *app, InputKey key) { + return app->pressed[key] == 0 ? 0 : + furi_get_tick() - app->pressed[key]; +} + +/* Handle keys interaction. */ +void asteroids_update_keypress_state(AsteroidsApp *app, InputEvent input) { + if (input.type == InputTypePress) { + app->pressed[input.key] = furi_get_tick(); + } else if (input.type == InputTypeRelease) { + uint32_t dur = key_pressed_time(app,input.key); + app->pressed[input.key] = 0; + if (dur < 200 && input.key == InputKeyOk) app->fire = true; + } +} + +int32_t asteroids_app_entry(void* p) { + UNUSED(p); + AsteroidsApp *app = asteroids_app_alloc(); + + /* Create a timer. We do data analysis in the callback. */ + FuriTimer *timer = furi_timer_alloc(game_tick, FuriTimerTypePeriodic, app); + furi_timer_start(timer, furi_kernel_get_tick_frequency() / 10); + + /* This is the main event loop: here we get the events that are pushed + * in the queue by input_callback(), and process them one after the + * other. */ + InputEvent input; + while(app->running) { + FuriStatus qstat = furi_message_queue_get(app->event_queue, &input, 100); + if (qstat == FuriStatusOk) { + if (DEBUG_MSG) FURI_LOG_E(TAG, "Main Loop - Input: type %d key %u", + input.type, input.key); + + /* Handle navigation here. Then handle view-specific inputs + * in the view specific handling function. */ + if (input.type == InputTypeShort && + input.key == InputKeyBack) + { + app->running = 0; + } else { + asteroids_update_keypress_state(app,input); + } + } else { + /* Useful to understand if the app is still alive when it + * does not respond because of bugs. */ + if (DEBUG_MSG) { + static int c = 0; c++; + if (!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); + } + } + } + + furi_timer_free(timer); + asteroids_app_free(app); + return 0; +} diff --git a/applications/plugins/asteroids/appicon.png b/applications/plugins/asteroids/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..45da095afff23ff1fc2bef96fbcf7f1aef080b1d GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>@%D6a4ABVg zoe;>!pupku_+R_7hiS&a;qkoj3XLk^#SAxGI9R++)Lbbs-(Vzj@Xa5Wa%;D}J$mI~ rn)zmy^2gWhwBNUA|LKqg|L?J#@$-JO=1CYk&{zgfS3j3^P6 +#include +#include +#include +#include +#include + +#define SCREEN_SIZE_X 128 +#define SCREEN_SIZE_Y 64 +#define FPS 20 + +#define PAD_SIZE_X 3 +#define PAD_SIZE_Y 8 +#define PLAYER1_PAD_SPEED 2 +#define PLAYER2_PAD_SPEED 2 +#define BALL_SIZE 4 + +typedef enum { + EventTypeInput, + ClockEventTypeTick, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} EventApp; + +typedef struct Players +{ + uint8_t player1_X,player1_Y,player2_X,player2_Y; + uint16_t player1_score,player2_score; + uint8_t ball_X,ball_Y,ball_X_speed,ball_Y_speed,ball_X_direction,ball_Y_direction; +} Players; + +static void draw_callback(Canvas* canvas, void* ctx) +{ + UNUSED(ctx); + Players* playersMutex = (Players*)acquire_mutex_block((ValueMutex*)ctx); + + canvas_draw_frame(canvas, 0, 0, 128, 64); + canvas_draw_box(canvas, playersMutex->player1_X, playersMutex->player1_Y, PAD_SIZE_X, PAD_SIZE_Y); + canvas_draw_box(canvas, playersMutex->player2_X, playersMutex->player2_Y, PAD_SIZE_X, PAD_SIZE_Y); + canvas_draw_box(canvas, playersMutex->ball_X, playersMutex->ball_Y, BALL_SIZE, BALL_SIZE); + + canvas_set_font(canvas, FontPrimary); + canvas_set_font_direction(canvas, CanvasDirectionBottomToTop); + char buffer[16]; + snprintf(buffer, sizeof(buffer), "%u - %u", playersMutex->player1_score, playersMutex->player2_score); + canvas_draw_str_aligned(canvas, SCREEN_SIZE_X/2+15, SCREEN_SIZE_Y/2+2, AlignCenter, AlignTop, buffer); + + release_mutex((ValueMutex*)ctx, playersMutex); +} + +static void input_callback(InputEvent* input_event, void* ctx) +{ + furi_assert(ctx); + FuriMessageQueue* event_queue = ctx; + EventApp event = {.type = EventTypeInput, .input = *input_event}; + furi_message_queue_put(event_queue, &event, FuriWaitForever); +} + +static void clock_tick(void* ctx) { + furi_assert(ctx); + FuriMessageQueue* queue = ctx; + EventApp event = {.type = ClockEventTypeTick}; + furi_message_queue_put(queue, &event, 0); +} + +bool insidePad(uint8_t x, uint8_t y, uint8_t playerX, uint8_t playerY) +{ + if (x >= playerX && x <= playerX+PAD_SIZE_X && y >= playerY && y <= playerY+PAD_SIZE_Y) return true; + return false; +} + +uint8_t changeSpeed() +{ + uint8_t randomuint8[1]; + while(1) + { + furi_hal_random_fill_buf(randomuint8,1); + randomuint8[0] &= 0b00000011; + if (randomuint8[0] >= 1) break; + } + return randomuint8[0]; +} + +uint8_t changeDirection() +{ + uint8_t randomuint8[1]; + furi_hal_random_fill_buf(randomuint8,1); + randomuint8[0] &= 0b1; + return randomuint8[0]; +} + +int32_t flipper_pong_app() +{ + EventApp event; + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(EventApp)); + + Players players; + players.player1_X = SCREEN_SIZE_X-PAD_SIZE_X-1; + players.player1_Y = SCREEN_SIZE_Y/2 - PAD_SIZE_Y/2; + players.player1_score = 0; + + players.player2_X = 1; + players.player2_Y = SCREEN_SIZE_Y/2 - PAD_SIZE_Y/2; + players.player2_score = 0; + + players.ball_X = SCREEN_SIZE_X/2 - BALL_SIZE/2; + players.ball_Y = SCREEN_SIZE_Y/2 - BALL_SIZE/2; + players.ball_X_speed = 1; + players.ball_Y_speed = 1; + players.ball_X_direction = changeDirection(); + players.ball_Y_direction = changeDirection(); + + ValueMutex state_mutex; + init_mutex(&state_mutex, &players, sizeof(Players)); + + ViewPort* view_port = view_port_alloc(); + view_port_draw_callback_set(view_port, draw_callback, &state_mutex); + view_port_input_callback_set(view_port, input_callback, event_queue); + + Gui* gui = furi_record_open(RECORD_GUI); + gui_add_view_port(gui, view_port, GuiLayerFullscreen); + + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + if (players.ball_X_direction == 0) notification_message(notification, &sequence_set_only_red_255); + else notification_message(notification, &sequence_set_only_blue_255); + + FuriTimer* timer = furi_timer_alloc(clock_tick, FuriTimerTypePeriodic, event_queue); + furi_timer_start(timer, 1000/FPS); + + while(1) + { + FuriStatus event_status = furi_message_queue_get(event_queue, &event, FuriWaitForever); + Players* playersMutex = (Players*)acquire_mutex_block(&state_mutex); + + if (event_status == FuriStatusOk) + { + if(event.type == EventTypeInput) + { + if(event.input.key == InputKeyBack) + { + release_mutex(&state_mutex, playersMutex); + notification_message(notification, &sequence_set_only_green_255); + break; + } + else if(event.input.key == InputKeyUp) + { + if (playersMutex->player1_Y >= 1+PLAYER1_PAD_SPEED) playersMutex->player1_Y -= PLAYER1_PAD_SPEED; + else playersMutex->player1_Y = 1; + } + else if(event.input.key == InputKeyDown) + { + if (playersMutex->player1_Y <= SCREEN_SIZE_Y - PAD_SIZE_Y - PLAYER1_PAD_SPEED -1) playersMutex->player1_Y += PLAYER1_PAD_SPEED; + else playersMutex->player1_Y = SCREEN_SIZE_Y - PAD_SIZE_Y - 1; + } + } + else if (event.type == ClockEventTypeTick) + { + + if (playersMutex->ball_X + BALL_SIZE/2 <= SCREEN_SIZE_X*0.35 && playersMutex->ball_X_direction == 0) + { + if (playersMutex->ball_Y + BALL_SIZE/2 < playersMutex->player2_Y + PAD_SIZE_Y/2) + { + if (playersMutex->player2_Y >= 1+PLAYER2_PAD_SPEED) playersMutex->player2_Y -= PLAYER2_PAD_SPEED; + else playersMutex->player2_Y= 1; + } + else if (playersMutex->ball_Y + BALL_SIZE/2 > playersMutex->player2_Y + PAD_SIZE_Y/2) + { + if (playersMutex->player2_Y <= SCREEN_SIZE_Y - PAD_SIZE_Y - PLAYER2_PAD_SPEED -1) playersMutex->player2_Y += PLAYER2_PAD_SPEED; + else playersMutex->player2_Y = SCREEN_SIZE_Y - PAD_SIZE_Y - 1; + } + } + + uint8_t ball_corner_X[4] = {playersMutex->ball_X, playersMutex->ball_X + BALL_SIZE, playersMutex->ball_X + BALL_SIZE, playersMutex->ball_X}; + uint8_t ball_corner_Y[4] = {playersMutex->ball_Y, playersMutex->ball_Y, playersMutex->ball_Y + BALL_SIZE, playersMutex->ball_Y + BALL_SIZE}; + bool insidePlayer1 = false, insidePlayer2 = false; + + for (int i=0;i<4;i++) + { + if (insidePad(ball_corner_X[i], ball_corner_Y[i], playersMutex->player1_X, playersMutex->player1_Y) == true) + { + insidePlayer1 = true; + break; + } + + if (insidePad(ball_corner_X[i], ball_corner_Y[i], playersMutex->player2_X, playersMutex->player2_Y) == true) + { + insidePlayer2 = true; + break; + } + } + + if (insidePlayer1 == true) + { + playersMutex->ball_X_direction = 0; + playersMutex->ball_X -= playersMutex->ball_X_speed; + playersMutex->ball_X_speed = changeSpeed(); + playersMutex->ball_Y_speed = changeSpeed(); + notification_message(notification, &sequence_set_only_red_255); + } + else if (insidePlayer2 == true) + { + playersMutex->ball_X_direction = 1; + playersMutex->ball_X += playersMutex->ball_X_speed; + playersMutex->ball_X_speed = changeSpeed(); + playersMutex->ball_Y_speed = changeSpeed(); + notification_message(notification, &sequence_set_only_blue_255); + } + else + { + if (playersMutex->ball_X_direction == 1) + { + + if (playersMutex->ball_X <= SCREEN_SIZE_X - BALL_SIZE - 1 - playersMutex->ball_X_speed) + { + playersMutex->ball_X += playersMutex->ball_X_speed; + } + else + { + playersMutex->ball_X = SCREEN_SIZE_X/2 - BALL_SIZE/2; + playersMutex->ball_Y = SCREEN_SIZE_Y/2 - BALL_SIZE/2; + playersMutex->ball_X_speed = 1; + playersMutex->ball_Y_speed = 1; + playersMutex->ball_X_direction = 0; + playersMutex->player2_score++; + notification_message(notification, &sequence_set_only_red_255); + } + } + else + { + if (playersMutex->ball_X >= 1 + playersMutex->ball_X_speed) + { + playersMutex->ball_X -= playersMutex->ball_X_speed; + } + else + { + playersMutex->ball_X = SCREEN_SIZE_X/2 - BALL_SIZE/2; + playersMutex->ball_Y = SCREEN_SIZE_Y/2 - BALL_SIZE/2; + playersMutex->ball_X_speed = 1; + playersMutex->ball_Y_speed = 1; + playersMutex->ball_X_direction = 1; + playersMutex->player1_score++; + notification_message(notification, &sequence_set_only_blue_255); + } + } + } + + if (playersMutex->ball_Y_direction == 1) + { + if (playersMutex->ball_Y <= SCREEN_SIZE_Y - BALL_SIZE - 1 - playersMutex->ball_Y_speed) + { + playersMutex->ball_Y += playersMutex->ball_Y_speed; + } + else + { + playersMutex->ball_Y = SCREEN_SIZE_Y - BALL_SIZE - 1; + playersMutex->ball_X_speed = changeSpeed(); + playersMutex->ball_Y_speed = changeSpeed(); + playersMutex->ball_Y_direction = 0; + } + } + else + { + if (playersMutex->ball_Y >= 1 + playersMutex->ball_Y_speed) + { + playersMutex->ball_Y -= playersMutex->ball_Y_speed; + } + else + { + playersMutex->ball_Y = 1; + playersMutex->ball_X_speed = changeSpeed(); + playersMutex->ball_Y_speed = changeSpeed(); + playersMutex->ball_Y_direction = 1; + } + } + } + } + + release_mutex(&state_mutex, playersMutex); + view_port_update(view_port); + } + + furi_message_queue_free(event_queue); + delete_mutex(&state_mutex); + gui_remove_view_port(gui, view_port); + view_port_free(view_port); + furi_timer_free(timer); + furi_record_close(RECORD_GUI); + furi_record_close(RECORD_NOTIFICATION); + + return 0; +} \ No newline at end of file diff --git a/applications/plugins/pong/pong.png b/applications/plugins/pong/pong.png new file mode 100644 index 0000000000000000000000000000000000000000..507ce711c0f97ee36d4c2d76800d0ba5463974da GIT binary patch literal 6459 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 literal 0 HcmV?d00001 From aaa57bcadc3ff204441f50425b0c9c5b75a732a0 Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 04:21:42 -0500 Subject: [PATCH 05/64] added pong & asteroids to the doc --- documentation/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/readme.md b/documentation/readme.md index 3a714a593..53f0011a4 100644 --- a/documentation/readme.md +++ b/documentation/readme.md @@ -124,6 +124,8 @@ $ ./fbt resources icons dolphin_ext - [Tamagotchi(By GMMan)](https://github.com/GMMan/flipperzero-tamagotch-p1) - [Video Poker (By PixlEmly)](https://github.com/PixlEmly/flipperzero-firmware-testing/blob/420/applications/VideoPoker/poker.c) - [Yatzee (By emfleak)](https://github.com/emfleak/flipperzero-yatzee) +- [Pong (By [nmrr])](https://github.com/nmrr/flipperzero-pong) +- [Asteroids (By [antirez])](https://github.com/antirez/flipper-asteroids) ## Misc From a08cb140d807981765860608c4482ce570333192 Mon Sep 17 00:00:00 2001 From: Clara K Date: Sun, 8 Jan 2023 15:26:35 +0100 Subject: [PATCH 06/64] Update ReadMe.md --- ReadMe.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 5f91fba05..bb94f874e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -54,7 +54,7 @@ Note: This repo is always updated with OFW & Unleashed. No need to mention all t - SFW Mode - Jamming Files - Custom subghz presets -- Subghz and IR signal replication via gpio | Credits to @ankris812, exact commit lost to time as of rn +- Subghz and IR signal replication via gpio | Credits to @ankris812 - Honda Keys (CVE-2022-27254) - NSFW Animations tied to the level system. Read more above - New API Routes for Locale settings @@ -65,6 +65,7 @@ Note: This repo is always updated with OFW & Unleashed. No need to mention all t [Updated] - All graphics +- About 1k files to speed things up a lot - Folder handling for empty ones (Now indicate they are empty) - Applications now use the new Locale setting - Compiler now handles all non-compiled faps during build From a99b55d3538813787b260629a5bb3b376f34f238 Mon Sep 17 00:00:00 2001 From: Clara K Date: Sun, 8 Jan 2023 15:27:35 +0100 Subject: [PATCH 07/64] Update ReadMe.md --- ReadMe.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index bb94f874e..779267ad7 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -96,8 +96,7 @@ Note: This repo is always updated with OFW & Unleashed. No need to mention all t

Known Bugs:

```txt -- Name Changer app crashes 50% of the time -- Some apps dont allow to be set as Favorite +- Nothing rn. Hopefully that wont change ``` ---- From 46aa2f7c8145967bd870879e14fc29f822b9e150 Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 15:13:13 -0500 Subject: [PATCH 08/64] implement sfw_mode for infrared --- .../scenes/infrared_scene_edit_rename_done.c | 11 ++++++++++- .../infrared/scenes/infrared_scene_learn_done.c | 11 ++++++++++- .../scenes/infrared_scene_learn_success.c | 11 ++++++++++- .../Infrared/DolphinReadingSuccess_59x63_sfw.png | Bin 0 -> 1177 bytes 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 assets/icons/Infrared/DolphinReadingSuccess_59x63_sfw.png diff --git a/applications/main/infrared/scenes/infrared_scene_edit_rename_done.c b/applications/main/infrared/scenes/infrared_scene_edit_rename_done.c index 6c7096e17..5142a181f 100644 --- a/applications/main/infrared/scenes/infrared_scene_edit_rename_done.c +++ b/applications/main/infrared/scenes/infrared_scene_edit_rename_done.c @@ -1,10 +1,18 @@ #include "../infrared_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" void infrared_scene_edit_rename_done_on_enter(void* context) { Infrared* infrared = context; Popup* popup = infrared->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); - popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + if (settings->sfw_mode) { + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59_sfw); + } + else { + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + } popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); popup_set_callback(popup, infrared_popup_closed_callback); @@ -13,6 +21,7 @@ void infrared_scene_edit_rename_done_on_enter(void* context) { popup_enable_timeout(popup); view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewPopup); + free(settings); } bool infrared_scene_edit_rename_done_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/infrared/scenes/infrared_scene_learn_done.c b/applications/main/infrared/scenes/infrared_scene_learn_done.c index 54b7da724..88e3e5a98 100644 --- a/applications/main/infrared/scenes/infrared_scene_learn_done.c +++ b/applications/main/infrared/scenes/infrared_scene_learn_done.c @@ -1,10 +1,18 @@ #include "../infrared_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" void infrared_scene_learn_done_on_enter(void* context) { Infrared* infrared = context; Popup* popup = infrared->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); - popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + if (settings->sfw_mode) { + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59_sfw); + } + else { + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + } if(infrared->app_state.is_learning_new_remote) { popup_set_header(popup, "New remote\ncreated!", 0, 0, AlignLeft, AlignTop); @@ -18,6 +26,7 @@ void infrared_scene_learn_done_on_enter(void* context) { popup_enable_timeout(popup); view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewPopup); + free(settings); } bool infrared_scene_learn_done_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/infrared/scenes/infrared_scene_learn_success.c b/applications/main/infrared/scenes/infrared_scene_learn_success.c index 469d4de9e..ed9d8ce6e 100644 --- a/applications/main/infrared/scenes/infrared_scene_learn_success.c +++ b/applications/main/infrared/scenes/infrared_scene_learn_success.c @@ -1,4 +1,5 @@ #include "../infrared_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" static void infrared_scene_learn_success_dialog_result_callback(DialogExResult result, void* context) { @@ -10,6 +11,8 @@ void infrared_scene_learn_success_on_enter(void* context) { Infrared* infrared = context; DialogEx* dialog_ex = infrared->dialog_ex; InfraredSignal* signal = infrared->received_signal; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); infrared_play_notification_message(infrared, InfraredNotificationMessageGreenOn); @@ -47,12 +50,18 @@ void infrared_scene_learn_success_on_enter(void* context) { dialog_ex_set_left_button_text(dialog_ex, "Retry"); dialog_ex_set_right_button_text(dialog_ex, "Save"); dialog_ex_set_center_button_text(dialog_ex, "Send"); - dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63); + if (settings->sfw_mode) { + dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63_sfw); + } + else { + dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63); + } dialog_ex_set_result_callback(dialog_ex, infrared_scene_learn_success_dialog_result_callback); dialog_ex_set_context(dialog_ex, context); dialog_ex_enable_extended_events(dialog_ex); view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewDialogEx); + free(settings); } bool infrared_scene_learn_success_on_event(void* context, SceneManagerEvent event) { diff --git a/assets/icons/Infrared/DolphinReadingSuccess_59x63_sfw.png b/assets/icons/Infrared/DolphinReadingSuccess_59x63_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..46f559f65f11194c94c15bb7f195a1d72ef2a295 GIT binary patch literal 1177 zcmeAS@N?(olHy`uVBq!ia0vp^)DSr z1<%~X^wgl##FWaylc_cg49qH-ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB+XP}#GU|^lpi<;HsXMd|v6mX? zCgqow*eU^?3h_g30o>TUVrV!4LrlLSu|VHY&j92nm_lD){7Q3k;i`*Ef>IIg#cFVI zNM%8)eo$(0erZuMFy_*fK~@!5ITxiSmgEfrKz*2sj;DkpMZknD6wv4b%oJ<^ zJ|V9E|NjRvLl0f915!UdT^vIyZe6(^E!Jef<9czm0A z3tiQZTzK79dS605C-KUauQq03?HktYO@Gah6}dWL!K=tEQF6i?wpZ6>D42{4Kw06Cgbx4xeweJDDGS}F({`j)7X?o}J zyX`DecdFHnf1Yl!OLgg{#J>1HY(M3>ay__X{YpODaR^Nc-<&V5lUuWQxzBn#x3aK( p%=f=fPd;t;X_5T?htnCD8BU8cnRk73T?7mS22WQ%mvv4FO#oZ0m5TrX literal 0 HcmV?d00001 From 9d51cb7f7b0c1cadd8fa6fcf9b5f741e5f7e6249 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Sun, 8 Jan 2023 21:51:09 +0100 Subject: [PATCH 09/64] The nightmare begins, lol --- .../namechanger/icons/DolphinNice_96x59.png | Bin 0 -> 2459 bytes .../plugins/namechanger/icons/MarioBlock.png | Bin 0 -> 4616 bytes .../desktop/animations/animation_manager.c | 11 +- .../desktop/animations/animation_manager.h | 10 +- .../desktop/animations/animation_storage.c | 28 ++- applications/services/desktop/desktop.c | 4 - .../external/{ => nsfw}/lvl_1/frame_0.png | Bin .../external/{ => nsfw}/lvl_1/frame_1.png | Bin .../external/{ => nsfw}/lvl_1/frame_10.png | Bin .../external/{ => nsfw}/lvl_1/frame_11.png | Bin .../external/{ => nsfw}/lvl_1/frame_12.png | Bin .../external/{ => nsfw}/lvl_1/frame_13.png | Bin .../external/{ => nsfw}/lvl_1/frame_14.png | Bin .../external/{ => nsfw}/lvl_1/frame_15.png | Bin .../external/{ => nsfw}/lvl_1/frame_16.png | Bin .../external/{ => nsfw}/lvl_1/frame_17.png | Bin .../external/{ => nsfw}/lvl_1/frame_18.png | Bin .../external/{ => nsfw}/lvl_1/frame_19.png | Bin .../external/{ => nsfw}/lvl_1/frame_2.png | Bin .../external/{ => nsfw}/lvl_1/frame_20.png | Bin .../external/{ => nsfw}/lvl_1/frame_21.png | Bin .../external/{ => nsfw}/lvl_1/frame_22.png | Bin .../external/{ => nsfw}/lvl_1/frame_23.png | Bin .../external/{ => nsfw}/lvl_1/frame_24.png | Bin .../external/{ => nsfw}/lvl_1/frame_25.png | Bin .../external/{ => nsfw}/lvl_1/frame_26.png | Bin .../external/{ => nsfw}/lvl_1/frame_27.png | Bin .../external/{ => nsfw}/lvl_1/frame_28.png | Bin .../external/{ => nsfw}/lvl_1/frame_29.png | Bin .../external/{ => nsfw}/lvl_1/frame_3.png | Bin .../external/{ => nsfw}/lvl_1/frame_30.png | Bin .../external/{ => nsfw}/lvl_1/frame_4.png | Bin .../external/{ => nsfw}/lvl_1/frame_5.png | Bin .../external/{ => nsfw}/lvl_1/frame_6.png | Bin .../external/{ => nsfw}/lvl_1/frame_7.png | Bin .../external/{ => nsfw}/lvl_1/frame_8.png | Bin .../external/{ => nsfw}/lvl_1/frame_9.png | Bin .../external/{ => nsfw}/lvl_1/meta.txt | 0 .../external/{ => nsfw}/lvl_10/frame_0.png | Bin .../external/{ => nsfw}/lvl_10/frame_1.png | Bin .../external/{ => nsfw}/lvl_10/frame_10.png | Bin .../external/{ => nsfw}/lvl_10/frame_11.png | Bin .../external/{ => nsfw}/lvl_10/frame_12.png | Bin .../external/{ => nsfw}/lvl_10/frame_13.png | Bin .../external/{ => nsfw}/lvl_10/frame_14.png | Bin .../external/{ => nsfw}/lvl_10/frame_15.png | Bin .../external/{ => nsfw}/lvl_10/frame_16.png | Bin .../external/{ => nsfw}/lvl_10/frame_17.png | Bin .../external/{ => nsfw}/lvl_10/frame_18.png | Bin .../external/{ => nsfw}/lvl_10/frame_19.png | Bin .../external/{ => nsfw}/lvl_10/frame_2.png | Bin .../external/{ => nsfw}/lvl_10/frame_20.png | Bin .../external/{ => nsfw}/lvl_10/frame_21.png | Bin .../external/{ => nsfw}/lvl_10/frame_22.png | Bin .../external/{ => nsfw}/lvl_10/frame_23.png | Bin .../external/{ => nsfw}/lvl_10/frame_24.png | Bin .../external/{ => nsfw}/lvl_10/frame_25.png | Bin .../external/{ => nsfw}/lvl_10/frame_26.png | Bin .../external/{ => nsfw}/lvl_10/frame_27.png | Bin .../external/{ => nsfw}/lvl_10/frame_3.png | Bin .../external/{ => nsfw}/lvl_10/frame_4.png | Bin .../external/{ => nsfw}/lvl_10/frame_5.png | Bin .../external/{ => nsfw}/lvl_10/frame_6.png | Bin .../external/{ => nsfw}/lvl_10/frame_7.png | Bin .../external/{ => nsfw}/lvl_10/frame_8.png | Bin .../external/{ => nsfw}/lvl_10/frame_9.png | Bin .../external/{ => nsfw}/lvl_10/meta.txt | 0 .../external/{ => nsfw}/lvl_11/frame_0.png | Bin .../external/{ => nsfw}/lvl_11/frame_1.png | Bin .../external/{ => nsfw}/lvl_11/frame_10.png | Bin .../external/{ => nsfw}/lvl_11/frame_11.png | Bin .../external/{ => nsfw}/lvl_11/frame_12.png | Bin .../external/{ => nsfw}/lvl_11/frame_13.png | Bin .../external/{ => nsfw}/lvl_11/frame_14.png | Bin .../external/{ => nsfw}/lvl_11/frame_15.png | Bin .../external/{ => nsfw}/lvl_11/frame_16.png | Bin .../external/{ => nsfw}/lvl_11/frame_17.png | Bin .../external/{ => nsfw}/lvl_11/frame_18.png | Bin .../external/{ => nsfw}/lvl_11/frame_19.png | Bin .../external/{ => nsfw}/lvl_11/frame_2.png | Bin .../external/{ => nsfw}/lvl_11/frame_20.png | Bin .../external/{ => nsfw}/lvl_11/frame_21.png | Bin .../external/{ => nsfw}/lvl_11/frame_22.png | Bin .../external/{ => nsfw}/lvl_11/frame_23.png | Bin .../external/{ => nsfw}/lvl_11/frame_24.png | Bin .../external/{ => nsfw}/lvl_11/frame_25.png | Bin .../external/{ => nsfw}/lvl_11/frame_26.png | Bin .../external/{ => nsfw}/lvl_11/frame_27.png | Bin .../external/{ => nsfw}/lvl_11/frame_28.png | Bin .../external/{ => nsfw}/lvl_11/frame_29.png | Bin .../external/{ => nsfw}/lvl_11/frame_3.png | Bin .../external/{ => nsfw}/lvl_11/frame_30.png | Bin .../external/{ => nsfw}/lvl_11/frame_31.png | Bin .../external/{ => nsfw}/lvl_11/frame_32.png | Bin .../external/{ => nsfw}/lvl_11/frame_33.png | Bin .../external/{ => nsfw}/lvl_11/frame_34.png | Bin .../external/{ => nsfw}/lvl_11/frame_35.png | Bin .../external/{ => nsfw}/lvl_11/frame_36.png | Bin .../external/{ => nsfw}/lvl_11/frame_37.png | Bin .../external/{ => nsfw}/lvl_11/frame_38.png | Bin .../external/{ => nsfw}/lvl_11/frame_39.png | Bin .../external/{ => nsfw}/lvl_11/frame_4.png | Bin .../external/{ => nsfw}/lvl_11/frame_40.png | Bin .../external/{ => nsfw}/lvl_11/frame_41.png | Bin .../external/{ => nsfw}/lvl_11/frame_42.png | Bin .../external/{ => nsfw}/lvl_11/frame_43.png | Bin .../external/{ => nsfw}/lvl_11/frame_44.png | Bin .../external/{ => nsfw}/lvl_11/frame_45.png | Bin .../external/{ => nsfw}/lvl_11/frame_46.png | Bin .../external/{ => nsfw}/lvl_11/frame_47.png | Bin .../external/{ => nsfw}/lvl_11/frame_48.png | Bin .../external/{ => nsfw}/lvl_11/frame_49.png | Bin .../external/{ => nsfw}/lvl_11/frame_5.png | Bin .../external/{ => nsfw}/lvl_11/frame_6.png | Bin .../external/{ => nsfw}/lvl_11/frame_7.png | Bin .../external/{ => nsfw}/lvl_11/frame_8.png | Bin .../external/{ => nsfw}/lvl_11/frame_9.png | Bin .../external/{ => nsfw}/lvl_11/meta.txt | 0 .../external/{ => nsfw}/lvl_12/frame_0.png | Bin .../external/{ => nsfw}/lvl_12/frame_1.png | Bin .../external/{ => nsfw}/lvl_12/frame_10.png | Bin .../external/{ => nsfw}/lvl_12/frame_11.png | Bin .../external/{ => nsfw}/lvl_12/frame_12.png | Bin .../external/{ => nsfw}/lvl_12/frame_13.png | Bin .../external/{ => nsfw}/lvl_12/frame_14.png | Bin .../external/{ => nsfw}/lvl_12/frame_15.png | Bin .../external/{ => nsfw}/lvl_12/frame_2.png | Bin .../external/{ => nsfw}/lvl_12/frame_3.png | Bin .../external/{ => nsfw}/lvl_12/frame_4.png | Bin .../external/{ => nsfw}/lvl_12/frame_5.png | Bin .../external/{ => nsfw}/lvl_12/frame_6.png | Bin .../external/{ => nsfw}/lvl_12/frame_7.png | Bin .../external/{ => nsfw}/lvl_12/frame_8.png | Bin .../external/{ => nsfw}/lvl_12/frame_9.png | Bin .../external/{ => nsfw}/lvl_12/meta.txt | 0 .../external/{ => nsfw}/lvl_13/frame_0.png | Bin .../external/{ => nsfw}/lvl_13/frame_1.png | Bin .../external/{ => nsfw}/lvl_13/frame_10.png | Bin .../external/{ => nsfw}/lvl_13/frame_2.png | Bin .../external/{ => nsfw}/lvl_13/frame_3.png | Bin .../external/{ => nsfw}/lvl_13/frame_4.png | Bin .../external/{ => nsfw}/lvl_13/frame_5.png | Bin .../external/{ => nsfw}/lvl_13/frame_6.png | Bin .../external/{ => nsfw}/lvl_13/frame_7.png | Bin .../external/{ => nsfw}/lvl_13/frame_8.png | Bin .../external/{ => nsfw}/lvl_13/frame_9.png | Bin .../external/{ => nsfw}/lvl_13/meta.txt | 0 .../external/{ => nsfw}/lvl_14/frame_0.png | Bin .../external/{ => nsfw}/lvl_14/frame_1.png | Bin .../external/{ => nsfw}/lvl_14/frame_2.png | Bin .../external/{ => nsfw}/lvl_14/frame_3.png | Bin .../external/{ => nsfw}/lvl_14/frame_4.png | Bin .../external/{ => nsfw}/lvl_14/frame_5.png | Bin .../external/{ => nsfw}/lvl_14/frame_6.png | Bin .../external/{ => nsfw}/lvl_14/frame_7.png | Bin .../external/{ => nsfw}/lvl_14/meta.txt | 0 .../external/{ => nsfw}/lvl_15/frame_0.png | Bin .../external/{ => nsfw}/lvl_15/frame_1.png | Bin .../external/{ => nsfw}/lvl_15/frame_10.png | Bin .../external/{ => nsfw}/lvl_15/frame_11.png | Bin .../external/{ => nsfw}/lvl_15/frame_12.png | Bin .../external/{ => nsfw}/lvl_15/frame_13.png | Bin .../external/{ => nsfw}/lvl_15/frame_14.png | Bin .../external/{ => nsfw}/lvl_15/frame_15.png | Bin .../external/{ => nsfw}/lvl_15/frame_16.png | Bin .../external/{ => nsfw}/lvl_15/frame_17.png | Bin .../external/{ => nsfw}/lvl_15/frame_18.png | Bin .../external/{ => nsfw}/lvl_15/frame_19.png | Bin .../external/{ => nsfw}/lvl_15/frame_2.png | Bin .../external/{ => nsfw}/lvl_15/frame_20.png | Bin .../external/{ => nsfw}/lvl_15/frame_21.png | Bin .../external/{ => nsfw}/lvl_15/frame_3.png | Bin .../external/{ => nsfw}/lvl_15/frame_4.png | Bin .../external/{ => nsfw}/lvl_15/frame_5.png | Bin .../external/{ => nsfw}/lvl_15/frame_6.png | Bin .../external/{ => nsfw}/lvl_15/frame_7.png | Bin .../external/{ => nsfw}/lvl_15/frame_8.png | Bin .../external/{ => nsfw}/lvl_15/frame_9.png | Bin .../external/{ => nsfw}/lvl_15/meta.txt | 0 .../external/{ => nsfw}/lvl_16/frame_0.png | Bin .../external/{ => nsfw}/lvl_16/frame_1.png | Bin .../external/{ => nsfw}/lvl_16/frame_10.png | Bin .../external/{ => nsfw}/lvl_16/frame_11.png | Bin .../external/{ => nsfw}/lvl_16/frame_12.png | Bin .../external/{ => nsfw}/lvl_16/frame_13.png | Bin .../external/{ => nsfw}/lvl_16/frame_14.png | Bin .../external/{ => nsfw}/lvl_16/frame_15.png | Bin .../external/{ => nsfw}/lvl_16/frame_16.png | Bin .../external/{ => nsfw}/lvl_16/frame_17.png | Bin .../external/{ => nsfw}/lvl_16/frame_18.png | Bin .../external/{ => nsfw}/lvl_16/frame_19.png | Bin .../external/{ => nsfw}/lvl_16/frame_2.png | Bin .../external/{ => nsfw}/lvl_16/frame_20.png | Bin .../external/{ => nsfw}/lvl_16/frame_3.png | Bin .../external/{ => nsfw}/lvl_16/frame_4.png | Bin .../external/{ => nsfw}/lvl_16/frame_5.png | Bin .../external/{ => nsfw}/lvl_16/frame_6.png | Bin .../external/{ => nsfw}/lvl_16/frame_7.png | Bin .../external/{ => nsfw}/lvl_16/frame_8.png | Bin .../external/{ => nsfw}/lvl_16/frame_9.png | Bin .../external/{ => nsfw}/lvl_16/meta.txt | 0 .../external/{ => nsfw}/lvl_17/frame_0.png | Bin .../external/{ => nsfw}/lvl_17/frame_1.png | Bin .../external/{ => nsfw}/lvl_17/frame_10.png | Bin .../external/{ => nsfw}/lvl_17/frame_11.png | Bin .../external/{ => nsfw}/lvl_17/frame_12.png | Bin .../external/{ => nsfw}/lvl_17/frame_13.png | Bin .../external/{ => nsfw}/lvl_17/frame_14.png | Bin .../external/{ => nsfw}/lvl_17/frame_15.png | Bin .../external/{ => nsfw}/lvl_17/frame_16.png | Bin .../external/{ => nsfw}/lvl_17/frame_17.png | Bin .../external/{ => nsfw}/lvl_17/frame_18.png | Bin .../external/{ => nsfw}/lvl_17/frame_19.png | Bin .../external/{ => nsfw}/lvl_17/frame_2.png | Bin .../external/{ => nsfw}/lvl_17/frame_20.png | Bin .../external/{ => nsfw}/lvl_17/frame_21.png | Bin .../external/{ => nsfw}/lvl_17/frame_22.png | Bin .../external/{ => nsfw}/lvl_17/frame_23.png | Bin .../external/{ => nsfw}/lvl_17/frame_24.png | Bin .../external/{ => nsfw}/lvl_17/frame_25.png | Bin .../external/{ => nsfw}/lvl_17/frame_26.png | Bin .../external/{ => nsfw}/lvl_17/frame_27.png | Bin .../external/{ => nsfw}/lvl_17/frame_28.png | Bin .../external/{ => nsfw}/lvl_17/frame_29.png | Bin .../external/{ => nsfw}/lvl_17/frame_3.png | Bin .../external/{ => nsfw}/lvl_17/frame_30.png | Bin .../external/{ => nsfw}/lvl_17/frame_31.png | Bin .../external/{ => nsfw}/lvl_17/frame_4.png | Bin .../external/{ => nsfw}/lvl_17/frame_5.png | Bin .../external/{ => nsfw}/lvl_17/frame_6.png | Bin .../external/{ => nsfw}/lvl_17/frame_7.png | Bin .../external/{ => nsfw}/lvl_17/frame_8.png | Bin .../external/{ => nsfw}/lvl_17/frame_9.png | Bin .../external/{ => nsfw}/lvl_17/meta.txt | 0 .../external/{ => nsfw}/lvl_18/frame_0.png | Bin .../external/{ => nsfw}/lvl_18/frame_1.png | Bin .../external/{ => nsfw}/lvl_18/frame_10.png | Bin .../external/{ => nsfw}/lvl_18/frame_11.png | Bin .../external/{ => nsfw}/lvl_18/frame_12.png | Bin .../external/{ => nsfw}/lvl_18/frame_13.png | Bin .../external/{ => nsfw}/lvl_18/frame_14.png | Bin .../external/{ => nsfw}/lvl_18/frame_15.png | Bin .../external/{ => nsfw}/lvl_18/frame_16.png | Bin .../external/{ => nsfw}/lvl_18/frame_17.png | Bin .../external/{ => nsfw}/lvl_18/frame_18.png | Bin .../external/{ => nsfw}/lvl_18/frame_19.png | Bin .../external/{ => nsfw}/lvl_18/frame_2.png | Bin .../external/{ => nsfw}/lvl_18/frame_20.png | Bin .../external/{ => nsfw}/lvl_18/frame_21.png | Bin .../external/{ => nsfw}/lvl_18/frame_22.png | Bin .../external/{ => nsfw}/lvl_18/frame_3.png | Bin .../external/{ => nsfw}/lvl_18/frame_4.png | Bin .../external/{ => nsfw}/lvl_18/frame_5.png | Bin .../external/{ => nsfw}/lvl_18/frame_6.png | Bin .../external/{ => nsfw}/lvl_18/frame_7.png | Bin .../external/{ => nsfw}/lvl_18/frame_8.png | Bin .../external/{ => nsfw}/lvl_18/frame_9.png | Bin .../external/{ => nsfw}/lvl_18/meta.txt | 0 .../external/{ => nsfw}/lvl_19/frame_0.png | Bin .../external/{ => nsfw}/lvl_19/frame_1.png | Bin .../external/{ => nsfw}/lvl_19/frame_10.png | Bin .../external/{ => nsfw}/lvl_19/frame_11.png | Bin .../external/{ => nsfw}/lvl_19/frame_12.png | Bin .../external/{ => nsfw}/lvl_19/frame_13.png | Bin .../external/{ => nsfw}/lvl_19/frame_14.png | Bin .../external/{ => nsfw}/lvl_19/frame_15.png | Bin .../external/{ => nsfw}/lvl_19/frame_16.png | Bin .../external/{ => nsfw}/lvl_19/frame_17.png | Bin .../external/{ => nsfw}/lvl_19/frame_18.png | Bin .../external/{ => nsfw}/lvl_19/frame_19.png | Bin .../external/{ => nsfw}/lvl_19/frame_2.png | Bin .../external/{ => nsfw}/lvl_19/frame_20.png | Bin .../external/{ => nsfw}/lvl_19/frame_21.png | Bin .../external/{ => nsfw}/lvl_19/frame_3.png | Bin .../external/{ => nsfw}/lvl_19/frame_4.png | Bin .../external/{ => nsfw}/lvl_19/frame_5.png | Bin .../external/{ => nsfw}/lvl_19/frame_6.png | Bin .../external/{ => nsfw}/lvl_19/frame_7.png | Bin .../external/{ => nsfw}/lvl_19/frame_8.png | Bin .../external/{ => nsfw}/lvl_19/frame_9.png | Bin .../external/{ => nsfw}/lvl_19/meta.txt | 0 .../external/{ => nsfw}/lvl_2/frame_0.png | Bin .../external/{ => nsfw}/lvl_2/frame_1.png | Bin .../external/{ => nsfw}/lvl_2/frame_10.png | Bin .../external/{ => nsfw}/lvl_2/frame_11.png | Bin .../external/{ => nsfw}/lvl_2/frame_12.png | Bin .../external/{ => nsfw}/lvl_2/frame_13.png | Bin .../external/{ => nsfw}/lvl_2/frame_14.png | Bin .../external/{ => nsfw}/lvl_2/frame_2.png | Bin .../external/{ => nsfw}/lvl_2/frame_3.png | Bin .../external/{ => nsfw}/lvl_2/frame_4.png | Bin .../external/{ => nsfw}/lvl_2/frame_5.png | Bin .../external/{ => nsfw}/lvl_2/frame_6.png | Bin .../external/{ => nsfw}/lvl_2/frame_7.png | Bin .../external/{ => nsfw}/lvl_2/frame_8.png | Bin .../external/{ => nsfw}/lvl_2/frame_9.png | Bin .../external/{ => nsfw}/lvl_2/meta.txt | 0 .../external/{ => nsfw}/lvl_20/frame_0.png | Bin .../external/{ => nsfw}/lvl_20/frame_1.png | Bin .../external/{ => nsfw}/lvl_20/frame_10.png | Bin .../external/{ => nsfw}/lvl_20/frame_11.png | Bin .../external/{ => nsfw}/lvl_20/frame_12.png | Bin .../external/{ => nsfw}/lvl_20/frame_13.png | Bin .../external/{ => nsfw}/lvl_20/frame_2.png | Bin .../external/{ => nsfw}/lvl_20/frame_3.png | Bin .../external/{ => nsfw}/lvl_20/frame_4.png | Bin .../external/{ => nsfw}/lvl_20/frame_5.png | Bin .../external/{ => nsfw}/lvl_20/frame_6.png | Bin .../external/{ => nsfw}/lvl_20/frame_7.png | Bin .../external/{ => nsfw}/lvl_20/frame_8.png | Bin .../external/{ => nsfw}/lvl_20/frame_9.png | Bin .../external/{ => nsfw}/lvl_20/meta.txt | 0 .../external/{ => nsfw}/lvl_21/frame_0.png | Bin .../external/{ => nsfw}/lvl_21/frame_1.png | Bin .../external/{ => nsfw}/lvl_21/frame_2.png | Bin .../external/{ => nsfw}/lvl_21/frame_3.png | Bin .../external/{ => nsfw}/lvl_21/frame_4.png | Bin .../external/{ => nsfw}/lvl_21/frame_5.png | Bin .../external/{ => nsfw}/lvl_21/meta.txt | 0 .../external/{ => nsfw}/lvl_22/frame_0.png | Bin .../external/{ => nsfw}/lvl_22/frame_1.png | Bin .../external/{ => nsfw}/lvl_22/frame_10.png | Bin .../external/{ => nsfw}/lvl_22/frame_11.png | Bin .../external/{ => nsfw}/lvl_22/frame_12.png | Bin .../external/{ => nsfw}/lvl_22/frame_13.png | Bin .../external/{ => nsfw}/lvl_22/frame_14.png | Bin .../external/{ => nsfw}/lvl_22/frame_15.png | Bin .../external/{ => nsfw}/lvl_22/frame_16.png | Bin .../external/{ => nsfw}/lvl_22/frame_17.png | Bin .../external/{ => nsfw}/lvl_22/frame_18.png | Bin .../external/{ => nsfw}/lvl_22/frame_19.png | Bin .../external/{ => nsfw}/lvl_22/frame_2.png | Bin .../external/{ => nsfw}/lvl_22/frame_20.png | Bin .../external/{ => nsfw}/lvl_22/frame_21.png | Bin .../external/{ => nsfw}/lvl_22/frame_22.png | Bin .../external/{ => nsfw}/lvl_22/frame_23.png | Bin .../external/{ => nsfw}/lvl_22/frame_24.png | Bin .../external/{ => nsfw}/lvl_22/frame_25.png | Bin .../external/{ => nsfw}/lvl_22/frame_26.png | Bin .../external/{ => nsfw}/lvl_22/frame_27.png | Bin .../external/{ => nsfw}/lvl_22/frame_28.png | Bin .../external/{ => nsfw}/lvl_22/frame_29.png | Bin .../external/{ => nsfw}/lvl_22/frame_3.png | Bin .../external/{ => nsfw}/lvl_22/frame_30.png | Bin .../external/{ => nsfw}/lvl_22/frame_31.png | Bin .../external/{ => nsfw}/lvl_22/frame_32.png | Bin .../external/{ => nsfw}/lvl_22/frame_33.png | Bin .../external/{ => nsfw}/lvl_22/frame_34.png | Bin .../external/{ => nsfw}/lvl_22/frame_35.png | Bin .../external/{ => nsfw}/lvl_22/frame_36.png | Bin .../external/{ => nsfw}/lvl_22/frame_37.png | Bin .../external/{ => nsfw}/lvl_22/frame_38.png | Bin .../external/{ => nsfw}/lvl_22/frame_39.png | Bin .../external/{ => nsfw}/lvl_22/frame_4.png | Bin .../external/{ => nsfw}/lvl_22/frame_40.png | Bin .../external/{ => nsfw}/lvl_22/frame_41.png | Bin .../external/{ => nsfw}/lvl_22/frame_42.png | Bin .../external/{ => nsfw}/lvl_22/frame_43.png | Bin .../external/{ => nsfw}/lvl_22/frame_44.png | Bin .../external/{ => nsfw}/lvl_22/frame_45.png | Bin .../external/{ => nsfw}/lvl_22/frame_46.png | Bin .../external/{ => nsfw}/lvl_22/frame_47.png | Bin .../external/{ => nsfw}/lvl_22/frame_48.png | Bin .../external/{ => nsfw}/lvl_22/frame_49.png | Bin .../external/{ => nsfw}/lvl_22/frame_5.png | Bin .../external/{ => nsfw}/lvl_22/frame_50.png | Bin .../external/{ => nsfw}/lvl_22/frame_51.png | Bin .../external/{ => nsfw}/lvl_22/frame_52.png | Bin .../external/{ => nsfw}/lvl_22/frame_53.png | Bin .../external/{ => nsfw}/lvl_22/frame_54.png | Bin .../external/{ => nsfw}/lvl_22/frame_55.png | Bin .../external/{ => nsfw}/lvl_22/frame_56.png | Bin .../external/{ => nsfw}/lvl_22/frame_57.png | Bin .../external/{ => nsfw}/lvl_22/frame_58.png | Bin .../external/{ => nsfw}/lvl_22/frame_59.png | Bin .../external/{ => nsfw}/lvl_22/frame_6.png | Bin .../external/{ => nsfw}/lvl_22/frame_7.png | Bin .../external/{ => nsfw}/lvl_22/frame_8.png | Bin .../external/{ => nsfw}/lvl_22/frame_9.png | Bin .../external/{ => nsfw}/lvl_22/meta.txt | 0 .../external/{ => nsfw}/lvl_23/frame_0.png | Bin .../external/{ => nsfw}/lvl_23/frame_1.png | Bin .../external/{ => nsfw}/lvl_23/frame_10.png | Bin .../external/{ => nsfw}/lvl_23/frame_11.png | Bin .../external/{ => nsfw}/lvl_23/frame_12.png | Bin .../external/{ => nsfw}/lvl_23/frame_13.png | Bin .../external/{ => nsfw}/lvl_23/frame_14.png | Bin .../external/{ => nsfw}/lvl_23/frame_15.png | Bin .../external/{ => nsfw}/lvl_23/frame_16.png | Bin .../external/{ => nsfw}/lvl_23/frame_2.png | Bin .../external/{ => nsfw}/lvl_23/frame_3.png | Bin .../external/{ => nsfw}/lvl_23/frame_4.png | Bin .../external/{ => nsfw}/lvl_23/frame_5.png | Bin .../external/{ => nsfw}/lvl_23/frame_6.png | Bin .../external/{ => nsfw}/lvl_23/frame_7.png | Bin .../external/{ => nsfw}/lvl_23/frame_8.png | Bin .../external/{ => nsfw}/lvl_23/frame_9.png | Bin .../external/{ => nsfw}/lvl_23/meta.txt | 0 .../external/{ => nsfw}/lvl_24/frame_0.png | Bin .../external/{ => nsfw}/lvl_24/frame_1.png | Bin .../external/{ => nsfw}/lvl_24/frame_10.png | Bin .../external/{ => nsfw}/lvl_24/frame_11.png | Bin .../external/{ => nsfw}/lvl_24/frame_12.png | Bin .../external/{ => nsfw}/lvl_24/frame_13.png | Bin .../external/{ => nsfw}/lvl_24/frame_14.png | Bin .../external/{ => nsfw}/lvl_24/frame_15.png | Bin .../external/{ => nsfw}/lvl_24/frame_16.png | Bin .../external/{ => nsfw}/lvl_24/frame_17.png | Bin .../external/{ => nsfw}/lvl_24/frame_18.png | Bin .../external/{ => nsfw}/lvl_24/frame_19.png | Bin .../external/{ => nsfw}/lvl_24/frame_2.png | Bin .../external/{ => nsfw}/lvl_24/frame_20.png | Bin .../external/{ => nsfw}/lvl_24/frame_21.png | Bin .../external/{ => nsfw}/lvl_24/frame_22.png | Bin .../external/{ => nsfw}/lvl_24/frame_23.png | Bin .../external/{ => nsfw}/lvl_24/frame_24.png | Bin .../external/{ => nsfw}/lvl_24/frame_25.png | Bin .../external/{ => nsfw}/lvl_24/frame_26.png | Bin .../external/{ => nsfw}/lvl_24/frame_27.png | Bin .../external/{ => nsfw}/lvl_24/frame_28.png | Bin .../external/{ => nsfw}/lvl_24/frame_29.png | Bin .../external/{ => nsfw}/lvl_24/frame_3.png | Bin .../external/{ => nsfw}/lvl_24/frame_4.png | Bin .../external/{ => nsfw}/lvl_24/frame_5.png | Bin .../external/{ => nsfw}/lvl_24/frame_6.png | Bin .../external/{ => nsfw}/lvl_24/frame_7.png | Bin .../external/{ => nsfw}/lvl_24/frame_8.png | Bin .../external/{ => nsfw}/lvl_24/frame_9.png | Bin .../external/{ => nsfw}/lvl_24/meta.txt | 0 .../external/{ => nsfw}/lvl_25/frame_0.png | Bin .../external/{ => nsfw}/lvl_25/frame_1.png | Bin .../external/{ => nsfw}/lvl_25/frame_10.png | Bin .../external/{ => nsfw}/lvl_25/frame_11.png | Bin .../external/{ => nsfw}/lvl_25/frame_12.png | Bin .../external/{ => nsfw}/lvl_25/frame_13.png | Bin .../external/{ => nsfw}/lvl_25/frame_14.png | Bin .../external/{ => nsfw}/lvl_25/frame_15.png | Bin .../external/{ => nsfw}/lvl_25/frame_16.png | Bin .../external/{ => nsfw}/lvl_25/frame_17.png | Bin .../external/{ => nsfw}/lvl_25/frame_18.png | Bin .../external/{ => nsfw}/lvl_25/frame_19.png | Bin .../external/{ => nsfw}/lvl_25/frame_2.png | Bin .../external/{ => nsfw}/lvl_25/frame_20.png | Bin .../external/{ => nsfw}/lvl_25/frame_21.png | Bin .../external/{ => nsfw}/lvl_25/frame_22.png | Bin .../external/{ => nsfw}/lvl_25/frame_23.png | Bin .../external/{ => nsfw}/lvl_25/frame_24.png | Bin .../external/{ => nsfw}/lvl_25/frame_25.png | Bin .../external/{ => nsfw}/lvl_25/frame_26.png | Bin .../external/{ => nsfw}/lvl_25/frame_27.png | Bin .../external/{ => nsfw}/lvl_25/frame_28.png | Bin .../external/{ => nsfw}/lvl_25/frame_29.png | Bin .../external/{ => nsfw}/lvl_25/frame_3.png | Bin .../external/{ => nsfw}/lvl_25/frame_30.png | Bin .../external/{ => nsfw}/lvl_25/frame_31.png | Bin .../external/{ => nsfw}/lvl_25/frame_32.png | Bin .../external/{ => nsfw}/lvl_25/frame_33.png | Bin .../external/{ => nsfw}/lvl_25/frame_34.png | Bin .../external/{ => nsfw}/lvl_25/frame_35.png | Bin .../external/{ => nsfw}/lvl_25/frame_4.png | Bin .../external/{ => nsfw}/lvl_25/frame_5.png | Bin .../external/{ => nsfw}/lvl_25/frame_6.png | Bin .../external/{ => nsfw}/lvl_25/frame_7.png | Bin .../external/{ => nsfw}/lvl_25/frame_8.png | Bin .../external/{ => nsfw}/lvl_25/frame_9.png | Bin .../external/{ => nsfw}/lvl_25/meta.txt | 0 .../external/{ => nsfw}/lvl_26/frame_0.png | Bin .../external/{ => nsfw}/lvl_26/frame_1.png | Bin .../external/{ => nsfw}/lvl_26/frame_10.png | Bin .../external/{ => nsfw}/lvl_26/frame_11.png | Bin .../external/{ => nsfw}/lvl_26/frame_2.png | Bin .../external/{ => nsfw}/lvl_26/frame_3.png | Bin .../external/{ => nsfw}/lvl_26/frame_4.png | Bin .../external/{ => nsfw}/lvl_26/frame_5.png | Bin .../external/{ => nsfw}/lvl_26/frame_6.png | Bin .../external/{ => nsfw}/lvl_26/frame_7.png | Bin .../external/{ => nsfw}/lvl_26/frame_8.png | Bin .../external/{ => nsfw}/lvl_26/frame_9.png | Bin .../external/{ => nsfw}/lvl_26/meta.txt | 0 .../external/{ => nsfw}/lvl_27/frame_0.png | Bin .../external/{ => nsfw}/lvl_27/frame_1.png | Bin .../external/{ => nsfw}/lvl_27/frame_10.png | Bin .../external/{ => nsfw}/lvl_27/frame_11.png | Bin .../external/{ => nsfw}/lvl_27/frame_12.png | Bin .../external/{ => nsfw}/lvl_27/frame_13.png | Bin .../external/{ => nsfw}/lvl_27/frame_14.png | Bin .../external/{ => nsfw}/lvl_27/frame_15.png | Bin .../external/{ => nsfw}/lvl_27/frame_16.png | Bin .../external/{ => nsfw}/lvl_27/frame_17.png | Bin .../external/{ => nsfw}/lvl_27/frame_18.png | Bin .../external/{ => nsfw}/lvl_27/frame_19.png | Bin .../external/{ => nsfw}/lvl_27/frame_2.png | Bin .../external/{ => nsfw}/lvl_27/frame_20.png | Bin .../external/{ => nsfw}/lvl_27/frame_21.png | Bin .../external/{ => nsfw}/lvl_27/frame_3.png | Bin .../external/{ => nsfw}/lvl_27/frame_4.png | Bin .../external/{ => nsfw}/lvl_27/frame_5.png | Bin .../external/{ => nsfw}/lvl_27/frame_6.png | Bin .../external/{ => nsfw}/lvl_27/frame_7.png | Bin .../external/{ => nsfw}/lvl_27/frame_8.png | Bin .../external/{ => nsfw}/lvl_27/frame_9.png | Bin .../external/{ => nsfw}/lvl_27/meta.txt | 0 .../external/{ => nsfw}/lvl_28/frame_0.png | Bin .../external/{ => nsfw}/lvl_28/frame_1.png | Bin .../external/{ => nsfw}/lvl_28/frame_2.png | Bin .../external/{ => nsfw}/lvl_28/frame_3.png | Bin .../external/{ => nsfw}/lvl_28/frame_4.png | Bin .../external/{ => nsfw}/lvl_28/frame_5.png | Bin .../external/{ => nsfw}/lvl_28/meta.txt | 0 .../external/{ => nsfw}/lvl_29/frame_0.png | Bin .../external/{ => nsfw}/lvl_29/frame_1.png | Bin .../external/{ => nsfw}/lvl_29/frame_10.png | Bin .../external/{ => nsfw}/lvl_29/frame_11.png | Bin .../external/{ => nsfw}/lvl_29/frame_12.png | Bin .../external/{ => nsfw}/lvl_29/frame_13.png | Bin .../external/{ => nsfw}/lvl_29/frame_14.png | Bin .../external/{ => nsfw}/lvl_29/frame_15.png | Bin .../external/{ => nsfw}/lvl_29/frame_16.png | Bin .../external/{ => nsfw}/lvl_29/frame_17.png | Bin .../external/{ => nsfw}/lvl_29/frame_18.png | Bin .../external/{ => nsfw}/lvl_29/frame_19.png | Bin .../external/{ => nsfw}/lvl_29/frame_2.png | Bin .../external/{ => nsfw}/lvl_29/frame_20.png | Bin .../external/{ => nsfw}/lvl_29/frame_21.png | Bin .../external/{ => nsfw}/lvl_29/frame_22.png | Bin .../external/{ => nsfw}/lvl_29/frame_23.png | Bin .../external/{ => nsfw}/lvl_29/frame_24.png | Bin .../external/{ => nsfw}/lvl_29/frame_25.png | Bin .../external/{ => nsfw}/lvl_29/frame_26.png | Bin .../external/{ => nsfw}/lvl_29/frame_27.png | Bin .../external/{ => nsfw}/lvl_29/frame_28.png | Bin .../external/{ => nsfw}/lvl_29/frame_29.png | Bin .../external/{ => nsfw}/lvl_29/frame_3.png | Bin .../external/{ => nsfw}/lvl_29/frame_30.png | Bin .../external/{ => nsfw}/lvl_29/frame_31.png | Bin .../external/{ => nsfw}/lvl_29/frame_32.png | Bin .../external/{ => nsfw}/lvl_29/frame_33.png | Bin .../external/{ => nsfw}/lvl_29/frame_34.png | Bin .../external/{ => nsfw}/lvl_29/frame_35.png | Bin .../external/{ => nsfw}/lvl_29/frame_36.png | Bin .../external/{ => nsfw}/lvl_29/frame_37.png | Bin .../external/{ => nsfw}/lvl_29/frame_38.png | Bin .../external/{ => nsfw}/lvl_29/frame_39.png | Bin .../external/{ => nsfw}/lvl_29/frame_4.png | Bin .../external/{ => nsfw}/lvl_29/frame_40.png | Bin .../external/{ => nsfw}/lvl_29/frame_41.png | Bin .../external/{ => nsfw}/lvl_29/frame_42.png | Bin .../external/{ => nsfw}/lvl_29/frame_43.png | Bin .../external/{ => nsfw}/lvl_29/frame_44.png | Bin .../external/{ => nsfw}/lvl_29/frame_45.png | Bin .../external/{ => nsfw}/lvl_29/frame_46.png | Bin .../external/{ => nsfw}/lvl_29/frame_47.png | Bin .../external/{ => nsfw}/lvl_29/frame_48.png | Bin .../external/{ => nsfw}/lvl_29/frame_49.png | Bin .../external/{ => nsfw}/lvl_29/frame_5.png | Bin .../external/{ => nsfw}/lvl_29/frame_50.png | Bin .../external/{ => nsfw}/lvl_29/frame_51.png | Bin .../external/{ => nsfw}/lvl_29/frame_6.png | Bin .../external/{ => nsfw}/lvl_29/frame_7.png | Bin .../external/{ => nsfw}/lvl_29/frame_8.png | Bin .../external/{ => nsfw}/lvl_29/frame_9.png | Bin .../external/{ => nsfw}/lvl_29/meta.txt | 0 .../external/{ => nsfw}/lvl_3/frame_0.png | Bin .../external/{ => nsfw}/lvl_3/frame_1.png | Bin .../external/{ => nsfw}/lvl_3/frame_10.png | Bin .../external/{ => nsfw}/lvl_3/frame_11.png | Bin .../external/{ => nsfw}/lvl_3/frame_12.png | Bin .../external/{ => nsfw}/lvl_3/frame_13.png | Bin .../external/{ => nsfw}/lvl_3/frame_14.png | Bin .../external/{ => nsfw}/lvl_3/frame_2.png | Bin .../external/{ => nsfw}/lvl_3/frame_3.png | Bin .../external/{ => nsfw}/lvl_3/frame_4.png | Bin .../external/{ => nsfw}/lvl_3/frame_5.png | Bin .../external/{ => nsfw}/lvl_3/frame_6.png | Bin .../external/{ => nsfw}/lvl_3/frame_7.png | Bin .../external/{ => nsfw}/lvl_3/frame_8.png | Bin .../external/{ => nsfw}/lvl_3/frame_9.png | Bin .../external/{ => nsfw}/lvl_3/meta.txt | 0 .../external/{ => nsfw}/lvl_30/frame_0.png | Bin .../external/{ => nsfw}/lvl_30/frame_1.png | Bin .../external/{ => nsfw}/lvl_30/frame_10.png | Bin .../external/{ => nsfw}/lvl_30/frame_11.png | Bin .../external/{ => nsfw}/lvl_30/frame_12.png | Bin .../external/{ => nsfw}/lvl_30/frame_13.png | Bin .../external/{ => nsfw}/lvl_30/frame_14.png | Bin .../external/{ => nsfw}/lvl_30/frame_15.png | Bin .../external/{ => nsfw}/lvl_30/frame_16.png | Bin .../external/{ => nsfw}/lvl_30/frame_17.png | Bin .../external/{ => nsfw}/lvl_30/frame_18.png | Bin .../external/{ => nsfw}/lvl_30/frame_19.png | Bin .../external/{ => nsfw}/lvl_30/frame_2.png | Bin .../external/{ => nsfw}/lvl_30/frame_20.png | Bin .../external/{ => nsfw}/lvl_30/frame_21.png | Bin .../external/{ => nsfw}/lvl_30/frame_22.png | Bin .../external/{ => nsfw}/lvl_30/frame_23.png | Bin .../external/{ => nsfw}/lvl_30/frame_24.png | Bin .../external/{ => nsfw}/lvl_30/frame_25.png | Bin .../external/{ => nsfw}/lvl_30/frame_26.png | Bin .../external/{ => nsfw}/lvl_30/frame_27.png | Bin .../external/{ => nsfw}/lvl_30/frame_28.png | Bin .../external/{ => nsfw}/lvl_30/frame_29.png | Bin .../external/{ => nsfw}/lvl_30/frame_3.png | Bin .../external/{ => nsfw}/lvl_30/frame_30.png | Bin .../external/{ => nsfw}/lvl_30/frame_31.png | Bin .../external/{ => nsfw}/lvl_30/frame_32.png | Bin .../external/{ => nsfw}/lvl_30/frame_33.png | Bin .../external/{ => nsfw}/lvl_30/frame_34.png | Bin .../external/{ => nsfw}/lvl_30/frame_35.png | Bin .../external/{ => nsfw}/lvl_30/frame_36.png | Bin .../external/{ => nsfw}/lvl_30/frame_37.png | Bin .../external/{ => nsfw}/lvl_30/frame_38.png | Bin .../external/{ => nsfw}/lvl_30/frame_39.png | Bin .../external/{ => nsfw}/lvl_30/frame_4.png | Bin .../external/{ => nsfw}/lvl_30/frame_40.png | Bin .../external/{ => nsfw}/lvl_30/frame_41.png | Bin .../external/{ => nsfw}/lvl_30/frame_42.png | Bin .../external/{ => nsfw}/lvl_30/frame_43.png | Bin .../external/{ => nsfw}/lvl_30/frame_44.png | Bin .../external/{ => nsfw}/lvl_30/frame_45.png | Bin .../external/{ => nsfw}/lvl_30/frame_46.png | Bin .../external/{ => nsfw}/lvl_30/frame_47.png | Bin .../external/{ => nsfw}/lvl_30/frame_48.png | Bin .../external/{ => nsfw}/lvl_30/frame_49.png | Bin .../external/{ => nsfw}/lvl_30/frame_5.png | Bin .../external/{ => nsfw}/lvl_30/frame_6.png | Bin .../external/{ => nsfw}/lvl_30/frame_7.png | Bin .../external/{ => nsfw}/lvl_30/frame_8.png | Bin .../external/{ => nsfw}/lvl_30/frame_9.png | Bin .../external/{ => nsfw}/lvl_30/meta.txt | 0 .../external/{ => nsfw}/lvl_4/frame_0.png | Bin .../external/{ => nsfw}/lvl_4/frame_1.png | Bin .../external/{ => nsfw}/lvl_4/frame_10.png | Bin .../external/{ => nsfw}/lvl_4/frame_11.png | Bin .../external/{ => nsfw}/lvl_4/frame_12.png | Bin .../external/{ => nsfw}/lvl_4/frame_13.png | Bin .../external/{ => nsfw}/lvl_4/frame_14.png | Bin .../external/{ => nsfw}/lvl_4/frame_15.png | Bin .../external/{ => nsfw}/lvl_4/frame_16.png | Bin .../external/{ => nsfw}/lvl_4/frame_17.png | Bin .../external/{ => nsfw}/lvl_4/frame_18.png | Bin .../external/{ => nsfw}/lvl_4/frame_19.png | Bin .../external/{ => nsfw}/lvl_4/frame_2.png | Bin .../external/{ => nsfw}/lvl_4/frame_3.png | Bin .../external/{ => nsfw}/lvl_4/frame_4.png | Bin .../external/{ => nsfw}/lvl_4/frame_5.png | Bin .../external/{ => nsfw}/lvl_4/frame_6.png | Bin .../external/{ => nsfw}/lvl_4/frame_7.png | Bin .../external/{ => nsfw}/lvl_4/frame_8.png | Bin .../external/{ => nsfw}/lvl_4/frame_9.png | Bin .../external/{ => nsfw}/lvl_4/meta.txt | 0 .../external/{ => nsfw}/lvl_5/frame_0.png | Bin .../external/{ => nsfw}/lvl_5/frame_1.png | Bin .../external/{ => nsfw}/lvl_5/frame_10.png | Bin .../external/{ => nsfw}/lvl_5/frame_11.png | Bin .../external/{ => nsfw}/lvl_5/frame_12.png | Bin .../external/{ => nsfw}/lvl_5/frame_13.png | Bin .../external/{ => nsfw}/lvl_5/frame_14.png | Bin .../external/{ => nsfw}/lvl_5/frame_15.png | Bin .../external/{ => nsfw}/lvl_5/frame_16.png | Bin .../external/{ => nsfw}/lvl_5/frame_17.png | Bin .../external/{ => nsfw}/lvl_5/frame_18.png | Bin .../external/{ => nsfw}/lvl_5/frame_19.png | Bin .../external/{ => nsfw}/lvl_5/frame_2.png | Bin .../external/{ => nsfw}/lvl_5/frame_20.png | Bin .../external/{ => nsfw}/lvl_5/frame_21.png | Bin .../external/{ => nsfw}/lvl_5/frame_22.png | Bin .../external/{ => nsfw}/lvl_5/frame_23.png | Bin .../external/{ => nsfw}/lvl_5/frame_24.png | Bin .../external/{ => nsfw}/lvl_5/frame_25.png | Bin .../external/{ => nsfw}/lvl_5/frame_26.png | Bin .../external/{ => nsfw}/lvl_5/frame_27.png | Bin .../external/{ => nsfw}/lvl_5/frame_3.png | Bin .../external/{ => nsfw}/lvl_5/frame_4.png | Bin .../external/{ => nsfw}/lvl_5/frame_5.png | Bin .../external/{ => nsfw}/lvl_5/frame_6.png | Bin .../external/{ => nsfw}/lvl_5/frame_7.png | Bin .../external/{ => nsfw}/lvl_5/frame_8.png | Bin .../external/{ => nsfw}/lvl_5/frame_9.png | Bin .../external/{ => nsfw}/lvl_5/meta.txt | 0 .../external/{ => nsfw}/lvl_6/frame_0.png | Bin .../external/{ => nsfw}/lvl_6/frame_1.png | Bin .../external/{ => nsfw}/lvl_6/frame_2.png | Bin .../external/{ => nsfw}/lvl_6/frame_3.png | Bin .../external/{ => nsfw}/lvl_6/frame_4.png | Bin .../external/{ => nsfw}/lvl_6/frame_5.png | Bin .../external/{ => nsfw}/lvl_6/frame_6.png | Bin .../external/{ => nsfw}/lvl_6/meta.txt | 0 .../external/{ => nsfw}/lvl_7/frame_0.png | Bin .../external/{ => nsfw}/lvl_7/frame_1.png | Bin .../external/{ => nsfw}/lvl_7/frame_10.png | Bin .../external/{ => nsfw}/lvl_7/frame_11.png | Bin .../external/{ => nsfw}/lvl_7/frame_12.png | Bin .../external/{ => nsfw}/lvl_7/frame_13.png | Bin .../external/{ => nsfw}/lvl_7/frame_2.png | Bin .../external/{ => nsfw}/lvl_7/frame_3.png | Bin .../external/{ => nsfw}/lvl_7/frame_4.png | Bin .../external/{ => nsfw}/lvl_7/frame_5.png | Bin .../external/{ => nsfw}/lvl_7/frame_6.png | Bin .../external/{ => nsfw}/lvl_7/frame_7.png | Bin .../external/{ => nsfw}/lvl_7/frame_8.png | Bin .../external/{ => nsfw}/lvl_7/frame_9.png | Bin .../external/{ => nsfw}/lvl_7/meta.txt | 0 .../external/{ => nsfw}/lvl_8/frame_0.png | Bin .../external/{ => nsfw}/lvl_8/frame_1.png | Bin .../external/{ => nsfw}/lvl_8/frame_2.png | Bin .../external/{ => nsfw}/lvl_8/frame_3.png | Bin .../external/{ => nsfw}/lvl_8/frame_4.png | Bin .../external/{ => nsfw}/lvl_8/frame_5.png | Bin .../external/{ => nsfw}/lvl_8/meta.txt | 0 .../external/{ => nsfw}/lvl_9/frame_0.png | Bin .../external/{ => nsfw}/lvl_9/frame_1.png | Bin .../external/{ => nsfw}/lvl_9/frame_2.png | Bin .../external/{ => nsfw}/lvl_9/frame_3.png | Bin .../external/{ => nsfw}/lvl_9/frame_4.png | Bin .../external/{ => nsfw}/lvl_9/frame_5.png | Bin .../external/{ => nsfw}/lvl_9/frame_6.png | Bin .../external/{ => nsfw}/lvl_9/frame_7.png | Bin .../external/{ => nsfw}/lvl_9/meta.txt | 0 .../dolphin/external/{ => nsfw}/manifest.txt | 60 ++--- .../external/sfw/L1_Boxing_128x64/frame_0.png | Bin 0 -> 1548 bytes .../external/sfw/L1_Boxing_128x64/frame_1.png | Bin 0 -> 1550 bytes .../external/sfw/L1_Boxing_128x64/frame_2.png | Bin 0 -> 1609 bytes .../external/sfw/L1_Boxing_128x64/frame_3.png | Bin 0 -> 1518 bytes .../external/sfw/L1_Boxing_128x64/frame_4.png | Bin 0 -> 1537 bytes .../external/sfw/L1_Boxing_128x64/frame_5.png | Bin 0 -> 1555 bytes .../external/sfw/L1_Boxing_128x64/frame_6.png | Bin 0 -> 1543 bytes .../external/sfw/L1_Boxing_128x64/meta.txt | 32 +++ .../external/sfw/L1_Cry_128x64/frame_0.png | Bin 0 -> 1942 bytes .../external/sfw/L1_Cry_128x64/frame_1.png | Bin 0 -> 1952 bytes .../external/sfw/L1_Cry_128x64/frame_2.png | Bin 0 -> 1945 bytes .../external/sfw/L1_Cry_128x64/frame_3.png | Bin 0 -> 1941 bytes .../external/sfw/L1_Cry_128x64/frame_4.png | Bin 0 -> 1938 bytes .../external/sfw/L1_Cry_128x64/frame_5.png | Bin 0 -> 1928 bytes .../external/sfw/L1_Cry_128x64/frame_6.png | Bin 0 -> 1946 bytes .../external/sfw/L1_Cry_128x64/frame_7.png | Bin 0 -> 1950 bytes .../external/sfw/L1_Cry_128x64/meta.txt | 41 ++++ .../sfw/L1_Furippa1_128x64/frame_0.png | Bin 0 -> 1302 bytes .../sfw/L1_Furippa1_128x64/frame_1.png | Bin 0 -> 1333 bytes .../sfw/L1_Furippa1_128x64/frame_10.png | Bin 0 -> 1524 bytes .../sfw/L1_Furippa1_128x64/frame_11.png | Bin 0 -> 1782 bytes .../sfw/L1_Furippa1_128x64/frame_12.png | Bin 0 -> 1607 bytes .../sfw/L1_Furippa1_128x64/frame_13.png | Bin 0 -> 1679 bytes .../sfw/L1_Furippa1_128x64/frame_14.png | Bin 0 -> 1714 bytes .../sfw/L1_Furippa1_128x64/frame_15.png | Bin 0 -> 1775 bytes .../sfw/L1_Furippa1_128x64/frame_16.png | Bin 0 -> 1475 bytes .../sfw/L1_Furippa1_128x64/frame_17.png | Bin 0 -> 1428 bytes .../sfw/L1_Furippa1_128x64/frame_18.png | Bin 0 -> 1346 bytes .../sfw/L1_Furippa1_128x64/frame_2.png | Bin 0 -> 1339 bytes .../sfw/L1_Furippa1_128x64/frame_3.png | Bin 0 -> 1328 bytes .../sfw/L1_Furippa1_128x64/frame_4.png | Bin 0 -> 1383 bytes .../sfw/L1_Furippa1_128x64/frame_5.png | Bin 0 -> 1390 bytes .../sfw/L1_Furippa1_128x64/frame_6.png | Bin 0 -> 1397 bytes .../sfw/L1_Furippa1_128x64/frame_7.png | Bin 0 -> 1302 bytes .../sfw/L1_Furippa1_128x64/frame_8.png | Bin 0 -> 1291 bytes .../sfw/L1_Furippa1_128x64/frame_9.png | Bin 0 -> 1337 bytes .../external/sfw/L1_Furippa1_128x64/meta.txt | 14 ++ .../sfw/L1_Happy_holidays_128x64/frame_0.png | Bin 0 -> 1787 bytes .../sfw/L1_Happy_holidays_128x64/frame_1.png | Bin 0 -> 1795 bytes .../sfw/L1_Happy_holidays_128x64/frame_10.png | Bin 0 -> 1791 bytes .../sfw/L1_Happy_holidays_128x64/frame_11.png | Bin 0 -> 1814 bytes .../sfw/L1_Happy_holidays_128x64/frame_12.png | Bin 0 -> 1779 bytes .../sfw/L1_Happy_holidays_128x64/frame_2.png | Bin 0 -> 1774 bytes .../sfw/L1_Happy_holidays_128x64/frame_3.png | Bin 0 -> 1801 bytes .../sfw/L1_Happy_holidays_128x64/frame_4.png | Bin 0 -> 1799 bytes .../sfw/L1_Happy_holidays_128x64/frame_5.png | Bin 0 -> 1797 bytes .../sfw/L1_Happy_holidays_128x64/frame_6.png | Bin 0 -> 1789 bytes .../sfw/L1_Happy_holidays_128x64/frame_7.png | Bin 0 -> 1804 bytes .../sfw/L1_Happy_holidays_128x64/frame_8.png | Bin 0 -> 1809 bytes .../sfw/L1_Happy_holidays_128x64/frame_9.png | Bin 0 -> 1816 bytes .../sfw/L1_Happy_holidays_128x64/meta.txt | 23 ++ .../external/sfw/L1_Laptop_128x51/frame_0.png | Bin 0 -> 4914 bytes .../external/sfw/L1_Laptop_128x51/frame_1.png | Bin 0 -> 4917 bytes .../external/sfw/L1_Laptop_128x51/frame_2.png | Bin 0 -> 4914 bytes .../external/sfw/L1_Laptop_128x51/frame_3.png | Bin 0 -> 4914 bytes .../external/sfw/L1_Laptop_128x51/frame_4.png | Bin 0 -> 4909 bytes .../external/sfw/L1_Laptop_128x51/frame_5.png | Bin 0 -> 4908 bytes .../external/sfw/L1_Laptop_128x51/frame_6.png | Bin 0 -> 4900 bytes .../external/sfw/L1_Laptop_128x51/frame_7.png | Bin 0 -> 4907 bytes .../external/sfw/L1_Laptop_128x51/meta.txt | 32 +++ .../sfw/L1_Leaving_sad_128x64/frame_0.png | Bin 0 -> 1575 bytes .../sfw/L1_Leaving_sad_128x64/frame_1.png | Bin 0 -> 1589 bytes .../sfw/L1_Leaving_sad_128x64/frame_10.png | Bin 0 -> 1386 bytes .../sfw/L1_Leaving_sad_128x64/frame_11.png | Bin 0 -> 1358 bytes .../sfw/L1_Leaving_sad_128x64/frame_12.png | Bin 0 -> 1365 bytes .../sfw/L1_Leaving_sad_128x64/frame_2.png | Bin 0 -> 1597 bytes .../sfw/L1_Leaving_sad_128x64/frame_3.png | Bin 0 -> 1617 bytes .../sfw/L1_Leaving_sad_128x64/frame_4.png | Bin 0 -> 1544 bytes .../sfw/L1_Leaving_sad_128x64/frame_5.png | Bin 0 -> 1523 bytes .../sfw/L1_Leaving_sad_128x64/frame_6.png | Bin 0 -> 1555 bytes .../sfw/L1_Leaving_sad_128x64/frame_7.png | Bin 0 -> 1574 bytes .../sfw/L1_Leaving_sad_128x64/frame_8.png | Bin 0 -> 1479 bytes .../sfw/L1_Leaving_sad_128x64/frame_9.png | Bin 0 -> 1382 bytes .../sfw/L1_Leaving_sad_128x64/meta.txt | 32 +++ .../sfw/L1_Mad_fist_128x64/frame_0.png | Bin 0 -> 1556 bytes .../sfw/L1_Mad_fist_128x64/frame_1.png | Bin 0 -> 1580 bytes .../sfw/L1_Mad_fist_128x64/frame_10.png | Bin 0 -> 1606 bytes .../sfw/L1_Mad_fist_128x64/frame_11.png | Bin 0 -> 1556 bytes .../sfw/L1_Mad_fist_128x64/frame_12.png | Bin 0 -> 1541 bytes .../sfw/L1_Mad_fist_128x64/frame_13.png | Bin 0 -> 1545 bytes .../sfw/L1_Mad_fist_128x64/frame_2.png | Bin 0 -> 1558 bytes .../sfw/L1_Mad_fist_128x64/frame_3.png | Bin 0 -> 1583 bytes .../sfw/L1_Mad_fist_128x64/frame_4.png | Bin 0 -> 1560 bytes .../sfw/L1_Mad_fist_128x64/frame_5.png | Bin 0 -> 1557 bytes .../sfw/L1_Mad_fist_128x64/frame_6.png | Bin 0 -> 1581 bytes .../sfw/L1_Mad_fist_128x64/frame_7.png | Bin 0 -> 1575 bytes .../sfw/L1_Mad_fist_128x64/frame_8.png | Bin 0 -> 1581 bytes .../sfw/L1_Mad_fist_128x64/frame_9.png | Bin 0 -> 1584 bytes .../external/sfw/L1_Mad_fist_128x64/meta.txt | 23 ++ .../external/sfw/L1_Mods_128x64/frame_0.png | Bin 0 -> 4344 bytes .../external/sfw/L1_Mods_128x64/frame_1.png | Bin 0 -> 4351 bytes .../external/sfw/L1_Mods_128x64/frame_10.png | Bin 0 -> 4370 bytes .../external/sfw/L1_Mods_128x64/frame_11.png | Bin 0 -> 4342 bytes .../external/sfw/L1_Mods_128x64/frame_12.png | Bin 0 -> 4327 bytes .../external/sfw/L1_Mods_128x64/frame_13.png | Bin 0 -> 4363 bytes .../external/sfw/L1_Mods_128x64/frame_14.png | Bin 0 -> 4306 bytes .../external/sfw/L1_Mods_128x64/frame_15.png | Bin 0 -> 4325 bytes .../external/sfw/L1_Mods_128x64/frame_16.png | Bin 0 -> 4346 bytes .../external/sfw/L1_Mods_128x64/frame_17.png | Bin 0 -> 4338 bytes .../external/sfw/L1_Mods_128x64/frame_18.png | Bin 0 -> 4346 bytes .../external/sfw/L1_Mods_128x64/frame_19.png | Bin 0 -> 4339 bytes .../external/sfw/L1_Mods_128x64/frame_2.png | Bin 0 -> 4344 bytes .../external/sfw/L1_Mods_128x64/frame_20.png | Bin 0 -> 4314 bytes .../external/sfw/L1_Mods_128x64/frame_21.png | Bin 0 -> 4357 bytes .../external/sfw/L1_Mods_128x64/frame_22.png | Bin 0 -> 4320 bytes .../external/sfw/L1_Mods_128x64/frame_23.png | Bin 0 -> 4332 bytes .../external/sfw/L1_Mods_128x64/frame_24.png | Bin 0 -> 4284 bytes .../external/sfw/L1_Mods_128x64/frame_25.png | Bin 0 -> 4149 bytes .../external/sfw/L1_Mods_128x64/frame_26.png | Bin 0 -> 4260 bytes .../external/sfw/L1_Mods_128x64/frame_27.png | Bin 0 -> 4376 bytes .../external/sfw/L1_Mods_128x64/frame_28.png | Bin 0 -> 4393 bytes .../external/sfw/L1_Mods_128x64/frame_29.png | Bin 0 -> 4380 bytes .../external/sfw/L1_Mods_128x64/frame_3.png | Bin 0 -> 4341 bytes .../external/sfw/L1_Mods_128x64/frame_30.png | Bin 0 -> 4390 bytes .../external/sfw/L1_Mods_128x64/frame_31.png | Bin 0 -> 4383 bytes .../external/sfw/L1_Mods_128x64/frame_32.png | Bin 0 -> 4402 bytes .../external/sfw/L1_Mods_128x64/frame_33.png | Bin 0 -> 4340 bytes .../external/sfw/L1_Mods_128x64/frame_34.png | Bin 0 -> 4253 bytes .../external/sfw/L1_Mods_128x64/frame_35.png | Bin 0 -> 4342 bytes .../external/sfw/L1_Mods_128x64/frame_36.png | Bin 0 -> 4315 bytes .../external/sfw/L1_Mods_128x64/frame_37.png | Bin 0 -> 4267 bytes .../external/sfw/L1_Mods_128x64/frame_38.png | Bin 0 -> 4301 bytes .../external/sfw/L1_Mods_128x64/frame_39.png | Bin 0 -> 4326 bytes .../external/sfw/L1_Mods_128x64/frame_4.png | Bin 0 -> 4327 bytes .../external/sfw/L1_Mods_128x64/frame_40.png | Bin 0 -> 4313 bytes .../external/sfw/L1_Mods_128x64/frame_5.png | Bin 0 -> 4357 bytes .../external/sfw/L1_Mods_128x64/frame_6.png | Bin 0 -> 4334 bytes .../external/sfw/L1_Mods_128x64/frame_7.png | Bin 0 -> 4331 bytes .../external/sfw/L1_Mods_128x64/frame_8.png | Bin 0 -> 4352 bytes .../external/sfw/L1_Mods_128x64/frame_9.png | Bin 0 -> 4360 bytes .../external/sfw/L1_Mods_128x64/meta.txt | 14 ++ .../sfw/L1_Painting_128x64/frame_0.png | Bin 0 -> 1607 bytes .../sfw/L1_Painting_128x64/frame_1.png | Bin 0 -> 1618 bytes .../sfw/L1_Painting_128x64/frame_10.png | Bin 0 -> 1606 bytes .../sfw/L1_Painting_128x64/frame_11.png | Bin 0 -> 1579 bytes .../sfw/L1_Painting_128x64/frame_2.png | Bin 0 -> 1608 bytes .../sfw/L1_Painting_128x64/frame_3.png | Bin 0 -> 1585 bytes .../sfw/L1_Painting_128x64/frame_4.png | Bin 0 -> 1600 bytes .../sfw/L1_Painting_128x64/frame_5.png | Bin 0 -> 1609 bytes .../sfw/L1_Painting_128x64/frame_6.png | Bin 0 -> 1588 bytes .../sfw/L1_Painting_128x64/frame_7.png | Bin 0 -> 1630 bytes .../sfw/L1_Painting_128x64/frame_8.png | Bin 0 -> 1623 bytes .../sfw/L1_Painting_128x64/frame_9.png | Bin 0 -> 1614 bytes .../external/sfw/L1_Painting_128x64/meta.txt | 32 +++ .../sfw/L1_Read_books_128x64/frame_0.png | Bin 0 -> 1762 bytes .../sfw/L1_Read_books_128x64/frame_1.png | Bin 0 -> 1762 bytes .../sfw/L1_Read_books_128x64/frame_2.png | Bin 0 -> 1756 bytes .../sfw/L1_Read_books_128x64/frame_3.png | Bin 0 -> 1759 bytes .../sfw/L1_Read_books_128x64/frame_4.png | Bin 0 -> 1771 bytes .../sfw/L1_Read_books_128x64/frame_5.png | Bin 0 -> 1754 bytes .../sfw/L1_Read_books_128x64/frame_6.png | Bin 0 -> 1750 bytes .../sfw/L1_Read_books_128x64/frame_7.png | Bin 0 -> 1747 bytes .../sfw/L1_Read_books_128x64/frame_8.png | Bin 0 -> 1750 bytes .../sfw/L1_Read_books_128x64/meta.txt | 23 ++ .../sfw/L1_Recording_128x51/frame_0.png | Bin 0 -> 1752 bytes .../sfw/L1_Recording_128x51/frame_1.png | Bin 0 -> 1742 bytes .../sfw/L1_Recording_128x51/frame_10.png | Bin 0 -> 1708 bytes .../sfw/L1_Recording_128x51/frame_11.png | Bin 0 -> 1745 bytes .../sfw/L1_Recording_128x51/frame_2.png | Bin 0 -> 1688 bytes .../sfw/L1_Recording_128x51/frame_3.png | Bin 0 -> 1745 bytes .../sfw/L1_Recording_128x51/frame_4.png | Bin 0 -> 1735 bytes .../sfw/L1_Recording_128x51/frame_5.png | Bin 0 -> 1691 bytes .../sfw/L1_Recording_128x51/frame_6.png | Bin 0 -> 1752 bytes .../sfw/L1_Recording_128x51/frame_7.png | Bin 0 -> 1689 bytes .../sfw/L1_Recording_128x51/frame_8.png | Bin 0 -> 1766 bytes .../sfw/L1_Recording_128x51/frame_9.png | Bin 0 -> 1732 bytes .../external/sfw/L1_Recording_128x51/meta.txt | 14 ++ .../external/sfw/L1_Sleep_128x64/frame_0.png | Bin 0 -> 1542 bytes .../external/sfw/L1_Sleep_128x64/frame_1.png | Bin 0 -> 1552 bytes .../external/sfw/L1_Sleep_128x64/frame_2.png | Bin 0 -> 1552 bytes .../external/sfw/L1_Sleep_128x64/frame_3.png | Bin 0 -> 1563 bytes .../external/sfw/L1_Sleep_128x64/meta.txt | 41 ++++ .../sfw/L1_Sleigh_ride_128x64/frame_0.png | Bin 0 -> 1656 bytes .../sfw/L1_Sleigh_ride_128x64/frame_1.png | Bin 0 -> 1754 bytes .../sfw/L1_Sleigh_ride_128x64/frame_10.png | Bin 0 -> 1494 bytes .../sfw/L1_Sleigh_ride_128x64/frame_11.png | Bin 0 -> 1637 bytes .../sfw/L1_Sleigh_ride_128x64/frame_12.png | Bin 0 -> 1713 bytes .../sfw/L1_Sleigh_ride_128x64/frame_13.png | Bin 0 -> 1585 bytes .../sfw/L1_Sleigh_ride_128x64/frame_14.png | Bin 0 -> 1634 bytes .../sfw/L1_Sleigh_ride_128x64/frame_15.png | Bin 0 -> 1771 bytes .../sfw/L1_Sleigh_ride_128x64/frame_16.png | Bin 0 -> 1681 bytes .../sfw/L1_Sleigh_ride_128x64/frame_17.png | Bin 0 -> 1503 bytes .../sfw/L1_Sleigh_ride_128x64/frame_18.png | Bin 0 -> 1663 bytes .../sfw/L1_Sleigh_ride_128x64/frame_19.png | Bin 0 -> 1661 bytes .../sfw/L1_Sleigh_ride_128x64/frame_2.png | Bin 0 -> 1681 bytes .../sfw/L1_Sleigh_ride_128x64/frame_20.png | Bin 0 -> 1559 bytes .../sfw/L1_Sleigh_ride_128x64/frame_21.png | Bin 0 -> 1542 bytes .../sfw/L1_Sleigh_ride_128x64/frame_22.png | Bin 0 -> 1736 bytes .../sfw/L1_Sleigh_ride_128x64/frame_23.png | Bin 0 -> 1621 bytes .../sfw/L1_Sleigh_ride_128x64/frame_24.png | Bin 0 -> 1628 bytes .../sfw/L1_Sleigh_ride_128x64/frame_25.png | Bin 0 -> 1671 bytes .../sfw/L1_Sleigh_ride_128x64/frame_26.png | Bin 0 -> 1636 bytes .../sfw/L1_Sleigh_ride_128x64/frame_27.png | Bin 0 -> 1621 bytes .../sfw/L1_Sleigh_ride_128x64/frame_28.png | Bin 0 -> 1099 bytes .../sfw/L1_Sleigh_ride_128x64/frame_29.png | Bin 0 -> 812 bytes .../sfw/L1_Sleigh_ride_128x64/frame_3.png | Bin 0 -> 1651 bytes .../sfw/L1_Sleigh_ride_128x64/frame_30.png | Bin 0 -> 536 bytes .../sfw/L1_Sleigh_ride_128x64/frame_31.png | Bin 0 -> 492 bytes .../sfw/L1_Sleigh_ride_128x64/frame_32.png | Bin 0 -> 503 bytes .../sfw/L1_Sleigh_ride_128x64/frame_33.png | Bin 0 -> 897 bytes .../sfw/L1_Sleigh_ride_128x64/frame_34.png | Bin 0 -> 1490 bytes .../sfw/L1_Sleigh_ride_128x64/frame_35.png | Bin 0 -> 1741 bytes .../sfw/L1_Sleigh_ride_128x64/frame_36.png | Bin 0 -> 1538 bytes .../sfw/L1_Sleigh_ride_128x64/frame_4.png | Bin 0 -> 1668 bytes .../sfw/L1_Sleigh_ride_128x64/frame_5.png | Bin 0 -> 1555 bytes .../sfw/L1_Sleigh_ride_128x64/frame_6.png | Bin 0 -> 1521 bytes .../sfw/L1_Sleigh_ride_128x64/frame_7.png | Bin 0 -> 1642 bytes .../sfw/L1_Sleigh_ride_128x64/frame_8.png | Bin 0 -> 1694 bytes .../sfw/L1_Sleigh_ride_128x64/frame_9.png | Bin 0 -> 1605 bytes .../sfw/L1_Sleigh_ride_128x64/meta.txt | 23 ++ .../external/sfw/L1_Waves_128x50/frame_0.png | Bin 0 -> 2272 bytes .../external/sfw/L1_Waves_128x50/frame_1.png | Bin 0 -> 2282 bytes .../external/sfw/L1_Waves_128x50/frame_2.png | Bin 0 -> 1446 bytes .../external/sfw/L1_Waves_128x50/frame_3.png | Bin 0 -> 1446 bytes .../external/sfw/L1_Waves_128x50/meta.txt | 50 +++++ .../sfw/L2_Furippa2_128x64/frame_0.png | Bin 0 -> 1389 bytes .../sfw/L2_Furippa2_128x64/frame_1.png | Bin 0 -> 1417 bytes .../sfw/L2_Furippa2_128x64/frame_10.png | Bin 0 -> 1524 bytes .../sfw/L2_Furippa2_128x64/frame_11.png | Bin 0 -> 1782 bytes .../sfw/L2_Furippa2_128x64/frame_12.png | Bin 0 -> 1607 bytes .../sfw/L2_Furippa2_128x64/frame_13.png | Bin 0 -> 1679 bytes .../sfw/L2_Furippa2_128x64/frame_14.png | Bin 0 -> 1714 bytes .../sfw/L2_Furippa2_128x64/frame_15.png | Bin 0 -> 1795 bytes .../sfw/L2_Furippa2_128x64/frame_16.png | Bin 0 -> 1549 bytes .../sfw/L2_Furippa2_128x64/frame_17.png | Bin 0 -> 1514 bytes .../sfw/L2_Furippa2_128x64/frame_18.png | Bin 0 -> 1441 bytes .../sfw/L2_Furippa2_128x64/frame_2.png | Bin 0 -> 1421 bytes .../sfw/L2_Furippa2_128x64/frame_3.png | Bin 0 -> 1411 bytes .../sfw/L2_Furippa2_128x64/frame_4.png | Bin 0 -> 1454 bytes .../sfw/L2_Furippa2_128x64/frame_5.png | Bin 0 -> 1459 bytes .../sfw/L2_Furippa2_128x64/frame_6.png | Bin 0 -> 1465 bytes .../sfw/L2_Furippa2_128x64/frame_7.png | Bin 0 -> 1389 bytes .../sfw/L2_Furippa2_128x64/frame_8.png | Bin 0 -> 1348 bytes .../sfw/L2_Furippa2_128x64/frame_9.png | Bin 0 -> 1347 bytes .../external/sfw/L2_Furippa2_128x64/meta.txt | 14 ++ .../sfw/L2_Hacking_pc_128x64/frame_0.png | Bin 0 -> 1604 bytes .../sfw/L2_Hacking_pc_128x64/frame_1.png | Bin 0 -> 1601 bytes .../sfw/L2_Hacking_pc_128x64/frame_2.png | Bin 0 -> 1606 bytes .../sfw/L2_Hacking_pc_128x64/frame_3.png | Bin 0 -> 1654 bytes .../sfw/L2_Hacking_pc_128x64/frame_4.png | Bin 0 -> 1658 bytes .../sfw/L2_Hacking_pc_128x64/meta.txt | 32 +++ .../sfw/L2_Soldering_128x64/frame_0.png | Bin 0 -> 1778 bytes .../sfw/L2_Soldering_128x64/frame_1.png | Bin 0 -> 1768 bytes .../sfw/L2_Soldering_128x64/frame_10.png | Bin 0 -> 1781 bytes .../sfw/L2_Soldering_128x64/frame_2.png | Bin 0 -> 1779 bytes .../sfw/L2_Soldering_128x64/frame_3.png | Bin 0 -> 1778 bytes .../sfw/L2_Soldering_128x64/frame_4.png | Bin 0 -> 1784 bytes .../sfw/L2_Soldering_128x64/frame_5.png | Bin 0 -> 1782 bytes .../sfw/L2_Soldering_128x64/frame_6.png | Bin 0 -> 1799 bytes .../sfw/L2_Soldering_128x64/frame_7.png | Bin 0 -> 1797 bytes .../sfw/L2_Soldering_128x64/frame_8.png | Bin 0 -> 1798 bytes .../sfw/L2_Soldering_128x64/frame_9.png | Bin 0 -> 1778 bytes .../external/sfw/L2_Soldering_128x64/meta.txt | 23 ++ .../sfw/L2_Wake_up_128x64/frame_0.png | Bin 0 -> 4779 bytes .../sfw/L2_Wake_up_128x64/frame_1.png | Bin 0 -> 4782 bytes .../sfw/L2_Wake_up_128x64/frame_10.png | Bin 0 -> 4835 bytes .../sfw/L2_Wake_up_128x64/frame_11.png | Bin 0 -> 4838 bytes .../sfw/L2_Wake_up_128x64/frame_12.png | Bin 0 -> 4775 bytes .../sfw/L2_Wake_up_128x64/frame_13.png | Bin 0 -> 4783 bytes .../sfw/L2_Wake_up_128x64/frame_14.png | Bin 0 -> 4722 bytes .../sfw/L2_Wake_up_128x64/frame_15.png | Bin 0 -> 4742 bytes .../sfw/L2_Wake_up_128x64/frame_16.png | Bin 0 -> 4639 bytes .../sfw/L2_Wake_up_128x64/frame_17.png | Bin 0 -> 3796 bytes .../sfw/L2_Wake_up_128x64/frame_18.png | Bin 0 -> 3834 bytes .../sfw/L2_Wake_up_128x64/frame_19.png | Bin 0 -> 4664 bytes .../sfw/L2_Wake_up_128x64/frame_2.png | Bin 0 -> 4785 bytes .../sfw/L2_Wake_up_128x64/frame_20.png | Bin 0 -> 4779 bytes .../sfw/L2_Wake_up_128x64/frame_3.png | Bin 0 -> 4793 bytes .../sfw/L2_Wake_up_128x64/frame_4.png | Bin 0 -> 4815 bytes .../sfw/L2_Wake_up_128x64/frame_5.png | Bin 0 -> 1743 bytes .../sfw/L2_Wake_up_128x64/frame_6.png | Bin 0 -> 1630 bytes .../sfw/L2_Wake_up_128x64/frame_7.png | Bin 0 -> 4722 bytes .../sfw/L2_Wake_up_128x64/frame_8.png | Bin 0 -> 4731 bytes .../sfw/L2_Wake_up_128x64/frame_9.png | Bin 0 -> 4656 bytes .../external/sfw/L2_Wake_up_128x64/meta.txt | 14 ++ .../sfw/L3_Furippa3_128x64/frame_0.png | Bin 0 -> 1442 bytes .../sfw/L3_Furippa3_128x64/frame_1.png | Bin 0 -> 1478 bytes .../sfw/L3_Furippa3_128x64/frame_10.png | Bin 0 -> 1609 bytes .../sfw/L3_Furippa3_128x64/frame_11.png | Bin 0 -> 1826 bytes .../sfw/L3_Furippa3_128x64/frame_12.png | Bin 0 -> 1607 bytes .../sfw/L3_Furippa3_128x64/frame_13.png | Bin 0 -> 1679 bytes .../sfw/L3_Furippa3_128x64/frame_14.png | Bin 0 -> 1714 bytes .../sfw/L3_Furippa3_128x64/frame_15.png | Bin 0 -> 1805 bytes .../sfw/L3_Furippa3_128x64/frame_16.png | Bin 0 -> 1575 bytes .../sfw/L3_Furippa3_128x64/frame_17.png | Bin 0 -> 1560 bytes .../sfw/L3_Furippa3_128x64/frame_18.png | Bin 0 -> 1492 bytes .../sfw/L3_Furippa3_128x64/frame_2.png | Bin 0 -> 1472 bytes .../sfw/L3_Furippa3_128x64/frame_3.png | Bin 0 -> 1466 bytes .../sfw/L3_Furippa3_128x64/frame_4.png | Bin 0 -> 1513 bytes .../sfw/L3_Furippa3_128x64/frame_5.png | Bin 0 -> 1519 bytes .../sfw/L3_Furippa3_128x64/frame_6.png | Bin 0 -> 1526 bytes .../sfw/L3_Furippa3_128x64/frame_7.png | Bin 0 -> 1442 bytes .../sfw/L3_Furippa3_128x64/frame_8.png | Bin 0 -> 1456 bytes .../sfw/L3_Furippa3_128x64/frame_9.png | Bin 0 -> 1477 bytes .../external/sfw/L3_Furippa3_128x64/meta.txt | 14 ++ .../sfw/L3_Hijack_radio_128x64/frame_0.png | Bin 0 -> 1611 bytes .../sfw/L3_Hijack_radio_128x64/frame_1.png | Bin 0 -> 1619 bytes .../sfw/L3_Hijack_radio_128x64/frame_10.png | Bin 0 -> 1642 bytes .../sfw/L3_Hijack_radio_128x64/frame_11.png | Bin 0 -> 1660 bytes .../sfw/L3_Hijack_radio_128x64/frame_12.png | Bin 0 -> 1627 bytes .../sfw/L3_Hijack_radio_128x64/frame_13.png | Bin 0 -> 1674 bytes .../sfw/L3_Hijack_radio_128x64/frame_2.png | Bin 0 -> 1615 bytes .../sfw/L3_Hijack_radio_128x64/frame_3.png | Bin 0 -> 1622 bytes .../sfw/L3_Hijack_radio_128x64/frame_4.png | Bin 0 -> 1667 bytes .../sfw/L3_Hijack_radio_128x64/frame_5.png | Bin 0 -> 1672 bytes .../sfw/L3_Hijack_radio_128x64/frame_6.png | Bin 0 -> 1609 bytes .../sfw/L3_Hijack_radio_128x64/frame_7.png | Bin 0 -> 1755 bytes .../sfw/L3_Hijack_radio_128x64/frame_8.png | Bin 0 -> 1754 bytes .../sfw/L3_Hijack_radio_128x64/frame_9.png | Bin 0 -> 1706 bytes .../sfw/L3_Hijack_radio_128x64/meta.txt | 14 ++ .../sfw/L3_Lab_research_128x54/frame_0.png | Bin 0 -> 1687 bytes .../sfw/L3_Lab_research_128x54/frame_1.png | Bin 0 -> 1700 bytes .../sfw/L3_Lab_research_128x54/frame_10.png | Bin 0 -> 1640 bytes .../sfw/L3_Lab_research_128x54/frame_11.png | Bin 0 -> 1656 bytes .../sfw/L3_Lab_research_128x54/frame_12.png | Bin 0 -> 1639 bytes .../sfw/L3_Lab_research_128x54/frame_13.png | Bin 0 -> 1689 bytes .../sfw/L3_Lab_research_128x54/frame_2.png | Bin 0 -> 1707 bytes .../sfw/L3_Lab_research_128x54/frame_3.png | Bin 0 -> 1680 bytes .../sfw/L3_Lab_research_128x54/frame_4.png | Bin 0 -> 1691 bytes .../sfw/L3_Lab_research_128x54/frame_5.png | Bin 0 -> 1708 bytes .../sfw/L3_Lab_research_128x54/frame_6.png | Bin 0 -> 1689 bytes .../sfw/L3_Lab_research_128x54/frame_7.png | Bin 0 -> 1655 bytes .../sfw/L3_Lab_research_128x54/frame_8.png | Bin 0 -> 1645 bytes .../sfw/L3_Lab_research_128x54/frame_9.png | Bin 0 -> 1655 bytes .../sfw/L3_Lab_research_128x54/meta.txt | 59 +++++ assets/dolphin/external/sfw/manifest.txt | 149 ++++++++++++ .../PaxGod_TikTok_Marketing/frame_0.bm | Bin 416 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_1.bm | Bin 385 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_10.bm | Bin 365 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_11.bm | Bin 391 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_12.bm | Bin 395 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_13.bm | Bin 385 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_14.bm | Bin 440 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_15.bm | Bin 451 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_16.bm | Bin 440 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_17.bm | Bin 444 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_18.bm | Bin 451 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_19.bm | Bin 444 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_2.bm | Bin 409 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_20.bm | Bin 463 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_21.bm | Bin 454 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_3.bm | Bin 398 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_4.bm | Bin 390 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_5.bm | Bin 378 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_6.bm | Bin 350 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_7.bm | Bin 368 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_8.bm | Bin 361 -> 0 bytes .../PaxGod_TikTok_Marketing/frame_9.bm | Bin 358 -> 0 bytes assets/resources/dolphin/lvl_13/frame_11.bm | Bin 977 -> 0 bytes assets/resources/dolphin/lvl_13/frame_12.bm | Bin 894 -> 0 bytes assets/resources/dolphin/lvl_13/frame_13.bm | Bin 883 -> 0 bytes assets/resources/dolphin/lvl_13/frame_14.bm | Bin 883 -> 0 bytes assets/resources/dolphin/lvl_13/frame_15.bm | Bin 899 -> 0 bytes assets/resources/dolphin/lvl_13/frame_16.bm | Bin 905 -> 0 bytes assets/resources/dolphin/lvl_13/frame_17.bm | Bin 910 -> 0 bytes assets/resources/dolphin/lvl_13/frame_18.bm | Bin 469 -> 0 bytes assets/resources/dolphin/lvl_13/frame_19.bm | Bin 466 -> 0 bytes assets/resources/dolphin/lvl_13/frame_20.bm | Bin 467 -> 0 bytes assets/resources/dolphin/lvl_13/frame_21.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_22.bm | Bin 435 -> 0 bytes assets/resources/dolphin/lvl_13/frame_23.bm | Bin 426 -> 0 bytes assets/resources/dolphin/lvl_13/frame_24.bm | Bin 417 -> 0 bytes assets/resources/dolphin/lvl_13/frame_25.bm | Bin 432 -> 0 bytes assets/resources/dolphin/lvl_13/frame_26.bm | Bin 445 -> 0 bytes assets/resources/dolphin/lvl_13/frame_27.bm | Bin 442 -> 0 bytes assets/resources/dolphin/lvl_13/frame_28.bm | Bin 446 -> 0 bytes assets/resources/dolphin/lvl_13/frame_29.bm | Bin 434 -> 0 bytes assets/resources/dolphin/lvl_13/frame_30.bm | Bin 427 -> 0 bytes assets/resources/dolphin/lvl_13/frame_31.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_32.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_33.bm | Bin 435 -> 0 bytes assets/resources/dolphin/lvl_13/frame_34.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_35.bm | Bin 435 -> 0 bytes assets/resources/dolphin/lvl_13/frame_36.bm | Bin 423 -> 0 bytes assets/resources/dolphin/lvl_13/frame_37.bm | Bin 436 -> 0 bytes assets/resources/dolphin/lvl_13/frame_38.bm | Bin 431 -> 0 bytes assets/resources/dolphin/lvl_13/frame_39.bm | Bin 444 -> 0 bytes assets/resources/dolphin/lvl_13/frame_40.bm | Bin 432 -> 0 bytes assets/resources/dolphin/lvl_13/frame_41.bm | Bin 430 -> 0 bytes assets/resources/dolphin/lvl_13/frame_42.bm | Bin 429 -> 0 bytes assets/resources/dolphin/lvl_13/frame_43.bm | Bin 436 -> 0 bytes assets/resources/dolphin/lvl_13/frame_44.bm | Bin 436 -> 0 bytes assets/resources/dolphin/lvl_13/frame_45.bm | Bin 445 -> 0 bytes assets/resources/dolphin/lvl_13/frame_46.bm | Bin 430 -> 0 bytes assets/resources/dolphin/lvl_13/frame_47.bm | Bin 444 -> 0 bytes assets/resources/dolphin/lvl_13/frame_48.bm | Bin 423 -> 0 bytes assets/resources/dolphin/lvl_13/frame_49.bm | Bin 421 -> 0 bytes assets/resources/dolphin/lvl_13/frame_50.bm | Bin 432 -> 0 bytes assets/resources/dolphin/lvl_13/frame_51.bm | Bin 422 -> 0 bytes assets/resources/dolphin/lvl_13/frame_52.bm | Bin 410 -> 0 bytes assets/resources/dolphin/lvl_13/frame_53.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_54.bm | Bin 410 -> 0 bytes assets/resources/dolphin/lvl_13/frame_55.bm | Bin 428 -> 0 bytes assets/resources/dolphin/lvl_13/frame_56.bm | Bin 441 -> 0 bytes assets/resources/dolphin/lvl_13/frame_57.bm | Bin 441 -> 0 bytes assets/resources/dolphin/lvl_13/frame_58.bm | Bin 447 -> 0 bytes assets/resources/dolphin/lvl_13/frame_59.bm | Bin 449 -> 0 bytes assets/resources/dolphin/lvl_13/frame_60.bm | Bin 447 -> 0 bytes assets/resources/dolphin/lvl_13/frame_61.bm | Bin 447 -> 0 bytes assets/resources/dolphin/lvl_13/frame_62.bm | Bin 429 -> 0 bytes assets/resources/dolphin/lvl_13/frame_63.bm | Bin 430 -> 0 bytes assets/resources/dolphin/lvl_13/frame_64.bm | Bin 441 -> 0 bytes assets/resources/dolphin/lvl_13/frame_65.bm | Bin 433 -> 0 bytes assets/resources/dolphin/lvl_13/frame_66.bm | Bin 434 -> 0 bytes assets/resources/dolphin/lvl_13/frame_67.bm | Bin 438 -> 0 bytes assets/resources/dolphin/lvl_13/frame_68.bm | Bin 437 -> 0 bytes assets/resources/dolphin/lvl_13/frame_69.bm | Bin 460 -> 0 bytes assets/resources/dolphin/lvl_13/frame_70.bm | Bin 430 -> 0 bytes assets/resources/dolphin/lvl_13/frame_71.bm | Bin 433 -> 0 bytes assets/resources/dolphin/lvl_13/frame_72.bm | Bin 435 -> 0 bytes assets/resources/dolphin/lvl_13/frame_73.bm | Bin 432 -> 0 bytes assets/resources/dolphin/lvl_13/frame_74.bm | Bin 456 -> 0 bytes assets/resources/dolphin/lvl_13/frame_75.bm | Bin 434 -> 0 bytes assets/resources/dolphin/lvl_13/frame_76.bm | Bin 438 -> 0 bytes assets/resources/dolphin/lvl_13/frame_77.bm | Bin 460 -> 0 bytes assets/resources/dolphin/lvl_13/frame_78.bm | Bin 465 -> 0 bytes assets/resources/dolphin/lvl_13/frame_79.bm | Bin 443 -> 0 bytes assets/resources/dolphin/lvl_13/frame_80.bm | Bin 456 -> 0 bytes assets/resources/dolphin/lvl_13/frame_81.bm | Bin 450 -> 0 bytes assets/resources/dolphin/lvl_13/frame_82.bm | Bin 459 -> 0 bytes assets/resources/dolphin/lvl_13/frame_83.bm | Bin 441 -> 0 bytes assets/resources/dolphin/lvl_14/frame_10.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_11.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_12.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_13.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_14.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_15.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_16.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_17.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_18.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_19.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_20.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_21.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_22.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_8.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_14/frame_9.bm | Bin 1025 -> 0 bytes assets/resources/dolphin/lvl_22/frame_10.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_11.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_12.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_13.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_14.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_15.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_16.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_17.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_18.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_19.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_20.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_21.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_22.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_23.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_24.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_25.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_26.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_27.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_28.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_29.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_30.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_31.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_32.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_33.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_34.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_35.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_36.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_37.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_38.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_39.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_40.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_41.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_42.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_43.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_44.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_45.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_46.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_47.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_48.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_49.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_50.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_51.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_52.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_53.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_54.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_55.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_56.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_57.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_22/frame_58.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_59.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_6.bm | Bin 551 -> 0 bytes assets/resources/dolphin/lvl_22/frame_7.bm | Bin 559 -> 0 bytes assets/resources/dolphin/lvl_22/frame_8.bm | Bin 565 -> 0 bytes assets/resources/dolphin/lvl_22/frame_9.bm | Bin 547 -> 0 bytes assets/resources/dolphin/lvl_27/frame_22.bm | Bin 502 -> 0 bytes assets/resources/dolphin/lvl_27/frame_23.bm | Bin 555 -> 0 bytes assets/resources/dolphin/lvl_27/frame_24.bm | Bin 517 -> 0 bytes assets/resources/dolphin/lvl_27/frame_25.bm | Bin 510 -> 0 bytes assets/resources/dolphin/lvl_27/frame_26.bm | Bin 516 -> 0 bytes assets/resources/dolphin/lvl_27/frame_27.bm | Bin 511 -> 0 bytes assets/resources/dolphin/lvl_27/frame_28.bm | Bin 517 -> 0 bytes assets/resources/dolphin/lvl_27/frame_29.bm | Bin 531 -> 0 bytes assets/resources/dolphin/lvl_27/frame_30.bm | Bin 529 -> 0 bytes assets/resources/dolphin/lvl_3/frame_15.bm | Bin 375 -> 0 bytes assets/resources/dolphin/lvl_3/frame_16.bm | Bin 348 -> 0 bytes assets/resources/dolphin/lvl_3/frame_17.bm | Bin 329 -> 0 bytes assets/resources/dolphin/lvl_3/frame_18.bm | Bin 332 -> 0 bytes assets/resources/dolphin/lvl_3/frame_19.bm | Bin 338 -> 0 bytes assets/resources/dolphin/lvl_3/frame_20.bm | Bin 346 -> 0 bytes assets/resources/dolphin/lvl_3/frame_21.bm | Bin 356 -> 0 bytes assets/resources/dolphin/lvl_3/frame_22.bm | Bin 353 -> 0 bytes assets/resources/dolphin/lvl_3/frame_23.bm | Bin 369 -> 0 bytes assets/resources/dolphin/lvl_3/frame_24.bm | Bin 353 -> 0 bytes assets/resources/dolphin/lvl_6/frame_10.bm | Bin 582 -> 0 bytes assets/resources/dolphin/lvl_6/frame_11.bm | Bin 562 -> 0 bytes assets/resources/dolphin/lvl_6/frame_12.bm | Bin 644 -> 0 bytes assets/resources/dolphin/lvl_6/frame_13.bm | Bin 658 -> 0 bytes assets/resources/dolphin/lvl_6/frame_14.bm | Bin 481 -> 0 bytes assets/resources/dolphin/lvl_6/frame_15.bm | Bin 388 -> 0 bytes assets/resources/dolphin/lvl_6/frame_16.bm | Bin 413 -> 0 bytes assets/resources/dolphin/lvl_6/frame_17.bm | Bin 425 -> 0 bytes assets/resources/dolphin/lvl_6/frame_18.bm | Bin 389 -> 0 bytes assets/resources/dolphin/lvl_6/frame_19.bm | Bin 387 -> 0 bytes assets/resources/dolphin/lvl_6/frame_20.bm | Bin 402 -> 0 bytes assets/resources/dolphin/lvl_6/frame_21.bm | Bin 463 -> 0 bytes assets/resources/dolphin/lvl_6/frame_22.bm | Bin 429 -> 0 bytes assets/resources/dolphin/lvl_6/frame_23.bm | Bin 495 -> 0 bytes assets/resources/dolphin/lvl_6/frame_24.bm | Bin 406 -> 0 bytes assets/resources/dolphin/lvl_6/frame_25.bm | Bin 469 -> 0 bytes assets/resources/dolphin/lvl_6/frame_26.bm | Bin 475 -> 0 bytes assets/resources/dolphin/lvl_6/frame_27.bm | Bin 475 -> 0 bytes assets/resources/dolphin/lvl_6/frame_7.bm | Bin 628 -> 0 bytes assets/resources/dolphin/lvl_6/frame_8.bm | Bin 619 -> 0 bytes assets/resources/dolphin/lvl_6/frame_9.bm | Bin 612 -> 0 bytes assets/resources/dolphin/lvl_8/frame_10.bm | Bin 938 -> 0 bytes assets/resources/dolphin/lvl_8/frame_11.bm | Bin 940 -> 0 bytes assets/resources/dolphin/lvl_8/frame_12.bm | Bin 944 -> 0 bytes assets/resources/dolphin/lvl_8/frame_13.bm | Bin 937 -> 0 bytes assets/resources/dolphin/lvl_8/frame_6.bm | Bin 935 -> 0 bytes assets/resources/dolphin/lvl_8/frame_7.bm | Bin 931 -> 0 bytes assets/resources/dolphin/lvl_8/frame_8.bm | Bin 942 -> 0 bytes assets/resources/dolphin/lvl_8/frame_9.bm | Bin 940 -> 0 bytes assets/resources/dolphin/manifest.txt | 207 ++++++++++++++--- .../resources/dolphin/no_lvl_up_manifest.txt | 212 ------------------ .../dolphin/{ => nsfw}/lvl_1/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_1/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_1/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_10/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_10/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_10/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_11/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_31.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_32.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_33.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_34.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_35.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_36.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_37.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_38.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_39.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_40.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_41.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_42.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_43.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_44.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_45.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_46.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_47.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_48.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_49.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_11/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_11/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_12/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_12/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_12/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_13/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_13/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_13/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_14/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_14/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_14/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_15/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_15/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_15/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_16/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_16/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_16/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_17/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_31.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_17/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_17/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_18/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_18/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_18/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_19/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_19/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_19/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_2/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_2/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_2/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_20/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_20/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_20/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_21/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_21/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_21/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_21/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_21/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_21/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_21/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_22/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_22/frame_1.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_10.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_11.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_12.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_13.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_14.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_15.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_16.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_17.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_18.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_22/frame_2.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_20.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_21.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_22.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_23.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_24.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_25.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_26.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_27.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_28.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_22/frame_3.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_30.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_31.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_32.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_33.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_34.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_35.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_36.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_37.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_38.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_39.bm | Bin .../dolphin/{ => nsfw}/lvl_22/frame_4.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_40.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_41.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_42.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_43.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_44.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_45.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_46.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_47.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_48.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_49.bm | Bin .../dolphin/{ => nsfw}/lvl_22/frame_5.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_50.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_51.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_52.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_53.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_54.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_55.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_56.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_57.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_58.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_59.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_6.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_7.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_8.bm | Bin .../{lvl_21 => nsfw/lvl_22}/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_22/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_23/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_23/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_23/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_24/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_24/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_24/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_25/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_31.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_32.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_33.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_34.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_35.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_25/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_25/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_26/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_26/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_26/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_27/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_27/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_27/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_28/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_28/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_28/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_28/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_28/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_28/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_28/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_29/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_31.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_32.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_33.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_34.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_35.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_36.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_37.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_38.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_39.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_40.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_41.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_42.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_43.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_44.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_45.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_46.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_47.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_48.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_49.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_50.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_51.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_29/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_29/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_3/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_3/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_3/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_30/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_28.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_29.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_30.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_31.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_32.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_33.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_34.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_35.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_36.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_37.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_38.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_39.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_40.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_41.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_42.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_43.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_44.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_45.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_46.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_47.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_48.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_49.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_30/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_30/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_4/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_4/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_4/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_5/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_14.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_15.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_16.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_17.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_18.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_19.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_20.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_21.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_22.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_23.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_24.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_25.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_26.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_27.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_5/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_5/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_6/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_6/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_6/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_7/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_10.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_11.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_12.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_13.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_8.bm | Bin .../dolphin/{ => nsfw}/lvl_7/frame_9.bm | Bin .../dolphin/{ => nsfw}/lvl_7/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_8/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_8/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_8/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_8/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_8/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_8/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_8/meta.txt | 0 .../dolphin/{ => nsfw}/lvl_9/frame_0.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_1.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_2.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_3.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_4.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_5.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_6.bm | Bin .../dolphin/{ => nsfw}/lvl_9/frame_7.bm | Bin .../dolphin/{ => nsfw}/lvl_9/meta.txt | 0 assets/resources/dolphin/nsfw/manifest.txt | 212 ++++++++++++++++++ .../dolphin/sfw/L1_Boxing_128x64/frame_0.bm | Bin 0 -> 481 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_1.bm | Bin 0 -> 461 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_2.bm | Bin 0 -> 531 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_3.bm | Bin 0 -> 437 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_4.bm | Bin 0 -> 459 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_5.bm | Bin 0 -> 450 bytes .../dolphin/sfw/L1_Boxing_128x64/frame_6.bm | Bin 0 -> 442 bytes .../dolphin/sfw/L1_Boxing_128x64/meta.txt | 32 +++ .../dolphin/sfw/L1_Cry_128x64/frame_0.bm | Bin 0 -> 889 bytes .../dolphin/sfw/L1_Cry_128x64/frame_1.bm | Bin 0 -> 911 bytes .../dolphin/sfw/L1_Cry_128x64/frame_2.bm | Bin 0 -> 910 bytes .../dolphin/sfw/L1_Cry_128x64/frame_3.bm | Bin 0 -> 923 bytes .../dolphin/sfw/L1_Cry_128x64/frame_4.bm | Bin 0 -> 894 bytes .../dolphin/sfw/L1_Cry_128x64/frame_5.bm | Bin 0 -> 940 bytes .../dolphin/sfw/L1_Cry_128x64/frame_6.bm | Bin 0 -> 915 bytes .../dolphin/sfw/L1_Cry_128x64/frame_7.bm | Bin 0 -> 934 bytes .../dolphin/sfw/L1_Cry_128x64/meta.txt | 41 ++++ .../dolphin/sfw/L1_Furippa1_128x64/frame_0.bm | Bin 0 -> 294 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_1.bm | Bin 0 -> 325 bytes .../sfw/L1_Furippa1_128x64/frame_10.bm | Bin 0 -> 465 bytes .../sfw/L1_Furippa1_128x64/frame_11.bm | Bin 0 -> 698 bytes .../sfw/L1_Furippa1_128x64/frame_12.bm | Bin 0 -> 541 bytes .../sfw/L1_Furippa1_128x64/frame_13.bm | Bin 0 -> 584 bytes .../sfw/L1_Furippa1_128x64/frame_14.bm | Bin 0 -> 610 bytes .../sfw/L1_Furippa1_128x64/frame_15.bm | Bin 0 -> 719 bytes .../sfw/L1_Furippa1_128x64/frame_16.bm | Bin 0 -> 458 bytes .../sfw/L1_Furippa1_128x64/frame_17.bm | Bin 0 -> 400 bytes .../sfw/L1_Furippa1_128x64/frame_18.bm | Bin 0 -> 333 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_2.bm | Bin 0 -> 351 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_3.bm | Bin 0 -> 324 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_4.bm | Bin 0 -> 387 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_5.bm | Bin 0 -> 390 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_6.bm | Bin 0 -> 407 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_7.bm | Bin 0 -> 294 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_8.bm | Bin 0 -> 283 bytes .../dolphin/sfw/L1_Furippa1_128x64/frame_9.bm | Bin 0 -> 312 bytes .../dolphin/sfw/L1_Furippa1_128x64/meta.txt | 14 ++ .../sfw/L1_Happy_holidays_128x64/frame_0.bm | Bin 0 -> 898 bytes .../sfw/L1_Happy_holidays_128x64/frame_1.bm | Bin 0 -> 893 bytes .../sfw/L1_Happy_holidays_128x64/frame_10.bm | Bin 0 -> 901 bytes .../sfw/L1_Happy_holidays_128x64/frame_11.bm | Bin 0 -> 896 bytes .../sfw/L1_Happy_holidays_128x64/frame_12.bm | Bin 0 -> 890 bytes .../sfw/L1_Happy_holidays_128x64/frame_2.bm | Bin 0 -> 891 bytes .../sfw/L1_Happy_holidays_128x64/frame_3.bm | Bin 0 -> 886 bytes .../sfw/L1_Happy_holidays_128x64/frame_4.bm | Bin 0 -> 893 bytes .../sfw/L1_Happy_holidays_128x64/frame_5.bm | Bin 0 -> 886 bytes .../sfw/L1_Happy_holidays_128x64/frame_6.bm | Bin 0 -> 888 bytes .../sfw/L1_Happy_holidays_128x64/frame_7.bm | Bin 0 -> 893 bytes .../sfw/L1_Happy_holidays_128x64/frame_8.bm | Bin 0 -> 896 bytes .../sfw/L1_Happy_holidays_128x64/frame_9.bm | Bin 0 -> 900 bytes .../sfw/L1_Happy_holidays_128x64/meta.txt | 23 ++ .../dolphin/sfw/L1_Laptop_128x51/frame_0.bm | Bin 0 -> 555 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_1.bm | Bin 0 -> 557 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_2.bm | Bin 0 -> 560 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_3.bm | Bin 0 -> 556 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_4.bm | Bin 0 -> 560 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_5.bm | Bin 0 -> 554 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_6.bm | Bin 0 -> 553 bytes .../dolphin/sfw/L1_Laptop_128x51/frame_7.bm | Bin 0 -> 560 bytes .../dolphin/sfw/L1_Laptop_128x51/meta.txt | 32 +++ .../sfw/L1_Leaving_sad_128x64/frame_0.bm | Bin 0 -> 514 bytes .../sfw/L1_Leaving_sad_128x64/frame_1.bm | Bin 0 -> 526 bytes .../sfw/L1_Leaving_sad_128x64/frame_10.bm | Bin 0 -> 316 bytes .../sfw/L1_Leaving_sad_128x64/frame_11.bm | Bin 0 -> 294 bytes .../sfw/L1_Leaving_sad_128x64/frame_12.bm | Bin 0 -> 322 bytes .../sfw/L1_Leaving_sad_128x64/frame_2.bm | Bin 0 -> 542 bytes .../sfw/L1_Leaving_sad_128x64/frame_3.bm | Bin 0 -> 557 bytes .../sfw/L1_Leaving_sad_128x64/frame_4.bm | Bin 0 -> 488 bytes .../sfw/L1_Leaving_sad_128x64/frame_5.bm | Bin 0 -> 469 bytes .../sfw/L1_Leaving_sad_128x64/frame_6.bm | Bin 0 -> 499 bytes .../sfw/L1_Leaving_sad_128x64/frame_7.bm | Bin 0 -> 486 bytes .../sfw/L1_Leaving_sad_128x64/frame_8.bm | Bin 0 -> 403 bytes .../sfw/L1_Leaving_sad_128x64/frame_9.bm | Bin 0 -> 317 bytes .../sfw/L1_Leaving_sad_128x64/meta.txt | 32 +++ .../dolphin/sfw/L1_Mad_fist_128x64/frame_0.bm | Bin 0 -> 520 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_1.bm | Bin 0 -> 540 bytes .../sfw/L1_Mad_fist_128x64/frame_10.bm | Bin 0 -> 542 bytes .../sfw/L1_Mad_fist_128x64/frame_11.bm | Bin 0 -> 505 bytes .../sfw/L1_Mad_fist_128x64/frame_12.bm | Bin 0 -> 501 bytes .../sfw/L1_Mad_fist_128x64/frame_13.bm | Bin 0 -> 500 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_2.bm | Bin 0 -> 515 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_3.bm | Bin 0 -> 538 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_4.bm | Bin 0 -> 512 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_5.bm | Bin 0 -> 519 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_6.bm | Bin 0 -> 524 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_7.bm | Bin 0 -> 515 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_8.bm | Bin 0 -> 517 bytes .../dolphin/sfw/L1_Mad_fist_128x64/frame_9.bm | Bin 0 -> 526 bytes .../dolphin/sfw/L1_Mad_fist_128x64/meta.txt | 23 ++ .../dolphin/sfw/L1_Mods_128x64/frame_0.bm | Bin 0 -> 636 bytes .../dolphin/sfw/L1_Mods_128x64/frame_1.bm | Bin 0 -> 640 bytes .../dolphin/sfw/L1_Mods_128x64/frame_10.bm | Bin 0 -> 652 bytes .../dolphin/sfw/L1_Mods_128x64/frame_11.bm | Bin 0 -> 634 bytes .../dolphin/sfw/L1_Mods_128x64/frame_12.bm | Bin 0 -> 610 bytes .../dolphin/sfw/L1_Mods_128x64/frame_13.bm | Bin 0 -> 624 bytes .../dolphin/sfw/L1_Mods_128x64/frame_14.bm | Bin 0 -> 609 bytes .../dolphin/sfw/L1_Mods_128x64/frame_15.bm | Bin 0 -> 614 bytes .../dolphin/sfw/L1_Mods_128x64/frame_16.bm | Bin 0 -> 638 bytes .../dolphin/sfw/L1_Mods_128x64/frame_17.bm | Bin 0 -> 629 bytes .../dolphin/sfw/L1_Mods_128x64/frame_18.bm | Bin 0 -> 638 bytes .../dolphin/sfw/L1_Mods_128x64/frame_19.bm | Bin 0 -> 629 bytes .../dolphin/sfw/L1_Mods_128x64/frame_2.bm | Bin 0 -> 639 bytes .../dolphin/sfw/L1_Mods_128x64/frame_20.bm | Bin 0 -> 613 bytes .../dolphin/sfw/L1_Mods_128x64/frame_21.bm | Bin 0 -> 626 bytes .../dolphin/sfw/L1_Mods_128x64/frame_22.bm | Bin 0 -> 609 bytes .../dolphin/sfw/L1_Mods_128x64/frame_23.bm | Bin 0 -> 610 bytes .../dolphin/sfw/L1_Mods_128x64/frame_24.bm | Bin 0 -> 546 bytes .../dolphin/sfw/L1_Mods_128x64/frame_25.bm | Bin 0 -> 417 bytes .../dolphin/sfw/L1_Mods_128x64/frame_26.bm | Bin 0 -> 542 bytes .../dolphin/sfw/L1_Mods_128x64/frame_27.bm | Bin 0 -> 616 bytes .../dolphin/sfw/L1_Mods_128x64/frame_28.bm | Bin 0 -> 640 bytes .../dolphin/sfw/L1_Mods_128x64/frame_29.bm | Bin 0 -> 639 bytes .../dolphin/sfw/L1_Mods_128x64/frame_3.bm | Bin 0 -> 636 bytes .../dolphin/sfw/L1_Mods_128x64/frame_30.bm | Bin 0 -> 635 bytes .../dolphin/sfw/L1_Mods_128x64/frame_31.bm | Bin 0 -> 637 bytes .../dolphin/sfw/L1_Mods_128x64/frame_32.bm | Bin 0 -> 644 bytes .../dolphin/sfw/L1_Mods_128x64/frame_33.bm | Bin 0 -> 578 bytes .../dolphin/sfw/L1_Mods_128x64/frame_34.bm | Bin 0 -> 476 bytes .../dolphin/sfw/L1_Mods_128x64/frame_35.bm | Bin 0 -> 572 bytes .../dolphin/sfw/L1_Mods_128x64/frame_36.bm | Bin 0 -> 618 bytes .../dolphin/sfw/L1_Mods_128x64/frame_37.bm | Bin 0 -> 570 bytes .../dolphin/sfw/L1_Mods_128x64/frame_38.bm | Bin 0 -> 601 bytes .../dolphin/sfw/L1_Mods_128x64/frame_39.bm | Bin 0 -> 614 bytes .../dolphin/sfw/L1_Mods_128x64/frame_4.bm | Bin 0 -> 621 bytes .../dolphin/sfw/L1_Mods_128x64/frame_40.bm | Bin 0 -> 604 bytes .../dolphin/sfw/L1_Mods_128x64/frame_5.bm | Bin 0 -> 636 bytes .../dolphin/sfw/L1_Mods_128x64/frame_6.bm | Bin 0 -> 618 bytes .../dolphin/sfw/L1_Mods_128x64/frame_7.bm | Bin 0 -> 622 bytes .../dolphin/sfw/L1_Mods_128x64/frame_8.bm | Bin 0 -> 644 bytes .../dolphin/sfw/L1_Mods_128x64/frame_9.bm | Bin 0 -> 647 bytes .../L1_Mods_128x64}/meta.txt | 8 +- .../dolphin/sfw/L1_Painting_128x64/frame_0.bm | Bin 0 -> 763 bytes .../dolphin/sfw/L1_Painting_128x64/frame_1.bm | Bin 0 -> 764 bytes .../sfw/L1_Painting_128x64/frame_10.bm | Bin 0 -> 772 bytes .../sfw/L1_Painting_128x64/frame_11.bm | Bin 0 -> 767 bytes .../dolphin/sfw/L1_Painting_128x64/frame_2.bm | Bin 0 -> 762 bytes .../dolphin/sfw/L1_Painting_128x64/frame_3.bm | Bin 0 -> 759 bytes .../dolphin/sfw/L1_Painting_128x64/frame_4.bm | Bin 0 -> 759 bytes .../dolphin/sfw/L1_Painting_128x64/frame_5.bm | Bin 0 -> 757 bytes .../dolphin/sfw/L1_Painting_128x64/frame_6.bm | Bin 0 -> 785 bytes .../dolphin/sfw/L1_Painting_128x64/frame_7.bm | Bin 0 -> 803 bytes .../dolphin/sfw/L1_Painting_128x64/frame_8.bm | Bin 0 -> 797 bytes .../dolphin/sfw/L1_Painting_128x64/frame_9.bm | Bin 0 -> 777 bytes .../dolphin/sfw/L1_Painting_128x64/meta.txt | 32 +++ .../sfw/L1_Read_books_128x64/frame_0.bm | Bin 0 -> 653 bytes .../sfw/L1_Read_books_128x64/frame_1.bm | Bin 0 -> 653 bytes .../sfw/L1_Read_books_128x64/frame_2.bm | Bin 0 -> 650 bytes .../sfw/L1_Read_books_128x64/frame_3.bm | Bin 0 -> 646 bytes .../sfw/L1_Read_books_128x64/frame_4.bm | Bin 0 -> 650 bytes .../sfw/L1_Read_books_128x64/frame_5.bm | Bin 0 -> 652 bytes .../sfw/L1_Read_books_128x64/frame_6.bm | Bin 0 -> 646 bytes .../sfw/L1_Read_books_128x64/frame_7.bm | Bin 0 -> 647 bytes .../sfw/L1_Read_books_128x64/frame_8.bm | Bin 0 -> 643 bytes .../dolphin/sfw/L1_Read_books_128x64/meta.txt | 23 ++ .../sfw/L1_Recording_128x51/frame_0.bm | Bin 0 -> 663 bytes .../sfw/L1_Recording_128x51/frame_1.bm | Bin 0 -> 657 bytes .../sfw/L1_Recording_128x51/frame_10.bm | Bin 0 -> 629 bytes .../sfw/L1_Recording_128x51/frame_11.bm | Bin 0 -> 659 bytes .../sfw/L1_Recording_128x51/frame_2.bm | Bin 0 -> 628 bytes .../sfw/L1_Recording_128x51/frame_3.bm | Bin 0 -> 654 bytes .../sfw/L1_Recording_128x51/frame_4.bm | Bin 0 -> 662 bytes .../sfw/L1_Recording_128x51/frame_5.bm | Bin 0 -> 622 bytes .../sfw/L1_Recording_128x51/frame_6.bm | Bin 0 -> 664 bytes .../sfw/L1_Recording_128x51/frame_7.bm | Bin 0 -> 626 bytes .../sfw/L1_Recording_128x51/frame_8.bm | Bin 0 -> 663 bytes .../sfw/L1_Recording_128x51/frame_9.bm | Bin 0 -> 661 bytes .../dolphin/sfw/L1_Recording_128x51/meta.txt | 14 ++ .../dolphin/sfw/L1_Sleep_128x64/frame_0.bm | Bin 0 -> 580 bytes .../dolphin/sfw/L1_Sleep_128x64/frame_1.bm | Bin 0 -> 589 bytes .../dolphin/sfw/L1_Sleep_128x64/frame_2.bm | Bin 0 -> 582 bytes .../dolphin/sfw/L1_Sleep_128x64/frame_3.bm | Bin 0 -> 597 bytes .../dolphin/sfw/L1_Sleep_128x64/meta.txt | 41 ++++ .../sfw/L1_Sleigh_ride_128x64/frame_0.bm | Bin 0 -> 727 bytes .../sfw/L1_Sleigh_ride_128x64/frame_1.bm | Bin 0 -> 835 bytes .../sfw/L1_Sleigh_ride_128x64/frame_10.bm | Bin 0 -> 684 bytes .../sfw/L1_Sleigh_ride_128x64/frame_11.bm | Bin 0 -> 725 bytes .../sfw/L1_Sleigh_ride_128x64/frame_12.bm | Bin 0 -> 775 bytes .../sfw/L1_Sleigh_ride_128x64/frame_13.bm | Bin 0 -> 693 bytes .../sfw/L1_Sleigh_ride_128x64/frame_14.bm | Bin 0 -> 719 bytes .../sfw/L1_Sleigh_ride_128x64/frame_15.bm | Bin 0 -> 819 bytes .../sfw/L1_Sleigh_ride_128x64/frame_16.bm | Bin 0 -> 780 bytes .../sfw/L1_Sleigh_ride_128x64/frame_17.bm | Bin 0 -> 665 bytes .../sfw/L1_Sleigh_ride_128x64/frame_18.bm | Bin 0 -> 739 bytes .../sfw/L1_Sleigh_ride_128x64/frame_19.bm | Bin 0 -> 781 bytes .../sfw/L1_Sleigh_ride_128x64/frame_2.bm | Bin 0 -> 781 bytes .../sfw/L1_Sleigh_ride_128x64/frame_20.bm | Bin 0 -> 708 bytes .../sfw/L1_Sleigh_ride_128x64/frame_21.bm | Bin 0 -> 717 bytes .../sfw/L1_Sleigh_ride_128x64/frame_22.bm | Bin 0 -> 829 bytes .../sfw/L1_Sleigh_ride_128x64/frame_23.bm | Bin 0 -> 763 bytes .../sfw/L1_Sleigh_ride_128x64/frame_24.bm | Bin 0 -> 726 bytes .../sfw/L1_Sleigh_ride_128x64/frame_25.bm | Bin 0 -> 783 bytes .../sfw/L1_Sleigh_ride_128x64/frame_26.bm | Bin 0 -> 731 bytes .../sfw/L1_Sleigh_ride_128x64/frame_27.bm | Bin 0 -> 748 bytes .../sfw/L1_Sleigh_ride_128x64/frame_28.bm | Bin 0 -> 507 bytes .../sfw/L1_Sleigh_ride_128x64/frame_29.bm | Bin 0 -> 334 bytes .../sfw/L1_Sleigh_ride_128x64/frame_3.bm | Bin 0 -> 725 bytes .../sfw/L1_Sleigh_ride_128x64/frame_30.bm | Bin 0 -> 219 bytes .../sfw/L1_Sleigh_ride_128x64/frame_31.bm | Bin 0 -> 176 bytes .../sfw/L1_Sleigh_ride_128x64/frame_32.bm | Bin 0 -> 173 bytes .../sfw/L1_Sleigh_ride_128x64/frame_33.bm | Bin 0 -> 356 bytes .../sfw/L1_Sleigh_ride_128x64/frame_34.bm | Bin 0 -> 699 bytes .../sfw/L1_Sleigh_ride_128x64/frame_35.bm | Bin 0 -> 812 bytes .../sfw/L1_Sleigh_ride_128x64/frame_36.bm | Bin 0 -> 686 bytes .../sfw/L1_Sleigh_ride_128x64/frame_4.bm | Bin 0 -> 791 bytes .../sfw/L1_Sleigh_ride_128x64/frame_5.bm | Bin 0 -> 706 bytes .../sfw/L1_Sleigh_ride_128x64/frame_6.bm | Bin 0 -> 688 bytes .../sfw/L1_Sleigh_ride_128x64/frame_7.bm | Bin 0 -> 724 bytes .../sfw/L1_Sleigh_ride_128x64/frame_8.bm | Bin 0 -> 808 bytes .../sfw/L1_Sleigh_ride_128x64/frame_9.bm | Bin 0 -> 735 bytes .../sfw/L1_Sleigh_ride_128x64/meta.txt | 23 ++ .../dolphin/sfw/L1_Waves_128x50/frame_0.bm | Bin 0 -> 443 bytes .../dolphin/sfw/L1_Waves_128x50/frame_1.bm | Bin 0 -> 448 bytes .../dolphin/sfw/L1_Waves_128x50/frame_2.bm | Bin 0 -> 463 bytes .../dolphin/sfw/L1_Waves_128x50/frame_3.bm | Bin 0 -> 472 bytes .../dolphin/sfw/L1_Waves_128x50/meta.txt | 50 +++++ .../dolphin/sfw/L2_Furippa2_128x64/frame_0.bm | Bin 0 -> 350 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_1.bm | Bin 0 -> 385 bytes .../sfw/L2_Furippa2_128x64/frame_10.bm | Bin 0 -> 465 bytes .../sfw/L2_Furippa2_128x64/frame_11.bm | Bin 0 -> 698 bytes .../sfw/L2_Furippa2_128x64/frame_12.bm | Bin 0 -> 541 bytes .../sfw/L2_Furippa2_128x64/frame_13.bm | Bin 0 -> 584 bytes .../sfw/L2_Furippa2_128x64/frame_14.bm | Bin 0 -> 610 bytes .../sfw/L2_Furippa2_128x64/frame_15.bm | Bin 0 -> 740 bytes .../sfw/L2_Furippa2_128x64/frame_16.bm | Bin 0 -> 533 bytes .../sfw/L2_Furippa2_128x64/frame_17.bm | Bin 0 -> 451 bytes .../sfw/L2_Furippa2_128x64/frame_18.bm | Bin 0 -> 397 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_2.bm | Bin 0 -> 402 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_3.bm | Bin 0 -> 374 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_4.bm | Bin 0 -> 440 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_5.bm | Bin 0 -> 449 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_6.bm | Bin 0 -> 466 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_7.bm | Bin 0 -> 350 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_8.bm | Bin 0 -> 319 bytes .../dolphin/sfw/L2_Furippa2_128x64/frame_9.bm | Bin 0 -> 317 bytes .../dolphin/sfw/L2_Furippa2_128x64/meta.txt | 14 ++ .../sfw/L2_Hacking_pc_128x64/frame_0.bm | Bin 0 -> 543 bytes .../sfw/L2_Hacking_pc_128x64/frame_1.bm | Bin 0 -> 545 bytes .../sfw/L2_Hacking_pc_128x64/frame_2.bm | Bin 0 -> 548 bytes .../sfw/L2_Hacking_pc_128x64/frame_3.bm | Bin 0 -> 608 bytes .../sfw/L2_Hacking_pc_128x64/frame_4.bm | Bin 0 -> 609 bytes .../dolphin/sfw/L2_Hacking_pc_128x64/meta.txt | 32 +++ .../sfw/L2_Soldering_128x64/frame_0.bm | Bin 0 -> 699 bytes .../sfw/L2_Soldering_128x64/frame_1.bm | Bin 0 -> 688 bytes .../sfw/L2_Soldering_128x64/frame_10.bm | Bin 0 -> 699 bytes .../sfw/L2_Soldering_128x64/frame_2.bm | Bin 0 -> 689 bytes .../sfw/L2_Soldering_128x64/frame_3.bm | Bin 0 -> 689 bytes .../sfw/L2_Soldering_128x64/frame_4.bm | Bin 0 -> 693 bytes .../sfw/L2_Soldering_128x64/frame_5.bm | Bin 0 -> 696 bytes .../sfw/L2_Soldering_128x64/frame_6.bm | Bin 0 -> 712 bytes .../sfw/L2_Soldering_128x64/frame_7.bm | Bin 0 -> 732 bytes .../sfw/L2_Soldering_128x64/frame_8.bm | Bin 0 -> 705 bytes .../sfw/L2_Soldering_128x64/frame_9.bm | Bin 0 -> 698 bytes .../dolphin/sfw/L2_Soldering_128x64/meta.txt | 23 ++ .../dolphin/sfw/L2_Wake_up_128x64/frame_0.bm | Bin 0 -> 874 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_1.bm | Bin 0 -> 871 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_10.bm | Bin 0 -> 846 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_11.bm | Bin 0 -> 833 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_12.bm | Bin 0 -> 772 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_13.bm | Bin 0 -> 745 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_14.bm | Bin 0 -> 747 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_15.bm | Bin 0 -> 753 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_16.bm | Bin 0 -> 689 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_17.bm | Bin 0 -> 186 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_18.bm | Bin 0 -> 216 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_19.bm | Bin 0 -> 792 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_2.bm | Bin 0 -> 875 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_20.bm | Bin 0 -> 852 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_3.bm | Bin 0 -> 884 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_4.bm | Bin 0 -> 872 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_5.bm | Bin 0 -> 873 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_6.bm | Bin 0 -> 827 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_7.bm | Bin 0 -> 763 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_8.bm | Bin 0 -> 751 bytes .../dolphin/sfw/L2_Wake_up_128x64/frame_9.bm | Bin 0 -> 725 bytes .../dolphin/sfw/L2_Wake_up_128x64/meta.txt | 14 ++ .../dolphin/sfw/L3_Furippa3_128x64/frame_0.bm | Bin 0 -> 398 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_1.bm | Bin 0 -> 438 bytes .../sfw/L3_Furippa3_128x64/frame_10.bm | Bin 0 -> 559 bytes .../sfw/L3_Furippa3_128x64/frame_11.bm | Bin 0 -> 728 bytes .../sfw/L3_Furippa3_128x64/frame_12.bm | Bin 0 -> 541 bytes .../sfw/L3_Furippa3_128x64/frame_13.bm | Bin 0 -> 584 bytes .../sfw/L3_Furippa3_128x64/frame_14.bm | Bin 0 -> 610 bytes .../sfw/L3_Furippa3_128x64/frame_15.bm | Bin 0 -> 741 bytes .../sfw/L3_Furippa3_128x64/frame_16.bm | Bin 0 -> 559 bytes .../sfw/L3_Furippa3_128x64/frame_17.bm | Bin 0 -> 492 bytes .../sfw/L3_Furippa3_128x64/frame_18.bm | Bin 0 -> 445 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_2.bm | Bin 0 -> 463 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_3.bm | Bin 0 -> 424 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_4.bm | Bin 0 -> 499 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_5.bm | Bin 0 -> 504 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_6.bm | Bin 0 -> 521 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_7.bm | Bin 0 -> 398 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_8.bm | Bin 0 -> 419 bytes .../dolphin/sfw/L3_Furippa3_128x64/frame_9.bm | Bin 0 -> 435 bytes .../dolphin/sfw/L3_Furippa3_128x64/meta.txt | 14 ++ .../sfw/L3_Hijack_radio_128x64/frame_0.bm | Bin 0 -> 524 bytes .../sfw/L3_Hijack_radio_128x64/frame_1.bm | Bin 0 -> 527 bytes .../sfw/L3_Hijack_radio_128x64/frame_10.bm | Bin 0 -> 550 bytes .../sfw/L3_Hijack_radio_128x64/frame_11.bm | Bin 0 -> 572 bytes .../sfw/L3_Hijack_radio_128x64/frame_12.bm | Bin 0 -> 539 bytes .../sfw/L3_Hijack_radio_128x64/frame_13.bm | Bin 0 -> 579 bytes .../sfw/L3_Hijack_radio_128x64/frame_2.bm | Bin 0 -> 526 bytes .../sfw/L3_Hijack_radio_128x64/frame_3.bm | Bin 0 -> 529 bytes .../sfw/L3_Hijack_radio_128x64/frame_4.bm | Bin 0 -> 571 bytes .../sfw/L3_Hijack_radio_128x64/frame_5.bm | Bin 0 -> 574 bytes .../sfw/L3_Hijack_radio_128x64/frame_6.bm | Bin 0 -> 524 bytes .../sfw/L3_Hijack_radio_128x64/frame_7.bm | Bin 0 -> 655 bytes .../sfw/L3_Hijack_radio_128x64/frame_8.bm | Bin 0 -> 645 bytes .../sfw/L3_Hijack_radio_128x64/frame_9.bm | Bin 0 -> 611 bytes .../sfw/L3_Hijack_radio_128x64/meta.txt | 14 ++ .../sfw/L3_Lab_research_128x54/frame_0.bm | Bin 0 -> 611 bytes .../sfw/L3_Lab_research_128x54/frame_1.bm | Bin 0 -> 614 bytes .../sfw/L3_Lab_research_128x54/frame_10.bm | Bin 0 -> 576 bytes .../sfw/L3_Lab_research_128x54/frame_11.bm | Bin 0 -> 585 bytes .../sfw/L3_Lab_research_128x54/frame_12.bm | Bin 0 -> 571 bytes .../sfw/L3_Lab_research_128x54/frame_13.bm | Bin 0 -> 615 bytes .../sfw/L3_Lab_research_128x54/frame_2.bm | Bin 0 -> 618 bytes .../sfw/L3_Lab_research_128x54/frame_3.bm | Bin 0 -> 608 bytes .../sfw/L3_Lab_research_128x54/frame_4.bm | Bin 0 -> 615 bytes .../sfw/L3_Lab_research_128x54/frame_5.bm | Bin 0 -> 618 bytes .../sfw/L3_Lab_research_128x54/frame_6.bm | Bin 0 -> 615 bytes .../sfw/L3_Lab_research_128x54/frame_7.bm | Bin 0 -> 585 bytes .../sfw/L3_Lab_research_128x54/frame_8.bm | Bin 0 -> 578 bytes .../sfw/L3_Lab_research_128x54/frame_9.bm | Bin 0 -> 581 bytes .../sfw/L3_Lab_research_128x54/meta.txt | 59 +++++ assets/resources/dolphin/sfw/manifest.txt | 149 ++++++++++++ scripts/flipper/assets/dolphin.py | 67 +++--- 2299 files changed, 1897 insertions(+), 334 deletions(-) create mode 100644 applications/plugins/namechanger/icons/DolphinNice_96x59.png create mode 100644 applications/plugins/namechanger/icons/MarioBlock.png rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_1/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_10/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_32.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_33.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_34.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_35.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_36.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_37.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_38.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_39.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_40.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_41.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_42.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_43.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_44.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_45.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_46.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_47.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_48.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_49.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_11/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_12/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_13/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_14/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_15/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_16/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_17/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_18/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_19/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_2/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_20/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_21/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_32.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_33.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_34.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_35.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_36.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_37.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_38.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_39.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_40.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_41.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_42.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_43.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_44.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_45.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_46.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_47.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_48.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_49.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_50.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_51.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_52.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_53.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_54.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_55.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_56.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_57.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_58.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_59.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_22/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_23/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_24/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_32.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_33.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_34.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_35.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_25/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_26/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_27/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_28/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_32.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_33.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_34.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_35.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_36.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_37.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_38.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_39.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_40.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_41.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_42.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_43.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_44.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_45.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_46.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_47.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_48.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_49.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_50.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_51.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_29/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_3/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_28.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_29.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_30.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_31.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_32.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_33.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_34.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_35.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_36.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_37.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_38.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_39.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_40.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_41.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_42.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_43.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_44.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_45.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_46.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_47.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_48.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_49.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_30/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_4/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_14.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_15.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_16.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_17.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_18.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_19.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_20.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_21.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_22.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_23.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_24.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_25.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_26.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_27.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_5/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_6/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_10.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_11.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_12.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_13.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_8.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/frame_9.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_7/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_8/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_0.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_1.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_2.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_3.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_4.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_5.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_6.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/frame_7.png (100%) rename assets/dolphin/external/{ => nsfw}/lvl_9/meta.txt (100%) rename assets/dolphin/external/{ => nsfw}/manifest.txt (80%) create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Boxing_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Cry_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Furippa1_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Happy_holidays_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Laptop_128x51/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Leaving_sad_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Mad_fist_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_19.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_20.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_21.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_22.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_23.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_24.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_25.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_26.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_27.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_28.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_29.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_30.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_31.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_32.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_33.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_34.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_35.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_36.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_37.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_38.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_39.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_40.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Mods_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Painting_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Read_books_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Recording_128x51/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Sleep_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Sleep_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Sleep_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Sleep_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Sleep_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_19.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_20.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_21.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_22.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_23.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_24.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_25.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_26.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_27.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_28.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_29.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_30.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_31.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_32.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_33.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_34.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_35.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_36.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L1_Waves_128x50/frame_0.png create mode 100644 assets/dolphin/external/sfw/L1_Waves_128x50/frame_1.png create mode 100644 assets/dolphin/external/sfw/L1_Waves_128x50/frame_2.png create mode 100644 assets/dolphin/external/sfw/L1_Waves_128x50/frame_3.png create mode 100644 assets/dolphin/external/sfw/L1_Waves_128x50/meta.txt create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L2_Furippa2_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L2_Hacking_pc_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L2_Soldering_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_19.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_20.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L2_Wake_up_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_14.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_15.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_16.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_17.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_18.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L3_Furippa3_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_0.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_1.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_10.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_11.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_12.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_13.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_2.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_3.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_4.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_5.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_6.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_7.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_8.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_9.png create mode 100644 assets/dolphin/external/sfw/L3_Hijack_radio_128x64/meta.txt create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_0.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_1.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_10.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_11.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_12.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_13.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_2.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_3.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_4.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_5.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_6.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_7.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_8.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_9.png create mode 100644 assets/dolphin/external/sfw/L3_Lab_research_128x54/meta.txt create mode 100644 assets/dolphin/external/sfw/manifest.txt delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_0.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_1.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_10.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_11.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_12.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_13.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_14.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_15.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_16.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_17.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_18.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_19.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_2.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_20.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_21.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_3.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_4.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_5.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_6.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_7.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_8.bm delete mode 100644 assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_9.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_11.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_12.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_13.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_14.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_15.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_16.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_17.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_18.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_19.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_20.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_21.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_23.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_24.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_25.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_26.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_27.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_28.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_29.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_30.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_31.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_32.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_33.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_34.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_35.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_36.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_37.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_38.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_39.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_40.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_41.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_42.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_43.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_44.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_45.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_46.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_47.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_48.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_49.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_50.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_51.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_52.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_53.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_54.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_55.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_56.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_57.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_58.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_59.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_60.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_61.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_62.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_63.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_64.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_65.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_66.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_67.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_68.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_69.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_70.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_71.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_72.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_73.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_74.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_75.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_76.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_77.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_78.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_79.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_80.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_81.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_82.bm delete mode 100644 assets/resources/dolphin/lvl_13/frame_83.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_10.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_11.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_12.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_13.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_14.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_15.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_16.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_17.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_18.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_19.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_20.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_21.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_8.bm delete mode 100644 assets/resources/dolphin/lvl_14/frame_9.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_10.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_11.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_12.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_13.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_14.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_15.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_16.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_17.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_18.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_19.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_20.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_21.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_23.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_24.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_25.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_26.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_27.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_28.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_29.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_30.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_31.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_32.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_33.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_34.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_35.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_36.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_37.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_38.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_39.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_40.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_41.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_42.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_43.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_44.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_45.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_46.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_47.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_48.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_49.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_50.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_51.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_52.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_53.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_54.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_55.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_56.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_57.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_58.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_59.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_6.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_7.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_8.bm delete mode 100644 assets/resources/dolphin/lvl_22/frame_9.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_23.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_24.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_25.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_26.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_27.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_28.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_29.bm delete mode 100644 assets/resources/dolphin/lvl_27/frame_30.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_15.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_16.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_17.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_18.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_19.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_20.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_21.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_23.bm delete mode 100644 assets/resources/dolphin/lvl_3/frame_24.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_10.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_11.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_12.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_13.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_14.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_15.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_16.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_17.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_18.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_19.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_20.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_21.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_22.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_23.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_24.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_25.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_26.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_27.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_7.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_8.bm delete mode 100644 assets/resources/dolphin/lvl_6/frame_9.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_10.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_11.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_12.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_13.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_6.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_7.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_8.bm delete mode 100644 assets/resources/dolphin/lvl_8/frame_9.bm delete mode 100644 assets/resources/dolphin/no_lvl_up_manifest.txt rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_1/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_10/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_31.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_32.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_33.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_34.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_35.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_36.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_37.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_38.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_39.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_40.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_41.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_42.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_43.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_44.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_45.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_46.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_47.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_48.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_49.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_11/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_12/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_13/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_14/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_15/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_16/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_31.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_17/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_18/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_19/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_2/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_20/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_21/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_1.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_10.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_11.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_12.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_13.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_14.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_15.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_16.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_17.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_18.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_2.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_20.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_21.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_22.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_23.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_24.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_25.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_26.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_27.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_28.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_3.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_30.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_31.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_32.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_33.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_34.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_35.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_36.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_37.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_38.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_39.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_4.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_40.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_41.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_42.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_43.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_44.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_45.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_46.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_47.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_48.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_49.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/frame_5.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_50.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_51.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_52.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_53.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_54.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_55.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_56.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_57.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_58.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_59.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_6.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_7.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_8.bm (100%) rename assets/resources/dolphin/{lvl_21 => nsfw/lvl_22}/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_22/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_23/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_24/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_31.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_32.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_33.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_34.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_35.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_25/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_26/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_27/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_28/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_31.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_32.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_33.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_34.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_35.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_36.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_37.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_38.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_39.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_40.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_41.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_42.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_43.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_44.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_45.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_46.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_47.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_48.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_49.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_50.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_51.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_29/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_3/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_28.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_29.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_30.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_31.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_32.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_33.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_34.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_35.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_36.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_37.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_38.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_39.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_40.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_41.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_42.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_43.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_44.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_45.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_46.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_47.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_48.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_49.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_30/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_4/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_14.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_15.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_16.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_17.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_18.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_19.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_20.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_21.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_22.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_23.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_24.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_25.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_26.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_27.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_5/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_6/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_10.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_11.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_12.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_13.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_8.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/frame_9.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_7/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_8/meta.txt (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_0.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_1.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_2.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_3.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_4.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_5.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_6.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/frame_7.bm (100%) rename assets/resources/dolphin/{ => nsfw}/lvl_9/meta.txt (100%) create mode 100644 assets/resources/dolphin/nsfw/manifest.txt create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Boxing_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Cry_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Furippa1_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Laptop_128x51/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mad_fist_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_19.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_20.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_21.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_22.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_23.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_24.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_25.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_26.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_27.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_28.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_29.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_30.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_31.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_32.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_33.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_34.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_35.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_36.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_37.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_38.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_39.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_40.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Mods_128x64/frame_9.bm rename assets/resources/dolphin/{PaxGod_TikTok_Marketing => sfw/L1_Mods_128x64}/meta.txt (62%) create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Painting_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Read_books_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Recording_128x51/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleep_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_19.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_20.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_21.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_22.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_23.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_24.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_25.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_26.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_27.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_28.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_29.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_30.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_31.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_32.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_33.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_34.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_35.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_36.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L1_Waves_128x50/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L1_Waves_128x50/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L1_Waves_128x50/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L1_Waves_128x50/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L1_Waves_128x50/meta.txt create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L2_Furippa2_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L2_Soldering_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_19.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_20.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L2_Wake_up_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_14.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_15.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_16.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_17.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_18.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L3_Furippa3_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/meta.txt create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_0.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_1.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_10.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_11.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_12.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_13.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_2.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_3.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_4.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_5.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_6.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_7.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_8.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_9.bm create mode 100644 assets/resources/dolphin/sfw/L3_Lab_research_128x54/meta.txt create mode 100644 assets/resources/dolphin/sfw/manifest.txt diff --git a/applications/plugins/namechanger/icons/DolphinNice_96x59.png b/applications/plugins/namechanger/icons/DolphinNice_96x59.png new file mode 100644 index 0000000000000000000000000000000000000000..a299d3630239b4486e249cc501872bed5996df3b GIT binary patch literal 2459 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 = callback; } -void animation_manager_set_sfw_mode_state(AnimationManager* animation_manager, bool enabled) { - furi_assert(animation_manager); - animation_manager->sfw_mode = enabled; - animation_manager_start_new_idle(animation_manager); -} - static void animation_manager_check_blocking_callback(const void* message, void* context) { const StorageEvent* storage_event = message; @@ -368,9 +362,8 @@ static bool animation_manager_is_valid_idle_animation( static StorageAnimation* animation_manager_select_idle_animation(AnimationManager* animation_manager) { - if(animation_manager->sfw_mode) { - return animation_storage_find_animation(HARDCODED_ANIMATION_NAME); - } + UNUSED(animation_manager); + StorageAnimationList_t animation_list; StorageAnimationList_init(animation_list); animation_storage_fill_animation_list(&animation_list); diff --git a/applications/services/desktop/animations/animation_manager.h b/applications/services/desktop/animations/animation_manager.h index 724ed8249..e1340a0b5 100644 --- a/applications/services/desktop/animations/animation_manager.h +++ b/applications/services/desktop/animations/animation_manager.h @@ -156,12 +156,4 @@ void animation_manager_unload_and_stall_animation(AnimationManager* animation_ma * * @animation_manager instance */ -void animation_manager_load_and_continue_animation(AnimationManager* animation_manager); - -/** - * Enable or disable dummy mode backgrounds of animation manager. - * - * @animation_manager instance - * @enabled bool - */ -void animation_manager_set_sfw_mode_state(AnimationManager* animation_manager, bool enabled); +void animation_manager_load_and_continue_animation(AnimationManager* animation_manager); \ No newline at end of file diff --git a/applications/services/desktop/animations/animation_storage.c b/applications/services/desktop/animations/animation_storage.c index 2c16cf726..f7dbc04e1 100644 --- a/applications/services/desktop/animations/animation_storage.c +++ b/applications/services/desktop/animations/animation_storage.c @@ -11,22 +11,43 @@ #include "animation_storage_i.h" #include #include - +#include "../../../settings/desktop_settings/desktop_settings_app.h" #define ANIMATION_META_FILE "meta.txt" #define ANIMATION_DIR EXT_PATH("dolphin") -#define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" #define TAG "AnimationStorage" +/* Unused old code, for safe-keeping + +#define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" + +*/ +char ANIMATION_MANIFEST_FILE[30]; static void animation_storage_free_bubbles(BubbleAnimation* animation); static void animation_storage_free_frames(BubbleAnimation* animation); static void animation_storage_free_animation(BubbleAnimation** storage_animation); static BubbleAnimation* animation_storage_load_animation(const char* name); +void animation_handler_beta() +{ + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); + + if (settings->sfw_mode) { + snprintf(ANIMATION_MANIFEST_FILE, sizeof(ANIMATION_DIR), "%s", ANIMATION_DIR); + strcat(ANIMATION_MANIFEST_FILE,"/sfw/manifest2.txt"); + } + else { + snprintf(ANIMATION_MANIFEST_FILE, sizeof(ANIMATION_DIR), "%s", ANIMATION_DIR); + strcat(ANIMATION_MANIFEST_FILE,"/nsfw/manifest.txt"); + } + +} + static bool animation_storage_load_single_manifest_info( StorageAnimationManifestInfo* manifest_info, const char* name) { furi_assert(manifest_info); - + animation_handler_beta(); bool result = false; Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); @@ -82,6 +103,7 @@ static bool animation_storage_load_single_manifest_info( void animation_storage_fill_animation_list(StorageAnimationList_t* animation_list) { furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); furi_assert(!StorageAnimationList_size(*animation_list)); + animation_handler_beta(); Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index a526d415e..7a7613a73 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -150,8 +150,6 @@ void desktop_unlock(Desktop* desktop) { void desktop_set_sfw_mode_state(Desktop* desktop, bool enabled) { view_port_enabled_set(desktop->sfw_mode_icon_viewport, enabled); - desktop_main_set_sfw_mode_state(desktop->main_view, enabled); - animation_manager_set_sfw_mode_state(desktop->animation_manager, enabled); desktop->settings.sfw_mode = enabled; DESKTOP_SETTINGS_SAVE(&desktop->settings); } @@ -345,8 +343,6 @@ int32_t desktop_srv(void* p) { view_port_enabled_set(desktop->sfw_mode_icon_viewport, desktop->settings.sfw_mode); desktop_main_set_sfw_mode_state(desktop->main_view, desktop->settings.sfw_mode); - animation_manager_set_sfw_mode_state( - desktop->animation_manager, desktop->settings.sfw_mode); scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); diff --git a/assets/dolphin/external/lvl_1/frame_0.png b/assets/dolphin/external/nsfw/lvl_1/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_0.png rename to assets/dolphin/external/nsfw/lvl_1/frame_0.png diff --git a/assets/dolphin/external/lvl_1/frame_1.png b/assets/dolphin/external/nsfw/lvl_1/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_1.png rename to assets/dolphin/external/nsfw/lvl_1/frame_1.png diff --git a/assets/dolphin/external/lvl_1/frame_10.png b/assets/dolphin/external/nsfw/lvl_1/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_10.png rename to assets/dolphin/external/nsfw/lvl_1/frame_10.png diff --git a/assets/dolphin/external/lvl_1/frame_11.png b/assets/dolphin/external/nsfw/lvl_1/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_11.png rename to assets/dolphin/external/nsfw/lvl_1/frame_11.png diff --git a/assets/dolphin/external/lvl_1/frame_12.png b/assets/dolphin/external/nsfw/lvl_1/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_12.png rename to assets/dolphin/external/nsfw/lvl_1/frame_12.png diff --git a/assets/dolphin/external/lvl_1/frame_13.png b/assets/dolphin/external/nsfw/lvl_1/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_13.png rename to assets/dolphin/external/nsfw/lvl_1/frame_13.png diff --git a/assets/dolphin/external/lvl_1/frame_14.png b/assets/dolphin/external/nsfw/lvl_1/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_14.png rename to assets/dolphin/external/nsfw/lvl_1/frame_14.png diff --git a/assets/dolphin/external/lvl_1/frame_15.png b/assets/dolphin/external/nsfw/lvl_1/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_15.png rename to assets/dolphin/external/nsfw/lvl_1/frame_15.png diff --git a/assets/dolphin/external/lvl_1/frame_16.png b/assets/dolphin/external/nsfw/lvl_1/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_16.png rename to assets/dolphin/external/nsfw/lvl_1/frame_16.png diff --git a/assets/dolphin/external/lvl_1/frame_17.png b/assets/dolphin/external/nsfw/lvl_1/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_17.png rename to assets/dolphin/external/nsfw/lvl_1/frame_17.png diff --git a/assets/dolphin/external/lvl_1/frame_18.png b/assets/dolphin/external/nsfw/lvl_1/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_18.png rename to assets/dolphin/external/nsfw/lvl_1/frame_18.png diff --git a/assets/dolphin/external/lvl_1/frame_19.png b/assets/dolphin/external/nsfw/lvl_1/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_19.png rename to assets/dolphin/external/nsfw/lvl_1/frame_19.png diff --git a/assets/dolphin/external/lvl_1/frame_2.png b/assets/dolphin/external/nsfw/lvl_1/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_2.png rename to assets/dolphin/external/nsfw/lvl_1/frame_2.png diff --git a/assets/dolphin/external/lvl_1/frame_20.png b/assets/dolphin/external/nsfw/lvl_1/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_20.png rename to assets/dolphin/external/nsfw/lvl_1/frame_20.png diff --git a/assets/dolphin/external/lvl_1/frame_21.png b/assets/dolphin/external/nsfw/lvl_1/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_21.png rename to assets/dolphin/external/nsfw/lvl_1/frame_21.png diff --git a/assets/dolphin/external/lvl_1/frame_22.png b/assets/dolphin/external/nsfw/lvl_1/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_22.png rename to assets/dolphin/external/nsfw/lvl_1/frame_22.png diff --git a/assets/dolphin/external/lvl_1/frame_23.png b/assets/dolphin/external/nsfw/lvl_1/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_23.png rename to assets/dolphin/external/nsfw/lvl_1/frame_23.png diff --git a/assets/dolphin/external/lvl_1/frame_24.png b/assets/dolphin/external/nsfw/lvl_1/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_24.png rename to assets/dolphin/external/nsfw/lvl_1/frame_24.png diff --git a/assets/dolphin/external/lvl_1/frame_25.png b/assets/dolphin/external/nsfw/lvl_1/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_25.png rename to assets/dolphin/external/nsfw/lvl_1/frame_25.png diff --git a/assets/dolphin/external/lvl_1/frame_26.png b/assets/dolphin/external/nsfw/lvl_1/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_26.png rename to assets/dolphin/external/nsfw/lvl_1/frame_26.png diff --git a/assets/dolphin/external/lvl_1/frame_27.png b/assets/dolphin/external/nsfw/lvl_1/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_27.png rename to assets/dolphin/external/nsfw/lvl_1/frame_27.png diff --git a/assets/dolphin/external/lvl_1/frame_28.png b/assets/dolphin/external/nsfw/lvl_1/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_28.png rename to assets/dolphin/external/nsfw/lvl_1/frame_28.png diff --git a/assets/dolphin/external/lvl_1/frame_29.png b/assets/dolphin/external/nsfw/lvl_1/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_29.png rename to assets/dolphin/external/nsfw/lvl_1/frame_29.png diff --git a/assets/dolphin/external/lvl_1/frame_3.png b/assets/dolphin/external/nsfw/lvl_1/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_3.png rename to assets/dolphin/external/nsfw/lvl_1/frame_3.png diff --git a/assets/dolphin/external/lvl_1/frame_30.png b/assets/dolphin/external/nsfw/lvl_1/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_30.png rename to assets/dolphin/external/nsfw/lvl_1/frame_30.png diff --git a/assets/dolphin/external/lvl_1/frame_4.png b/assets/dolphin/external/nsfw/lvl_1/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_4.png rename to assets/dolphin/external/nsfw/lvl_1/frame_4.png diff --git a/assets/dolphin/external/lvl_1/frame_5.png b/assets/dolphin/external/nsfw/lvl_1/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_5.png rename to assets/dolphin/external/nsfw/lvl_1/frame_5.png diff --git a/assets/dolphin/external/lvl_1/frame_6.png b/assets/dolphin/external/nsfw/lvl_1/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_6.png rename to assets/dolphin/external/nsfw/lvl_1/frame_6.png diff --git a/assets/dolphin/external/lvl_1/frame_7.png b/assets/dolphin/external/nsfw/lvl_1/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_7.png rename to assets/dolphin/external/nsfw/lvl_1/frame_7.png diff --git a/assets/dolphin/external/lvl_1/frame_8.png b/assets/dolphin/external/nsfw/lvl_1/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_8.png rename to assets/dolphin/external/nsfw/lvl_1/frame_8.png diff --git a/assets/dolphin/external/lvl_1/frame_9.png b/assets/dolphin/external/nsfw/lvl_1/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_1/frame_9.png rename to assets/dolphin/external/nsfw/lvl_1/frame_9.png diff --git a/assets/dolphin/external/lvl_1/meta.txt b/assets/dolphin/external/nsfw/lvl_1/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_1/meta.txt rename to assets/dolphin/external/nsfw/lvl_1/meta.txt diff --git a/assets/dolphin/external/lvl_10/frame_0.png b/assets/dolphin/external/nsfw/lvl_10/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_0.png rename to assets/dolphin/external/nsfw/lvl_10/frame_0.png diff --git a/assets/dolphin/external/lvl_10/frame_1.png b/assets/dolphin/external/nsfw/lvl_10/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_1.png rename to assets/dolphin/external/nsfw/lvl_10/frame_1.png diff --git a/assets/dolphin/external/lvl_10/frame_10.png b/assets/dolphin/external/nsfw/lvl_10/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_10.png rename to assets/dolphin/external/nsfw/lvl_10/frame_10.png diff --git a/assets/dolphin/external/lvl_10/frame_11.png b/assets/dolphin/external/nsfw/lvl_10/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_11.png rename to assets/dolphin/external/nsfw/lvl_10/frame_11.png diff --git a/assets/dolphin/external/lvl_10/frame_12.png b/assets/dolphin/external/nsfw/lvl_10/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_12.png rename to assets/dolphin/external/nsfw/lvl_10/frame_12.png diff --git a/assets/dolphin/external/lvl_10/frame_13.png b/assets/dolphin/external/nsfw/lvl_10/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_13.png rename to assets/dolphin/external/nsfw/lvl_10/frame_13.png diff --git a/assets/dolphin/external/lvl_10/frame_14.png b/assets/dolphin/external/nsfw/lvl_10/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_14.png rename to assets/dolphin/external/nsfw/lvl_10/frame_14.png diff --git a/assets/dolphin/external/lvl_10/frame_15.png b/assets/dolphin/external/nsfw/lvl_10/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_15.png rename to assets/dolphin/external/nsfw/lvl_10/frame_15.png diff --git a/assets/dolphin/external/lvl_10/frame_16.png b/assets/dolphin/external/nsfw/lvl_10/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_16.png rename to assets/dolphin/external/nsfw/lvl_10/frame_16.png diff --git a/assets/dolphin/external/lvl_10/frame_17.png b/assets/dolphin/external/nsfw/lvl_10/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_17.png rename to assets/dolphin/external/nsfw/lvl_10/frame_17.png diff --git a/assets/dolphin/external/lvl_10/frame_18.png b/assets/dolphin/external/nsfw/lvl_10/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_18.png rename to assets/dolphin/external/nsfw/lvl_10/frame_18.png diff --git a/assets/dolphin/external/lvl_10/frame_19.png b/assets/dolphin/external/nsfw/lvl_10/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_19.png rename to assets/dolphin/external/nsfw/lvl_10/frame_19.png diff --git a/assets/dolphin/external/lvl_10/frame_2.png b/assets/dolphin/external/nsfw/lvl_10/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_2.png rename to assets/dolphin/external/nsfw/lvl_10/frame_2.png diff --git a/assets/dolphin/external/lvl_10/frame_20.png b/assets/dolphin/external/nsfw/lvl_10/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_20.png rename to assets/dolphin/external/nsfw/lvl_10/frame_20.png diff --git a/assets/dolphin/external/lvl_10/frame_21.png b/assets/dolphin/external/nsfw/lvl_10/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_21.png rename to assets/dolphin/external/nsfw/lvl_10/frame_21.png diff --git a/assets/dolphin/external/lvl_10/frame_22.png b/assets/dolphin/external/nsfw/lvl_10/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_22.png rename to assets/dolphin/external/nsfw/lvl_10/frame_22.png diff --git a/assets/dolphin/external/lvl_10/frame_23.png b/assets/dolphin/external/nsfw/lvl_10/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_23.png rename to assets/dolphin/external/nsfw/lvl_10/frame_23.png diff --git a/assets/dolphin/external/lvl_10/frame_24.png b/assets/dolphin/external/nsfw/lvl_10/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_24.png rename to assets/dolphin/external/nsfw/lvl_10/frame_24.png diff --git a/assets/dolphin/external/lvl_10/frame_25.png b/assets/dolphin/external/nsfw/lvl_10/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_25.png rename to assets/dolphin/external/nsfw/lvl_10/frame_25.png diff --git a/assets/dolphin/external/lvl_10/frame_26.png b/assets/dolphin/external/nsfw/lvl_10/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_26.png rename to assets/dolphin/external/nsfw/lvl_10/frame_26.png diff --git a/assets/dolphin/external/lvl_10/frame_27.png b/assets/dolphin/external/nsfw/lvl_10/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_27.png rename to assets/dolphin/external/nsfw/lvl_10/frame_27.png diff --git a/assets/dolphin/external/lvl_10/frame_3.png b/assets/dolphin/external/nsfw/lvl_10/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_3.png rename to assets/dolphin/external/nsfw/lvl_10/frame_3.png diff --git a/assets/dolphin/external/lvl_10/frame_4.png b/assets/dolphin/external/nsfw/lvl_10/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_4.png rename to assets/dolphin/external/nsfw/lvl_10/frame_4.png diff --git a/assets/dolphin/external/lvl_10/frame_5.png b/assets/dolphin/external/nsfw/lvl_10/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_5.png rename to assets/dolphin/external/nsfw/lvl_10/frame_5.png diff --git a/assets/dolphin/external/lvl_10/frame_6.png b/assets/dolphin/external/nsfw/lvl_10/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_6.png rename to assets/dolphin/external/nsfw/lvl_10/frame_6.png diff --git a/assets/dolphin/external/lvl_10/frame_7.png b/assets/dolphin/external/nsfw/lvl_10/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_7.png rename to assets/dolphin/external/nsfw/lvl_10/frame_7.png diff --git a/assets/dolphin/external/lvl_10/frame_8.png b/assets/dolphin/external/nsfw/lvl_10/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_8.png rename to assets/dolphin/external/nsfw/lvl_10/frame_8.png diff --git a/assets/dolphin/external/lvl_10/frame_9.png b/assets/dolphin/external/nsfw/lvl_10/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_10/frame_9.png rename to assets/dolphin/external/nsfw/lvl_10/frame_9.png diff --git a/assets/dolphin/external/lvl_10/meta.txt b/assets/dolphin/external/nsfw/lvl_10/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_10/meta.txt rename to assets/dolphin/external/nsfw/lvl_10/meta.txt diff --git a/assets/dolphin/external/lvl_11/frame_0.png b/assets/dolphin/external/nsfw/lvl_11/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_0.png rename to assets/dolphin/external/nsfw/lvl_11/frame_0.png diff --git a/assets/dolphin/external/lvl_11/frame_1.png b/assets/dolphin/external/nsfw/lvl_11/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_1.png rename to assets/dolphin/external/nsfw/lvl_11/frame_1.png diff --git a/assets/dolphin/external/lvl_11/frame_10.png b/assets/dolphin/external/nsfw/lvl_11/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_10.png rename to assets/dolphin/external/nsfw/lvl_11/frame_10.png diff --git a/assets/dolphin/external/lvl_11/frame_11.png b/assets/dolphin/external/nsfw/lvl_11/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_11.png rename to assets/dolphin/external/nsfw/lvl_11/frame_11.png diff --git a/assets/dolphin/external/lvl_11/frame_12.png b/assets/dolphin/external/nsfw/lvl_11/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_12.png rename to assets/dolphin/external/nsfw/lvl_11/frame_12.png diff --git a/assets/dolphin/external/lvl_11/frame_13.png b/assets/dolphin/external/nsfw/lvl_11/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_13.png rename to assets/dolphin/external/nsfw/lvl_11/frame_13.png diff --git a/assets/dolphin/external/lvl_11/frame_14.png b/assets/dolphin/external/nsfw/lvl_11/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_14.png rename to assets/dolphin/external/nsfw/lvl_11/frame_14.png diff --git a/assets/dolphin/external/lvl_11/frame_15.png b/assets/dolphin/external/nsfw/lvl_11/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_15.png rename to assets/dolphin/external/nsfw/lvl_11/frame_15.png diff --git a/assets/dolphin/external/lvl_11/frame_16.png b/assets/dolphin/external/nsfw/lvl_11/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_16.png rename to assets/dolphin/external/nsfw/lvl_11/frame_16.png diff --git a/assets/dolphin/external/lvl_11/frame_17.png b/assets/dolphin/external/nsfw/lvl_11/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_17.png rename to assets/dolphin/external/nsfw/lvl_11/frame_17.png diff --git a/assets/dolphin/external/lvl_11/frame_18.png b/assets/dolphin/external/nsfw/lvl_11/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_18.png rename to assets/dolphin/external/nsfw/lvl_11/frame_18.png diff --git a/assets/dolphin/external/lvl_11/frame_19.png b/assets/dolphin/external/nsfw/lvl_11/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_19.png rename to assets/dolphin/external/nsfw/lvl_11/frame_19.png diff --git a/assets/dolphin/external/lvl_11/frame_2.png b/assets/dolphin/external/nsfw/lvl_11/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_2.png rename to assets/dolphin/external/nsfw/lvl_11/frame_2.png diff --git a/assets/dolphin/external/lvl_11/frame_20.png b/assets/dolphin/external/nsfw/lvl_11/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_20.png rename to assets/dolphin/external/nsfw/lvl_11/frame_20.png diff --git a/assets/dolphin/external/lvl_11/frame_21.png b/assets/dolphin/external/nsfw/lvl_11/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_21.png rename to assets/dolphin/external/nsfw/lvl_11/frame_21.png diff --git a/assets/dolphin/external/lvl_11/frame_22.png b/assets/dolphin/external/nsfw/lvl_11/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_22.png rename to assets/dolphin/external/nsfw/lvl_11/frame_22.png diff --git a/assets/dolphin/external/lvl_11/frame_23.png b/assets/dolphin/external/nsfw/lvl_11/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_23.png rename to assets/dolphin/external/nsfw/lvl_11/frame_23.png diff --git a/assets/dolphin/external/lvl_11/frame_24.png b/assets/dolphin/external/nsfw/lvl_11/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_24.png rename to assets/dolphin/external/nsfw/lvl_11/frame_24.png diff --git a/assets/dolphin/external/lvl_11/frame_25.png b/assets/dolphin/external/nsfw/lvl_11/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_25.png rename to assets/dolphin/external/nsfw/lvl_11/frame_25.png diff --git a/assets/dolphin/external/lvl_11/frame_26.png b/assets/dolphin/external/nsfw/lvl_11/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_26.png rename to assets/dolphin/external/nsfw/lvl_11/frame_26.png diff --git a/assets/dolphin/external/lvl_11/frame_27.png b/assets/dolphin/external/nsfw/lvl_11/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_27.png rename to assets/dolphin/external/nsfw/lvl_11/frame_27.png diff --git a/assets/dolphin/external/lvl_11/frame_28.png b/assets/dolphin/external/nsfw/lvl_11/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_28.png rename to assets/dolphin/external/nsfw/lvl_11/frame_28.png diff --git a/assets/dolphin/external/lvl_11/frame_29.png b/assets/dolphin/external/nsfw/lvl_11/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_29.png rename to assets/dolphin/external/nsfw/lvl_11/frame_29.png diff --git a/assets/dolphin/external/lvl_11/frame_3.png b/assets/dolphin/external/nsfw/lvl_11/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_3.png rename to assets/dolphin/external/nsfw/lvl_11/frame_3.png diff --git a/assets/dolphin/external/lvl_11/frame_30.png b/assets/dolphin/external/nsfw/lvl_11/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_30.png rename to assets/dolphin/external/nsfw/lvl_11/frame_30.png diff --git a/assets/dolphin/external/lvl_11/frame_31.png b/assets/dolphin/external/nsfw/lvl_11/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_31.png rename to assets/dolphin/external/nsfw/lvl_11/frame_31.png diff --git a/assets/dolphin/external/lvl_11/frame_32.png b/assets/dolphin/external/nsfw/lvl_11/frame_32.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_32.png rename to assets/dolphin/external/nsfw/lvl_11/frame_32.png diff --git a/assets/dolphin/external/lvl_11/frame_33.png b/assets/dolphin/external/nsfw/lvl_11/frame_33.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_33.png rename to assets/dolphin/external/nsfw/lvl_11/frame_33.png diff --git a/assets/dolphin/external/lvl_11/frame_34.png b/assets/dolphin/external/nsfw/lvl_11/frame_34.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_34.png rename to assets/dolphin/external/nsfw/lvl_11/frame_34.png diff --git a/assets/dolphin/external/lvl_11/frame_35.png b/assets/dolphin/external/nsfw/lvl_11/frame_35.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_35.png rename to assets/dolphin/external/nsfw/lvl_11/frame_35.png diff --git a/assets/dolphin/external/lvl_11/frame_36.png b/assets/dolphin/external/nsfw/lvl_11/frame_36.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_36.png rename to assets/dolphin/external/nsfw/lvl_11/frame_36.png diff --git a/assets/dolphin/external/lvl_11/frame_37.png b/assets/dolphin/external/nsfw/lvl_11/frame_37.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_37.png rename to assets/dolphin/external/nsfw/lvl_11/frame_37.png diff --git a/assets/dolphin/external/lvl_11/frame_38.png b/assets/dolphin/external/nsfw/lvl_11/frame_38.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_38.png rename to assets/dolphin/external/nsfw/lvl_11/frame_38.png diff --git a/assets/dolphin/external/lvl_11/frame_39.png b/assets/dolphin/external/nsfw/lvl_11/frame_39.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_39.png rename to assets/dolphin/external/nsfw/lvl_11/frame_39.png diff --git a/assets/dolphin/external/lvl_11/frame_4.png b/assets/dolphin/external/nsfw/lvl_11/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_4.png rename to assets/dolphin/external/nsfw/lvl_11/frame_4.png diff --git a/assets/dolphin/external/lvl_11/frame_40.png b/assets/dolphin/external/nsfw/lvl_11/frame_40.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_40.png rename to assets/dolphin/external/nsfw/lvl_11/frame_40.png diff --git a/assets/dolphin/external/lvl_11/frame_41.png b/assets/dolphin/external/nsfw/lvl_11/frame_41.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_41.png rename to assets/dolphin/external/nsfw/lvl_11/frame_41.png diff --git a/assets/dolphin/external/lvl_11/frame_42.png b/assets/dolphin/external/nsfw/lvl_11/frame_42.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_42.png rename to assets/dolphin/external/nsfw/lvl_11/frame_42.png diff --git a/assets/dolphin/external/lvl_11/frame_43.png b/assets/dolphin/external/nsfw/lvl_11/frame_43.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_43.png rename to assets/dolphin/external/nsfw/lvl_11/frame_43.png diff --git a/assets/dolphin/external/lvl_11/frame_44.png b/assets/dolphin/external/nsfw/lvl_11/frame_44.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_44.png rename to assets/dolphin/external/nsfw/lvl_11/frame_44.png diff --git a/assets/dolphin/external/lvl_11/frame_45.png b/assets/dolphin/external/nsfw/lvl_11/frame_45.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_45.png rename to assets/dolphin/external/nsfw/lvl_11/frame_45.png diff --git a/assets/dolphin/external/lvl_11/frame_46.png b/assets/dolphin/external/nsfw/lvl_11/frame_46.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_46.png rename to assets/dolphin/external/nsfw/lvl_11/frame_46.png diff --git a/assets/dolphin/external/lvl_11/frame_47.png b/assets/dolphin/external/nsfw/lvl_11/frame_47.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_47.png rename to assets/dolphin/external/nsfw/lvl_11/frame_47.png diff --git a/assets/dolphin/external/lvl_11/frame_48.png b/assets/dolphin/external/nsfw/lvl_11/frame_48.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_48.png rename to assets/dolphin/external/nsfw/lvl_11/frame_48.png diff --git a/assets/dolphin/external/lvl_11/frame_49.png b/assets/dolphin/external/nsfw/lvl_11/frame_49.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_49.png rename to assets/dolphin/external/nsfw/lvl_11/frame_49.png diff --git a/assets/dolphin/external/lvl_11/frame_5.png b/assets/dolphin/external/nsfw/lvl_11/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_5.png rename to assets/dolphin/external/nsfw/lvl_11/frame_5.png diff --git a/assets/dolphin/external/lvl_11/frame_6.png b/assets/dolphin/external/nsfw/lvl_11/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_6.png rename to assets/dolphin/external/nsfw/lvl_11/frame_6.png diff --git a/assets/dolphin/external/lvl_11/frame_7.png b/assets/dolphin/external/nsfw/lvl_11/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_7.png rename to assets/dolphin/external/nsfw/lvl_11/frame_7.png diff --git a/assets/dolphin/external/lvl_11/frame_8.png b/assets/dolphin/external/nsfw/lvl_11/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_8.png rename to assets/dolphin/external/nsfw/lvl_11/frame_8.png diff --git a/assets/dolphin/external/lvl_11/frame_9.png b/assets/dolphin/external/nsfw/lvl_11/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_11/frame_9.png rename to assets/dolphin/external/nsfw/lvl_11/frame_9.png diff --git a/assets/dolphin/external/lvl_11/meta.txt b/assets/dolphin/external/nsfw/lvl_11/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_11/meta.txt rename to assets/dolphin/external/nsfw/lvl_11/meta.txt diff --git a/assets/dolphin/external/lvl_12/frame_0.png b/assets/dolphin/external/nsfw/lvl_12/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_0.png rename to assets/dolphin/external/nsfw/lvl_12/frame_0.png diff --git a/assets/dolphin/external/lvl_12/frame_1.png b/assets/dolphin/external/nsfw/lvl_12/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_1.png rename to assets/dolphin/external/nsfw/lvl_12/frame_1.png diff --git a/assets/dolphin/external/lvl_12/frame_10.png b/assets/dolphin/external/nsfw/lvl_12/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_10.png rename to assets/dolphin/external/nsfw/lvl_12/frame_10.png diff --git a/assets/dolphin/external/lvl_12/frame_11.png b/assets/dolphin/external/nsfw/lvl_12/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_11.png rename to assets/dolphin/external/nsfw/lvl_12/frame_11.png diff --git a/assets/dolphin/external/lvl_12/frame_12.png b/assets/dolphin/external/nsfw/lvl_12/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_12.png rename to assets/dolphin/external/nsfw/lvl_12/frame_12.png diff --git a/assets/dolphin/external/lvl_12/frame_13.png b/assets/dolphin/external/nsfw/lvl_12/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_13.png rename to assets/dolphin/external/nsfw/lvl_12/frame_13.png diff --git a/assets/dolphin/external/lvl_12/frame_14.png b/assets/dolphin/external/nsfw/lvl_12/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_14.png rename to assets/dolphin/external/nsfw/lvl_12/frame_14.png diff --git a/assets/dolphin/external/lvl_12/frame_15.png b/assets/dolphin/external/nsfw/lvl_12/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_15.png rename to assets/dolphin/external/nsfw/lvl_12/frame_15.png diff --git a/assets/dolphin/external/lvl_12/frame_2.png b/assets/dolphin/external/nsfw/lvl_12/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_2.png rename to assets/dolphin/external/nsfw/lvl_12/frame_2.png diff --git a/assets/dolphin/external/lvl_12/frame_3.png b/assets/dolphin/external/nsfw/lvl_12/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_3.png rename to assets/dolphin/external/nsfw/lvl_12/frame_3.png diff --git a/assets/dolphin/external/lvl_12/frame_4.png b/assets/dolphin/external/nsfw/lvl_12/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_4.png rename to assets/dolphin/external/nsfw/lvl_12/frame_4.png diff --git a/assets/dolphin/external/lvl_12/frame_5.png b/assets/dolphin/external/nsfw/lvl_12/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_5.png rename to assets/dolphin/external/nsfw/lvl_12/frame_5.png diff --git a/assets/dolphin/external/lvl_12/frame_6.png b/assets/dolphin/external/nsfw/lvl_12/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_6.png rename to assets/dolphin/external/nsfw/lvl_12/frame_6.png diff --git a/assets/dolphin/external/lvl_12/frame_7.png b/assets/dolphin/external/nsfw/lvl_12/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_7.png rename to assets/dolphin/external/nsfw/lvl_12/frame_7.png diff --git a/assets/dolphin/external/lvl_12/frame_8.png b/assets/dolphin/external/nsfw/lvl_12/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_8.png rename to assets/dolphin/external/nsfw/lvl_12/frame_8.png diff --git a/assets/dolphin/external/lvl_12/frame_9.png b/assets/dolphin/external/nsfw/lvl_12/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_12/frame_9.png rename to assets/dolphin/external/nsfw/lvl_12/frame_9.png diff --git a/assets/dolphin/external/lvl_12/meta.txt b/assets/dolphin/external/nsfw/lvl_12/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_12/meta.txt rename to assets/dolphin/external/nsfw/lvl_12/meta.txt diff --git a/assets/dolphin/external/lvl_13/frame_0.png b/assets/dolphin/external/nsfw/lvl_13/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_0.png rename to assets/dolphin/external/nsfw/lvl_13/frame_0.png diff --git a/assets/dolphin/external/lvl_13/frame_1.png b/assets/dolphin/external/nsfw/lvl_13/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_1.png rename to assets/dolphin/external/nsfw/lvl_13/frame_1.png diff --git a/assets/dolphin/external/lvl_13/frame_10.png b/assets/dolphin/external/nsfw/lvl_13/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_10.png rename to assets/dolphin/external/nsfw/lvl_13/frame_10.png diff --git a/assets/dolphin/external/lvl_13/frame_2.png b/assets/dolphin/external/nsfw/lvl_13/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_2.png rename to assets/dolphin/external/nsfw/lvl_13/frame_2.png diff --git a/assets/dolphin/external/lvl_13/frame_3.png b/assets/dolphin/external/nsfw/lvl_13/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_3.png rename to assets/dolphin/external/nsfw/lvl_13/frame_3.png diff --git a/assets/dolphin/external/lvl_13/frame_4.png b/assets/dolphin/external/nsfw/lvl_13/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_4.png rename to assets/dolphin/external/nsfw/lvl_13/frame_4.png diff --git a/assets/dolphin/external/lvl_13/frame_5.png b/assets/dolphin/external/nsfw/lvl_13/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_5.png rename to assets/dolphin/external/nsfw/lvl_13/frame_5.png diff --git a/assets/dolphin/external/lvl_13/frame_6.png b/assets/dolphin/external/nsfw/lvl_13/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_6.png rename to assets/dolphin/external/nsfw/lvl_13/frame_6.png diff --git a/assets/dolphin/external/lvl_13/frame_7.png b/assets/dolphin/external/nsfw/lvl_13/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_7.png rename to assets/dolphin/external/nsfw/lvl_13/frame_7.png diff --git a/assets/dolphin/external/lvl_13/frame_8.png b/assets/dolphin/external/nsfw/lvl_13/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_8.png rename to assets/dolphin/external/nsfw/lvl_13/frame_8.png diff --git a/assets/dolphin/external/lvl_13/frame_9.png b/assets/dolphin/external/nsfw/lvl_13/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_13/frame_9.png rename to assets/dolphin/external/nsfw/lvl_13/frame_9.png diff --git a/assets/dolphin/external/lvl_13/meta.txt b/assets/dolphin/external/nsfw/lvl_13/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_13/meta.txt rename to assets/dolphin/external/nsfw/lvl_13/meta.txt diff --git a/assets/dolphin/external/lvl_14/frame_0.png b/assets/dolphin/external/nsfw/lvl_14/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_0.png rename to assets/dolphin/external/nsfw/lvl_14/frame_0.png diff --git a/assets/dolphin/external/lvl_14/frame_1.png b/assets/dolphin/external/nsfw/lvl_14/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_1.png rename to assets/dolphin/external/nsfw/lvl_14/frame_1.png diff --git a/assets/dolphin/external/lvl_14/frame_2.png b/assets/dolphin/external/nsfw/lvl_14/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_2.png rename to assets/dolphin/external/nsfw/lvl_14/frame_2.png diff --git a/assets/dolphin/external/lvl_14/frame_3.png b/assets/dolphin/external/nsfw/lvl_14/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_3.png rename to assets/dolphin/external/nsfw/lvl_14/frame_3.png diff --git a/assets/dolphin/external/lvl_14/frame_4.png b/assets/dolphin/external/nsfw/lvl_14/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_4.png rename to assets/dolphin/external/nsfw/lvl_14/frame_4.png diff --git a/assets/dolphin/external/lvl_14/frame_5.png b/assets/dolphin/external/nsfw/lvl_14/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_5.png rename to assets/dolphin/external/nsfw/lvl_14/frame_5.png diff --git a/assets/dolphin/external/lvl_14/frame_6.png b/assets/dolphin/external/nsfw/lvl_14/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_6.png rename to assets/dolphin/external/nsfw/lvl_14/frame_6.png diff --git a/assets/dolphin/external/lvl_14/frame_7.png b/assets/dolphin/external/nsfw/lvl_14/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_14/frame_7.png rename to assets/dolphin/external/nsfw/lvl_14/frame_7.png diff --git a/assets/dolphin/external/lvl_14/meta.txt b/assets/dolphin/external/nsfw/lvl_14/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_14/meta.txt rename to assets/dolphin/external/nsfw/lvl_14/meta.txt diff --git a/assets/dolphin/external/lvl_15/frame_0.png b/assets/dolphin/external/nsfw/lvl_15/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_0.png rename to assets/dolphin/external/nsfw/lvl_15/frame_0.png diff --git a/assets/dolphin/external/lvl_15/frame_1.png b/assets/dolphin/external/nsfw/lvl_15/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_1.png rename to assets/dolphin/external/nsfw/lvl_15/frame_1.png diff --git a/assets/dolphin/external/lvl_15/frame_10.png b/assets/dolphin/external/nsfw/lvl_15/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_10.png rename to assets/dolphin/external/nsfw/lvl_15/frame_10.png diff --git a/assets/dolphin/external/lvl_15/frame_11.png b/assets/dolphin/external/nsfw/lvl_15/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_11.png rename to assets/dolphin/external/nsfw/lvl_15/frame_11.png diff --git a/assets/dolphin/external/lvl_15/frame_12.png b/assets/dolphin/external/nsfw/lvl_15/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_12.png rename to assets/dolphin/external/nsfw/lvl_15/frame_12.png diff --git a/assets/dolphin/external/lvl_15/frame_13.png b/assets/dolphin/external/nsfw/lvl_15/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_13.png rename to assets/dolphin/external/nsfw/lvl_15/frame_13.png diff --git a/assets/dolphin/external/lvl_15/frame_14.png b/assets/dolphin/external/nsfw/lvl_15/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_14.png rename to assets/dolphin/external/nsfw/lvl_15/frame_14.png diff --git a/assets/dolphin/external/lvl_15/frame_15.png b/assets/dolphin/external/nsfw/lvl_15/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_15.png rename to assets/dolphin/external/nsfw/lvl_15/frame_15.png diff --git a/assets/dolphin/external/lvl_15/frame_16.png b/assets/dolphin/external/nsfw/lvl_15/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_16.png rename to assets/dolphin/external/nsfw/lvl_15/frame_16.png diff --git a/assets/dolphin/external/lvl_15/frame_17.png b/assets/dolphin/external/nsfw/lvl_15/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_17.png rename to assets/dolphin/external/nsfw/lvl_15/frame_17.png diff --git a/assets/dolphin/external/lvl_15/frame_18.png b/assets/dolphin/external/nsfw/lvl_15/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_18.png rename to assets/dolphin/external/nsfw/lvl_15/frame_18.png diff --git a/assets/dolphin/external/lvl_15/frame_19.png b/assets/dolphin/external/nsfw/lvl_15/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_19.png rename to assets/dolphin/external/nsfw/lvl_15/frame_19.png diff --git a/assets/dolphin/external/lvl_15/frame_2.png b/assets/dolphin/external/nsfw/lvl_15/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_2.png rename to assets/dolphin/external/nsfw/lvl_15/frame_2.png diff --git a/assets/dolphin/external/lvl_15/frame_20.png b/assets/dolphin/external/nsfw/lvl_15/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_20.png rename to assets/dolphin/external/nsfw/lvl_15/frame_20.png diff --git a/assets/dolphin/external/lvl_15/frame_21.png b/assets/dolphin/external/nsfw/lvl_15/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_21.png rename to assets/dolphin/external/nsfw/lvl_15/frame_21.png diff --git a/assets/dolphin/external/lvl_15/frame_3.png b/assets/dolphin/external/nsfw/lvl_15/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_3.png rename to assets/dolphin/external/nsfw/lvl_15/frame_3.png diff --git a/assets/dolphin/external/lvl_15/frame_4.png b/assets/dolphin/external/nsfw/lvl_15/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_4.png rename to assets/dolphin/external/nsfw/lvl_15/frame_4.png diff --git a/assets/dolphin/external/lvl_15/frame_5.png b/assets/dolphin/external/nsfw/lvl_15/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_5.png rename to assets/dolphin/external/nsfw/lvl_15/frame_5.png diff --git a/assets/dolphin/external/lvl_15/frame_6.png b/assets/dolphin/external/nsfw/lvl_15/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_6.png rename to assets/dolphin/external/nsfw/lvl_15/frame_6.png diff --git a/assets/dolphin/external/lvl_15/frame_7.png b/assets/dolphin/external/nsfw/lvl_15/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_7.png rename to assets/dolphin/external/nsfw/lvl_15/frame_7.png diff --git a/assets/dolphin/external/lvl_15/frame_8.png b/assets/dolphin/external/nsfw/lvl_15/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_8.png rename to assets/dolphin/external/nsfw/lvl_15/frame_8.png diff --git a/assets/dolphin/external/lvl_15/frame_9.png b/assets/dolphin/external/nsfw/lvl_15/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_15/frame_9.png rename to assets/dolphin/external/nsfw/lvl_15/frame_9.png diff --git a/assets/dolphin/external/lvl_15/meta.txt b/assets/dolphin/external/nsfw/lvl_15/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_15/meta.txt rename to assets/dolphin/external/nsfw/lvl_15/meta.txt diff --git a/assets/dolphin/external/lvl_16/frame_0.png b/assets/dolphin/external/nsfw/lvl_16/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_0.png rename to assets/dolphin/external/nsfw/lvl_16/frame_0.png diff --git a/assets/dolphin/external/lvl_16/frame_1.png b/assets/dolphin/external/nsfw/lvl_16/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_1.png rename to assets/dolphin/external/nsfw/lvl_16/frame_1.png diff --git a/assets/dolphin/external/lvl_16/frame_10.png b/assets/dolphin/external/nsfw/lvl_16/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_10.png rename to assets/dolphin/external/nsfw/lvl_16/frame_10.png diff --git a/assets/dolphin/external/lvl_16/frame_11.png b/assets/dolphin/external/nsfw/lvl_16/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_11.png rename to assets/dolphin/external/nsfw/lvl_16/frame_11.png diff --git a/assets/dolphin/external/lvl_16/frame_12.png b/assets/dolphin/external/nsfw/lvl_16/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_12.png rename to assets/dolphin/external/nsfw/lvl_16/frame_12.png diff --git a/assets/dolphin/external/lvl_16/frame_13.png b/assets/dolphin/external/nsfw/lvl_16/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_13.png rename to assets/dolphin/external/nsfw/lvl_16/frame_13.png diff --git a/assets/dolphin/external/lvl_16/frame_14.png b/assets/dolphin/external/nsfw/lvl_16/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_14.png rename to assets/dolphin/external/nsfw/lvl_16/frame_14.png diff --git a/assets/dolphin/external/lvl_16/frame_15.png b/assets/dolphin/external/nsfw/lvl_16/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_15.png rename to assets/dolphin/external/nsfw/lvl_16/frame_15.png diff --git a/assets/dolphin/external/lvl_16/frame_16.png b/assets/dolphin/external/nsfw/lvl_16/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_16.png rename to assets/dolphin/external/nsfw/lvl_16/frame_16.png diff --git a/assets/dolphin/external/lvl_16/frame_17.png b/assets/dolphin/external/nsfw/lvl_16/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_17.png rename to assets/dolphin/external/nsfw/lvl_16/frame_17.png diff --git a/assets/dolphin/external/lvl_16/frame_18.png b/assets/dolphin/external/nsfw/lvl_16/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_18.png rename to assets/dolphin/external/nsfw/lvl_16/frame_18.png diff --git a/assets/dolphin/external/lvl_16/frame_19.png b/assets/dolphin/external/nsfw/lvl_16/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_19.png rename to assets/dolphin/external/nsfw/lvl_16/frame_19.png diff --git a/assets/dolphin/external/lvl_16/frame_2.png b/assets/dolphin/external/nsfw/lvl_16/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_2.png rename to assets/dolphin/external/nsfw/lvl_16/frame_2.png diff --git a/assets/dolphin/external/lvl_16/frame_20.png b/assets/dolphin/external/nsfw/lvl_16/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_20.png rename to assets/dolphin/external/nsfw/lvl_16/frame_20.png diff --git a/assets/dolphin/external/lvl_16/frame_3.png b/assets/dolphin/external/nsfw/lvl_16/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_3.png rename to assets/dolphin/external/nsfw/lvl_16/frame_3.png diff --git a/assets/dolphin/external/lvl_16/frame_4.png b/assets/dolphin/external/nsfw/lvl_16/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_4.png rename to assets/dolphin/external/nsfw/lvl_16/frame_4.png diff --git a/assets/dolphin/external/lvl_16/frame_5.png b/assets/dolphin/external/nsfw/lvl_16/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_5.png rename to assets/dolphin/external/nsfw/lvl_16/frame_5.png diff --git a/assets/dolphin/external/lvl_16/frame_6.png b/assets/dolphin/external/nsfw/lvl_16/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_6.png rename to assets/dolphin/external/nsfw/lvl_16/frame_6.png diff --git a/assets/dolphin/external/lvl_16/frame_7.png b/assets/dolphin/external/nsfw/lvl_16/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_7.png rename to assets/dolphin/external/nsfw/lvl_16/frame_7.png diff --git a/assets/dolphin/external/lvl_16/frame_8.png b/assets/dolphin/external/nsfw/lvl_16/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_8.png rename to assets/dolphin/external/nsfw/lvl_16/frame_8.png diff --git a/assets/dolphin/external/lvl_16/frame_9.png b/assets/dolphin/external/nsfw/lvl_16/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_16/frame_9.png rename to assets/dolphin/external/nsfw/lvl_16/frame_9.png diff --git a/assets/dolphin/external/lvl_16/meta.txt b/assets/dolphin/external/nsfw/lvl_16/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_16/meta.txt rename to assets/dolphin/external/nsfw/lvl_16/meta.txt diff --git a/assets/dolphin/external/lvl_17/frame_0.png b/assets/dolphin/external/nsfw/lvl_17/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_0.png rename to assets/dolphin/external/nsfw/lvl_17/frame_0.png diff --git a/assets/dolphin/external/lvl_17/frame_1.png b/assets/dolphin/external/nsfw/lvl_17/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_1.png rename to assets/dolphin/external/nsfw/lvl_17/frame_1.png diff --git a/assets/dolphin/external/lvl_17/frame_10.png b/assets/dolphin/external/nsfw/lvl_17/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_10.png rename to assets/dolphin/external/nsfw/lvl_17/frame_10.png diff --git a/assets/dolphin/external/lvl_17/frame_11.png b/assets/dolphin/external/nsfw/lvl_17/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_11.png rename to assets/dolphin/external/nsfw/lvl_17/frame_11.png diff --git a/assets/dolphin/external/lvl_17/frame_12.png b/assets/dolphin/external/nsfw/lvl_17/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_12.png rename to assets/dolphin/external/nsfw/lvl_17/frame_12.png diff --git a/assets/dolphin/external/lvl_17/frame_13.png b/assets/dolphin/external/nsfw/lvl_17/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_13.png rename to assets/dolphin/external/nsfw/lvl_17/frame_13.png diff --git a/assets/dolphin/external/lvl_17/frame_14.png b/assets/dolphin/external/nsfw/lvl_17/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_14.png rename to assets/dolphin/external/nsfw/lvl_17/frame_14.png diff --git a/assets/dolphin/external/lvl_17/frame_15.png b/assets/dolphin/external/nsfw/lvl_17/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_15.png rename to assets/dolphin/external/nsfw/lvl_17/frame_15.png diff --git a/assets/dolphin/external/lvl_17/frame_16.png b/assets/dolphin/external/nsfw/lvl_17/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_16.png rename to assets/dolphin/external/nsfw/lvl_17/frame_16.png diff --git a/assets/dolphin/external/lvl_17/frame_17.png b/assets/dolphin/external/nsfw/lvl_17/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_17.png rename to assets/dolphin/external/nsfw/lvl_17/frame_17.png diff --git a/assets/dolphin/external/lvl_17/frame_18.png b/assets/dolphin/external/nsfw/lvl_17/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_18.png rename to assets/dolphin/external/nsfw/lvl_17/frame_18.png diff --git a/assets/dolphin/external/lvl_17/frame_19.png b/assets/dolphin/external/nsfw/lvl_17/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_19.png rename to assets/dolphin/external/nsfw/lvl_17/frame_19.png diff --git a/assets/dolphin/external/lvl_17/frame_2.png b/assets/dolphin/external/nsfw/lvl_17/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_2.png rename to assets/dolphin/external/nsfw/lvl_17/frame_2.png diff --git a/assets/dolphin/external/lvl_17/frame_20.png b/assets/dolphin/external/nsfw/lvl_17/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_20.png rename to assets/dolphin/external/nsfw/lvl_17/frame_20.png diff --git a/assets/dolphin/external/lvl_17/frame_21.png b/assets/dolphin/external/nsfw/lvl_17/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_21.png rename to assets/dolphin/external/nsfw/lvl_17/frame_21.png diff --git a/assets/dolphin/external/lvl_17/frame_22.png b/assets/dolphin/external/nsfw/lvl_17/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_22.png rename to assets/dolphin/external/nsfw/lvl_17/frame_22.png diff --git a/assets/dolphin/external/lvl_17/frame_23.png b/assets/dolphin/external/nsfw/lvl_17/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_23.png rename to assets/dolphin/external/nsfw/lvl_17/frame_23.png diff --git a/assets/dolphin/external/lvl_17/frame_24.png b/assets/dolphin/external/nsfw/lvl_17/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_24.png rename to assets/dolphin/external/nsfw/lvl_17/frame_24.png diff --git a/assets/dolphin/external/lvl_17/frame_25.png b/assets/dolphin/external/nsfw/lvl_17/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_25.png rename to assets/dolphin/external/nsfw/lvl_17/frame_25.png diff --git a/assets/dolphin/external/lvl_17/frame_26.png b/assets/dolphin/external/nsfw/lvl_17/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_26.png rename to assets/dolphin/external/nsfw/lvl_17/frame_26.png diff --git a/assets/dolphin/external/lvl_17/frame_27.png b/assets/dolphin/external/nsfw/lvl_17/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_27.png rename to assets/dolphin/external/nsfw/lvl_17/frame_27.png diff --git a/assets/dolphin/external/lvl_17/frame_28.png b/assets/dolphin/external/nsfw/lvl_17/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_28.png rename to assets/dolphin/external/nsfw/lvl_17/frame_28.png diff --git a/assets/dolphin/external/lvl_17/frame_29.png b/assets/dolphin/external/nsfw/lvl_17/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_29.png rename to assets/dolphin/external/nsfw/lvl_17/frame_29.png diff --git a/assets/dolphin/external/lvl_17/frame_3.png b/assets/dolphin/external/nsfw/lvl_17/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_3.png rename to assets/dolphin/external/nsfw/lvl_17/frame_3.png diff --git a/assets/dolphin/external/lvl_17/frame_30.png b/assets/dolphin/external/nsfw/lvl_17/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_30.png rename to assets/dolphin/external/nsfw/lvl_17/frame_30.png diff --git a/assets/dolphin/external/lvl_17/frame_31.png b/assets/dolphin/external/nsfw/lvl_17/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_31.png rename to assets/dolphin/external/nsfw/lvl_17/frame_31.png diff --git a/assets/dolphin/external/lvl_17/frame_4.png b/assets/dolphin/external/nsfw/lvl_17/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_4.png rename to assets/dolphin/external/nsfw/lvl_17/frame_4.png diff --git a/assets/dolphin/external/lvl_17/frame_5.png b/assets/dolphin/external/nsfw/lvl_17/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_5.png rename to assets/dolphin/external/nsfw/lvl_17/frame_5.png diff --git a/assets/dolphin/external/lvl_17/frame_6.png b/assets/dolphin/external/nsfw/lvl_17/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_6.png rename to assets/dolphin/external/nsfw/lvl_17/frame_6.png diff --git a/assets/dolphin/external/lvl_17/frame_7.png b/assets/dolphin/external/nsfw/lvl_17/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_7.png rename to assets/dolphin/external/nsfw/lvl_17/frame_7.png diff --git a/assets/dolphin/external/lvl_17/frame_8.png b/assets/dolphin/external/nsfw/lvl_17/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_8.png rename to assets/dolphin/external/nsfw/lvl_17/frame_8.png diff --git a/assets/dolphin/external/lvl_17/frame_9.png b/assets/dolphin/external/nsfw/lvl_17/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_17/frame_9.png rename to assets/dolphin/external/nsfw/lvl_17/frame_9.png diff --git a/assets/dolphin/external/lvl_17/meta.txt b/assets/dolphin/external/nsfw/lvl_17/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_17/meta.txt rename to assets/dolphin/external/nsfw/lvl_17/meta.txt diff --git a/assets/dolphin/external/lvl_18/frame_0.png b/assets/dolphin/external/nsfw/lvl_18/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_0.png rename to assets/dolphin/external/nsfw/lvl_18/frame_0.png diff --git a/assets/dolphin/external/lvl_18/frame_1.png b/assets/dolphin/external/nsfw/lvl_18/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_1.png rename to assets/dolphin/external/nsfw/lvl_18/frame_1.png diff --git a/assets/dolphin/external/lvl_18/frame_10.png b/assets/dolphin/external/nsfw/lvl_18/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_10.png rename to assets/dolphin/external/nsfw/lvl_18/frame_10.png diff --git a/assets/dolphin/external/lvl_18/frame_11.png b/assets/dolphin/external/nsfw/lvl_18/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_11.png rename to assets/dolphin/external/nsfw/lvl_18/frame_11.png diff --git a/assets/dolphin/external/lvl_18/frame_12.png b/assets/dolphin/external/nsfw/lvl_18/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_12.png rename to assets/dolphin/external/nsfw/lvl_18/frame_12.png diff --git a/assets/dolphin/external/lvl_18/frame_13.png b/assets/dolphin/external/nsfw/lvl_18/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_13.png rename to assets/dolphin/external/nsfw/lvl_18/frame_13.png diff --git a/assets/dolphin/external/lvl_18/frame_14.png b/assets/dolphin/external/nsfw/lvl_18/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_14.png rename to assets/dolphin/external/nsfw/lvl_18/frame_14.png diff --git a/assets/dolphin/external/lvl_18/frame_15.png b/assets/dolphin/external/nsfw/lvl_18/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_15.png rename to assets/dolphin/external/nsfw/lvl_18/frame_15.png diff --git a/assets/dolphin/external/lvl_18/frame_16.png b/assets/dolphin/external/nsfw/lvl_18/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_16.png rename to assets/dolphin/external/nsfw/lvl_18/frame_16.png diff --git a/assets/dolphin/external/lvl_18/frame_17.png b/assets/dolphin/external/nsfw/lvl_18/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_17.png rename to assets/dolphin/external/nsfw/lvl_18/frame_17.png diff --git a/assets/dolphin/external/lvl_18/frame_18.png b/assets/dolphin/external/nsfw/lvl_18/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_18.png rename to assets/dolphin/external/nsfw/lvl_18/frame_18.png diff --git a/assets/dolphin/external/lvl_18/frame_19.png b/assets/dolphin/external/nsfw/lvl_18/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_19.png rename to assets/dolphin/external/nsfw/lvl_18/frame_19.png diff --git a/assets/dolphin/external/lvl_18/frame_2.png b/assets/dolphin/external/nsfw/lvl_18/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_2.png rename to assets/dolphin/external/nsfw/lvl_18/frame_2.png diff --git a/assets/dolphin/external/lvl_18/frame_20.png b/assets/dolphin/external/nsfw/lvl_18/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_20.png rename to assets/dolphin/external/nsfw/lvl_18/frame_20.png diff --git a/assets/dolphin/external/lvl_18/frame_21.png b/assets/dolphin/external/nsfw/lvl_18/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_21.png rename to assets/dolphin/external/nsfw/lvl_18/frame_21.png diff --git a/assets/dolphin/external/lvl_18/frame_22.png b/assets/dolphin/external/nsfw/lvl_18/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_22.png rename to assets/dolphin/external/nsfw/lvl_18/frame_22.png diff --git a/assets/dolphin/external/lvl_18/frame_3.png b/assets/dolphin/external/nsfw/lvl_18/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_3.png rename to assets/dolphin/external/nsfw/lvl_18/frame_3.png diff --git a/assets/dolphin/external/lvl_18/frame_4.png b/assets/dolphin/external/nsfw/lvl_18/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_4.png rename to assets/dolphin/external/nsfw/lvl_18/frame_4.png diff --git a/assets/dolphin/external/lvl_18/frame_5.png b/assets/dolphin/external/nsfw/lvl_18/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_5.png rename to assets/dolphin/external/nsfw/lvl_18/frame_5.png diff --git a/assets/dolphin/external/lvl_18/frame_6.png b/assets/dolphin/external/nsfw/lvl_18/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_6.png rename to assets/dolphin/external/nsfw/lvl_18/frame_6.png diff --git a/assets/dolphin/external/lvl_18/frame_7.png b/assets/dolphin/external/nsfw/lvl_18/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_7.png rename to assets/dolphin/external/nsfw/lvl_18/frame_7.png diff --git a/assets/dolphin/external/lvl_18/frame_8.png b/assets/dolphin/external/nsfw/lvl_18/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_8.png rename to assets/dolphin/external/nsfw/lvl_18/frame_8.png diff --git a/assets/dolphin/external/lvl_18/frame_9.png b/assets/dolphin/external/nsfw/lvl_18/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_18/frame_9.png rename to assets/dolphin/external/nsfw/lvl_18/frame_9.png diff --git a/assets/dolphin/external/lvl_18/meta.txt b/assets/dolphin/external/nsfw/lvl_18/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_18/meta.txt rename to assets/dolphin/external/nsfw/lvl_18/meta.txt diff --git a/assets/dolphin/external/lvl_19/frame_0.png b/assets/dolphin/external/nsfw/lvl_19/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_0.png rename to assets/dolphin/external/nsfw/lvl_19/frame_0.png diff --git a/assets/dolphin/external/lvl_19/frame_1.png b/assets/dolphin/external/nsfw/lvl_19/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_1.png rename to assets/dolphin/external/nsfw/lvl_19/frame_1.png diff --git a/assets/dolphin/external/lvl_19/frame_10.png b/assets/dolphin/external/nsfw/lvl_19/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_10.png rename to assets/dolphin/external/nsfw/lvl_19/frame_10.png diff --git a/assets/dolphin/external/lvl_19/frame_11.png b/assets/dolphin/external/nsfw/lvl_19/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_11.png rename to assets/dolphin/external/nsfw/lvl_19/frame_11.png diff --git a/assets/dolphin/external/lvl_19/frame_12.png b/assets/dolphin/external/nsfw/lvl_19/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_12.png rename to assets/dolphin/external/nsfw/lvl_19/frame_12.png diff --git a/assets/dolphin/external/lvl_19/frame_13.png b/assets/dolphin/external/nsfw/lvl_19/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_13.png rename to assets/dolphin/external/nsfw/lvl_19/frame_13.png diff --git a/assets/dolphin/external/lvl_19/frame_14.png b/assets/dolphin/external/nsfw/lvl_19/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_14.png rename to assets/dolphin/external/nsfw/lvl_19/frame_14.png diff --git a/assets/dolphin/external/lvl_19/frame_15.png b/assets/dolphin/external/nsfw/lvl_19/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_15.png rename to assets/dolphin/external/nsfw/lvl_19/frame_15.png diff --git a/assets/dolphin/external/lvl_19/frame_16.png b/assets/dolphin/external/nsfw/lvl_19/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_16.png rename to assets/dolphin/external/nsfw/lvl_19/frame_16.png diff --git a/assets/dolphin/external/lvl_19/frame_17.png b/assets/dolphin/external/nsfw/lvl_19/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_17.png rename to assets/dolphin/external/nsfw/lvl_19/frame_17.png diff --git a/assets/dolphin/external/lvl_19/frame_18.png b/assets/dolphin/external/nsfw/lvl_19/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_18.png rename to assets/dolphin/external/nsfw/lvl_19/frame_18.png diff --git a/assets/dolphin/external/lvl_19/frame_19.png b/assets/dolphin/external/nsfw/lvl_19/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_19.png rename to assets/dolphin/external/nsfw/lvl_19/frame_19.png diff --git a/assets/dolphin/external/lvl_19/frame_2.png b/assets/dolphin/external/nsfw/lvl_19/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_2.png rename to assets/dolphin/external/nsfw/lvl_19/frame_2.png diff --git a/assets/dolphin/external/lvl_19/frame_20.png b/assets/dolphin/external/nsfw/lvl_19/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_20.png rename to assets/dolphin/external/nsfw/lvl_19/frame_20.png diff --git a/assets/dolphin/external/lvl_19/frame_21.png b/assets/dolphin/external/nsfw/lvl_19/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_21.png rename to assets/dolphin/external/nsfw/lvl_19/frame_21.png diff --git a/assets/dolphin/external/lvl_19/frame_3.png b/assets/dolphin/external/nsfw/lvl_19/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_3.png rename to assets/dolphin/external/nsfw/lvl_19/frame_3.png diff --git a/assets/dolphin/external/lvl_19/frame_4.png b/assets/dolphin/external/nsfw/lvl_19/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_4.png rename to assets/dolphin/external/nsfw/lvl_19/frame_4.png diff --git a/assets/dolphin/external/lvl_19/frame_5.png b/assets/dolphin/external/nsfw/lvl_19/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_5.png rename to assets/dolphin/external/nsfw/lvl_19/frame_5.png diff --git a/assets/dolphin/external/lvl_19/frame_6.png b/assets/dolphin/external/nsfw/lvl_19/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_6.png rename to assets/dolphin/external/nsfw/lvl_19/frame_6.png diff --git a/assets/dolphin/external/lvl_19/frame_7.png b/assets/dolphin/external/nsfw/lvl_19/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_7.png rename to assets/dolphin/external/nsfw/lvl_19/frame_7.png diff --git a/assets/dolphin/external/lvl_19/frame_8.png b/assets/dolphin/external/nsfw/lvl_19/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_8.png rename to assets/dolphin/external/nsfw/lvl_19/frame_8.png diff --git a/assets/dolphin/external/lvl_19/frame_9.png b/assets/dolphin/external/nsfw/lvl_19/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_19/frame_9.png rename to assets/dolphin/external/nsfw/lvl_19/frame_9.png diff --git a/assets/dolphin/external/lvl_19/meta.txt b/assets/dolphin/external/nsfw/lvl_19/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_19/meta.txt rename to assets/dolphin/external/nsfw/lvl_19/meta.txt diff --git a/assets/dolphin/external/lvl_2/frame_0.png b/assets/dolphin/external/nsfw/lvl_2/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_0.png rename to assets/dolphin/external/nsfw/lvl_2/frame_0.png diff --git a/assets/dolphin/external/lvl_2/frame_1.png b/assets/dolphin/external/nsfw/lvl_2/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_1.png rename to assets/dolphin/external/nsfw/lvl_2/frame_1.png diff --git a/assets/dolphin/external/lvl_2/frame_10.png b/assets/dolphin/external/nsfw/lvl_2/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_10.png rename to assets/dolphin/external/nsfw/lvl_2/frame_10.png diff --git a/assets/dolphin/external/lvl_2/frame_11.png b/assets/dolphin/external/nsfw/lvl_2/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_11.png rename to assets/dolphin/external/nsfw/lvl_2/frame_11.png diff --git a/assets/dolphin/external/lvl_2/frame_12.png b/assets/dolphin/external/nsfw/lvl_2/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_12.png rename to assets/dolphin/external/nsfw/lvl_2/frame_12.png diff --git a/assets/dolphin/external/lvl_2/frame_13.png b/assets/dolphin/external/nsfw/lvl_2/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_13.png rename to assets/dolphin/external/nsfw/lvl_2/frame_13.png diff --git a/assets/dolphin/external/lvl_2/frame_14.png b/assets/dolphin/external/nsfw/lvl_2/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_14.png rename to assets/dolphin/external/nsfw/lvl_2/frame_14.png diff --git a/assets/dolphin/external/lvl_2/frame_2.png b/assets/dolphin/external/nsfw/lvl_2/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_2.png rename to assets/dolphin/external/nsfw/lvl_2/frame_2.png diff --git a/assets/dolphin/external/lvl_2/frame_3.png b/assets/dolphin/external/nsfw/lvl_2/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_3.png rename to assets/dolphin/external/nsfw/lvl_2/frame_3.png diff --git a/assets/dolphin/external/lvl_2/frame_4.png b/assets/dolphin/external/nsfw/lvl_2/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_4.png rename to assets/dolphin/external/nsfw/lvl_2/frame_4.png diff --git a/assets/dolphin/external/lvl_2/frame_5.png b/assets/dolphin/external/nsfw/lvl_2/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_5.png rename to assets/dolphin/external/nsfw/lvl_2/frame_5.png diff --git a/assets/dolphin/external/lvl_2/frame_6.png b/assets/dolphin/external/nsfw/lvl_2/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_6.png rename to assets/dolphin/external/nsfw/lvl_2/frame_6.png diff --git a/assets/dolphin/external/lvl_2/frame_7.png b/assets/dolphin/external/nsfw/lvl_2/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_7.png rename to assets/dolphin/external/nsfw/lvl_2/frame_7.png diff --git a/assets/dolphin/external/lvl_2/frame_8.png b/assets/dolphin/external/nsfw/lvl_2/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_8.png rename to assets/dolphin/external/nsfw/lvl_2/frame_8.png diff --git a/assets/dolphin/external/lvl_2/frame_9.png b/assets/dolphin/external/nsfw/lvl_2/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_2/frame_9.png rename to assets/dolphin/external/nsfw/lvl_2/frame_9.png diff --git a/assets/dolphin/external/lvl_2/meta.txt b/assets/dolphin/external/nsfw/lvl_2/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_2/meta.txt rename to assets/dolphin/external/nsfw/lvl_2/meta.txt diff --git a/assets/dolphin/external/lvl_20/frame_0.png b/assets/dolphin/external/nsfw/lvl_20/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_0.png rename to assets/dolphin/external/nsfw/lvl_20/frame_0.png diff --git a/assets/dolphin/external/lvl_20/frame_1.png b/assets/dolphin/external/nsfw/lvl_20/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_1.png rename to assets/dolphin/external/nsfw/lvl_20/frame_1.png diff --git a/assets/dolphin/external/lvl_20/frame_10.png b/assets/dolphin/external/nsfw/lvl_20/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_10.png rename to assets/dolphin/external/nsfw/lvl_20/frame_10.png diff --git a/assets/dolphin/external/lvl_20/frame_11.png b/assets/dolphin/external/nsfw/lvl_20/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_11.png rename to assets/dolphin/external/nsfw/lvl_20/frame_11.png diff --git a/assets/dolphin/external/lvl_20/frame_12.png b/assets/dolphin/external/nsfw/lvl_20/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_12.png rename to assets/dolphin/external/nsfw/lvl_20/frame_12.png diff --git a/assets/dolphin/external/lvl_20/frame_13.png b/assets/dolphin/external/nsfw/lvl_20/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_13.png rename to assets/dolphin/external/nsfw/lvl_20/frame_13.png diff --git a/assets/dolphin/external/lvl_20/frame_2.png b/assets/dolphin/external/nsfw/lvl_20/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_2.png rename to assets/dolphin/external/nsfw/lvl_20/frame_2.png diff --git a/assets/dolphin/external/lvl_20/frame_3.png b/assets/dolphin/external/nsfw/lvl_20/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_3.png rename to assets/dolphin/external/nsfw/lvl_20/frame_3.png diff --git a/assets/dolphin/external/lvl_20/frame_4.png b/assets/dolphin/external/nsfw/lvl_20/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_4.png rename to assets/dolphin/external/nsfw/lvl_20/frame_4.png diff --git a/assets/dolphin/external/lvl_20/frame_5.png b/assets/dolphin/external/nsfw/lvl_20/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_5.png rename to assets/dolphin/external/nsfw/lvl_20/frame_5.png diff --git a/assets/dolphin/external/lvl_20/frame_6.png b/assets/dolphin/external/nsfw/lvl_20/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_6.png rename to assets/dolphin/external/nsfw/lvl_20/frame_6.png diff --git a/assets/dolphin/external/lvl_20/frame_7.png b/assets/dolphin/external/nsfw/lvl_20/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_7.png rename to assets/dolphin/external/nsfw/lvl_20/frame_7.png diff --git a/assets/dolphin/external/lvl_20/frame_8.png b/assets/dolphin/external/nsfw/lvl_20/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_8.png rename to assets/dolphin/external/nsfw/lvl_20/frame_8.png diff --git a/assets/dolphin/external/lvl_20/frame_9.png b/assets/dolphin/external/nsfw/lvl_20/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_20/frame_9.png rename to assets/dolphin/external/nsfw/lvl_20/frame_9.png diff --git a/assets/dolphin/external/lvl_20/meta.txt b/assets/dolphin/external/nsfw/lvl_20/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_20/meta.txt rename to assets/dolphin/external/nsfw/lvl_20/meta.txt diff --git a/assets/dolphin/external/lvl_21/frame_0.png b/assets/dolphin/external/nsfw/lvl_21/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_0.png rename to assets/dolphin/external/nsfw/lvl_21/frame_0.png diff --git a/assets/dolphin/external/lvl_21/frame_1.png b/assets/dolphin/external/nsfw/lvl_21/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_1.png rename to assets/dolphin/external/nsfw/lvl_21/frame_1.png diff --git a/assets/dolphin/external/lvl_21/frame_2.png b/assets/dolphin/external/nsfw/lvl_21/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_2.png rename to assets/dolphin/external/nsfw/lvl_21/frame_2.png diff --git a/assets/dolphin/external/lvl_21/frame_3.png b/assets/dolphin/external/nsfw/lvl_21/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_3.png rename to assets/dolphin/external/nsfw/lvl_21/frame_3.png diff --git a/assets/dolphin/external/lvl_21/frame_4.png b/assets/dolphin/external/nsfw/lvl_21/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_4.png rename to assets/dolphin/external/nsfw/lvl_21/frame_4.png diff --git a/assets/dolphin/external/lvl_21/frame_5.png b/assets/dolphin/external/nsfw/lvl_21/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_21/frame_5.png rename to assets/dolphin/external/nsfw/lvl_21/frame_5.png diff --git a/assets/dolphin/external/lvl_21/meta.txt b/assets/dolphin/external/nsfw/lvl_21/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_21/meta.txt rename to assets/dolphin/external/nsfw/lvl_21/meta.txt diff --git a/assets/dolphin/external/lvl_22/frame_0.png b/assets/dolphin/external/nsfw/lvl_22/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_0.png rename to assets/dolphin/external/nsfw/lvl_22/frame_0.png diff --git a/assets/dolphin/external/lvl_22/frame_1.png b/assets/dolphin/external/nsfw/lvl_22/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_1.png rename to assets/dolphin/external/nsfw/lvl_22/frame_1.png diff --git a/assets/dolphin/external/lvl_22/frame_10.png b/assets/dolphin/external/nsfw/lvl_22/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_10.png rename to assets/dolphin/external/nsfw/lvl_22/frame_10.png diff --git a/assets/dolphin/external/lvl_22/frame_11.png b/assets/dolphin/external/nsfw/lvl_22/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_11.png rename to assets/dolphin/external/nsfw/lvl_22/frame_11.png diff --git a/assets/dolphin/external/lvl_22/frame_12.png b/assets/dolphin/external/nsfw/lvl_22/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_12.png rename to assets/dolphin/external/nsfw/lvl_22/frame_12.png diff --git a/assets/dolphin/external/lvl_22/frame_13.png b/assets/dolphin/external/nsfw/lvl_22/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_13.png rename to assets/dolphin/external/nsfw/lvl_22/frame_13.png diff --git a/assets/dolphin/external/lvl_22/frame_14.png b/assets/dolphin/external/nsfw/lvl_22/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_14.png rename to assets/dolphin/external/nsfw/lvl_22/frame_14.png diff --git a/assets/dolphin/external/lvl_22/frame_15.png b/assets/dolphin/external/nsfw/lvl_22/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_15.png rename to assets/dolphin/external/nsfw/lvl_22/frame_15.png diff --git a/assets/dolphin/external/lvl_22/frame_16.png b/assets/dolphin/external/nsfw/lvl_22/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_16.png rename to assets/dolphin/external/nsfw/lvl_22/frame_16.png diff --git a/assets/dolphin/external/lvl_22/frame_17.png b/assets/dolphin/external/nsfw/lvl_22/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_17.png rename to assets/dolphin/external/nsfw/lvl_22/frame_17.png diff --git a/assets/dolphin/external/lvl_22/frame_18.png b/assets/dolphin/external/nsfw/lvl_22/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_18.png rename to assets/dolphin/external/nsfw/lvl_22/frame_18.png diff --git a/assets/dolphin/external/lvl_22/frame_19.png b/assets/dolphin/external/nsfw/lvl_22/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_19.png rename to assets/dolphin/external/nsfw/lvl_22/frame_19.png diff --git a/assets/dolphin/external/lvl_22/frame_2.png b/assets/dolphin/external/nsfw/lvl_22/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_2.png rename to assets/dolphin/external/nsfw/lvl_22/frame_2.png diff --git a/assets/dolphin/external/lvl_22/frame_20.png b/assets/dolphin/external/nsfw/lvl_22/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_20.png rename to assets/dolphin/external/nsfw/lvl_22/frame_20.png diff --git a/assets/dolphin/external/lvl_22/frame_21.png b/assets/dolphin/external/nsfw/lvl_22/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_21.png rename to assets/dolphin/external/nsfw/lvl_22/frame_21.png diff --git a/assets/dolphin/external/lvl_22/frame_22.png b/assets/dolphin/external/nsfw/lvl_22/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_22.png rename to assets/dolphin/external/nsfw/lvl_22/frame_22.png diff --git a/assets/dolphin/external/lvl_22/frame_23.png b/assets/dolphin/external/nsfw/lvl_22/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_23.png rename to assets/dolphin/external/nsfw/lvl_22/frame_23.png diff --git a/assets/dolphin/external/lvl_22/frame_24.png b/assets/dolphin/external/nsfw/lvl_22/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_24.png rename to assets/dolphin/external/nsfw/lvl_22/frame_24.png diff --git a/assets/dolphin/external/lvl_22/frame_25.png b/assets/dolphin/external/nsfw/lvl_22/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_25.png rename to assets/dolphin/external/nsfw/lvl_22/frame_25.png diff --git a/assets/dolphin/external/lvl_22/frame_26.png b/assets/dolphin/external/nsfw/lvl_22/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_26.png rename to assets/dolphin/external/nsfw/lvl_22/frame_26.png diff --git a/assets/dolphin/external/lvl_22/frame_27.png b/assets/dolphin/external/nsfw/lvl_22/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_27.png rename to assets/dolphin/external/nsfw/lvl_22/frame_27.png diff --git a/assets/dolphin/external/lvl_22/frame_28.png b/assets/dolphin/external/nsfw/lvl_22/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_28.png rename to assets/dolphin/external/nsfw/lvl_22/frame_28.png diff --git a/assets/dolphin/external/lvl_22/frame_29.png b/assets/dolphin/external/nsfw/lvl_22/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_29.png rename to assets/dolphin/external/nsfw/lvl_22/frame_29.png diff --git a/assets/dolphin/external/lvl_22/frame_3.png b/assets/dolphin/external/nsfw/lvl_22/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_3.png rename to assets/dolphin/external/nsfw/lvl_22/frame_3.png diff --git a/assets/dolphin/external/lvl_22/frame_30.png b/assets/dolphin/external/nsfw/lvl_22/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_30.png rename to assets/dolphin/external/nsfw/lvl_22/frame_30.png diff --git a/assets/dolphin/external/lvl_22/frame_31.png b/assets/dolphin/external/nsfw/lvl_22/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_31.png rename to assets/dolphin/external/nsfw/lvl_22/frame_31.png diff --git a/assets/dolphin/external/lvl_22/frame_32.png b/assets/dolphin/external/nsfw/lvl_22/frame_32.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_32.png rename to assets/dolphin/external/nsfw/lvl_22/frame_32.png diff --git a/assets/dolphin/external/lvl_22/frame_33.png b/assets/dolphin/external/nsfw/lvl_22/frame_33.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_33.png rename to assets/dolphin/external/nsfw/lvl_22/frame_33.png diff --git a/assets/dolphin/external/lvl_22/frame_34.png b/assets/dolphin/external/nsfw/lvl_22/frame_34.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_34.png rename to assets/dolphin/external/nsfw/lvl_22/frame_34.png diff --git a/assets/dolphin/external/lvl_22/frame_35.png b/assets/dolphin/external/nsfw/lvl_22/frame_35.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_35.png rename to assets/dolphin/external/nsfw/lvl_22/frame_35.png diff --git a/assets/dolphin/external/lvl_22/frame_36.png b/assets/dolphin/external/nsfw/lvl_22/frame_36.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_36.png rename to assets/dolphin/external/nsfw/lvl_22/frame_36.png diff --git a/assets/dolphin/external/lvl_22/frame_37.png b/assets/dolphin/external/nsfw/lvl_22/frame_37.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_37.png rename to assets/dolphin/external/nsfw/lvl_22/frame_37.png diff --git a/assets/dolphin/external/lvl_22/frame_38.png b/assets/dolphin/external/nsfw/lvl_22/frame_38.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_38.png rename to assets/dolphin/external/nsfw/lvl_22/frame_38.png diff --git a/assets/dolphin/external/lvl_22/frame_39.png b/assets/dolphin/external/nsfw/lvl_22/frame_39.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_39.png rename to assets/dolphin/external/nsfw/lvl_22/frame_39.png diff --git a/assets/dolphin/external/lvl_22/frame_4.png b/assets/dolphin/external/nsfw/lvl_22/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_4.png rename to assets/dolphin/external/nsfw/lvl_22/frame_4.png diff --git a/assets/dolphin/external/lvl_22/frame_40.png b/assets/dolphin/external/nsfw/lvl_22/frame_40.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_40.png rename to assets/dolphin/external/nsfw/lvl_22/frame_40.png diff --git a/assets/dolphin/external/lvl_22/frame_41.png b/assets/dolphin/external/nsfw/lvl_22/frame_41.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_41.png rename to assets/dolphin/external/nsfw/lvl_22/frame_41.png diff --git a/assets/dolphin/external/lvl_22/frame_42.png b/assets/dolphin/external/nsfw/lvl_22/frame_42.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_42.png rename to assets/dolphin/external/nsfw/lvl_22/frame_42.png diff --git a/assets/dolphin/external/lvl_22/frame_43.png b/assets/dolphin/external/nsfw/lvl_22/frame_43.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_43.png rename to assets/dolphin/external/nsfw/lvl_22/frame_43.png diff --git a/assets/dolphin/external/lvl_22/frame_44.png b/assets/dolphin/external/nsfw/lvl_22/frame_44.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_44.png rename to assets/dolphin/external/nsfw/lvl_22/frame_44.png diff --git a/assets/dolphin/external/lvl_22/frame_45.png b/assets/dolphin/external/nsfw/lvl_22/frame_45.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_45.png rename to assets/dolphin/external/nsfw/lvl_22/frame_45.png diff --git a/assets/dolphin/external/lvl_22/frame_46.png b/assets/dolphin/external/nsfw/lvl_22/frame_46.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_46.png rename to assets/dolphin/external/nsfw/lvl_22/frame_46.png diff --git a/assets/dolphin/external/lvl_22/frame_47.png b/assets/dolphin/external/nsfw/lvl_22/frame_47.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_47.png rename to assets/dolphin/external/nsfw/lvl_22/frame_47.png diff --git a/assets/dolphin/external/lvl_22/frame_48.png b/assets/dolphin/external/nsfw/lvl_22/frame_48.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_48.png rename to assets/dolphin/external/nsfw/lvl_22/frame_48.png diff --git a/assets/dolphin/external/lvl_22/frame_49.png b/assets/dolphin/external/nsfw/lvl_22/frame_49.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_49.png rename to assets/dolphin/external/nsfw/lvl_22/frame_49.png diff --git a/assets/dolphin/external/lvl_22/frame_5.png b/assets/dolphin/external/nsfw/lvl_22/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_5.png rename to assets/dolphin/external/nsfw/lvl_22/frame_5.png diff --git a/assets/dolphin/external/lvl_22/frame_50.png b/assets/dolphin/external/nsfw/lvl_22/frame_50.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_50.png rename to assets/dolphin/external/nsfw/lvl_22/frame_50.png diff --git a/assets/dolphin/external/lvl_22/frame_51.png b/assets/dolphin/external/nsfw/lvl_22/frame_51.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_51.png rename to assets/dolphin/external/nsfw/lvl_22/frame_51.png diff --git a/assets/dolphin/external/lvl_22/frame_52.png b/assets/dolphin/external/nsfw/lvl_22/frame_52.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_52.png rename to assets/dolphin/external/nsfw/lvl_22/frame_52.png diff --git a/assets/dolphin/external/lvl_22/frame_53.png b/assets/dolphin/external/nsfw/lvl_22/frame_53.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_53.png rename to assets/dolphin/external/nsfw/lvl_22/frame_53.png diff --git a/assets/dolphin/external/lvl_22/frame_54.png b/assets/dolphin/external/nsfw/lvl_22/frame_54.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_54.png rename to assets/dolphin/external/nsfw/lvl_22/frame_54.png diff --git a/assets/dolphin/external/lvl_22/frame_55.png b/assets/dolphin/external/nsfw/lvl_22/frame_55.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_55.png rename to assets/dolphin/external/nsfw/lvl_22/frame_55.png diff --git a/assets/dolphin/external/lvl_22/frame_56.png b/assets/dolphin/external/nsfw/lvl_22/frame_56.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_56.png rename to assets/dolphin/external/nsfw/lvl_22/frame_56.png diff --git a/assets/dolphin/external/lvl_22/frame_57.png b/assets/dolphin/external/nsfw/lvl_22/frame_57.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_57.png rename to assets/dolphin/external/nsfw/lvl_22/frame_57.png diff --git a/assets/dolphin/external/lvl_22/frame_58.png b/assets/dolphin/external/nsfw/lvl_22/frame_58.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_58.png rename to assets/dolphin/external/nsfw/lvl_22/frame_58.png diff --git a/assets/dolphin/external/lvl_22/frame_59.png b/assets/dolphin/external/nsfw/lvl_22/frame_59.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_59.png rename to assets/dolphin/external/nsfw/lvl_22/frame_59.png diff --git a/assets/dolphin/external/lvl_22/frame_6.png b/assets/dolphin/external/nsfw/lvl_22/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_6.png rename to assets/dolphin/external/nsfw/lvl_22/frame_6.png diff --git a/assets/dolphin/external/lvl_22/frame_7.png b/assets/dolphin/external/nsfw/lvl_22/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_7.png rename to assets/dolphin/external/nsfw/lvl_22/frame_7.png diff --git a/assets/dolphin/external/lvl_22/frame_8.png b/assets/dolphin/external/nsfw/lvl_22/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_8.png rename to assets/dolphin/external/nsfw/lvl_22/frame_8.png diff --git a/assets/dolphin/external/lvl_22/frame_9.png b/assets/dolphin/external/nsfw/lvl_22/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_22/frame_9.png rename to assets/dolphin/external/nsfw/lvl_22/frame_9.png diff --git a/assets/dolphin/external/lvl_22/meta.txt b/assets/dolphin/external/nsfw/lvl_22/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_22/meta.txt rename to assets/dolphin/external/nsfw/lvl_22/meta.txt diff --git a/assets/dolphin/external/lvl_23/frame_0.png b/assets/dolphin/external/nsfw/lvl_23/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_0.png rename to assets/dolphin/external/nsfw/lvl_23/frame_0.png diff --git a/assets/dolphin/external/lvl_23/frame_1.png b/assets/dolphin/external/nsfw/lvl_23/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_1.png rename to assets/dolphin/external/nsfw/lvl_23/frame_1.png diff --git a/assets/dolphin/external/lvl_23/frame_10.png b/assets/dolphin/external/nsfw/lvl_23/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_10.png rename to assets/dolphin/external/nsfw/lvl_23/frame_10.png diff --git a/assets/dolphin/external/lvl_23/frame_11.png b/assets/dolphin/external/nsfw/lvl_23/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_11.png rename to assets/dolphin/external/nsfw/lvl_23/frame_11.png diff --git a/assets/dolphin/external/lvl_23/frame_12.png b/assets/dolphin/external/nsfw/lvl_23/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_12.png rename to assets/dolphin/external/nsfw/lvl_23/frame_12.png diff --git a/assets/dolphin/external/lvl_23/frame_13.png b/assets/dolphin/external/nsfw/lvl_23/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_13.png rename to assets/dolphin/external/nsfw/lvl_23/frame_13.png diff --git a/assets/dolphin/external/lvl_23/frame_14.png b/assets/dolphin/external/nsfw/lvl_23/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_14.png rename to assets/dolphin/external/nsfw/lvl_23/frame_14.png diff --git a/assets/dolphin/external/lvl_23/frame_15.png b/assets/dolphin/external/nsfw/lvl_23/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_15.png rename to assets/dolphin/external/nsfw/lvl_23/frame_15.png diff --git a/assets/dolphin/external/lvl_23/frame_16.png b/assets/dolphin/external/nsfw/lvl_23/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_16.png rename to assets/dolphin/external/nsfw/lvl_23/frame_16.png diff --git a/assets/dolphin/external/lvl_23/frame_2.png b/assets/dolphin/external/nsfw/lvl_23/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_2.png rename to assets/dolphin/external/nsfw/lvl_23/frame_2.png diff --git a/assets/dolphin/external/lvl_23/frame_3.png b/assets/dolphin/external/nsfw/lvl_23/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_3.png rename to assets/dolphin/external/nsfw/lvl_23/frame_3.png diff --git a/assets/dolphin/external/lvl_23/frame_4.png b/assets/dolphin/external/nsfw/lvl_23/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_4.png rename to assets/dolphin/external/nsfw/lvl_23/frame_4.png diff --git a/assets/dolphin/external/lvl_23/frame_5.png b/assets/dolphin/external/nsfw/lvl_23/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_5.png rename to assets/dolphin/external/nsfw/lvl_23/frame_5.png diff --git a/assets/dolphin/external/lvl_23/frame_6.png b/assets/dolphin/external/nsfw/lvl_23/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_6.png rename to assets/dolphin/external/nsfw/lvl_23/frame_6.png diff --git a/assets/dolphin/external/lvl_23/frame_7.png b/assets/dolphin/external/nsfw/lvl_23/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_7.png rename to assets/dolphin/external/nsfw/lvl_23/frame_7.png diff --git a/assets/dolphin/external/lvl_23/frame_8.png b/assets/dolphin/external/nsfw/lvl_23/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_8.png rename to assets/dolphin/external/nsfw/lvl_23/frame_8.png diff --git a/assets/dolphin/external/lvl_23/frame_9.png b/assets/dolphin/external/nsfw/lvl_23/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_23/frame_9.png rename to assets/dolphin/external/nsfw/lvl_23/frame_9.png diff --git a/assets/dolphin/external/lvl_23/meta.txt b/assets/dolphin/external/nsfw/lvl_23/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_23/meta.txt rename to assets/dolphin/external/nsfw/lvl_23/meta.txt diff --git a/assets/dolphin/external/lvl_24/frame_0.png b/assets/dolphin/external/nsfw/lvl_24/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_0.png rename to assets/dolphin/external/nsfw/lvl_24/frame_0.png diff --git a/assets/dolphin/external/lvl_24/frame_1.png b/assets/dolphin/external/nsfw/lvl_24/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_1.png rename to assets/dolphin/external/nsfw/lvl_24/frame_1.png diff --git a/assets/dolphin/external/lvl_24/frame_10.png b/assets/dolphin/external/nsfw/lvl_24/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_10.png rename to assets/dolphin/external/nsfw/lvl_24/frame_10.png diff --git a/assets/dolphin/external/lvl_24/frame_11.png b/assets/dolphin/external/nsfw/lvl_24/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_11.png rename to assets/dolphin/external/nsfw/lvl_24/frame_11.png diff --git a/assets/dolphin/external/lvl_24/frame_12.png b/assets/dolphin/external/nsfw/lvl_24/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_12.png rename to assets/dolphin/external/nsfw/lvl_24/frame_12.png diff --git a/assets/dolphin/external/lvl_24/frame_13.png b/assets/dolphin/external/nsfw/lvl_24/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_13.png rename to assets/dolphin/external/nsfw/lvl_24/frame_13.png diff --git a/assets/dolphin/external/lvl_24/frame_14.png b/assets/dolphin/external/nsfw/lvl_24/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_14.png rename to assets/dolphin/external/nsfw/lvl_24/frame_14.png diff --git a/assets/dolphin/external/lvl_24/frame_15.png b/assets/dolphin/external/nsfw/lvl_24/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_15.png rename to assets/dolphin/external/nsfw/lvl_24/frame_15.png diff --git a/assets/dolphin/external/lvl_24/frame_16.png b/assets/dolphin/external/nsfw/lvl_24/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_16.png rename to assets/dolphin/external/nsfw/lvl_24/frame_16.png diff --git a/assets/dolphin/external/lvl_24/frame_17.png b/assets/dolphin/external/nsfw/lvl_24/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_17.png rename to assets/dolphin/external/nsfw/lvl_24/frame_17.png diff --git a/assets/dolphin/external/lvl_24/frame_18.png b/assets/dolphin/external/nsfw/lvl_24/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_18.png rename to assets/dolphin/external/nsfw/lvl_24/frame_18.png diff --git a/assets/dolphin/external/lvl_24/frame_19.png b/assets/dolphin/external/nsfw/lvl_24/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_19.png rename to assets/dolphin/external/nsfw/lvl_24/frame_19.png diff --git a/assets/dolphin/external/lvl_24/frame_2.png b/assets/dolphin/external/nsfw/lvl_24/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_2.png rename to assets/dolphin/external/nsfw/lvl_24/frame_2.png diff --git a/assets/dolphin/external/lvl_24/frame_20.png b/assets/dolphin/external/nsfw/lvl_24/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_20.png rename to assets/dolphin/external/nsfw/lvl_24/frame_20.png diff --git a/assets/dolphin/external/lvl_24/frame_21.png b/assets/dolphin/external/nsfw/lvl_24/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_21.png rename to assets/dolphin/external/nsfw/lvl_24/frame_21.png diff --git a/assets/dolphin/external/lvl_24/frame_22.png b/assets/dolphin/external/nsfw/lvl_24/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_22.png rename to assets/dolphin/external/nsfw/lvl_24/frame_22.png diff --git a/assets/dolphin/external/lvl_24/frame_23.png b/assets/dolphin/external/nsfw/lvl_24/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_23.png rename to assets/dolphin/external/nsfw/lvl_24/frame_23.png diff --git a/assets/dolphin/external/lvl_24/frame_24.png b/assets/dolphin/external/nsfw/lvl_24/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_24.png rename to assets/dolphin/external/nsfw/lvl_24/frame_24.png diff --git a/assets/dolphin/external/lvl_24/frame_25.png b/assets/dolphin/external/nsfw/lvl_24/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_25.png rename to assets/dolphin/external/nsfw/lvl_24/frame_25.png diff --git a/assets/dolphin/external/lvl_24/frame_26.png b/assets/dolphin/external/nsfw/lvl_24/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_26.png rename to assets/dolphin/external/nsfw/lvl_24/frame_26.png diff --git a/assets/dolphin/external/lvl_24/frame_27.png b/assets/dolphin/external/nsfw/lvl_24/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_27.png rename to assets/dolphin/external/nsfw/lvl_24/frame_27.png diff --git a/assets/dolphin/external/lvl_24/frame_28.png b/assets/dolphin/external/nsfw/lvl_24/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_28.png rename to assets/dolphin/external/nsfw/lvl_24/frame_28.png diff --git a/assets/dolphin/external/lvl_24/frame_29.png b/assets/dolphin/external/nsfw/lvl_24/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_29.png rename to assets/dolphin/external/nsfw/lvl_24/frame_29.png diff --git a/assets/dolphin/external/lvl_24/frame_3.png b/assets/dolphin/external/nsfw/lvl_24/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_3.png rename to assets/dolphin/external/nsfw/lvl_24/frame_3.png diff --git a/assets/dolphin/external/lvl_24/frame_4.png b/assets/dolphin/external/nsfw/lvl_24/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_4.png rename to assets/dolphin/external/nsfw/lvl_24/frame_4.png diff --git a/assets/dolphin/external/lvl_24/frame_5.png b/assets/dolphin/external/nsfw/lvl_24/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_5.png rename to assets/dolphin/external/nsfw/lvl_24/frame_5.png diff --git a/assets/dolphin/external/lvl_24/frame_6.png b/assets/dolphin/external/nsfw/lvl_24/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_6.png rename to assets/dolphin/external/nsfw/lvl_24/frame_6.png diff --git a/assets/dolphin/external/lvl_24/frame_7.png b/assets/dolphin/external/nsfw/lvl_24/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_7.png rename to assets/dolphin/external/nsfw/lvl_24/frame_7.png diff --git a/assets/dolphin/external/lvl_24/frame_8.png b/assets/dolphin/external/nsfw/lvl_24/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_8.png rename to assets/dolphin/external/nsfw/lvl_24/frame_8.png diff --git a/assets/dolphin/external/lvl_24/frame_9.png b/assets/dolphin/external/nsfw/lvl_24/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_24/frame_9.png rename to assets/dolphin/external/nsfw/lvl_24/frame_9.png diff --git a/assets/dolphin/external/lvl_24/meta.txt b/assets/dolphin/external/nsfw/lvl_24/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_24/meta.txt rename to assets/dolphin/external/nsfw/lvl_24/meta.txt diff --git a/assets/dolphin/external/lvl_25/frame_0.png b/assets/dolphin/external/nsfw/lvl_25/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_0.png rename to assets/dolphin/external/nsfw/lvl_25/frame_0.png diff --git a/assets/dolphin/external/lvl_25/frame_1.png b/assets/dolphin/external/nsfw/lvl_25/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_1.png rename to assets/dolphin/external/nsfw/lvl_25/frame_1.png diff --git a/assets/dolphin/external/lvl_25/frame_10.png b/assets/dolphin/external/nsfw/lvl_25/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_10.png rename to assets/dolphin/external/nsfw/lvl_25/frame_10.png diff --git a/assets/dolphin/external/lvl_25/frame_11.png b/assets/dolphin/external/nsfw/lvl_25/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_11.png rename to assets/dolphin/external/nsfw/lvl_25/frame_11.png diff --git a/assets/dolphin/external/lvl_25/frame_12.png b/assets/dolphin/external/nsfw/lvl_25/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_12.png rename to assets/dolphin/external/nsfw/lvl_25/frame_12.png diff --git a/assets/dolphin/external/lvl_25/frame_13.png b/assets/dolphin/external/nsfw/lvl_25/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_13.png rename to assets/dolphin/external/nsfw/lvl_25/frame_13.png diff --git a/assets/dolphin/external/lvl_25/frame_14.png b/assets/dolphin/external/nsfw/lvl_25/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_14.png rename to assets/dolphin/external/nsfw/lvl_25/frame_14.png diff --git a/assets/dolphin/external/lvl_25/frame_15.png b/assets/dolphin/external/nsfw/lvl_25/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_15.png rename to assets/dolphin/external/nsfw/lvl_25/frame_15.png diff --git a/assets/dolphin/external/lvl_25/frame_16.png b/assets/dolphin/external/nsfw/lvl_25/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_16.png rename to assets/dolphin/external/nsfw/lvl_25/frame_16.png diff --git a/assets/dolphin/external/lvl_25/frame_17.png b/assets/dolphin/external/nsfw/lvl_25/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_17.png rename to assets/dolphin/external/nsfw/lvl_25/frame_17.png diff --git a/assets/dolphin/external/lvl_25/frame_18.png b/assets/dolphin/external/nsfw/lvl_25/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_18.png rename to assets/dolphin/external/nsfw/lvl_25/frame_18.png diff --git a/assets/dolphin/external/lvl_25/frame_19.png b/assets/dolphin/external/nsfw/lvl_25/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_19.png rename to assets/dolphin/external/nsfw/lvl_25/frame_19.png diff --git a/assets/dolphin/external/lvl_25/frame_2.png b/assets/dolphin/external/nsfw/lvl_25/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_2.png rename to assets/dolphin/external/nsfw/lvl_25/frame_2.png diff --git a/assets/dolphin/external/lvl_25/frame_20.png b/assets/dolphin/external/nsfw/lvl_25/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_20.png rename to assets/dolphin/external/nsfw/lvl_25/frame_20.png diff --git a/assets/dolphin/external/lvl_25/frame_21.png b/assets/dolphin/external/nsfw/lvl_25/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_21.png rename to assets/dolphin/external/nsfw/lvl_25/frame_21.png diff --git a/assets/dolphin/external/lvl_25/frame_22.png b/assets/dolphin/external/nsfw/lvl_25/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_22.png rename to assets/dolphin/external/nsfw/lvl_25/frame_22.png diff --git a/assets/dolphin/external/lvl_25/frame_23.png b/assets/dolphin/external/nsfw/lvl_25/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_23.png rename to assets/dolphin/external/nsfw/lvl_25/frame_23.png diff --git a/assets/dolphin/external/lvl_25/frame_24.png b/assets/dolphin/external/nsfw/lvl_25/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_24.png rename to assets/dolphin/external/nsfw/lvl_25/frame_24.png diff --git a/assets/dolphin/external/lvl_25/frame_25.png b/assets/dolphin/external/nsfw/lvl_25/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_25.png rename to assets/dolphin/external/nsfw/lvl_25/frame_25.png diff --git a/assets/dolphin/external/lvl_25/frame_26.png b/assets/dolphin/external/nsfw/lvl_25/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_26.png rename to assets/dolphin/external/nsfw/lvl_25/frame_26.png diff --git a/assets/dolphin/external/lvl_25/frame_27.png b/assets/dolphin/external/nsfw/lvl_25/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_27.png rename to assets/dolphin/external/nsfw/lvl_25/frame_27.png diff --git a/assets/dolphin/external/lvl_25/frame_28.png b/assets/dolphin/external/nsfw/lvl_25/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_28.png rename to assets/dolphin/external/nsfw/lvl_25/frame_28.png diff --git a/assets/dolphin/external/lvl_25/frame_29.png b/assets/dolphin/external/nsfw/lvl_25/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_29.png rename to assets/dolphin/external/nsfw/lvl_25/frame_29.png diff --git a/assets/dolphin/external/lvl_25/frame_3.png b/assets/dolphin/external/nsfw/lvl_25/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_3.png rename to assets/dolphin/external/nsfw/lvl_25/frame_3.png diff --git a/assets/dolphin/external/lvl_25/frame_30.png b/assets/dolphin/external/nsfw/lvl_25/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_30.png rename to assets/dolphin/external/nsfw/lvl_25/frame_30.png diff --git a/assets/dolphin/external/lvl_25/frame_31.png b/assets/dolphin/external/nsfw/lvl_25/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_31.png rename to assets/dolphin/external/nsfw/lvl_25/frame_31.png diff --git a/assets/dolphin/external/lvl_25/frame_32.png b/assets/dolphin/external/nsfw/lvl_25/frame_32.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_32.png rename to assets/dolphin/external/nsfw/lvl_25/frame_32.png diff --git a/assets/dolphin/external/lvl_25/frame_33.png b/assets/dolphin/external/nsfw/lvl_25/frame_33.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_33.png rename to assets/dolphin/external/nsfw/lvl_25/frame_33.png diff --git a/assets/dolphin/external/lvl_25/frame_34.png b/assets/dolphin/external/nsfw/lvl_25/frame_34.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_34.png rename to assets/dolphin/external/nsfw/lvl_25/frame_34.png diff --git a/assets/dolphin/external/lvl_25/frame_35.png b/assets/dolphin/external/nsfw/lvl_25/frame_35.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_35.png rename to assets/dolphin/external/nsfw/lvl_25/frame_35.png diff --git a/assets/dolphin/external/lvl_25/frame_4.png b/assets/dolphin/external/nsfw/lvl_25/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_4.png rename to assets/dolphin/external/nsfw/lvl_25/frame_4.png diff --git a/assets/dolphin/external/lvl_25/frame_5.png b/assets/dolphin/external/nsfw/lvl_25/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_5.png rename to assets/dolphin/external/nsfw/lvl_25/frame_5.png diff --git a/assets/dolphin/external/lvl_25/frame_6.png b/assets/dolphin/external/nsfw/lvl_25/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_6.png rename to assets/dolphin/external/nsfw/lvl_25/frame_6.png diff --git a/assets/dolphin/external/lvl_25/frame_7.png b/assets/dolphin/external/nsfw/lvl_25/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_7.png rename to assets/dolphin/external/nsfw/lvl_25/frame_7.png diff --git a/assets/dolphin/external/lvl_25/frame_8.png b/assets/dolphin/external/nsfw/lvl_25/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_8.png rename to assets/dolphin/external/nsfw/lvl_25/frame_8.png diff --git a/assets/dolphin/external/lvl_25/frame_9.png b/assets/dolphin/external/nsfw/lvl_25/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_25/frame_9.png rename to assets/dolphin/external/nsfw/lvl_25/frame_9.png diff --git a/assets/dolphin/external/lvl_25/meta.txt b/assets/dolphin/external/nsfw/lvl_25/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_25/meta.txt rename to assets/dolphin/external/nsfw/lvl_25/meta.txt diff --git a/assets/dolphin/external/lvl_26/frame_0.png b/assets/dolphin/external/nsfw/lvl_26/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_0.png rename to assets/dolphin/external/nsfw/lvl_26/frame_0.png diff --git a/assets/dolphin/external/lvl_26/frame_1.png b/assets/dolphin/external/nsfw/lvl_26/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_1.png rename to assets/dolphin/external/nsfw/lvl_26/frame_1.png diff --git a/assets/dolphin/external/lvl_26/frame_10.png b/assets/dolphin/external/nsfw/lvl_26/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_10.png rename to assets/dolphin/external/nsfw/lvl_26/frame_10.png diff --git a/assets/dolphin/external/lvl_26/frame_11.png b/assets/dolphin/external/nsfw/lvl_26/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_11.png rename to assets/dolphin/external/nsfw/lvl_26/frame_11.png diff --git a/assets/dolphin/external/lvl_26/frame_2.png b/assets/dolphin/external/nsfw/lvl_26/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_2.png rename to assets/dolphin/external/nsfw/lvl_26/frame_2.png diff --git a/assets/dolphin/external/lvl_26/frame_3.png b/assets/dolphin/external/nsfw/lvl_26/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_3.png rename to assets/dolphin/external/nsfw/lvl_26/frame_3.png diff --git a/assets/dolphin/external/lvl_26/frame_4.png b/assets/dolphin/external/nsfw/lvl_26/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_4.png rename to assets/dolphin/external/nsfw/lvl_26/frame_4.png diff --git a/assets/dolphin/external/lvl_26/frame_5.png b/assets/dolphin/external/nsfw/lvl_26/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_5.png rename to assets/dolphin/external/nsfw/lvl_26/frame_5.png diff --git a/assets/dolphin/external/lvl_26/frame_6.png b/assets/dolphin/external/nsfw/lvl_26/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_6.png rename to assets/dolphin/external/nsfw/lvl_26/frame_6.png diff --git a/assets/dolphin/external/lvl_26/frame_7.png b/assets/dolphin/external/nsfw/lvl_26/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_7.png rename to assets/dolphin/external/nsfw/lvl_26/frame_7.png diff --git a/assets/dolphin/external/lvl_26/frame_8.png b/assets/dolphin/external/nsfw/lvl_26/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_8.png rename to assets/dolphin/external/nsfw/lvl_26/frame_8.png diff --git a/assets/dolphin/external/lvl_26/frame_9.png b/assets/dolphin/external/nsfw/lvl_26/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_26/frame_9.png rename to assets/dolphin/external/nsfw/lvl_26/frame_9.png diff --git a/assets/dolphin/external/lvl_26/meta.txt b/assets/dolphin/external/nsfw/lvl_26/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_26/meta.txt rename to assets/dolphin/external/nsfw/lvl_26/meta.txt diff --git a/assets/dolphin/external/lvl_27/frame_0.png b/assets/dolphin/external/nsfw/lvl_27/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_0.png rename to assets/dolphin/external/nsfw/lvl_27/frame_0.png diff --git a/assets/dolphin/external/lvl_27/frame_1.png b/assets/dolphin/external/nsfw/lvl_27/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_1.png rename to assets/dolphin/external/nsfw/lvl_27/frame_1.png diff --git a/assets/dolphin/external/lvl_27/frame_10.png b/assets/dolphin/external/nsfw/lvl_27/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_10.png rename to assets/dolphin/external/nsfw/lvl_27/frame_10.png diff --git a/assets/dolphin/external/lvl_27/frame_11.png b/assets/dolphin/external/nsfw/lvl_27/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_11.png rename to assets/dolphin/external/nsfw/lvl_27/frame_11.png diff --git a/assets/dolphin/external/lvl_27/frame_12.png b/assets/dolphin/external/nsfw/lvl_27/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_12.png rename to assets/dolphin/external/nsfw/lvl_27/frame_12.png diff --git a/assets/dolphin/external/lvl_27/frame_13.png b/assets/dolphin/external/nsfw/lvl_27/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_13.png rename to assets/dolphin/external/nsfw/lvl_27/frame_13.png diff --git a/assets/dolphin/external/lvl_27/frame_14.png b/assets/dolphin/external/nsfw/lvl_27/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_14.png rename to assets/dolphin/external/nsfw/lvl_27/frame_14.png diff --git a/assets/dolphin/external/lvl_27/frame_15.png b/assets/dolphin/external/nsfw/lvl_27/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_15.png rename to assets/dolphin/external/nsfw/lvl_27/frame_15.png diff --git a/assets/dolphin/external/lvl_27/frame_16.png b/assets/dolphin/external/nsfw/lvl_27/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_16.png rename to assets/dolphin/external/nsfw/lvl_27/frame_16.png diff --git a/assets/dolphin/external/lvl_27/frame_17.png b/assets/dolphin/external/nsfw/lvl_27/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_17.png rename to assets/dolphin/external/nsfw/lvl_27/frame_17.png diff --git a/assets/dolphin/external/lvl_27/frame_18.png b/assets/dolphin/external/nsfw/lvl_27/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_18.png rename to assets/dolphin/external/nsfw/lvl_27/frame_18.png diff --git a/assets/dolphin/external/lvl_27/frame_19.png b/assets/dolphin/external/nsfw/lvl_27/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_19.png rename to assets/dolphin/external/nsfw/lvl_27/frame_19.png diff --git a/assets/dolphin/external/lvl_27/frame_2.png b/assets/dolphin/external/nsfw/lvl_27/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_2.png rename to assets/dolphin/external/nsfw/lvl_27/frame_2.png diff --git a/assets/dolphin/external/lvl_27/frame_20.png b/assets/dolphin/external/nsfw/lvl_27/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_20.png rename to assets/dolphin/external/nsfw/lvl_27/frame_20.png diff --git a/assets/dolphin/external/lvl_27/frame_21.png b/assets/dolphin/external/nsfw/lvl_27/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_21.png rename to assets/dolphin/external/nsfw/lvl_27/frame_21.png diff --git a/assets/dolphin/external/lvl_27/frame_3.png b/assets/dolphin/external/nsfw/lvl_27/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_3.png rename to assets/dolphin/external/nsfw/lvl_27/frame_3.png diff --git a/assets/dolphin/external/lvl_27/frame_4.png b/assets/dolphin/external/nsfw/lvl_27/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_4.png rename to assets/dolphin/external/nsfw/lvl_27/frame_4.png diff --git a/assets/dolphin/external/lvl_27/frame_5.png b/assets/dolphin/external/nsfw/lvl_27/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_5.png rename to assets/dolphin/external/nsfw/lvl_27/frame_5.png diff --git a/assets/dolphin/external/lvl_27/frame_6.png b/assets/dolphin/external/nsfw/lvl_27/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_6.png rename to assets/dolphin/external/nsfw/lvl_27/frame_6.png diff --git a/assets/dolphin/external/lvl_27/frame_7.png b/assets/dolphin/external/nsfw/lvl_27/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_7.png rename to assets/dolphin/external/nsfw/lvl_27/frame_7.png diff --git a/assets/dolphin/external/lvl_27/frame_8.png b/assets/dolphin/external/nsfw/lvl_27/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_8.png rename to assets/dolphin/external/nsfw/lvl_27/frame_8.png diff --git a/assets/dolphin/external/lvl_27/frame_9.png b/assets/dolphin/external/nsfw/lvl_27/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_27/frame_9.png rename to assets/dolphin/external/nsfw/lvl_27/frame_9.png diff --git a/assets/dolphin/external/lvl_27/meta.txt b/assets/dolphin/external/nsfw/lvl_27/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_27/meta.txt rename to assets/dolphin/external/nsfw/lvl_27/meta.txt diff --git a/assets/dolphin/external/lvl_28/frame_0.png b/assets/dolphin/external/nsfw/lvl_28/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_0.png rename to assets/dolphin/external/nsfw/lvl_28/frame_0.png diff --git a/assets/dolphin/external/lvl_28/frame_1.png b/assets/dolphin/external/nsfw/lvl_28/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_1.png rename to assets/dolphin/external/nsfw/lvl_28/frame_1.png diff --git a/assets/dolphin/external/lvl_28/frame_2.png b/assets/dolphin/external/nsfw/lvl_28/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_2.png rename to assets/dolphin/external/nsfw/lvl_28/frame_2.png diff --git a/assets/dolphin/external/lvl_28/frame_3.png b/assets/dolphin/external/nsfw/lvl_28/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_3.png rename to assets/dolphin/external/nsfw/lvl_28/frame_3.png diff --git a/assets/dolphin/external/lvl_28/frame_4.png b/assets/dolphin/external/nsfw/lvl_28/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_4.png rename to assets/dolphin/external/nsfw/lvl_28/frame_4.png diff --git a/assets/dolphin/external/lvl_28/frame_5.png b/assets/dolphin/external/nsfw/lvl_28/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_28/frame_5.png rename to assets/dolphin/external/nsfw/lvl_28/frame_5.png diff --git a/assets/dolphin/external/lvl_28/meta.txt b/assets/dolphin/external/nsfw/lvl_28/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_28/meta.txt rename to assets/dolphin/external/nsfw/lvl_28/meta.txt diff --git a/assets/dolphin/external/lvl_29/frame_0.png b/assets/dolphin/external/nsfw/lvl_29/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_0.png rename to assets/dolphin/external/nsfw/lvl_29/frame_0.png diff --git a/assets/dolphin/external/lvl_29/frame_1.png b/assets/dolphin/external/nsfw/lvl_29/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_1.png rename to assets/dolphin/external/nsfw/lvl_29/frame_1.png diff --git a/assets/dolphin/external/lvl_29/frame_10.png b/assets/dolphin/external/nsfw/lvl_29/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_10.png rename to assets/dolphin/external/nsfw/lvl_29/frame_10.png diff --git a/assets/dolphin/external/lvl_29/frame_11.png b/assets/dolphin/external/nsfw/lvl_29/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_11.png rename to assets/dolphin/external/nsfw/lvl_29/frame_11.png diff --git a/assets/dolphin/external/lvl_29/frame_12.png b/assets/dolphin/external/nsfw/lvl_29/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_12.png rename to assets/dolphin/external/nsfw/lvl_29/frame_12.png diff --git a/assets/dolphin/external/lvl_29/frame_13.png b/assets/dolphin/external/nsfw/lvl_29/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_13.png rename to assets/dolphin/external/nsfw/lvl_29/frame_13.png diff --git a/assets/dolphin/external/lvl_29/frame_14.png b/assets/dolphin/external/nsfw/lvl_29/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_14.png rename to assets/dolphin/external/nsfw/lvl_29/frame_14.png diff --git a/assets/dolphin/external/lvl_29/frame_15.png b/assets/dolphin/external/nsfw/lvl_29/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_15.png rename to assets/dolphin/external/nsfw/lvl_29/frame_15.png diff --git a/assets/dolphin/external/lvl_29/frame_16.png b/assets/dolphin/external/nsfw/lvl_29/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_16.png rename to assets/dolphin/external/nsfw/lvl_29/frame_16.png diff --git a/assets/dolphin/external/lvl_29/frame_17.png b/assets/dolphin/external/nsfw/lvl_29/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_17.png rename to assets/dolphin/external/nsfw/lvl_29/frame_17.png diff --git a/assets/dolphin/external/lvl_29/frame_18.png b/assets/dolphin/external/nsfw/lvl_29/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_18.png rename to assets/dolphin/external/nsfw/lvl_29/frame_18.png diff --git a/assets/dolphin/external/lvl_29/frame_19.png b/assets/dolphin/external/nsfw/lvl_29/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_19.png rename to assets/dolphin/external/nsfw/lvl_29/frame_19.png diff --git a/assets/dolphin/external/lvl_29/frame_2.png b/assets/dolphin/external/nsfw/lvl_29/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_2.png rename to assets/dolphin/external/nsfw/lvl_29/frame_2.png diff --git a/assets/dolphin/external/lvl_29/frame_20.png b/assets/dolphin/external/nsfw/lvl_29/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_20.png rename to assets/dolphin/external/nsfw/lvl_29/frame_20.png diff --git a/assets/dolphin/external/lvl_29/frame_21.png b/assets/dolphin/external/nsfw/lvl_29/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_21.png rename to assets/dolphin/external/nsfw/lvl_29/frame_21.png diff --git a/assets/dolphin/external/lvl_29/frame_22.png b/assets/dolphin/external/nsfw/lvl_29/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_22.png rename to assets/dolphin/external/nsfw/lvl_29/frame_22.png diff --git a/assets/dolphin/external/lvl_29/frame_23.png b/assets/dolphin/external/nsfw/lvl_29/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_23.png rename to assets/dolphin/external/nsfw/lvl_29/frame_23.png diff --git a/assets/dolphin/external/lvl_29/frame_24.png b/assets/dolphin/external/nsfw/lvl_29/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_24.png rename to assets/dolphin/external/nsfw/lvl_29/frame_24.png diff --git a/assets/dolphin/external/lvl_29/frame_25.png b/assets/dolphin/external/nsfw/lvl_29/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_25.png rename to assets/dolphin/external/nsfw/lvl_29/frame_25.png diff --git a/assets/dolphin/external/lvl_29/frame_26.png b/assets/dolphin/external/nsfw/lvl_29/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_26.png rename to assets/dolphin/external/nsfw/lvl_29/frame_26.png diff --git a/assets/dolphin/external/lvl_29/frame_27.png b/assets/dolphin/external/nsfw/lvl_29/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_27.png rename to assets/dolphin/external/nsfw/lvl_29/frame_27.png diff --git a/assets/dolphin/external/lvl_29/frame_28.png b/assets/dolphin/external/nsfw/lvl_29/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_28.png rename to assets/dolphin/external/nsfw/lvl_29/frame_28.png diff --git a/assets/dolphin/external/lvl_29/frame_29.png b/assets/dolphin/external/nsfw/lvl_29/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_29.png rename to assets/dolphin/external/nsfw/lvl_29/frame_29.png diff --git a/assets/dolphin/external/lvl_29/frame_3.png b/assets/dolphin/external/nsfw/lvl_29/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_3.png rename to assets/dolphin/external/nsfw/lvl_29/frame_3.png diff --git a/assets/dolphin/external/lvl_29/frame_30.png b/assets/dolphin/external/nsfw/lvl_29/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_30.png rename to assets/dolphin/external/nsfw/lvl_29/frame_30.png diff --git a/assets/dolphin/external/lvl_29/frame_31.png b/assets/dolphin/external/nsfw/lvl_29/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_31.png rename to assets/dolphin/external/nsfw/lvl_29/frame_31.png diff --git a/assets/dolphin/external/lvl_29/frame_32.png b/assets/dolphin/external/nsfw/lvl_29/frame_32.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_32.png rename to assets/dolphin/external/nsfw/lvl_29/frame_32.png diff --git a/assets/dolphin/external/lvl_29/frame_33.png b/assets/dolphin/external/nsfw/lvl_29/frame_33.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_33.png rename to assets/dolphin/external/nsfw/lvl_29/frame_33.png diff --git a/assets/dolphin/external/lvl_29/frame_34.png b/assets/dolphin/external/nsfw/lvl_29/frame_34.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_34.png rename to assets/dolphin/external/nsfw/lvl_29/frame_34.png diff --git a/assets/dolphin/external/lvl_29/frame_35.png b/assets/dolphin/external/nsfw/lvl_29/frame_35.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_35.png rename to assets/dolphin/external/nsfw/lvl_29/frame_35.png diff --git a/assets/dolphin/external/lvl_29/frame_36.png b/assets/dolphin/external/nsfw/lvl_29/frame_36.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_36.png rename to assets/dolphin/external/nsfw/lvl_29/frame_36.png diff --git a/assets/dolphin/external/lvl_29/frame_37.png b/assets/dolphin/external/nsfw/lvl_29/frame_37.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_37.png rename to assets/dolphin/external/nsfw/lvl_29/frame_37.png diff --git a/assets/dolphin/external/lvl_29/frame_38.png b/assets/dolphin/external/nsfw/lvl_29/frame_38.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_38.png rename to assets/dolphin/external/nsfw/lvl_29/frame_38.png diff --git a/assets/dolphin/external/lvl_29/frame_39.png b/assets/dolphin/external/nsfw/lvl_29/frame_39.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_39.png rename to assets/dolphin/external/nsfw/lvl_29/frame_39.png diff --git a/assets/dolphin/external/lvl_29/frame_4.png b/assets/dolphin/external/nsfw/lvl_29/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_4.png rename to assets/dolphin/external/nsfw/lvl_29/frame_4.png diff --git a/assets/dolphin/external/lvl_29/frame_40.png b/assets/dolphin/external/nsfw/lvl_29/frame_40.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_40.png rename to assets/dolphin/external/nsfw/lvl_29/frame_40.png diff --git a/assets/dolphin/external/lvl_29/frame_41.png b/assets/dolphin/external/nsfw/lvl_29/frame_41.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_41.png rename to assets/dolphin/external/nsfw/lvl_29/frame_41.png diff --git a/assets/dolphin/external/lvl_29/frame_42.png b/assets/dolphin/external/nsfw/lvl_29/frame_42.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_42.png rename to assets/dolphin/external/nsfw/lvl_29/frame_42.png diff --git a/assets/dolphin/external/lvl_29/frame_43.png b/assets/dolphin/external/nsfw/lvl_29/frame_43.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_43.png rename to assets/dolphin/external/nsfw/lvl_29/frame_43.png diff --git a/assets/dolphin/external/lvl_29/frame_44.png b/assets/dolphin/external/nsfw/lvl_29/frame_44.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_44.png rename to assets/dolphin/external/nsfw/lvl_29/frame_44.png diff --git a/assets/dolphin/external/lvl_29/frame_45.png b/assets/dolphin/external/nsfw/lvl_29/frame_45.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_45.png rename to assets/dolphin/external/nsfw/lvl_29/frame_45.png diff --git a/assets/dolphin/external/lvl_29/frame_46.png b/assets/dolphin/external/nsfw/lvl_29/frame_46.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_46.png rename to assets/dolphin/external/nsfw/lvl_29/frame_46.png diff --git a/assets/dolphin/external/lvl_29/frame_47.png b/assets/dolphin/external/nsfw/lvl_29/frame_47.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_47.png rename to assets/dolphin/external/nsfw/lvl_29/frame_47.png diff --git a/assets/dolphin/external/lvl_29/frame_48.png b/assets/dolphin/external/nsfw/lvl_29/frame_48.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_48.png rename to assets/dolphin/external/nsfw/lvl_29/frame_48.png diff --git a/assets/dolphin/external/lvl_29/frame_49.png b/assets/dolphin/external/nsfw/lvl_29/frame_49.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_49.png rename to assets/dolphin/external/nsfw/lvl_29/frame_49.png diff --git a/assets/dolphin/external/lvl_29/frame_5.png b/assets/dolphin/external/nsfw/lvl_29/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_5.png rename to assets/dolphin/external/nsfw/lvl_29/frame_5.png diff --git a/assets/dolphin/external/lvl_29/frame_50.png b/assets/dolphin/external/nsfw/lvl_29/frame_50.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_50.png rename to assets/dolphin/external/nsfw/lvl_29/frame_50.png diff --git a/assets/dolphin/external/lvl_29/frame_51.png b/assets/dolphin/external/nsfw/lvl_29/frame_51.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_51.png rename to assets/dolphin/external/nsfw/lvl_29/frame_51.png diff --git a/assets/dolphin/external/lvl_29/frame_6.png b/assets/dolphin/external/nsfw/lvl_29/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_6.png rename to assets/dolphin/external/nsfw/lvl_29/frame_6.png diff --git a/assets/dolphin/external/lvl_29/frame_7.png b/assets/dolphin/external/nsfw/lvl_29/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_7.png rename to assets/dolphin/external/nsfw/lvl_29/frame_7.png diff --git a/assets/dolphin/external/lvl_29/frame_8.png b/assets/dolphin/external/nsfw/lvl_29/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_8.png rename to assets/dolphin/external/nsfw/lvl_29/frame_8.png diff --git a/assets/dolphin/external/lvl_29/frame_9.png b/assets/dolphin/external/nsfw/lvl_29/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_29/frame_9.png rename to assets/dolphin/external/nsfw/lvl_29/frame_9.png diff --git a/assets/dolphin/external/lvl_29/meta.txt b/assets/dolphin/external/nsfw/lvl_29/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_29/meta.txt rename to assets/dolphin/external/nsfw/lvl_29/meta.txt diff --git a/assets/dolphin/external/lvl_3/frame_0.png b/assets/dolphin/external/nsfw/lvl_3/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_0.png rename to assets/dolphin/external/nsfw/lvl_3/frame_0.png diff --git a/assets/dolphin/external/lvl_3/frame_1.png b/assets/dolphin/external/nsfw/lvl_3/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_1.png rename to assets/dolphin/external/nsfw/lvl_3/frame_1.png diff --git a/assets/dolphin/external/lvl_3/frame_10.png b/assets/dolphin/external/nsfw/lvl_3/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_10.png rename to assets/dolphin/external/nsfw/lvl_3/frame_10.png diff --git a/assets/dolphin/external/lvl_3/frame_11.png b/assets/dolphin/external/nsfw/lvl_3/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_11.png rename to assets/dolphin/external/nsfw/lvl_3/frame_11.png diff --git a/assets/dolphin/external/lvl_3/frame_12.png b/assets/dolphin/external/nsfw/lvl_3/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_12.png rename to assets/dolphin/external/nsfw/lvl_3/frame_12.png diff --git a/assets/dolphin/external/lvl_3/frame_13.png b/assets/dolphin/external/nsfw/lvl_3/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_13.png rename to assets/dolphin/external/nsfw/lvl_3/frame_13.png diff --git a/assets/dolphin/external/lvl_3/frame_14.png b/assets/dolphin/external/nsfw/lvl_3/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_14.png rename to assets/dolphin/external/nsfw/lvl_3/frame_14.png diff --git a/assets/dolphin/external/lvl_3/frame_2.png b/assets/dolphin/external/nsfw/lvl_3/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_2.png rename to assets/dolphin/external/nsfw/lvl_3/frame_2.png diff --git a/assets/dolphin/external/lvl_3/frame_3.png b/assets/dolphin/external/nsfw/lvl_3/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_3.png rename to assets/dolphin/external/nsfw/lvl_3/frame_3.png diff --git a/assets/dolphin/external/lvl_3/frame_4.png b/assets/dolphin/external/nsfw/lvl_3/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_4.png rename to assets/dolphin/external/nsfw/lvl_3/frame_4.png diff --git a/assets/dolphin/external/lvl_3/frame_5.png b/assets/dolphin/external/nsfw/lvl_3/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_5.png rename to assets/dolphin/external/nsfw/lvl_3/frame_5.png diff --git a/assets/dolphin/external/lvl_3/frame_6.png b/assets/dolphin/external/nsfw/lvl_3/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_6.png rename to assets/dolphin/external/nsfw/lvl_3/frame_6.png diff --git a/assets/dolphin/external/lvl_3/frame_7.png b/assets/dolphin/external/nsfw/lvl_3/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_7.png rename to assets/dolphin/external/nsfw/lvl_3/frame_7.png diff --git a/assets/dolphin/external/lvl_3/frame_8.png b/assets/dolphin/external/nsfw/lvl_3/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_8.png rename to assets/dolphin/external/nsfw/lvl_3/frame_8.png diff --git a/assets/dolphin/external/lvl_3/frame_9.png b/assets/dolphin/external/nsfw/lvl_3/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_3/frame_9.png rename to assets/dolphin/external/nsfw/lvl_3/frame_9.png diff --git a/assets/dolphin/external/lvl_3/meta.txt b/assets/dolphin/external/nsfw/lvl_3/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_3/meta.txt rename to assets/dolphin/external/nsfw/lvl_3/meta.txt diff --git a/assets/dolphin/external/lvl_30/frame_0.png b/assets/dolphin/external/nsfw/lvl_30/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_0.png rename to assets/dolphin/external/nsfw/lvl_30/frame_0.png diff --git a/assets/dolphin/external/lvl_30/frame_1.png b/assets/dolphin/external/nsfw/lvl_30/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_1.png rename to assets/dolphin/external/nsfw/lvl_30/frame_1.png diff --git a/assets/dolphin/external/lvl_30/frame_10.png b/assets/dolphin/external/nsfw/lvl_30/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_10.png rename to assets/dolphin/external/nsfw/lvl_30/frame_10.png diff --git a/assets/dolphin/external/lvl_30/frame_11.png b/assets/dolphin/external/nsfw/lvl_30/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_11.png rename to assets/dolphin/external/nsfw/lvl_30/frame_11.png diff --git a/assets/dolphin/external/lvl_30/frame_12.png b/assets/dolphin/external/nsfw/lvl_30/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_12.png rename to assets/dolphin/external/nsfw/lvl_30/frame_12.png diff --git a/assets/dolphin/external/lvl_30/frame_13.png b/assets/dolphin/external/nsfw/lvl_30/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_13.png rename to assets/dolphin/external/nsfw/lvl_30/frame_13.png diff --git a/assets/dolphin/external/lvl_30/frame_14.png b/assets/dolphin/external/nsfw/lvl_30/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_14.png rename to assets/dolphin/external/nsfw/lvl_30/frame_14.png diff --git a/assets/dolphin/external/lvl_30/frame_15.png b/assets/dolphin/external/nsfw/lvl_30/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_15.png rename to assets/dolphin/external/nsfw/lvl_30/frame_15.png diff --git a/assets/dolphin/external/lvl_30/frame_16.png b/assets/dolphin/external/nsfw/lvl_30/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_16.png rename to assets/dolphin/external/nsfw/lvl_30/frame_16.png diff --git a/assets/dolphin/external/lvl_30/frame_17.png b/assets/dolphin/external/nsfw/lvl_30/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_17.png rename to assets/dolphin/external/nsfw/lvl_30/frame_17.png diff --git a/assets/dolphin/external/lvl_30/frame_18.png b/assets/dolphin/external/nsfw/lvl_30/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_18.png rename to assets/dolphin/external/nsfw/lvl_30/frame_18.png diff --git a/assets/dolphin/external/lvl_30/frame_19.png b/assets/dolphin/external/nsfw/lvl_30/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_19.png rename to assets/dolphin/external/nsfw/lvl_30/frame_19.png diff --git a/assets/dolphin/external/lvl_30/frame_2.png b/assets/dolphin/external/nsfw/lvl_30/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_2.png rename to assets/dolphin/external/nsfw/lvl_30/frame_2.png diff --git a/assets/dolphin/external/lvl_30/frame_20.png b/assets/dolphin/external/nsfw/lvl_30/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_20.png rename to assets/dolphin/external/nsfw/lvl_30/frame_20.png diff --git a/assets/dolphin/external/lvl_30/frame_21.png b/assets/dolphin/external/nsfw/lvl_30/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_21.png rename to assets/dolphin/external/nsfw/lvl_30/frame_21.png diff --git a/assets/dolphin/external/lvl_30/frame_22.png b/assets/dolphin/external/nsfw/lvl_30/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_22.png rename to assets/dolphin/external/nsfw/lvl_30/frame_22.png diff --git a/assets/dolphin/external/lvl_30/frame_23.png b/assets/dolphin/external/nsfw/lvl_30/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_23.png rename to assets/dolphin/external/nsfw/lvl_30/frame_23.png diff --git a/assets/dolphin/external/lvl_30/frame_24.png b/assets/dolphin/external/nsfw/lvl_30/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_24.png rename to assets/dolphin/external/nsfw/lvl_30/frame_24.png diff --git a/assets/dolphin/external/lvl_30/frame_25.png b/assets/dolphin/external/nsfw/lvl_30/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_25.png rename to assets/dolphin/external/nsfw/lvl_30/frame_25.png diff --git a/assets/dolphin/external/lvl_30/frame_26.png b/assets/dolphin/external/nsfw/lvl_30/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_26.png rename to assets/dolphin/external/nsfw/lvl_30/frame_26.png diff --git a/assets/dolphin/external/lvl_30/frame_27.png b/assets/dolphin/external/nsfw/lvl_30/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_27.png rename to assets/dolphin/external/nsfw/lvl_30/frame_27.png diff --git a/assets/dolphin/external/lvl_30/frame_28.png b/assets/dolphin/external/nsfw/lvl_30/frame_28.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_28.png rename to assets/dolphin/external/nsfw/lvl_30/frame_28.png diff --git a/assets/dolphin/external/lvl_30/frame_29.png b/assets/dolphin/external/nsfw/lvl_30/frame_29.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_29.png rename to assets/dolphin/external/nsfw/lvl_30/frame_29.png diff --git a/assets/dolphin/external/lvl_30/frame_3.png b/assets/dolphin/external/nsfw/lvl_30/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_3.png rename to assets/dolphin/external/nsfw/lvl_30/frame_3.png diff --git a/assets/dolphin/external/lvl_30/frame_30.png b/assets/dolphin/external/nsfw/lvl_30/frame_30.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_30.png rename to assets/dolphin/external/nsfw/lvl_30/frame_30.png diff --git a/assets/dolphin/external/lvl_30/frame_31.png b/assets/dolphin/external/nsfw/lvl_30/frame_31.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_31.png rename to assets/dolphin/external/nsfw/lvl_30/frame_31.png diff --git a/assets/dolphin/external/lvl_30/frame_32.png b/assets/dolphin/external/nsfw/lvl_30/frame_32.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_32.png rename to assets/dolphin/external/nsfw/lvl_30/frame_32.png diff --git a/assets/dolphin/external/lvl_30/frame_33.png b/assets/dolphin/external/nsfw/lvl_30/frame_33.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_33.png rename to assets/dolphin/external/nsfw/lvl_30/frame_33.png diff --git a/assets/dolphin/external/lvl_30/frame_34.png b/assets/dolphin/external/nsfw/lvl_30/frame_34.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_34.png rename to assets/dolphin/external/nsfw/lvl_30/frame_34.png diff --git a/assets/dolphin/external/lvl_30/frame_35.png b/assets/dolphin/external/nsfw/lvl_30/frame_35.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_35.png rename to assets/dolphin/external/nsfw/lvl_30/frame_35.png diff --git a/assets/dolphin/external/lvl_30/frame_36.png b/assets/dolphin/external/nsfw/lvl_30/frame_36.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_36.png rename to assets/dolphin/external/nsfw/lvl_30/frame_36.png diff --git a/assets/dolphin/external/lvl_30/frame_37.png b/assets/dolphin/external/nsfw/lvl_30/frame_37.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_37.png rename to assets/dolphin/external/nsfw/lvl_30/frame_37.png diff --git a/assets/dolphin/external/lvl_30/frame_38.png b/assets/dolphin/external/nsfw/lvl_30/frame_38.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_38.png rename to assets/dolphin/external/nsfw/lvl_30/frame_38.png diff --git a/assets/dolphin/external/lvl_30/frame_39.png b/assets/dolphin/external/nsfw/lvl_30/frame_39.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_39.png rename to assets/dolphin/external/nsfw/lvl_30/frame_39.png diff --git a/assets/dolphin/external/lvl_30/frame_4.png b/assets/dolphin/external/nsfw/lvl_30/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_4.png rename to assets/dolphin/external/nsfw/lvl_30/frame_4.png diff --git a/assets/dolphin/external/lvl_30/frame_40.png b/assets/dolphin/external/nsfw/lvl_30/frame_40.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_40.png rename to assets/dolphin/external/nsfw/lvl_30/frame_40.png diff --git a/assets/dolphin/external/lvl_30/frame_41.png b/assets/dolphin/external/nsfw/lvl_30/frame_41.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_41.png rename to assets/dolphin/external/nsfw/lvl_30/frame_41.png diff --git a/assets/dolphin/external/lvl_30/frame_42.png b/assets/dolphin/external/nsfw/lvl_30/frame_42.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_42.png rename to assets/dolphin/external/nsfw/lvl_30/frame_42.png diff --git a/assets/dolphin/external/lvl_30/frame_43.png b/assets/dolphin/external/nsfw/lvl_30/frame_43.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_43.png rename to assets/dolphin/external/nsfw/lvl_30/frame_43.png diff --git a/assets/dolphin/external/lvl_30/frame_44.png b/assets/dolphin/external/nsfw/lvl_30/frame_44.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_44.png rename to assets/dolphin/external/nsfw/lvl_30/frame_44.png diff --git a/assets/dolphin/external/lvl_30/frame_45.png b/assets/dolphin/external/nsfw/lvl_30/frame_45.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_45.png rename to assets/dolphin/external/nsfw/lvl_30/frame_45.png diff --git a/assets/dolphin/external/lvl_30/frame_46.png b/assets/dolphin/external/nsfw/lvl_30/frame_46.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_46.png rename to assets/dolphin/external/nsfw/lvl_30/frame_46.png diff --git a/assets/dolphin/external/lvl_30/frame_47.png b/assets/dolphin/external/nsfw/lvl_30/frame_47.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_47.png rename to assets/dolphin/external/nsfw/lvl_30/frame_47.png diff --git a/assets/dolphin/external/lvl_30/frame_48.png b/assets/dolphin/external/nsfw/lvl_30/frame_48.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_48.png rename to assets/dolphin/external/nsfw/lvl_30/frame_48.png diff --git a/assets/dolphin/external/lvl_30/frame_49.png b/assets/dolphin/external/nsfw/lvl_30/frame_49.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_49.png rename to assets/dolphin/external/nsfw/lvl_30/frame_49.png diff --git a/assets/dolphin/external/lvl_30/frame_5.png b/assets/dolphin/external/nsfw/lvl_30/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_5.png rename to assets/dolphin/external/nsfw/lvl_30/frame_5.png diff --git a/assets/dolphin/external/lvl_30/frame_6.png b/assets/dolphin/external/nsfw/lvl_30/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_6.png rename to assets/dolphin/external/nsfw/lvl_30/frame_6.png diff --git a/assets/dolphin/external/lvl_30/frame_7.png b/assets/dolphin/external/nsfw/lvl_30/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_7.png rename to assets/dolphin/external/nsfw/lvl_30/frame_7.png diff --git a/assets/dolphin/external/lvl_30/frame_8.png b/assets/dolphin/external/nsfw/lvl_30/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_8.png rename to assets/dolphin/external/nsfw/lvl_30/frame_8.png diff --git a/assets/dolphin/external/lvl_30/frame_9.png b/assets/dolphin/external/nsfw/lvl_30/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_30/frame_9.png rename to assets/dolphin/external/nsfw/lvl_30/frame_9.png diff --git a/assets/dolphin/external/lvl_30/meta.txt b/assets/dolphin/external/nsfw/lvl_30/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_30/meta.txt rename to assets/dolphin/external/nsfw/lvl_30/meta.txt diff --git a/assets/dolphin/external/lvl_4/frame_0.png b/assets/dolphin/external/nsfw/lvl_4/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_0.png rename to assets/dolphin/external/nsfw/lvl_4/frame_0.png diff --git a/assets/dolphin/external/lvl_4/frame_1.png b/assets/dolphin/external/nsfw/lvl_4/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_1.png rename to assets/dolphin/external/nsfw/lvl_4/frame_1.png diff --git a/assets/dolphin/external/lvl_4/frame_10.png b/assets/dolphin/external/nsfw/lvl_4/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_10.png rename to assets/dolphin/external/nsfw/lvl_4/frame_10.png diff --git a/assets/dolphin/external/lvl_4/frame_11.png b/assets/dolphin/external/nsfw/lvl_4/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_11.png rename to assets/dolphin/external/nsfw/lvl_4/frame_11.png diff --git a/assets/dolphin/external/lvl_4/frame_12.png b/assets/dolphin/external/nsfw/lvl_4/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_12.png rename to assets/dolphin/external/nsfw/lvl_4/frame_12.png diff --git a/assets/dolphin/external/lvl_4/frame_13.png b/assets/dolphin/external/nsfw/lvl_4/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_13.png rename to assets/dolphin/external/nsfw/lvl_4/frame_13.png diff --git a/assets/dolphin/external/lvl_4/frame_14.png b/assets/dolphin/external/nsfw/lvl_4/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_14.png rename to assets/dolphin/external/nsfw/lvl_4/frame_14.png diff --git a/assets/dolphin/external/lvl_4/frame_15.png b/assets/dolphin/external/nsfw/lvl_4/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_15.png rename to assets/dolphin/external/nsfw/lvl_4/frame_15.png diff --git a/assets/dolphin/external/lvl_4/frame_16.png b/assets/dolphin/external/nsfw/lvl_4/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_16.png rename to assets/dolphin/external/nsfw/lvl_4/frame_16.png diff --git a/assets/dolphin/external/lvl_4/frame_17.png b/assets/dolphin/external/nsfw/lvl_4/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_17.png rename to assets/dolphin/external/nsfw/lvl_4/frame_17.png diff --git a/assets/dolphin/external/lvl_4/frame_18.png b/assets/dolphin/external/nsfw/lvl_4/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_18.png rename to assets/dolphin/external/nsfw/lvl_4/frame_18.png diff --git a/assets/dolphin/external/lvl_4/frame_19.png b/assets/dolphin/external/nsfw/lvl_4/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_19.png rename to assets/dolphin/external/nsfw/lvl_4/frame_19.png diff --git a/assets/dolphin/external/lvl_4/frame_2.png b/assets/dolphin/external/nsfw/lvl_4/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_2.png rename to assets/dolphin/external/nsfw/lvl_4/frame_2.png diff --git a/assets/dolphin/external/lvl_4/frame_3.png b/assets/dolphin/external/nsfw/lvl_4/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_3.png rename to assets/dolphin/external/nsfw/lvl_4/frame_3.png diff --git a/assets/dolphin/external/lvl_4/frame_4.png b/assets/dolphin/external/nsfw/lvl_4/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_4.png rename to assets/dolphin/external/nsfw/lvl_4/frame_4.png diff --git a/assets/dolphin/external/lvl_4/frame_5.png b/assets/dolphin/external/nsfw/lvl_4/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_5.png rename to assets/dolphin/external/nsfw/lvl_4/frame_5.png diff --git a/assets/dolphin/external/lvl_4/frame_6.png b/assets/dolphin/external/nsfw/lvl_4/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_6.png rename to assets/dolphin/external/nsfw/lvl_4/frame_6.png diff --git a/assets/dolphin/external/lvl_4/frame_7.png b/assets/dolphin/external/nsfw/lvl_4/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_7.png rename to assets/dolphin/external/nsfw/lvl_4/frame_7.png diff --git a/assets/dolphin/external/lvl_4/frame_8.png b/assets/dolphin/external/nsfw/lvl_4/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_8.png rename to assets/dolphin/external/nsfw/lvl_4/frame_8.png diff --git a/assets/dolphin/external/lvl_4/frame_9.png b/assets/dolphin/external/nsfw/lvl_4/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_4/frame_9.png rename to assets/dolphin/external/nsfw/lvl_4/frame_9.png diff --git a/assets/dolphin/external/lvl_4/meta.txt b/assets/dolphin/external/nsfw/lvl_4/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_4/meta.txt rename to assets/dolphin/external/nsfw/lvl_4/meta.txt diff --git a/assets/dolphin/external/lvl_5/frame_0.png b/assets/dolphin/external/nsfw/lvl_5/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_0.png rename to assets/dolphin/external/nsfw/lvl_5/frame_0.png diff --git a/assets/dolphin/external/lvl_5/frame_1.png b/assets/dolphin/external/nsfw/lvl_5/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_1.png rename to assets/dolphin/external/nsfw/lvl_5/frame_1.png diff --git a/assets/dolphin/external/lvl_5/frame_10.png b/assets/dolphin/external/nsfw/lvl_5/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_10.png rename to assets/dolphin/external/nsfw/lvl_5/frame_10.png diff --git a/assets/dolphin/external/lvl_5/frame_11.png b/assets/dolphin/external/nsfw/lvl_5/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_11.png rename to assets/dolphin/external/nsfw/lvl_5/frame_11.png diff --git a/assets/dolphin/external/lvl_5/frame_12.png b/assets/dolphin/external/nsfw/lvl_5/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_12.png rename to assets/dolphin/external/nsfw/lvl_5/frame_12.png diff --git a/assets/dolphin/external/lvl_5/frame_13.png b/assets/dolphin/external/nsfw/lvl_5/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_13.png rename to assets/dolphin/external/nsfw/lvl_5/frame_13.png diff --git a/assets/dolphin/external/lvl_5/frame_14.png b/assets/dolphin/external/nsfw/lvl_5/frame_14.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_14.png rename to assets/dolphin/external/nsfw/lvl_5/frame_14.png diff --git a/assets/dolphin/external/lvl_5/frame_15.png b/assets/dolphin/external/nsfw/lvl_5/frame_15.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_15.png rename to assets/dolphin/external/nsfw/lvl_5/frame_15.png diff --git a/assets/dolphin/external/lvl_5/frame_16.png b/assets/dolphin/external/nsfw/lvl_5/frame_16.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_16.png rename to assets/dolphin/external/nsfw/lvl_5/frame_16.png diff --git a/assets/dolphin/external/lvl_5/frame_17.png b/assets/dolphin/external/nsfw/lvl_5/frame_17.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_17.png rename to assets/dolphin/external/nsfw/lvl_5/frame_17.png diff --git a/assets/dolphin/external/lvl_5/frame_18.png b/assets/dolphin/external/nsfw/lvl_5/frame_18.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_18.png rename to assets/dolphin/external/nsfw/lvl_5/frame_18.png diff --git a/assets/dolphin/external/lvl_5/frame_19.png b/assets/dolphin/external/nsfw/lvl_5/frame_19.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_19.png rename to assets/dolphin/external/nsfw/lvl_5/frame_19.png diff --git a/assets/dolphin/external/lvl_5/frame_2.png b/assets/dolphin/external/nsfw/lvl_5/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_2.png rename to assets/dolphin/external/nsfw/lvl_5/frame_2.png diff --git a/assets/dolphin/external/lvl_5/frame_20.png b/assets/dolphin/external/nsfw/lvl_5/frame_20.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_20.png rename to assets/dolphin/external/nsfw/lvl_5/frame_20.png diff --git a/assets/dolphin/external/lvl_5/frame_21.png b/assets/dolphin/external/nsfw/lvl_5/frame_21.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_21.png rename to assets/dolphin/external/nsfw/lvl_5/frame_21.png diff --git a/assets/dolphin/external/lvl_5/frame_22.png b/assets/dolphin/external/nsfw/lvl_5/frame_22.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_22.png rename to assets/dolphin/external/nsfw/lvl_5/frame_22.png diff --git a/assets/dolphin/external/lvl_5/frame_23.png b/assets/dolphin/external/nsfw/lvl_5/frame_23.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_23.png rename to assets/dolphin/external/nsfw/lvl_5/frame_23.png diff --git a/assets/dolphin/external/lvl_5/frame_24.png b/assets/dolphin/external/nsfw/lvl_5/frame_24.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_24.png rename to assets/dolphin/external/nsfw/lvl_5/frame_24.png diff --git a/assets/dolphin/external/lvl_5/frame_25.png b/assets/dolphin/external/nsfw/lvl_5/frame_25.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_25.png rename to assets/dolphin/external/nsfw/lvl_5/frame_25.png diff --git a/assets/dolphin/external/lvl_5/frame_26.png b/assets/dolphin/external/nsfw/lvl_5/frame_26.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_26.png rename to assets/dolphin/external/nsfw/lvl_5/frame_26.png diff --git a/assets/dolphin/external/lvl_5/frame_27.png b/assets/dolphin/external/nsfw/lvl_5/frame_27.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_27.png rename to assets/dolphin/external/nsfw/lvl_5/frame_27.png diff --git a/assets/dolphin/external/lvl_5/frame_3.png b/assets/dolphin/external/nsfw/lvl_5/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_3.png rename to assets/dolphin/external/nsfw/lvl_5/frame_3.png diff --git a/assets/dolphin/external/lvl_5/frame_4.png b/assets/dolphin/external/nsfw/lvl_5/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_4.png rename to assets/dolphin/external/nsfw/lvl_5/frame_4.png diff --git a/assets/dolphin/external/lvl_5/frame_5.png b/assets/dolphin/external/nsfw/lvl_5/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_5.png rename to assets/dolphin/external/nsfw/lvl_5/frame_5.png diff --git a/assets/dolphin/external/lvl_5/frame_6.png b/assets/dolphin/external/nsfw/lvl_5/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_6.png rename to assets/dolphin/external/nsfw/lvl_5/frame_6.png diff --git a/assets/dolphin/external/lvl_5/frame_7.png b/assets/dolphin/external/nsfw/lvl_5/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_7.png rename to assets/dolphin/external/nsfw/lvl_5/frame_7.png diff --git a/assets/dolphin/external/lvl_5/frame_8.png b/assets/dolphin/external/nsfw/lvl_5/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_8.png rename to assets/dolphin/external/nsfw/lvl_5/frame_8.png diff --git a/assets/dolphin/external/lvl_5/frame_9.png b/assets/dolphin/external/nsfw/lvl_5/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_5/frame_9.png rename to assets/dolphin/external/nsfw/lvl_5/frame_9.png diff --git a/assets/dolphin/external/lvl_5/meta.txt b/assets/dolphin/external/nsfw/lvl_5/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_5/meta.txt rename to assets/dolphin/external/nsfw/lvl_5/meta.txt diff --git a/assets/dolphin/external/lvl_6/frame_0.png b/assets/dolphin/external/nsfw/lvl_6/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_0.png rename to assets/dolphin/external/nsfw/lvl_6/frame_0.png diff --git a/assets/dolphin/external/lvl_6/frame_1.png b/assets/dolphin/external/nsfw/lvl_6/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_1.png rename to assets/dolphin/external/nsfw/lvl_6/frame_1.png diff --git a/assets/dolphin/external/lvl_6/frame_2.png b/assets/dolphin/external/nsfw/lvl_6/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_2.png rename to assets/dolphin/external/nsfw/lvl_6/frame_2.png diff --git a/assets/dolphin/external/lvl_6/frame_3.png b/assets/dolphin/external/nsfw/lvl_6/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_3.png rename to assets/dolphin/external/nsfw/lvl_6/frame_3.png diff --git a/assets/dolphin/external/lvl_6/frame_4.png b/assets/dolphin/external/nsfw/lvl_6/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_4.png rename to assets/dolphin/external/nsfw/lvl_6/frame_4.png diff --git a/assets/dolphin/external/lvl_6/frame_5.png b/assets/dolphin/external/nsfw/lvl_6/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_5.png rename to assets/dolphin/external/nsfw/lvl_6/frame_5.png diff --git a/assets/dolphin/external/lvl_6/frame_6.png b/assets/dolphin/external/nsfw/lvl_6/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_6/frame_6.png rename to assets/dolphin/external/nsfw/lvl_6/frame_6.png diff --git a/assets/dolphin/external/lvl_6/meta.txt b/assets/dolphin/external/nsfw/lvl_6/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_6/meta.txt rename to assets/dolphin/external/nsfw/lvl_6/meta.txt diff --git a/assets/dolphin/external/lvl_7/frame_0.png b/assets/dolphin/external/nsfw/lvl_7/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_0.png rename to assets/dolphin/external/nsfw/lvl_7/frame_0.png diff --git a/assets/dolphin/external/lvl_7/frame_1.png b/assets/dolphin/external/nsfw/lvl_7/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_1.png rename to assets/dolphin/external/nsfw/lvl_7/frame_1.png diff --git a/assets/dolphin/external/lvl_7/frame_10.png b/assets/dolphin/external/nsfw/lvl_7/frame_10.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_10.png rename to assets/dolphin/external/nsfw/lvl_7/frame_10.png diff --git a/assets/dolphin/external/lvl_7/frame_11.png b/assets/dolphin/external/nsfw/lvl_7/frame_11.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_11.png rename to assets/dolphin/external/nsfw/lvl_7/frame_11.png diff --git a/assets/dolphin/external/lvl_7/frame_12.png b/assets/dolphin/external/nsfw/lvl_7/frame_12.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_12.png rename to assets/dolphin/external/nsfw/lvl_7/frame_12.png diff --git a/assets/dolphin/external/lvl_7/frame_13.png b/assets/dolphin/external/nsfw/lvl_7/frame_13.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_13.png rename to assets/dolphin/external/nsfw/lvl_7/frame_13.png diff --git a/assets/dolphin/external/lvl_7/frame_2.png b/assets/dolphin/external/nsfw/lvl_7/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_2.png rename to assets/dolphin/external/nsfw/lvl_7/frame_2.png diff --git a/assets/dolphin/external/lvl_7/frame_3.png b/assets/dolphin/external/nsfw/lvl_7/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_3.png rename to assets/dolphin/external/nsfw/lvl_7/frame_3.png diff --git a/assets/dolphin/external/lvl_7/frame_4.png b/assets/dolphin/external/nsfw/lvl_7/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_4.png rename to assets/dolphin/external/nsfw/lvl_7/frame_4.png diff --git a/assets/dolphin/external/lvl_7/frame_5.png b/assets/dolphin/external/nsfw/lvl_7/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_5.png rename to assets/dolphin/external/nsfw/lvl_7/frame_5.png diff --git a/assets/dolphin/external/lvl_7/frame_6.png b/assets/dolphin/external/nsfw/lvl_7/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_6.png rename to assets/dolphin/external/nsfw/lvl_7/frame_6.png diff --git a/assets/dolphin/external/lvl_7/frame_7.png b/assets/dolphin/external/nsfw/lvl_7/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_7.png rename to assets/dolphin/external/nsfw/lvl_7/frame_7.png diff --git a/assets/dolphin/external/lvl_7/frame_8.png b/assets/dolphin/external/nsfw/lvl_7/frame_8.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_8.png rename to assets/dolphin/external/nsfw/lvl_7/frame_8.png diff --git a/assets/dolphin/external/lvl_7/frame_9.png b/assets/dolphin/external/nsfw/lvl_7/frame_9.png similarity index 100% rename from assets/dolphin/external/lvl_7/frame_9.png rename to assets/dolphin/external/nsfw/lvl_7/frame_9.png diff --git a/assets/dolphin/external/lvl_7/meta.txt b/assets/dolphin/external/nsfw/lvl_7/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_7/meta.txt rename to assets/dolphin/external/nsfw/lvl_7/meta.txt diff --git a/assets/dolphin/external/lvl_8/frame_0.png b/assets/dolphin/external/nsfw/lvl_8/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_0.png rename to assets/dolphin/external/nsfw/lvl_8/frame_0.png diff --git a/assets/dolphin/external/lvl_8/frame_1.png b/assets/dolphin/external/nsfw/lvl_8/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_1.png rename to assets/dolphin/external/nsfw/lvl_8/frame_1.png diff --git a/assets/dolphin/external/lvl_8/frame_2.png b/assets/dolphin/external/nsfw/lvl_8/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_2.png rename to assets/dolphin/external/nsfw/lvl_8/frame_2.png diff --git a/assets/dolphin/external/lvl_8/frame_3.png b/assets/dolphin/external/nsfw/lvl_8/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_3.png rename to assets/dolphin/external/nsfw/lvl_8/frame_3.png diff --git a/assets/dolphin/external/lvl_8/frame_4.png b/assets/dolphin/external/nsfw/lvl_8/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_4.png rename to assets/dolphin/external/nsfw/lvl_8/frame_4.png diff --git a/assets/dolphin/external/lvl_8/frame_5.png b/assets/dolphin/external/nsfw/lvl_8/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_8/frame_5.png rename to assets/dolphin/external/nsfw/lvl_8/frame_5.png diff --git a/assets/dolphin/external/lvl_8/meta.txt b/assets/dolphin/external/nsfw/lvl_8/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_8/meta.txt rename to assets/dolphin/external/nsfw/lvl_8/meta.txt diff --git a/assets/dolphin/external/lvl_9/frame_0.png b/assets/dolphin/external/nsfw/lvl_9/frame_0.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_0.png rename to assets/dolphin/external/nsfw/lvl_9/frame_0.png diff --git a/assets/dolphin/external/lvl_9/frame_1.png b/assets/dolphin/external/nsfw/lvl_9/frame_1.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_1.png rename to assets/dolphin/external/nsfw/lvl_9/frame_1.png diff --git a/assets/dolphin/external/lvl_9/frame_2.png b/assets/dolphin/external/nsfw/lvl_9/frame_2.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_2.png rename to assets/dolphin/external/nsfw/lvl_9/frame_2.png diff --git a/assets/dolphin/external/lvl_9/frame_3.png b/assets/dolphin/external/nsfw/lvl_9/frame_3.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_3.png rename to assets/dolphin/external/nsfw/lvl_9/frame_3.png diff --git a/assets/dolphin/external/lvl_9/frame_4.png b/assets/dolphin/external/nsfw/lvl_9/frame_4.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_4.png rename to assets/dolphin/external/nsfw/lvl_9/frame_4.png diff --git a/assets/dolphin/external/lvl_9/frame_5.png b/assets/dolphin/external/nsfw/lvl_9/frame_5.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_5.png rename to assets/dolphin/external/nsfw/lvl_9/frame_5.png diff --git a/assets/dolphin/external/lvl_9/frame_6.png b/assets/dolphin/external/nsfw/lvl_9/frame_6.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_6.png rename to assets/dolphin/external/nsfw/lvl_9/frame_6.png diff --git a/assets/dolphin/external/lvl_9/frame_7.png b/assets/dolphin/external/nsfw/lvl_9/frame_7.png similarity index 100% rename from assets/dolphin/external/lvl_9/frame_7.png rename to assets/dolphin/external/nsfw/lvl_9/frame_7.png diff --git a/assets/dolphin/external/lvl_9/meta.txt b/assets/dolphin/external/nsfw/lvl_9/meta.txt similarity index 100% rename from assets/dolphin/external/lvl_9/meta.txt rename to assets/dolphin/external/nsfw/lvl_9/meta.txt diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/nsfw/manifest.txt similarity index 80% rename from assets/dolphin/external/manifest.txt rename to assets/dolphin/external/nsfw/manifest.txt index 6d959b18b..1a9dc08c8 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/nsfw/manifest.txt @@ -1,210 +1,210 @@ Filetype: Flipper Animation Manifest Version: 1 -Name: lvl_1 +Name: nsfw/lvl_1 Min butthurt: 0 Max butthurt: 14 Min level: 1 Max level: 30 Weight: 7 -Name: lvl_2 +Name: nsfw/lvl_2 Min butthurt: 0 Max butthurt: 14 Min level: 2 Max level: 30 Weight: 7 -Name: lvl_3 +Name: nsfw/lvl_3 Min butthurt: 0 Max butthurt: 14 Min level: 3 Max level: 30 Weight: 7 -Name: lvl_4 +Name: nsfw/lvl_4 Min butthurt: 0 Max butthurt: 14 Min level: 4 Max level: 30 Weight: 7 -Name: lvl_5 +Name: nsfw/lvl_5 Min butthurt: 0 Max butthurt: 14 Min level: 5 Max level: 30 Weight: 7 -Name: lvl_6 +Name: nsfw/lvl_6 Min butthurt: 0 Max butthurt: 14 Min level: 6 Max level: 30 Weight: 7 -Name: lvl_7 +Name: nsfw/lvl_7 Min butthurt: 0 Max butthurt: 14 Min level: 7 Max level: 30 Weight: 7 -Name: lvl_8 +Name: nsfw/lvl_8 Min butthurt: 0 Max butthurt: 14 Min level: 8 Max level: 30 Weight: 7 -Name: lvl_9 +Name: nsfw/lvl_9 Min butthurt: 0 Max butthurt: 14 Min level: 9 Max level: 30 Weight: 7 -Name: lvl_10 +Name: nsfw/lvl_10 Min butthurt: 0 Max butthurt: 14 Min level: 10 Max level: 30 Weight: 7 -Name: lvl_11 +Name: nsfw/lvl_11 Min butthurt: 0 Max butthurt: 14 Min level: 11 Max level: 30 Weight: 9 -Name: lvl_12 +Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 Min level: 12 Max level: 30 Weight: 7 -Name: lvl_13 +Name: nsfw/lvl_13 Min butthurt: 0 Max butthurt: 14 Min level: 13 Max level: 30 Weight: 7 -Name: lvl_14 +Name: nsfw/lvl_14 Min butthurt: 0 Max butthurt: 14 Min level: 14 Max level: 30 Weight: 7 -Name: lvl_15 +Name: nsfw/lvl_15 Min butthurt: 0 Max butthurt: 14 Min level: 15 Max level: 30 Weight: 7 -Name: lvl_16 +Name: nsfw/lvl_16 Min butthurt: 0 Max butthurt: 14 Min level: 16 Max level: 30 Weight: 7 -Name: lvl_17 +Name: nsfw/lvl_17 Min butthurt: 0 Max butthurt: 14 Min level: 17 Max level: 30 Weight: 7 -Name: lvl_18 +Name: nsfw/lvl_18 Min butthurt: 0 Max butthurt: 14 Min level: 18 Max level: 30 Weight: 7 -Name: lvl_19 +Name: nsfw/lvl_19 Min butthurt: 0 Max butthurt: 14 Min level: 19 Max level: 30 Weight: 7 -Name: lvl_20 +Name: nsfw/lvl_20 Min butthurt: 0 Max butthurt: 14 Min level: 20 Max level: 30 Weight: 7 -Name: lvl_21 +Name: nsfw/lvl_21 Min butthurt: 0 Max butthurt: 14 Min level: 21 Max level: 30 Weight: 9 -Name: lvl_22 +Name: nsfw/lvl_22 Min butthurt: 0 Max butthurt: 14 Min level: 22 Max level: 30 Weight: 7 -Name: lvl_23 +Name: nsfw/lvl_23 Min butthurt: 0 Max butthurt: 14 Min level: 23 Max level: 30 Weight: 7 -Name: lvl_24 +Name: nsfw/lvl_24 Min butthurt: 0 Max butthurt: 14 Min level: 24 Max level: 30 Weight: 7 -Name: lvl_25 +Name: nsfw/lvl_25 Min butthurt: 0 Max butthurt: 14 Min level: 25 Max level: 30 Weight: 7 -Name: lvl_26 +Name: nsfw/lvl_26 Min butthurt: 0 Max butthurt: 14 Min level: 26 Max level: 30 Weight: 7 -Name: lvl_27 +Name: nsfw/lvl_27 Min butthurt: 0 Max butthurt: 14 Min level: 27 Max level: 30 Weight: 7 -Name: lvl_28 +Name: nsfw/lvl_28 Min butthurt: 0 Max butthurt: 14 Min level: 28 Max level: 30 Weight: 7 -Name: lvl_29 +Name: nsfw/lvl_29 Min butthurt: 0 Max butthurt: 14 Min level: 29 Max level: 30 Weight: 7 -Name: lvl_30 +Name: nsfw/lvl_30 Min butthurt: 0 Max butthurt: 14 Min level: 30 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b2c75b8fbe7ac7ad06e4c1f3df878dabc56887 GIT binary patch literal 1548 zcmaJ>dvMcq98bGZ%5HTV$lG%va1(_z&$dZyq1)O)Wu3iJV94;ACh1zYCMC_bZpT4+ zIOTERsVB!!K@m<-xgiP+1S&&BZYOXE@;DtnP~@c?r}8@IuiJ|J!I4Yy`~AN8e!kz& z_myS7swt+tQF#yqnLJZnez2y%<22@g_XXo>FIYxu?rLqi64sh{Rf0-IB_zR~7+)*- zC0=Zv_qAk)pq$odpjxZ;R&s(8GxHf8b21hOXb7@TPR4nmPSW6zR2!8Y$RB(5BXCr7 zAhRr9+#4^KBGIWWsx-Z&Dj>Af39N`ro&?*I954`*G#*aI>g5ENbRfNUIk3-&F$C^a z(dryXAE|1u4=z_!3AULDRKRf@wy|bOhXdgwKajk`g4I3K1m1lSn^ayf1xy zoeCr%jChs}$FN}r7kCE6d5}@YLQ80fqHL(m77Ec;!9ws9i(r5vmg$`PIw>mx?U~u$ z8x3%{H(ZhoCQ1dPQ@r!tYhdgQzRG|btUWzFo6fBN9)k3F9#?4~dG^X|&)`lt|Fxc; z-y2It585G)AH%+0r5+}Sl^t%(yJ4t5n|@kX>H2dfbffUD?(?DPPUK*d-FSZVV>g)8 zkOdvfYoYV=+a7^VHk+Z-+oAZrilSigKRVcWq*4;IC0gS%DuZ|n+SAD&7m*9(x>-)<||lH5^TLRT<5$y;k#S& zHy*6Mn9F<{XCsCJmN_xE^<&@LYp!zG4$JKkr+*#rPSIQMr7h4_-8hR=cXz|0>LneH zIDGMxbC*79kdLP$Qi?K*(WY_ zGRHbnL)xX!xXkZmTO+}Z>9vzx-9MzENbSh3_4T>= zC!y=~mVJ#TvF<=_YTcd1_SCuC`dI7x%_GhXe>v7}*uNbsgbuxs{y?rIkIgEe=NA{| z)2DKN8r$ZcTh`_5Zr^MM{ukl~Vpu1_rp&2`eK6m29 RlWQ~oXOFwewY4m`_&*QaAY=dl literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_1.png b/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..347d71cc2087a490525faca17adf953c89a888a6 GIT binary patch literal 1550 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_3.png b/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7004e10c30dad43342b1818440c9917f5b2eefbb GIT binary patch literal 1518 zcmaJ=eQXnD7{9X6HDeP7TVxZK^Dst)>wUJpmUU~l7FlRv+1hMcHM`!uUC*t(a(AQM z039D07-DG52r~jA0R&CuV=5>LH9{gEl5PJ06J&~n2umF55KLsg-B#oe!sYJX_kG^y z_dLJn>+RZQFBRmK<{=1DP_x8U2iH#cISe`Qf5WiF3zrhj-Kf>eAuY};0C9?P5TG>? zz8Ta3UTj}+29zU6PM73s)Ed1Wn;=Jwd`8EZh{PZoLCPx=FRgK_-NBO`3u{`;MiB9M+!$w!veHaYR;!gDX@aJ4sDZ2PQH@XFQFUI{f(xjE zBE>XGj-nZhd{A!F>=-0F5k(~C^*%HlRVQ-=vqmKN7(p3HA`;1jHmM#*kJVOv z?J+>q0ab2O1Xz;Lyet@|@5zobija+Mxgx>3@U1RcXp4ZTR^zf`@Wv=gqRmQDRz76r za0_b=;jD=Z;=I`maF*pl0!xx+I>cn{JPz-)a&)!X;^rtfOHuCXD$d0^s~8JY#krj> zlFDLhqN>J61(5YELEn>D*Aua}Y6b9`toUTPHQNZaVOf*aupC2a#z>+sczHpJW+d}7 zRhkIe1r%u|5Em+U?`I@|Uk(xc5V#;#4ZW zBT_V4Qh)TmzSZF16CD?)<=i+v4w)E46bd{7o_K~#a|8H{BZ7; z?!8xvb|kn}*Bd@r|E&JOO~1#vsBHJv`KGj|;JmnNpz~a3uYQkV=YV6U&UkSBnbPFS zQGaQzp=xh2m-KoVckXw|?u*iyVp_=?6=lR*Ba^SjJ zI?~;g`gh}{;{3t2bC>U0n~xlxNta&wHoU0s{TwWi+??y7`c9=A{K-B9%e#B!ny&M+ z<>&8DNv+*DpWKw^SupJQGH-ebR=3rE$1(cmx>vss?xjg7a`N>(>)`Fy3~W$0vti?FB}T|ytmz{)9rbt zvFGWcwpoSA)P-rk4Ev^@WYq7DRW#jJs|%W*vkd$D7dFgW>c7=>HX$3(fuZ!OtGlJ` n8&=#P(yLSVrVW)Ll~eMOtxd&vvW3|NI{>M1FLQlb)wJ$Ed`=v~ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..556cb8948d15edd4308f66442fd5fc8a4a74f038 GIT binary patch literal 1537 zcmaJ>eNYr-7~k_$K)k#hLpdvU)+r_3+pqiBT{*df1;IRI&a*Hp+1uOWR@mEfZ-Iks z2B|SW8a2u$45OM%YO=u^wGT%R3{XeW1{(-7DX}JV{HRD9O?nSF^AE?J-F@Hp+2{8> zzvpW=6c;TtOfpS^AjnWyz68Bc-vSTrnsW)T-jr+9Iz|TP`quBzpmz6=i_|S=4wqDp!OeY}A2_*k!>!F2)de zL`5riAfu#8+{JLNqKdHHOrQde_UJ; z)gNFzT>h9laB?6)O$)OaR$X0fuBOb2T80q}!(cdxkt7N<&`3>4MwoF-mgAv~Xh$@U_&<$%YDc^^ zVG;9)5v5WUKuH3#5@3+N`#Xv&0ygXtRRVS4D>y}{l*N!%$T<-3#q5{-EQ1paAF$D= z-C_%%7Ax&Td7Di{EfzW;Sa94%2B?Icd*NLSP3GEYk|y#j1d*4ULvt2a4rQlu=sXvP z6A5f#D5CKpK}`6TfbTIZabGN(tBSm)s9r^>NHjumP|=h~Pzl2%Wyaw-ZeEZ=aY<&p zN~1w@qAFF1{(M!D;gK}6(mg2PHi{0Aei3DGzXi2WgcXF(2T+m{M4s{yB*Bx&7~X$Z z`bIkyNI)3j1RIuS0yHl0G>Y>eqqNl`qCSeUqjtN`XR!%Zf~Ob+0~E1%=iJpv2@z<| z`1a0dfWw{P5<_63R4_Wti+lUP*i9^6?9Bt~@bK`?@0-s;kZ!n;b9tlvml`*0ZpSBc zUBkmYb9Dw=_-dA_lc2$2vck4+AI%lZs+A{^}5-6xj7uzu( zGB$^joI|%ns1*D8?XI^{plioMCx7f7H>W4(e6Pv)#_oa6pP)^AM)TITzaJ=i#rmvq z?K_uSF5GsH|8RkM^RJh#To{CgDzEKtp1W*Et6I<=U7x%?<6>9VY5wuqyL(w<_(9iS zA01EWY&@|te^tq@3CEgFPhHdfoPN+0n`bz_&v^>k>)f04?%^X_CvHb$^4bp5`tCpb z`gh+f_3As;HTSw(ov%+^qt(N7Pu);?Y`G~tMjGlCo?MlZ)>%JehtUL`|X@( z`l)?W8=8VXxnySn@z{Z#w()WrFBP?16e>P8Ffqr!y5v;tdQ$gS!8faq8fUV4VKTHY zHI~$N@aD14mXtmJ$)Pi6h|A+zp6Pi1#oFnyQ`z(P>u;stP_}N``D-&9Z1JCRVO|mU IX-;YVe~?!xZ~y=R literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_5.png b/assets/dolphin/external/sfw/L1_Boxing_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6170340449e3dcfef8acf374f27e539a1ccd24 GIT binary patch literal 1555 zcmaJ=du&rx7(b&M9b@Z;F38xFOE;znxA)QaO$&Y8P8!xyMxz7KaC;wHH`;r-y=7%e zHa0{Fm?1{N#0UoD6@rUo5YxqNfB}r4L9+31aTtLGMi!DGi;DAfTaiD|`#R@*_xpX{ z?|W?x_+QD(nVkaw$n!3ttKixUUq`kIes5;C`QTEdc&e2ZqM$S|G7p@b7~&CcgsI`H zc!t}s?mTY;K(!?ttX8Uhl@u#RbWBP|mxxFZ4S;QNLSoo@UO_^9O*m@T4kx>`NSL#0 zUo-k}pXBCi!%G@venq1{$TrrqR!+Nk5n@YF&_IM&7$gx{8;wy3yLQ|z1@|d2rbWh8 zlzO{%f>gCHfVf4ON6b0`WpNxw%vK%GF=R+DFziBv#7P1p;A2J!Geznt!ir2@TIf*b z1geUzm~;nEc5SVqNEC)OG&JZM^g2is2+ik|@+bV;iChlR%@f(zFGdkFj!C zQo>>sNm*n2E+9IzoV2QWJ4{J!>}&QT3Te|5k9JTX}cEw(Q#ppvf_l55lj}; zY%mF^!DtDgjLF2K27^Ul4LEKh1%2Ai)9`MW)9Jy@CJW&)5`@R?vd{*nOK;Y@EFLF~ z6KSkB8dI1k%cp&Zp>H=ylTN3_1F?qx#8PgVXB1HmisIUIBLr$iMU2&o5<=>AIP#K@ zVZ+gsWPYkj6G79w9A3|J6|xvX#?wrNpF#mQ=`8}u@u(H&45&d*7-9H~fRcKaXY?V0 zBp6aViRYe3-$bWE2@FF@v!N_j!Gg1l1;rVdQH#;QqanTCjGE1%kioYOJ!DJ_ESnc6-c4S0AwTznKxlnh5F4{cZl$8Kt%GU$Qp*x1+?SNHS-FlC09b_NsI zhE~3Ru?5fV{AO%v(^hiu#ND>mQ@aKO2G?LmGTxWNsO0P2`S9+_1Ov&8fw)Z#?mfVP zEeqUvlnF)-Ue8!VH5GyOw&INLQSNYE@jUSR?Nj6rUCAxE?SXysy8Dm!VL$CYn0I*Y z*5XFTuu^z+S!u!D+xGi(--XPqxerH%Zw=fzJ7 zM}Il+@s^68XBCKNu5`UxDvb)2&ipH@FU(a-S!xX!-JZ2l^J8}N%{z;b`_wt9`}KoV z%l2nyOux7e40inb_t8?~^Bt=G&Q`=;v}uQGcW*N3uhg8It)7}QlST$W26Ft7^!(A` zEPHds*;@}k`1(doYh06C*u2m3+fEx&4(JCv&$gDSXPw?#QnqS_^^G0pRmCqXJzL9y zU7OeEk|hQB%inb;dql2dxj(NuPAXmc(dT4dcT6bN0pJa zA602~kKqgNZaTEBeEEl!!MEmI{j6Ud=`3mPWmlbSnh83?%Dqbm=6@>Sx<`A4)dTB5 a)0A8QsKTKW#`a^dO@PYfKbZ6uv-K6f0_KXthYjfmThKo!35QH*95>!9wFI#YOR1W@qoR1MJQ?JIJoK zc13EXsjcyc+FBwFnrc!XjgQu7WHmm}w5F}C0eloBv`Q^nEm}=ONv`J|IfHB2Id?}hEXylJfLGRv?pE}VrQ7bIh=E`2JPEaARdt^7n ziv2<*EQNw6yzDH@10ZFs?AHr%9ev2JAT$7ZGeU|WRznSQ!%8V&!*3mF z#WBfa!{-~Flv62yKB;Jh3g@nv?Gjg1ixv+);|(k?WJL!2P!q6_za|j0hHUttT`OA0 z#Uzdms%X_Ve27%Jvji)URfw7OG$B$Hg_$jS=n)t<>lMUYjG-8sq|sw0XtR}Jt+WLj zzHsDF^?0qN{LEo@XlKKHnxh>dlQDxq@`YIs?!^}~Qx%-eAEMemV3RtrU2 z1h0uB%m$N}Fc>*EA(%{%Fc>(mXrL$)<7E?eo`o-9c*bt$92{L}py|Q_2ge)i4%W;% zxI#Nm(FtsEAgBoe5hi>~$oDYT{#>lJK!t)Pt1eltNfbhfPuAq1PgXF7)l=9sryxp! zxMX_#l!k)lp(-tho|&rb#|G1Em7YO?GO?VO@j${tc?^VsrHv?j!Amf#2nE(nGqk|q z!+6hA=^Lt4Btc;)2{u;F;^in&;0Q`U8Rd)yNVr+nOqk7Xx4|SDX@RxiB%(;hE9a?7 zN{CQ-#+Of818tr(7Yv||Qc>$1BM%%$Z8xH1ma7oWu~=+J$F?f~BL9YEQWTjp=kMZY7D-gxkbf~V&G(*9ysc}LGy_;sK_D(W7a z@gqAK-rYQY-Ti^0ypCIe`uYvA_WQ@815?|$#SIU;z|U)b`@X*Ohwax7KCtg?Vy7>N z^)IZNG|HbpFZ=xCfnB<#)xpITNk>K*dcpaw=xDI%&*_=X8PT`??RYhu>Egzn+I6UT z=c$|FDdKTD9n5>Zbkje}x_Xm+LA}A>12%=m_MGgEynA|eWBr(nA}$~7++Fs5Rp;p3 zi0{69Ey^e5T>CwgHSQ%4J&9MDrl}FS=H55I3Kw(E+=;F|bAk3ARLTaD(rYTVlq}+R zbgw!)!f1=S?O{0nbiOeoEi)1V4av&6aO-gVh!D*ZA0x( zIn^5*t8TS)?qAumetrtYOzBUKw5{(xdO-T9dE&=&x7~dNE~j_Ri6ns=yC>Y4RJStz P%Lm1Uv-v%aiu(Tm75_Op literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Boxing_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Boxing_128x64/meta.txt new file mode 100644 index 000000000..c66998e7d --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Boxing_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 9 +Active frames: 7 +Frames order: 0 1 2 1 3 1 2 3 1 4 5 6 5 6 5 4 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 2 + +Slot: 0 +X: 78 +Y: 16 +Text: F*&K!!! +AlignH: Left +AlignV: Bottom +StartFrame: 2 +EndFrame: 4 + +Slot: 1 +X: 78 +Y: 16 +Text: What ya\nlookin at?! +AlignH: Left +AlignV: Center +StartFrame: 10 +EndFrame: 15 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b2636f005f042f1e3f163c5b349d026338f06f6b GIT binary patch literal 1942 zcmaJ?eNYo;8ec?^A|48UVL?KI9txXecSAP25D*fmsU(dElGYU1Y<9^4$;QoMBDRR= zRqfS-da)-WoL|*}QQF#`y;h;>SS^)etvXXw6bcMfMW$!l8_U;i6ukc7bZ2+p=Y971 zJs-dKd1iMS4KK|KUK9)fz%1QLZMLvh3eSolf8pI9RIL}52tLEauVHE4O>h*DW@Rmu zNM|RCsBDU`Zd~6+B?Ex}HYUf!oAg;Y$=aoa&qnI8I|VcVB&T|u1X)7yA`4Z-IMm|d z(_e^1j8!epOVrEtP7P&aR+e+rnsP%9Szbb7R&i>IDA|Jx4(t?9h&=XEhYRFoEK-WeGPk2Cw zOETp_OSwpnaqvk>kozc^hwG_u}psbl3YZpBs8E2l8fRZK>X}JXf>Po zL@|oAPzpJrLLu=a-ugT8p7yDr5sGk5<$^0P8X_@>1{EX;gM?LqfSAA`NFyYKPzbD| zA%$2bq$uPkc5Q!sgj%Q4V3AIAL&r-BpW(p$jx-N6`5ApwCB z#xB)QzvQOQB>$8()|%X3J@aPkk1vjT4n})7XewUzuK~+G_y)`gwdMCCi>IGf8+EgH z{UzKa$vaAn{iCN~T}4CDoZ#@>6m2BHjQ+az*n5(+mCnEYC#WDMQhBH4PGMxy{pOSN zPI$SR{;Ri_!=|or{JY1E*Ov|j_!}=AY%{zzfBOx;Z-K1F&_l~pUq#~@_YA(Rs(-mE zM(bbs+sW5~_aR+x+o>?izU~j#Em(c#+~tDZeWiF&;J$O^F{_xdfP91ixDG_mfa|h`Z%HRWX)A90eiFN0HycuiHdE# zhNTZE!yUh})BoCGPdOK`wW+SF;>6*>pGPtWuschmk~`Vl12S9qP{6`DpXLJ%L#ULHhY z;WeEx&m28%@3DxI?=}y9o6?^0ue(>y4kl-|YPzWruhJ<#!QuxWN zOZb(@o>c!8_spk$Jn9 z#O*L20{U9F9rLy~xjON+ocN+-aV5WnF?W9LE=DU|eoL1m)z@X_8D@BFFBLYvAg>4R z&o<3{t2^n$)}Q}8&)$n!nlDmGSZr=WPPXt`ZyQ`mZcnpgV{JumYUy%53Wz?>VUO2!4Gx>Nxz;INNv}Rs)?AW(!MrW$Q3DWhhR8qOj>L_vuJ0`PX3i#TIZ)^T zpmYU3k39FL$vg9L|Fn)f>)X+k-nk7!MSvr=xGH~1TEy*LS0DHT$Qe5J^1k5NpYH`4 zat}E2Mzv8Htqt$&AV=u0W2Bq;*qYj&`RA`5vAtW{^5uDR(x|sOnm%c8uj0l7&PMwM Y0`{AMfs!t%$@iz!Wf-*0>4jDQ1IiTYMgRZ+ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_1.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e73499e9455bf597f1821f3eb835c0fe7745ab19 GIT binary patch literal 1952 zcmaJ?dr%Yi7G6Liind^xwovJ;i$x`DvX8u*2q6iQ)?k_h!MUJrHXD*kvN2gmfEK|= z1)ZXWYOABv7u7N?Lv4$f%Ht09wp41-65C3l45JjPMI8_=qSB3m?H^8ecK7$#^PTgZ z?|05@g+6`7{JAl60RWh@EXGJ%886|c0HuXCQ=ryC z}f@A%2N}pWp~&lTr*r`0;v@xrKlAakR%2Z76A@RSq)(;PNF!4V-hPW zfcPv$exPptQAaadY;gvrj~jzsJZ>$@$@Y_*ZJeqvNSYJgNsj9h?wuabTQa9A3Rlj#{Ly;U`RPps-Q;#h=XOC_1I^%C6yd%ff z%!#o?M4csyM_w(w7FYFAehpu*xEL{>xMma5u(Yko_noI@drjM>b3K6?IqJC$sgDnnuOIa~o4jBd}iot&=Irn=2;m;m$86^@eb5Hn97w&^p4~ z$?Yrd{kdPYy;Huc=@?It3HU|2p4g)?>I*HOec&HBSTMVGjv;+CD7oP|V`We5y6!R0 zsoNov1dS41wmzc$W=LsC>Gk?ywQ*v9T_PPcj~KosNG*!^DdW)H((W};i)Lp;L`}}S zmjNuTE`TwIVM4s$k4>z$h%R@jk1Le-kyUELEnA=%&Xg7n|D5R%av1J z?}Pt_D7r2chde*Bza!$BqZ$HtUN|sxs1XeL-}Ch(l0W+`jWvHZ|qLKy6ul2QJ{BM&s_7~oU|P72py)c@%BCSb^R4)q5b%tSwJ`6*q%RJzEP6> zI&YTIVb~g(Q&zD2e*3KECDf(Jl)I_1Q9B*O|swPC_qN zUmtKhW$Ev@>WjatOX2_tU6=g}9J`TJj{T&U`%2rNM>3%F8^=WoYk2Q?1zoYD^6*XI ztB=pwJ_){*XI2{ z^ub>hY&p8;m((Rc-KKfVbXr6+*)nwc-O%9|x)n7v19fm;e9( literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..16005a990f1003ea79408df53bddb8fc1a4f48f3 GIT binary patch literal 1945 zcmaJ?dsGv579Io0wzi@M5;iSu9L|Oi6ohr3?}gf zN03sFNJXvSBE?swO0BJm;EQdwt+3PwxZSM^tyKu>3gxh^1r&CoVEc!sb7toEnET!P z-S2nrnRj%l3qnI?ga7~#s!^--{8+$0iXeaf-4#@(<%j89QUp#Y^LV{fPaxWJ%h{8rVtcs6_7p~f!k{5(Eu?vhnB@@MOwR(Hks9{9rTjbsp-_}TnaZr@$Hbm2rM>AXxM;BWv~>d zDFZDQkuoU)jp2>I5$|c8@;iJI_HizR7-tX)M;KU4Q7B9r#Tbn98o~@lAsCIJG6oSt zLY|_~S2w?@qwy`iIDOM+jlnOTwH9sT`^mvKj%-0?C*O2|x|H;!(a}+U`o`z&>-i3? z)Tk2D-PiY525)&2nXLS&H~+3cJ^Js&mP_Io;v&-?IVWx5g}zDoBaa{VdG_Z#8a_W< z_2`>{30>LuymS7!ZKtQ{u`SH=;@tAdSd-%VfwiL(b>Dq({{0uW`E7pb(8=zmQ9nh{ z+CQX~sk0w+Y^cBgXuiCqsCa&4#WIl^Jg1F8^LCXUyHGRLP&)ES^Isb`X6@Ky4L`Lz zLVMUAup9udeVsxU5!U>)whOvLLCUQ?wa(}h*-SAU_wp6Nl8&=$Thw9ltF6;EPYeuB zjJ3a;MO{e|hir<3vR>*n%6Ezxc`z6(K9~Yxk~e8`QVIx$b`KNEJa7ijG6=o)Y7O z6+?Au>%$k7J;bY5YMeXgZogACgrB<=+A!eR&Fc4w$_C2|YAk;X+I?H!5C(ocfJfUE zf)zuL7>#&%B;w%1yxEFH+U=bKLpAuUEN}OJz9c%U%BE*~J1)nay;tA_(!(42d)H{X zP6Jr$>)+PzY5Cq{s1OW9D*gc+&F~(n4Bon`iJHMXk-FG@lM=d*7hJrE0|E+UIRO;^Di3g6ZalLk8;nd@2Z&2ZT z7k}D4W6xzSs3;;~*S5grS3M=E5rel_NLMUQ_O?Z8hex9SwDj$pK#lE-{{GiIvabqs zUw?WHKX+KI+`kB0daOUw8w15OnFb||LFC5TNnxSD!Z{&|`&)|RnO7QnQ?}u`jX!)F z{l)A58=0u6kgTgbaqUCnZDDuF^{cfnPdPkrcVW2o!k#EHb#_PW?Mxk8_;Y#LE8g!< zxz6J-1IZ`J{p$v-+DAT#tD_fN_4xR(B7Rhdxi zX45Y}Z~Yi7-8JP@#HNzZV&lGw0BRd^dOkZdvqOJFU){3CzvwEsar%xDBb>E8f9=~H zTLgftJ4^+Aj#oPk>n+Xbl-$A+2IogSr)}rINQ+d|CKjrdAMqy7A(l8*aSiA0EH#BlrYTfxQ<@-!>BQkw z+&tn1<#P0hBA{?oCQKP9H_>6w86tBi0?*vWoKwpV4)55d3T}V+EKic(CExpf@Av+` z?@3NfbcE0NspB~uj*lu5i)F_w_IcZr%f9cSwb0^blgUALJX9i1XN}` ziHs$2Lq=*F8O-5u*PFEQOuR-dCn&QJciRZc*pa#LBg+Q=f&N?uY3=Y`MD=oC#t`I!+D`)5K zZIJ+YYQm%_1kXstYhnN;Wg`Kp5CRFYSPV!}A!)#2Jz~U(w*XiSLn4U1r644g!-yP0 zfssqV2DBNB@>nc)@+i69h3MPgV4!ysz`(is*8w}Tcs zVAKOf(uB=qWlWR>aC^k{R2riYuwcqs+ilk>#cr5C}5jfkv?&0mVTQ2$UFtNKlVR zWuO!#2|Xzh<1#5E7{MFE9X8>c+_jY(|N@nY24Fqg~4PUD(8 zKV~~LPlbhO?cF5>>wJ5}p2`fDt8>SZl&HqpH&%6*Uac{CUe+aJ6WcfbJ}^A=kak5j zY`aIjSI`x4#bfB$;Pl%5fn_Bg*r`)%9+}noo$Kq)rlewUR;%~Jj?T3ceeuLA|4O)3 z>34on*`_@H7Y{cZJbRnwWgc((`uY*s+xd=9W_|i*DEF;-;YWwOdDZ;L5468!e>tY= z<4-Bnw|jT%?MV3w=}#4txe~wm3um==oIDThat<$F9hqmH#R}8ve{|$DA0Kz$;}UQ0XG6^4 zGG)a(XCnibPCT<2x|k%^wa{TTFD(>yRJRXGVuB<5nbJb_#rA(vew^ajaAZ})%=5|3 z{CicKzIv3>az4B8$L73mW2&`nzh~C>JUQy+!$@@6-6snZ)or}>!^e8A)jASXd8-TV zHf%kZRwg<`YuayKzZ0Qd*ER1nyl-9O&S`hAw~y79&&%16kW&mdt#UcSZ(e(|<^d8u z|InD)jUlohGQK%cQ!*YMY~xf-DsDWt{c!cSePi}`ebCzXYA-!@)79vj1@9<ZwN@AoR=W zpl*e>C~-=~9N@D%D;g_%eXiMN%PO)FPkoV>)(om{5KD~Rf0@= z$#sPj>qQ6emR)Gd-oxKlf$hc9Z}^T=Shf+B%V*|$-_M=U zzv7aTbU`H>S7`gR0wmfZGD3^;y?oU=Ip%9xk?ntsK-EgQC# zUvxV2a`_W1{)pPz*|Ok4bD8lU%d=W%T{x$^vGvv&OdYX>1GVka?1zT<2fRveU& z5D~|ZTPWJ{xOM%S`vEIopLFb8Lv2Yt;BnPElZ!=F57swqtQ^WeA(C}*pXlcNR^0R< f=i$q|$9_5v7{`0{R4n*^_m5H)7L6SV)qU~@gG37d literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7dff4db63ab16d65b5524967813afd7320d7c8 GIT binary patch literal 1938 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 Po`0iKks_~3She~8EY<;+ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7871674dbb919e67eee73a6335c249c2860c00c5 GIT binary patch literal 1946 zcmaJ?dsGv577hg?P_QCrsii`vgG#kdl9>s4L4c4UC2D940db4k$vjBJWMVRyfUSU4 zE4EN-QK6m!TD97Oio0rCJcxQwi}ek4?ZV266|&0XETE#S>_ox#4^QXJ%=JDbZ+;*JEp;*8~Wm{}Yu)pC1 z2v|rZxHv{9(%IFN*^-j)pwjYFjYNJ9At%9vcp%QL;2c;f76;tcl{TlstpuO?Rd93f zwh#oKny@)a@ENI0ogPp#4hoP8V2BWjM1WK-phz4sp)^j+0}v4c3t{e-La>E4hwfK_)3f+a;=n&)nZDJ`ywDM zq=J^wBC$y(flvgMK_XO)Kr(`$AQ5gt5Q3nklvpz1=S6r_BTZH%qnH$vz%ZPwR*4a{ zOopOzBq=5dM${8ntpVr1ihJI8K;@C0|+N5 z@YZ6BjbvQTIo>mRmNG^;EUPI}<6x}7Q;`*x7Z8xpcnmEvp^!)-h9NO2p&%0~l|fQD zMVKhD2$xA=a2!wmLA+;m%I$DT*eAFs#Bv%Ygfdh6y7bu_WX6{mOlyfL`N^VXtlTt7Lu#(87+)(c$I@%0Oh$zx+<+%)~vwY6M_ zeyPP&M)$9~D<>ar7X_(D`U*UMhvxBSjon)~E!%qVt!cbZz)jabo_@WR>H6@i6PH{> z<5+ip|8M;TDc8GR8CkY;|8eX|(dg^Hmi@Q$pS&lpWh}=&fP>Ai7_5t`%x~AMtz8v+87)tMo8XWPkpaS4Vx`9B;tTI!CM1eR=^m1&C_4zGt7VhsoVtLN?NXZ9V{ zzoa#1X=dm(fx44dA9U?*864fVVq5oMXu7<(G^hGnMB6?fh0KGdH%D3%+iwpw`duOP ziESDElH0AB?$X&ksWGidv#W;4D%IwWM_V+ZfqBe%XsqMm)Fno0UF{buJr93q|D`~+ z@sM0elq$cGrZw`hdtt4PsXJHux#qOBHBEjwtHYD_pQ>wvkGqElqqZM;%q!ALxATv0 zRqtHU+LtryjB(wLVP{a;h+j0n&JkMPhycpm=E2%y$~_=^r`RX>{^qQ+<(qr*E{1i6 z%PQ+1>~842*D~qYk=SoH?lTPi%v+u{x2_k^Gs|Arn+wt!c1$mmUx+>Y37s)@YGXZp ze$%=5JJs-4{@-7HKP;|$3iP=2#=n%C5??wwbYy>r`iQ5Os`I@XaL%WsZ;Sfa-k{(s zeW`!(@Yl)a7KI0k57)$`R^BOZYU`^F^^M4+=CrUK2}5gme}V`Ea)0Y;C~<7 z;wh}}%8qQxaIe`Be`Z(p&5tIh-~B`mcfJi3d60+?qddA#SSFBzwZAq^8$we literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/frame_7.png b/assets/dolphin/external/sfw/L1_Cry_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..5865e91e114fe28637c1a8d7e105328f358606cf GIT binary patch literal 1950 zcmaJ?dsGv57M`y7z?CAt8^H|&CD<~VM+TCN2@(lN4um4a!b(*plNk~qnUD-kcqkFs zQc5dIwF*md+lpA$-J+Flt?Pm`vf_~nh3!F*;?`PGURJDow#Z>83U2@Kbk5BD9&^8Y zzx(~}JyV{PxY=j1U@-syKAJdnGC#WbCu-3={(WmvrIsIF;9}Ca6qex}q>Tnt23AiC zHD)rCPNqpier^Y?0DyU=CS4krrcEFy)+{DHHe#pQ%A)~5vC(NIscf1P>gi0AMF~!v zYXOBOgAz;)*CJYLG;K7+71-#Mf5g+g&>GfDi_lR64OfhY<|MFo?H+?D-asbV3$; z(3}S~ZKrG|D`#RYLXSsM&*pJTkSF^j3$s$D-(#+rqXMJ7zoAP~Wj;S8deKu83RLbxGAemDU+h$EZ*=7@t)Kvzr!bCo#R5_at5X3CgE@9G`GbUr)T=KG5E#P)}k$ZKiT-kS-h~Pk#D*MNeQ}`nVA`Wy0xum zH{YRk8nsI2?60lfb9w+-BB_s3wu_NOq3NDUoE?5p1OY) zeoeWvaaG^%;?uN1>%;#Pi6To~Rn7OAuLEex%l{T(V=1|y0bMcpTG7!WFuQ5j_zqlj z=^O9DkRYabg&bSAHtGDKFhAA5o2;o-sikTAhp$ak1^l6G3)~KDprM1Gn{L zddB*w6O6+5_?rBEFIHc+2VZ}+!)yEHs+%EQ$7_Rpt@ENf3v1pftoz%?3L=7){nrgF zQIyph`y$)+ir>GQ5LA|V^SzAeis!Cz_1^>f{O-Td_;`W2r74)q3qK#yzqYQp2u=q= zZcX}wS)+Bg<2#Gt8@c^{r-F+AY1b~P!AFO4w;sE5xTuQlTr=!! zs6Q|jb$>;LyIr?nL*smQCEyPr@6D@mxmQL5_a60pxuaR`4ZQthrJYj0Ia(Ukm6hK0`I@7zB#UCGb;Elz-jv*_y5s&1 zkNdDd7$W#0!F3fmv3K+5Bjtv^uUxv9hYGr8r<^R3OcYcHW!Mduiwtc3$c)jUUmUuhZ zw>q~o(^Vh;NBTTzq%QciW~IA-Qy%D-+}4^mywWuuaHM^6-K)Lbqux=w2mAJor;Lxq zYBnA@yyV2XsG-%p2d=%0S;j_AR{yZ|_`yK)(Hs7c8fw06{E2A|AkGZk{c-;f(4ygV h_q(CBz$3p5;5*&?>Ck?~QqLb#6O*X^>!ys7{{eU+08an_ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Cry_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Cry_128x64/meta.txt new file mode 100644 index 000000000..e96c8d7c6 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Cry_128x64/meta.txt @@ -0,0 +1,41 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 4 +Frames order: 0 1 2 3 4 2 3 4 5 6 7 6 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 2 + +Slot: 0 +X: 22 +Y: 40 +Text: I miss you +AlignH: Right +AlignV: Bottom +StartFrame: 9 +EndFrame: 11 + +Slot: 0 +X: 17 +Y: 40 +Text: my friend... +AlignH: Right +AlignV: Bottom +StartFrame: 12 +EndFrame: 15 + +Slot: 1 +X: 2 +Y: 29 +Text: Why are you\nalways away? +AlignH: Right +AlignV: Bottom +StartFrame: 9 +EndFrame: 15 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..396ec251af3b8daf90ef7cd0a210deb6661e4d79 GIT binary patch literal 1302 zcmaJ>Z%iCT6yF0PP)ik3Z9yfQB~6NDZ~xuh-mYBX?)DC@vOwtB68Rv*?ksHJcDH+r zcaWwcYC=O43A=5;a9@O|WR1oUoA>r$XM0PXeIV_0KT)&j~PbnrgduNxua z?$jj$*VPcQ*Duqu6@>$O>!=NPkG3b3(LqH}iKd-+V^%~4QqTc-HZ^3V#cYUJu`8mr zE2ap1Ma3Bm5qVPGawi@&ZHV(;hE!;p#(BXDRlxRf8c-T=mS!1>K@U$dyvTAQBjBrp zKn`tH6T77Nsynm`5d)56i4>K|WV{*9Yuf!3BM1UTvlPpcNP|p|7!JsiM!K$GL4s+; z)-6Xj4cxT|`pjV`L?E*HC{mUzuNgMdtGPm1qq4xF7%xqwQf_D~+G(c?{!e3F?R0X) zf>akwo5Qw(u0*RVfKmD$?Z{O`Y{U**NB07TBvTnqLBmN%Ap)IvRb3VNc$A57w2uq; z!weIPhPhxs3Jd;-KkAFd_&~wNdRQjFMHycp&d0)>iw#DEcr+e}aN%f>572x8n=sN2 zFcetut0TXw*w`bnV$_DfG3}&j4i$=^bHH@W^nhvMEa#>1?J`hw!g!SPX|&2hjbwdvfCRutlR`icNKW&?pdauW4N&-by!ue;@>Pl?C=9E> zMpXQo5L7sY070suSLJ;`LpvnmVay|%!AVDFDlv_0qRZ&5NO4D7gwFTO&H5N2b zH`%Cdj6G~AYPrWc+mf+dE{B#cUH<+6hIzIoq;N7jzj%D6>Iz;a-OA;DtDQepUODyc zxg*8T_LSBRZdTvEkRKma8^@me;2(L*iC=bY?0B%_iL)&qPCj1VdXp`h|7@c7%9%HN zub(byj_=ra@MTX))zAyl8SGxw^y#a5)%3L+El2ijd-C<8vGS|64drcjH$RhGeEJT& zH(c}HvANQ7dP`;R*0K7ThM)1G{qHVq`}1~t@m#HZe6MHW{+H)B{`7g>_M+vlD?HfZ z^`YPIPX;1?UE2Rz?x>#+&u$v~>gFs_Qcr*LPUg^-rHb)g@b9rrhdOQ(Qxjh-UyN9j zZ`?XSUuc@S*faab;fa&fi5~1uwS4(k?Z>5s_POW3J6rRE^Y4w0S03#Aq~T}&KR6dtyf5)7qcBo?hsr)eTTv-7vRvomE2%gzFuvXq~#t_DqKXYRlVJ2TD< zy9+^sJlG%=`d|~aF_1QrzG!?>Y^{Z2)M_kNADY^<_)}u4HAouc3wFK3ve*aGo0+-y zo_oG?zH{z5GuqbLR8m|~j37u!q*>^I^Dunti?+b;Qqe>dPCM;z-0svBJ1v?33Cel` zppm554LX1*54>~{)FQ~15j7UK9KSRD;qaO%W7)Se#;cn&Bx9T^|^9 zXvzxTAvCVLgS!CMW7`H#5b1QJ;aBD!b#SE@ld-4_pU`eKG z*s89fjzuw{_uByslFdbtG@{WB!4G&a??Vgm*s zI)J73n-aVdWltUq(|3PIjv{2kA2d~XFJhmdOZ`cp*%2Xt!4tQv$~@Z`q8b>|!}z>G ziVBB`dFWr4F?$q%XvLME=)B91%`60=CKjYvPDe- zdA}<3yN>nT7t4oCAlkYa)Ahc55w!K_wr=(421+w-5`8KvN~-2aDxDk31uOtlO#!*l z)RX91ig|T23Lb@&X`tY=hxFm1=pk{=$8k8Lc!1w4vI;4}@N;46iQ$iMxG5X zc@@qtF%r(mjDkywN5MJ2=*9gq!-;_L0KoY%0#YQLs=23%@*-H8&T^wI;AW$-fCjtC zgl#i_bLSPr-3aggb%dFRsV^!%MOu9eTvo1ebmTIxDIY~!8v`^qchMs@p#H)B}+ z^wYnT{Zm-KV+0(TVUfGLhc8cz5{KCrjg07#vkb#{_EFC zw%o2bd2Zp~nyE7nj?7KIdcxIKQLyWQmurW{tH%HIh7SMKp4e)azqs=AF_%)-^2f2x z?U%O3SKs)42Ai5#tp2us-`iJRN0;>e!Z)k3jTgI~On+QZ*0g)-w=2uz^P{B~4y9A6 zG31lgZ`3PvJ^R?0E~JjPm%M*`aZW9L^jgzUko^^g?k#MWr8B3E9x;9d0ARGM#8HOUI`kE$C!_z>^aeLt#_3M4K3i4v8c~D5CaZpkxk6$E zEQ6w4yXZK~2OzmV;PL8S_Y6T&Lk2OfV~B+!2n|4fK`bIlRZz$Lup$t);x`W+!LfjB z#piNv${n%8%0S5y4bEON(<3dZl6V;}coEBw3CKVQ>LL~k1;bGxX2l2W3TPh}lQ=e@ zqE}h*K~i3KDP~tSh?xyEAyE{CnRx@0MaIu6qLha*6ho6Vdd&oF78q8bd2HyxkwZ;Z zgfd6*kUMm;;+47{5lFJ8rp8di8dR-Q z0X2-pEsB1%TDRhe>|hk3h}-?pa5y@YE0i@dCPqlwK#`$PJhTDrs9pyDr}0?rsHZjp z$ubyKt2GIgM9E2jQTm?jD6WXu2rp{^R2MPmP^Ib+4C^k36-PG)IUoz>Vmn>LQbyLq z*=X8nx3LzJ!^U$(oZV=5noS8CkHZ=rMjLBmO=hQ!jbkk)j&j;KB<3u3Gsh&bu5eTr z!xBvR4IsZmSni2f!LC73S2d5S1`|zCTB+)4v{H>=3~QjUT(>9%!g0xzc!dT7c0et# z7|O+(8o~xrECe1yfi^0X%s_=;jFgEGMI%Mu*Sh!rF=-vatf1x@=bt!odK%M2v=5tQqh?d)7Y>%E?81H>^U2cQX55;N_hg=3 zy))Z)X=2mZ;Hn2ng>SF8x7^oh-#58rO!rj&_}GqHdtQR2=g$N|SMPxfrF&s-P5!bU zuan0|&Dy(sbwL-5jr(@ZXV3e*;Cx5p{vB7&_1rP1tlhe=;LiJbZM*z^YXF!!G9$a^ zXYlu)>|wx9Yf0cp;XUkfXO{Tt7H8Yd6?~ph)|{R8F4(B0um8SnZ;I=Jn)Z7two0hG ztz=neEnc{+;FYT4*5tcg;F4GVXBt@Fk}PWr-|bB@PWX67 zL6XlaUT+L?AEw;;^Iv-M=(^p{t=`mkpwqv2(bmsXaeGVdi4#{Il-G5h+kXG4*NUAz zZJ+J|ncGi|5~_1s=S>;^QR?)T`8RP_%k<47K)uzUQP)1V@CL};i1)0?{O)AA+3}6e zWo|BMZitzF>h|vYpyQb@f#vqfywu=(v5Tp#!ng$$S(oS7#sIowL58mczxege-keC+ z#LNj>DzmQs@Yh*zY+Hs&O^^+2c2o77rv9b|kPNmRPM&mm;TI=SBLJ6krlYCISN|U&Y$b63 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_11.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ee82f701219ba4b592bc559354572cb96198ee GIT binary patch literal 1782 zcmaJ?c~BE)6#v34f{NmSa%`h`)g+s2Zh<5uL4yV&qGEx{X0wqHl8u{H5_D_^5YVD{ zQ$|;!ATAlCfMfCNVH&F;J94N*l1?6bd;k*;c#M5zQR5E2Z~tF^35as!--= z<`AhAtqxKWBo2w#TowkyFeH+&aRbWJBSsXP2k~GYm&2uR5sNF5@(?Lk0u5hG+97E$ zN|RJ^!|v!)G&7T;Y*G#O0bVv$;b3}QuUwOFZC3gW~f zp;GV>tFhWC)QaIFeoeIBVXWwXu~H?8qZC0V6GZk%6X-Gtim+!AHi(C?VQ97%#Y|SW zWRAN+LjkLB(zFgY#F2yr8cea&^cf0Vz7aO?a3hPyhlMN@<-;tAP$FR=Mm{bUpdurT z(jg4t4WFcLs7q-H9foa$jT93YC1MQ0Scm~JvM?jx$dZUr0ZVK^Bq)yXaaVinFfc%GmtDTS5de?38kHj1 z(SB#&O7aglKy~ZQMQZN08F~|_m{j%q{!)!Ts5E0jxmV(bN3XcDiioHMFK2@0Rs!?~ z^?z6&CjZ)_&F|*;4(H^6)Du8{|J}^`t8Wu*Y0b}yn(oj0P>iMpiDeHaT6qz*UZR2r z#-PrBI=_101&3F!csHS;%lC!Hdc&gLgTAEClDu&z8ea7+IG=bgH@_neY&To3Z<7Cg zqpicH@tje;(5ETgwwy8FW0WQ2(mLBH`ONMs+S^`N@ivB>QF~+$W@Wlcn(7&Ob)9C! zOIIg~Us4#5o;AZf$NmfGj^DZK{tXu+RPo!rzZj=-8zvXV1Q*x)oa`=|2<9w`35zK5 zC<8Eg?Q+-34ZD>^X0QO1kKQC{*go2`W@=4uvm$;%0a@5k-#z10>do2KHGS3Ls!@mg z!(wZ1PKmm`-dW(EQE{|RReZiZAt(z>JAF2|;ON7rescrHf|IP*y)47&R`L6_;CSdw zYF+@;6f+ClDN}qS>#2NhcJ|Kq?l{!b)U{W6Z_z2v^|r){s`vi4()Wxpe&8NBDPzc| zZ)L__bI$UU0!3wq`A~?fqU_?X!)L=*`M7pbJD$Hh;7jQzrFqv=QEBO5!1M6IZ95$? zV_lokyLr#*9z9`v*LXc9Egs%;tu@HiB5j*e@-+I_xSg3_g7P1ev8!jQW~apn(@mp6 zE7_JMY=5IYp##fKmx1i5Cm5GQoI9TV*|gW-bNF0nZM;9D`EIvgOYwWzyNt%OPVbH* zi5E)0f1KZ{Tcn$~#mbQJCN!Sim+kquBY$_+g~|YJ+5T~rpk{yP)m3NmXZzH|&I}F! z)p)UQeAm{+uW#u*x3qdT_FpLpDfy`-GOJLM+-2Od`Is{!RVeFu_%J^B7$n^P1;~cf ze0kBdjlFRVp%HbFeWTJ-vs0L^c3EtVpYy@bmlDTBmZvWd*NxY=1RgT^Y6To`DR>=z z+-W{iU@A?0@-ST9b9co~_2r((hW5U1^*>ze9PoodgJx`1d|-jy{U_3>6I9i)8F~K# DYC4#k literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_12.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..f3059dde7389447105b97d75b62613662d28d24c GIT binary patch literal 1607 zcmaJ=c~BEq7~g=XrQ(4yt!V4IprfOkY_hpFBqbpSL`fO}6*|_k?7kdAvT?JRpcPY; zQEEq9wG><1VQj@ZRicMKFt;H1H4;fM7!(IdF~_?kQi`G^giIon;ZOq)l=%cYg!=+1Q41yzV0e#T z@NhmfVv#Q5N(CJT$qq!}_1kPu4Eq9uxq?}fglNA+DkdaeZzQyS?SPO2{-^Ow?Lc0c zA4qaQfGg!0SQ2MS6b#e%d`A&Q$VT%z?}2rpOH3S7>IFW*YSLlwM$CFxjmlz_W{`xO zR4NQoso7{C)k>3rQe-HMa-&(LjM{h>R-uB)QW%sfvw@6YDYZpumK%%&AI(?8j{#A?9_V)vt9UL}W8?uXaC{!el|-As;pPM`;O6|Oj1&{-G#kx$d=bg?NQDLh zHUZwV1h5vK^P>GJ)_9&lK`M6=tPD7DnVeAKG%Y7^N=Z>T>68Ptf>t>R8iqfBXP-*l zK$k)Z48tE~qhSJ#%eVg@ zZi}!Xer0NU8PZ3KX2cVVj(U?0-`^V^O59qQ z5I(1HXsp9>$Xh%g8PV8Y8fI2+=su^vd3EPM%_C~ZZfko;Yma^U z;yBSY^_gLZZ@Ns{n`aE)PLXs>nire>Zu@cBgwzWc@w&^Zs?hk`X+H1DtsA>yS`V-N z@~s7{CMOq+d_Pfde0zZl(Qoe5>H`l;*B!OvsZ-9lW#4q=Hm#rZSM8NYEkwO2Np+!mOhesFk^YkdEguw=?igCaPV8-b zd`%W6m#x}-y%DQ68+P{~=!~CIg`Yj;iM7 zwS~p*KTJn{sj(%Eo|Qf7`*HfDxNC)Vi8VVKr%hS%TSA4YnN!7VJW+djnmb-UPy1us z$nAS}H?&Pma41r!cf|Ko!`35vW({xHeulkTS$z3X*}>0F7`C=gS)O@db@HOD=>^-i z+*x5QSh!sM>zGrg_9ZH>*t3L#X}a0^q_kr_2XoU;Hm1#RmNZYsPGjL0)Nk~hoQnvS eWwS-)LtaLjgqP~?eC^_4Zy{E*-Bh1ZSn(fjV@>`5 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_13.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1ff45be8dd5e6679795bd041798bedec2d9f5f GIT binary patch literal 1679 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 p*P7!{4){{XOEewP3M literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_15.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..ec11dbd035180df5121aac86b2cb9e92506014c0 GIT binary patch literal 1775 zcmaJ?c~sMO98Zf!1usB6HisejoCj^vrdKMZ^pvWVTI;}TBQyyu(59xr7Ei>9!c-KM zsn01YUXv*@byMF2_co@^dCqH_icB4w2YBLzEERG4!)IQS-|zR$_w)UJzSm2kbhtWZf%l^6qGUl8YzAt;s2 zV0!J2JEk-l zY$JVi4&&fTLdCX&x%9o;QBaX%qe^C6TwU;N1MSFhlOEP=P($1o5#b_K3X@)}LlG$| zmubafqh5C934z}P9mnSG060A^L zzy^|WO(O{tL%YFODOS1OLP0F05JEyyLWvZS3vpbE2r)T^2~kQ)DrLBWLU1npHazja z)U|afC*i{IwzE+=WE7@!pbjBQpp?)-Nhu+w#AQMyfnqp`N=Xt^LNG@W4tCA|x~N^m zwPtYpW-PeFo53PI+%z%V*c1&s^@JO_PS(+OV{2nsLUzpPhMVpI(Kfxov>uh;|08~4HYjS;NV>u zkU6h%B>cdCpfjNqoZpod1(va=uK+c-KQ69d_-TSfOEZv`F(moYq6JO!B9-#`n3CJA zf->gC`8m~wY)b3BGzvI$2;v<$v2=Uf=8-G%c`JHN{A;WydABTYrS{XIQG2^QOAu^s zx!i&swgA4OD_7P>q#Z4cpTTRIaHlc(a-Zllu>9(r9?hCvrubjFBwpp!EidiLyW3;v zGEv_4kg6veTVvuY+jKRDpl@r2}W$TJCvXZfDShRmNDV_bWA z)3+1@TZ`!E3!RbC=cK*P3(J2lC3Nz0aS?(B0F9 z8K1Acbh&g(%mw4qolDC%t=yMT`RosTc_i@nwmj>mA2u8-NczIn0rYh8Uq3WR+Ns38 zrm#N=oIulsv%;Nsw5Pw+nPLhx&GwYRtD5KY%Ss1tD~awcuUQw_4_Nrg%j&LXUEQPp zJi)pn!^5UNVCPH;a{_(WhvWV#+vb&;@jzYffQ=7VM(plCYR|EQlaD=q5oq`*bJ5~{ zjp->v6UvvxWZyLHFxbYX;iYcvYOreP!XE!H*syDf_i3^7$8~4IDbb?$EH4)U1q$$$31WB06k#c+re0!C#QsIL5G3mzMu8i=&kV literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_16.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..720e95f9e0b3efdd30bd0d9bada7ec76ab34518e GIT binary patch literal 1475 zcmaJ>eNYr-7+(+&`3f?quyk7($icnc+r5w7jRTJRh*ORjq$H<;W%s>fNAC98Tet&* z$qN}jDogud%9zQ(97AW68q;VXo5;-6D4l_^24>WP7|hHh9i{hxGyibh+1>YjpM8GM z^LxH_b9vd5$qAVW2!bR#N~{%deHlJQ@eAPlLi{!-Tpm_!RqATlr3QEfAZAgn1*pTr zyFmru#ikd(1NjKDAS6{*sa4KWPLMqsKCGh&dVCO#Ao+zsA1|x}Dq0KNlGlV?`l260 zCDDYf(K|_}&jRYCl4b?0ZZ4}7n%4=eh!qx~`9TgE@Bo!ZgPwY?p9`9>S-TwEhs6Yj z&Z?;EOxPT$DrY%rkrjX%HCkLCNfI@(8X)piE$!lk6(~hgT0#qNBd#@a6wPT_bpFDi zLq&9P6;}JaJ9si-b*k#)2qF*&XaclGR@{V^Wm$rx2#Ug?2JUb2s(cXl`m-VytiUfQ zl24UnFB-PU*UAm534>(kqVV{f&fA8){`p+NtPw%pM`$%9;qin+o7MKK72tmwch&Y+ zHu(Ti0sL}5o+;1`W3iJZ}H(H7IB zjyCAcTCL4urWu3P%<7Bv7M;arG(>FN4QsG4c6+hjZnT-{FqWZMi;(?@@5MUbd(99DB>aAdM$RrD)plC|kt zzxv=v#)h`+xO2yj?*;blr3Kx6e>{Kbcy)dmaz6Ll5r16#?@O4SF?FNPkKY=PO+SXn z%VRSGkA(J#r&9-(5QlDd+s_(`29};nyuYIbIUC=Y`Retfr8S|kUFE|_Z!727Uq85!knoY z*&I9Vem(D0+C%X@9al5bYNp@sS=Ufjwk(_VmVi&h4ok^#+cm@{^bRQV&-1OnkH$FY| zWsI*Yw7;&nBqt^Mo!sXN14DoPn8U5?dBJ{UQN}W|i|Lj2Z{PIQ*72SPP8?kO@1DWS zE7FG-hs-(YXLe CnGm!9 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_17.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..7debe764fd0a0229d825208e2b4437ebc0661934 GIT binary patch literal 1428 zcmaJ>eN5D57%v_(_(3*57M(L#3Ui|L+FtLtYr{>C_LyflU~o)C6D{pqX}D`|Z5aoP zgqh8VGwL*h%{bj;Gde%OkT8uH7d0fB&1{b$84f@B7k^A&Jyh0n4K8+`wou{{Wv7fgS(S*gipqo4!CCuy|+ z4Mc?XpaKX|(;F8+A%fU8Dxqq#I#|MrTEs3`I`&v33egBsxHJ|O#Cl+&wP3xXda;31 zXE0Qeyx2-tkPJpSP^TCZmW%gTZmbsxg);m^C6MLn`S~BARs4 z1uh>&`8gl$Dd2sKtH{MUIlsFgWn)4t#keSsk9Yfhw1s6T563$x3g*!5b}-HqHlP}& zpo$>nSF!vivD{O!ET;p()bx<1g;PyXUZ}IS05a}yk_EURI7yr-U>Ka1oxtM~+%hS^@RNAyiPR;#6iQ$i z(G(k2bjgfIq(z*TXc-q}r;IZm!G(Jynh^l)1c32i1f)na~V$a(PL}KQb}`w^e7av>-@Ydw}GC7CoU-(zN59!OOYhqB*{Le>@^CzN^XvsL7YYq))4rYm zPWINsu7kDu;yk73z?RaS-KYBD#sErFFJvy5|heSzIO$ z8$|1V*FvPb*fsL1Y&-80{RJL~)S zJ)yVESCrd%dkccDeR1~m8wVy$`D&oF>b3Y}HO#i2mJXU-gdTgZo$flEptjr)k&D z&z>>&!HkRPxO4dLPG2}{0Ia-wGxzb=mlHcXe@tvIy|(j^dVI>>KOe5nuIm*lows@- z*r$0NApO{-54cuiQ@|J;>M5R;cKG?UIV~;ebCEkklk((8pTw>IWWZm_A1hk7@jtSo B|H}XX literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_18.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..d3674a02b4d464401e7ef842b8abb289dca43740 GIT binary patch literal 1346 zcmaJ>eN5bB7%zed1U52dZjP8*Mgq8Ad)K?`wQ_^I>)klR0lA%kI+MM$Z=u4qwb$(q z#AVr%B`#B!F&xA{mi1*-d4A7VUvFyIS5)vs0fu2k!8##~)}!dD&C5pb-}2rHp=GD(Z#DO8vKa>k#5|JL z2Jv7Nw8Jn2Quiy@VKs(jA5$W&W^1UP7qzGbq;xEasE*JWR$Y_Of!GO6ybZQ1s++hy zHcsG*+aCWO>~&1&Qnx89=F69i)OS_R*vH++D6%IB+?*b-Kq%^q#7&BSP)=L zG!)%bG!;)-1Z~8_4_=G%PDv`hu7h=`~0jkV`EdS6X|+cj`e$(HLTa+5WGUbBXBO3^LaDapc*rQ zD#DCkCFM7bbv+Qv`wR$7&4_4PSEdP?Iy6&@b!a+nV=OdY5dxy3rX-cA3Z(-UprIUw zQozun_*#m2WfKZkyG%dliU ze*bvx8q;^ZICtnhd48et=loKb3#)3bF6}z*K8>Bd*}Ur~qV52@JYD*NwAlRVAEndZ zU*1tE-&yvYeQe-w{mF@zhfA)MWtWe-H|;qTR2$tl;hb?R&L}R zU-DPHz3tX(MW^m%-CCTQdS-IC>Y>P`5zDmvPs!CQ(aF)pBaeLk;g-NTEmk<(eB!eg zPu<&h(l@`9%vsj#S&i&VKb%`(?+%P#=wJEwyYZR$w%MG5y{4Y*8Jzg`{bczB*7tJO UX!F$J?Ww<7(BB|@;5~TkKMW<;eEYfKzf6rMt9kOY31M#WeerZtwp?7Vh%b|x%z*%{iUEL~wuH!&*1%pDkE9?T47 zAqs?~#+n)vwOVPbRuio;QsbjFm5S2Zh9Ey|Q)Aj-o5sd8twF^`YQXg_%VK|!-ptIs z_uTWH^PO|gnLY8Qt;IzT79j{y9Ni{1!+8k4TMF~x_gdl0F*ucaQqpU&G_O~701{TM zHh@MAxg9hES?%kd1l0(VKddK`UNY7wD3;-qGdjMMVM8>6RM)0#S?L5G+6LNnGlb24 zHIAXW8p3w6F*0UHK!?7q-vKTCO$nvHQ{h#twg#$l=D%zLXsrP@jjr+bQ`0|N)<|zG(}MG;c$u*XhxuTba`OV zp`&U-vsl0E4(>u&hv(S>LG43f=8Vc4Z-uiN2of6^fLiA zOi@xK%mf2sm}l$Qh(986ft-!iur$<{sJc2%3NuUC2wxvzxu7IPL^dFCIc(H)J=s)1 z&aV#rE@Q)Y#R?Gz$e!gSEUPP51n~~bv)m5LMrp=JqMKu~qMI2>MdpUG0gJ%VcLBBD zu?%!6#e%*H1wnwr5a$fxx7{RanY#>h059^p@aRNB2^?Xj!- zCeHr;O#6@D$H&=&wgU2GIp6rPHfrdmX zENF*G2$b&E&qF_kt?1WMX*(_L5M?9l0*;QWm^Bd^!~9!{CXhR!jb~uHrU!_*iPHqG zDFLF@Bhiu>h8C1K9U zTQa&5wXO_C>ASxpM-j0RcUl^{7tj?k0N!Cq!NdVk5DR>2eu4{0EJ(|EBBDVzWx=Y~-55fq|GIaPB{6_rJ(G@a#ATcFKSV?iBtlZD!5 z=4!)s)N+-H9jWO2{5)E|c=l2+hE=ffNHA6W>E_V2N6+C^`-HjqnThn(^pg*N_-Rw+ zdHwSKKkl?dqcf$^`~CEl*YX$k`nwx`2z8%pIpu%m%x}YuZMIZLH$4Bi@8@LI%gyze zd-uVnn-aF+A${P=$9?~-+4|$)k<=yVg6h`p)d#xi1DrKfu+e-&wov!0h_l&kc#kzwTP; z8~x>2<72xjYBO(}e}41%s-u&&o2K7f-*BwWPmUcOy!~Zla(v^ieAh`{X#KY4SM9qK vhc?&m+&_Qh`ui6LCdLjv(YAVOTVDnC-l2+_XWdPwoPSt6+8h}Rwe|l8@=ndx literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ecda8127499047c22c2dc2216fa68a4be335c8b7 GIT binary patch literal 1383 zcmaJ>YfKzf6kfnmXnD1!QT(C9&=`o!&g{&-X37?pou#a0fo!+9wGq5KbC(@qXO`K4 zT@YJrv9(3(BZf9MO&Y7gANHZv7F!dfm{e>uY4MSe+E&|QqE+z)vDKZpFq&8HS{Fd0`uaTl=Wdty0<3W27mUPWn1HbGrb(UeF~31c*)r?4V75F|OFDNdZwe8N0b zrFJM*s!9l(D={Z6LBU`QP$CTj1Z||u1OP^gU{O8<6EH%n30MLYK$wb%O)kR4aYR!bWI2LHL zI9O0d)1;!Yxin+>2#s8NUA5O4kH?X?`P}F>oi0Uk@pf-)?3S-LXBf-)dp6#`zvP$n zzNR&2;p@gNVe44let(k#=VM(9C32e~|LlXz#YE1LMm-ytDV=e0k&b)7bD@ z=hXODKb^7tT)BMcKqL3~)^+P{FYCJ88~<)%V9o5+i>;4MdsA~$(sh4HX)90WK7T#& O>vK74_+u4M@Awb%ls@>Ox*G*bua%k=SShp77Vc2S4H6K807y2r*v(W!)_N#uhJgj*_TD>f3aiBuXCCW_@ z_eDT63_u`uwtorBFf40VI2h7G{;ixKM~on?W7H!GLStB2g{}ah6>4}BYz{}A#Es-I zfrmvW@r2b+`xQ5A30EgnSf8i~3W-*M6^V*+yiDhife6$9u1DIUF-~_9^L9D3Pm3u6 zpI6aZox}pEkiQOh%PPd}MiVK}G>zL?BNTzTiIIS?88_2r6JxSU ztY~35il;4tCb>g%5{T?V6cNSmUosqxE#?YkjnaWanT#|QiKIiD*N$lc_&<$hwPV3f z1yTVRlRH!al|(AafKmGH?kKH@*l@LK7}W)|@v_hnflzl&JQU9p^7g+P_6vH1HGGn zBhJ>JiGEP*@7w-qp5Z{?l|oj%^2KXK!zJUQedyPx9{J?$Z@v2GKWZ~Oa*m(5<*J|U zKe!)^J#?8l)?NKsZIj_b;XdeH*LWaOP-^nx_s#LPL|NAw`lSh9@G#uI3Gjc+>c=W`7oPHkKJ_oc$( z-L3bE8+VW8-6KuL^XSRispRatdUtQvzGq&LA6WV3#F`daS~>FX!J98#yIj&$HCtQQ z7jG^;&*^j0AK>uxxh>44Ck19_`?ZSq_x^OMH?c1CUY4FLxc>XebGgq>L(=^88@FZG z%a6aFShfEv`1}rrw%kn33>KumnHtQWn;0L=-?6E?7t6wid$RHmzg0AV PN`U!1HT?0a#$Epb%nSD7 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..29cadd14eb86d70e7731057ce93d2ead1de6f545 GIT binary patch literal 1397 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 GvHt*X#JFMr literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_9.png b/assets/dolphin/external/sfw/L1_Furippa1_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..d192f2e344e7c9416b8b6c07fd5e249c99248ab9 GIT binary patch literal 1337 zcmaJ>YfKzf6rKf&1cT*=LZG%x2Q^}y_r7Lih25Q{tg;lBHN`|DcW3Uv2=j1uRu&p< z)3ouCV$)WljZvd9tu~EK>`Ht@NNLhotTm>sKOixsO^r1gYLx`VcD)NM_6O-?X70Ub z&UemtUh`^4`{s)B+HwrTDx$4Y9IZRh(_B`J-dD=@#?VsZM7o?#Q*{P_4Y8nNCLtcx zK@W^WpbS2L8a85B@lGw#<#ff`MA_6Skk_Fyx`ogf*4UJ>fZPWiJPCU=BS6f4HBR7~ z5+JsEVob~m!(Od*$cCLm?Fo6PPZkuS=~28fBO(JjbO4^w`;C;C2@s2RMYPY0X#!tV zary$p5~;3O2Oc(Ui2Ep(lo^J>eF6m)z$JMV$PeQj!?84rZXe0|M2;6(0bjldZ`qejXBh71dS zHRN|08@w%64BHSmrkya&{z4OU^qP*D>NPE#<0%GzFa~7J$V(dX6sRHCA@M=>Xy0`Nl+M8fsH78 zRKYLvGRZ5vO3JERB?Uk5kbZ?10OZ{e3Vwn{6zP1|+|oq_5o*o+c4aKkVP&wOfu_ku zV{>fHkt7}`#LFUqT<+Yr`;Dm!wYxWY z4>ryPuUNtCp{zbVs!zWQoB#Owm5uwF-n?4b+B|yX-V6KAM8DUbq23ri!Jnren)&g- zt{I|X&-}Ie^VcW8xnAZPtK1{KTy=4iH2(QVu3ysItIia6PlKoE`xcCB_H@am*PCaV z;gX-<`RahP}+0jX|?1gn_jzR>#4VglXT@s?u*Z|H#YxMUDTg@O_LU$ zUB7)kHhLL!2j}Pb59=mhyysZaUv)=&e?7boo4a%OTI`96aIUy=>RRCb@#kibbN^mC z+^=6=`15Sth-<^fB9?HU4Nn-IRYfD^zrXk8p=$c%<2zi~hJ&vCo!L2<|CvQ2?b0Wq H?w$VuqvX<8 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Furippa1_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Furippa1_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Furippa1_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..909cc330392b999e38b0326b5381344c952380b8 GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_10.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..3a43c6b844541f9be3cadc2aa78864e9147919c6 GIT binary patch literal 1791 zcmVnvyf3eBg-+&c%%cGpOsw&ZJ*b5*$z;l?5Yi0jy7XFZ9XH9ar)E7M=0e0a+Ci( z*H%Q2(@-5?W+Nw@07V4tJf0gn{`g#T0?YV)Y^APuj|?se z%wo3_XlwL;BVyKdU19uBz)K3K-u#Yqz>+ZSnT!yhp3gOSd--#KNP{F|$U6{2D@90T zb^8>D(e!+21hHjLCR{RkI08$a|KbQkCoyWq)1?u(OR=_A+r`sG&SQhH~mDq%3O>Yy?=Ilw#UdV2kEcJ z|1^18l+nhqE#sYidTXyypvp&LSs93c8Z^vU`HW33+N~ewYdpf5TLtFEvk_5(A@*Ax zU_8V~)uEMY?0V=K(+ynN%V6bMPFsO;2k?kg#tA&e?aA;C%St~hk#!~+rDh$W+ySiH zYE=)O6KKYX8jLwCuVs9<&k3p=A@pfrl$6Nv5u(+J%or`?YfqjRDY7JM7L}<)b~B?$ zeHJ9wP4(ivowkk6{ul2ybEWQm(Or>;k2p2`8(5al&q zytyY}m73^%IlsCRkUB)(mtfk{BVHna)kHx+<38a7k_;lwi!K9dUyt)MH=B)0bQLg` zaoT%*(X1jTfeaL#!yxl{N{01^8bNILE7L8zqZ4GKlSUrLTWVDvRdxGJ`8Vp=Uq41+ z+5(<12}`l46L=jtZ;n?9>~Kir5S5NFBkN%u#F%%ydYkQ4drt6)oWaZQ5>Y`OJ`Mn=e{w+ykX)}gf)|3=W?M5VVMTKHz1U>5SSNYaeXh&e;lruO8> z=c8_E2VfQV=CjZ?V9BvI>!mD|v$e6Bj;LCaGFU`pF-}nC02N@!COiK0SjGV~c?eAU z_2y_}`?HsC1@C|t$}BD+390pgk2TifDM+q2R@(#8Ym~#nBj6sa>Z#8^@`Vt2h+em> zk74AW9y_9HUr2srUG40*{y+pGji|xl9g;V;-(1PMQD{YLL=Yu+Rbchq{tF>qpP)7F zv*HjVa-%#ZvsTp}Wo1JBT>#tYVaG8F&eXP++>RA;vz=2-hQ>WsaWt0$j7p)- zpj3WFX|{gW=2>9s=#1P5G$+u~*NmeIijt zavZC>sNqDDO@q{vasVcj&xCt#E;7Enxd>zAis&|j*;JSXb7rlzc0C8pR@J1IBHEhr zJx%FM5b(1ifW2JSLpy=7s*me8ViMIt;}IDYy9Zk$huWcpK9WX%1ZTX z;c|jB{%oZ1Zi6I56$Z4{V-MT96fALLQ`GKM@#X-Uf!W&~!OGHyG4Kq5Wudj7EnQBL z#3KfsGTv0Ro-b4V~63n$)d(UL0@Fx)i~~L9UKs%_C951OJANj` zX^kRFmgYPwdM)05-u^BCEk2_NLItn51ES8XMTtoH>|x{~*7-iP2?)ru**u4{!{KzqK5I3i?oWoFz;UKB+%t#*AMY#DSS0<6A? zOam&Sd!zwX|23?V1N7HYc9otUqD~w!tn95s)`_fzWdBtGmREX)l8cPv zR&oHOr}r$P6JqKXSi{JQDiRr@%`R)s%MV0U8mb~cqEgc13Dq9FFv!TPESbD9cQJg&%8T&wSwN;2(4m!TUKxmF hpSXqJX8hJ#`vpJ+v^_(~quc-h002ovPDHLkV1n0aQh)#e literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_11.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..20ea12eb06d4e6d10d9dcea9f1d2c69277765e1a GIT binary patch literal 1814 zcmV+x2kH2UP)F$kQo{QqB`eacqE2AWGUy4zKj8gn6mK!ct= z=W!g@@y~Ew_Lk4{+$72Uc-$?(Zd}*(uN3UzJpPdfm~Z}ho~9?*X(XOU>cYI|vA-uX zkQMNbn`J50Q?l&C^tWWN#%Jg50#g2QI0jG^c;$wXu~n3Z#xwIVMt`^REwplgPu=7y zba;=up&CGTGtvd`fVPfC_%vnxRdT4g|KlJzKos-A@31*0d|A~mV}`;=^?&7o+EgB`89yZh9k=Sgo9)aF>9pX zVleO`9HJ1!=FQPf%Ujj~8Sk~W(Jt3UGO_z&Gk~gbFh=PWv@`;E90?Mbjg@0u=WRhe zBSP?yK`?DQ5VzC%6O}}z4_2Qch0!k)!!a6GFXOe zfsuWy0n7?O!Z8&+?*P0o!;nO2oU1qhJ9pG*BltCdt_dx7DsMA;yCRHx%)27n_=F0f zG}5X}?HoWOAzJppq@Ck=eyz1>pR;R7*}9FX3mL+P5Hf)1VisAOf!gKaqt{w~n@Lr7 zD!DrquJDw{m?VPeVx4IpyPkaZvWai0=4r?p!5az8RKi$f*(?i`DOgo7OFm|;IbUB@ z@yoJ)b{xzCsz$(A<4%v@fhi`ff~T;kLK(6=)}jkftY>kaOPr6BaaYSS1qE@Bs-~kLObpTj=yRPeE z+_<+ntu$-(`72vk>H2Y-U5> zsALN)$@7X=-7>KAzx^U;Oy~{-xpoA9EgV=i2n~_5tAvFp8=etV>JGd6A_HJc?Y5u zMkFDX&t6{{gPD1~zGx4~qs)&?K_}8~0eQ1qeh?xL(IZl$4>SMWeP?JjkuhgSK}l=( zLe#)k4`9VctH9wMl-GAI|7tOvkv#$?<=t75){y#Da0Omv@i@4zkLNOU=OJe1^*Dis zNLZ-sQS-Lfb#Wnpy*1g}HNzrMvY%Yjn-|Gx^<(DuhiBGgFn<&(4?`m`=;n7C0Yc@FDz`C<$a(Bc#VHb~ zvGxk7Vt|aGa_cS3u|G0zl!JT%@tZ;akti$wt=x2Wtd`cWeIxUFDd|{St1d>@-Ff4s zoKHpoEACf~fN_n86v~6IDxK-ON>Sb6Ml)(;tWVh~GO285Zxiw)=nyoav$rmb&f<+W z_exlDKP_cw?GlmCxYK05mJ_c7qX8SDlwxV}){Lri3!5yP^KW5X5-r*Odc9?tbU(=y2s0 zBB|u+eS6u;n*mrJz^Vjh1)JAEuhIMH{7BwPDD%iN!&6og%Q63~FHM#Qa#IMM9AFkw zYmdfQ2}VX)++s0v6HPwvhF6Tw3L{#!q-Fu5qsQF4J-{sF>S`i`4x>h4)5?0}xNJSf z0@B+o(?d2`i=)>as488%$-7xM%AT~xal9(t^Q@JNXN9DAHZYBGB5X1Dya~Z-=lcSuA?DySWym8!P?~1d2T=P8;!m}nhrs@GKcm`v&q4C~2S{{wS?p0<~k#mZiCzS?vD+n1x zWe(ZqrJ+_^cApXBVO%r%obd*ox^g{07noZku|k$;_{g~Cxj$10^u~6b0}7wZJOEle z^4SXFXQi!3o{lrAdK>v#o0I8-u*CyZvw)T8;0fKxcqxYeAiVvNsEn&-1Vm$5QiaB3 zz^wCW`TT0Ud>7zt-1;0<4ZSqbnmg;#D!5bmcU4M%0Cc+*>zlWu!2kdN07*qoM6N<$ Ef-Tf;h5!Hn literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_12.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..a05abd80f1bbcf8c4c31985df242787246776d05 GIT binary patch literal 1779 zcmV0r&z%C3U6&)&Q402Ruv+OXzmGsctVBk~ZZKW%&qr8NNGen&b$i!kXm9wELxpG)xe@^*j-K@u_K6AD8uMQ~(w z`xb|h^t=&4Xxozsmq;FtK$FL706JcC#tfH$b^uxD@SG8qsp)wmf+7lLbEQ-hMA!D@ zY587rTFD_iW3Pnfyxv#|sJ^Kpu*zty>9-JB3oSGy<0ChHSGvkv22WR1_n+Ol%d5z( zjr87cUy?j2%1Gl-%6M1jGP_Pz#*udeJtyE}sllcBk`o{|nvRnk&C_ibD^g2T-ZCCQ z0^M+=>yTPCbUo`egbiH9WoQvkL#9qcQ0@R;A(e3gui~C9h@!@rMaGe=E=rPzo^81U zXt!1C9y~=Q<3tUHL=TTLu5ylS6tP;^?Af*!bbx3W=HsnG3-xfRde`K6UBYfssxpO0 zyhjG9A~3qBR8*}55+QaJc{?!ML3}vC3Obn1S?LV)FzELctsGBv-kx@mNl}O?09Do_ zUc9*{prs7!IiLSTLuPSvfK1Edktp99S}jDJz@yHq+Q2MD4;O(_QAM9=N`8YAX!=EJ zi0qotf_k8WIqaQ$C{#17#=4>7>0(bp_5h{g(Q3ss8JRcJBt0?&(Jkd&*L6wk7+)Yt zz#uH!Z-I420}>Hd0Vy)0Z+i9K+e0+HN<4a%%e0<<8%{ela;BCIO&-AWY|cg@ z2K+`NTX;fxn>o|)CxYG+CqvrlL#sw44Xi>m4cv;rC}#6n^yYXQ^2YMqhsgED@^RK# zaCS0!*(9Lczh$ebH-oBLk;obr&FhV|YL$#!1e(Dk9fS2O`^M6HzwLht*p-{nTPAfO z<9B|mk+GT%mRxTv)!AETC#;%{N3kOx2;quYksuN>pD>ord1ArK_1gN8Fe?{nH=qBk z$+gCgc6NMuW4$#_0!=^YxUCVOHH;@fl(%wr1u}Uac~(_7MdeUED0>P0T>wh-pyMn^ zxxE5b1z#Z-rN(Dc12tR~+!UY{Sk|~%<4J`bI!^;n0abFNb7+)9qg`t`$3dc`nF9D> zX=I0%w^#54*&K~Jl~s#Gp`Agdtz1=u^vjTp^v&AyF=mz((+C{8uGRKP@Wy(qUepOI zoGF5cLqSEL70%EFrMa0_4AE=0fb-JaSle?>KDMGpiU6s5AO}EhYejKmJ?G#Dk9vJ1 z@1k-M@RYVX>`Q4!bat8oR<%?dmS^&3(hbW*9!V}b-%CMUR}IniGC(hrngX+$EBgJg}b$+bY+FHgTLP7zJw$HJ}fQPH1!1>`tv-hF8EqlmDK)|y<;mGf8O z!vQoekAyk|)eM;?YefMY1&tu9jc#2~>GdNKfF3?V&P3O%$hB2YPK(qi`7^t=_4@!+ z1JI(WDgs!!|5RS3Iw3kBtf)74W%x(-@bRHgWK*l0fWD6CWXVMJo7s=l&1ATN6X{^! zXAB(QwOmzQ15hQc-z#KB##il)UYICL>dB3y5pRv3Arx6y`nduptKdp#T!k0qP=oSf z($fJ+Gar8&=o!Oe(@-bLKJ#>{0xHkrG*Ds)Bo}K zv5Udv$mlwtkxSC$sxZDb|HT(T3o|;;>Kd%YpNiEEWf@c|AZIRu=RE2sg190cKOnun zqtfNbtc4nU6%8z*au1ecywEo2LBG^ zCriHd9ChMIAzHr>)FmU?^ z5tW9L9AZWWf6Z${t=DE#64KrwYe+3MGPlZBy>~wXRKfG`N<+=)p^cB|fjVo?8It25(No$3 zV$Y9%5|s(n9=uzC$gIkF$e1S(SCs{)h1+`p87^ReGgn?Gz&Ez?7NU5H@dtK9z<;d< Vp()s7p}_zE002ovPDHLkV1hccKn4H+ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7e0364afbfa0c0750a59c1d546dc9211c42161 GIT binary patch literal 1774 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc7f28a9eb40eda4f9d472409a93fab7f0d98ef GIT binary patch literal 1799 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b1a4fe24af639bddda8ca7f69d2bee8aed8689 GIT binary patch literal 1789 zcmVgl@z3GiqHRtsLHW&}w z$K$%L*Y(Trdf_EM9*<3yoX5{;19s!}di^Q~M|fPnCh;4e0%<>@HZ&zpfwvW({7sU@O>WoM*ky$YX;3wDS>KIlx^P zxe6WG<22j=s4hmQ;2rSvc!bY$*8fTlz4U)wBnQYsZv2ju;RW66^)iFNbN-myY46=L zgBbuF2Ja36OV9Wk5wl_I3g>?Vmi7U5Tn8)(v&M9W`1bqULbR5D0gzd6#+i56NH!3w zLHaELV;+P{HGIlE|m$~vI$dv9!vYu%Pj?7G+rU?w=&fQ%Yi9s#_r0tu|%mE*n6 z(_-|tR@u7@`cz`i(JB91`l0F&M==j*xADc%8jKr(wg=1We)+PtI; zM9`;pjA?kO+fDt!$)p!L!f1Q)dEumY`;ANHu~yl9cI^&0Gn)QFWr%r9@?J zC&8TQ16Y1|N?{!ad4^?!05MwT#G?KHl2Nhk1enGcgJ;x!WfgR!q&sqk2$hn!yAOc6 zuaQpJ2#TVtauUAL$q0A2-ezq0_=%t)FnrOdwNr|3kVZQZ^&OCt*mgMj9*gza)A4o{ zUc~^=3M;6VHCk`9SmYceH=1kd^qdvd{A>_tRLXJ~0J~Fk6a+JUhda#G?{yv+ritXu zA9J?<51jNN+9Y{liRgMpRJj{HD~-bA!9nR@rc+&hw5 zZ$GWQ-Jzd&Jy}{l*tuvBq*@@<{b5Wlpsz{Iy#B(x0dl?3RjB-SRydL?i z!EC^F&DHCTGfPvME2;f+U8mE9C6pS|-l&YvY{hyY7lES{vtyKL&h2MI*wi~d|i z^u8u6GtHeb-y%R6=nQ1pCJkX)m*}v;;zOA}g7t5;4aYKo)`Q68Z2IfIgR^AW%Md$YU4PQX zAAJfVw%> z_YZpL3GZG=2hoW>-vOsfKeL3ruJ~sHbqREG5lDYEOR?8m<~h>8q6x%wZ6(H>k1GHX zFnt|Fcb`6u*0thYKa3s^m5t4E0FR?Ea>hHiX#~j=BiVj*@=-6myL4QMQ`ZL52qNYlB>4-2RpLIZ{Qet5>g0gF=l+D8@Pp?L`0z!}JlkSaI>)>d^XAwDU z#^x*{#*S=^o}*_UB(MWI16T%1!?gAO?GHq(Dod)e&AJs_3+z~RogL*{HI?hRUA_u4 zKo^)(qp`x4?DestX1Cy-((bIOqnfmwyPBhEjejXrNIC}1-DpUp{*(>it f52u`evP=30f`%HTZ&_~;00000NkvXXu0mjfZU|{H literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_7.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..19c8181d0369a8edf52ef2124d403f5472c8e280 GIT binary patch literal 1804 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_9.png b/assets/dolphin/external/sfw/L1_Happy_holidays_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..929a207ef58a63e946d60e4413e5ad96a75d7c0a GIT binary patch literal 1816 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 F`#+JmA3Xp7 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_2.png b/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..93df45f84df55d52a5b31beee7b14cd3b744e8e7 GIT binary patch literal 4914 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 BF|Pms literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_3.png b/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a86b5e744bd7adb1cba70fcdc13e5ef53209267c GIT binary patch literal 4914 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_5.png b/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1a75b90e1508fb8835ca398a0d1ebb9a77c00a GIT binary patch literal 4908 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_6.png b/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7e148697b1cf2d268c4c2e74a6cf921c3d0e6f82 GIT binary patch literal 4900 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_7.png b/assets/dolphin/external/sfw/L1_Laptop_128x51/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..ca19b669fdbb968b7ce8032fa3597ab83b76b28d GIT binary patch literal 4907 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Laptop_128x51/meta.txt b/assets/dolphin/external/sfw/L1_Laptop_128x51/meta.txt new file mode 100644 index 000000000..90cdc5ce9 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Laptop_128x51/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 6 +Active frames: 2 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 4 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 60 +Y: 23 +Text: I have to rest +AlignH: Left +AlignV: Bottom +StartFrame: 7 +EndFrame: 10 + +Slot: 0 +X: 60 +Y: 23 +Text: but not today +AlignH: Left +AlignV: Bottom +StartFrame: 11 +EndFrame: 13 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c7751a1d4b721d28573bd3f3614009aec223909f GIT binary patch literal 1575 zcmbVLeM}Q)7=K#^mijRxsAw|1)bEe$eQ<@|LBZM=+Bb5`C0DzI^g+?2cmGGUXh=bo-imetXCP*fSWEb61m<s0S*EVw0L5Io+6W2v zpovthQ@tSNuvig;7!;6nHGy(Cjw9)`+J(EdE`i49A|y@{7(rr$1|{Jf=SQyIt55WwK}MKP_Eg+iR11EJ{F1g~c8xV-qx@p_H6V4%SC_3BeCtp66=yY@rtW4QGPqLfLpZFA%^#^n8(v@qwat7H2H@a&KwusqrMS<8Ec*M1o1Z0gwW4$E7! zoOSjN*|+^Ob{Ocp*JZtZj;5Juhdvww+6~^xH#PU{{$^yvky}@j(PZcCabs^p7F@31 zIHBz+k_hfDn%(x*?#D^<;%9!}YMs%sd2;{N(?u5#TAlYl>dq>#qcU~-c&EJOFL2g( zb|hebtF3xs0M$Fsmr^UH8xx(&kYP8<^$PIl(gAiw|A@+!_c_q|`Th#&Ov74b_ujE) z(~jPo%EfV~SHIQ2bIbXzGnYWsGyU6j8ArJq&x5XlXV)@;qirb^X6wkV(#?95gH(a09+$+Z?)Lv@%$g@53Yd4B_=Cu`W zNT^%czT{!Z13K#)pMM7qr*tXfhmj>c3G(^p60Q_}yfm`~SDeaPPd6rm3wx$zXm`=) zPHghcUBCRaWCDy5UsW_Uqua8y*>>Xj;fmqMT}@k4EUN}ab@kbtX3eBuYu;R!vA2qu zTJ<0=?~PAo2iCPx{GENH-Upw2Fz>;f-sa*)bQAOUJLaBqbz$Vkwv^KN^P-~m!lA9% avIL-5JF)tkYN{Si5-^)`jR)sD*Zc#8Gdbq~ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_1.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..20b3a71045078ab145fa43dbf97e18dabda89d58 GIT binary patch literal 1589 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_12.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..1edc9348061162f58f2ddf1ed86ffd4c7a1dec93 GIT binary patch literal 1365 zcmbVMeQXnD7=OEVr4$jPk!7Iqa)V_?uJ_U2*1N2u(7Q>Ij;5<|2_xY?-fqX%yW{Rg zyG3Bb&BPC6_%)&?E+jhsK#ajeQFK)j(W%jh#-h<6YEVLefaoBG`F2~Ue=PjrC3nyJ z@%*0W_k7)B$(H*U` zO^x6Wu?Z?+#$czmuFrz4eJyFFuS?-ne03AnnCFp!EOaC+pY7IdJ|DrS?eb_{Iwo;! zTE*##;4`G!5=ks(SP*Ln(1b!!6xP56WGWMuAxEvk7>c1unjvYHU}&CUd78y$9~}9! z)C`{znrFSCT?FrR9Fr%>TrL;L1p|iFLDC$@krYER41qKVyH|IlJfYh)WeWnd6-zT6 z&Cs!uMM*Y#oCuD%&IFM)6Nx#)x;>jJlr%CgnIs*c$ZWP0*|fIpq~O0a=GC^-y(T16 z&^CH31yv+dQwF2#-P}=05wYPnS{f>g)GZiFPZsJek6BQ13@dFI-Q_+=b{dXhcN!+f1Op6Kmyi@qFP+?5s?to*0<^U4 zP;Iu1EH<5HUYmyk&2kJ!NkM|*V1@|M!4MIaCDcEmOal$sAQh}<@mak3f73@IQe>%D z{?j|t*KbSI0L0Gr7 zod;ex75YE~t$X_a-rEF<6OOyMYkbGKiZ9RQy~PW=#u*n@T^L^fGiZt4;Ytz}g6q(I z3@E&_u(toNBVI7*tBX~D2lIOl9<5BCxUFXQN^g3At_8&>xw{J2b-#D`#o`;lS|0iE zad>=r`=erg`_b{sjxf9_dij<&pMTDu{_%J-X#KSP$eAH5F|e`r54Y#D$`#reICS+H zfAVS9V9ih*d|Ux0-gEu3&{@&H)pMh(^8Jw$ge!fPQbSMpstQdPuWsI1d93PpvBy8@ z32$Hfo6B5u+GF~Y&u)rdZ|PWi@J{URS6e|f7#*9qu@T?d#?fR;kxdv)}l+dZvj_cTh{o+$jJH9k1j5@2#42h G+5Hc+R?XA^ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5752d80e6fa14bf9a7466a6cd78ab60e1c1b1a58 GIT binary patch literal 1597 zcmbVMd2kbD6yF>`T8L8UAQWNNFgPG=_DBNR9YWJKO`Ae`M#u=Z-Ryp$X}j6D**0mN z+JICkA|Qw$)BzNS!(zG7f>0<(aj*=aBb0&^VUUTSfMB6W+>{3WgW(T%X7_!^`@Q#j z*VgA|XQ<M>AzWgk4~c$7|C3zVDz0_OK?+ zOoJV>`_e#(C$m}r1=ZOOrn-zFSxxd(cuJ6x3~)fC;UHJ;^;1EUrq?bdt)s`N2JTf6 z%S@Wbq@4C#IE@zoJXwn)42EIwWK!$G+(s85v57E&5jctyC~iOqoFWVqZh-q9jpR>Y z-BiBC+UHH$nKUJ$=%Y|H5C~`kIxR2EL2;5KQH($d0+BQjf0b9HgNWBZCT76`{EXo7 zi5}hyM=jDWzCtu7+A{QvmHehB{o!!;E~Egms@zIf&*UBW-)1`8!hW$DZ+&ljEf-< z)(BjPo@5!sXwb6=OY2D^ISF$!G##_^G`v+$;ut{~NOBU1KT#q~ccGkZK{* ztud_4>lbM+17f~ClJ7pO{+U=RO#rmW3l5$ykM%)r2`}>g65an8$B5x zt4{?wtx19I(zuWoIMT zgdjW1-#?)4+?h3}NfHVsjm)f;zsByw^bJ3>@5HrSpe6)4FxpdtF`{PTgR?huNQ%;_z9Ech|zWw))(pHkr8;=uUS|YkFsZ z%C~x~@^oHzOG3}XHyaBo!|!g}kiXot|MEB0Z(k}MT9~2#YI*#IbK%t|6#luMXRV)C9KIf2b!^3oI~&IK{8I95-O?Q= zcZG(?LObJ9Z`*q8TlTPX>(0m%A_)3NiTIT5Y%hW3`7OqmlKXSu&4=xO- zN%N+_ftnvKw;R7}Xdad$%NX7UvXbxL?a2wrpq#NuWi|?xM}O$H^lZzQsm1gD0pnau AiU0rr literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_3.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f62078f8426cceae8fdc9a4a5146da8db9ddd122 GIT binary patch literal 1617 zcmbVMdrT8|9RIadEaed@o3DW$=bW;6?cKG7-VMf4T3%~eg)T6L$o1|D7ih0*4_lZD zqHH>+Y%?xSjgN>Z8q`cp=G;cvn9)5lrct{^%wA+$1SPr|$eiqo)a?)BAG_r4`+Iyp z-|y%9x{dadf&|q(6#yWisL)(0$yVv5lnUuPr0lRsVyj-c_DW~~vT}l6nyKeR$jR06o^1H$nO+#; z*=)GnU_))*Jg$x}Z1!IgGdP%J|5C~`jI*s6~)nWueXi;2?OGugD7?C}NRz3XNhmEOEUbgxhPgJuvL?Po+vqnl?y#wU`Fgy4{h;Cbj)yDfcgp zhidyBOdBh@fHZ0v}Se_+u zCx$al21i&U=S1`b%OFOBo<&$%PZ)^|)Wy(r)Xu~3`6iQ*(CPCDB7?v%OI|KUm`oN_ zhiBmVhKx*O6kFu+i?oN~qP}^__Y~IhNGzG><7iRvIRv30+6VSJK@|LTf)~Pd8XQ_; zqZ!^4IZ2OH>3+~=&d0Ch*nFShh9=WY@(-ba83>#}X&r(RoD0!oIz3`^(o+BEU6~kX z(4o2v13ZOi|8M%V5-Dw@SN_vG(IcrLBg+S~AZ;E@6X%ge$S2K8iG0;gY0hHoR)`^*bYpAh|D1p4}xs6g<-g8n<1!85|w}+Xs`EQ>9=-!y^8ydLXXritiSf zHp2ueH(JxHK+@3F$CmF?eAT(b)I-7-Z@oL;yLW$U@kzEa_WF}4Pc%L~E&Ssjp+tDL z{O;8gWbS^|+DoSjE!}dvHT0WHRdasLeEG{?VyS%m=pBD*Vn>_o!Y3Z*J4vHTbaSuz z@m~~uC%bdkQ|9$Hb-4Ow=<>GScD0#mOkVW*czZY|VGl^^pCxEqTe}98-yWW)h7QfU z;e;HwcO9j@&F$2Twq?icX^WDPdpp$Ust%asZwYG@?ZtZ+-wvKB>&i-9qLS)1Tr;Nt zgp^CuKJo`PpSF(k)aB0N@q_i4KJ)Fwb7`sz7j$=Zi#LJ34xj*@-nq-x)}~ZPe)2_@ K67x}0P1`?uJ3A2o literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..021e0582200da47411a7dfdf078ff4181342c13f GIT binary patch literal 1544 zcmbVMeM}Q)7=MqV0xCooqbTTkIK~3k`)EshClyM|M;D8v)={Gqu6J)sC%voJLkehC z)Xf+XG%oYw4|N|-WRB>fbK;^Ehg0WtVwU+4GtoH%bHRONOEeq10(JYt_{T1}d)|-d z_dLJn>o!$Zlub^VnF0WqY%jMtRT)v=q9l#_y`R+XP(`{@;#L+*UZsJPA+QLN2cq@> z=Yvkj35}~Rzybg?4SttfaXS{WycE!KF&%9<5LD3s6cmPo9KRAOs0aG|q8S@Hc^X6g zf*GqaI7mm(3Tyr4O)^~ERN>;AR`QI16)r#v!mMf_02K}m2kOKS8#ZGjc3E{DJ0>u6 zL`7L?#zslG9hIn6k|Ao;QaDeNBx+=|9@1;_K!(giX_BT0iY6!nPE#yxU?~GS_F$?% zS@5z>Tj`iLb!WzE6(z_LL_3`3AKLDRUZfrlDJg$v_iC@XHk21C5; z4=R31L}L~?k5sRiF_r6R5P_h>@zk&w8cUU$G$PCe2}(;6fj}&>5$%xTg#Xfbrgq5H z7=(lqhNOC#S1aPpii6ecJ>OAGQDws}lKpB~xH_A}*9V}e*llJ^z0nGOfu%hZ&3kwn z7fjHD>luN^O$NPy3!I)YG5MsI=eW3?XW>bTB8?>!$uRjAiYl?1^j4#_gtF$FiY=B> z#umrg#gM{@JdFGHtG-9EWa)FUtW}1bBFQdEs*CqQWv!%0p;{@3(mE}T<~TUsFUC$@ zj#X(iXd9IMtD#UTO96Bw&8+_!6et5jGbE?ONd|gxJ*Cs*CJ(3fkKSvfpg~9K@(tJ+ zUiiQ1BUDmEtXKZiJMkm6A!Ey@v!HICP7@T>5t7we8R|Tdt^6%leDmSXE#g^p(uVdw-x#n560)!RURd~k0A4&=nz`neD>qUv-YjkmuP36@ z?-&#IRi}Xhv4x24O^kHsgGndX*KJSRS5Pyq*7#HP0NA~0R?+RDrrgOz^}kL)9#w-V zICn({)?T0S;70%E&C^!Qc>vlRGeBNWbMLiBvjLWyZ9}HFwkCCD%8Ii)4^Rx5gzS*S6CWtMauTPgIxZ6f%El4zb`{p41b@LGPuaRK37>fKK#+(wu%Ei z7IzDB=nqZV)E%!@w^jEXo>X%ztJuIdM}ACj%{epv4*m18ednC%%fUd_teQ^vmh)a} z)t<{aSkhHl*fFlVytY59=WzDMbj?>GgpE9oMw&}g!Lhl8SaM|T@!2gtV1qYjYEB`m zyCWbxVII|6)i15XLAL?v?YV^<{qk~J%Y}ZWFj6RAO8fd? zE_rPJHgNTRTU7=)bL6$(rnG%(IqlJ&`?%`O_qLN=9pi!z;Qn&&HQ>9jF)3$Y`HH;o z(1gI?Qd+pcByAv>*4^gTPk_peV~^`QoNF>%Y^sqXe2cV+uKm(Zc^lx7I?h+OIH`_}pY+c1Q>;3^BLLK!0 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_5.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e88112a8ae23ce0c59cf2dad130af731798de6 GIT binary patch literal 1523 zcmbVLYj6`)6uxO_ErALGqE^6V3)BLeeWYo#OG8t#4U}n0ED@qip_|Q38_H(GW+7=9 zAQXn-F$jpG41(n;B3PIa26+gvI*e@@o=OLWfr0UbwA7)1FtqiiH0Te8AMVWVx%ce( z&f`1htaOx2Ow*<7003!4llW33qv*AyYSH(X)U|dbUQ-KQ>QvdQh6DwI0*~y5Sdk=D zz)~o9s^>PqJOH#IpVOtf?8TfYOL`%0qYp~~ga#llKO7LmDyU*^SmE=V@jJ&(;+W54 z#-|(Yls#aDmA*+41x}5WIK@bn$a?Vn@mOA%Lk=XU3Rqa0;}3FSGv4i&L+7}f#IbG@ zwaSb?Ny=q+U{+aySgxKXM2e!YTvqR=D<-Yt8%bX4q%Ky&tPxb1<~h^YqH{9 zdQvnG72ka5u_>~Ib<@oGo{<7=WEqwc3&x%%>bm&RnicA{mUD%tM@Hx)t1}nAc(FA4cz(gKVb_zxn$8T+ zehW+gZ&8Uup>EQmMX!&b!?87pyBr-&ohU-WhFO z;gDwBs2!|dd*$!8KS%6|y*>SC)&XO*>`+ztfa|x%)HSR-wQS=L`P-sOJ$&QZ^6|09 zCxC8i3Ca9r02^kkejRv2i>7D+zSn%9B>Dw#B~wFszkkq@Qr`tw6s z$?dC~_wP9W;pqN{f9?oB(5%Zy>9gpAU3Wj;=Nj0MHd$&*smKQ#MqSwgOveWCE%<^d zt@Xg&Z*N5R;8X9(WXG*dtu?df=4qndY4@^T*>vLI3#qrP7q1Rim(3iob=>_`7r1kE z>v!0fj;Sx6@Lh#=l?ATJ0*fav-yhuhS($C`#+x;_zd3%Gs5*Oo$59|OTaql*M_T$= znl%t3Q$y7!q-hGulWZx{3YA~ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..142ebbca028e5278af20d8ad239d516fb172cf02 GIT binary patch literal 1555 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_8.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d307e7a27cff7b80c61e15a3a80e52d80af0052e GIT binary patch literal 1479 zcmbVMeM}Q)7=H_h)QOOpC5~lso}%Dv@1rgBP71WNNH+?#vI+Y@uXk_hS$bEmhrN;! zt5G+TC2Vef#5u)}ZEiUC$KpOP5p;8=i?A)Ah9xqMb4wP{EGEce40{XI?GNK0yX5Y9 zKc3(7{GPAd>8)RtJEvd{03g?0>+~U+KyOt}Ci>pY>GB})wCZY7*T?}i#wifk1=$ZV zcbIF1KFA62jY(JzKxRyAY*L#%bu2H3ja*8{sD&d44M2IN7UB31R53qn6(t*f=X4*A ziGmGZYw?htNHq+KwH*pv(^22ZcZ7IGz$+`Ta*ag>!cgTfE!-wWSbxh#c zl!_X%;nSp=JYK9?Rv=bpqzpVsl2{pI^pgRrA2Q?$j3#M{plE`!7-)*6Ei7fhW*!{* zQ-lEPbJomwLpvKDRMiMe5V2Uy7&94VrInx{+8p-m2kDYa9StJ-cZv)Ubug=Fkja~b1E zW8G3z^0FG{JCl2nzZ zgLXni+ysRhMGj+AX=cSoP@pUf&5)eQKr%33FjFS8!RqHw|Cj@16ttK~Q>g`?!3+O4 zeFP#!qdp8;uCtjGp8YJG(O`HNJGK;&u;4dk^n)`pW%uh5I zUEIdyb%)C5U8{9|px@EFh1u%G3o@!E&lu+{_}%r^=9bx@_b+J()WDqk{aGNmn_CzE zX3KVPVIm%HE6N|g@?>K0+%V|ezUm#ne$Tc=t$UA^cVw14AIW#J_~4ecy73MDo07Wz zU=t|*ySaX;){|+9-Dpex(Az^D+jwqPf!F8g)Y=OVJyUaU)+^tA)w06Io_udXmNk3q zz`VPlcxg_3Va7Esab%=E>1@s0-`z1`0!oH=nM2C*1{{)Z!TAHG{G;H_UE=#6TV8uE zL?1r>Nz02nc1Ea#wtV6|7`?u7T<}-?(Rl~F{Q1GRKg)I(B)W^A?d|+}#Y$JY* zhZZ?U_w^I%rC_Kg)H8Zz+5R)b=Cdbm?p9vEoxlInqRWT%LzgStR)3Unq3)KE8L;-{ zT^?^PNoHi-?LR(NIy`VHzW&KUh;p_puZ&%FW?y$3S-(6U>;lW7$#2!MI Z4IFz58h$>#wJG&$b-U`FCmrjz{sWQH1k(Tj literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_9.png b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..0d28a861564508c8510dc8d8de27e2beb901ce17 GIT binary patch literal 1382 zcmbVMeM}o=7{4+=Krn>R1h$M_4##lrdLM0R??UCHS6s6dNht!0OSs;>g_E{-yF2L7 zOvmQLX|^FM$@Yf>jZK6^Vl>N)3$u$eW<#@tsL|nKOcb`nxR{Be`@r{rqJNP6;U#y^ z`|abk8w3F_4ji})Y7t~pLJD>09f7^9AjfRHsbe!@3PdAFZJnX;LNCzKFzA-z9_-fn zPcT#xJy^RlKn4^q=#h3ORnVGj4hhL#ff2E~C(v4hg$80k=TRdTjccso!B*_DaBUtF z7`mdO_j<5ZQXPR7)GMn1b=fFfAW0H+F}5%nafbmz?m}sjrU;5AC?`%+EbU||C%X1v z(4Q(s*dW)m<_+#VSdXqNEI}j^30uN$lhtm5Vi<-XX@aJ4sDWz(ah*5txK^35zyVEA zB}JFyIBHtt!*ZYQ!64VwAYw`&ux>c6t)&VkjWBqHpll=&iuPAKp-G0RX`m>dx6#!IfnLh)@{&H6*O$Ti zHsfDar5Lcvr4N$ zb3m2)f!L(VF?1!(th50I%E{0S$=h*~0TJ9m*&Vn$%)|b1L|hbb+DUtj6I;WJ|2KUE zBt@9L@}J(x9KnV(m+P|tH|x^`;&6miI4h4^Un+ugmfNy7K5BShMjrF^gznX?*} ziu`oyz3dw|q>}oIzU02bSD!z0e=+Oe7UVY42xgy|OrjqnClii))I{MzR`uHxd54D% z%yZcbw-(#dKMw8(OWR7zu39S7BV(7223wbqyOC&B@oaZFax_?gb4RuVg z-`LvEjdZ?Z`Kfrk^ZZBlRMzDe@8(-3KYM*@babX5?}e+k`>xFVRd9(E>n0ZZON=)k zc3a*VK*XZ@u^~G$biFR8zHIS++2BxzmH+?% literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/meta.txt new file mode 100644 index 000000000..876003079 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Leaving_sad_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 4 +Active frames: 42 +Frames order: 0 1 2 1 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 11 12 4 3 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 51 +Y: 49 +Text: Adios. +AlignH: Center +AlignV: Top +StartFrame: 6 +EndFrame: 9 + +Slot: 0 +X: 1 +Y: 49 +Text: Forgot something... +AlignH: Center +AlignV: Top +StartFrame: 42 +EndFrame: 45 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..04aa17ac07fb2fbaebdb7c4ac1c6f8fbe1876b4b GIT binary patch literal 1556 zcmaJ>d2ka|7~domLfUdnOQDowSyU*p*&}I^T^n0+w1jDB3}J}cKf2j{AsM>6VY9WN z1Ji(I#+Htf&M+f7Vv(bc)N(i;C`dR&=~(ap6x4bEe=q`Nn86XLQ(xK!`Ga9+cHev7 z`+nc|`>t*CEw9cu%rqbflJ8mS^20R=-%7m>ey{0Y^TMTAbqCcIa#(HR6o4!dZoML20uH7 zp;5t(tt#`9-k1|aqDz|{HX*VwU9QbDf|b;=4rtwsvxNs>gZj4?!pZ6Uyri&2`SDT1O2stl(omM&wdGIZ?0 zpg%{f7)MRWj8D(WPK`{(NkTgNlIMl%7>m-#+;8J{k)`APf zc_kWCqq2l%EOH^aQMF@`>u3;S%EX#(aOjgDOLSfv@GZvgHGly}8<~ZCGHi0kzq}ggQVFaW|WIE@ePRfd4 zduFx|CIcQG%odQ~Kq+u??9PI>;M9%x)dbvd9UdOubLs705JX$xaV-fXE`Pm!i*ypr zbMGG>?p_srUiWvK*a`f*i}o;eLvt#x+`Zj>Zi0De%AHlyk!!scq;G21O?_wg))xQJ zlZ|hl?i)M_b{UbM|7=Wpw@pS~X&G3yPdkL)>TB_J_2>Exc~V!y;C;h_Nri<6kiB9v z;wkw?Q?;Sy{j&?xzuH>XzM#>UO8@lMYAzi5V(8LfPW#>K#Y1gNBY_#6_(#=_4^AA{ z8J^HwE=*oG&?lt|#ss4){yD!%KrOnrDb%ylG%J15r+W%rlPm0`| zoIP>ddn?MP@5oILes9<~3)ywcBF@uy{g}*0hX37QIN-gmoAeb@S~BJ7oj)y^8ku~j zpp)s&)kbp8v=ygzG#)KFI2SqFP%sOv_#rm)TvAiCV9&(l%AP-ZZ0GY%eR}mq>lwqQ zopV0q>yAyV+#BBB61<_+|K2q&{mfZ=YZEfQ_3+LC-PSku&#q;E8#gCO^`G*W-gBJS z1dr8CKtye8UtbmCSnRrq_{yiv0G(w0ZOtboNoud3eO{J literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_1.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d93b1f588d42a88503e2938fe6590228afbf85bc GIT binary patch literal 1580 zcmaJ>eM}Q)7{6;>t$ZkcMR1ZG1(Pzl-em?Bmdx z46_6xE>UMtvoK9`7_-c|sYqOAG$Je`I5jcr+}uK ze$Ur+_^KD4O}t$&tXhebCK%N~1jsCsh-`_*nS{eIWtUO+DKTb1 zrc~r6hhdsjo!5uBLRRfK;MrAgEM&pHP3vLkS zrEp9Ri%}$Hk>$j#vcsTqoem-r^Ln2ej>czFr6vtaurZ7<;aDV+ifl?dF4uzpX*^du z?r)6&tQN$@trD+RBv_aRtJ!<8qm-h`hFLF#)v~Z#+#KXS8VDAf#YO`T&mT^gdl|{)fid)is;0uYe7!QdtgrrO)V)U|nIGU0a zr>Zm^v>Qm_Z9u4y#0WB#W+wa`3OoUL)@r9wPQcah?Y1Cl<8d0rS&Nmlup~(V-Y|m~ zo=M+yqpA`$j98itLr_*b1-Kwe^L7i$n&}{FCs`Jyf)oe>fYVkBWx!O5SgLcL>7=ws zZO_#9>13#fr?Um3>Oe{AN+_&*?Z&QEeO)A@VHm|6E_Fz=S083 zvp#t;IhI|w|N1rb${2|_fBx!laR-y}UEhxmW7Kx^Zi)- zZg*Q1e@A?9YJ&(Ru1&y2^(!Ig;|H4>@{(fn<|kThq{hbu^x8X#i51K8uLlM+c>aji z_a~e`aH;e1XrAuj%fHP&lBaat{hTnxiweU+B`do)(!g4Wev_==x-kMHS7A` zUK$9@8W=vGFy78OuK&>JgYnKPcl!mUEAtwX?7h@|;6$%OmjzXb?ehwcEf|{kVBSOM z(5`|;<#32~j&c_Vz}`o1@=mn!bZ60P)b0k#o|M zk-?hzocpd8Dd;7?9fG0dFy4Op%ytU8`(C2@Ang3ZAK2qL+b|bOvN<{2gMYS_?)fr$ oFPjFi*|_+nxBC0%CMy*fn&Vk~W$!XqU+VwuDX(_-l?Ar{2aXdbAOHXW literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_10.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..47185499d7ac7d13e9c24210e59b912b8c557cb7 GIT binary patch literal 1606 zcmaJ=c~BE)6#qgv1*VKz1sd%VwAkt*_f;nP;A7} zT92Y_ooQ7DWU6$$>d`48Dxua^s8XiwjP;=7fz`I&w{t`<!MiCS#Cn-6p!YNWusq~}@8+oKCo`-el zt){$@Xy}$9trP^eUM{b$u9j6RWW1+BPU>_zIYG%O3P%>Wx5g#VKHTL^4S6s@FXQ3d z0>`_sphw!yFAy@Mi0g0?PPfJK%(2TmQYut5xsP_sNf{w`I)j-FS$hR5{GY}Pt-Yl+ zZYZ}xFTcRUppH0FLts?Bmj?ba~{gJU8t0(L%Lptns zoM34NR}xTxYqd%WSF=jUsD20r|rdVi(a|JbT z2D>zzvCnx-fPWTYc_ z_PO#64=U22G~6LJdQzd$DWKhfD;b>{r&US^uA^ugS2z^V0U@E(s1;HKlOnJkHlW7l2ywxcQYb^rSSJl-+NKd_qu9~=Gq@aZ>l zo?7&uv=>wiJh{WPE&g0(jSFgu zL>qqWNSh%sRAgNf@0@V!l{weMooY*Z<{#GM+{tN0?c+{e`BS$!wZe4h`mB`7vuiUg zY2d(_ws7LB#g}HMM%a2*1SZX1uP$+wDJKVN_U_nR9yLbX_jp&`qlEb7jgE~+4#pZH zyUFbb8ZZ4*2XeQXnD7{6|Oj0v*9ro$0(-jEIOzPo-L>nOAx%&bthM#hKI>)qR}cJ0;cjdpy* zG6xAPaRdB9Bby)?WX=^q7D#M?2{=gDR3c-7D1vcA7&<|MalYMF}Bi z4oUzoR=@f+$VZUmjc$9HQf4jY1j$SAaUCM$^+Pm*aWRRZ zLn?~LfDMx>v)WLTBm-1S(6~TR6spw|PRgZo0zLIS%1{hV(hN!G;S9|&c^sXGjyxFj zCyOqw#9TPy4W0~Gg`)U5k_-leM35yUxtyf+dOb-oB*WlP0}oXD6h4Ie0@(=*W)Ki$ zw_kBfJ~VETcS==?0fStJgYf#T)(3`tfss_fq>&-sPtpWMdcE<;hO`4p3HYDJBeete zYCj-LKtQUJ1y~VRb^;8u_jpHfMaYI*EW2S@_)4=RRC$34b%xckHTwchNTNlmihENil!|lotb4!7Mh~jLWVZ$ zvwOE74zl^5K;xMXI$ zO2a{$f$Uxl#6nr}qC;us+>f9j&_Lj|dNuA8DHy(9=fZUYrN${~ZWM)2Z8 z=^JiTD1l-46Kpt|)#_Q`bm3}2ufh2|wF}oXJdd+37PtVQ)LIRTk&q%8@0^D^DItRG z8Q(sb40w1jTfhegN`{kD-xEC!r*4d`*lvOA;Nak%?#4?9k~F!rmJX+sLwx9a-r_}IMSpdNc`|q!uV65wHTpqn? zyA7_^4M~Toh1WOKChgqXqkThF zQ{YG*;G)gpmD7Teoi<~4>EYgV%J9DZT+Xg=b>p%tRhO!#Pv)}5_tu@?(b;pwwyOC> zhxV9$YIxRY;)(I9>6sn7V^3P5z2ARVbM@pG!szqSGj)e{^tXO^?dGJbr91kQ8pe&I z)<^6cE*G@TC1$t2^LZr6jx?Pc)t5RjYIS;lM%ucHGfNz~O`c=>s)aj$rJ|pP*WJDJ zo07I|@P2XbXKaB()jI$5fjxHPlJ*S$*(~JaxB8av3E%nZLRWKS_msY6Z7V=Y+6 zpzP3<6m{F3dwZ1^Ht;jvbVbHAwK!cX);?`quPd%kK{5**o8IeMWz2LmBRzkcf^S!b z8zy$12zOV}9SaVcF!>1KXZ4ZR1?ueBcI2fl$%EYfa!hip?Zhk<^FfJFe`r)gU&i)7 z`_r0~3o~O|Tjos5IM}xoIlXDz&zF_`vsInm<+m(%apaqm2i9hqkfzayJx5yH;z2&j zskPY}=WJBcYE?~#ZHcKk4{Fq@jv<68WB>1G!tL?@bdhC|xn;hi=0BN`JI4S3 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_12.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..15ded267251deb5676fa24b1633c1e4e280fb0c3 GIT binary patch literal 1541 zcmaJ=eQXnD7{9jb7!}-v6&OT!+(16Y^*;J}#|rJ%b#0`jmIW81!1eAeJGS1P?TwZx zrkEfBiA#)x4^hE@3t^%eDqkUh%M22dA)rGx1+xK)gpB}V95CN*EAj{7lDp@9pL>4K z^LxJ5hk{jO4U-KBf{gY1JYgu)@O9wt!>8N20--6RTBKg(Zk&GHFVhO>%rWK`{(NkTgNlIJCeMt0a|6;ZmX`>%jvOd|Xsi zQI^n*M=l~as7?%W9Zn*q1Oks7ONo(E!J-iQxFL z!XP0x#Ch0}Xh{|ftM~Lk8AHg1T^JW(Tey0U%s0eKTpEjyybK`RcSA$+$2R+RyaInx}uUIDYKWRJPvyn z>z5KLC-EQ~TZFMku(qdS*@`&eR5@NP%k|kg2-V7}oT!x*ls21abY_6#MJc11mFd!O z(jE{OR|3Hsmt*KqnOX4(6nF~ooSm`Y5rKs1Gma?k;7JQkayC0{<7nCpcx(hOJXXHp zL4_KahLUB&Qf51229YRk;TapwSuIhVp*apWN6jD#0BNz?%oqVF5}C<)Y?87nIG&l~ zqs@SqN4o_ixKMGpIsTSi&2Z~-Lkp@ap&T3>-2Ka^zaoe>$M11hr!IDHUGu(fYMy7^ z;NYJ}gs#Kir8gYx+#axrvCY@!Xv40XJ-;W9$swhrx5}9A^%kXj^Fn{;eXwxq;7g4& zl3P!lzS|RP{tcQ|f7J)OaaEtmA?2R<9~_PlZ4yZXEB*M0xcCm3yd zwtk!bU8J>WgVFVsalVwYOzeKf8+y=m^_>G_OAi<}He;ObkM^6#P9iI?o!{o)Y`Rvs zLyNHE=9KoIYW~Y`W^KvN^o#vTcOtj$QmOH*VasbsjuGj4?!w~Zx@DvM6Yx#>cRGuT zx9F7ikYUn>$@&(8J#@MC>^?@HySp`?EZa7E?zUU8%Y{pWuUkf=1-9{J-5uKX$h3mM ztb(fY{mQ`?+?vzhe01oO)j6)~Qp)?925;M&~|hQ#T4+qCCvRvmat~v!N1Xz z(PjMN-uBG{ZIS2GKYiYJ?eMdRPwQ&QZ-4N$4w?OCn>f{j>?-|G@A`iFZl5N6AvpTh zCS*(N?G8kkZX6Sxpt)g7*K2OfSi5fB`0nB0(VT;x-w3Z(o@<7fuG^uMB$j Il`nheKjID@Z2$lO literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_13.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..13ee0450e23fe651e38cdea5d5bd816c8ed3087b GIT binary patch literal 1545 zcmaJ>YfKbZ6uz!*MS_V{Y>RE`bg&3*XXmlcnXo+e0n)IzUDlQuQ=Of;%dWUP%kBUR zi8=z>n5v}4rqRYoV|}z>jrCCqMnPi5N)&5ieHE#oO+_P`wwRK*y$h`MhjEgbd+)jD zJLfyE+2|}OoS8f?82~V|Xpzl@Rt3FzNmJ4Hc2biAEorj7OfHqYat$AbAYYU`5GxAs z<L;c}8@S(c<2l3@s>K}2eUG9M*^k@SQG8;l5H ze@OOAK`d^O_efQ;8An_vf(V2hj;Dr$k;zn{q>)iRMA90H3&v{5rTNiiE%6dRVlV_)eX{Gw}mn{s6EPR&Wl8A=~2oU05Kq$xv5&STTgF6oJF z?LWJ^cg3B*2Lt>1LED|tDX%Qa0eQ=JZ+EF%KmWaVPHN_-_1jdA*ZR&>6sJ7u+@R7Z zYkFVK`(^s^>;K$sT)NZQc||*a=Mr$FvufAntbxZzOLK>JD|O4=T^Gtv`PSyIKE%yA z;RtO3&F`-}r?P?>8$9Y+jkkWC*>t(Sx;yFH*u|wIhxpqcZhYv@I1cI#jggG9qj>-Q zhOt3by&ov&r=3eaKKy69Dtqq2)V^tJQkR_{xVG4~ZnyG{`oN{nup_6FuO~;r2XCb? z{Mwxl*RkM-W$&s}?3-09`S!p1vPLTVF6j4xn@_5$+0GGP#y#Ip-C*yO*#~+SD0x>l zEvz0>S`YJcE^bp*X6QOfZoZwV{8+6$c(e)hoOr!|Z|0PN$9XAO|HFYs)#_;XgO)as zHNQDcbGN;9H2+lEwZoe_a!i-fU0;!FXDF2orBjE-<~20@@kVFKKApOGW!J|CuVg)< zYj2N4`WC70jSiFDEucNes3%81In9BVpO3lDtH4$;YuH+udmkwM29{_{QsnjDgPyjp zQ?v36$4V{Pvq5R~lQgAuTYXnA4srtlaPQUiUlvAH?fi}4NF~TsrGPy<=C-`K;Fcx+ Ob1t%%*uJx@sQ(Wlel_3# literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..32c0a1b9b50237f972e47318b9cf28fe57794711 GIT binary patch literal 1558 zcmaJ>eM}Q)7=NKyuq)yWZeZLz5Bym4dS9jORf@GON+(r@&4l45*Sojv4SH9u$0&*! z7?(j*Fvbnd)ajybiJ!}&b2W{t*U_#R9GY$suUyEs0|&kYgP9#F^(bw zDoTY79VAuaDMFl*3=y+|#5jT=5Hn-&5q^sgGQ?DbA}A6kDV)r~DAG#hSjik@=s{I~ zGViw*yJik~Q%^QDs3>78j@Q)G7;0#PBnNPkVHljCaEiiI4J=YCDr^)JBUy0^E*Rlt zA*=|Jh{PWzUHcq`%KInwX* zVFb@|n2~@qX0aG4%)}cZZ?c#yMre%Nc@~}~au^rsU>xKOf+X{u78gx9^GSlFXHulg zVvb|oVnks@4#s^8s_!AJ<+)g^Q--V}$zDmSjQ2rNP*S8wPzoayZJ?0J9+nftnB=us zl?H=$L0NbY@-t;AgbbwFDm;S%M?#J@Ge*qE6KeR3#gADy!iW*9$xNA8ilQNh4&nKy z(l^+sszePV9A{%CX){AZpC2=Fj0t0NjDC!vSQexGH1tDA7|kXc#Z`)UtaF~~q_{|J z&)D|KWT=NHvjs(Upk#G&Mr3an)Tz@J6?*g4wZFfA>%~vI0Z1I}cFpicyH1r37mpDs z%lh9x@KIl*Mzi*)@V2n^n4HnlkkH!LdH2rQ+nUt6#@{&|=scbQc8%ZkW!B`4jwKTw zt^URn_-*h0o99wNXWcma>T4R%v(QL))bAVh!=q&F@y|9LYagYJE^ci?(u^75Emsbo zPO<-#T-Vf))0 z1$uUV&S;YWGIzK(J8_ckYH4pt_Lai)41Ex@R|V4l`L%h=342QYDQ`CT_U4YZX?Y{* za=)X!-a)q4uWM{t^U{J{N4}dz>3_bL^2g-Dz5W$%(PM|P`N!Aa0K3Bu`a;5#vc6J2 z;|@LkO`mQAw^F#f_>aUx_u;M0y`b;x-IwkEzLOQqy$=-e^%p>P>FI;MqK9I^pFMlzqGjbt zKOQ>Z2IZ|^bxfa1fdXexbLQfNB%-RbJ86#{nLWt_>K{+hA3YiE$<^Gd-uCWp4f;3m zw*8Vk^7`h}hcBmtuEIAm!TQyS*KJ!{z@`1^nGY;1{c6YTvWk^`T-p5Zmv1l5Gd&*L b-U2jWjB|9i{hGEn_NR8|&vET?lrQ}cDb**T literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_3.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..93593594e9c7fa130a763fc5becb073fe8fe39c9 GIT binary patch literal 1583 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 bIF&?(B3akR1|Keu{ivOeGW+orRW1JkP{l8a literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..17930e075838239a97b2055f0449220f528d4dce GIT binary patch literal 1581 zcmaJ>c~BEq7+(^DfI4dNf>zxwvBkm79$9j%1QQaDI0i99i*2oLc3&WcWY=UVfdN?+ z?V*--TBl>H1@uVkz$tYnT9lEFA9!u-(U$ z11Dg(+T~w^90*db@w&>yGRHic<$W3^rlSe@1Q`uMIdeh+!&U+jc7t-S--O)mIF7(x z&V;;_?Z6#^6;ybO>H?s&uGq!aRkB77nUf3WglO4-4~PsL@>ThRbjXAZ+NI@vOpGD$ zpo&;&LWW3{IZ9wF9{{jkL!c~<soWw{Hl{L^{tzTq9s6Utyw_pQ7 zHsBRRFYkwA78y5REt(LS>rfCr!Qpsh*dH8Dm7Fvz#0VIn!7-mN7TKV7P;`R-X*^Lo z=&BU}<^(~$I>5>m@npooa`v9?D5fa0q2~v@a#@%v8_!nzfM2xROo)7=;k+D;yE&Hd zxZNnuF)T{qK#Lj-6p89M3UE4u&OiYwZs$pON~^b6a0{77Sa5>Kw;F6((wa};gtmYr zYzBQCYxf65#?OMdZ?Eio7)v}AOIrhg5&3|N=d0pMC`P$rx5phl8mP_0J`JOJR7UZ+JcnIabJoX0vT zE|S|bwtX}i^5M~J0lz#@0eNx`_ULxXQ@lPd=L?p(f|oT6!Zus{_F6sDQajNkU# zc=gu2hoAg8_l|DM#_o?k+ft{z{@M>CllIm_(!;Jrb0@YfYR!sTR<>sr&5W!`ICkvZ zm+G-qnQ+3%E1MJ44dx~H_Po3A+ho;x)7=Y;RpwDwZ(gHSO-tAPyLh_leE-pu6}hQj z45;pQ{xYvuZ!jE$BK7lg4oE_^Mc6T^_s14w`{7ABH=spLRcQzL)npM6(!ZCXGr_P3+F3SC@iZ{GugRJ9a+#8DP!MSdsNXnY5%3d=;Ep@Tq&Kk zW`x1+#wC3#_b41XyE--fod(s;!gT4-#{TTxlB4;e@l;EauPgn^$9?#+iOKCq@9&)_ z3ao6_>CQxGt89DUgw*1n4d1u+Z2GVj3UxH~M(*G0K^5aJ&+gtjqT9kq$CfvYFz^2~ z@5sZ|ow?Hb9W$Vgo9h)7FRmCFULYifby6C1US&~8)f+0y(;)Bh6nIwn+-;2tDpEtr zh#^v&>$i(U6je|3EIYhrY2xEWGH$*zeHjCt!?Vn1+uezEOf-m+Ey E0hXRQ8vp z@A=wPn4g!doTdZ-B-<8Ri;xVXH+yUx`ra5@Z%1OPoa>Z}MUPy?N)Y7mq8nm1A6o{C zAj_{>aRO!m5Vu}%IAy1O5yOc-H5;{2hkOBq1|VyGD8O>%P{!P_Oz@jj_uAT3n82G< zB|1B44_KgASXeE=;_7?{S6$8-dDZ-Pv8)h-9QdHjVj*9JKgfhksv*A&I!D!n3L7$! z%T20bQcimzW)UTb>D3g@ktB)fjcPaPF}R_ToQKgQO%W7LP&%BZ7+S|rI&9=op?DJS zVT!B^MxvpcN#&L007DQ}RaNRLjarn-2+C+Q5+qH~G>$Cr;3~h&hH!r{E#|=rgPbG; zWI^;}QID)!tdvbE#C13cU%+mE?${q3DHSRj5n=-br6viVFPhnqbxJ>bxz5Bg=B)ucjy)V#nmq?_j`kK2ut zJj>x)5^8XRK}+MAycY7AhD?JNYGZz0hS%v0x*XDKHd8qyMdexyRt;^*rASJ%fTpYl zeGF^!2W8gJ!B}ho#U8=tyb{Y;B*@C5GDqV$ah4{qQ{El#qTdODM(X$|C5BY6IW z@(m9v(x5Z~F*XdP(Hk|;?ZLI2F%xHXS`TidSr*rLG|&Sfsnus{R0N_(L?`EkNs6h^ zct(%UHv?Us?-ulVKY;UY&al7oYTU;WZ}1%OerZPpw|=+eoCt=sCb zadjIXuDRXDKN!svM<$6!yZ9STjoe^%I+M<8opVkpE0+m%v`$pi|ww`iQ$_A1G}5O?UMqEUHy`{?|zEBH!<9=m>KS4 z@3dTezhg(}(z=#e*N%65o^qB31vQlgu8mF2$I_n8wo=RUPu`nw`?Lj5j##{@U{7_| zlOJv!JMOxcvC^Qpg5iJe*Z`EJNAn(Tw$0Hd>{@OpIGVU~-Ewg2NwY0n+gXeM-Pzl& zxVt%++|f3e4DQxw+({jk;q#a?;o{>vuPM$N(-U2b!BXp0ML>F_%wGC-eCpHIpMl&B u$Ac5y4NK>oy0H5}Tlen??c;m$!U|Awa7tXzygCuh4zT6sTMwFDwf_NH0Xzr* literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_8.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..570c8b0c4c48cced5794a0adac9f8f07f3d3cc36 GIT binary patch literal 1581 zcmaJ>d2ka|7=Ix>0u%}kU|Ru~w2rNIvsZ2#+R&sWnABQQ8t!g(Uz*S)8#Y^##-b@= zxv>sd9mG=35r#6Jj0{=}j8bMmjtT<~RM25ir~)!&KnroxHpm|gJG1-V``-8azTbE4 zs`9eZQ6sWO002f=rkg6nH7dSEGO75zDtp%^E}4SaAnOs$fQSa5pfDVunOZ0yPFUmd8{{_+ekVsftU+F- zvf;KsF?4&TM|e0hQf6l&wTzCH7fwYA!g|qw4+=CA_Idq5eb^u$u&WpMaWN)G22_Mv zgM5&b!&Z(Ib38;e3Ib(t97i-dg%fvaoluA8BP31|7(rr$3MC0WsnQcFWayEL{&?1< zuP~Jic@s|txmyqddJGGNLW&Tj;P@Jh(CKs-PGTg9iW+FJ-Y?K$)E~@FSTMmL!+QdP zhw~$Gi?oxg6AW^Z>tGPRfX(*Eus=AIDlutTm=0is0>^y5cw__GL7@WvPveQ&L3@1w zVihpR)$xp25m$BsEN1WNj^c_U8~tm%M=T5NHE~Rx5Bdd*$siYR6s(8U<4%?#Tuvv7 zvowP$aY&(Bt&&95tP-+nty-&u%7mRK;Z+)~%7~jvrV&P*Ak4*D6GaxA37nuxNW!Gm zB(N5LP@w$`O!)SQzK5{pr(*TRJfsDVw{x5~(Ff&jPT+!WE`X4ff<$s{G~@BdC3*2G z4F+w3yk`kyOL)$Q45V4_c>)E7fDEnCDN!eji{b0EE>z3lN))Hn8d6P@Bn27y5T1Q3 zeS?iEO2jY%2{w9y(&#AYbfHQ{r$%X&(uL|snno!X1ziy0N{yP5V8<6P@FrZyRKqq%f7`ECm%{?4IK@AZ!|VOyY(%rq`8MkDT>JO{YfV(e~)eG z$lL64)<3v^es?-(=)DFef8HPg5B|*Go_6o`{VlQ1PRF<}GaQGbWn89nL+a=ZndH3Z zFQ8nCMA}_1UcH_o^%sP0D5P!4WtTo?kXtv}-u$st($}$f*)J!TUw9~&;w{6wM~xoY zM5h2t!PuOPrcBwq`3J9@ozvE|t$$&A^3CUZywCjBZoSvKV`oue7dXxyPM0h)?k&t( z1gu2S@K3krfjtYF(j5O%;9Oec$XVWufb2+a`Kx2RpUuADCN3{(q|epyIdd&dZJk9) zi0zP4du!9~{A;VzHv)%x7+BJumoo28&4eEIkE<7%PTL2)EtVAv-6xiR%;};R<12QmJM#- zLBaXqYtOc}Z>#lYoy>~1I@Txv$L;w(T1jsLW#f0{rdCSUcJ-x#Z)RP*Uwt|iSR07j zbDLj^u3H|O1OojhR@z(m$sfKq`*|w5I_&uNy0m)Bj3zK{UNwd+OsbA_WrDwVOqi0t zc@mhKw*Te8jj#J7-pVWX7dnS%c0^Ex6-Rr|S*W*8Mi@D6SZ(8-T{{Xy* BGI;<1 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_9.png b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6b6e57cbe2126dad0a5e24236024079c1c6fe7 GIT binary patch literal 1584 zcmaJ>eM}Q)7=PQ&s(dJJh5KEpBWhbBo0M#nqTPan#%V<^zYMF$NHX01e)&N-YqhW@vg%aX}HGIgbx%Gp@=BN3BqYNIVjTZByfT%CJBeh zn6!0;A`%l~VbV7*`_>yx`a;}EzR;Goi;$57(JKf`lYLMg5F{ZI5W)yaX-Q;;n_>A- zLNYT^rQx6*P~?|Gu2>X;$WWST{y7v_0rk9A7)b*|k`!b$ zBlg@g=^JiTSt5rKPO_m1%4nvb&yVU@vjJuFIzMVA83v{N6!b%g>x>3UgUJ-JMCUxy zNlB61o{8<#$&e3EXA6epffD7((MfxaWn;#s={BYyCjIRmaQ+hdT<5YE3{<{bJ7j?w#$6N9MYCH+{O;&CS7K*R_ zC7j20p3?aTmRwzaD;=DDY>OeMMuYBlW5vnXzUyZmD^+m8I$uYs>Oj|-=8dBbS>=k; zryhVe8VmltbA0WIU&pGOt;=rDR&|UD?SJQ3?E1yIPrhkU-fCPpD!+Z~w*yW6zPjmM zW#P%{Se|-HYMQbHpGbk+iGtBmmD<00!luD(o$*@xdF!;J6>awv_y()(IQWJ8vB$PQ ze+wIX8Jund_fb>YqQ7-#z+zKx<;=U2c^uE}-WFe`=G!kc+e+tTXLJIb2ALCXF4&&c z4O(Zms*k}PgG>H=e;S}BS?EcncpET~_dutVY7M(|DHLZ#0YVQP&9xnKN z($8zJ5b1`ToXra^sKur~rZ#PT6ivI-RxW+n!AD!SWc=3SOgp!ds8%A4#(lAuItM%F zDrVTKRT*RM;jv6roWvWZNQ<4d7cLI8Re^$t9KRvwoVU;2 z*mAY#H4s&9d%ak-BSD zATljo0eZDS|LHYFwPXG0m}Ka)?0$3a>g?`OUCr0OP;`_|cY=()TY4U&p!;%@C6>9< zS(@?>39{9J+hFdozO#qlTIK%i(WU5>_*uoHSE|A8tW2zJpy-3dKiuV<=h#(L-Si(i C12D7z literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mad_fist_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/meta.txt new file mode 100644 index 000000000..93e59e49b --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Mad_fist_128x64/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 7 +Active frames: 13 +Frames order: 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 12 13 12 13 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 67 +Y: 24 +Text: Am I a joke\nto you?!?! +AlignH: Left +AlignV: Center +StartFrame: 15 +EndFrame: 19 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..220908495ad987548598b3c9d253b5c0898a5e76 GIT binary patch literal 4344 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_10.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..e90ad5e90d9d22f6dff7d583ff77c79483616922 GIT binary patch literal 4370 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_11.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..031c0ad81a1ce3f4f77b62f74dc865fabc2103ce GIT binary patch literal 4342 zcmbVPc|4Tu*S`(L2+5Kn86(<^*{qX&9Yv~IB~=Al zp6utrLDN%HE1y=%#!|;tn>j68L$^t(-5R~`4d~%7>ti~VqV2HN4dtOAS?quiL~^w8 zjpwEs0GJWv1ctEljaCJo(g6^_XxG>yRX4bCu@tA~3_xxH15l~4EdnukpkBkFUIwV& z0p#01a~B2T0Kk`X-V_Qv76&GOS{rTxI&)%sxCL8{Yy`qTGH-5AZNFH8Dj+8apOv(<}x6 z@=L9+*L96z#zuz+M?J=Tr+?PmU-y}zLk*Q@``62Ef`kCcqb<{2t|KEIf{Z$We7{Pc zoRdJ86X4aqRtb=m8)gli=@ zsBInRCH|JVazp%()c6I|tWv@nI5t2W;9jxg9epAEywR5z@?8LQLxRxe4;Y8c!EVZL zxdljiYN9xc01#Wb6m5J^0C<;}^#uURzV0~nC{E6%Rs;adGr|t!n+S`&mf`XwQeP{U z@#H|n&F02pdwBYirkjUDcZuHHkzlgZfrsf7dY&&RpRp}@P_pPXQdfLzK9NI-$)Xa!FA_P$E|Ic4!u4JVNFew5Fb!1-$ z&=>c!TaSG8V*|n0qe!8xNC}UdpNXe#UbQ%LjUca9x1BUX&~l2_A}JDd{ACq*>BMP~ zJ)j$*(vu>mFG;@f4UdVjBG?ej9;r^M6iJneID;=o?^aG%J-t^#+BFutN21~O@KI4^)fklZ7Hc1DHx`y1+5`%D00(GH9v1yl- zV#gu&q4P|(Uz5KtqiiB;P_rthI;U#f*;B#u9xH85OYY&3m`15Y|3o=^YWDSP+TEbW z_!0T(L9OquJ~>d{cL4`_4 zM@UkL@M`+Xq2t?@j5oay zi5Rf*jVMu~>`and3YOV_0QFeo+p!{h_F49#dIxv-_=;zF)NFLl&6kI|yJ-Ob# zcwf?FN=azR~+P?(ytZ`w!F4hEjwaWb$3TaG>P z5#8^x{%uKROZfKld-2*8zZNZIRjfDwo zxFG`G@rO63=SLL&V%viUW(UKaHRE&Q8X9SNKTo_Q$r9t;9jCn$+fO=OI3O4A%4KjL z<^9UHEEyegKI+gqdO{B~*rJCQX(<1QYre0sRt+ob*dl^O9|h1tjv1y}0f zKK8vJ@A;^AMep9e6VxJVO`U9d!R`KWPdjrVDD8qvqtjaMlj4fcYF!z^*1e`rLza!V4DD6W(mPZ_m@p z%0e&|uN}D?i(!nUgwnfGrji4mGfo_kcw;j1dT;;3^XIZy9ypLC&kUStBx zIoO7&^y9)ZsTl_M%BR2H%uG`}t!PzIyb&^u{6g}p(~5RZ&q&*6FuODy9{VNRJv%+^ zsFA_Pq#n+q&1#a5%Q2U7PqUVEBRTeWn_}0+hPl46XqTBX#!u*?TeoWQkz9j31FI0m z+93AnN%{nNv2n^-Kac&>cH&U$^oI+}-n@3!r(d5mT<&tpr)wt_ifL-SyGm3`=YRPx zOvwd^ez)my35pJUx?0h-_Dy(s>$eL<>jh*Ub>P<--kFxF<6EaCz*p1P<2F8A9c;5| zvT9ecREdmEQ&Lh8moNX}-W)raU6?K1@;1b2gEPT;GSjQvbAjN^eCfM3w zNOY5dA<5UjdcOCPD(KzBCpl&;a_EUJRf9&4xoEe~GYt44{8IMX<#| z%;-!qL`MS!BOwq7h>o5H(oI{7sH5kmsSZIQP$)P;8;(T7P$&!n$-g20Tu{D2rn?6Q zZ*KXIIsV81>cwU=FmQN4K!8R7T7%B?gd_Fz^xy~-9EF1MC15NLjZF-M(O4>fG?Gk(?g)OVJIz>9vZEygCvo4|LFNocm&!~&jf9z zr-ee8A(0m5y5{CcOG_lu5{)p?F|*YEgSDoy*hCtM{KqzhZ~Gst?tjH%%$Q^%o6dBg z(|!LG0?v!hrn9{03e5c^QYvupc&L0-P zAb*qpHUod~Z#$7`{2pTRo8^hQ6aSn9h~aD;EH*Ya_~iQf`r6uB(i5T6007FhHaBqy z?3z3drd1)t(8U`Y9Ag$inEb)I6jaqCTl2p9o&^4Och|jjPpVLEudPCVGnxdFG_ z=2SlQ$;ZUxgh0tyr6MmTrfq@Y4PBY20g#HiUWJPV?*A-1Li^yBn( zL5#F3$wn)xvY`rwlHdD8jNXPNL3;&56|01Xy7lv~4ea81j8A- z;lojx${6L7NtbN6I9zQKASm)hl5I!qYe;WOa+mJOJPQ-%LDdS?fUjEK0svk}Ec~VK zvBtg11HIeAioOCW(39moQ+kD4WsI?RS<=I!EHzz(Mk~b&_~oX|R(quX^0r{Sa9qb` z*eE1ly~ayZ*j#AF-_M*7zu}YF{5eQ9@$0#7iuntQ+f(p2_bywn;3$v3JAM@h9Ta{f znFHX!_gaB)UWd&Eg`%eGEl=+gl!3$cx|H~sP?ON~4v#lo11?bV1dai%s%vdkQI(XJj0EQmKz%r)!8>ynIj8!Ow^ zhX;uXYJj&qJOl7_nn(6|vV4urG__mC0b^K{2v%(|CcG6`r76_x2gvv*@?t!wyO`jF zW@o|mhlGNN6SYfYBmp25BqniT?h+0pvYVH6b#wAhQ~7ls^Zfw%Uai~(An%`EXO_8av`>BjLWFhz Y^oL+X!q1V(-@guPi=*awrf0(c2Rp-`h5!Hn literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_12.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..856e068fd002a75f04ef4fd9a20649584763ee01 GIT binary patch literal 4327 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 GasLPY-HN^d literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_13.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..a0366b2cfb4478ee1e6a3261351ad2608a960caa GIT binary patch literal 4363 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_14.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..24fd557abd9732bc5c44221f0d2de36aac1276c5 GIT binary patch literal 4306 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_15.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1d3ed2b4aab9c4801cdb145d64886751a96ea GIT binary patch literal 4325 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_16.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b44898fb76099f26cfd61c57c2c252e843faba GIT binary patch literal 4346 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_17.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..c98c70c91261ccdfda7bb489908991c192199121 GIT binary patch literal 4338 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 TR|WGY1^}2Eoi;4jzZmsD!#|dj literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_18.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7b7ae82eb0a11725af52a2ece0ab0f85703825 GIT binary patch literal 4346 zcmbVOc{r49+rKT9C2QG}F`|Vr3uBp#eJ#RR8X?9Q3^QgLgBg{ykdiI?nouIN3CUW@ zP87+KJ;_eU{!P#G^nBkR@A3Ze-N$`j_jz5{?{{w3c^=1g%j%2?ACDvt004YuriK{S zKZNz^a&fT639e`h0N^no8W>oa85n@5G>Qk2L;wIrUxrN}Hf~K+duWXyV6Wf1@GOaR z6#&Z>ay1G%WDDK}a5n^nb>D@C^VlC05lT0;tH0LGW10~@nsuz)Q}1^8xd=NajX9Zt zyqA}Q=4WR&KW|n}rcZ9QGdl!AgoG7hzh!#^nwU^6RIg05rD=UrRS3I?=`bfq@LS6p z&pqz|V1a|l2&O;P*Kc`WsAW8jmox-2Z2U$ z;Hk|EcOD=f07%SB`e2}d519FBro9K~&5s)p1A4O$<#Pd%Y(UB}lOyc9uK`!Ps~9Er z+BZN}p)OdNv$mKm#Gw>n!X8q!2MCD5#t7)T0wF2-O057$gB>t9e4vd3WX_QV>#7;f zccF%so3a75EeUN&r@K@RmM46W3|v|m9+e$^Lwcr<6FV;G!95O6PfC+JU^>ZR-o76I zB-cCZb~JQiCcll3eDjzj&HsFtz2mb$0c*=H4((LlVdn${&veZ9xlBy-a8MiAp8D7L z}|R7Eh?03fbrJz7_h4QNZs9Rq;M@8V96;>FD0a{+*1*3}bF_4e(rJ6KrDpI#?j zSu4hl+iR%1|46Ntp#I+RkV8E8#S`@;Y->@yoG+hpNM;G8jtG|2!8Q0MhlQQ4PE*D9 zx{7DM5w8s6=G1HCI)IZ!g$ubw^@7{E#8RR-!8lXZyCJ!tsqll=;CGF*T=sl@?^tJ3 zxg`kgpk}0#?nX?1BM5PO>vp9HJpSr)YmQIs{<^Oo$w=OQpXJv{R~2v$NzC@?lq@-n z4k^vf>pcD4pAKBU9fc3+g!6mc`GRx0bJNK67FJTBK@>lMMcPLr@zPlJ01>I$Ox!%z z5%!3X12bIbZwS62U5kk^!J1#CIL+`f4JvkQc9yO>@z|t#WPtTnPP`Mv3lZ?NNlrk z0xH2iAvj^Oz}C*sPN$n$z-#;1PT=u*`^yiF?Os@o<#T@$ecYWdZTC7~t+*W%h>5o9 zuy)C*cGk>E!-TRug{nV?AeqG zfL=7WG4Lz!DD;T+$oO`ljg9~Pv*88JFX^Y+W!w4MFG4sVI*?~Q-bEfo!A0tQL4DPI zZnLym(b?&~d4Fn#ZiZ6E3W|(c^XINmtFW#Jt?2jf_@Vs~Kh2!tUTI$8pBn5mSt0+- zSrPj&-!tDSqYhK$Qj3uw!8Py;tugrTKFP%L&V?HzkAzyhDq`!sayrd&j+QIT-Siwo zGQ_k!3Mq%&3RS-n27I(|ZbU?XZhh{%@#^Dk@jj^@6`ds?>8-7eN&|(xg-tV2n%(I> znYijNmHk_hp%0AG-<^t3i)cvfOT5&wC($BttuWbM+n#B^V*k0&tjB3uX`0+~mSiP$ zHf?_zDy^mTQBhh^eLxy{=-}wV=;K|-S8ROy;4@n@JTs{?duKIQajWvHf8MK{I^qQJ*7PF`(-R6#U7rHX%S8eND{Ll=iScpy%*Gy zFd;ct(e?71AAw1J{8~UqQW1C>Bx+;0~1&0rZ3}*`GgMG+7k$Yb6h3?lD z(cjO_=O9CiqtuEmNv-2m20WEgJ4KqgGDOZvZNOR;%n$bnMTK>64G9KQ9SVunDJ{UW(3^xI z;b+pyL&^)vuQG1_GFnU$rXM)MJ$q}szPBEIYs`;*l9Z~FKAviuNXHjX3}n9&`!?0y zk{PJwfOLqtq!F4dob+60;yOs*3My_nk>_h6ePHQETBxN_b#`R7^|P|_Q(AYwW!NXI zY7CydY_Q=KW@+sIUWMBdqsWYvxcf?O*}~qi=WAidmkVDYn(^uJ={XoaVq%HnXIR;> zGD{Cd#W=ok<~MS)RNT$xwQ;$1zvX@rQmA=nP6?*iieJ*6G(YW4r;rAo)YLrZ zCS%kh51XQ>6KNrozO>oYz?al>C-~p!P1GG7dU)yLnAP|D?QaL(whg6RDO=&1Hf1Vy zp=$gKAvxqM^!=*&?{{)Cq|Zy6RF~}r&%?*?{td|Jvzb{L$Iy%GGtTIs zKcx&X*UYz4e4MSFt2_-lGIhl0bLM3(YfZ~vC!?JgDycugYi|AWWv7eK#b}dY>h_4~ z6GzH4VXbBMtX47or^WQi&iRj5HoR-Q{XYNttn7S`SvCKDMykwLVenA7e8tMIfYn*C zK%P1C0q3A-#*?k;zU?3THUxfLDcN~Os3i~oa;cH% zIb*rV=nNSdDL%=nCHMBYk-X=52RfRA?RS~eevc=IwnsNlcVM@A7kJkrI%n9!he5^ReF$`r8^M$4iw4iXt^tFH?r88?qy@}^YC!NJng-DbHbG}> z@j*U#O?R-4Hb{$sVksaK=r|CAO!Dc)9|b#@sRsNW~J}H8~P1od4sZ~u`Uq4IFca+?@uQ9(#;IfVAhVZ zJJB7bp`nUXQGu&LR1rv3h$=zF1EL92QG+0m2u&3g4Rtu4pz%k~f8rY(A(5H}YHCOX zOdk$6GSo0Mgc}>f;l?U3J#_CGPgC_-Q8u0J3Bku+uJOml9yly0PMwPhI+P) zzL{iR${0xSM(5z#?v-V;mmIvCuB5z3`UxV&s1CN7D(y8JxD~a_1l^e*+#L(6_H?fM zu<#(#dql_OI=X#-?MFjRwt>UhIUm;+bhYy!QiI_ee!%Qo;1X=eSo9n}V{FK7XJ1Io z3>wSEz=Yj4X}Gb!R!)X=Pluw%|BYk90t{)L*8~h`LeCEy?Fr8PySMQ zm}3|b@{wDl-{Bu0yT}{ent8V7$x9?HJAeyjSYMX1L+Ni zX`oi|$zx?hOKPX*%oSXPKFfkci;{EwuddCix2rit>)W--W+4x)2l0l)R-Fi8D#Z4< z&1uUkRwpXneac=-5NPEWPw9>O5HP2~ZH)#A^1qiKpX)o`e1tpyhP9*Ds<6;4LUM1( zIB4L$oAAkvwacgOT@)~MlHa|!lz$pJDSX+Y_?OAA$cXIt4a1sPfg|wFsshttS7VBe z1X!eYnp1Sk8&MJa>dX6}5yKT%k?`D?Rk0n9$Z;)C4k+X>Eu}xneNT1NKsN8wlB*9| zIa>KQ?semfJiv=2{g&`I_CW2|U<+B0*UdQ6 z>Yjsa;TN~L>elO=#B&q$*+8gj%*%}D`(3Vm-wQNLMRM!KG|A=Gv+><4T^wZpaK_ug z*x`nCsD-bAAYA{mzbqHfsvp1soX#sM-+Gx_!Uki4DoX6P($v=rPw-H?*I@SU&^J3t-?e5G+KsUeBY zd^63FJMgv@+rXMmDQ(aqvh*B%=scyG%J=hdqElzVsyg43v5Jq|^8hH`MU>#wVaKsS d1a>*afi9ZdS9i7jDy#wq%#6+$7VEoS`yXaHtug=r literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_19.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_19.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ad6700cec06ed37af344e2373eb2bbd808edd4 GIT binary patch literal 4339 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_20.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2eae4d7cb6d87b5f75327cc668f38c0ed0d383 GIT binary patch literal 4314 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 DJeHGU literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_21.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_21.png new file mode 100644 index 0000000000000000000000000000000000000000..900cc7d12099f0141c1e0c27cd29025fb1645f3b GIT binary patch literal 4357 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 JY2tnHe*iH9mO=mk literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_23.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_23.png new file mode 100644 index 0000000000000000000000000000000000000000..4f82f63bc9e11628f6e221ffab62fd6a0059d2f0 GIT binary patch literal 4332 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 Un~;#LUq1j-!_x+pdhVD05Bny3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_25.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_25.png new file mode 100644 index 0000000000000000000000000000000000000000..768030b3c5614c681e3e2af785c662695bc9296f GIT binary patch literal 4149 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_26.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_26.png new file mode 100644 index 0000000000000000000000000000000000000000..12f22abdb996b1a1e301e114c3d1f60c641e2ee5 GIT binary patch literal 4260 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_3.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0e77426c54323d46644d443ce364301dca1962 GIT binary patch literal 4341 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 bLx2O|;^IXc4Q(KPe>p5ntxd{|+%EnP;{}-{ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_30.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_30.png new file mode 100644 index 0000000000000000000000000000000000000000..13caae7ca2e39adf8dd0e33d7a94b1fc326b9090 GIT binary patch literal 4390 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 T<^(JL{>NCEA2Ta9@i_NCw3V}x literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_32.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_32.png new file mode 100644 index 0000000000000000000000000000000000000000..acf000827ffb7177e5b7dbdc7935afc06a35d147 GIT binary patch literal 4402 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_33.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_33.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c6fbb19168b4e5b01f36c2a17bbe00336a4a7d GIT binary patch literal 4340 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 b7eWHHnZlOuxnixqe;n2pcIM@#p6C7teSDMt literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_34.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_34.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2dcda5d98ac939ae8263cb7db583cef6574fb7 GIT binary patch literal 4253 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 z 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
`cx7 zHpiOjL42rGG71I@4h~igR#PQWykQ6(9UT}P2}2^GEDdM?ok+#dpu_-$-wdX>04xPh zrs7FN@GnM;2Pu%M2Vpt;R}=)Ywe>&5#DKqZ#mX9th9Sccs&E*A@GG=GwF9Vjxc_(K zU$p}q=wuws4i`WQq+nTF;-&B#%u3&XH}p%9 z!i^CKGgEC-Q-rxW0%5KOH_|dO*ZhsOBnD71L@e&NZ9L2N-&nQ(iba`Fa2P6y;y@z# z|1Jbu9}<-m;6oyVk!q?M;KSA!ES~sFa^%-8{S~w+j)D)ud74v51n{3}M&bX(1x*cY zO-(Hf63Pk{2UW-5)S=p1+E}QLmzSrOr<$e)0-*-^8}IqQrVqw)3ihj3{-bt&i&zEu zYxqwyuqOYs6OPF0AquNmB%`IcSdGSSYvo|}^XE_25Cj4V3JMPC+wTAXdx@o~kppdD zJ`F^94dypnS=wO^<-g78<-ry%Sj{S4_sg7K96YBN1MTP#PH(-_g4B44Z9KFq~^=mqGNP{EgxF<0W`#-`{uwB z@N;dc_cQ%VfS^&IQ0=#_a+KW#Gj78lO4L@>mq`MRK>QqI&geA%ZDLi}SuRG>?ct{r z5)9Q7E^^KMqw3KVpq!WIxRhqCDu?hZiF`^R6VC>q4{jZQhKH7q@@8F>21?oU&kVv# zxIm+%+uq}btHHt}0tGvTY;c4AOTB!aeUXQEEn0le0Tt_4ng>*h>?`QH0^mv~J#-oc z%tv;DwR0eE33u~&UQH|l;hOc%Y(7D0o`t%+3hE#w9 Z;93Nk^X$3K`tbw+OS6-vrN-`;{|~Y=oI3yj literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_36.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_36.png new file mode 100644 index 0000000000000000000000000000000000000000..b018a94c19c4cdd239a3043b1ffe49e93cb0f471 GIT binary patch literal 4315 zcmbVPc|4Ts+kfm!S+j&>j5u1xER1C`vKtQ3*hVGB7z}1ZO9X(R!7STAT;iIP-pCqJ#KEwC>0zqx zB>=2c%-<~Plq-4@z+Vv+*MA*xRnS2~QY;f=-x%I2h{?J-o}*gnX>k4O>1g}2+Fuoh z3!a7qFD@)>e%P#@$(-5hV0MbI#Kct+rgOak9c+Xys$U__8q?TP!{U_0jB za@)u5f|`^96)_*a(n8ZJ?avb$z8I6-;(YX z_3nlp?Gy1c)01P<9y7j+-(TnM_$*PudWy>V`pglEz0syK%?>~D#N!s!aKL8l#Tsl&2z_+(SqPSi-vq8SP zUYZlnYplQbP`$3GA@3yXfZ(0|DF!lj^{9UCr{!F-Ib!K!qE8y&+Cnp<;%6_-(WH4@ z_h-M{UmYpHZP3iW53h*2D&`j35ANWXPK)IR<1rdHS^1#Zs}iTcubb)loP~zo3CTjrgHv5aRmQ^=dPC(xpeIxZZR6>p#D*Abb5yj$b!JL&TYtlIzng`{W>+ z^(?ob`_Iq*3?SrsEP>Sx7xuU@fIoX9%Ea{=PFAH!iZF#kI>aFf@;I#kNxAxL{38D$ z&S=)YdH!=(L|^)b$H$xDEOAEnmFJb7h*$AD3S7PdfB6SE@xJvFpB<9U~w)@%p+fRIb`yd`prYL7ee|M< zR;9lz_APcRXu&l2HREM`;o5|yws^v4pIfBL?xibZ_r+ShsuCK#^199Q{-{*>8s#~G z43gIKD5f58E7tf#9QM)0yO9t>`HlInCu6q3^S-ll$L7d=j=nZ> zjv0G1P#LYy?w4egGzMglMT+xCqA z>ZqCT)k+1DOq%q1h{WL|h$6Kwr=Hj{&NJ4I^%YM#ZF<(kF2@z#cz%4y`x!mJv)J1g z>r0r=sAN?ZRbC2;`f0M9D$dw8!(EBSrju4F`5o7CpUHUXj+O{%_O;tg%O#2{JdIE3H^L825cD?i@Hj0MSXxOv=o|3XxKt9Q^>R zP_3}`IC?ZuXp%Wiek+$4^>%GiY29ySNYXdLvODhyw$w&g$`X42XwaGcXM!p*HJH=y z)ki#bzN{5$R-?Vp{S2 z(x2s~mDA&nCtZ3kt}@AkgP$xa-Y(2x=JMw##cNJ=WfnEw2EAR8OF|`b%P~`OE@X>O zj61>JtFi4*+TXTwA@RtCGi}d`hrZp>%=;0X73SRPuwC+?qIN)Ku&?f8;Dr_8%kq-P zKP@KBS3f-(;W2IT3_3P}o3wJN@{V-Xa^JY+ehs)~f z9tn`KnlT44DB4s8i#nLGkRJGycKV3$OM|I~KSu6dyf9(&`A)~H;aBY=X<-$s{Bs!Q z(H>Nte=#JFoP)kov-tT&UY7hhd9&Jz-Oxq&1i`-v8RwXtlckDYUY`t4oG5TF$j&-> z0{uR1n7L-TmFDAo%DKkVs5AS7G~=sfh09vY%BPt)=cQ`eckr6qkaESJCFoMLStxCL z3{!T7I!9b7ewqOy0AcHc#f^_aDp z^(vVv#l&SPD98!P)_imCNE|D8RIsn}ZK%U8bI$L<%*gim=AWIot^TDw>(QNcrOd(= z`r?DaGE|dNlR|X|6TN(ItE6KnWU+FwYNV+~Ax(8lf5&E}dxOwa&}F@*H*;}k3%Yh? zWs{|&EXLkd$}miD3|p!PBM?s~0tW6>HzLTKjQ1pBiFkMB`4*xs0B{A7>~IX6l_iQm zC9C0o$*2X9X>2qA=$;6o;R!xO2FQ)*Nur>^i!bWHAd)*8?1;32S<#G$UL;H~ooE|; z(vA@9L(p*tpU?y82BFvr$V3Jn6h!u=_@RQ(;J@^u*z_+p6b$-HgyDk*|Lqjc$_8Xa zr4vC~Y6u7c27`gLbkyK(nn=8sj+@3Y5CVokKw+9txH<%ZK*8Yb8}!cwW*eltd!Vq! zrvI2@kI-N*27`uzLIVQ>)dJPksB}*#Tt`O-3PV5<2nbsO;>V;g@IerYpVDs)#za2? zokU}hs1(pIjd(YzKLZVBJNtJOWSW)Lzlte-|Ky6DHE0l?28FA^pk(r|(EgJ4V_=E@ z>&AbS_OoNsh)^uikLph+u$RO`={K02zW;9Mmmu34lr^2bfuP`hjj05GGLgbCH%5cm zGivT6ca*la23}nqt_jgVAT=NwM0F2{4oqDWfj+^K$;rC zkO-I|9ByK)ZEOrTHHE`X)nNu&My8s-vE~#%2A)D7{8VC?h%%&!E!n zs8rwIg<#`FWl;URs5B5lT@49RwZaoflwX{~zgFq*ppA)iQUKB2lujjs{z@~7^dDT% zL~3hlYT*$OcBn*%2A-$^(bm!?Ky*Aj+_l`*HIZ<*I`|*F`~Nq6P_|RhU$ydoYUekL zU68-Xf180l__v*i6m}2M+0EiND_qNNG+rA^JCohrT{da|@?9tZaNaUEHn0mCoOFt& zzXI(w+TDFOSDLgD!^;2ov8SY6R{Tngd&B7q2li7tMb2+*MtaDu&V7&%6J%{yg(z_< zvVOQ=f!);rZv6wgtW|zM!J@%EXa+bfG}>+bb3E1$XyzDh3Xf=TZU~2QZhv50Ipd|x z(N)UFk_58%DgdHHSw6gW_azzDQ7;@vP!ouYM&-`FQZ`+0na}~`5LEf1Ho;304IzLw zuYSHx_~#yOOl0A^^Dn&f5%p%Eq-#5_-&=Yf46VFxlN#`nthc*6ZdleS<~)+dWl(d| z(!%%(*Qn_=9%a$SDc%X(&s?Mma2;_yrQis+>)Qe&7O&3c*&A_S*GP_K-auRQo`$Py z`CZ}%7l_Hv==SDW{^fk80<(q#km41+7f!kAI2U_G9P zpxaPwu`^;VoLU@4W)%bI`D00d@YWYBr@KPEsqY$ze+t``B}i`R*KnN@O!138J;y>O zH+tL6SnfS@<47Xqd;+lXF7H7PT5096S3+;LQu(&$s;1EruT5-><{`{$WfRf)b~zUuBIsWBN30M{Puz>Ku(@S?ELq4M*tLxBtbZ9aV^mftf>U|G2Y z$9-%zWyj)FI)J+dobE0&!26T|@m>dBadt%wjRN7s+<}mBe-@Gg7ea@qDmQK@YMlk@ zoRF{^nndGNuAKIn2jao4*6GVcpeXF&VSLk@QeNS4k(RR+g45Yj3l$%-D8X6%zK2BU0^J?j{QVHSwJU#FG$M5s|$;7V86S@%4*&ps<|rhZ z^<}UgLoRmKdy*^85&(FN@y5nB=Elb0KnmFhPrv~HZ7|C=)G2XIRDWa*x8K2NVDWJ( zAp(HNGPzm>obv>31DMMKf`(1e*LWO+MGj=5>>DHdcu-l_#&eHV`kuUT?QD#_tM+%9 z;lgJZ!xrY}H$QCFOlMASb1U1S57MN;( z<;&Rw0E_H&S~&HQ!4{~D46p%#eJV!;TgG;ys%+#P0dN8^3K5*%2Z~1nttxh{!a%Dy z@W}S5HxG~m00jC4BM9(-519LDuFnY!6ekXg0Rwpli@AVXARz6S*%3CwYQWPz0 z@CwLf8bVY!8cIP7=jU)UHbyNc5EAPYzu(XkV5Au-bpT*(Ho*9hP$xUsf<0HYw|=zP zBQUxW1p*q{lRHyS_o@k3Ccl*o{joSYet7&9;js}$?6`mr_XH#}HA7YiHO+3(#R~wE z>pd@bv<>2?rzXaxe5MHtKb!J)0v5>-{liNmJ2f}iH~;~w?u9{*$;p29z!uP>;QD}K z7huo<@EcioQyb#WJsu^uJl2kef#F+yzbVjeu>fFRU0FZ#)Pl3 zR(FQN7J+l=hG``Y`BB^FFr<)DbnJ9HhY^glHZ8l;5`Aeq_IS^@`eRomksC`+*DGxx zmM!!b=mg~9H_79IGne2?GAY~KiJ^P|^NMwY)$_g2+6fKe-$86K{7$_gfMNKu@=eKo z34nmFI-I@+0EzYMafXT@pfk1L3jox76?ZL460>OL0sv%ggu=C3iJKz;N0O{fqON-@zU{LC}83o{(Yr6h zVT)l1&2hP37I;O7jE^^SvT!mklADt)7p&rP%lcd z&RKI}Zio%k_G+<^dT_d2XNIV8dx3I(-`jM&FMiDrIzz4E{uFh{B=v1-Z@|~RGt)Cs zKSO!>uJA>*puCPr1W25hC={=dfTmg8=X{r%)@rBv0WOv1duRV0vb~eSs=@`4gf_us zM6yG2c=GfEJNqDegFgC$eRdD+_dj%ZxOm^x{;AEEV(#~%5BrLx?W>D5OS{ma=s271 zGamVM9@~){SiUD$qD^zJpz`go70nX24vRL!aZ64{{S*iGS*3tGmR>GT*5@ojI5(w2 zpyw@Yje{QeFntnyvZl^;g7}*sk1pzb%ska~xQnmryfVA8f%4;i{}P{)@Di=Tu)(@P zuX)P6==|*9LU3S~VU|+X3WA7O3+ArUtU6N_T{RTk{Z0QJc9uTFz0$VAKl7=_Y=!tU ze?{!uLjOXKjFzf8mu9>K0j7;z?1;yH4Y-4^>{+}#R&=1nML zq~!Oi-e>Pt@-wP4hD$yY-+$`RYr6Pw(^4fv>W$lLy@iuM7uTG|&vkssD$FQ+wH!YU zbq{fOcHgW$Wc@T#KD%F)*gDkcGFsby-V>p(hui3yVb^cgXUhr8xmtI>4l<%wCmY@$ zo)*4$D|_?AM*DW$ulh0i578wnPEXKF&?KlfLNekhdjPu(M;gbyy&9aiIIH(SdG$q% zc)9tUWhjZ{2C*Mf>sYm6U#0XOkv6U@k+V`8svYtchx!l1Ug_o<5eO&WU$>a)c+Pcg z)QoVgQU))PCboW2__zZ6fy%ct<+jvw)HS7k=7jU6Z*A;ST=C5pCx-l=Q$l>1{sc4u zJC{+(sC-ZvLA(0PWGPjUDs+T<{`y4YK%?IEFF|b6gmksciFCUZDzdD1PZ`w(vKhM6vieQqx?HBx0`&=9@DTpO|Faw!IrN17T zR!)sOT6y$cSfLXK2S1;xXq%r!%@)j(m}}1UWv6QWPxigNvdC8=wRCGz%7b|7Gxctm z|4M9Ud1qTEy9P#M-lgL?bLhui&HUA{tV?d~4%;OUE9ySV5BAr83O&EfA0;hv;`2h% zT+K5@nqxq%$;A~?@At@0agttARrOQhpDN8lt(&sr&fhz~chzKJ)}Kly442i{Kj9{# zHE$h4Ap$2e805i>`Sj3dfoB!?U!9zMd35Cdh4Wu*zTWM6J^Z?JB<)hg3fC-(uGovH z4`wRo6LaMTN)Oo8`~bac+w>fj=Q@UPE#fr%Uuo^~}Npx5rRr zF63FeY^!c?``g}){ogK??>xpe5J!J`Hh6ZwcHY0h&wVv}Cu#TH)v;c)4zoU4 zQ`uW_Su!$Ge3G?4yt@*|3ZE1Tb+?5(?9yk09!`&Jk8hstcG?|uv)r?RZ7FPyGk{)ECx*h_?d+R|QH7r#v1C4QhcvKh#XB%c^ zhYbtB>Ucv8^uf9`1j_&sN5z0?L;@)YLDPf$Wf#F3{}w|b;J;L;0eX&T)Rf_Hger`6ga5f8EQb_t9|Rg{ z`j0!-Ob_Bmr3NCP(9qCOl~6SmGQ}4P)6vm^s=}dgxH3yaIfzc8Vra^wAlW|_khmZ$ z1s_PolS$y;7BODrV5%O3MfUF~h=G=t{~9I*{gW$J)}S;@AQYye3MCSMhxV6t5EYI4 zUmE{WJIIb6h=ZbWLF8ZxmbE25vVXv=^!;~7zZF?*5Y`md0fK}fAj#NZB925gN9sXX zD=OZ2Z-lnCIz~+mrm3tB*HBkh$Eo=!>!_+}D#JD4I%;a#S}-h5`;VRfgg1r5U}|a_ zNDa8E5e#O6)J7sfA7-YK_hV#dKL55vbL5sR$0f#$6L!=O;dvv9poRp_y0G2P!=iZ?^^jkwev^B zD#+i%f180d`L~^LBvubmSj}Q77@f*$G+rAEJCohrUDj}CXJ>nRJMAHdI{>hGnIliy z(FW(zxUCvhc}=#*c0x__h~H>2ZocB&mY$adh(E?BTlkSVOA@=aC<|#H9ic`+sp!PC8$4JdjaJ6@`uA*`aTeWFf~TV)cu2P&5X}m**^_{x`fA` z9E-Yq(|ZMUMcLJp{Vdphcf~QDWdD0867rzpp|V6@B@V*ApU=!-;hvXkk4Fvx-+HfH z&R7PVOmBt^6mz-&o^vJykIrX8Kng6ntzMAfi*8}_kxa?UiA)>@F?a>f>F1?~ml~x5 z%^MVhvZoEMd<@WC&P8ThQ@Q#fP`SSnC@|+tQ4vt4(1Lj#?lGM(Oa}q)+3#fTS72A4 z75Dr2095`VG&VV1xB~DzrSLTl(O6BZqGs3&S1UwD3*io2_cy;1n-hOx%#nm7V1)r2 zk&0mXbZgf{+KMC&)b+8X{>e3Yn$J|7X!;!@b2JHgM?rq!I*p8%V7L@jarpM%t7<+K zrL`IDikCUcm3z7p86>Rr{7!v|Z-XGpDpQYN;DslM@$uAD*C6nk(*dum(SnG00wi%8 z9kmqzyazwvvsC%an#!daLgEP*s^8C9dDcr)?cxx&^*X@OayYNETK27*CIZ~eCsgfXAOyH+_#g8H?4Tex_F zor6EzV<7I8o3!s49cDMQJ95Eoa4rIWF+}n3T1ss#X+TCdsL#@pq&Zus=kDs)S={|C zsY9{>?%evY{JZ)tKLfczcTXvs-VInKF=Rk{075fY5l3>h=I{T#xrr6B)W|dPe*h9` Bcas1B literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_38.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_38.png new file mode 100644 index 0000000000000000000000000000000000000000..ed38122f52a73a977c2ed044d22e8c113ae6c3f9 GIT binary patch literal 4301 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_39.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_39.png new file mode 100644 index 0000000000000000000000000000000000000000..38610bb4b4a9aa68f97442f901f3318941a2305a GIT binary patch literal 4326 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 Lomr`g$L0S4vAUb6 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..45e47de12adccf1b4deaa8bf4be3207357078bf2 GIT binary patch literal 4327 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_5.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7c293b4859a18b634ef661c0b206a41cc03ab31d GIT binary patch literal 4357 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 T11a*?C&S+Qh*g=zsSE!Hfg_nh literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/frame_7.png b/assets/dolphin/external/sfw/L1_Mods_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..5c840d6f642fdb36967d4646a3d3695ec2a12da5 GIT binary patch literal 4331 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Mods_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Mods_128x64/meta.txt new file mode 100644 index 000000000..0225c7e55 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Mods_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 23 +Active frames: 18 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f9bc775cc50b2914c5b6db268535d21d006399 GIT binary patch literal 1607 zcmV-N2Dtf&P) z&R|;roM609XshvMfQPl!_%gu5+G?~b5mwP??26yDNr}6iSj7YttnjWdD1wOdS5O_% zXQZKO99ILJqQ|LiHIAzRPSNAkwi;gscvxGFF9STR)%FsB93LtI`{Yq1YD)EIcL%`< zPP{V>NH%FiWO|c38l|97knnzMbE{Ip3C^o~Ku0x{V zTN_!|TVwSJo~Z>Q?ELFslfeK#6yZ2O>UgO{gaM+4j;=eBfd`z4W9vRD0 zxPOjP50|gCnK@AzPiKHxa5+#4(0=cNWFG>Q=6_KYxJHx#PDi8$$iTe?c&ER$rqb3d zcu=8vEdqp2Pr~Y;ePsl4<3*K11EtI6>q$90NKjM;>n^NverwIH0VJg1_&hWfWHulf zL33cH0D5{Fm_?VTrU2<^SrB@Pjuy;rK&G86qBjQ=Qm-m`Bj;xe@IL3oA9f%)KeOPh zp(|*61p};Nk?J5N`Zr*H0$?PZ=j6)hp|R2vg1AjTR!>?@xf0cC?cvDOR(MHaFrN)PCMApwjj)&14vl;Q2vg{(qvjjmuV&<)9U9eCu<(rukCMJ4dCu%Gc>1Yr6ew7=`*qv#Z9jzNn%BWI2~p zHZp%?eXe%?bzQ%Hh$h|xoX7w~{+C7`Eqma> z;uTz;O(JVo`@#$MqicW}Ser&2Z#fL93A9>3qkB)z4(Ah1z6sokNF^bG#Q&QO3|@^))M;ugTY*!QTaNB|i}eTa1j&17#Et zD4U>d7SMYDMCm7E=44wZd8Uq-WdQW_69KmXzN!BWoRT?4pV2-KJ8l83HNOVv_+;lJ zRC>q$qqV?DmcmoAlP2>P_lsl!CkE$V}&J{Mk0?)lp&(E z4vBtiZ)9I;O}{3EfO!T@iIFq|KCJXa#Z08v9n_w{6;!LwSvXP=1uTWjs< z8B0@me2!8Nl`oB%HBlLNXMifG9H<0HKMz6t9Rif*e^3>;N0b3hN2CYHz`O-m+24B? zX{!nvRA^m`0HM>9usUcT8G+PzQKis88M5hqTn-Hq6f=W$7gjmH_pbK<9Nchp9a;)9 z2jGk#IWW@z-MtJ{G31FQfIFHugqEV-hS>w~vXe#h=756hHA|l7{A>e0);#FL0i@<< zHmn+Y25qlkfK@CqJ4jpm9Wd_z@PyNvoY`8*uuK4WYdxb%*cAX4Bt2)`rUu|^AXlo=iMLkokoi1M2O4M@=WEYaV#W6W z9NYe1fQCv|MQ$Yg^Nf4-%Kjk2R24kYMnwAg4$#Vulv$i&CEG~Z7;z42KkF7S)AkSK zj-GjU0<_@PGD-^+`b+~42&p7R%d8cwv&L#Uv{7s;DxNK9RT>~puOK%TJp43%G&J?*dMXqgIoK8mg?*V3kXAjzcjL+7Z$a|j2 ztGa9t8k_72f=fz(MvKTgsS%%` zt_}jJ#vBIAq9zK^>(e>lw3L2JPH zT2AK?JtWMs&#qEj>H)@qSHm-?WOT{-^qJLtM|4HuazI7gI z;7s$FDOJ0CadZ!miRdyVI!s~NKw=dBoXX^Lq<~!Mi{AU$3=lD7K)0{+`La&dgKq^W6^K9q8UcbLs`zQuz&Hkm4N6UOZfA2M1 zNFSlCmE_Fwg%!BvTL5yP-H3F>+FaiFWo2p4REG%rqP~!1db*ds3ET-UL-{*TM=wZt zKY-|Gl@#xpwD%65q;3IR(UtHrRC-6}SefmidOk0Bw4k2ld}RMH18`+m!^+SBNv}xb z=K%>CsZ=1DuI;mm0l2L~41gYNH;|gkpCRB5MQV3e_Rx=(or?1{_T$fB2B1ow3`(P8 z%s5_?jTjbX4C~!dJpiKgX~^nIoryGoS|)4nB06N9k7j>s00ZzteKMpPK7xSHvp%Em z5M5R>K=0jVfPug0e2Od1AMFJ^SsEj#e-AK#9KLc@Isw%>x(X2nh=8vB2SGc>cI6W{ QG5`Po07*qoM6N<$f)%Lgd;kCd literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_10.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3148c323e53a435cb5d395a91dde8fca4fd0c7 GIT binary patch literal 1606 zcmV-M2D$l(P)4I23Q=PH;3&4*c%d zbzLoi-g}EaI`;n7`L(t7W_QFF9FNpf37lZOZ&)?EW|0bj4AT>g_YG?`eih(mt7Ov| zYzu%BjQ0&|HGUP~W@|Nm72sxTHTsnZD>NF1;Ga^GLU>U~gTzyARVz5bc@@sL{1Ua@pk=-Xc!?B7Jmair z5LlJOgC!3Vgc|LY8H~`ebhGg0$EH*O?s(1s?LAaT51N8A2AZXT1n)}vo_!*qd!L@M zxB!x%QKpvg2n}!bXxzO5%!1N^TEKW%y7my+PnFa9T!ar&0Zs=p17u*H0<0`YT0t~e zD9y}_5kaJ!o`lsw`#=aWX zM5ep8fmsZCVhf-K%{p+_`2*EXLQf7+a2c!UdCs5lO>5-40Br!v7{Ai6RGx}JSWy91 zRgvl-ZS6f^{sO=vjxa_9MtV38f{GacH7dgM#9)>5E&V|VYFOkXG4{`9Le{9#91`V) zel}3~9zf#Pd$0XA&~uO^Je~MaUKwPJI+J-b?@v}a|7E_gUIb|bJV6l}*&#+lg`xozg_czkB;~El(u}oo(34;Vs}-n`0bUJ&2+-q> zmH7xA>sg70tg4{#&&Y}T zCUgv}#H_K$(3q_lQKL%qciD*Yt9}o_0sSbnGE*{V_zbwwDlOK$+IT9^M_ zfR-K9NL5FzksX?$qvvUEXi68I9k{`@eUdI#5R|P=`AwjPY(=onuoZ~B4AGoumHZ4p zWMA}@vT68&_|}~=y^Lj$Z0g` zJ+8;D3b5^O12tr-O4RY%;K%#C*FG}fQ@b=!TEV!h0&M&L0W?UxSOYRgM4T_tLt241 zOmf;1Pd;o)*Gp%Bkfw@qRj|sWw9iA-`H?b?g4>5*qeJHMwSlJqM2X$tJvHk5S$(9o zLhnm^t!qU7=@~#OMb>&EMxPx(j8FlD9^b>O5T8pj>v%r0KC=u?fF#SObm2jO&JweF zWP|#7N9S`nX3O9TRJRp0^P{*;1_i?K8M_=dteW0ROQW{mdRoQ7} z*?-~lU*@%a1`^0Hp2U|%f3^Z-`u0l9>Ve?68GtImolE(1Wh>jjj6o$xGfU)|9lklP z0=x+*ID-emtn)c-S`ql?l5A8KO-BA4cUrX`5%k{w|0*~WWxGqI#yb-EvqqDG-nth_ z627M@C_J7N*LB_J6d(<3*Y)~i5^YA9)n&HNYBas;N}s6qxl0A$kcK~R?+nnkAXNuW zOM8B%9auCaKo#I5c$x1#hrk;^=|29sH)m*csw#lTD|`x|%AXPpNZ;cbOz(N%&Xann zCQJ05MsIb3hAKc*a0Ih-k<6$2v{}NEkM6NbJ1V2bqssXa{%!@}!d1a5le3_*OZ26R zK=(_I*0Nc1KqS*8nO9bTw`$&u_W+ilD~7;mAVf>Qm#tC5A%kYrF4n1q^Nc#*n=_<) z>URND`CYiK%XLcD`INqu{d6C~)0-2l{nBR@(|-hyQ=CsRGt@*4!ktX-OaDd?31kbi z+c}vd7V8FvmI!G!UAIStM2vAhp zg9hEK^R0^TJT3DjM0;JNFKVAh0>v8KR@iM-1)$IT1OFokWDyH7p8x;=07*qoM6N<$ Ef;{l{egFUf literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_11.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..89d003d071e2cc1f55f2c13f361641f996385ece GIT binary patch literal 1579 zcmV+`2Gse9P)7$I zpU>yBCD40s=+^P^ACbw1+6gv zQuSP6^l-}vDp&iN2aiE2Xm&M?XBZ&E!cYs~3Q_~2EdY65N(9uvCH?A7FC z2B5pQfmsZBVhf-S<%eb_{)(!jNic)x%>f11t4f|1{Om1k?D?S|4se0l%&T;;q*n$j z7+@8PR3~X`?+Not07Q87nt>`Fscb$V&ddOrs}p)=Rbo{pt7Pwz-v&kR}Oj- ztYozk74^mInFs?6p%NV-iDPAMgc|9737!*BTJ@5(3feiDD=Xp?iq{N~?Wb92ilTa; z?Zd zRsVaIKaJ9_vlBZqptM%YM#v1H%^{H+OY|K^_B}v319;B9sx?$#IE_}ST%5Iz0ScENSA^jp0`e-BWF%?W?aaR&-YXQU9ECvm8XHj}a z$>uPP=W< zhCFm{R{z**PW$)EpdHy(0nNbK;8)pF;g_r(nR9$M)MVdh>lEOQa z+m(6`uzL`ULUIJ+B*`u-L1ua{-y?lr84Jz!V`l&amAzWC$zz4yfB!lfk>lxD9TO|@ zZ}le7t4_CYzs;)qOVjX!W;dFaS5^Do}kQj@7ELvb|70S%X*xI~bt% zE;GOYI)trGl59m;10I?P1Cb%J0?}C@qC5TU?e75wuC9CuXiGq?)C2$k literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfe6b33c57afb008d06a5b1743c5bd6164d2522 GIT binary patch literal 1608 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d39cddea149d9f0f70b259df9151940b13736955 GIT binary patch literal 1600 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 Hu0mjfn3n@9 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..3f492eab5e1f5c86ae35be949cb4af2cc7d78776 GIT binary patch literal 1588 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/frame_8.png b/assets/dolphin/external/sfw/L1_Painting_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a44a7315da3d4a550f3453dd8d221dd9131bee83 GIT binary patch literal 1623 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 M07*qoM6N<$g29Fd+5i9m literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Painting_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Painting_128x64/meta.txt new file mode 100644 index 000000000..6964b479b --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Painting_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 9 +Active frames: 13 +Frames order: 0 1 2 3 4 5 2 3 4 10 6 7 8 7 8 7 8 7 8 9 10 11 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 57 +Y: 24 +Text: No mistakes, +AlignH: Left +AlignV: Center +StartFrame: 11 +EndFrame: 14 + +Slot: 0 +X: 57 +Y: 21 +Text: only happy\n accidents +AlignH: Left +AlignV: Center +StartFrame: 15 +EndFrame: 18 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf265286418916cb7d41a3d6c38579b229ade15 GIT binary patch literal 1762 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 YKx;?vKP_DqJAHqfBu$FCBGI(=KMzur`v3p{ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..eabe9def3375a009bfa5cb8604e7e880eee5c187 GIT binary patch literal 1750 zcmaJ?eNYou5Wkoj5fIc$1!XiITC3%f%OxQnf)bJ-Fa{7}#bS|5?h>w$T(}%2P^1w? z5Q?Lt#nFy-;z(5xkW!>pWk9KlR7-`b2m*gtks^v6p(;#EFML@4aJ;*B@4dbK?f!P( z?p$GP^!hpOi`)SKm=hVHieqL6GeX_i%=@9+UJWz((dq;`o;1)ll)?c8M(S{GqzN_R zaX5-)reDW{0f6lwvbWCo>Yj>Hf!4QA5!ZbvRfhK)RiBA9bQ(^RBB!-SjZNL2{PeBogP zCYPzg#6hq^DpabZ0)bj74HL;!>TpqzDomja4@ahLybUW6Db!-2Odv&M0vA>$R7jNy zSf)^`V5t<5Ok*R>RvIwG4|RpAt|9mm2c(!`xeu$*`c0i9HWiuEELBos?!kjMawA)Q2wK|&PK zqauMpr^A>4Ch^!CiJPoZM#2PPndTxlU^-YRLJ>$T6C)6&6QK|qq?bSvOdtx93PiX_ zst5TDMZT+M-l(Bz5mT713$b%JH&$VdIzoX8GEu?w3l> zXUFeuOTE%K^6SushFLMyNsrw|@K+g+q5RwtfA-a$QB@PtYir2aSuMTvq@!S4@ycC2 zuQFQ4*6tr&6CK#`Jl@c|%(t!}@l1Wscnt8MMbUCGslw8glbif)M4iOT-*&l7_Te4ti$_n-9rpYkxUs6n?PSJiN8|Uy|Mi2v#Nx?!p6&e@tlP2n z&S$(e8+}ffeA>M!ls$X#m>LS#uDJXt%(&ds|DNsEYC^hBIWkbuDjBHVL&O)9dWCNC zII;T9K*7VGkHvJAfj0q9NAut^_KkaoetNK#`$bcK?3rUhe#wsoNf?ZD}qy z*8AK(Q*62l06(-B@$%BsEPpNckLM4R(wT#8jc&*NL$hmY>`$Y7wq};x2AxNuk0Ov? z#CInS+$CQ==(stQZa{SS|?k&FNU literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_7.png b/assets/dolphin/external/sfw/L1_Read_books_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff0aee0c806af1bcc5c9a2a268a3b6e124f925e GIT binary patch literal 1747 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 QM)$uaMV+QPl(=&3e`D>68~^|S literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_1.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b3f8a977f357187cbe110fc5f5f3429141dc2f GIT binary patch literal 1742 zcmaJ?c~BEq7=Ix|2#2(Vq9Coyq9au|+3e;Z8Lmh`QVi0_2t7bHn+-%rHYSS+*g|A1 zT2S$%DvnYRh0zN2KrK*FvDUF(O4V9A$Urw7);}C~cK5ya?f3hA_v}|G z$qRkGg1rC$zUoAkmR+6fgL`t>cg_!g!R!*m#HTY$Xai#>tQ1h{X&nWrO++@Or3ih& zii=bv0NhezYC4myS)?FolYnsP2plF0iv}Pv#$h4IT#A8oRJPF^1rM~Gh9RRq3Qm(~ zP>m&y$}uJuTB#+4$*E*vE-BZ;G0{+@L%|Z5D29L>raZGv;fR9Acopp4B^JWama=R+8ZiG(8dmLVdU0>c#|IW%#>tU;^Z zpwOxkCd{#?C^&~;q3`1BA#8zNt2nS-eg-tT3C>v=t zS{Ng3hFpwMghOkL6o4z+2aw)RjC>C3dY+Z;v6;0-wC^Ms0MZxSBf!?TBNN`*% z!zmPzi%Bsemdhd#f|TeGgHDebC>cuV+lIEo}k2WxeP~9ktjZHffB=2@t6$7 zlyPxNEMgL?Hrp7&Oj47!jjZhnY{VO}ia0ApFtjz5rt>BnAti@qXj=|#fiPTvLg5;M zG@4zK4_s9m4_ZZ8jVmdAf|WKwV`)|xU*iHM$4HWtvEfT36e2N*hqLe9i%y;MyM1>O#2;DOD%#%$YKjkzl_gfMZoCB|!sj{aylxe^)k`)2@jHHC zM@#bi>BC=g0{GtTl{Nc!;m(_Go*v*@o_&3k+q67Hw^&@T0BTEp2C*}#d7-1JMsJ?$2Ld(n^(=$D-yiJ)kD*>q=xn?7O%iQ}nuXpLQ^}DJ({kdNU z9vfIc%Wrzc`7L!VsLu_qz3m&{f2Dl)O5dyXCo`s*S6%`u54Ed~9;n!#cjAK4r?}VW zvUln1X=PU=@2w~WFZS4^yOwjZv`yKdi7xr{pN{w$eWHb6xV7)|yY92YgW8MEnX|09 zz>v|FH2*QWw*IkS!%{GGDx*%h_yTitRv@1`9v0mU`g*;Xng?rFZMw9%D@1&uzRNhR zv>Ag-Z1nBuI?hngwwW8-f<5t{%3C$Mf@iCI+7oO$(`0A8h(g}r_U;Xw*dgyPEMbR` zOFIG~;D=cJLH)ymKe$&pCl5bU2SoCmjTH~McKwsO;`Cup6re>O1;0y0D%T%I9iOZ^ IydbOOKgU^uQUCw| literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_10.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a474c21479d42198b80b6e5c29005440d8ebba61 GIT binary patch literal 1708 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_2.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f61e59efd34b111b72877660b6715ca48940bf7f GIT binary patch literal 1688 zcmaJ?eNfY87=KH_BEuUvbRZM6;05D4(tJJcqgMGxFT=t#OI>Kj{07jL>Zm#|V`wVu{dklI9~Q(B79 z=Vfn#1_RO=tL!Q6I)% zhiMRvC5p;0#^zh8#QgXqGCz~V_54-g&`P_4B`{G80ohGiW}Ctu#-HR>uzRN%=0lSz zOlBB=%Bd7h0u)7CDM%(12}lG%AQ>*C^aQFC8wfH4LJ?F1i`ZKx5Xls%SRulp>5I=A zwCW8CtulJr9D54mXE2OK0mHeuxx!qrkhZ47A{@tI1cgylz-kC=d1i*N3(U4)7lV?r zkyfLHG16wp$w=tv943sY)K5kE-;(EHyd&)vfe1xT8(U7h%6;d=9nlmqgICT*)Kx9QLn(n zVu?&lAp%@NN(2&ICKnJSrV|)+delJ45JHEeE}qxnqcIUCSINXOF@lIhs;EdjN*XE0 zaFq&I;gNEs3#&HU7{W|aF55=d_B0lKBUTY*r3i+$Ced`3s}T}1Xoj|B&=v?43lV6k zh9He*r(~J4N>f2ADXVb#0pfZ72A{B`Y zQaynoB!3#Oe{{?-c;Md^yzvLv!69;f&uHV|E>PcofAQ@|UvQUnhl7eAeDltg<8BUU-P8C@C5g>x zPcs7wdjmj4adktg+Q+eVaHmJ9*UxUhB`+LLJ>dH|Ji#1msY24OS&JezHk{g)@rPG) zWLfBW;RoXn3z&z0$N$>u9=NV?03g``4@Dq#VASX2rZh6VeNnxTAP#wRKL00XPes78 z>mL21IUy}C+NyZObH}6E?;>B%?Bn>*xq z{c<;Nc6Y&9Zt?BX^o8IiPrKMGt{%*O3zQG!H8o^z&fKCIs_pYGrH;?LFw!wrt$TnP*XwBk<^YZ8|TG`KisU^ zZrf3KIp*4Py`LQ#F6`=jo>jx?Nsrn)vS_Bi!DD%EY1Mu&aO7CTlE)$a8*fz}Pn5U% zdY^Yo!Al*n3E_Ufmp{{n=a}V3A@oi#Sl*~O7*w0RcMkW^l}~E85oP=O*PP z=(^;n=hzo1JwL^6*~e{Jo)KwL{IVidt8IW}f5pp72XWUjfI}AIG+~X6^s(OiO{gKZtSX*^^IvR^|Lx Ns8#XGW09X0{RbQ%dUXH* literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_3.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..87e297b2a7292eb0a93ec9b426d669a76476c949 GIT binary patch literal 1745 zcmaJ?eNfY87=J;l2r^WLU$`v`pfG5grY$9r3fNL)P$Xbe19Od#Tu2!cQ|OhD-fR4djKWB`OBs7NT{ZW&)B!%;CV!l20u<_t1A zJsz)AO`79QayXS`&A3pQlanLJ5esN0MJU2BOo*UD6y~#+;x)yfq%0(3 zFtY~Q1lbu0EuF>6Vb0l!D2!&cdYaf|namZJHKCO-3q=A%Xf)bG8`rk5@znoryjI(i zU^7#~c*;U&F(g+Kz1I|&OW&If*%di&@L0yc)rH7V(qxvAGO>|LIm~?#=nOhsDi%v* zVhZ775>mpKV6q@SK}xlJy;g_nDH%d&F?5ROb$AsfMkSaiP$otYktke&DOLxmR7%xq zSr~#U!ltp2CJRfLNNUQqfwMh{mA(;+D;SDkX(oZDGo~6rlS;F+C6zWqs91nNzG{Lr znCucidzB`FR#J>1o6@Nm+6axO88^Jf1r$R`l9X}bOQjTFs+V9~B2XD$ED02e^np4; zijeRmUiV7+COVaqaABCIyumR_CzWXlF<+idNdG`h@_GrSjf33 zw0F)coirul+S9(B9u4j=JzSKDn<$1GodtUfi@33yrHM`m9~&EUaB#qv)mH-G*dD12 zOR)ZYsmz6GMx2zkp+>f5n^$vMtDQcci+D9Bx1-Sf=Yj9i|Fk2Zb8EomwjWAQBNtX; zK56mJU8?Derr)%+?YA(+y92W)$!)^#R(Cm}5>??)enEf(73T+$_~a&%EapB;|I2 zwO##SuD=b`?Oh0Z8+e*~d9K}OoZl&^=goTy_yaAk$=&tT+@_I7i#GPSLi2}BO`C3j zG?gR{tnY{juEH+9ADVl{*A|*x$P4w`=m>dsz*U2vmSMMsRnbmqimI*y**-maULVTc zJ))gk&-$wOILv#veZzMumk$m$Iz3W+E?-o1=$LN?vp&S3Q(F(9K(KFlK!aP2u&^yQ zzE$lp^6e+yFT4ubeTRmNceKk7)bt$R-wo=YWYu3^&%bMV*f@u6)bZxzNLuO^&eNVuC{B~32%jJpDf0}-w2gs)# zdzOCHzs%9SYDCkzdw6$#Uw2S-RT=F9h92C@j;*sr1ncJ%e7)}Yj*7#h&||M_yk=AK zX(_OjS4Ra55DVk_-Hx6BgO+o)>OnTTMXlYbNt8dUowb$czIkP^dc;$-z5225rmNlf z-7Ul&y{I&=w4x()#M37vAWyn^$*&(?4sRjghHZ2EjgS|)Hf@k-{?2kRz;|DIRI^mX`I?@pmkUw)VaBZI*Z=Siz#r~6t M43ANsSe^XYfA0;5ZU6uP literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_4.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..62428a4055a629a59736231282016f0b6154297a GIT binary patch literal 1735 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 I1z)cG4^f_N?f?J) literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/frame_6.png b/assets/dolphin/external/sfw/L1_Recording_128x51/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..942f082b83af4a2228227f53134ca6b9ab3fb391 GIT binary patch literal 1752 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 CzKN9p literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Recording_128x51/meta.txt b/assets/dolphin/external/sfw/L1_Recording_128x51/meta.txt new file mode 100644 index 000000000..de37d5b2e --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Recording_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 6 +Active frames: 6 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 0 diff --git a/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..851f1d01dcfdc8d55e1b1b990c1fa8e5766f4641 GIT binary patch literal 1542 zcmbVMdu$VR9KUwRy15tADJw#c8!iyI-lHA2tE*kNuC#$}%_wdI#a^$!uE*$IyhI1*UNhYS%TGOpJk?-ODS zfyW_IgAuvsRIS4amkT0*DJ_ArIF7>^VNO075x*n_4H(wc)TC|FX$7$!BWRk&a1tX)R7RkoW?o_hGk?{y&$%x3#-ism-bU5xS=0g*?lCy?Im>@=IaV!u>gf@;2N!8$AHy(%% zxtfCjs|FzQRQKJtzQx@)prPT1S#eJrClSm061Pl+`?+DAN%{MR{2TWwq)E951q3 zX==VT$+hz#iQ!q0w9U!3C%E)OxrTBPFp?m;1Yu>e5uAQO5<-3<2$MQ34$pQlEXOA# za}rg$7qkV4TqE#WMIiu>r`fBD5Futcx?r+1PfxgitV`@o$&jW`;fv{f0~d_)6XKlR0yRnTa*$vI@kRYOY6Q@yXcEhjq*>&K?GjpaE<;@SPz z=3UK?Klx^`KfbMkFeraD*NZCbu#<16t@<+8lmv8r$5R~G)Y=BSM; z7-}19Uu)@URp&i^Q8#tQ+SSmBu?<(|3})wFI9XGNqz-C!-!(nPPVfJ8dPnJQMQrxw zxj7$PFc-eP0BZGgeRcbXcecaO9xl2uGnNXQb`EaAV#SrEH?o&y)Tp7(+-;k3uN0^4 zRXWw(`x?}PqkX~3%!S=A&Rv*${5SI+o25nxWkqvH+(x#3zjXZ*cK5j^z8y~+$U8V| zrn39PwyM}?~kB!JwG=TzwbXbYug@Vpd^YwQ@%c$ zoqDEgN$)Q+qktOjy_>TCPTohWpvLQ)dSaS)`>(#XZbjNIed#l4Uk=wPUXG;azh$$n z&Q%<0n3ENq>remchYCl~J%L$kOE97PmAdO=&lg zO;ADM#sPZj4!i+VIXyu1gjoo3EX)IZi1j};9x*a$BO>J@rSu2@B2Ra z{hse9uY2Z{W$1Er5CmnE&vaC(YqR>4Xp`0V1?_sbx=c`U6VtpXQM6JlMUPj%=#TWt) zLzFrza?dHB+XI(MGJq)qfpR#G!xU`*JWKkG)hst1CUKI$2=%5=f?`M`L(uTZg{TH) zzM83YxJJyWCo58`C_x6pB9Vw8Vl+r{4Mxy3jo~CllBkM6Lk$6ijiP~2enNu-gg99U zDuNV%;~H7N6jrQ=>g>HJ#Gu=KUvVHbk}EZ9SdI^=B# z0<02*q_E7XC8^F&kk#}(+)x~-dc#!6f?5~0-XU>e5d@TShZRx37VHx0EvLwR8X=a26xKITA6bbx(lr18PP?9v6QQGJ?p(IXl9LXC^6hR{+eE$EY z4^y4O;=S^p-bskmhKz6T4}*HRKTaT^&XBAQ%Q5$qGIh{KduDr`8jU6vi(Oinv=f4o za?2eyZ?xyK?~j(_xYl?z_C0lW*TP5Bi~2g-=bb(>HLXQcs?utn*;RU50nNRaH~W=jR69WY4rmDpE%8 zfO1k(PVD(J|K#n~SN87f(VttPKpnRn{q23L*N7LVp&Py&=*)|u#KpY&PMcQAh6ZFh zdFvBnTD>`%;2UD$&f*s)=#!4NzGiv3+XNjb`LK=Fe8p%E7uOS;1;{tKdGh2FOZA0m z%|g`|yL;CiZ`yh$XCvOU?1M=I7gl*Tq|Z-lw|RZ~odkYwUNcLb1o8weS7(m}aN#+uE2Ho&V0;1zVi82k0ePsV6_unlg82 z_buwZGX~1->o9bk%j@lGx%pcp8UA}(*Evo1T3zq#woG^6bUwa!)b^OHU)l3nZql`a z_PM$l`cY%E4vsqyncBp|_A8?}SW^FL`wIs19Xilx=j<+`Myu~ksXqV#KbpE~h${2yKJoa5MKuUh#J D%PA@i literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_2.png b/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..70ad96ddee80ebc482de9f7db27fb42e56add439 GIT binary patch literal 1552 zcmbVMYfuwc6y5|zBZeYA21T*UVn?)W_L0D5*Mvt%0(1;Sh!v|&-RxcRRfjl{0bXF{c>8=f*r`5 zhc=M(@5ZWrqfAN zSiykb%1wDq5zMDnejb~0`O8K@On|!OqfxUG-aZ+(Q86UoZvW;H<~DdM#k~{ z{|z6elENaj@}Js?iqwLPET1-mx_R18z_0d@q&ABsFL8s~XcOFvJr0dV6Ap)mmutU- zAnlwYd!8qB<#zejmQ%R?P&oYgop~+RN<;{}l)IC$y(#?^lW2XkJ`jZI}1^gLLOgdZ%rUovCw^z7E~ z!l~;=Cr*03x1pOj(EG`&H@4hZp>-BmZ15W$dZ9@eJ^e`6RF+g8EV=NvRs+5Y3CO_R zB{wLYd0^GRp3#v4sG)jIrY)to@nqF!?L!)OQq5({hS5yO)oSRtesqr~=HW%x%;6~? zUwmt6TLM(sxw7d1I&nhwz`{?>>-6lk7qok4Yui3@>e%qT_GzZrF6PhIVswe=+BFTK ziVm;fszPr|6 zcj-`^_TI8{=QlTZ@1CaX{P0(3DEGSfcJanplll`5>zj8jKK_fXYy0sLP5k-#Gq;Y- zyFF5WHGX4h<4?n1T)|JAO^)3)U&=2io40${H}7_RYmuQ%gVm4bA4&Z_Z>Bi(FoDmR zYg^&YKdIAX=pC`QzZUnWnT6RyH(Qt7dr3Ev)&)&nr5_%!-0hG2ql+BH_Wici8~*|F Cax7W^ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_3.png b/assets/dolphin/external/sfw/L1_Sleep_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..03b2f529a1e8741ea968d05ae6737c0beb54dde6 GIT binary patch literal 1563 zcmbVMeM}Q)7=LLi)(%;5;uxBF7M+aQ-bah=omK_f&N5rDlvs_^UhiIPhj&-6hZIDI z*g2;RKf?T+24#!JI7Cf!$fAU(i7}GQk4430YGUG?6JxRuKcKrJb^F8k$1ZpGzVCCt z-}C+47p3kGM{2S)0DzIs**1^7*2~Wme~MIpBW9)OeK_%09+E{t-8L>(>f%? zT6OdCU6?Ce1cRa3wIVF5b$glGN`_>0GiM;vqm-v1zh7%7}YhAy3K zP-H78kIgY;PCi+6K}iZzC|X@zZKyUH1aS$9lO%~^1WFKk8KIBV@Dd%>^O2mS1{;hp zVkj(y1RhCfqys{gWYx*ezKDVgyIe07^O2!k$yr0AbQr}A7|L;p&<4>F$pim&PJ(XjT-D4)k9HE7imwD=Y`Oe>u_wvt5 z&Mkh{{K5F{{Y_6fRa6P6xhrqX=hL4{t318r@UHvjjk_HRjaH*-&(ONJ7UkLwj&rp= zG^_hA{BkosK6V+NGY+7-+p+lY5sUx$)S2Z0Y-3B>>bJG+d3V&S8^3+L$h^y6t+j4t*Ib3yv(Msg_!tx``>ULcNR>uEX^z$8ezPvtQ3p=^x#=rVubj9& z%{DQzBNcF?4&CYA{A6cp?7UAoiyYIe-ahZfM;RNkk@V5q4!)~(ZOKy|O`Y((wYB@? zoV!!@fvy8@tXJ8}RXc{?&U)~7HORWOyS(w?gzd-D3p_m~p!r#5>xQgzCx@Lqe>0;4 zxi%){>Zn5lm!0aXd!TmR>B8m3<^F#4=+3QoKwit?C#Ni$r`j_YC)lxLn~r>G(fYm~ zYkd^Fl;gNE>2}lMR$^bN=26ei^0ALs99jc9a)f*8^=t_|o?$VTr2B)X`1qL_XKJ-S z?K(N2ygvTTy_0fV{GWmBwZ*C*?r&SEx_o5sqE!{Xx=hvc3_m#0mG*1j+V6$L@7ig1 K+u92K4gUZP|0-qx literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleep_128x64/meta.txt b/assets/dolphin/external/sfw/L1_Sleep_128x64/meta.txt new file mode 100644 index 000000000..7960b0653 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Sleep_128x64/meta.txt @@ -0,0 +1,41 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 2 +Active frames: 4 +Frames order: 0 1 2 3 2 3 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 2 + +Slot: 0 +X: 53 +Y: 20 +Text: In a lucid dream,\nI could walk... +AlignH: Left +AlignV: Bottom +StartFrame: 3 +EndFrame: 9 + +Slot: 1 +X: 53 +Y: 20 +Text: OH MY GOD! +AlignH: Left +AlignV: Bottom +StartFrame: 3 +EndFrame: 5 + +Slot: 1 +X: 53 +Y: 31 +Text: Just a dream... +AlignH: Left +AlignV: Bottom +StartFrame: 6 +EndFrame: 9 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_0.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..340ceb47f99ee859720fa8cd89aa51f234799bca GIT binary patch literal 1656 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_10.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..890ea5d70da8bab182cd7d25c234a2e2a1e9d610 GIT binary patch literal 1494 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_13.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..6eda42b5d814555b5e795572face69b78fcfb0fd GIT binary patch literal 1585 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_15.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..554a177a93d8203134179860bc35ac3899407026 GIT binary patch literal 1771 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 b4o3I~m)4F_96F#z00000NkvXXu0mjf;*=8M literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_17.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..971e8f55b5c36b7f5e24c68d4adcd62512986417 GIT binary patch literal 1503 zcmV<51t9u~P)jd3cN7lpBDK~TTc%nL2xyv)oMky*1pDDh#Ld! zR{rk!BY4vG;xfQb!#6O@Nq83~QyCz`2v3TLD)bnChaUehz;#`*#NiD*`;#!jHh&m^ z4rG;CPu+dAd@@7f+IrV`wbojXQ2~4=(8l~SNG*mLAR76+%s34d@W~Om10w;I$^oqU ztbxBQa0XI2fK{*U^W4y1!=Hr<02;vGsO6FFJ$Fxjs589F8NLEP9|l>G?mg2Ik$pZ1 zt7JPN7rNyD0KbCGW`dKQ;K`r?{Nfc@Im!g1r-f2C2O@&zC9Y z;bm3QD9oG=vZo2@HfzSc0j`J6_vtJX{xlHao+C*0GfxvEOt9*1;@wUVCIfKr905R% zY_DE>rX^zJGYBd-A5VII^3hhq1?)?qsm{)+A@i3H}G--ZN45%iSV5a0B|?3wl`;@hAO^i(HWT| z^&{(AYU~{h5TV3~@o9dL%>}Xy;I;E|3@)Rzhg03`EdRNhpM+?{^T^`w@cm3B(K#jK z@n@}nWP5rX1MtOD1<-n}AGXInQrp=|LK%1&HLA4c6O7;5f*gQCiVXfgLaMjMrTsFI zEy<$N#{mYVz=M>0S(!nO7u8$_Id_KO&ux0m`$bD!W0 z+ZiBA%cEmUiqDJ@VUFFApDELF&vbyue%7-MSp73j5SeFpq|YvweHfJ80{A!@ysaUM z9{N17)bwC7Ky)wUii-4+q9!s=6jsE0b7^bYZN#3kSN;pw4?{c()jZ8o@(h~JjF*w& z9hm@S)z)J5zg+}zkBZcLeIkk5ccI4KoVU_MTph_T}DB6~o(RoZ=Kl;5w4t_c-f6I$#!buo3ha zpDSZFs1snh(&*9}dm{c;wgT-@C*TfY)zLP5QPy0Mc6?k3BTJ9&u|0cv<+xtC-2o&e zWJS^p9dV{g_UbiuMApjr(+m)aI?aF)29U;z&gIE9I#*_#462!98Ut_x;$#`cWF5e2 z%NNlrmp4x@X6GiA#&1oy2e8oE{Y#nI{!-uT(tiNL+i1zqh+LIGS$-nyivQ$2Qw}A5 z*&M*y*QIBxFI@;#npLm0iM;br%>ddQ05wS`j#HHghQ1ZdDVGao)obI8)bsgAQDGnp ze5=BDEB1J=41X=03ZzBeifGbgLpiuy(Z00(3P<2HjwPr0*=6c?0owkH0`CBilxPwr zIcr5y8G*$J{CRdc<@*3!fisw4bj(Qq*^VI1vnukt7$CC{X<>*R+e8m`F~UkGD06@a zrP8*v{&cL8Q_2yhmz7(9XIO2|>k(mO3)q#cX0akC_zyu3=q+V8lFR@A002ovPDHLk FV1g}Xz1si) literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_18.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..4026dc37364f9ff38c20c0ece6b94777fa4c8810 GIT binary patch literal 1663 zcmV-_27vjAP)Fbt%F{{Jtl4+Xaj!(*t+$7X=QYg-a29wSO= zdJs`-tr6om4*KHv;3b_;MATX%{p^l-!W?$s#Toy!%zxT^dVnOs(UMlX4cS`zI&ULB z7~pK1s8$|YR!U)^E zF@PK>x>h6g?5*XK8H(rDJIAB7)_R;ulrw=h=9fX{VweHY%-7dS&`1TJoRMc>B%w+* zfcM^dj*Rui`6$%@-h0c@+*UjK>-cNoAfiU}PRrV<(S4NZcXjq%_V6?CM`kMjUAcO= z^Oka#PFD!Dj~al8-0ZgQWqYq3q{syW;i-6A%B`bd=~#pbxGneX*&SFx^u>CF-vyvs zH|?wn^=ECrfv^^@=%qZtL(T)x%;!GdmQsFZf@Mm5fBTsP{B0mnp0!9;duIlWRXd7Z z1?d$EI~1)o`cv&dl-CFz&;z3tneWNd3^pqJF3x9^7~rFGVHc1+iwuXfiTYJ>Hz)R@ zwHDU^$N>7p4>ca@e12c~F2SoU(EHy|7w{a10zeL?w}jH5*-2tmY5lj=M(d#4SMQ&S zDFMLHfq-N-I;I}i+I{FY(RUl34o_wRlNm>9fDG2LvBwe`l@rJ6F?G*8?hfnFj%YFi zL_&!^mx7GOWu{wgkrT>l=11oocY|ie5(A(obqG8ruf>j6Tk8bbP0g?03-9Yb^j;Kao)bconzR&VpQ{dklfFfozLp{zz?*)dZfr9*kx;ZE z7@x;G&3Hi#;MF9IUC!4w*E%gd36z)}XOd#kjGfIG)tUndmYvQgqW`}Q^bFjKY@M71 zgju}I)4FAuKa)|k%~v~L>i;&Ef9?FqA_n!^tPX(cm^+t^UZ+`@k@@nOY#S~CmQviA zKat`Hdio#7`%y3osdF`BcLV{;@oa=FZ+eW(PA~2#KiXKCQG0`+*ZHhlFM2X+HzTl~ z@+$S0^RR5`CCNunTl{aWPu?K9kER)~y_SPGG>hhpM!oSWPKo;UjytkkAkQQFb#DVJ zPK_e58U&s!6pge$tg)mXa_!=_DD6i&@pw{BM!#n}cZTzcDE?uHN8Oo0EdxhmWjc8BP=-NumE*~A z?{G!zU?Kb`VHq7~5ob}R1QHNd8{`=>hYT|KuHfXz`KYZlNFy zHA~6S=wXrGK4)aQoM&cdOLyI`YYE64X;D8@sct)xvAyGX0g3eAxhzDwS&5*7WoZo{ zm68V0?{)y0Xv8`ZqgYrG1X4aq`+8219o(9rX9@6tP!PjgE)W@BaTB3e9-@zw(L?7_ zzY+Oz9BX;7?w9>Iw3-XBERPs2P!jB0`R?<|Hn0*1S-TNA6^E{L{*0iv#^W&~=cCDx+Op>y0G;@#f$l=* zs{+9*2t8RI8+Z)aTJgV%jf6+-dJSatzapKF&NCaYXI!)n_zPhwl15tgi)R1;002ov JPDHLkV1gE38lnII literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_19.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_19.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cfa50ce63ac29e44091e6a3257d7fa093d7e81 GIT binary patch literal 1661 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 JPDHLkV1f!6*p~nR literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_21.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_21.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e44937c1dc542699af72070b551bd9e9017462 GIT binary patch literal 1542 zcmV+h2Ko7kP)bG@H6lRj=2)NJ9B%jhyW{`3I8MgXhfa5rPjf1f{ZT=my z;jXB#%?AU}g{BU!9f)H(ndQYAgn9t$KJECA;|Mts$4BSAsN(>D0q{xPJacF7)x{l*!e!6K z?!aB1;XCj}vlg#B(`WDL6=4|=Gd*%nu(Olj<@_r=o&4$n0Q4FjWdiBGHs`No+!a6* z_?zDV_zZ-urvqG93J5COgEv@ep!PGr3y?Z{ZJfpoJTPYSX5c~kqJ}T)ChzREtJNcD z;6b7tD)GMzV@T`q{ry$AzYPSK)3wF~GlrN!V~z+5?0V9;(-XuP!)5?!0&cK_3A~1? zo)1`M##`pRxQp`~<#{OZ1*jxh#&SL&+wseyuLoc9Z*s9us>?<4J< zXgrG_-&yAXQCRb>GX`m%<$x9S-y`=)5CfnK+=$#^8tY^pJ3YtJl0Ke$+L*gSvip(% zpwNsbJq37G$$mG%$9fp=$<7C0CxKn4&~v7-)DD_7c@Y_W&Yj@u$ySwsYL_0FYn?Vm zVKLGjg1~b;|6x0C07M(a*@5Gnyyos~YX zbn6jlOaqYrk!n_MSDC0}xR?F`0t{eA(aH5ulkI6TD_1JFqY@n?9lNPpb7Ib zK*eYg$9v^WjTYFa=V_+f*^wY9_W;$b&&=n20sr&Ji)8lfzV#kJuHkq+)A;~R2SF>c zN*fcAHkIJ6~Q)C@)hFbHo>vjhN|D5YZkz#Cux&&y{vNJfiEN|JcYG|ZZpY3dKFj#2&MUZBo)yS3> z)UO&0SG{`C_I0piNHjElewDI;K*pjvUcq_Uo*?RcfF=g8>Wx;LvzfaJT;D4=HR61_ z2ZSdeS{Q)SDZeKL$61UpGs@i1mclJ_uYJDuvq_c61f6f{fzFMujRm7;<*$5(3_A1~=7$(`X0MzHkMSd{MB zW3T1^8AO!F>LA^@`TRzKif zOS(_dz5S@pne}JR=ek(-I6VLmQZtxs+GgxRv2y#F@{ph14Vke#N4usjBJV8R|W%Ry$03c>`-nor4 z8G*mgI6o2$w+R5mj!vG-+Q|sshLFznIA8s|D*$#G>kM42N3e8?K0UQFz>@=E7c@qo s@MO8wEaGRUd>i<}2Df3xmfk+#A2tH&C4KmzjQ{`u07*qoM6N<$f}r2zivR!s literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_22.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_22.png new file mode 100644 index 0000000000000000000000000000000000000000..fd800b8b936fe6d4b2dad012c12f0ddb54903236 GIT binary patch literal 1736 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 Tw_x!v00000NkvXXu0mjf>uC`M literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_24.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_24.png new file mode 100644 index 0000000000000000000000000000000000000000..05c5e969d7c10cb70d949d7d28c0fdf9b2c51c1e GIT binary patch literal 1628 zcmV-i2BZ0jP)e#l8e)t}|xbcaIT5BZB?uaMoumZ0h@lT8Vr|DBcBnYbg~R+*)g`VpJlX31nZg{~v?Q#V`XzBVS&T(`aQ}z$ZuK85jwu zR1RR(cOk6$9}8R$sT{zn_Z+8R``-`Oz(z!kh<4GLxwp#ixU;y+9)1S?UItl_?%ktu zUKT;$DO@2xSY`Z6=qhsnqW^-8FhR%NqW>Gf1NAK{h&~;GM|Sq=A(B7Hwm*#HgQcx^ z0ntd-n89O+ECv3YU_RbfC1-?L3=mm1j)Jy)eY0bQ-v$!Z_WEAVP+^0kUbM_`ggfmZ zT5CB6=orZnWIx%%p-R+dx47SevIBHP4}p*aL@3xhYw(O!enIjjPS9GTSLH!@n#WK0 z&}m=A_-LFibj9%U8SDNE`}3pGbu^Pegvk4XK7ePaXryKH1bH}xo<;ZH68Rh{2k@em z=yPIcXW6J9&naYNTWkJVyOUKwPW~p!t>vhF=ExTr1PL02H@3I*MDv%sgX{4zC&a!P zWbM&M4|FW2fr1&6E+e_(fDz`%o@`zXk=@vC7Z5$~_v*CvT(JJXte559xYd(IO+Kx! zJ2*k)aE|M?%K@w-+$bW+AIc9Z)X%S@he{(SoM$2+2iLi2q(M%tWBl8JMUQ5mqSo1TAs*$sd_~HZdKTD{L0=#ct=RvYgFGEy}l=Tc< zjeNvFNRA3dBiv&|I1kOJjYd#pN$}cQGIUruN7UmZ<42swVj7SAIF2xO#tB}YfHP5v zjtDF9zCGj1|09v@)m!&mmRW20Oa?HMz{+}tsQYNhXtNZqPM&2vuU}r@Wa30W3; z8;I6otxc5ry#6xJddq}tUzx;g4xrVK$Wf8oTB?YG=KxwXXda$%f{O7o2A9uNBG+qI zVHEDTD~ylkqqP?Mi5RrbO3%`OoCO)i6PUM+7(L=xE7#x(U03ClbA$r3w+($FNIHQW zKz6FJf%ObmHUn+qGR_oQVm{WSrm%SFW>V z11kXK{Dwagh6b}HziJrEvEd(MW&fdaFuHWX$R=a6V%|kROr#OI|IDYR5dR0h$u3&6L z_sGzhpeubf%tCAX{ke38Rr$dTbbW}EqUnt2}eC;Q?snPD{p z>;wRjuSJWcAVS38M>E1~Wah?W)on|>4n7)ESnWOoYf`K>vrt(cqRR)WFUd%>|EbtB z5%F47Z&AFq_O8--#*XI*;}a47W{}n4s_k3U5jbYFJrW}cqt$LmCbR@ZjC=)0SV`wI z5!ET;B>cIG{-IwAy_zFjC89@xj4kgg#?LrI_(P#xsF5}^@D$^7pu?Qm#-DN!lyL;F z-4ig|=`(A7G#PetsmeAms`x5aI2%Vff|d|!V`*%l?T}h)V;>2NwtKoG%+^!(SLrvJ a2mAw+lNpPBDxqfp0000(^U_4#5#o7iWbZG?H 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 RwzmKP002ovPDHLkV1h+$`q%&f literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_29.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_29.png new file mode 100644 index 0000000000000000000000000000000000000000..c6caf88d94b0d9536098767bffc4c66c4b9dd2a3 GIT binary patch literal 812 zcmV+{1JnG8P)?aEn`=V06RJ#06u%2);$!TqlGheHXR&I21tN1jb6=91hC-v zo+yBAPcvtl0$LG4iBuHWEC&0GB!1olSRogEyf)evfZhoDlLcrsVian7HICmc3$Vfr zXK9S2M;Z<_8Zg4lnW}9J4*@%Zi+@;UvBY>WKxa2IVJo>49hn{pIocVJq{DNH~d&cdy39L27_9Y z@YYT&sUlykKvvz0APp~AC>W{7Y*A{fDFBHxZf6n9F3HQsPF)0u>?nd6v%W++c2xmL zoc+7PHP&h)0Ki^RfFr#IP%Z%HJ&yv=68<&xQ8FF@jN<|@jtjszj{@+u)dt;%L0Z99 zHd$j^0n`ps{CN4xmI7#{u-1>4Q?}a#Vw}3uo5WE>M}V4hddi)8uvTM`BTfLlWlxk9 z#MI8m3YQZx0>Ey}BvlY&z7xUS*PQ0h#4YIrQ3zfg%HKFsiV)ZZpmqJ#D%u>@EP&hi zQ7HS(or$msK&$fs=)*Rr2)26<;NV~pfacjh3$7^O5x_Vu06}m>0T+OAmJ7hwe_410 zFpdjA7_0XIE&$`W01OjCZ~<7y1z?nzjky2}lBVM9^#IN~N<}DQO2V8rBUMDL+DR9H qB5J?()q3U$7l1-2S8d+}8s`u2Q7b?iK{5mY0000%G@RH6aA}XbjzIR33VGc9!;*7sr=HG2TEr=w+Rw}J#8?u!0IBz1p z7+|&WSC1dTotBp>1MCei;FvSvDoh3$VB5BjkB2*D#3-~le}x@C7+~ABJ#w`&^4=99 z`ND!4&8O5#wQi^I#*QLiFjdTK1ZP zfa9%pXMdacr2yTFKq4Z|1d-Z+Xl&v5OE^QIy;%{WHkw9z22u{{_v=_?1L@nhen9j| z=bnGK6^H!HG?WWn>1 z>gjy#%UFT5xA3V7t8Z&4|GeO-ct!S+$)) z>vskjCa{(VeYR1nF|6-*V*+c*4gV(40%C&Nz_OiJpjkk&&^C6Ye+_qF0(8*#_Burn ztpj9xuU)jiY->3ku?{-p@Pg>7g<)hKX$HtFH2~^>qJ1u04NJ8hVOJ+wie2rY!f9y!BQpQX z`CH;NFv0*{AM{*Lv=u13MrEuVV`VUCM4WH258pfVEx?o{iq90h*j1 zK;N?ruN9jOIj7l~yn;D+u827#K7JMKIovaB>vM?_)L(-P1itpr^J-^DgTccab+9u0 zXlMs9B6?(kO)~=j`wUK->3kxw6Uc@@owI_&3aDkrf;X;3eYHMF4)v@xo zBLZL-W*8PJ-y+L;F44Mv&kBSQ?8S0MIG<>60PI4IV$h=h-ar^t7@nCCBJI0$IwAme z;RETsR#=Xh#u*qP8ziz{i{6I@z&^-8IzP(!))*@oL4R*?ekM4k1b|e8=vX=*i4}|x zEeK`bnzOwC=>9KatVtlqnt;F0$mmvB`py_9;{2#i=yiL@K7co1rofXpi}P0kF@l8m x%B{b9tT2oLv|<@Xc<>2}5#;>{+;v|B#vk{1sswN{smTBU002ovPDHLkV1h3f3a9`8 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_30.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_30.png new file mode 100644 index 0000000000000000000000000000000000000000..8710e1a0a96e97627d7f0938515217a35defa493 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo%( zDNh&2kcv5PXWi~QtiZ#Xc=iAP)c3-nBBkcM7RL(G?yZ)pws;bD_Ka6j*4oY9H)hSh z$r^L1k$G|)3fnD0Scemq{ls_4=-(5G6>5ajkV|uSO zR9|r1$o$d!KksJV{qAxZ?YO@+F%7cq|2rp|%GFEP_I`XJxZ(GQ+qZ14-?(?F_Va!@ z8?^)P4(Ho^J@H*y(8lAxZG%<1;GU%wE(}xe-tVaR`1xPM;h*()SOcW%OzsI4uviFc z?p@BZj%ma1#~&s&utZ4kbKYS|_WHoUJvTVg<}8D!Pglo`ylFvNzjmy>`|2M*fb&SbRsVP^tleqWl& z5Vv&u=6$AiuS;`<8r*BEUtiz!Y}?Kw*BL9W#3%og+TQbUHG|AQ+igiJ<~o-$@cozk z#FOQ`g6qITd;eUHcIJW~=gUl5<}1&?^YFW}(z1>pKc-)M#2`~Q-_ErlgL#F&Wz$-L zE~XDJ-rv8cd61W3bKiqx2D!hFXSzRNYxr%>(EqRSsVAgBp9kDNL6Br*LY(r+3NZkcv5P=bX+vY{0`Z-Sz+f=~tZ3qOI3bHq_YK zGJe((W9VaTNM?Kx!C*luGeSja-n>J)Ae{+~9RXMGp9e7?G@QDsuPV0S)v`DHJ+&RO z-7X_r&4Qg+o&y}`a@-h_B>^2Rh9|=oT}B26!PR2 zN4hnf3v0P*xaEQM%kK>CC5qqH)t*&f`*-dprk=S8VxQi4Em^}bckhMm--R{x4+I{) zZ0%Ud7o literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_33.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_33.png new file mode 100644 index 0000000000000000000000000000000000000000..94b79d2ed9aac30fb2e73993906569b17f80079f GIT binary patch literal 897 zcmV-{1AhF8P)cfKZZMOCo}i?TbIa*qCpZXK-ys{c{8fAxT&PwBKpa{;3xIuUfjSa9;#ss3kyp#qCG0HA!nr2mYzGx=lVn za0kHe;j87dIf8_cB&-AAnM#SEcR%-n5`{5;?@B)L6s!aVz(gaFB&c#KoZo^4E^3`RRd^5;4rKt?gXHn zNmPM|*XA8H0yUNhxDtT0>TdMz#nri$Bj9n~unTY_0O?H91idE&%bD*ad_QyiTftNy zM^2zE4tqkFae~N&-zUSD7JgYCZeYn0Ag$Khy;R~QZF|qvw&^W5t*=`PK!8m(0GC*c^`5KtrR_&s z%GTd)H9)8$P}-ilheNxiOb4(YL}x3=F>;VqL_hh%xDY@?o6M6oe2WXX`ZO?7b=|g+ zQO4WDl>;=SHGr3)b0Y9E#vaFyf+>0*z~FmMBUuJKj{A#C0RZ&>8%S@qNvzl+_}U_n z+TmD@#R9hiXy8E292(68-|{%xvcFke)&O5dpY2=pDY<`Dm`>L+?i~QY{_sUQ3wO-Y z)2E6d1kkV!5+{V6Njd2N?w0_7eaX1(oL_>ggP_yAmVAH|z<=Cux~Cz80CvyFmqhRn X`cZE4+77BK00000NkvXXu0mjf+t!%6 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_34.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_34.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0e210f4f2202902eb5e63bb6ea0de06f4d7e92 GIT binary patch literal 1490 zcmV;@1ugoCP)(^Xn1&= zKJWX!<3sQ~&(Znj)@0}XgsuH|djVcVo$v{p-vR9j@H|iI1fEulu4}LWCqUL=Rd%vi z6=X+Ex|84sZIH&z$mVt5tcmx1Lu-AWr)@}r6JTODf$9v;Gf|RsB|-Zf;08EHMV-fy zq~l@uBfw#FBf${@yzhHe{vva0_oAMm6A6wgz%3$pH{7$fZzI7G0??AKV={CD9Y}CA z1ax>{2`eeBbs`CTyWep<1au^U=1^(9XcfCfglknmmoPw2{#vik@26uD(?M zYGNt^`p`U;9|)lvDQ&D3SF4pGy9FH-Y$E#%$EyJE^@?O`stW2=Zzp8Q*y3G)=jF?; zqYy86PT0)a_y`5?fHHY4!Lkpjm3nA&3JV^T5g@zC(#e-Ha?4iLDXp+|V-0N;K>9jH zESFgAa-@__tfWNM$Pj%8EeOEX+}6pLHfX({I!&wfEu45woWbtgB?Q=sv6cdGO29dN zZR2v~sJ2Gh0;cnR6Iv+1gva?(S5Er6+Kz^S2r9Dw6UqW_1xHVRq&qn8r}uJB*P2eA z)1O`YNu@v#1gZcT=g+U4#B*4iIg&z1*}ru9wS2+~1Jy5vs#V}>2w0sJ`9Q`xetlVD zy9`I?)5eSD%z@?^R$hnPG55b8YU2+s(^Bihdk&+GfjZXp1PFHOG%j3 z2bkB;Yn0ZVIn@#8UsV8l(yFl9mz=28|B~~o$~10%Z& z=WAr}K9d!Wq{@JEvZZQsT-AQ3KM_{8F!hu1kA9Yn|HIc8#D6 zqy)|zVl3x-a}_PKkB;HiBbA`sSjnb!PX=3`3EWYENOBgDKTl&uQiG@}WOEa3tcHrj z_V~xbwZ(fRQnG0^bgZ$KUF~E_G20?R6r8f`Vv7LL2eM)!Vq;dj*6H`Iy@CYN`aEdS z2iOIz-`5ko3y(d^`JPOiI#bK&5ehKpL1LQ#G|}Py%xjiRuZ}~2Bf^doJZt0fk6jX= zl#&DdWe}IaQxc$AY=IKNl5)>I(zP*ohgpfH_IFKPb^%KQBP9)osz%2OPmbWJ8a#1a z>Qh*@HPEoxh5(4zHtmd&>(E8!=H`j6-J=jz;^!?prNs3k%RmW~(O&0Bm4!FE_l(OB zTyuW(86aA!6-1Ew2=vu_Mk{wb^{&UZWN#PQ6Y3eqm8yvK zbLC)oU(p2M8X+944x0D=F3^bJsoS%p*d;+pA3$n&>_{LYhE~Pl)h4HUl{vtiQ)?Ef zV=EMZ`w#0L-;RFHJd&a1hb0j(up{i>NCBPW*xPIb9@8UKQDqH3d0??9Xj2IDC sbaVa zMNY9&gk-#G{ zYzvVABnR^vt78t{aej&ez1IgCp}eY&Mjk36sjSS4p(`u-tBk+H?&NEI;JbmS60G_G zIl&cg1b2?)yXHpq^8Y9pMQ7w}KU+9ThZvdNhSYv%C%7A5{6X|o$x^uG7-%1F$=2Fj z#V+3khZJBPs!(_fM)NQNqz})bk0p~Ib4!l%lNsV|HISUZGQM_=&`UTT}ALTHaYwrz;h7PMW^UJ1eM9#(y^lH z0F7a_{|PWtz=DSzyhp`|qR~qYDJ?{cJkR@rZYFpF=A3vJkclqOV7!l()1{pOy3fFp zx%(MH6>EKN2B4i5v@IO(x7yPpO_R@Sfhv~lt80Rtz;{Js1X2JO!k9xkE$kGGf70g6gb1@8f0INEj4`zJAh zE7FDS^I;dzy-;aCkG|(Da)!dK!jXi<5=!ozz17wvGiO4LyOEn0U?Uh64 zQMvM30_E5Ux*|Ny0F`K_i_mrgkujolt3_ml2`nR8I~BxS60V4J7XxHGm*;RQ96hIt z_Q>Y3X|!c`E}%DJ&B~T{VT(#yfr_Qas~W{kc=z75N7S zh(^EFKAQt6duX7nqNN-395IV0Vj@f+_0Krp=?w5!FR>G{OuDe-jZt%)NPphm8~L4) zC#9sT8Q@R^b{f`$t}#*0_4e6;juDg5^>mMOy90Ql)=~;;j~1!P_eM&j{h7{y^w7ot zROx3rf=01Xa5;!(EhoD>@}o{+IZK)WBt>?@%7a#4PkWT(t@a&E5S4ePGkDjN`aM7v z-1zJBoO)HiK$WaH3zz4S?^Sx``_AiHCx1@Y>ROM)0BbRpvUyv{AiNE71a1szoG3GS z7=b>kGQktBYpsXZ!4wizYi*I@k>NAQrX}udS_<01I33Kub(Ug)4&{60B4f}t{8?o@ zBrC!IJ6@^YBK=eb=v2H1C^EYpPf7#)`3^>n(m7wFwT>~sFM^PAJSm_G?#UVFi}c}X z0X^TrxZcR8Yl$$z$5Aj+NJhC4XybXuk{mYDUus*S*DL7WT9bL5^YecMSqk({zzd{& zkMTY8@G_TY9aJZGM|$Tx4zGiyMQe(!ID*AE5+n+bj7#N2`>noL89mBoAqL=`EoD_F zi6)#ur7x8+M&1#2k8n2wtVLOQg-@=c%&Gx99DvFi;~GXls02ZDe0mN2gNQlt{|!dp zd-HD=oyH%-{?VzY-&(VEUH#}a(qEESW`HF$62W{C=zG*AYQU~^lkFQFV+ j=ym|Kh+pJz1ta_c)_1ni5SD6$00000NkvXXu0mjfMD{rX literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_36.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_36.png new file mode 100644 index 0000000000000000000000000000000000000000..1aac855834c50765ba9674b304504ad9a2ed2d19 GIT binary patch literal 1538 zcmV+d2L1VoP)pZ zz;5I3Uf+W!9WPx5cn`dRW3Gg|Fqz5#$8ntgS$I-LR3YR19dA0nkJeh_*{unSMp>1dA8d>;z+W%(5#G$#HbUp$ zr9iq1Mr`>}0|0zxZie>xrX-m^?8gEBe+!^Y006EdK@?~N5#q-H*TDe*4dCpsUiOND z6vs>BuKqOfO#%8Y0s#Ox6L@L^fZD?Gn{b6d`@@X@^S&LsY(Rbc$2$Pd zbZ%|3_ri$Y%WN_`_Xiu)rthZ!DQm4v9(h}6jgc7R7XxTrWKudILmqLiUZL*U0G)BsX*72wptv5z-et?qu#T&EPax zaE|rG5ywicwT{(qWqwrtQ_x!TeGA}y8WUJg58f9_+WOXbt`zMbapsem0R8t-18@WK ztmWSfD5wLetlpbKx(1i!VFKxCf$y_dV@TIeV*+lc69Y(Z0eepbR!tx+Org~nUM09J z?KQS%eh*Jz0?j@jKL`Pc(KQP9qIb+>*Oi>^2^Q_XCz!5|o<45|hz5XEFpi9k$m8=o zPUqvZxI+-QoKD(TU*s84BhY$4dhF8*Mz3sMcUb$5)C5v{)tW#&+r6#C003)_0j>mh z(x|~_7IeGWAmwb00i-j|V=!Ln_rNor_hCzAMhz`JRalvyZBgzDXiqyOEs$RXjb`2m zO-kACWdu)QC>4IAunNghlsegB0L)@;_|>2r;~8tQjFstDHDA$M>t$`gZ85!VY`3FX zGn!>mR&fLM_S$Plb@QfF&5fMqmFu4oooc2#98U1Mi3aEz`K{uU5{r3^K0YyY18Bg$Lr@?afx#%e}DJ!nhym63cwZnO+$F@Q7<;2DfS_tUdWx0Q~7p0OmOWQT3Ik-%^%WUCiYwO$mt%lTAW&S* o`8%+b5oR3$tFq?FSiuPY0nQUmgswmI@Bjb+07*qoM6N<$f>dYDyZ`_I literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_4.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5e2fc53b5ac0d5110ccf4c1b96219f6c65516c GIT binary patch literal 1668 zcmV-~27CF5P)e^kD*EFS~Lv9sEdDqpe=U;_ir zZSQKW_1=3MxUQ>xkw@?SQG579o!{EO1@L=M#3!ub4*ZO0eNxmS*s-3|vL8u;Uj{gZ z3BH+I2P7EZ7+`k<@79mtlY;c>;A)=Wn4K8gIQHqZa-czFfCwXeQbtrEb>`jQ(Kdxoy(DAe;R}A zUf(nWpqbA{>FB5#M-BY;47HdExKIyZeeQkssd)ODLp^}?xrXta_wS26xLRwywbw}I z+3a0M?zsjXkU3~g_11R6T0H!|3br!cyB^>_N1Q+UgcF#d>fMJo=LF_^>j7GOJ=12G zU?B2N;c3}~I`1^QTYF`=AN~RD+Otd$*&Hp?hYkD$aRMUWpEx1QIbN9B`dt9(REZg) z&!GBt2ZPn;Jn`Ck~>`s0`H!+ zNi*-;t(R62-PB&x))ULXz>h!WKX{MOn*W}_LnITk{eYE)k=}*&M*P0^PF{KwdJ^F8 z1Bed?YrS=fh-^^RIbB1fu|qQaROh!AWB?A25eAUVMs*?1*G?7awdGK<k<~0ljyu z2kk%Y}RWx3bEUPEc3sr~NuSf?jrrC)11Z?F zo+Qfzv(7&uc%H%n0M>m7BhgA+}ogeqD zcM04k=^P%-d^%Pi;qGPuZC@Y;Ksx*kBu1e3r3D~%X>w=mMBZUY_r1Vf3Deoa=$3#L zfsm1DJ!6#_boBIiPR*>P3Nz~t|G$9Bv$Z7)>AQexy&T2!JW4lMy-w z4u#bCNMn{kG&m|YgX-1nuP856Uu6D@G5jKkH+9}z3(+7MjTzS=WuZs+(#V@#K1Z@A z!Ytfw3s3`BFs9!GA`9Rf8I>_0Ii7wdWwMv)+DL8JbXn`AbEW4k+~xFC50FK)re@?1 zdC`W?v)Sq;Bw3a|OJ>ymBN!ly>UfhjcwF-lVE`*wc!`i~L4s^m50e?;Ca?;Tx{1Pb z4Ao6-@XCay%d>^sB|Wn{^S3d;3V6N70G;DGzbZ(15NHANF$|F1zzj2Fby-1>k%#Kz zh%nNs@ht!>`a>2(Hy1@@uB0mq&-p9Lm82K#U6zcUtuWfecpE0wI#iyeAF1^cyn3wZ z@UEk_dOZM&*&q;)fe|X?bFIzP0)#I*TM8o3?BG93*V;YHzDy8kLE#0<6az>GQo-mV zwQ{f`!y}Ak&DR27S{pJCou3)$T9Er82GHO!0}=!kS;N@`k)35VZB0>DSP=x$7?m43 z1$eYbqfpuiYvVk4ay6SY`z=V!<;k}KgUaQfS2{m4ssX^WK>Jw=0%=36x}^ogOkcp| zWuDKl*X|(Tc24yG7BbGsI>M4=1yi)_c>1U;UV@NvU_B!xRz*+XjZ?o3)Tr`qP+JBl z^Hl1%F6@8#NWsY=B~jM-bgk12AW=RyRGWVnq$ZFeVoSz;lmXGKr=M43zILCF<{yZ# z7LN1-(k4_vlNr$^Ie=bgY_OVK?fyW<>7H%NdH_wSW|-8h%<4imU$arOlh3g*8-P?7 z>U65RqH$dEg%B^3DoTdM02Zvq4b@BKL~OI>dQPv9Cyh(K51>)1R|6|`TbN;?NV!1t zP-oLo3Wkb|zl8xfyk4QA_D1cgTDDc+?^sWy;giN&z7W#8{Y_%}Ia+_SsBTC#+oQb* zeLgx;8Ambz2ihY@bFxjACa)UNE?v9!o~v+v`6(a@@6;e6+PQl*yP6Rsn=G59AV38cS7A*m7&a@-dN}xTC6^tvK|H1$f>OvNiLFK6-!Y+3OKYDT)bCx;X z>j9#MRs+pqgwC}M9oWHqXmGA_I@|+1B@if1qJ9rvAm1^D|5E78oGebH^GbL<&^87@ z4Atg%^D;P%&Z~o7>w&g2Kz8A)Sm6ZcQ>+YxqZpuKL7$9OfiPsQ2!g+^GYZtf-cH{D O00005Az&DLY{*`% zwcdMg*LAhtduy$=>$(~Sz7PM$zv;WU4F}r)5BK2#WC4+sK#5Eb(YP&!_q_^MjPVV4 z069QthH!8m+?IQPC4MU73xYQV@OEHDKXnN1p5{zHjDaTz-V^|?9KlkGpwFxM|Aff> zCMUf*Gn+_$S34&~;tAxA!YT7*6=0NyQ&sq;$gz+i|Bm%}Q-G1=vx71HpAaRxqoOt+ zy8yswVzk;}HojSTs_OdSiZ{y{yw0&pbnjxv4A2xF#nVH6*1J4A18@J|Okx$4wRxQb zXj?qbV44xyJ6`9~4yk^~;|b(&i>saedx6_WzZp-S9 zK0LLDT59m@8nD!iP=o51L@BlXXNOT0;G?lYW_4?)9YSTdp7@^Eo(fL+3J7>a8sj34 zn`CzKBmPDJY_rJMj z&_(BJ3F$p(Zygp{AGAg*!3pTSfBroHJjlTNzIMb+9Z0GJB8ODjd401Iz&bzZ&5HL^ zMTj2xO7e>d#5P*T)7%HH|EvT!4ZhY}+67eA!0N}U_&FtzCS;B0Eh4QsoD5E3uj`6! z11s=uA+r%!ElBCO++t~V?dT-ZJn&UL2pVlnYrfM(4?O$)NMS0e5%;@d_iT7b$Jb>J zfDLS|zGxXjyt|Xg3FZ#uM@hd$0W`xUWKR~kF(SJLcrP-}YE($a*U(AetO;2Ad<)u+ zgUjKWa}RD;v1*q<#~Veyx(mRVxiyluX`{x`>Htq+3h)${+EzA-p(Ixn07vPl$ypPh z(H|wp+G5g3$M0$VMbj2%>niel@9`8c+X*TQD1poWcnmro*N!8{`W>k?R+1i40BA_% zaEC%D0vhc!pHpxV4_7Jjx!-u~skwY+4L}!#POJhck6P`bV^CPcd*ocJ0koQf_J8N~ zNsZGcJX)H)$f%7~z-gGh=wRR7gTwk=tol{PrLsJ$Tt z$U>8EDN?lv=7^G%ghs_I+#UH*CxNx`v`;%gCYm(jX}ijEjBM1?K2}Eh%B#x(Bq{e` zW@LInYXN}QIqoJYlP2&SOA6qLSgyS#@v9tzrW9}5fOb2O>bZi=QKbr{04X;&R&4^{?fk+mWGmYamBQ%s$>>( zHR)Cg^YpjuPr_av$B+%Fz}tQ{Xb#1Sb$5=Z>x1u0wZIk%fFY$6DX&>6i0glrdaP6g zjOg6AQveKzDlNkCb5HwGu$*U>B0zuC25gHK@mYIrQ2+`Y;T!>yBH(+tZDdN>NaNnm zM0R%E%J^^B9UK5)Nj-HG4j$?Dw2vaHOfw3?V-j(f&CZm|)2s4&;B>CGZ0EOlV zbRw0$wC9zAaz?>8y1%U*0KkzWElQ>@?m0$viL5areLz3M3eXcA0KgT4ocvcEp;{PP zV?v*IMEsEoKrvFzt-^9v9+&!FLHe-@KrvFzSCKD`xhmqnLIEgd$@z%f9UW%{=~EP7 z)na*V7#Y#49RbEVQUP{y1dNk}ZmA;7N&!1K!s%F{2!G|LaRgS1$SeQ=002ovPDHLk FV1oG?)rtTB literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_6.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..789eebdfaa25f10335d19e85b2162518cd947a34 GIT binary patch literal 1521 zcmVGwk@m0LO8}3Wpm+_BUaMZ9W)) z4rI02NIm;#`DBK|wN=-6j4?*VsQ^9`Xk*fTT;|6vc}z1vH1m0z2^z`iQvWAs>nhA7 zO{xa4o?BTxGu97lk*Wc#=h{Bco#{Cj=kY#2^xy!10q~i%JUhMX(!|0Tm2p?F#a+(u z9eDp3WM#T{OiUhB7jXl0*e21!0UM^wLGFxYrm4{5e#P6yf3M1;<@f|2WJ zF#(tVohTB&1_Jn*nynck%;DX$GMvlos2lEff-o6?gVzWEbEgN1DLh1-kIyrwlMXhx zlk)+R4DhFOFten75f-r+B4cO_w5XnUbK(qA48Y+rg4TNP5h9r#)s4>;d2jJ8b-@^8 zjsZBbHG(w`&ssWmWZ$>+$>{M^pdF_eKpK=X0?)YUdjsxd?l8@H{4}6d`Bv@mWG0}e zpSPVm89;)Rh0*r}8WTu$fL1p|b&AN}8InEQ89x@jBvb;yI@3$zdPer@22Zw=)y@utDW}sKKsw876Gr4DCHZ%4T!6Y^X+0pZ zjaKbfTby$T=w6O(hx5f6AetqaJv1_AlwvE}K(&8ld~N%fMXQr729PF>7%5}O$e2_y zO*Rv7niFO-pPvq->uQiK$?z-#oDC_f0QxdF;vi2(%Y5lN!f4x^9btg0p*uc#9fRNL z2k&dGmif{(UBlA7{4NaOWwe)FyYz_2ST%sO9q^zy-TAv2fbQ`fg;Iwe7O1Y-8bEu_ zbvV2IZ-s#)pvI|Wc!e3N^U?jh!{|6xBzPXh0JvCc*a{m|*dv;@IA^*MsSuDGZ<)1g|}Lsef0w!YLcSca}pt zw*@*M|L*o5ovRL@nq{*NqWvWnsIW-2Pq*`>akcxrJ?-aU%c0sciQ;DG%Z$aHh^Y4O zaJskN(`x_?R&8K8c_s+7u{;?~H_0g;X7~8naW2CE6d6k8R6bK!(z!M8xmGwK5>(lB zUY-Fc_}*M`@a)_ccvX$}x}9wmjN1K2FaU?e2o(nCEFd*q0pg4xp{n03BVF>xpfU76 zL8pew?!Ogy!GpS@Y^240w9WMItO+j303048P;i-S_E+~_ss9Sow$~ze2mpi@2o?)O zs9Tb^=E@XgbllFuu&o9Fi2ZBWl^_+1cr6)8g6C*Hm(;haZv`uy|G@xJ>grfb7c`^r z=g~q@lbzibJbia&e5eM9819OJ;AL@y&NVhcbgVZTY^$6et^uAJ2ox)+--ESXZE=3| z6!4@#=%VvZaMsz{Mgl-m)RXb#c3?G~cL)7t8KAoGtFXdqI$sqCmt%mA1w9#eWQ6|# XYhRhvxX$)N00000NkvXXu0mjf-Ye1b literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_7.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4f5cbfff2c3c96ad0a63df6c9a20631c04b5ab GIT binary patch literal 1642 zcmV-w29^1VP)=Kfb^KBn|WR$3dY?YOH_4hAF8(nusn zDW%q03*k79^5Xa4!;N1`DYe!j-`x>U*ux5ZDB_qRAN3FHC7_}5XTD3XpJFovm4BZS6jePmcI1OK* z^&QRY{k-^(o`6Z^09Jq0z}8$XO!TrvA5uAh)vraSG!Spg-?NN@*y2SFM=7P2a*kSQ z46ofRTsTLj0`bQ7FvDGH_!0R2G02K^ug#x?Y&!xT@u-jg^k9|oufSM8a)46)FKjjw zWEeop8N6?QOC)E&1Nb95sI!*|MphA4!pIpxvcPM6j8pDq{VgC{x@qmmcukI1Em%g5 zjQQ>OSe-Juv}cwX(D*2##;1PiTzpS&<&gMmU@5U1yxwX;8dw{jiE47VnU#Z-bqCa1 zZ3aLe@EoC(zUl!nh5Q{MqF^5FT!vMR%qVTIj-!Zw3Qc_+tjW=LksJXRITva_jS1ilYI6b*1d6t74q)X3 z9NHBzlJ6lq{_5bt#C7;*g4>(glrYz zeV?sNqH<;D@TPYn!K$POF?<3TY zoS}s+D8gk96WxcFGiW)0)-U(B()dVk)31UNP*fp@;KuS2GfNiDA6b|6ek2{s<7ai` zf5)~S0j==PCUgX#wsky2)_{<4rddYQ)-@vXxgKfk6b6WRpw=gyLvBjjpy%xo*&ay# zD*Be|w~irCH=2VDzX_DIjg+s^IajXy#$pX?gVLF_b!9Ny_qy^Bd0<7lJif! z3f9hV`Hnk{HBO$N{6|7lfVHkDJfqEa3dsOmH}bvIrF=j92tZVXgh!JV&4D;j6wFL* zRxm)1laMYn=HM9W04Uj@w&ny8c;hn0?xB7ubGNah&R}7v185$nB{egn)PlFJ2zDEH zgz-z6d=H=*dY9ozw#+|xp9a2{-Nr>vT4PqXQyn0>81JaqwJ!AC6^xCH-@31*H-T1; zAls`Fx(u#h?5OdzAd>HwIsg}JWvN%o83?R_9Y%~H947onib^Zt4I8lnf&J?{$Q1V(7`BIeH_0M0tB_ z2Ox~3b1$(Rp{}U2MV!RiOK2@mZ~($cI-g~HO-3f-qa~i!KCR(N4nSBz=OcmcJw_Q{ zdq)^{6F4H#83mpbP literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_8.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1fe5d2d4a034e644e717e621cc315e92baa085 GIT binary patch literal 1694 zcmV;P24VS$P)4r{O-HzUS&p5R;KO>M# z+Ns(`ZLk{?OfvwQ`TQ9P8p-JuXYD`c0y0zsSmRb!&&WCp{5ss*!)`2)MW_a_#v z8_F}>SjYRRgctPDckYCvwbom+Gr;>hwXh%~BX>3vr7yzhmp~)vY4AVk%d;2V?0E7_ z_x`5O0VMP3XPKHpVv7i(K|R)}a{3M|@>K)0_MHKAypjpHAtQGX6=$@R)jaEGH38Y%#$(fD-{x+~RKU1SM1Hv5MXI2*SIn|wvw0=dASXpR#Fd2Y@ z*9fi6bq^9#ctD*$#-(m#qotd#! z7&=cefFzVM0%r#F-hdmFJ4$l~?*_Cx1JC)I4tIx?jHLlU7vk+%gb6g~NH=$MjII^A z#j9{`1!Ze{s(@4nl{0|0FlPnyp1?Z}tU#0AK{|lQu^_d8J3&e+{#0v#Y=!SB!-D`( zk_QLXPg*0g56j_PNA#W|15byD9LtXUsRn>`i82E&7g3VV<8m}udTUPeoGBeoS|Fc^ zsM9~5P56HR3Dtoh$+c+TTN|Nct1GbNYb?O^wb;o5VpC~4VdShEyfMRREIq44&Sg+%*wEDJOVs+|A906QR4-2V#9$ghOd-5~Xh_MX;#R0hHFdw^L~JBxP~){h2nj5C0ARM7P` z8IsP@I+roP3{6`yrD(4P!YtMtO)sfX<6|7iepht?=`VvUMKz;VSL0crLB(lY%3w*3 zXLLSKT2qsW$WL_vm9S{7s*A|HKPWdEe3H)E8IKrUJKIrRwx|K#Z3H_rQ3uZiLDu=y z_!(#!8x4Zl^-G^KH2{Z4XHvv-dbO%wX&pp;FVifiSjU{Fs}}?r(^uC5r?-I-r+P-^ z^CLP$;W<~*7df*t;BqBhFJXYp2CUCfBSkaZlZnok^yTxdAVA?Ur&VAss{s(Dd3`{Y z)6UKeth1FGkFJZ-zNHhF7by(6j@I9iOs6^_&yxQMcov>WmXlCS|d{&BJ~r(0H<~V9t~=d zEoDwrZL3I&%F8eXcLsky6M$CLuYGfDusiQ9G0z6Oy z@=cr>kBIXvs;xNFXTaHHi!LAoFO#Iqsbl~P(mCzvs#WRMdoz%Z(XAPPBSWdtqRCs^ zg4B^{x_ZT!Br^l6U5q?03jisrHG^cSmabKud1%mTZCh2V*?a8fZwm(S44|F6vqfA6 z$eqQQNB@q>%j}~f2rjDukp7s@jnoKqEYq%O@*?kBEv@uk#uZw72?xOrMIZ{xh+04) zK_kuA)|zb_z26a;T7rzVLN&n3>a-e20VWwED~pa->B}iwT6<=_@G&qL0KKHxDPXJ& zlg1;mq_KhQ-lMj&Dt$}#bPa$gx^p0);})H2>`}4bXkbbm1fu(N4e-=Jps1LeMYMB3 z+R11TKt3oMk oNVkHS0El9jKv<2P0s#$zUs0JT=-M&wV*mgE07*qoM6N<$f;eRor2qf` literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_9.png b/assets/dolphin/external/sfw/L1_Sleigh_ride_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..a19da7382eadaf0bc885f76da8dec3899034528c GIT binary patch literal 1605 zcmV-L2DVtUtjJl073;Y!fgJw#SBa zU#+#?dvC3^_IkY<|C>YV!@uKL-bVt;&q9(vEAubn%@>jksTm&;F*NTRky(Y+@}Gh? z8HU>4`;fuOd3axGd<85Ws^_{hB0=!O0N7c(PVk~19YVS$jsF+9b%+GPF9zVP6)hbUmI%4KoKdpTq^YZW62|a^E z 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 X?SpCAnR%DX^?w{5SGjX{NnPh(NrwdN literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Waves_128x50/frame_1.png b/assets/dolphin/external/sfw/L1_Waves_128x50/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..462824be2ad9e4e60ec92ae7537e962daa7bd9db GIT binary patch literal 2282 zcmbVO3v3f*9Pii|8#rJh0`tLfC6U+lUVYt#vaOG8b?Y{_GDZl>_3mqXS=;Nbx2Hgu zihvmqHA)mWK|{h2r)(;5C{7R+6fqkRh&X}7#0i3^fIR1S?OH}Mb=vg$efNF8|Ks<6 zd|%g<7UyS-%^IuGXfm7y_A)rGf)ACJ41eD|t6c+!)Y2liV_;waP8aU$T?vQuaKYk; zMl)`b`Xp&yeQhd49TMG@N~Noa<)xsG6C@AN)d#~6tFB%klFNil9iGgkKXznplcvNd_7G zpwOT!c-b<0-k>@7Wkm^;jsPjcc%j z2rr9aMU+B_s*&?ZHHrm=&c;{-!!B1saVRnvD;PDro(tooj=+OKm0A=XQOdv_H-<$= z+znxXmw|{>Bl7^lwReOawb1e)hY<)nYC%Xzh{NdrvvAywz$b9w8aWURlfdI30D@3o z1acx1gu;GFks^NSZ&W9?qk&Kjz-X~0vIy&j3)m&TMpfywTTr;86GVYE>S+!zB#F^5 z%a|Sr0Q1na7c(=IhbI{W!J7?nJ;TW}Hrk$RwHov$n}Z}BHnZN4XQy*bHUpjK$fK-r zS!XDsa3LPVZHv%0FnK&i00@lo5PD4SF;W;K@J5UWz)Ud!kN^l#dDbQaPLX7{Bn9Hd zS{jc8LeV+`ndRbmF{H+3_7D+Z=M-Q;)xyOfN6PG`NR~9Sq<$_zvjh=?x+FpLHVlPQ z7)`iIhSk$7ZMX{x8%N+2?q9(I&w3>}$iV^rR`k zRF=GA0B%Ie@~w!|VKb79(TGtxQtgpgO6@=vYk`m_OF<-B5Y1TaRSL> zUISw=kepEfgf}i<=Lb+_EX5Q?7~B-a>WwVH#Pb%j9g)0B9VdfaAMAjU6j4l!_j4g1 zfM+d^szlWj>A%w%S)s=a-c4tiG8`!#^6s7(mJY7+i6sh;71o^`M)!uC#*lq<2_Et4 zG;zJam&64HLNHP?yncS1(lJ4!NqWy|&vjSsKT!EyNAip`?Z7~9OMm~BwQ~A%3YpT9^-@Y4#W>-6Unt1&3r)`_F{6CdEHmfUX`KfdG`poTm zZTFOJ{^09%t5Z*>6-#^1&m7;~>F+XLX`h?Cs&&qZnWL&T=_Os7otyeddf_+SYjsU4 zD&#r03ok6ymP}}6awhh56n#I2+*o*O#+aPyYwM~W2&FCVF5D`;@Yanp)0ew)7V-ajAV@+S(}&tKlSv|#dq)t%S7mS}%wYI-W3`R&M} zs$0c*0u2TaBLDyZ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Waves_128x50/frame_2.png b/assets/dolphin/external/sfw/L1_Waves_128x50/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a72884989dd01e871f7133051e0146dcd5b1fe GIT binary patch literal 1446 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$f!3-o9KT>W7Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{g4Ln2Bde0{8v^K6{VzE1-ZCEEd%mwl`=|73as?? z%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8& zOv*1Uu~h;(72=270$*Ra!Fk2dkOGF8ennz|zM-Cher_(vV_?1^!c=;UN+V(#o} zXz1!}VPfj$V(e({Y-;T0>Sp8w)9aa6T#}fVoC>o$6KFS7uLWMcR?bDKi6!|(A^G_^ zuw)RBkzbNuoRMFkU}UUkprGNKn4Fmh643<362#LksYRJ(sVQzn`MC<?9i3)+P}NDQo^&5vL`$F*zK6RNd=e zFRrJ1?)7?(_xkV5VpKZ}Cyt6p_-YvbNgH zzW+~ebr-MwEE)CxzW<}vh)&V|F6kz_dxxagJdv7col9+f2M?zztla3`?=g4f_wAN< z+h5cbUEiy6!1(9v9S%(EUo{-F*WAQk#Nv^0tFKX=C6jl~CcZ^1$`5z%>u)~$l}r0M zdvVL78O3|NjMueTK00ie6(6PA^mDE2HXjdtp&hL!4<6mJqu$}dW7Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{g4Ln2Bde0{8v^K6{VzE1-ZCEEd%mwl`=|73as?? z%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8& zOv*1Uu~h;(72=270$*Ra!Fk2dkOGF8ennz|zM-Cher_(vV_?Sp8w)9aa6T#}fVoC>o$6KJ=kv$2b#lasTFxw9)yy;jae zsfi`|MIrh5Ik039kda@KU!0L&pkQRIXP}_ro0y!L2NKZ)#S+BRE~!PCWvMA{Mftf3 z;9$1O#Nq_vybsZzLT>Qs10AIgN-Icd2POnekRT>JD*!q0%#@l3%t1xKtipZ76_m}` z0(?ST|Ns9FWQHEPT*tt`xW&`OF{I+wkr}r)H5+ia-u(ana{960+XCwxB_2D=N+)u* zICNOCt^4@%Yx>0t2dv^;cjVp4H1V2{Ec5kXu(@f=Lfh8B66Tsa+1TLrlYR`+qk)r5e6`tCc_Hmb-J^`vmDDqV10yEqd$qJlrrk~uY9TEW%#T9$NnevH@*#uvGr&G-0~S$?SUyVTz2X_&zL>Cl3`f$dY)wr~3=lG=X% z>G~fI6)Z2SY(jmtmTf!i;BT49P<+(tFMGxE96^-{uh{Kgf4aiyqPBh>cgmrw9~eLU zc%bopU25aDnuyqAvA-RA7yh5{!nc8o$*S~rGLJ&_tDD7InzKJR&y2b@$AZsp#SJ(A fb^Ki0?HSn^cK5P6<}EHa07a>%tDnm{r-UW|&6EzU literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L1_Waves_128x50/meta.txt b/assets/dolphin/external/sfw/L1_Waves_128x50/meta.txt new file mode 100644 index 000000000..c2f63b4c7 --- /dev/null +++ b/assets/dolphin/external/sfw/L1_Waves_128x50/meta.txt @@ -0,0 +1,50 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 50 +Passive frames: 2 +Active frames: 4 +Frames order: 0 1 2 3 2 3 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 3 + +Slot: 0 +X: 1 +Y: 17 +Text: I am happy,\nmy friend! +AlignH: Right +AlignV: Bottom +StartFrame: 3 +EndFrame: 9 + +Slot: 1 +X: 1 +Y: 17 +Text: So long and\nthanks for\nall the fish! +AlignH: Right +AlignV: Center +StartFrame: 3 +EndFrame: 9 + +Slot: 2 +X: 1 +Y: 25 +Text: I wish I could +AlignH: Right +AlignV: Bottom +StartFrame: 3 +EndFrame: 5 + +Slot: 2 +X: 1 +Y: 25 +Text: swim all day +AlignH: Right +AlignV: Bottom +StartFrame: 6 +EndFrame: 9 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_0.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..43b26283e99bb75acf822e411a22373c78b8f4b7 GIT binary patch literal 1389 zcmaJ>YfKzf6rS>^fQtl)6iL*{KuuLz!9d?ABS!Rds zE-8hSYP2-c606l}<0I-1wb-UfYa1Slw33jBw6V2KfFCyTm6T|V#8mJuu-G4@lRI}ECfNaYpPv-IQPQ0G9wj!Z)Xg6;q<8PZq#?Gk{;zXfH*|8 z1)wz{z7_ZZFUC72K^cOi9+Vpz^+xXwPEbQeKA~fbg~AYxAY~P?FfX(L9c=-vvSP>X zTpGntS+rw&%wEzPc7mW>-KBw@U3CpYSDV0!SVcKn7UQ6S5YTxv7HU@_T+EKG*yZ3l zAto?%MMZD3W2>YZy*|{bY5=twDO?~)61B2MAo8XbTH=Kg)I^#nf`Y?}Q&!GIa}{j=>Y7D2trcxMpy@9wLlnYbvtY;Sd-hrIvoxM4vJx!B(_G0 z=)59;q+c2OUB$AV`(in#26$c78dSACSp>eIs;iNp8b(dDkwmw7c|leZlBW_kv>LDr zX!1TFdNehJuB4cgH=sZ<5-FO1gqs-Bg7Z8>;;e;baav-4&CFXRl8521;>CMXw_2r8 z0>cO=*>HkcVr>E~;Iv3fxF9hS&f0i0ZWC#i2Q&i!Yr_agkw{d{Jynzx!O~1D*V_Va z)*A~bu$wg4Hi61LJ+S3A`*t+AmzS5}a@W^a4XbBl+l6XQJx=0}F|19Lr6 z3RWEWCc8AVEA!X=N47lvIWqjj_aCOl|NJptS+eP`f&B%6-Fwe^ijVjHQTo7JGe773 z^zAvlFoZ;4MHYEGGO+?e7fI`9w1-Uyz_$s3*lGgEV0-Wwbva<>|8 zq?4t`EjS~Ob_F7IyYb}4=J#}{sPA@#r2J@{C> zmGoqdSSMe*)|WF{u6;VvrcRe1Te{TzZ|(B()tt76ww^ES9~;WOkVzsZOH+!!4Bft! P_yN|q>s+U+0tf#C(`@H9 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_1.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fecba5ad5980606b225b44da816122cf0d773a98 GIT binary patch literal 1417 zcmaJ>YfKzf6doSZl}BQw5u_^Plr(Ma?9A-!?(B@L>po$nixen=jleK-2S(VPWp?N; zgwmB@Nz(=sF=-oukeEi(O4S67Neh_zNJxFOLfVMYK8)6;Hc-K;Pj;CuGT6PNelBTKz7OmJTCLiewIzf|M+@XSsj?zk@qgh}@%=Q9W7~!A+KhStI;%^CrxQG>7vCF}A zTufl-ii*~3#a2mG`^r$Kq5_oBQ@B8qB+9UQAo7L=TH=M>sDU(41O*=krx?yaa}-Y_e07+i9mQW|y5cIZRHY)6JL@Ha5cAS=wc^m@SOkZi!LDrsPX|IdQ`=auB4cgH=sZnB~mm12{#x?GtToy5@*dUi_?-3SWG-4kvt546)!%J zy45O$5*S7>!G;q|5^E7?0jEV;!Uf4F;jD!>;TDl*c|aQhU@aH{DH8Fjd7z3CB3PR7 z<$7Dd&3a>j0PH3ew#|}cT81r`R<@_o9gD@_a^HoiE(A$B>UG&GBQt+hUw%8~SsfjV zOwEp9f7|z7JVi=51@A6= z;@Hx8d^#nz{8C;DbFV+;tF7M5&ZUz1x`l$Y&0X0GHJRP-Jf1IS&d=55>#j9s1V?Op zqnVF>d^4>kbv*UANKekIbab|8?oZ_4y-6;*JL#L=Uo%muuHQ2~a`Mut;fXJEcWys8 zJn+bw?I&&*r=2czPNZhXMou@N)UnqxdXd8y9KNxp&vXCTlAkd=UvQ;oNG)nj$Hktq~>yZ7oPoQbc{b>{xPikR%*GGnq$N2rTcTX&pf@+{vQrc2;ZHk zO1i#ylwR68m^8EL=H!RRpT9lb6G;8J@q^k{a_;Fn`=1(;$B==dp}t+8CcmHDoFv|u z{N=Ib+|lzkQaaRZ%&MAuqU8HNopbi5=FTHURfA0R-A!k+uruEAb2TRyZ|ooKCKhI+ pwyrnM-|20v8J&>k4(XP3B=X+o!c4Q=|Q6O&A3L80##um!P!`yZbizCU5^Mc#kLGdB;zcE>6Jk2LXfTY>0OaLI!-7}=HOvRg{2>c|Emola3}tilQ(Rr-PEf_*hvGb1{ZuXp%;+iJ(n9!}2tT4L>+?s7f+l zVlNzahfWr}T+_llNmf-=>8eQvPMRQFiGnuG8l}7HmDuZO5p!A9;qF1SBD{4 z0wYSLDx#9e*>NyR-{T#{6cHQ#Mb(e$A_VM;SQ&&N&1tvb=td{`CEiqMqo=c!o;4b* zH0`iiS+mh@`{mAbymVPXjx2aIj6xFRLfp`-Xmn)hQDObW6!|Et3$0dmVP)ss4R-vJQ?NIeE zg;Jra1hK&s^ZrLrp!G5(F;FHLJ!K>WK~E8!k>dzf) zV8IZYCKZj%tdG8_Mldly8 zo-P=9^lDGzACor_OdYjAzwr2xQ!|(bqJ6|1D>augJ=a{CvR6uen?ccr(>c3?`;xSnZT=lG7B`(A*>=S~Meci+MD#rt7jRo;pp zuaTW&=Imd&Cchg-GrwK?>9bxBIM=bRao6Ruy|+zC>$e}szx{4*+a6#4S^%bvPRr{3 z8T`F3YXtDoY63V?a2LDOl_9*m&CzzFj?3jsnzB;f2AkE?jo-KJPja4DQhrayR`WHt zR?|Me;5x|JjQ6fh|L#Po$^Nxw zNZ(r2R3A0|)Z;nuUdK~k0Q0R?xygZdq8E}|`OHOS8JFf+#{s%yQJS|1zwp)WzU*-K zr1Xi~$}_I~@Yfk|Y)6_=Nm=B0qoJieeaDyP)3wdlGZNM{Ih$X7@@mee<-bhYeA*qY u`EC87z4!VT_Z+@ky`^$q!$3nlNCZ0$Cr-Y!`12E}5rES%+uktUTl*ihIwm#% literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_11.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..0f293281fa28434898b3c4a81126d3ba3a071210 GIT binary patch literal 1782 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 Coo9Lg literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_14.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..1efff0f21bd9b9a3d6a7b0f8c53623174008c8d6 GIT binary patch literal 1714 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_4.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..87357012697d8989ae5e66e0c10747a5d529782b GIT binary patch literal 1454 zcmaJ>eN5D57_YJk^Ao4r#0~9ABHOgruls7psmJvW&T&AF6HiSBrG3j)yz9{`-oYZG z#%)f;uSNM|0gW^6L%}(ck9YK&;?tI=0*9Q2kOiO|9fwa9IxMb)~zh0usdQ{K=VwcnkfVzW1 zCGY}4s;xc`au6hCo8t59eop}>szHO0&@seEC>EW(Fz8T| zWX{XGCf&i44GZXcm?Ma2G-`-4234yhD3)ajk|t;xhZ=aKHlzzNJQT@FTHrxM)ReHU zs3A0AQK(RBbQ=cAPDBw5dpwT}ha!`?f>|SCLYSZoBoPcILL1kP=w9$YjVEeHe6?Xf zctJ$1(L`7hIV%Z<>3h1Pgd$|a6=@2ri?ESb#hM@p>2BVJ!7m0$kvNOXLFF=}kujU> z6ykdV9 zAtZvNUj_P|#9E$;c(Uf6bDpYjRe#%N;3u$ea$0?N+=6c@C59CMV+4S;Vg#f}B)aCYE=r1EYbLgj#sVH5 z4HgK&Y0}`>bf&)SfFn1pxWMO($K!Cj`rPGu1etQ$&D(vk{yR5tKU8MUjf-=Fj6i|MI14n0WO-0JDy zbbjfKt4R03_A0umYaS9_P`vii{N1hbH@^MkRIa&!-jCd=8%Ryxv*WkXD@fm`b1n|t z3_ibjNrQLy{@J%@AbBH4r`}q#*ssf!_{qLWfy)g9o@3# ghf_C?B6FrpL$=vcj^#)X_{1O7?JVS5bIZ5=2VyD>V*mgE literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_5.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbeb1fe16a90746301b8f10a46a9c67059a2242 GIT binary patch literal 1459 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 OA7G8UjyqlDKlmS`0O%V4 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_8.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..30b97cdf54c42b02607c803d0c6b2c4dc3fae9d9 GIT binary patch literal 1348 zcmaJ>Yitx%6rQzd-4rRsD2<3POn(5;*?H~m?2NnZZg+O+Vz=Ft1sfj;)0sQnX*-Y3 zPP^MR+K0p9{aGFw(10zXS*=q~^VtBlWS58Q zf|$V2B^A3PfGv}1i6_voVF8qNQMg2sB+7CwAd7S>qlnT|C{5B7LBWT`DVC=hp5oAz zfkB6stnkf3bj2Oq1+bKDn>;~eG8tEfaT!({L2(>MkTgNlIMl$?y}B)CaXnpKv><@A zWT~dD8ai6AD7G5ib^wE9m!r_kczo5co?gin%o>puO@eZfgr*fjThdP3&ES6;Yig&H zy(S=xo{fg7I)-#J zUQdXkBH<9@^9mu(Q|Af0!x7e7w6PX8EQAG*m!#N8$XCE}jE@U@Lmn@~)?+*Qa=-$x z)E*#5Eki?>Qp~GsP@vojDbql~X*cP`MbS;-oR{NpMsWk5M`RUJgyApa<$F@MT%}L~ z!!V0%c*&!1K8cZVMrIUTQrrs8`9u%ylNn9~j2i&XhY^q>QK*`Gs;DS}rCC_6wgud* zHWtufH(9W4@C5NVY`L;TLo$-j=izeS)a)w=;)uqCP%?Y<)>}V3d=Pa;zRKrkpVp?^ z)iKAf4YyN22gV-Q^T?*9v7Z^$#&hk~$fsT(HMj3b^reFngBzxPSr|T5-}krPFthE- zn?c%jY5R*GoY^>;BFcCB>juyA2d=XZ*)wKvVu8GNxblg<%R>|EuFg8z92cM2bozQ@ z?Kt*FX`g8Zk6rmc(J&LkP{?zTlj$diVIN zJ-0Hsn$VNKe;Jtn=fbv`@|Q2Jd+v=xcTOHz{OJ4Nq`wwt^Cb^{vn6=vv%A%kNO0J3 UgZ=Zn?!td97HJedsXH+EAK;(UI{*Lx literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_9.png b/assets/dolphin/external/sfw/L2_Furippa2_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..7ceead056debf20ddfb783cd21f49cb053171ddf GIT binary patch literal 1347 zcmaJ>eN5bB7(a$t@C(_m>4ae>7dcaK%&f^BBV`im&3l**{ZIJ_$ z<%TnvTb8+Gks0-zWM*Q_wvdQ17$CST&Miu|M1$MnMKHgOMJNqB)X9mM;`K zG$fge@wLnD;K_@2T9(e?cwb+iqmOoIMh8x^EQ=EqPEi=tz|4Nt5>l9IRu(Mqz!VKd zw-il9au$Vlt=ICRknB z6#OdC?=seNPb?QSfM97xT+_M>O%UzWEY0lHbcCWE1oCu55EV5i*_x}+QouYgl$U{2 zYiLO%pJGl~g#zi635fzSMmY&LCJ0UfW8Ex^(XtaTF2N%c0t|l%FWr^8r7ndM7=~V8 z!-+1LWkg!UXo;3FQFh80%Lp!vk!V%`v=ac9L2*bC&vngRT~rXk*34~J#sVHz1`DWg znhZEL;j`nX;K;3wHpD~OY!+^JPG8w;vlWHHyg#1$e*XBy4X+Xrir)H*qKKk zDN*10?b@NEQ;8PKUc4{;?f!w?J5TI5(e%R`r!Nzpp)=wynT1{15&QfBx_A;~;^$lT z96Y+cr|iRB8?Sx5n;-7(snnVE&2-}GFm`A$G3i?4t9k0lm+BU79GN59S{G-Yiy8M< z-Dz9%fN%Qn?Csf`O%oSB+Pt=GdZ^<-=GZ^aILc-oY-zt$7fJtGZhyRJ&`5mVcC-1` zJD)aO?t1Ui!Yg}Ej@8`$>ucYQ`%?Q$F0KDb+D!fK2Ew`zrWc#8Z#_8l#k1)m+neE{ T(RK4LWEY0Z5h&|e?+_1gcJ8Wed zt8Snuk!^(O#DPO_S)vGvx_TYd|a3eQNZA3N-4pYBKPR4ZP5r2?J1CW&y36h?2ii1k26?8xk-|Ojx zA=;~li`908J!qoJXlrGNDyl4SdMe93xEIdJhO#0$-hiLtNGRf88DMo0Jv?q#$FF0@ z2n>y@aOHaV2`QJo5Hc|#3ew6^nMa{eKw4Z*c}c8P=_5TE5T?LT1m$n74Atr|r4GfR zi3{c(hP*zVgRo4v<9B+vjN^hj1PO=3@~~3QgjOIZj^l^|LoiInYslC&0gjBw0&IHR z0zt8!5FO-bCIH1OlBG-qr-ym6PonS#?e?dJ1MEbu_^crjGKipZ1>*O|LL1j+IS2JG zjc01J&NV>_aZoH%5%TaQ@ukPXeEOd6D5l7>(Jcwld|k+u1mmgjQvuFK=wbeg+)I0P zYFw+em~ld-QCd*cY{D&s8OJacVbZEqIA)C7cor5jWLiu(foe?#MGR{+s*Jc+skCTR zMgwY5$Fa5m%aH*O757W?ekZVs=VEoH5JhrK$jLA(<4sUl#&8T<#sncuDOW(!Vmjbu z!tA10eV&9%P$7CX<+X$uKQx|T9sMiYS8CNVwMwNyHA*E$ zdbRKb-ur(Nhwy}uScm+lW8z1A8^)GTM}Xfv9U>~gPfmy*5r;eJI6q!Vh51f1FUQ8l zS}!(T1wgpWMi`utOT#;_u092&ZEAhE{`T%eny5je>02$nv{jb#^VYgA+fH1*_U9K} z$L{!7c{)cg{xQEdIChfl!Ud16q_UO!*C$DO;7X9p}Wqym3U--!=oAR#@bAy(0up&@F`1 zoX)&0U#H}n1=rIc)t(2r$s_A_Nx-YQbE;NNZvod6I&Ww_*p-~Hqmx)z+Yao)*AhPf zF5pTWs;k|y_u!5OrK>vsZH>^CSan{zFkf_frV}h5wuuUsx-(Q2#UD=5jO{HsR{c|6 z>#QY$dg0@mcIVPIu`8t!Yj+i$>h^cmJ^<&0jiURF{Z+SKFwAY9baHm$!0%ZpiVKpG zzkd6BYI9R{&HXD4-#XO}!P$3vKI-{QAYI-f-hK0K_IIhHk~wM9jr-)9^Il}1H9EC= z$ekWM3Uzfzd+ftRP0P8|79`0h9F@zs;`Tc;FJv6(W~`rn-=~oZ-96P+we24d?yL9I z-RQOqv|YAm{Wvf%cMtu;>-myP%cRnwZD%B}By{Y0tMgjPJaO%Ns4!J_bUw3SLtfNv z`JB1QmS;a&H<}W?Cr~bKAf#h2Pj8ZM9XZQjxBI%2N77G#o$sfW2lWejWB+xVxqvue HbZ`6zdoeq{ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_1.png b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..45aeb57b557469d696703ab104b5a6cf276ac9db GIT binary patch literal 1601 zcmbVMeM}Q)7=Mp1YX?IGH7M$Fpi^giy=zOkN`-zph-j(Yqg-uf& znqYK(%_t;OoFiK@6~CQ~#cIUK)GU5P<_hA*#BGSO8OdCx?26Rw591%Z+}-oO?>)cg z`8{7(S5!DZK{`na07$Upn~Fsl5T9I0wD`U+*=7|*ijZd)N;s!bN%Az%JGe3$ws^?Z zbTLgjsw&#)YyhHJ#%34n)&ecXdE{hRNACA{MKl1}IesrmxoH6|qgOMm4tf05IRs`L zI;2!>Ram`7+QsBo^K?mdp^d6`Q-lM_nFnY4wW0wJEs(I^Q_lLdejPGwS1Yc=$0!01 zs|ao#@{*L@S_B(8o`yAYOhzdb3RpwPX$OgyDV-!W2gVgRhGOEakzpDwuGC@#JaQqT zL*C)k7Msi??!=uAaS4J~i=vg4mGVlZoa0xc7(o!I0!MLNCThrhRjfezWvnkfV!=fF zD4y{O49CJ@i)0zMM$jQ5*_TmxyjJTg!>n&4S7O#sKj}p=xdQcg!l4ao`-EcpUmCB~ z_SveuG+IpixHUW_mc*GJ0gLH-v!k%0$VR)6XT-XYV$vbv7rBFRXw`&9 zW6mQ?s!XLB!}5%T*_21%xXNVIs8s}Rh}d`?7T0H)jf6?9G3pgztihl%5E`Y@oT)PC zF|#^?wXi;cWGOo0ml6GrU{!C#YK=Ti3LJ0axbjF76uCHo^SL-Lj4R~|cxEZXI=D*T ztZ;o^hHIjEW-aY7^PC4BPOz4F9Ra7>sZwXDWLX%2$y8ZtLPjVxYMEN4%EU62N}P0P zkP*D&|0E6-38CQ*`A^40j>I+$FJFy-xOp{1G%HRHFOCRR|I{UpS6oqnEl-p~Lqkn> z_ICjgRcbNmZT=q~)_Z&xVM*QZ|?6rS@oo1MLdsi?}b8l2Tz~5 zpU^gV>czBk-kf_+kEx-7&cLzwzWq?|eEmMiWuFdaUY)%2#PyuHpy2eMeLtOf$DZ*s z=((}1CN(YQ^5fCai|W=k6ut_^d=fZX7Z0tP@~Pz5LL`u$nA=(!ePzSn{mEZKr4vnH z%mmp-!9yDAQH~8<=-EBC6O4=M{Gg-T2nq)hVmG|_hSc=$ft0cA#(~j+1%c+-fPnIK z_a>fK0`ow#)CAZxSo-<+wO|P{7W$?7Ss;p;k=}FS?MCT##Q?cg8W6xz>BDjLNuaML z74UJ}8;%|bsvA;svva3zsv8xA{)pi->^}TZ&c|C^)^=(A$>mX7b_8Y@S=&=V3)p)c z+nJnslh1gZwyWV9SX{#lZXNY4I2)T1-1xOC&{liNaHXgEc-^%evit7M-wz&6DTMY$ zJ)N@BJ%7pKU{Xw|wRhjrL!k*Fdt#$3NCbLoGqblz{sNOE^Q0}ICrGfheNq2|Cv$-g zopZxIy@~FS#N{TjU5^$d2A(awbfly6@VmO}iS6ez(&7i(W;8s!52t+pV{&S8R9Eb& z3&^_i1LG_owm_lSl7kO6$JBDop3&~{d%7kPmz`Yls%6GqTbnm^_b;P*$A3{$@!Rc3 z6FLqj)}>nFyP|_@<-J8U1#OciW4BtGaOapsN0L@ft$2QN^RMqSr}}ohRom5aYgRAi zo;OQIe+ONh>h-O--S~WW{`wZ#h4k+BWc+!0U>Xz$=IG;>H#M#+3;)zDd4;AUhE*H> E0U%63I{*Lx literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_2.png b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a4508f14b5a5802274f21c878a226c2aefc3612a GIT binary patch literal 1606 zcmbVMeM}Q)7=J0>1SVi`L5*CB@ng_luOD2mQly{QX<1h)bkVsUy(?7c-FZD|W$LO? z5rdH_;>Qp_vSl-IOv8dE4D66ZV8anzjLfO{IWi<}Y-5`k*%hhVAI3j+xx43m-+O+~ z^LxIo&Qe&AlrT2|0FY!_p||ofz(4tMk^K8X++H&;(m8{jE23ST4`)fBA?Q*PGI{Va z(n{jQ#tnUBE&!2~+h*tN=2a>u?GfW49kJiT@Mr*Xm-`vqSwV78DOu*G)WXLd7le?T zPzy^GW{H{6k>&0cH7r?FQ)qM6R5&q0xI7Qa^{aRT9+JZ$zo(M&s{CrqR)WUL(V^lEg^ZCR+nV4qFUo#kSF^*3J+s8zc5UBXL7}74ff*h~wHPXs8FS=X z4PsP;u_nsP;gpjM`*rhvXRyjwVpTep#5tO^(R5|F2`uF_M|;a@29nCe5@<<@n<8kR zcWJ0T&%@P|th<^dj4bVerW34kzl?xO;gTzqa*-0j5RqJ|z(kk~RfrUFc@B~zlSy#` z70%#^|C2bFCj^H&$Wp zH}iInmEBwZY`CVo>&6k_r@EP|Ps##kvwCG9sU#jGRO?vuNm(>F1)$jT>+;gB9 z^x)X%g4=zgk5fVSy#p!DAXQMgBp9L8yuEdHa$3Ogbab4UxEPU91PLthgSO$u<1t_; z!ao>W3XGQ3`S0F|1y{Aq%B|TS?gCursx$~6j2fgYu_H?*kJRx24xFBq4T|f&eJ#Hr zqIW_5&)btSl&<}ey@?IAcuS8Ykh`_#uxU@{sZ7IPwB=*}%JRS0BVi?D=q~Vjn^9`e|i$A*lbawTh3tH&|uItf` zgzvMuiVg1+I~K+Df8{cZuH9(9Vb9246W9y};yr#U<@X4A^1~$~O+Og|XZx*VmnO47 zC!BqyqTtQe^-+<>?~RA67XcH-8d{{7@0 z{Fb7eqZyY627Gr5J0A-7bX=YbR<5Z(AxKTswG5_zumEj~o^@@*E(a`bxwI@jQ&6}0 z<2Ill4R+5%yH=J9dh#5_1zDNpd;J~twV^+|$xx_o I)jGEQ1JdV1B>(^b literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_3.png b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..350002167dcadbc5d4793f9bdf255e95c5341361 GIT binary patch literal 1654 zcmbVNYfuwc6y6X6=)@5ers~wX4Rw^3WV4%uWHZE&kObopM2HZ12urd+3fYaj3rVz$ z(JE2_MaQH;vHjurqdRx^+{gLO z`R;klevy)#ICaYGDF6UWH7?SnveL`G@u6Jy`$y;&6DwvhdJB_A7BDW1!U2tq%*R2a z11rQ+am?mf*@njf0GF_vEsVvKq_mO_5$4wsxgAax4FGX!w-d7#;|!RO7upGxV5s$s z0JPgwf()5SY;q>xMfOFjC_HUdve~+-*oxW&>V;sOTge)5;0y-39VG;8rUEUV2uRLV1yM9__ecsC$RE&VwDLLjxi)slq9pB zm1ARL`>)mC1c0DwqfTRXU%y{>BlQbLQcQQqV!7ruHhw@3Y5?uq%p(CWNX=U-TXoK2$;P;xjXsz@JUzou85h-+czFM)Lao1r7z*6 zWL6EEa{=NgCwVyWK2KwHM21%6@xbBpj$-tMrEF5}vb?AFI=;ErALi?9jOXNtc{2yk zT}j$kIj@^L66yS2?U`5g9uTp{&dut~d^uD*gOkBIHKhpUUZE6aH~4#Ev{~FpZ|ts~ z=H!rRDb3h}y)oYYS&baC;`u3}t>ykgI<4}qL~NSRxhv?%E((obXO5O_SA2Rw;5`=H(UUTemoVqUIA8N*TNwA^SJPX}>mSw}*(@Rk z|Nb*om<7nlo#x8FX4fuVyT77|9Oxg~u{&o6k$E8F>ZXOf zV@p;SdR`)f^&y#`T#8#%dJLaG z+jSv52>C4JI>!=KS6DgHd*^aYt0H+pZJ#!4gGSQ0L_sTB)*q(A<=@J3uwq%~@4KsK zaSq3-%Xgfao7Z??bYRTX&9ArI%fEUHs4e>m4=0}2C!H8M2&jYjz?W{mYP+H<(f=nf M>XUWHw0Z0P0mtBHEC2ui literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_4.png b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..7addbf932786cadeeeda3e7e344b670344f3f31d GIT binary patch literal 1658 zcmbVLdsNeQ6i#^!3n=rj`Iwub&iPE!q%9?t3iKr$C}6FCib_aR+Ch^p4Nw?tmCd0t z#i>(alesA}P~1E!Zt6iE3Mg`hQ;$=oq5?jcV;(m^9I{lw?GKNCEGNnRJ??k!cVBDc zVix%EC-VUS@QaL4>pAJPg&~ z{oZLZ1OVJAiy@Is)J4k)+A73dIzorl#-RZqB-CNUi8PW0Q^-^cr4aNUJ0SoqMui|j zsuSsKD$;C;$YIDuIWYzzCyl_2g3$S3h(pd9u#zkeI;`oGUG7i_p4ydjYu7O>0H3O` zX$rwJQi-}aP(?E&C=((OArgr|873r+IGQ3h;lx}J6`=@>aIXwPWO7t2M=)^Y5pWI} zqe-q;Ye(F1JB7f^vNkykXJusxv&2H0Nre#%!(b5#qbS5_K=y2k#T^i3pEhbiP1*^@ zVq+~d1-dNaDRc&_5O8FlMPaq+bk7Y__K{q1S%V$84Mv0_*lKl!_Eg)>>dAj;yinV2 z$hMKNp0v{$48fJeG;I{jrSIjAT#6hUc`Re$>Vl`MX(Gc)Qf#DJA>eL=MvGA{#bh$A z22)Fd#99Q=s4%TsgQ2KIt&&M47^)n#@gl5Pt&wO^R3%e|i(FWxQli9UVzD+zq6|m0 z(ot+AWoL1UAV>XLIKLxUX`=`8y! zSACv^t0oysCTY|%v=w}sV7cW51W=RIB#{P7pkM?;AW5(kgD|m73P~lBAS6gEMscG| zFoHM!pTxl&A=uR+|LK^~Bd!fy%jYA&ZJrMiNpX|Ia3fNhwD%-8US4t01`Q{Nhlk59 ze{~fA+%`t4!wrrrzZFL@CqZBJ#r_j)<#=N0H`9$po6pq0y|;p=SUS~%=-ZHW{MMVj zjs=RgDJM+B58&TrQ?}h7GxHkUL9r0!=5{D$PN)djstpt8=%I>zIePg}gxcl)Y_8zEM)6ZOvXy&zoU z-Dqc=a=#wonO6eaMSFQajBUGK02R*(ei#?m7g(~V5UBKjlz8c{%MXeT9r4TN_wS>q zp1S7p?w_I7&I7{Qq{#HeLE3_r<8J=Tk)-xJ?en}MDh`(f(xqP z>_)dCp9xzw=Pjsq_vi2PSYlH(hW6oS{fgc0ybEaSR=+w=SqN+!BNW8l+rGLwAamE) zZ`+f}9Y@QEo&abWKshhmteP=>L;OeKye;=LuMDRCIeUMr*=zY?-Jwl6=ekpyuL+Za zpf8&B$WgG<(hJd3-x=x;OTAbUyLNC+)XGz>4b6sxkn*XYm1?D70ST?{XUa?4*7xmh zdF}j@?OivcjW7@F4Vwo%EKj=^SUIQLL3S#kQ^SYD0CL|{{% Vukz#EMy@vjAW{>f-mgr~{|5nAZIu83 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/meta.txt b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/meta.txt new file mode 100644 index 000000000..8ad8d42a3 --- /dev/null +++ b/assets/dolphin/external/sfw/L2_Hacking_pc_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 3 +Active frames: 2 +Frames order: 0 1 2 3 4 +Active cycles: 4 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 22 +Y: 25 +Text: Mess with\nthe best, +AlignH: Right +AlignV: Center +StartFrame: 4 +EndFrame: 7 + +Slot: 0 +X: 31 +Y: 25 +Text: die like\nthe rest. +AlignH: Right +AlignV: Center +StartFrame: 8 +EndFrame: 10 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_0.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bd20ae84369ed42105e0a1a546d1f1d654f9be80 GIT binary patch literal 1778 zcmbVNdr;GM98Xo0r%*(Xhq_ptfZ8T$N=qU|fl#PNu~$(LJRxmUsL-Ug0otNF9=_P_ zm?Bf>W5Ovob*G#H;)5Fl=3_dcR${b5&8xtHBYOy0JS?9>nVS2&*C@|87a|TQlOM*62E^Wnaa=|;hIJb5lLjv%f z3Y#Mrybmf>r3Pae3kAwVh)@T^Fet-Bl%5o8Q3I))3yNVe0wLTj6CyHPjN%9ej$8uH zp+#@NHH2cs9k-JUvRT%QLr_6Mfv5l#F_tU{!7vPh#gJGm$TGIQ!*F=Cl#n113RH$5aj{r9UTO9Hp4R3Y{m?VQ4s=$ zrWk2GQ(z5q_UL`e1Z6SiQ+kDkF@f)jj2k}^fP~aa3}UTTNMRC0s25A5LQ;$Bgs2vU zWl}=~sv{A>2wwkxiwAK*LC#6}&*Y3AapUM*exL%k`9LO$<``t*sN&Uu)^ju)uTD&k z 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_2.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..514241266b9dedb21dc9a4e5a72b77d7038a77c7 GIT binary patch literal 1779 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 Y0nq;p%b?ZI6?y(bDn+WiRhnP<56?u6S^xk5 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_4.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ca696e4cf425d7108426461b313fc8619bad15d7 GIT binary patch literal 1784 zcmbVNYfuwc6utp@h&+pJ5k;4v^3Wu^n?N2Ac_cxi1SkZFij>V}11TgMl8ppxEzog% z6;W`2Dq5;olqyB5Gq#kfbyN^Us-hw?>WE6UidBj@R_O-8_J`w-?(FWl=ic+3_t{;a zl(5jv#n%M@;3kigCeyTtexjW1>GvJyG6hYhQ8E>kLTage%tU}_4XGv|xgN_Rk_k*x zkk>{;0ARmTr&LiYMZ5?n^=!;0!?x;;G#Y@2NUIUUa|jAj6InWgm^s*dj0x#9VrE*X z0#+C$M7A!j&_tvZCMfa399*bjMlOINtRh;0o}e(us?Rl;MOHC$Os|Mu+qOAOXiS94 z5i?&qrBWn864FFKd^WM;aiTModjwC^3_E_H`6`qeAgUvB5l^D>`c&D`w;%Y?!0h+d>-v5}ahhOj=AhT@r1;1ei|WyA9a{X>UY{CLLWDELTe67Cm90;Rui4{pq1V)i2B}wK^G(u7~Ns;Dk(g>kkHUb5u z=?oe&-yCeK(d&?lQuLdZi{8k85t!qi-x#Z_}* zewbFk#W93Aj@SI({>B8T7QF~59vKrv9f3Qw4bp!bVF|Y2F5_f z@T;n8j~9bZhm4oAi*nXfe!T1H<#zF1A?Q6gdj3&h$wIJmGg{idopE*4@%S%JARIid zIA&kFyY3Q{K4;`bK(BMH;E28P(~^o}g}*BGmiO7=+3B90Py0B-CEg$%#wwOgM@C+B z`^n>G1q81y&MTQ@+*w+NWXfV!hd4Esw1fR_y>|_94c+>ajnSCVYxRBqPZn3U^>swe zg`RJ1D+mPrc`hm2ywmz6%W9C!N8ys-uPjyfy*e1K-&xuuf(5?yA;2dCgX~)M4SkU* zAg2y@k7Dewga5#5JA14B#6^d$Yc zaZ}g%TwdF^+07@Yiv?OYjdXZ;0%Ntz+wHSC$jD4bDY5z4;TNFsW~w%|GRjmQcsUfD z_-m8&qWo&&{TVBKqsm9RZhL?w*Qe`6^M0;NdS1M7?n7R4--Yt2IS1^ViX`bJ2aijD zEU<;WCD{5!MjGaRq-OmhFndG1IArvqA2+u*y~a6g*W|nlYaMoXu2SA^dap#FPYi)OujB+BxvxrJK&s0jBs()wW`W#o2EPUT=F*s z2DxKvKDzhNT36I+M4CE2Ls(0F!BTWl!|0208LE0FTS@I7&)0UY4 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_5.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7fc8ea0f4d658610ee89aaf2c68514807c758d GIT binary patch literal 1782 zcmbVNc~BE)6kiBOkkgS-Lo$$TNEQfqL8KzI zR7$PZskfHOQAf);qJpBWsMXPmc+sIKtyU{mm_h78HypNqIR4R{-F@Hp?fbp=d)I8G zEPa*toWMB%0C=Y)OXRdHrJr~vgMJS)x2Mr!AthB(Ye^kdgj)zetR>Y1m}10p2swdk zi}QPlSO8!Y8Wc)OnU*TlkVY=<(BayQW*Q9uv2ivtuE`}RP)+0*Od{4uXBP`JXhp2d zs5CguoJi;m$t4zIZArR9Qi6X~}^Qfj|JkD1@RMT7zRPHc_~ZW3q2}+e*oae`&l? z+o~uw6Of#+k_8qGT@qdRESOH;+Z{O+X*R+Pi-E2So+lwS1xCU|rAS09`U_WU&oMvNs>e)CJEysh%`|k#l(q{ zBry-6S5eW(EH=etrErsmnDuR-ea~Rww_=5f76PY8i-IKcW*b4KCn?gZC(R&=aS@Q6 zX)tNYBI`0ojiy7E5Eerrp-r-oMsO<0Lc<#f@NhLxhpN>aLcl{fT9g;f!PS_CgQ+o? zAFYeQG&mi=G+z6ElLyhHAV;VCr*meH=yr50UylO4c|A;oiJl+}Ju1n*I6;q@n=Dl! zrRC)0wWb>8J?z zWB6^TisIm1-oVMd=XZR2PTCPPG?$v|H=14}*Bz5DdF3SbRVlwt@iqOy-qUbxrCPmD z+RfO8O8fT@yE`9PKJErEvRuKfgBO?&3xXOByVSIGj@Z2cc)NXjIwL-(sfL+k9`)Yw zOR>-3uZ*&eb&;V#?&To>vU_oHbE?;kcA9%kl$1l|O zVC&G8lTVkGN<7&>L)boWLl(bJ76c!aj01Movk50xK={2xQf&a|Zpd&+&e4b1d{j#y ztg*%QkbkzaABgE+A^6Ps=+c6!3KS?CO8ndWVa}H5;a0`R75zJJ8s;~CViqrFx^zpq zSCuN?_<|N7e>wUnq^-wm!S&s2SHI*)-ax~$)`Q!W%8B)b;Kvqv9%1TDAYlYUatoZ@97tVeFK!6Q1FW@#Zk7ve9G2UhluD z?RNj1THoD0s)N5pID@?|A!)-{aCO2^@)>Tz@w4ugc7H7RwpgzVl~265=b_!5@X3YA(c$#7$(D cZg%zp_}|T2>vB(g)$u1vk)}(IC8+HG0C{VIwEzGB literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_6.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..85d1e30c9bd90b8aa7ccdc2355c1c33e9d183356 GIT binary patch literal 1799 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 r6Z_659q(V>{>!>yFXv(7GoNJOS+GxZ<r literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_8.png b/assets/dolphin/external/sfw/L2_Soldering_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..12bed1b4a04012af0eeefb7566680314c52ba787 GIT binary patch literal 1798 zcmbVNc~BE)6#qg7K~7OYyw`=Qs7ZFSfgBP<2?9b80U;J0-6R_lA=#K+NTePSM+CK1 zE2YR$#fm_+f_6k&5Adpj3KX>t3W&Cdj#zJn z;@27pUMxY8X(km@5{=I=m`UG<9oZBaHj>3A9a9%PRYt1P^n`(qkV#?Y3s&C zNI(cNjvC>MI4V>?aKwB*#t~@(_?S|Fpa>xtw(~wbCJ>-9kys{LhzU_NG(?Pwu~5D+ zKqwL|2*CXPhp`a`ipC8pV%WEi@jZkM`5;yjVj^&wG{uu->Tn~(Xi1u+w4@Q@V_X!P znW!_UNi*eVtI^w#WrRtWPN)}}NIf)|WQp!Q1O&KJpy4Z(96~HWIcmNjfP*VB6$evd zh%i7S!c;g458>7SH+ejU6wlTv|LL6JBc>f~%Xg!|Y~BqMVPGc6#EgpfrSJe|%tpjS z#fLI-U|^uMbzeI(lVc-f^W!adu6?{c`Xb^&y%{LmU6WKONN@RUGU6M|P7u1^y$-&) zdUNUPo*t#MfmL;xwOsgjdy_+5zebuF0%|sHx!eOfPd?3gv2rK5y3PrhGg}^ZT>w3` ztg2eJbq07fW5Crq%lGrmNK)^uZg;y;r`$ltzERrFlCeF%|)5`A3pJGLg%!;_KZHm#Ds7J^tAQ@2p+- zlk!sQ!K^WLvYup*E3ELK(pHjfHH782EU!5@rR6%;&g(1|-f(l)QlCdGm&5*#@zx-x zvPHmq!{|+(!Fd&?*OTlNR9*!O+0OwND39i}Qwd?N!PS4=u@?gCx^n?w-?0U-jZUWd$YBOt8eDM9PrrX-kxrt z>CatO%Bk|6wxha@T~*VuM0?utNknm+!5&(&u3;*-FSWTrmz(>`{S$J@_0=cn$ld;> z{gDKg1<(DtE3$9y@!Yx*XMEBXov>s~DVXH9?a*ES(%rtrr(-A*U+>(O=;rL_vE|c~ zL6_K706a#{yHCH9qXipe50-D8_EVEGSLamYlHlR}d|Y<(fsLl8o}qiHr{U4<*`vWH zG3gE9qXQzM?pDDOXNyxFaPf&O?mz3*W8PG0Eid}D99cH9@MZN=yW|}$ty$8P#_tW$ zrHSx?GF)`edBdU%*ls$AvfuvIocxz=bsgnJc2J@>im^{pk8LkD?ug5|eU5jtyg6ZUKAm^%&~uj=y$Mt5Z--_FzS`fdovjgN zZ;m0R9$dGkpl`1GGEKp*FM?gzQQm2_MN|DQo-7!3-o*rMwzQY8;LZK=+PI01jinpQ xOY-T-lfO=XQe7CZH-$JoJwIB1!wSZ1WyRz~WTZV+t$aQa7gcK3bXx9|7f z?_INXS(&SRy%%`{0DRNa70|t^NAe*7oXpz{Y@T^@4vvwWx zU}#o_E|J2oNU0QAkc={ukPyMR8Wcq#p%@{x1g_@m2+eW`M{$gYF}IM52_-mRf{CHI z3uYXewK_?TJax_;vy;L_G;Nabcvhr1mzhFuFz(+Ep!g~ z4~;i!Ta(Q>v!1C7Q7Wf2Wd_nnr^}@<^99lB zwUSsdCK8ZBK39w4BCZA#kX$j2^SL5j9L`q@Pz)sn^LE~Z=O-n}lH_QTD3ve7uoPJ` zj>pPUFkBcbN|wdOzQ(2-Ei_@&kn_IvjPE(D_&>1{nVBSL%B-ZQ()mWnDxzr0Qbd^` zoR45oRG!|brL2}^t{S}xSx%bu<)k*%Oc|irBun&fARr*r0v)bab4jrP<7#n19G6h@ zHC(=$j|$^-BEE*e;5oeZ|0a*ekm9*I1u*QvrolG?3~oH z*73GDcP*X?1$TX&zZJaII@RAt)%*jWL;X$?| z63oPJ=L|%LH&mk=9!P6Ca4+HxfKHuSX{+P#1{MH7T0v0F*L!&@#!nP7c}5U(;U;# zHMZ!}p>B`hsVx8TcO*H$m zks0s_=;*Yk-JubGedOMSo$_*)C$~drum-|Qh9C0;?O~-}iK>rwZ5v>P6bxP2qwv17 zkoCo7k?+8h#;j??{p}m*$va)wOARrLa$}A!4=fNYktMVg<&|D-GcPH)s0oWZ7qVO! z^+U6>Ap;NY=M3DdjbOD7mUh?qohv}Fx)1W%iKouqtC$|!(Jj;N4>^1$wA0ix)T0Cy zQ4jJv+G{yudEo&A=huVXwN1U(f!|Xfd4FH)#qV3K8w=UKZNZ*khb%lah3qJCe*OZz zk< zt7(=VT6TA$W#`1!WXFi|VIc9bL*d{1d!%ph@akr!C;tfg5^0K*hWN*}HSgK5&6Dpg zzOcD(ygDqdZlbPq<>*PlV2|D7zWp{Q&RAUk?0%!>#vSbM%V=Pg|EM_c|eOI<*4Kc>p$7qaYgeD@TP?D_K3Ry}i5>Z*R zMUhb1mn=ibuHW=LPtWiD-W0u>pGwNs+EN?H|Jqa006j6O$@9VGmY`- zfLIvg6e!6Y066u1^!2Sw_4OfvWRjzXU*~ z%Rp^>j`@7I0NiChex2sncuqS(p@Uf_woTFfoF>`v)5ZDS}Qqw0CE!;h4RmEF(q3AZAvz6fzdA<5J^q{44cv!U}wz;7Mp!TBfvs$qb8G_W=Mnyw&@9 zUrjrCW_ogL+H=OAzSf+-@3%~XYDukp+poLM%nI;X^w5V~r=|v20$Z6L2RHbYH~~X; zfcLj87v*7a?per_7H8RL@tosXhks+#5)*R*k3(MwpcAzUyMCDKCcx)~ zMo~8aAf;g|N#{5d(3Ms=0RVNgBF@FPh0R((0AP@N>DXgkjsvd+%NlvIUQ5(93Nz!_ z4Rj93G-~kau}{*(IrBvB=!)7jVh35DJ!UzadoW{+uj(~YjeBO4-}%yfpfJ0eNX{FP zx;QYaZW~AdCxwka=$<$T?FI>_C$d6uCg@wVLdaaa;Av=c8@Z6VM9=r8i;46P7+FyL zhO^Fg@^Bjjb#3=roiXzEr6;FZJ~9XEyeO7De61xnsF#A~b)ntK_v<}ebwrc)Jin;- z)NC*Xh`g4Fr}ZLvJgnGBo23eOa3_3`;+naRy36WhN|f}YUIAZa(N zlX;UZZ|$_dovaqbHph>ff%9do3vctE#1OQnSnuCM>80mBJl$22^AYqg9((VsDKR(1 z3V!BFi2yn{L$)jPkbXxYtf2pWhL4xehBthUQVaePbHp(1eOjO2EXUl;T+CYN0q!{N zm{t>ac~L*n3!+6L)uQlpvj=P+($d>(5T8(D>0Wnv?~-gCj{Q6qA$0Q{e=0WBE;TB3 z=An&kkgaw<^&yu{sV#5mIlIUQMz&9_CQ85`50&N)LN@XB>B zdK=IEBret{H_oKM24CGGdPC|^3yQGfpf^CaW0_a_#xSR;BiIZEWpuaL;$G5BPcN9C-cRI?vpfUgLG*TEV*TclrRm zS5g&$2B{>A`Xklw%bm&iS--nJHNDH1$BGYjc-P)+@-FB#EjU^uw{*p80uv^z!bF4%qu!iP>i!$i!xL zJTETKEN=?QBz_Yd7fe#L}Foay#UEo~ESYTgN|B3r4`;+*yN1{`lUt-_{((p2(x&fZJRD=#Q}6(juMRB{J@T1cAk8Di13qJVqh9jQ}?mumZ- zeONEZe3>~?{+amkOQ&XYWa*B%Ql?nD%Ueyl?%MK(!}$5miR_}xqBpC_Gw^dE=N!-N z)E}{YnkAPrfFQOFH#v>gcU*A8YH1R-yXRQ6TC|w&h2OjK>cK1MH_cblQ3FxwQ5?HD zJ14d~_L4Rm#;89Ityr+RF}-G*VyeG%_|j7rKNd;Wbk_SE7`7X1FWKP-w1o5yfVmwd z$tk2p;U8jKc;yi<#f)B|cc5&cvtrwbPC2t90|yi1dO+X!qDT+6%;q|ugW^Yx{o`vS zeMHlRw;}}=p*T=B>A2%npSY4#a{a}LVc+NE5U(;{e`|mILS_xE z=3&jHuq&H}D{1@`0U7Y()yby8Ce5o8LCiD$8Om9c88&w)_=>5K{1?L0bKM;|p&E`D z$K(jL*t`5`Pqe3EAbM7C5zDEf0CNd}AD1&@Ee&7g-^f2*SzU8d{TGsRV{AZZ@?X25b1=id?cdCwmLR8CFTY4Tp zp29szohH5$OS$rHV^Vr6Xmwb~Kh~_bpvt0nKm4Y=Fp-M;>>spU6pXI*D4)2a9clNBt9jtAC z_)2Z4t*ZzogDsgD&>&fbOi}NP)h4TSr8;%W+PS*SC_P>u?<}MdoxiKZ?N<8_Mk{9l~ zp4e5@^{$HrgTpL3bv`c}{*k9r@H0I7qDzO}UU_NttIu*n0}Wq7FRb#!NC=(yO255O z_w0C>yJZflo0w!9k z+&E%_4V=oPk%lrCGeVyQo;}9%MtAD<(QgkTE=*X>=5@avdE50Z{bKbxXx@Z+ybs$D zTm~y3=4$5E(`T<2WJ{crFn(42D~gVszz4TtlI(MGv*k5cwkD%fCW<_Ya_vB~`QYgT9)M+NSUnLKhL z%@Z~{7VR}EC~M~PCwl20E^hla_6L31{G{Y^k6KS}SrDrZkozKDBU`(^8S-;cIFxhA zY{VrzDeTeitD(K`9NWC#FIMeW5*mr4n{JJ6J#QU(={(>oIs3PNeYi5#XWVJrFKr}! zBPm-_QjGg>{SS}sl(C{GMFKtVqU?TA=YvXTzU__goa%Ad9bD$xO6X~*pq8wX>7^x) zu&vUql6Bow&6Nkc<=w-P^cs5Yx7K>ebopJKeXG^pZG3Cdd&>>2nTY*e_{Qbc9h$oA zLB_38lw#;WIYaWKgyP5qK-YuhPJoyaab5�?vbazMY@}04#AnHVzaAb2BWSL{!54 zmQe~L1~Rk(Ktnq$5Qq08P$2FEFP{KSDE(yv6yoEd3AM+VBg_N!3En;?;bg*@a0?rJ zxF25K1FEeB(Fnsb3=jzv93+hB9}t8M(}ezI7t2`xCc~kSzeFg0n$W*NIhb2P^hsm_ zL{$j|!y^y~h^o30(p?3EQ&o3ID?(5R6bg<|fg_b+C=?cfWW11n9w@^h*~1fSZD90| zJH}2E>P?{pV&U-6&`_mNWhD~X3yxG*SBE1|a1;v0kbnhI11PvKSU`~U9}5PAAUxS8 zkm5rMfc&XtO@@Q zO&@T#6F7>wEgs4cLp>BmPZ^0ps_FjGH4O-&-~#Z3KfZk!zW>oR{GYm5eKG+@A(3rJ zB>z8!VC7Askb=BPfe@6k5(Xk~j>G!|{H7@UKBd2dHXx9FLI@s4WD*hbSDLXt{{;e? zfKgW`AaO9f8V&(Nt0FyM>Sz=OhV)d%s}pbtPrND$`j5WHf28m4N@Y+OVFdm`gT<&2 z)KySuJj_##fP|@H(2Qi_acG#QI!+b!n}bnNgTfgQ;lC^AKPu@DiBX=vm;bf~WAkrw z5ds(;MP{^)oW-F8M%y8*%xnx9^RHjOc6N5Qx3}5Z*%{llwKc}Lva+(VvBAvD%)-K= zqN1|9yE`>CwZFfwaVS+609X;G2D&z3Lko`J#9_pNkM9jXzx?%Uar&_g53eKGN|4Rh zO*OtYhGUV`j7=FxN7)fxQD+?f{!nP>+ZOO}Se@%piKatSp1)iX8DKBuqkH(S1av)7$w zIU~UZ`rsBst`~;1RntRp_(#~O(E8$a@Jl^n%5fk79wVsdHp$EB79z37ast@wE8ckh zTEQ1cUdfiz0vE9s2b8*ftpsWd+i6${NJ}SmC6&ozkWb$@jkn-nX*7?#vD@ce320vb zl8)E`;SZ3bU7$}2z*BeHfZ{26JjaWdx8%ngqt`)+!ws$ua?*NZvHmZY!ha%f5MOf^@#XrS6ovESv96cPu$5$Bs++0tQ`=+s5KVMGT+9=wQpHpj!pMB6N|du`Z%mId*?o!ydZ zd2>QL?{U?HteCv~Y%I+}VXJjjB{skGNhFh7v^JB5U78Jtz!eZv4OA!7$z-~(htQqE zV;;{TbiY2q^lP|ypC!*h@eTb%7U)LLQezig+}Se5W>jWnrV%5$9BcZ9GJ%kL+|)BN z65NPQI*LLAu`S;h&S{=s_LpLdmfjrUjqa5NjKD3Q>n&cu!qGNuJcahrcdv(Xcc(CU zm@LUvX${#bycYmxWvj8zPPe^FAe4)7`paDSSc5Mjw*-9;k~x1g{f5q`OyLVbY_-Wx zawE}6M6+>c3?;o_=XkC3vvBz~vK)<8hYB55{9%`Q$h$GWl@Iiwuc^V8xg?)Xzt zwL<9m;Oma3iUXg4;=I%1MWY=Kl+TXgd#7_{8|=QU2ia|egg99WK^pSDZ%fAB)835cW6Efdbl#|l z){F3N{1K2VV!v{AfUmHOV_Ytu=B&sZS<3&y_N~BowN%mf_jl9ZKDFyld4KJ~tBK%~ zuI<%5UR`8$Dc!!X!HQ{FAom=_>*O7blZ1|UoC=_0zslKUQf&VtO;Da6;9|{6jEsf= z*CMozI0eyJ(H~(PZ7`B#d&cy&t3^}nSPt;n#I@5?%yPN$=TAxtn8zd+L3-E{aB7y3 z;~GspF1J=R7u*%NV0c$9<`Dx(uhHfnWT~ZjTmqOf@D>tbXY&J0<>N|@+HpE;=5e<_ z$F@i9d*?AX$U)fdiwSzWb9QCki>W)_P)GwAYAV>8tDOQ5rrj$S_LuV1x40zsK?g9<&j=>G$&h-8TX literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_1.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b99a32ff9c04baa54b66b8e0504ec39ff75ace7 GIT binary patch literal 4782 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_11.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..8d54da6c61b0b1ba2b876bef8fe1d023ec958909 GIT binary patch literal 4838 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 VFrQLE34ShsqrHn=g^k~-{{y`aaz_9F literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_12.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..84046a46c8fd13e533bd2181f088fb726946fa98 GIT binary patch literal 4775 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 U`qrQ19t(hl=`oX1Bag`c1AMVsMF0Q* literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_14.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f6ccd661ebca010fcfe407427402ee65958efc GIT binary patch literal 4722 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_15.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc1a652563722b09ff28efbf1ba62efb97e79a8 GIT binary patch literal 4742 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_16.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bec472921c88739c9ca5d1290680fe4b1d0f1cf6 GIT binary patch literal 4639 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_17.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..82e5176c89130ca2f5def41a7b5888fcfe921d8d GIT binary patch literal 3796 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 YnPB0-mm!6Y0yuz;)gj9wbI)`C0T05Vk^lez literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_18.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..3b5e60dfdb933468706d6c1749f1cc2e862b544a GIT binary patch literal 3834 zcmaJ@c{r497k_MpBFPexX+$Yw76vm}2N`8+Y@n#olNm10YFesx!e(>q;3L)OH$G%HQ^EB&N8xF)38p}7dphT=@CPjd%2#b*CLKaIvv;l zrqY-9^lUJ1YHI1jQrTGA*m4WIbxYV*Y4zCAEN=jX3pYS_sYKghtLw|d1ZA-U!XT;9 z##f#qH2^Rz#10B&Ju+Svct{5X0Y-<`Zt2>=wTq?p>Mj5%78n3ak8Ki&!2xwzj&(9X z-FD!S!xIm2ARYjG*&!G(a9;wL{9$Dz0(9la^~nQWSv&GYfg1uq@?Oi`f+jD3Q%>h` znu1lYfJ}}FSWCF7P$10p8NyO9tXu>Lh{DHgF*yZc!D&gUs@t$*Le?#t z0YGuF?d7Vzam?80@ZczU%$N70CTrDanhrMFHPgRZc3n^ykg{#%^_(0T=@eqr3Ow?! z^vOR4^f&`v{flney<(Y1#oq=mMzZynO?GD7v9B{w-XXqe)0CR~opRXcNTW6FLHa;s z=sbUSwKsSgIGtjWTu_yLapg3D7Ep+b8fz5Bz-bF(s;jl(=T@RL+JhNQ>OA!bw(SH$81B>>K4yDHmf8=p4%R)u~O5R8<>w+8?wp|gbNjaYZpzO=`1_OfO+QmeUD5xZhk4lsgg{4 zsa#eiFG$#6ZnAlIm4Osy!*JLR@jKfSO%)ug&|Sh$9|_`nmT5VU_Qn> z)(xxr9m14B-8gRYE2g&>)eRt;`Z0fBx|iq4$FRCeQDwC|-M$>DR{6+2R(KnB~)^ zSiI9P>{(V`+u<+%Ea2?5C}LO}T#|gfn{fR46^m0>@rvrTa>Nll(m5JQRL1KC$SPH3 z5O|`y1tY_@O^TklB=ySoLQIS$-WqRqPi<1QSh`fyMeO1w_^UnOxO;ZRYQfTr)j{s) zq8R)^j{3JQ6IE({IiYN zj*pFB{1LcW;d^!AJ=4EWQBeCR-!i`;WZxEyzJf@TBEHt6%bIZp4*yF`X z>j04@r2yy|YX>vG`(zF|mYhC%x>-Q-P0_$Ksyppa%dQrQmNO6`h%uz7)4PCN5L%$u z6WmkL<37cllAD_7;rTPtP0}^f=g?I2g1=a)Zt0QI@X}uY)~`nIh!gB_vAKph$?=bE zmUGk}*>mz=d7ZpA6+M`asBVmcFI=BE-4sLo;&Y3_ZJWL{cyDW?S7~guS9Y6K_8zYK zw=15XkwNlCWDb3YJ4fdesn5rN;7&pG=2Yj@3|DA0$NQv^OWTUyv6`CdH2XMRochTq zR7aXm2BD(6tatfFc&632LW{ zuf38>>gH5*YU8te1*rwq0jbn}nIV~IjdqPW2U-t&a(PmGGG%hZ6l$I@uQpGeZ&hyE zA+6kbfOQ~*$?|Us@MV-uJ@OJR+D;0Mu!2O05 zs-c~s$)OvUGnNkgYFvr_Svko5E;nNT;`Szf>sw?xOX0 z(=*YC0ZZQqt_npVS$^@XjK)61eXXxYiXB*|Sqqw-oMG1`&+@35==|%?5A=FJV+MF~ zynS)L#K}}{823K+e9)Dj7BflGtZlo+rmhZGcU2o+{p=?==9{9OHk{&^$RZYw^kqGl zA02OL%m_4aMY_g>=!f5uPI_!SauI~FhiCOrB`X3LRHT>+3ukK8*MQ=+``iiQrwk>g<;i2zu8_{-*D@;>|$J@y`-Eq^xpoUW804fak1st zqwlr*$*W%%RX1Ib3n`CzWY2x{q>CHmIx_&Sw0I$>8tEV(s0DY!m3jnGrrXapdNn>y zT(KX*97;NiscPU<-3d~Tn7!buK; zbFc8{ql4VhAs5?|9U*gUYERFnLnRGU6WEEI2^wd?wesPia&Oa)x0k0S3Y2DUj3}L? z9{R+(6YM<~)m+@%&@6-`Ag7KsJ>&F#zoVNyADn*9t1J%k}JZ9)p(@00u33)aiYK5j?c%010mGmPa~->gecF4WI{8jE(DE@S)vFSz%rl^iZGEHtzX zWvmQhA0DGmkQN%JTnq|XKWrurwDI1Z`{iBL;rHR^2Q9bT>~h|lNu?5+`o|qywbHqt z0rOMxf#Tn+``m(~gB~td^sIc{_-o78bH%Ggq$=vb&r?;WT3@?v;Yo^J$ykkFdv|59 z-LlEDL-nBQjp%e06(tG9^6wrkaf5k}^R~4%ggURWC;T3a^{)&q9d5-hcTI0vjBKqe zWarN^c@Od*qH9%aRmxh}hBJ4U3tD>5^0>Ux{@QYtPzlgPYZ|xS0#zIz? zp$nI0m%>nLTlu$21(pS#KReBFY17Yy>h0Lh}t!Nh|^=i0Vu8LkAgx|FVnb&)3CJFz7E8mX9I$Z&G+0 zdypBONdoCVxXbWz`#JQKy58L(-R6up-@m50*XLD_!QFdoW!IAkUS1D=~U2PX+~52g@O(V zi9(U!1PD=|0E6i0!95@-9Rv~rCusY^oX zB6NrlvOWn8(L?I+lSw4#K*%V99%6k5sjCl$@+m^sE9ZYI>5qtCp6k zNPN);UZk1`z9fZVxFhjJG(DT>+m;yBA7Ag(xNY|9;y#~NmL{)pBlalaUvE5On|0S_ z`ubtqRyUjWkfSbPx!lgJCm!Z@YhcSIMY6sCH$ln6-+$(F3y zl_i8^&7Nhl_M6`K?frfK_+H=VdYTh02H;&pJ`=p?5pVG1}&$`l8fu z-mB1%rG9FU4NN7c7f(Lh3|F*a#|sn$9V z_67i0W~By)QA%`nSe}sp5a8RZcucVA>#yq-7IJogbQ~}S7M$j0p`(FjMeF86K(i=N zV)ep}3rGL}JoSn`7%1Qc=GRQL*@1!l_+b%X;NjtX4&W{ekaEKK7)bXm;9_$PtpKX6 z1F{Nr!HR6P#Vj<3*KlJHt%@B8jIpQl>$(866n%v@Kw2FH7#um+&MIxnnx)iJGnVh{ z8&Qs80cu+l+mp}rC?6_M>=F<9u{<_@bi5A#TpuHHQox;a0-T%m1hCklXJfTK;?|+#U}|Ori~l`V3>97REgexo_B`|Yx&aONmka1 zfH3Bx*A;OB}~Q z(X@l}98Na`>hR%oy0N{fy}=XNd6}1j6&!Y)*Kfe;j)UW$n7@<_5!|c~c11p?+n*_v zTReK?Xr`>walV7j@u*{bE%zqQa~+kX!%etNd{9FuNUl|`c8`Epx~be8ozOBe!BI*p zlunK-qw~|v?`^ldpC~(oY={~+<$QPyotq$d7J<{5WP9`guAh=sVA-CZ`H7<-3i-g% zgpd_z0kw+EKd2IrD%+kWY|xqu$?5G%_44pyctU3>6`WtLA2CYqO78KQ**`lydwng4 zhxaD$^(K_-2{9kB%VK$=Wn$12)5q)|lT(_lmHOclDIWLv?~`ooPi>sKA{6&QFcFz( zn;4cjU0`kFZ==&oE#S6(YQz83$u{)y8Jiat-|{&>2|w-4m$Z4CuUg!J4noITbXq#+ zR6Fm6Z((^$Z$_NSx{1oM#+EgT-90MY2*<71>-UjuS?3gd?wh$@DBYYl4P@Vz2!viX zwKDK8a4&R^bI+LaYiHqWd_K0U@j3l$$I%Ynj>`~Mhz{g=pLdaaQCN}MV8~$gpz8v8 zL3m+qa4EnyLpMVqV;xCAG6Fa&R4XhiA}WRgI=^dw#LiJ?IoCg|^UZ$gHeM&J<*bW* zU+P=xmQqtv;ZUWE;bH37-uTKuNdRD~Md**bTLl-l-_VQS~a>UX)x(ZD|?bz5~J|Gt+p-IcHOqW(4_C;oWdNT&kk=PVVA~} zhD>XH{iGAxJlA~c{JsT^4a|n@24SO9vhA>-WZ!AZ z=__PPKwBW*w{kA`tIGTQ`uz8^b{-NQ+5Q=;2$9F<=&gdufyp9PguL5%#0Md*iId`s z6+N#$uIHq^O&c!yO!)MrO{*dF>9(0-nncT`_gYJOYs(D#alf{28F^`Wb*uDgs8gVm zgVT1^5%U-6a+!Tfgyy083u9HSmtBzBTDYx_Syt^vZP0^|2a(l}tHGmM)iPmyVJTtz zcQUt6Z?*2m{;c^*{UN+^p52Az9m^z3)iv>JFIat8rPxx~9_>f4-(`Qh56Yu0q|d|2 z>mWsrC)JAlkl4g34|^!2b_;#r$PjXr*ivefGdG7uNY};#&s4-)F zRJoLwSc=GI=%JIR;021`Eniwu{3r~CzQPHIZI7y$mDv0{Z%z++za|HI6nf*)cIdqzZhi9yP2*FQ(E1@M5bmtS~G(* z9S{!mE9w#V1(Qp4Ca+8DTR=t4C-aDAk_Ug>NQ*Exs(yI)q2=?k^0S)vrZQ|3H`KqJ z4mH^FylH+Wpi!CA94$|c6TA0DX4TBruy3TW^RwS)h(mgtH@*>=5tu znD&?LAKF`f~3%u9h(N)1}s>^SuNA5+7$|=3c_DkC9({jN6QRWzNXl zjm?mflHe7u`r+0Q|23~P?_lSLFxy|$Isd2Aqr2nV=Q{0o29~)uqdRMgsrjqqrKkDN zkWDg8Qk5N4t(C_+MIA$-OXW)yqfJ#(DJOPx_bgVsx3EolUFHn!=_`9XP{xhbZJLJc z0p_hzjACR@u_C!sf-qzppyx(%#YvkGFdjHG4&z4kYr$y(0P9UJYkP{lnJE%WA}C^h z>nH{je3@tf(9{X`#bAAK6lqtShZj)`y!5sPEbZl{1-3(&DVg~i;5@xhA!M9Y$a!mQ zh!0l74XmRrtr?7D8X({(80laFp6HJZ)&l=!7s;Ie7DK_(f2mM>w7`FpvNyAkHXxC4 z(rSuu2v$i+Nm@-q5$39jz^G}sswhaqmEdrwk}4FY41vRuN-*Xt{m%ntIwZTfBhiLu z{&B}#X@NZ{6kjA18Wa?y7^JL7B6~n#8X6iQ(11Ya|=e+?7;|H&0IYtUefFBGPz1SJrDhxV7YKLw5Z ze;WT)+uxe%i-V$Z{-gjhmU$%ZGJn9#^!;x~zZIEmkmh9O1%imd8xgnJhYHseXu2_f)7K4GP;FR4U7&ljSh>|-DqmET`S4AMy|JeC&cztD6xSG1Y zx~jSX3A%v9^!hIp zRB#9l4IB&u!K!1FAS!AwH;9G`907s3D`Pcq7$tYC8XWu&-t9lq_jjc-CCo5<|FA(K zRB;-ra1|`XT^$F5s3BCC$;4t*AnqC%HTdrxgsM6i%A^SWT{-_zNq6lH zf13+OWOfvp**bI*XT5qFuKr_Yu+qGK5xr)zpAqLn*pH64tkcf#j&cbRNh5= zQfD<&kU9T~b4oH_cmG>nZWSzR@S~{)wMTL-k+4al?TWEE>zQXLgdp#+ROd^_K8NAge;e?kj~5hy&$pbP)PT%C|z_k>UA7RYj*_Uan$ zXV$H&L-jJ*8jtwGQDNKwjkEmxb@d}qQOb|{&}BhJDlzDUjR%wpw&AjI1*P=7dZ__X z2EFXg*P=oV*o_CF z-E~ZLvg9sR=#S04p6X$9I7)4mcFbz~*_ibUM#kKT86D9{j0-Jjj{gYDn3JTG>#Xkt z+%<>>4SuVne zgMK(#9ltEETY#WhP_xZg2gryXvgF(zVxE2Hwb(Ibjzd{2LMHL%SYc2JRL8M1uG{1N zdy6fi-2La+iLo1%Uq^-nL2p9t#bET`q4!$S;ZJ#5SbV>C$nuM~W%ZklIJ1cYhKe`n U-yOBsn5_<&7@apP)^`d2KOwkMcK`qY literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_2.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..84d6aaf3533941c61a9f82147f1bd62f5b17b52b GIT binary patch literal 4785 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_20.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8394fd5185736cbc37b773ae64a7b76fef5f1e GIT binary patch literal 4779 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_5.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f980f57f8a6c7e10c63406770e7abfad0f3d1a7 GIT binary patch literal 1743 zcmV;=1~B=FP)-v7)F}{?eze9D8=ovX3bk|_{w`TxGp{WR*FqD)rsaGWH4hPeCya!kZQrWzWN-1YD zm7nKnu2IDkMvkyG1MJwWm!9vc-?CgSAZtq}(hg-mc2j24wIze63d z(|<(#dVO!d(m6VMFn~)yRXOWW9WJ8A-R;G8|n96n78t!EZubgxvpXJ}$ z18Cz!hW8@YGyal+7&xP0YCGcuS((sIhsa0PWw6x&^kGkz$zjUthW z{z&g^&z7!J**3#A2hep9RW74LYCCH%mY*pr?7r`e{^K}~FUH%DK0v3vswY>kh22JK zN?uh5)^W22G{Y;Zf6Vnp^Gq7T(#MmnOF;#QjA>^>*7r(er*S-w;0GaIT}1D)9py5I zv<{|nTj=m-4lsGG^oCI#<6qYmJAlgsW`<5JMjNT*%W))RGgO8(LzK znZ$XX`vyUi=@BVYNUDs0%q22CrhAV}5B*uvqK>gO19%FeyplhQ^lsgckU5#YE?T?{ zJbB$Ak%esz(BWb0T{rqQ(CD*hI!4pyG*Ra>&?SJW>yy!lPVy!rkdZT00;JJ*8h&Bx z%OLH|%!Z<=93c zgyT)=n#pOv!{oARdQpwN9m^;)}Nm8Xs^syt~1KwhF~500)qQOcYeF=u*cy6E{ov-9Gl zF55Q}{ZkFH#QB$oAJwu^AEjsAv3oOqWE8CVP@TGRqp}v=ESMWgq-T}>VB&?`l zHtA)8DB2>uy!1K&c32ZdGn(<({-{F#{rPZS2BEb{^RS+1DTb5@_I^K2XQl5wR58u({W;qoJ4^A_i}Z{5&PzO<^02I4M-jE;u?}L% z(b&nCWr9c!(@a|WcKF;9kO`?=S-fV@YXZG%rsUDzThBZ?mLBN`vOPq`u3l+dd{^Z9 zMR*aQpIh`xF-?a$&aNoWbj-4qmk~A`KZP&@R8o`X&(i&pA4PW7gk`iIJ@U+wix^td zYI^ydhiYVN9V3_y&^7#$5vA~N1%fE3mIF%{Z!IJ>BeJ{<5ba6p;H}rSL$t=1CSD76 zJWnbuH(X73Sx39p^z_ksc+Vpp{Er7abDMT?KHfkv49>(_0Y2Q8Ci%Eb!nLWjM(icTmz+$&Y>~U z@N~C~0M&WI36}h>6O{gXxUTb)kTt8qy92F3%O;(c{C0nE5E+0?J#6$xb)HG%li7li z$LK$m1+;vYkNSrqcY5@s;ih!#>J&At)2L=n>L+0gZFj@F59}^X40Cq!wSE#-RU#Xr zbg-*8nSh>&L=ii&4@8Dp0(Lfe8mRGET_!TnR7twC6i6UV;y(`XRINwWyUPhGd~)(> z@q1Iqr+b4RlfcE$1)Bb?`F;qVx{{YB1Bc{%Al|KLg002ovPDHLkV1j9fOVt1X literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_6.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..497136000858840374438aa4481a4f3fd1a9a368 GIT binary patch literal 1630 zcmV-k2BG@qkp5sX{Bpbv;FsfZ_X2h>#%KC+p6Ao|DoDELd6x6I6EEih5G9T= zjxolQGUWFPXv&|we+pm&*x9r)@NWoGGG<91IkOHa~X=gQC3M!?QL z58^H$=&&p=^Uc#!3EJNGbyBh+m@&~PD(ZyvId1nYf zu)8nK=+T54<>MxSNb(ZRXG<&w*%ESx2Rk>Lh$2ZRQnhIG*D-BXK-cwb#PcV>YIaR% z{RBA{HH8$rqd(DLrC(_g`}LkU&g)=IQ{0Jg1}xou>5BEM%l zqgk-6^D3kb09`C{8Z(LII@cPPX)IaqDKNa{_*Xpn6PI{^-6V&74*+>yaZgco7g2E) zoW-MB5Z*ZLE)Q=AXV3Qtcu~AN-U1C_4zay}!WHW2Xa*VYv%M+q}S1{g8j(@C+ zL1B%Llw#dwFD+hQg12f6aIu9`d%i57-()x`B8}77u zo`+)A#~v_do+fKK?~y%mtYEZ-$$4_o7M)CA04-I$XPMGfDnZ*@l>BDaVm*`d+z=qK z>z=)N>vPQrBBMapZ9PX%l%(mobJRPrhG4BFGtcbzl!4xY zydHpeN?1=2&54>QUS5HCFLZD0`nvHH0yF9!kE%HVdI`njoF-E82*D)Gc*NM=y=tMw` z05M8yU(vb{U6dNa0aO7V5hg>Hh~m9Ao>^N4i~<;1Ojttqxf>RaBl$u|g#}7_$ceoo zQL5yD?kfwltn@&=7S5K1jO)*!$^g6hSxK=4MlNjGCqezA$V@+=6BRBH#je42uQS^_ z2tz=%yMLn>Y*+|8f!R~fX8t?4;&fHSakRlSpYQNN*Q^@A8tc1pXBX@$R2n-2q^$j7 z0Nt^^TH)Wtc(irC!XZ;%3(p8O)3K{GhAvOiK^LXT^hgkB^B;3TyFd~Tw9A)8wX&*D zCv#6C$5gLp^8Hh(d=%9orX$8??*=SdUoK&a6KfXJ=q~?v@!AQf#BL6gt*4_kUD>lh zah_++05V-CP4OMc;Mx^q1uo}y80Wh0)yuGJt&(556+FMMK>PV}Ojjn4dV`Kr9|7fM za3?;8iI#v zL+vb0Egq~fKp{X16lGFb!!nQpVM4&wjU^dUnOjzQ7&D##z6_EKSDZk>2q|Mm cvDpsmUs4|T-E1YKJOBUy07*qoM6N<$g3kE=fdBvi literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_7.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..03d67134aacbae8d562009acb4482172150a1019 GIT binary patch literal 4722 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 LY)vbTPsRQpgF-@k literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_8.png b/assets/dolphin/external/sfw/L2_Wake_up_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9f523caceed6287320d581b76312d2036b6ad27e GIT binary patch literal 4731 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 JNdM~1{{w%hGqC^w literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L2_Wake_up_128x64/meta.txt b/assets/dolphin/external/sfw/L2_Wake_up_128x64/meta.txt new file mode 100644 index 000000000..06c710f03 --- /dev/null +++ b/assets/dolphin/external/sfw/L2_Wake_up_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 10 +Active frames: 18 +Frames order: 0 1 0 1 0 1 0 2 3 4 0 5 6 7 8 9 10 11 10 12 13 14 15 16 17 18 19 20 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_0.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3b82285e664f3f37e90a7ce4c2c965de9ddd5546 GIT binary patch literal 1442 zcmaJ>dr%a09RHyrpqLujRF1eVp`q;U>t4Hhz`c-bJRm%kXc}*C_jj8Vf?N-vMX-;kdKAzu)h>-_Q5^ z`M&nq(&FVaradqX05HQ<Yh9UmjN)jQTCK;|?HhgEV>y$V;>7kk9|YLS!h{5)(~ghvJfP!q67pe7jRBNlwjE|2zcF^OYi zDq6J#A177rF2(GM3Ne$8CPa#&FcYVPlEC;_zaZvf48_nSjcyY`n|OxhX%3sXaO6;x z{Ct_CaKarrS@0@N3-KgbTU)EEWp#>LNzxq0krYER41qL=a9vOnB1ABpm9XG|VNsPs znydt|xJALItkWzwB0C;MAmn!6G#m_1?p2?*zhH)jOrrPI23VR00uRe!-AtPI!TszQ=y%6{<=A8%r@S--ZH3F(_`@Oc(?sL(rn0BRB)Y5q>{yV)UFz6wE$+0x#W?y74YW z5)?)#!G;$Ne$FhiBEd?mpAh|eKf##=17Vg}PJpZ)Le7knh$0#9np?UkAwsPg-`*Sx zbhtTKFo>o}jgL+JPrK2`O)XvFamHdXv|V+gKMFunhs$C0L@xZk>#MetSgMnY#rl`N zvT*7>6*~%gW)59w`8zb{ZBC4ceA+ZLRCbvg-f85cx#Y%?xpvEE2ai_f zr#Rj?+B|Zu`L|iuHVt>~zfs;O}^x$1)wE!(})H9=vn(=@+t6s``UMt zD|%}|3G>~gJy%)>pRw;v-ZjVl#oX#Ha3!fC2zCFQX9B};1mCoiABI9;BfeqVQXjh?z_O(B@$}4wttkyh-t75Ry&LRX^!A=J<|*?J9=BZXT>qR0)VLk1 z{81MucAoh;4dZSyw%2gdaO+yDRo literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_1.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7af08829b8c67bb7e5625d6e367612c3077c1374 GIT binary patch literal 1478 zcmaJ>eM}Q)7;mA|`Zd1XWRB_Wn1)5K_tnzgg^HzDl#j9w%f}KGj_X^wLGQZjVGA=@ z(M0DaqR!1N*@kl@Ml#fGE{a4zaZX((&d=ZU8{Kzv__MW8S?W&6;P21uu7Dy=$}VB zQAG4u(GruBaQf|_Qe0Z6fMsKWh+S3yVm6SNKoA6CW(>f?Qx&wA7ZxHEL6JBKZ!<=kS&C*!1{uFl z=uq)^*+MRR+#Nhw(MnbIvp60M1`R>lAS6|bu1;%p)vxbLwKTaA5+~4PLJAn8aCa+SZowwH#=pIAc}W0KzasQIj?H=|mbEK@S7pU5%hk~)a8=5x9H^B22t^wRB+bbSq7;$59;wh+ zz#LG-)xeXj$UbB=#jN-g3IsvHxJe6U;?pUN6pReUm?#GGdPy^7WXu9@sX)i^o+nZ_ z)}>Ga!|+Ghu!70USOi+YXb5kW`d?*UQ}fp`rA^(5F5A({IQF&N@LzlHcWj^kz6M*@x53r9t!7f%VDIYP>Xez< zi(JFB&BY78)L$-6JCvLd-$i1Z+g^A+`8)m;aaG&8ueANzt4SqI54*!{3(38WYVcM; z>TtcQL7m<>vuKuiLpWv1puFPtTm6SF?l)?$r}QQC0_D!m;*M5b?m>O;)~Sa23~k=c z_%++|A1CaZV;w%*axgV~Eb05qmme34*;}65TOaR(G@!S4M^1s1_ z{lL-t3)Yl{PM7_B`J=pnBdzT{J)f;8YPq!KTd5~j_gI&#xpW}r>=$dvYmq-|j-!BU I%PMd959gs4Y5)KL literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_10.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef6d471df6c00a27ae6135757b3fd98337e4f84 GIT binary patch literal 1609 zcmaJ>c~BE)6kiBfbfmU+P)c=Jmtwt=-Q3xgG$h%?KnW%oDvqP=X0w5nBpZ`O0#%#A z18`8hT5YM8dg0Kb=-@TZh^QSE3srlJrHmuB*j8Im${>hJzW}lR;kdKA-}k+JzxRIc z+Hy9bMhM*Kpz)R8j3=i9xT-KvTx=%MEFzZkw z3*~0a?A0@Qtf|p33-D@9@> zhm*)6jic_sNsZ+3yq7@H!oosPp;W~Aa#1mk<0vLUB@!Xf5c-QeJQWan{7GR8B;%)j zte0mw4;->c*|`EnN_%u?DfG;8k>mZayy;vv3 zWKxA(D;68{TB%AwYH_(vu9xWzN=4Yli?FyJ;EXDr(x5eluqwS#r&1a*Osv8&rA`vY zrg{84<)N9dUl#Zs#cE%QCGp_rE8LR>Dvg-)kfDUsnyno`-3QM}{1 z)Qxm0kbp3}VKxLUcj78qN(-e9sZ&ThWlkZkqU1uALyA+3RK_s43PAxyG}JZEbx~LZ zS~IkLHWuLUY_J#)m?j?>8*^~E5scgzONPxbG&BUZ+2?*(4MCCbrIA`&pzXqEi?*JJ z$CE`58+(7;u3vA^wcL3yZ&uvJYkQ+Nk`r4#x%>6t!J+2z{7YB0?Qq`AiYi0<;;1iE zFB=10$GSy--C7$cO|5c0jCf@2A(}S-se!VN>7K5uzTVN7et$~GTLV|q5B{^ia#{87 zC*sS0iHKRayI}6crKSC=HvM5}{dn879@D2YdM1=t5~s7L-I=4`qILRzUVUkUHTPak zTetDve0b-UuS`QhSkYt@ELm^A)kQ|h$Hp~91~0cX%dUq!1i`o7wm4*#SLt2W_- zlOvjMRMZ@auw<7GLgpf@;ioeRc+~xhL8~UxR58JL;bucpG?} z*&A--qb9*^^{dh%s!?if8k3Bk!_SX_R%n#2wrKM^QSsF`%xkckV!_q}OB27(@z|{= z8~VQS){Q-KVqY|5ta@;0e+<;Wzol+(mG$wrT`ObH_RbZ}LpNUP`*qhEWWd{bul?`u z4pi4|JN{%Flra>wFe?6w2k^c@IC!m;&z;=2`$}?N&jb l;q4O_7imw4KF~ytht5O^>Z^8?#f5(EX@*SlknY2h{{TjCTkrq? literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_11.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f397eb8e756f678dcffb65395c194e23b20cc0 GIT binary patch literal 1826 zcmaJ?d05kC7*7ihs3H#C=7A#=_J~T`w53f`1$%1;by#7bvPno&DA1;+0ji?w&`nS$ zht7fXKqgZ>7~nNj6anX)$Kx>(#fwK|b0})Pn4&D@aQ@+Ao+RJ*y?KA{`+Kh^xlz-n zdb38e008jTPE+aW)j>ZpPdEB~+cQr`FQX`R95s_LQkf`;19AhAh=W=)nuP0d)G&YE z34AgDxMiE7?z^kWV@6$V8$sFw42i`HmN;~-D_7$?_FXZ8|+n~ zQp4DNq~df@ppqbQ5a#kZ7z9BejBs%SDo7L>Q7i-$KmtCGPv0%g6A%fz%qb;^fZz5*mSq6V0z@UM0>57rBdW1uz!POAgXfVbP80JCaa2P^$qs)QxY-H9Hu<%K?_w{AVI z;{d1ps;d_6x>bI?b=g87379kZn|fB|qsUyoNbg_iTp3X2r6`PcEZe6+9YAFX;c+&m zrON3WI}BXm_W2!!a&NWuz53PoF2?uUn|uSDDU+Dnu7r40&e#zl5AImxyu7s43*1*0 zt{782+cf(K6L_)Yq2F05WC(aN{3GD;oh`gmS*GW+H@@UDy7qThE6L!6+Na09&Dy(g z1gj{0hxeYprZ(<9Jzm3rx`lXvHb<((VHp864QI1aQ*$Ly_p}EHcLj#{a%cuxRxORvMp3bQ-6s+mk z{mSIIU2%?cbE=U&3tnw5@yp8BpWeS_^Bw*0(h)#Y(u;>b+yj?0cIJBxa&x4PDwUt8 zDJTmcog$l&0v6vW;xCz(V#`^F4o%M#9&;a`m-VD`{f$8~jkT$3CnyeA0?o4JUBFmN z*X1$Zwyd_bcgIoYDl`{J=_x6%Vwo0`!I$q=pLdV}O;;ZjXFMox*O$0OJxe~ltC);T xwahvg=4iVVTd1yg7NYlGl@k=@7Rh`86083$lk+8}Et4W7|8#(9UG?c}t$Ru$k znWi!*6lSA=RHvB?v?^0&R2t1xTGYnVum)wCfgmXZWj0s_uoS7V;AW*7S6V0wt&C!= zzJSE|SU&341N;tQ>Ho!Qj3UoSf|xG|rO_sExCKcFxCK8k3CzU);s}T%P#3EhuL>EOxpfw}g z$72Bwj|YqQfoT%K*bvpVFc`Vvj+}gRe}6yN&j0Rg1q8)dttLZ$sPlTQRjk5C#dY0j zl{Ut&PR%HX`We}*cznt64`xnj2|+K0NA$=-P|KL`oxQrOziiO@s_tw1`@+NVn~M{| z=Xb5TU(#!X1mMnxuHFcDQ*|i&c&gpMl+4XnJsJijn+aEC6V;?;` zL3UMrX2jteE|d1g8N=7pu+Aw9VsqZ=I8IDTz3?kqe~GFNO}v%v^RC{usXM0a@Vd`l zTeN0sa^dKA67|N{7r7w)mM*P6@Stq{Q9GJCJ+A$zJOIUXB{?@6!m@k5sk`~A+V>Bw z_~T;A*3vfqz6GD&-SADU|J90NZ5`G7FXkL7-yLl2+_wakOcllu}-XKe&F4T-`te-8@e|Vtv-NLe+!%MlzeNB(9 z5@B-1nl0CwkQ%dLPcH<|`XN>N(NmFFM^AsV2JXD@TOV<*J_V9Kcf7rGZe@F6BWGGy zRO0^KbmXU6ThiD$Ib*(^pihdsT2!A{yR&J=v}L~}RGL}@DrVD(x=SsOeysOkUdG9$^jXf*mZ`{TB>ar}mEM!{A<430 duB>9%^H8(&T*K`zTq5W#$ZEEm8ZwJ2{{_<>OVI!T literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_13.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..e43b1edb862f1f9b0385570683d28d64f80f3f73 GIT binary patch literal 1679 zcmaJ?Yfuwc6y78lsR-f|0j=x$7(kNUY@Qn)O0q<;BqBtOPRFv@?3#edhGda|f)Sbe zKr9wI6kr4ByL<0Fd%knN zbM862N74-IgJ(s|0stU5Wdokh&0g+a7bxJKgMshqxhb4YHnABD&E^p<3P`drW(rKP z6T7H%im>G8v{LZ^ASkvOO{__uswNq`nDFU{J$5ID27vgr9w$L&Q!HqvcG(;W(CD{U zAkbz>fVRo?h~BBCthNmWE-ItIU?dB&Nz4MRO$6gTYR-V2VhPY=-|cX#JqggHT{XA% ziD3wwRAI9dpea%&eHy4`TokAjOGG4sAfOTxQx*a>OKF0P1yKZ*z!GjKMG~bNm8vBe zIDJ8!LzjhCr{lV5cib)kva+mG4a0ePdEz{&m~ribB^ZXm2nwU9h|>_c^BpYV5jor| z{1$M^O}cDO*2XwMpGCsVekz=FY_e!My{1Do z0zo+(s?lh5er$@v%@Pih^82-Mey6eMYq4sriy~OYWn`G${vt@TGA!e^GENYciV-kM zPmnf;PZI4rp{amz%4OR_S#&PO4o;?6ZF>a;1VOpDB`T4eP@p0SDZ@mV9K}R5Em5K} zOi2;_Uy#O@TuIgGT=^ZPQ{1gHofa% zry+v;h=x;5yo0jiuE+-e&|A$nu^g4&*P9auIsPc) z?~9EecWK&2Zhtp!ZW-WzVmR>d*8P@%eq7gJ>ed|HOr!P9(O}l0(?9ah-$~t)=ky#c zz8F>?AyF^I#Uaj}gQ4RWmzF#M<`2m0hR*O;p>gjLi&Ayu$&hFlO&z|p`@4RM9 zlapdSJ^VcY0G{!2N)@x(m?zTBiFx(psSC))Xau-8X0@3 zC=pIHD2N1QfZ0Fkb*K2keJKo;4lnBVw6j0FeFQ$#qeMVfe}8B&)i}TUo1rgQa%bzTx`an zQKOZrlraK+k7u!1xE2AIGG_DmD2no6gohv;MuTH2Bx%gbAx(1~7L)eDMjcZZEKf<{W<5dD@k$w+`NGxcG*WSl zf*&P-g@O=~oX?L|$OV!Rr5qJSi4;Obv^d0J<5gI>T#TZKFiIRPj~U0pN|6#l#0pdt zBT+`f4s1MWqA?OD9Da3--wCYzwOFabNMJN&R8v%*qY098D4H_mPzDGQaA9acB8KZo zyX0Mag`NkjB#gQOLK9=8^w4;UrMg#8fMJA*n=j#run>g9$Au^d6(J}`tL2LkAu7f( zNfvtouX!nT&%2b7Fku)RY^1nIi%M_-&Jkz?S`MxiYB{I`6LBOO0g4dglr0+pYhf!l!S}QQvO<4D=22 z*oMDKt8U5`5A=ik*B*mdtoZ7DP;%*TOc&U(yi%m}+Vg2^KA^$C6ktWcvw7gUYfDDE z?SVSB+UJkd;h}(CWce(x^GikhZ>6V#pWWQkap&lwnHz33emyn{w>);Ku#I%O{PJC= z33RSF@#GTLqy(0}7X9(oi{_pWhI~fJ4@b04-wrmh`DH!nyH^5XNOpH;{Pgykxa(*A zDtE2f+X9`bSe>4E%kZj zo3aDp1#Y@S%bX7ksMgiIwR>9RG5^YAv)e|_MNV12QC-LKW2G*7I{dZ@Vzu?T0+Z`S zDeItO;Vi*jF$;1&x#S(6oFj_{yL>Vg@Ywn#F4ZHDf54 zM#en4R)6yE$hNNXZg1z`T|Fi@L+=H2_LuZ_t(p3h_hOICW*$p9%kNZUFDSrs`j5I+ zW!&3UCA<37M>XjWe@seKL$iH2Ug`Z#e;WH)IXE;Y{7A=U-@R3nwxlmRoqphM?Z#=v z$i+Y~^pFnn{dF+mpt`%f!>OY_KiyD&_4fINo_?cbmy6;4X+dmD+zfd~V1qB2Tj~#r zj(_jFStmP#t9VX7tgBwdxiZy1<*An~>=U$LhW5hcT5;cSrC!}?z9A4M?e_%rjZ@1G zTf&3SmMp(@Z{=n86=i$Et3#%PEuPm`UFfQyDryF9M@-HP_d1t=l|e-*JI`e7{?{FJ puQtyf3$~4hkm9KMNvx0EV8AZ*&aK-~XR`lA;-iz4-$Z2={|7Lff7Jj0 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_15.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..96b19669673d0eb6642adeb63c53d5c4546b010d GIT binary patch literal 1805 zcmaJ?dr;GM91j#K1C&z~nJ;1)ij_3!yXjG&G$07Y3RPj#Nk~)ZL7SKcDS9e0e4sbL z&F9d&`Go02M8^<(pt2zh&-VsSk@L0_)BzhRJ|-*$asJ_%OY-~uzWIK>-_Q4TDKsR^ z8SOdA699nGu`yU8x8`wAga?m%|LIYz=a!GzsAM*YGP5~2Ljqb8l}3WGRy>_dBym&j zvL-SV0C@QpV=|kpk5?0vRfIcrL=G#>p#dN?+(F|+Cdq^h zMleh&S#JP!6hneakr*Nn1Ob((h&17nG^rUULO=;35yN8cRzhN>S|U}8QSi+r;2bh0 zvpNxre&dciX#^Q8ORHfxCnragBNb6hIxI#}6hTy z(5!{BfliBf8kNmz1RUAnD6F(z|JJb0{w7yk)?f!t!(tHvTdmH}hP3T$BKbd!_iEdX zxikqUl6ESaA-Iy514qDI`abN)smQTW&toiHUGOZ7BC@Tdjg7@L0`7~*WHG6g(K>OY z6p=|4a;;b#rPE4P3QUX2Bjq}oE=s8wvGG2v7E{ThbO@r1(ndS6s%V8&t5jerl~k!z zpt2Ectj*5iHi8`SYvKG3VI!lXKZsT97!qeG#z;|FBTZn)pjgVDLD8T@Dnh_uJx*9` zPRT51g@yyhNXD|9G(|I%6&y;j+VUO>2qNL)7ONmRu8=@tLWV-9T!KPovsfvSp-KW* zr3v2PP4A>`xJx++7Y04TMoq}gsEUvhkklkKLxfpohENqQhg2phijz_qNunwN%u$4$ zUGq*Cjfl9`bZ*~{1$THmSfq`cCWafEo<&z?awEq##2cdq2M4+Bf(tiRbMxsFi)oFH z+bz3NY!?x44DCP1u046Yrp2&zkKg4vTgnTcwvaK`*7xkVHPPDy!J(_#!ud#Q)ju16 z$14MP--dY{d6GFWw?EH&UFw-7M*x?Do1c9I>|XL{%OW8##-;qxG{Cg|=(fua&+y8K zwvA;mCk6xamUI*kyc&00>XZM==e*vRg>F0fy0WURhv$3pD-T{(7ytEa{AavYMPcRa zC?Y@CJJK@9u1TPM>v!)f?k{soW&~CkXg|{T+VcDYZ;D4(|AULKAN@G?Xs#>b13cds zl$6)_h46q^hYUy=Fa)&v0cZZ@2PVzzI2zD!^M-%rwSn#{Rc)`j6NC2fyfq!qiuNvS z->^^4-+3y`)i`0^Smh}HNnj)18Gm;{LP2m%b|x?$*zxmD&%UX7!3%qphrJ$+0xBTG z4FsE3F8d~KUfXr;x_XJQ>LqBD^c2h1m_eRcZ1{SABP zMjkkSvlKYJxhZK%I&;r=5^ws%^`Qk9_<%@~2Co|1*;$mb?m8T4p57F`Mqa@4owd|( zzSZ5`80X_P8T<|78}>gGp2+ZY?Rnr4v9V#s{Vg*mydJ2Xcojgx0weuY^xC-BC1Kyq z1$t|j7M0hi3Zjo)^bZ%NpW52kcZXTe&oUg^>V2$Qa~Lqb`ufh)?xoc+La&gPDk#_& zTi{;09XFP(JsU*LsO&1z`At#;qG5HqHJ@Dd5vI1ryWBqXL-kT79xMyMPB%n+@6&v@ z@)F-I0lm^#5SQ}e&dn?nugzCBWAREeQ0nrBs=le*Kle~^;Kapl{!huVExy*Jv)eA6yV-WuJ@s$!eB8Y;_0wuP4%3gtw^BeNYr-7+;_iPtZn8g|xOiY7p7muRHGc;=ud#t~f-%gsFtRy*+NlyFK?7?jS$T zqej#e1DkB7@+M`>(liGLKMQCSY$!$2l=CY}CcnmVipfc(_kc71aNOD5_kEvze$VrJ zzIJV4!MtQingoKNWUIwk1lAyU<|Zb9_tnHk8(30BQ>j?YJ4HV&u#nEd+gaG^rYqSZ zmUh%GJHh5aP(p|+DHTg?`5K0I%ju|&JmB^MGz8`31-vv<#fq?ipf>FvYcN@32S zl`c}+Fq_xFx;RUnz!ujPlrVKw4CRpK<-$1u4KUzlMH&vcmwJ4ffL1zUR|ED@F)D>e zRKzN+bd*%7tq?Zw0t>6;IKp5U2CFDJ>!1lc>7MP=>X#K$zm3atd9{m zugLKpIBJo$^VOnO3doK|;r7~W4-I>KW4QuZLj$xI#pM|4c1J@S(e{Z&?Ef?#tL-bP z^|ELY>*K2h29(4pi-AG92-s-m3mm8mz0}Av)o#`!T8&yM_#$_34vore!1W}i zAhVS^95)$sq&nNEqm+83L18edvST(Lht=bR$!IW}R3@D{idCC+*=iF-D%FGz!xe@Y z*6Q(zw1;71emUTG3~PKMR$~xYTI7Wio?jYkfug$YuQ!5KE1;XF~v>}Z8X z12(b(SHn8Y0`G=LQmo+~Ljl7G5I3$ylyo+M;EaMoC?!E5PA9G+6qJgg)pqF^-tkE4 zM!OV9Kp5T_8x5m$Qfh`|5Yj<95yq)-B9xj|B5DUo(JZN8SxPNM0Yx<0HIH;rOaxjp zx_vkn;P7y;SPz&c0gTPI$aFmzxp9U0C8puwVX$4;*|!pc;%8fpx{^Tu&5x|YcUaO> z=ZA;I%&X}G@ter0vhrQqkW|FG_t55(e;>^K`R@9*gt-rXxKVd}eEQiJD*lNJlW6U= z?UGE{>Z7Yn;bz8_^`ctHodpR;mOr=S!-@aC-#u_(?eb1&&~PfFyeIYExXHDNk%J8; zyTp+eAKZE2deR@8WWoL{d9W(4sr{4uJ$HNd-kxHCHcVY}>f9GKr3c91@5wWKyqXt zhj&g``0S5ypM`2A71e2b__X>>Y2=sF-z?}pHUa;p*KeD->Hfw3Hs6eQ7g$=GyHcC%H#%BY z>|6Z$oDbg9Z?EalboaetsSKZr+imOYWH$FNpVo3eFb-zRrd`C>zoefOe8aW&@QOj% zxtqihuT}q zhiM#Ih^(DTCF))lgr~`IRmvykq|9zizEtoKohww!P)_ zoYc_Fl%(4OyAy{N3H0J#e^n&X+wXF2w7v)_HH1W!7!8oX6YkX_IdN42g>$aK-j9=+1LjM6l CQA6wi literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_17.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..49aa979d745313982d58025ced17c4219ed36138 GIT binary patch literal 1560 zcmaJ>c~BE)6kkk4M7+j&!ldgmSQIw9o6WUbgCv_oqC{v26{b#cv%7&9vKx~X0=1ra zqIk4ZwX|qwI@TGF!ReqKv5Hpg_=ipvr>#~Qnc~rU;5}9==@%f@KOA><_xrxL@AuyC zUAwMu&dlM-lae6_8t%xmy1=>&Jh@2<@V=h3$qAN;vaLielDu*?8xkNhFL?ym5n#&& zm%#Eh3(pACAxN>p=Pr>;ocS~-1=MUzM;!?S0UCm)&xizB&M(NYM=1A+CZwnJI0E~4 z6Eaul#GOG#sPN_0hJ>QpIc~1j&rv)wBL|)yp@D&bAhU2JP$`D#hzaSlOM`t(j3IEJ zitINb{iI5qg)k$91lXV^P!7j&*g&ZTp4E6rFUw`a8eBtQ1h@?-VW2f6O;GT_g#d>k z-b=fz_5pX`WI`%rIY?tzb#=A6np8`na*UuT3d1#+MuP$kG+ZOfYy=g<>2V8IAkrv4&1d#2IA`o;sUl|s|1GxfO!y;@DBh)w+2*g6`(+Wo!n0+{T-*7Ohpo=nQs)&1{chEsWh_(c0~L3!%5$twbE_ z5W_Mnazfm%5BMFx+TMz#nUKKBQphbymGLGhtdL|WTpqzyd}tu`u6li$NPYWGu}W9*F~5HceB?$1Zg)@IpNUqQR}CVodDg7tf-IlJ-H75rRx zT}s-atz2%^(BhQ=m+d+;BsF(sY0tEs9=&2;`iHvHt9EqVADJeO`}olZge%e)`TV^+_mCxuzp?9{huCY1OvY)opU))kDM((HYTl? zd32T8le+0~(zBj2_j+y4^VFT#`Ppl^J4j_wSvq{Lw<&r{ zb-xR)?OK(8L$`5$`;((vE?j{2{qo7`B^Prh+&g$h6n<-%kbJBb9ow#YdHb7rPnF$M zmS6qsz~^5a&!~KuH<5WiX>s&H4z=yrj3q1U{_*b~zkF)**7iG0+blMtb?Bwcx;%IX mesgvHhPv*JCBMHMJs(n}4LZ}juem7puXfnxSPxj{ulNsC?K+$Q literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_18.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..7739e294ac6ec6d9d6daebb993b38f8c2e693474 GIT binary patch literal 1492 zcmaJ>eQeZZ81ER6-ExEBrhI6ibQ4Fk*RQ+lweDcI`(Ov$Ty6&roUpEaZ!7GsrR})e zLY8BIY%0zP5fn_w$TY|Vf(}2B@G&9IXfU7{QA2<%0mS)%AJc*7d)p5AgV3~n-}mYB zd!FC()%J?=1v%L>vJnKy@t1jma81CcBr6lX2eLW>aG7p+tBgt|Y{Uc&ATCL%1*ktF z)PW!nq^33fpcp|iTjfxdQ59Isi%P^Iq;xFthzijNQanGd3gT*DptYb*jykcQj~v5L zS#n}e+X7@jb%T1jtXTt<&E+And9}z%*!+2Dah!(+BES&Pc%&h!^KmCOVwZ>el$gNK z5fx*#6B{K}6{tYniUv^DLg6Awk|@hrfF#hhOjr<~KxvYu2nyaTPO&`A@DzuRT^Mwz zNnt+d@r}8ICnr{K7%EQ?u~^I!V=RhRM^GHc5hP8}G!8Xzy(wx4aXhLQq%C-WE^4xB z$VwDVSrlrOM#G6gvZGN%)Ii{l;ix{AE0{GRE~o@$A&E#N721flZUn*qH14UbhniGC z1c9zJY9cI2xF8LN>ASz9lpp2~ zQIyy1VjOmli?fy5+*Y@jwWn>|3tQ?SefCn?$9i495iDtC-JF&4xx6e%mwMA!e^fVw zs0h-2W$1Sd>%A|QcWXc}6fLAE4e2JRs8-RcJI|576Yb zK=Nry1RY5+FW-X#NzyQG%7NPiJB?GKmBTq3&EerN#nM)e6$M8vHinn(O5JFeLJ15* zO|#)eTbOf*jEFN56UN1`HH>o(!G=2|h7$l|1%Pv41f)o$y5_DfN{e7?rnYy+0v_%R z7Kp-W(%{(a0o`UeauX{ShrG#T5^k5AJlBFC8Rz{TS15kr#%n)L+CXM)8a|p_L{K|l zedv+kj`n5A>yFKRU+?ct_Rs$%Ki)F5&sw?nH~m1e|Mbi<&>upYv$huFK#2ajfrDJCYgB z$$Z_LFj0Fg=A8u@`NhkHtu;NulO&B*th%{#s{akC9f*u7!O>B)Tl!o!Fu{?FMP(UO$?Eg{18?s8yzhs<6Q-r~%VKhE%Z_J+7lT))=k`kvWPSNDn_HP*6%I%>@Tfp{SUt87d`+0 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_2.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c36e54b2fa31dfe36c236ecb570729dbe8a0d267 GIT binary patch literal 1472 zcmaJ>eNYr-7~hj9AZ^OZveLF?D420?zwT>yIN`XxlN&i;0F$PY_IBTu3-%w3^@;uZNN;))89m9VUZXr{qI0}9Xu)KDrz5zcU8lXf|{j)@5j zom9~)oY)kpQhy=pRyBay%@i(@B#GKtGmr#2z{rBQ0HsNqA}BcQIA!N(hND zO_I4H-aG9M?wnY;u7^2-sI9Fv*D_{RTTW0c%Mv6_&@>J;@JL-q7YsZUNsU|JK}6Jo zVLhmZ(3nLbpjPWn43eFSLJ9l*Hw}j()476KBMc!-P-c=)lvrq!+7Z17{7>Vy+L4mF zFd&LRM6K3DcqMXb91PQUXGbwb$c8J>g7991N?sMK6%f*Wyc2^bW+^CfcCVYtVMq&O zv$`nC<90C)8}DMRIaasD?Xlb9Hg1Qtxos5GC+!}WH->dsToj+fdvbCdHpXSQ#<9Lo zL>EFLi2Dsfzf)Md_l{W3tpPz-wGvgWj2A&+xvHy?ay5+7jG08!{el<_#UvTA8=4B3 z2U@TONM21<(8&~Y!P`(ENgBpYIdH3Bqj5^KusCa_SzMMWJ8fa@qTmQ%(|GBY)J;_> zl)x~;aWg_$9*}UqD{a3`^w+?4nPE@czjgAcB z*qemE?}cNT$)^VNfB$Up)h|L4nMI}pv$H+l7iJeD_qFg18A#POVkEIMG5SD5w|Qvj zK!Oovq}3bK9_buDhd1v{T-TFs`l@ej-SM_dFZ1(KK5E>zWAm@&BW=|tIWfIs!?#K6 z^HPz6Z&*eu)uWfJhvs{qIr*u1<k>fG0XvX|NI`0z-IF<$o2d(RJCew?Xaxuq;Qd-Q$p?wPBeYs^hUT7PGjbvNI2 z0pEHt?+`meM}Q)7(YHHl_?IF&1l4&rwc6E^}Z#XD87ZD*NR*clX95!oYC6p#_3GaSXDvlj*( zs-mAOcerNV!IK3GXqv(iL^K-JM;X1W)({lSvII#JG>tkt@*-=svvf;L<608ef>yU-I5D04}4hsgq=tW87j4nH6W5`0L z$Y7-?r`^h!iX2wfU^CbY?M`D+%Er7{nld<@Bx`h9T}iBsrWupVZgd&!CWp=8N?}XF z5seQEAmvv|`kld=o`~h_D&RF)^~!Q>stG&+S(76HSwU$=Pof2GUXa2`$&1Mf%>?WK zs`MrhU8)>Hr&G*H^H3m38pchTa06dNr5mPa9h!LWjBJPoh@-#y|L?e-`ml;m()4gsnPr1 zt6jNEmA1woHa+OnOpG3=+O_rd^agcWH53^=QEoN7Ddw>W~BE0^%pKq01PSHvYoXbyWH>scRfA2+WX6C z;ZOEaE^_$UA^P^>-_EOF+kD@qmu|S}TQ;?3DF04FvuudIPZt)uA-lryar3E(anYf(UdVDljx$)@W!mZ!kY;PFeyZ`$p@~2bY)i)T>(Q}VE{P1Ld mj%~Lt_FOz-y^!%B*N2?=EM2YG{9|VFZ(8CkbDXmI8vg^(c@A;_ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_4.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2c096689a8a945696d57da9e0f3ada1f10cb5b16 GIT binary patch literal 1513 zcmaJ>Yi!e26gH(mno&SQtbky+X0X9<{7T~3G^I(LG!ae7LIx3&*c`{9fhIP#OHv>O zK^f1M@`Hk4(gtgV&;}EO!gz=x*cfP=3abRwV5}6z8&Ntj7-DocZNvD1um4bs~@e0ASl=4=KNq@4!$B?e=z>3+vo+;D9stvW=at)!7CzU3risp_Qd#k zqF?00l?%^`1rXGKMKlo9g5DBVkYWZttz$^WWPpaCf@w*a7Z!*b91`b6<5uLs(PjjW zhONkKlNa~O4zVoiUaW{S7ncTv#R~)`j7%$p3z94_5EC^XPR7dPDx0(-J$6~JPKz-F z?orVeSdm^*L9Y*XNQwy41_Bju9EWMfAclD|L`8UE3QXc8ff3-PQG#YkiX|Ah??He= zB^+V>oU6|r*jbS>O_Ny+OC%D81Z9wvc^JVk42F{!NuodlRV(8fpG4#8_>2WkR0Sm} zYf&iVVK}b#Gx+mm{>C}ScSG!h|b(#X&PZwVoN`0z`q>#b5C z0b$4)HmqQZFcyIlP%2DCP$6QBpp1n#p_VYk@FHatMaF_)fFhQznwP35BLbzFUcP7x zuzAr~VjOgn0@|j!bkh*fasz!O0cUr2H&}jnvb73=`rY+#wm|Z?dt1-fpMrJV;qLC% zB}cY%oZA@MKlEzj&4xWxZF>=SC3&re21E0JWe?$FOV3pfdA_oy7CW{6_vfd1>y}t* zMwNc;<|l7<{M7GQ?aAZ#t|xa^ukRe2HS%ZE;JP(XZijwgb++6YTqEVcrH>k?7nKwp z?7F+Dy%5WtKjOs7%hNB+t-o9d4VZcV%X2$672W={MQzBESAE^MZ}-(P`a{&PyQiD? z22;g#rq)%qrmSFI7w&(5_*cAV%IwIcZ%dXOoHa5vi9UWWHPM`FoOO%zHLkvHMt`i| zIN>Avqnd?z)1D4`inQsMx8)Tq{de&9#IIiV51n(FN1fQ-)RMn@c-F9~4;KyzO}KR; z@x`|KLyr!wgN_W{qubD4oIPiJj&6-HyDtCPoiXQcd{F4p$$8Dlur~9S;`RgY?7I2! z)p0pj3Tt$}i`j1acvXD#fSu)jarKeGlO6Z2G!r@R{&SLQdpzU*pfkGX4dW2&Ul&*G z*sQe79eQK>-`|W{I<~o?s%3jlhdU&%ebBn~?JWle?z;52$-VWWucAG%?K{Vu!;8qS z&hp5H&en++_E%!_Q~p7-PInci!k>FP&Q88=dscmI$!FcqnhN%DHv-xl)}xb>`c$xb pgtYheTl_EU)u-GU$z7E_68d3k|D9O=nEdq5*W)bZ_S!#L@gKt+D2M<6 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_5.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..792719974b8f9fd47ea7180e8d635612b9df10ce GIT binary patch literal 1519 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 Uat0f1lj46(m!rVmmRDN)9}k%S>;M1& literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_8.png b/assets/dolphin/external/sfw/L3_Furippa3_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e9246c0b7ef0569d13ce7cd90ad126c82351a2e4 GIT binary patch literal 1456 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 GZ1@jf+6?gk literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Furippa3_128x64/meta.txt b/assets/dolphin/external/sfw/L3_Furippa3_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/dolphin/external/sfw/L3_Furippa3_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_0.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb7de66c4f56b8ef4aa593bd7d3541b7072938f GIT binary patch literal 1611 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_10.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1e3890a7bcaa73004aa9f340d1f62736a89900aa GIT binary patch literal 1642 zcmaJ>c~BE)6yGFrNXjutJ*emsY>Sp8yV)F@NGu@w3G8ZcAC+yxx2zylRsd*m-^Lw@&Y<#b~VGIZ(2uy$wT?mOeUgmhx8N{gpA5 zmoGf~_sP^zYm_xlSDc^jp5NR6>%*Bv5%DLg_gK=ynZK&12}ie$^9lX$`eWPXpyI+Y zAaLWubTN=(zP&dBs9ltkaddO{v6y+eJIrg(G?W&hvi3>9(RkOTI5psJe4ZMOW=xHf zR-6|0=QPTC#Cfs)Tg%sXof>#Pw&Jp2WzFeYQP&JE0RP%3=(zi_uw%D%e8wR8_vSBd z)Fd?=LCn7ie(xfnz8vLsk%%eEOlm0Ky`hoy-yYBtO^QxItuX-*AM6oquWJTc!qz_Y zZxh)P4+-Xq`+>{TI+h<5Grdi_QtM+j29Ak4WMMLYq9AqqEhH&25iU1w>C0L@hZ62P z?&zEyU=A0FTiWU}K1mzDXxX_dnVPEwPvfiV3N{{i!W^EvF_7Hlxzzhd(|zh-cw76N z&g50~f5rp?mD49Ixu>6iG1(ZPP=nPG zY7wk;v=(v7SO=A&)wbH!VtgUBv_7bcS_j8bYq7qt;{&Ma28i{CkkumD$D9p57Kn8UL#dar)24H$>v6D0xQVe9G@@)z5G|Me;>I`Ulv4S;Vrx+3{wih|viee=^U{}HJgJKkh z22_|rB|J#Vs5d}r+C@Q90gjk441=U{feEw9Oq3jZ2NGgJ9L0qwE=Gj7LMT??Vrb}r zS${5zRgtMlAM(bYlyCvVI29=B^?C(fLO{FnQCu#UqnHpC3K3QVahEt4vKVo=r-UqM zD7V>Vb22vC0R=6RCfdU&VV3J)5O$|t|H81tJ(MaoX=pL&L~#Lz+U>!}2DIHwCiOp! zS8BVnOPmy%Nx5l{%gk29Iwb^Vv-f&OK}D90Vy?@^mW3?R&}NUFaxglL5@v4%7Mn#O zm55}7SgIx@G8K+%)ha?J(WvC&G_hKw)=DKI8?VBORFqE=Ytp+rpo=b$INh zl`+q1&j~t91t)7_m>p(t(aYUbR^`rI$NA=I%+!kTy}UZGm+$Aa4?oSl!A$~8<$mx< zQ`@0;LGATi?r{fvy3g;Co)uL`^)8=UlZ*34c^ZYZIJ^`pMxT)bQ+yyDCGFzn3RU#z*c;@<;EZF6HIXz43F)!+UA%u-$Ivevh7 z(!qwM4ZcSw>$u~7ujwTEZs zXTWpwE3lE8#EMl27+Y3;i^n9lCIFWdUi>W4_xW1#4`|q;`m4A3BHnC6QTf^v*Q*@` z^ZTatEXHk*ZZ7qhy@F=t?o>1?cTdg}&~&M{r1Grt&uVw`K3()KUGMq3rv4Fmy|Hzk z%^kzCI-tVK^U7*RVmWyc;CO6!@)OY5k0*nLdew9Nm~C6tUn;NMJ2Ga;`WP@Ht}bym zccNAn))sk;)PB0(pD@`<901sb=(cZXj_KqZ+sWSoljE=THQZdZu`BWYc;miSJ!t2= zY4FAFEq~aVaP^t$VMFKSD>~_x3o^d18+-hQzk2k+f@2dZ+ h2=EDM_nzlrrqTS+4*YdC4xoRu@|- z6bdZAeAyXcJ_LooFEXWascjL>NiG!|)KU3e9)O0R`B{Ds%T)<7Y!@m;w*eXM`T>DO z-hh;7Y?#es5}aaQomVKT%V)T{Do)QMS()&BKMf4H1et~Xu4=cB_8X8fyENDb#V7)g zsmN6ZWSmr~tpGMjUIEsra3zOf7_8H)?3jbH3wmrWOkf0#;slColmt!_8XDKY6AuFX zd3gt2XwIGR22KXVDa#%jMQdwoRkfr_@>Zg_Uavq>rsR0FTB*15Y9))?d6wicN>A_z3Mit%u6e49LL$(b z!R?c&0EZ`YCAh&bdBN1|y3+a)n7F8dMT}*1bQElhdoHbnps=M@vyt&%ySM%N;T|}_ zQu}!Hz|OC7hLW69-?{s+*|4>3Xi0zI@uQyjk+9Sy%LS$yT|KNM*f(=ND6>ze*7 zkEJi+fk6qrQ-5{GNj%_~nHH-KEa{5~Bm`2j+eYRFUJOJ8ny7fFWc|rw;n4Z-UxlyR zM(R^Lcb%GIdn2l5-icfLs4%DmnUmNbmA!X~Gb=tk_R#IMLk32{&nB9Thov?OWKZ(isSL!%5BHPmL&{a^h|F)7Knk*g?-ji zt9Wbfn#r#n3~wiIMh-Mhimf;bF)f2f=uP_^9qW8I(px^!DHzqKH5*d;{YNjv69)zi zr7tJ_c&PJ2;=XsYkki)4E!y4rt?^yHmIvql{-&ck^UHR{X?yGaO}W3^)1A*en`XSa z5k4oEcML1ctB_*)r1-&FG0t&q^NKiCZ|VCP&}PH3>~Eu++cN3MnBwGzH~9y9eCfw3 z%MG3DXJ3Tir5hNlBXUZEC#Em@1Z&<~2JgtXlO<5fVBT%+6{ccx^MGl1bSIrO+<3O@ z_3sv5u4!hbB`cgSj0D1PV+T4T*;=!5Q+=KzeY?D;V}B9!aq6idsJb(|Y`P=jXT?zJ uo4&&K1$Xv9KXp)ljW(2N?(WVEOMo7&ed*U;O-k@L0$DBj=JuS5hW`M3kwzi_ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_13.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e75921a2adc58f63359a7f8ae900a642554c41 GIT binary patch literal 1674 zcmaJ?Yfuwc6yAgh3hHz!2=&on8?4H}W*>Pk1PMuaSVAL)7AsXYn+-%rcG)Zts9;1Y z+R=)Sf>J;nb*MVEbZE<{SVd9PX>BdFSha$tPEmZ&+A3BCx)Edj;kYxq_ug~Qcg}ZS zv+GRh$y0)71OostB{fB#!LJ_vO_&(Ke{W3OXyljaoFR)_MBBI$f~5ehm9|h|s)NX- zGAP1YT6l(v1Au^4c5@b&WlY0K+94r)Iuf^o;n4sPH{Z<=WIn}#7An{7)QImLJ}L(7 zR*m>wxe+lkIx5eeQpQq?%F@kbSw5+@is#3Jac-P9;Gj4HbUO;1F5ImVKe3DRd!HB< zgHKere2sXVRF=^M>S&e%l@b&p5d;C1YKaB0sVtNli2*SLLtzwyQ8|R6I3~wYIr#Ju z^ZrQ2*0- zp|;Ch%203y<)VvNlCOv@(hugd_i{%*MV<}*Hf!h0LKNs}vdBR>xm3MI%-=|?b}Oz_ z$W&6fQYTfYv?yxOX{9QKUaOWT%5^fGL8Sfm6gB~d9vDOCt0qvRMwC{O~D+Yl*#P^c-2 z4}TnQeJ*w5P0CC7Fc?1@TqaWyl#M_jL?uNa(khcdYKv6{5vavVNUexUjakJoPZ9QY z&2wGk7xAs>+di8L{_t$BC?`KmEI%~{W-iT7T%akWlttlhXByXGW{8CCj*Lxk3_G_pBgIIF=67jex_!jtVYqWRc*#yBiQ_r_mX9A7-YozIq zQ|ZD5)5`2E!*_0uTm%%87FGt>gHP3OIlUej=)EFbyX$+Ar@ZIE98P*3s9(7#FzE5j zneg4!?`S*Cx?4y74QkG;+#lWAH(e&%U^2JWP8JT|q@(UP?gX3>doixO;*CsN@=MW-Ov9`ecR@>IaCaOVrc}?xd z8IKa`zZ19be_-4E@~r6A zqfqkuy*F5{wjem>J#T2jk-T44pO}$S+7hw64(P=<9}FA#sVpQ1tyYhftZ0r8hj#26 ziTbto*l*$vVgIatfoOTr{$fH4*(HdZ7t|!|ALzaq3n(*c+Cg39wty86 u$*<)%Dl+4PTQ7zsk1j)8yGCy%dj!BxNXV-0K%n0DcStp)>klO6RQ?BP`e-fy literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_2.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6a239a1b69fc34ee2487214ce05396be87d8a1a9 GIT binary patch literal 1615 zcmaJ>c~BEq7=I9M>R`cXr82k#q+ZGHW^-;6CFIbcfiy+@lBZDf! zVx4%1RI$~D7&x9qR8m|*V;F|0G*Ty4s&=v(Y$77VWH^e;P+TFA;iODK;tJ%+BZmHX zrj)cB%}>0+lTPdw1V4$QRaI5eDniQfE)>^jG$3t>d`Q?L<>V>^ofvW*3c~BRTAv#B1)ih|CJhZzeiWBtsMi~gY*0HO*xCPSJXbs5 zsP?m{oegjmJPj*SnjHbd?7i4gSP`-zi+B$#3sq+1=n60E6D&rZ7~V)34@0Vyay6k) z83?6XkK-nTo=_`|dW|AqVUQb4DrLmR^RPHBlPffGEFae^!&tSEkQq!kh7)EPZd9ux zSc@+pP(GTC`1L@)Ls-K6LM&5ms-y2q!MiHr-(w7#M)tnV+3s20*mkV$?f=J-@F%)9^X+ zlJV%kz>Xc`)AQU>wIA{2jWOmym4#O-Agx9iMKn&mM{E{dd&m*wIIF%ZD{zt{-2QndkG1@^V8dNToWtBn<)Xxz}Pt9@EXMv4CEf zYTK3g&EK{6zyEdnxSkT!rM~{I4s;Z5oo~>BUhVCkHQ(k%PmFCbr{vZ}g&g9F^tDI! zr-lyW=XMR>*l&2WbJ3WBgjp$XT0N_h?lz_Ax5wqpKN#D*Z8s6>`$`&rd5rmkd#6&{ zHKCqS1xc;via#qYL{w zkoNa{ale^oEX-0}u+{vrIpM+9x)op7@3^r1PR2%UXMaVCNH{D&7?n`R$6sQq*^c>nPVQDe%4C0(tV$bqbV$LAdArm}m; zb#&I=D~EpirFMBvM)dFnMAE&ti1;r6J*7eUYJ0pAG~gY7{%}XsKX2`(w&oN|#>)Ly zuK4$@4unLRy@|)VM&7y~T{b3u1KH?mxrJoJlsv>L<4dw*`VvxS#@q(onX@`u=5?Rl n0?r)x_`yKk997%q{+N+qtUT?VEs4uUhJW!EQ=xHBeo5VbJq$&j literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_3.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8cec74395ec549931d1436a739d5ed4f7aaebe3f GIT binary patch literal 1622 zcmaJ>c}x^n7=N%(EtaD-Eoj6{M@vARopaB+bzyfAD67kI6wfldGr$&hXPF(!f{H6% zsHsP58m}4}D^+U$IMX6Ganv@u&VoBFFrY-Ttm<0Zt#mpEKH)Zf;QA`VW6 zexxuHX19Sab!60td~VH>JbO)EO&XdUL87aR}1$+F^(eR zDpHvaogh_cwjc&UL0(Uxtk&SD6BrE?vjhAYB z@~YiDZsk2frD%s0DV`Go!|c7W3&N(=(O3A2c zg~~uH)u|+DGNjUKr7=~bNK+UXgGr?f*?1Y2Bq>IrVVE>BRT;#pjWlI2kpxMnQ>0O? z3Sl!{9*K3?`H)`+^gD^AUy0QkM4pudF;5W6Lp@+A6(qq^D!37fmJ>*_nYBAyK}kxm zLK6WSdC~DH&!vlk6B$pj*6|VwHk!55c9O<;m72g9UO{23l4LPOF+szFQp58w{0Thw zLh2@(6iQ$i?hqR-!>C!lm?bbmO%s@%V;D?h;~0!3Z5&H;gjz#!C=My&!LE6si$WsU zn!)Y!sep&)bH%&hFo|$#&h{kif)n?eB|Fa)2n66Zzw>G>0O89rjj4Iwo1^=0iCsvX z;b$f`&wSrb_tG{_) ztDfzT2VEoWRajHT1GlUpJ8&@P5mMB8C4B84Sr>0*#btYE59J zWuWn3FM6giE!MKPImYtcmOJ(qKs`0nFmUUO6IfaA|1^S)*9y}lJ#TK+4FAg*6qIyU(W3sZW~m9J&TJIMYVqMCRu*p z;h#rcCH}s!`n4xg4z%AJ*^!eVuI%hc&K`;d8IQZe4hi!sS6+*XJB>YDf0|j;mVV|3 ztf#K&_=0o!MX8%s0hBs&_nAs@Wy<~d&mS#+`1TF3Z}e+_U}vmv)teX3H@6;nlJNc- z<><;DvSUM3cf`QCgr}Fo%S|#Y@iskBJ3S_xSd-8uYaR%1kL)do=mD2!7wnMzern#X n@ND^x`2jrPT+Y*xrM@tbv~K!w`oXN+;GaIzw8YqyR#f*NKJQSk literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_4.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d034b0a533f7961426d579bb00213ed0803e56a3 GIT binary patch literal 1667 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_6.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..db53a0bb41fea9c0862ba15807136063f3844e20 GIT binary patch literal 1609 zcmaJ>Yfuwc6y5;gA)w_^5p|q3T8oa!zVg^)2oSQN#1b1ZC}In4vKxpYyK%FafZ7IH ztBh@ZRIP1guv+m^>BEXfZGE;QGPI?F*1^$XsQhrs)OJd1%UIJJFxDTAJF|Q5J@jxQ@d7ji<>m*xw8PDcu$`@TaeCR^(`RL{ zi_y!Lsw}9*Yh-I&#SH?xxM88q(cpGy8CiZFoEy*q10GhS;ee->^XUS5*_d4&*hj>O z3?5Sv-Fn$Lsd9@IHu3@sYZRE=fubm^(JJhyleDv1bUuuuIEG+2f~n*7C~_Y$K^mn?yKiSIw0qKv!WI# z*5?phUeU#KaKs{Q=j%kh3~(I}!sE4A9vS9*4^st_h6HFYf+*MPL2dId1Rul}f_jE@QMZiY)lHdYmp=&ALQRiVf(M;)O;6}l?7@bC~ zBng$qNT^8zhM9~8f>cumt*TIER2oehb=1a_u!I3EEFuc=Ld>9!U`dL=jV27mh$0-L zNKF)L=6oW}IoPOQ7x0Ut6scBeOi#t?i~>uGykO(`+Gr10Yj~0O)$m>zCln~0W1$@` zE+Uy5snB@96f3w^vrLh|d*HDY>s(KuU?*q?;lKzvt07Ujl2zeyT8+_il@levL9Jz3 z5dJuxc`S9~O$sC+3~!W;PN^hm)=8sslq68OgHbBwT05hZ)0my12?iy#I3q&FXJe0iEyNP5Bwi}y zE}yNi?y8rdDX-n^2<_c>F)5h-AZyWWcm=s7X6@Yt-+0pFB==(14jno*S>Ll!EZ&~n zcI(dHOPadGl!4Jy+vN={?~?J>!HXp^sc-@*fs^6*XJ!pcf0On|YK*(3LAPn}h6Kv0 zO7A(9^w+({U%1-dOpoMg?LNbDUm1RI?R(GlWzte^cXk{-vK}oc86c;r`XCYG3QnCBXMPyNweQLUS(|%DQ%6 zIl_JEAA*jxH=oHqGxY1Gt=YnSx+jN}7W6+qaYbHx-|Dm+bU|Z&^}IZO+K*R`PS2>b zT;29z%;jrj9K6@rcQX9#)KEewYuiXi!H#RDATx2@gQcSdUm*+b9v)FF`{~@uv|AEy z%IAj0U2uQa&ks&lzS!p8bMo~ya~fLTcpDnlzx9fwytuKdX~Y?K3Ho8ik`rca)sE$o lZM}n?Vd*~3mcK4;3Y0#WaUi*Sv^(;1H=7nxpBAoY`VZU3L#_Y- literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_7.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..f2015a77d1776b3a6bf21928ba8b0df916b7b0dd GIT binary patch literal 1755 zcmaJ?c~BEq7=Iz+5kM&(94anR@l3LtJCOh(2Sy2`973@wo9qG+k`2ky1PUeMID^{a zMXU9uI98puibvI2QH!lmsMdN>)HEPe3tDSO5Gys^2w4Ac+?n0?-uJ%W_x-+WcC{`s zK7bL%000DN<|~t_)k(dvBk9z)bL2WLwS$P8_Q)IgZns8@&WFj*)x08udx3u?&2Nl1_97|k-~!&7INkP(wH(*;^s zYf<32#`(ooJf%1>)li&gkYLQ1Xei1dr3{#G5``S5e6vmJkTGA_l~Q}Jn8So#sE~Ow z<^ZV-tqxKURvZ$s5tadlVMrul>)~v%9+$v#Auh~CI0%=62v}T1$`wcv0W|n9DSuWh zTbis?4|=0cGG;DGTBIC~-EL>wd2GU(!$Bkx2?yqKxLg*c!Lk*ZNz}nI+old#P~tX& z)o3A&gcz8`%qO8<~v%Pvf=P zw$vgE&Pm2?M4{C{RU~`r5SYr|n;m%-DK^q1tC1=Tny(}bg(logYLqf2b;HJtm{cU> zi+KW(f+rNq5k#es^Ta}>Tq1}QDEJDMNH}EUby%Jpj#KmEgmH*m=*5baJg!28zz9#x zMU-OE5LRQhk*L{#5BW7xeh0CFH)5p6i;oMqEL4b~EI~HRqYgp| zj#J?e;IUUyH_)V%gbKql#74^Ji%~oqg;}te2eS+qpU;x$F+K}L^cc#+V6lXYF*y`P zj<;)G>7pSK)tcVz%c-CaFXsw3Q^RDXriPPtY$Y{u!*vO%Dv!rQZPUKH@&N!oE{#&2 z>S%4wSZk(7_#g3jJ{K8fmhf12YxeI8i($*{A4+6tW@1=x^pIx1h-L|T}6b*Hi z`fVb120HP+GfSE#(!*V}vz(GuWvZ%4d;YH5;e*NOLB~_pSIc~V7LDy4^L5{ezSww7 z(O!&p$6w!d;mJ6Df}I8}doX_2ZcTKFwp|PKjDvj^RTgb#`8;4XWzagnuyYc?zO#5( zv)|JYFb4!?Zs@lkWGsI)o_2bh``@MDOWjA?`dr5v7N3UbPS@%v!TA8N@+9krDUGqT z{OOz#!J`?nhn89TKA6M`R(R>-Nd}om6f2tBaF~g z2GX`jl8yHy{GYCb?H&Op$N13q#(eYr!6gw1$G6UfYO~bCtpP39vnIejtbm&f&ixwE zx~1yz_AeME)xG?+&6DOt`-aQg6?dWox4&~wxICw+x+gQxn5!_if+YTyb+y!g!g6_&($Fd80Uf)|; ZpmuW5!+&}%Zub6eG^#}9S8-Y8{{f+jhG_r* literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_8.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..39b8d5f8f57d1bdc48e5c4a35ccd6ff8c51e67a2 GIT binary patch literal 1754 zcmaJ?Yfuwc6utohh$4)rJk=%QtGdZ!>Zh+Bzs|aj+v$?SNusDubw?SP`{QrCO_imTm;BKOA>v_uhN%`Of*yYqnII zu+ZBp$O{1At&UUa*tLLtqdZ;N?>)~g8g>a}Vp5rf zsz!1?0Ir2pQYw?GiN_7JiBC9n_zshWMFTKD(qSPC*(3w$$qdRI!FybDjt5c32wsX< zgJ>*DGLwqSvyw~m5|Rvg*#^0h7r6kM@4#6DCXyi_hiRqRhC3p7ukGUO-YFLFpw}u) zb_8#jRH{Y`DQPPSN%<&jKoA6y%K3UEU8X1H$UI1h2vGql6rf^Qh~h#qj*6j?hsXM} z8q;x|Dt5#hdy3#?GK>Wm2<&z{-;VKVYlZ-o%jE(@C=d!^Rs*)>ni;|Yn{CraEvQJF z!Ae;eiZ(+|i-exeVIp`e*Wn;c7LDeOVY6){Rcz7(4#FZp`G~+|az^%A+s5d~|7pBa z+m@7TAq6_pM(0=!Y(>(ikAm6kz2A{jk!6D?S}C?H#7Y%y$T5*-My-nAu{V4pWyGZt zkqi?{m6$}PK+zbb0+UHp3b{C1tQ09@q>@n^@4{jVBsvz0Rz#x;i4!YRVM1jLilA7m z5LL;fqgb`s#t>!$IqH{U{f=Pe@5SOuD@ic4HHoHIj`n~ylV)gJCT)R)7$1RVYX}2n zc1q?rD>NLiinLOzNn@;)HbJjbj8pHRpvMRUWD<1V3ij}3u1GUGOjdSkJh&wt?8Lci*9v^w9vv+Lz*@b40kAK1A+ccb9uG_dci?=%m`qAiIPFV?$R{wxnJ_mh4!QF^d@ zTzX6K+=Kwif8ndLaIeUA*JiZllb>G>)|`ikYCo6K$7s{z`ziN&SJ#Z4Q1l!ObPo8n z_1^9Cz_*D@@0L{f7k33GiA!@IgUHRBYQ= zU#=GX9lDnr6&Lfw6b!UCQd|bIHoQ93`AoEcs&7iUoEDtLDFF|5HPn<;bG9Cvh7Il* zH*v)rUpTLv+q|eNp=h}@*=1`UC;q@IiQB>`ZtBDX0Ul@9IxZi-dB`Iw+&-pur^EnW zT}-Q>vh*HX%Mavu%P#&f6BM-cXsD{Xu250KAGcgH3w}-RE^S@T>*?5*Q;;;&8miu; z1tC|0c8BzLJ&GEf)E^SI3_~MNy9G@t)Nd)iVQypKeG|OCuT1o{ zZ4QPmmHPS&+Eb-#KmdFwFy^b9H8vFpCfhm}`CNQZDDl)**JeZ~bUj-#weR!ro11Em z`WM%I4I(&O)3~Q|Gp_Ib_%K&JDeKGQk=s7p-971vUVJiJ=sv@s?Y?BrA#%nq-MePp z-k{TulCObpr=H1exC3VKLJsQ;i>`H){UZmJr1x(3HHx0=d(??F`bgP#Pin`2hxU-# zf!wPvWp@g3x4(A(wjlRtUAt>lc-WD(KgyR~;ov^;2Y<=m;@Q8hIdgnjkmssvDXq#g ztNYGxF}Ap9Qg?#wnN9ci9X)q$!iI<2C!{ncyDsMKaqA4|JmG;r4Xqc7!e*?PIkxWE zi^=;>EpEKkHyggqEok93^?sVjnYXdI_e?S8AmgxA;n#~V^cQ!ffvSxs>dRf)UaT)n f*xYFBn_dfC1Nuh{S(fwqjR literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_9.png b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5e6f5ee7d9cc21490a0b7f4a481114ffd1a64f GIT binary patch literal 1706 zcmaJ?c~BE)6yFd)4kJ?z5wvAls^Hipd*m(=LJ}2fAOk_8RhrFa0|Ana$pV1_2HF7` zoffUOo*iU77(3Wj#nPc_O07qsD&kbdqqX&_Rnbxvsx;jIvHinwcXq$;d;5Ox{oXa( zq|Khs35yQ{0DzOZK$Xj^Zsti3VKeU=As=d(C5~3>={(9zSKtm3P?#tq31(XHLNb@c zO_eK7lBoc|uCwU$v|h7NMo?BB?$hD9tab(s0I6v%J5H34G-xCXEjBqc*mVQ~Ehag% zSg3(Db|qP4Sy1I5^Qy9SL{$kPH9=`}!Bm%wF<>QW9CTSrZBCg>4vpEBF?*kw4}oJU zbcq}qC#BbDK_%rNK`{^E5-<#dVkyrEnY1~GTe!mvR?*vxxQmjnrAaR;<=qRex-vinril&@JlpRDd9t@^vaKd8q zNoM;hG#;>ubXdws(>w=d1;v%G+U5yJ_LKrk*TmcU#ADMY!r2*J5RGmJ3@k(4Bv z@W=6{|D|rcNf`+fhTYFbCJ;z)(u~7gSc1V^!XyxIrACv0iz7x8j+tPI6g5G7h9ckB zHUH}(zldo~-}d=bFo)-JMcSBQaxhb~wJ)-QnYdu>LY>;{^)lQ1?*3W;2x!k#DRi!Z zyZY6(-{8qfUhnRR3&t%~!%HSjo5E=@T9>Zgm6A2(Ht&mfar@wKch!1vcj0HPLpQe# zPw%N^JqZ8BcSiu8l_xzHI}XCJwe|}}gmYxzhsnKV0WingRWhP(Y!n0QALOV`D(bHl zhYi?5n=Yj+2q*~DLeF6Bx2e@FiS^SfKTRkdCA(5C2_MRXV)~Z@(G5*mS~c*_N1dFO z;%|;N&It%lkL?Uh{{#y-!8#FE!BVkk;K0nQL2iTk&-+0@;$f&|a8~CZ?6$6lyJm}u zF2(JAdqpttV^gZ|=p+EWd3IPHm*Q?$ox6+2xXYm@NLvk&%$gmZKaf~kmK~J1@p<_&Dbl zeDCX#p|kr&EoBkz&F$^V?AU3m?5$b%zM}iB;H9`Q^I7B2R(fA%J6mVds6mOLh4w)yQfdTuiq2TRswg_`{QTi*YzCk^Gx$> zoR1dQp~(qseJ|eYZHl;ltMx|S2Kmgz!5^qsg#xEo%M9TB=54E!XU+7qy}EpEZ=Rvp zru(UylRk*w4RzNfJV-j8uHDMk$0S}pGsU^+_dA=;1Fq@7U!4c_QxoJ#8UGxO#Ke2N bqfrLn%e<(hX6udDe1DHjb+&46hN1pnA>wj5 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/meta.txt b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/meta.txt new file mode 100644 index 000000000..1d415b4b8 --- /dev/null +++ b/assets/dolphin/external/sfw/L3_Hijack_radio_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 8 +Frames order: 0 1 2 3 4 5 4 6 7 8 9 10 11 12 11 13 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_0.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c85bb77c410abb3e8b29008bfe585c29516f726c GIT binary patch literal 1687 zcmaJ?c~BE)6yFf#QVy+C3kAC_T1)9>&m5Z)t|Va82oo|&FJ+T#AVRVsSx8{&7`y{g zV{093hbbP|p;pv-pry)Dt#kzKF;cZ+si5^}6^m9YI&_1?`iJAr?0(<(zW00Y_pVuQ z&it&1@Yrww03tNARXTq4@UJ9P$bV%{dIP`2aOylRmo;-P+Q9(nCf2}!8Y^AE=os2m zUh+MY3;@Da7JVL74ROJoLIA|5)u#_>TOb2TPN7F2~Jc|M@Wf-YU24g0YfJq5S!W4zmFo7DxVgp9Hls8#y5+2(uU?V5y9h!Wc%HVTxu@SWKFv7-cq_#4;m<@Dve$=RDO( z0TJJx{_T^=;15q`i?Q(o<=`i$zoY7Xe(HjA=IPb^Ix;fSaPG5S00`QoQKjqM=a1Fa z*ovl4T+uz;dgn|}ho((ZS@!kE60J4s=tr_;^?xmPkE~rE9@6>C>9Dg$W0wGrx&||a z2ea=5dt3WoX z;1(H6u%Whb(YdnwXR7yuJhY{!du1fJskWi>I<>01uHyBSak6`9-llTkVLWii z@pD(o>YStbASehJDQMWBI&hu(p z)7o9YRw`rHfg?S?f3Z5&^A_aTeRH2e)b&C{=Bjh6uSFTHl`VQuFqzRaK8j>y?C^p}E@czEb`MtoyOWl#*qb zmUlHs*)!Y_z0J2Fz4*4Iq%mjs=0r1_u}r@!L;6lsPWalljpkF%be>JV3@wEXBjW~>5rCO@od_Cc+R(uyc^UF zuW*JZd1-Vf5=Yfv5|p`Y_w56~__XA`=B@VA8-(Xm1;N0DswtNeRl42&Uxh|JU)7Y6 Gzx+Q_EN*xJ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_1.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dedff602416aedff47635b5ad14871cab7575e36 GIT binary patch literal 1700 zcmaJ?Yfuwc6y6XJ1#!etB+B5rFg`kNvb)KWWKHCe1kFH@hB%;A>n7QR6!Yk2g#=`b z)-u9?fP=+4R7HHXwkV?&)T*&ywboJ}?NlrxRkYNKT3bMKID%-LopQbYM({zUX9D~#d#V-P7E`l{+r5F-)S=ZW}gi8*M*d^G#Pb`4I z5fvs!4vmt^(xih5J57ONJ_;KU1OdfTz8*12^pq4?0AdJ+3Q$ad;xL917*3!#IQBrS zKiX&_w94c$Z|q49WiyO}5D4<}^7wf|zMVD;P^nZZKrjJ@!K?=CblVux1>2l4ehW&< zX`n3*#$vaDK8vK@zK)SYEZ5N>tPYLlm0_E6ELCjM1TNAcK>3KkYV}1nqU~g~)PFSI zsO{9b9h5*zIqmCc16vVOj33Nq@Bbb76j?UJQrg0ng3drA@+uEv=|AA z2sao-aR^MAgc4XJ5}ROBZ<4}sdZQE|@9lOb&e%J194`X0lI{ufIqXo_U)w9al{>+gf~Y&&CjX4@SgCgfw_ zJPm2E*nE=tzAB9dt)ys6E@e!n?N)Fk&4lF*6yh*3MTsR67&VH7uqaL>f~8W7goTJ6 z$MvX)m5QJ-yz#a4jW#MPVZ(6v*$_fpC^X@y5Ee^BVi-k5CRj>R2#kx2VpM7}8F7gL z60j5nzRr2All&sKJ$>6(lffQd%@$>22a0AVXSO^3EIW1M(o=ORb{!rb-ru(SHUI?F zsg;R3*R7Tv#kK%+qVnSK@Qq~`ih9v|lF%uKR6U#SPB*U)I7=TLvZl7n83x8?peLXS7P>oQ2lr``VdY!hw>HlQemJ%~>aZ-Wr1Hz?rbjzd&mAdA zEjbhOd|#9qXe&Kw{e1KJl}l%Ao9$gu#RVgd>!KRq$mSxWA-+%rFq)qFxjJAG_k3pm zyCALmhPmjIg_)}c_#V6Gq4MnB2=l4~w|N6ofonkt^Ou*+o6MPbQM&&U!Zj9OI+@?w=UTHXJK^S? zfWHIj73Hf!^szOZtb)3hTeXh>bCh}(RHU_R>>ZDvTHk);BoTc%+*7+ayL}24F{e+_ z$g8e__SKYPig=Ezu_NZMKV#|Uq~J)bqgq*-s3aN&erefO+xHXiO2<~v)U@|Z1=RR* z!W|^{LHGw#o+qet11oF|34>J+`re)ttnj?kzeST6{!FrS;ES62*6@Uh`)*Wz%Dr0n z5O${z@0NN!2in59Gn4MeR4)vkQ~}Vv;*Br9uH?>%UX%A**sQHldw?x---`|DkCJ+a b0waM78B>4O7C#yE{WsLAG-Z9#noa)#m>PJ? literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_10.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1a53ab75d5114b56cfad205e3bca9502735a84b2 GIT binary patch literal 1640 zcmaJ>Yfuwc6uu-V%A zWND_f=p>r}fV9G4$riFrv$ZzfDWm;5GOyDmq5()q^tx!ZZ@kd!(uC2Y9kpqaVC`D)rtn3tUyCvXCdd&dUf!iU9GtHi%}RF zR1ucy;2~1kCNpH<-7KV*;fM{xFi1_xte9P6Wl1a^l4Eil#pNijMC7iYM5m5v2lyU;?ML5r-fCY;6 z*xU}6;NUsPZ;`h0#exnNxef*4beT-g40E30REbGLy|fF(Wf7gG z?Xi@)STvLM@WpPMSP}cA09ef4|2y(4ifpuRyB%U#=t7FO6+2l@Fj6{Lypb^uMynx| zHil4P2y0hp5Q0$K5!z}e5tWr8l?037G)4#Pyavxw7|P9JYN{-19Jf{@SXzR1<4gMIW)~g z+Z>!<@}|E^LqSul+p&ygQr)~08ceg+@d64exte9w8V!OogaRQ{1c8vGoJJIwRjIV% zgeWE8VLbC(`i2@+l!#%t0&KJjr9xp>;tE8qA=C(t6Ly58SqxDUj2b8Hc1EeO!Kg?P z^>@y5ofHs>?djh>n+);rY_?cV94NOqIaM{kYs9G=X`XFK5!Zo%f%*%zmjICD8>wWA zxBKX(Fm5dtPW||>MVK2jaoGU4G?Bx@`2Aw5pz|b-M7F*88U& zt-c5SAML8u+MFp-fHXm5`Kx|PYGu8udR?Kb?mQ!>;2c*V=kIq9kMrn|np@ye=ME4C4{ zvcu!aC5hv&gUc(D&)G6MQ<7mxZ1JWoJ!1{wzA5j=JE!0GNu!IpTPJ6HxMTW~Bb!~S zV`PqRE_pD*JpV*67&i|xg)GdKovm1Ps^X|*a%4+LQqDOlh$^3!{!K}!>-9U0=Q}HB zfMea?MPa87#jUxk$NPU?2p%rD_|6{aR$PChwZ3wFQ^V;4sr82|t8-KDpmE&wUBOq7 z+;ul)jlZ0GGA5`n&ewTUedh488c9-jLDQHZ{n?8BZS7OW_xD|j%Hy}3m?@3!4{o?r zwes;H@NRt9BV*WxUEt%ki57*mDRU)X7xQ%+jZTy_H=~R(2HuD4@NFWYYP|mpI^H?w8?(At37(}XJHdQxz==M zafr9KDJE&(Td}8a8GPAwqX%rht5smb*3QfKwoAT9YwYa_0SR-SzHzJyNCAC)EL1si R?>+y&-(K0fJPPvp~e)V2Yp# zGHg}ZS(pfb{|0-WSu`87bym)SFNE{$fv_%dsejobE}uU8PcNs4j1I%)3};|gS4 zMJ!2DOpr1gbC7gSfQT9+Q7b_Zh+2zT2%E+NwM0CkB$OmhDsfVUDoLGEr6X0y~u}0N=h2;W_X;$2;AZDMmDbP5>4=b8qd^r zK;MT5Urai%p9rSXix!h6KqFjL*)q@MOB4N}$r{G%{5~k{Rh5J*7;~APJJn zRFZm)+J`kbT_WSOLZ5HD7a${YLLSGJ`uZTJm=ifyF~=iH3R5BrjEvRp z^h)BqRhkG|4+VP#WHSZMfsChFXMYBT1f?26wMK)IEKQ+w0!^b@t&%}0!lF`HNLrH8 zib*{CRQe_wRgy?y@IE#=N<~pN6-l9L4Xs8=lD45*1`?=>X4RzDW@A+vs{)rO;@-}A zs*`*osXe{hCzBx^p3D|>N&_WGlXLg*>QAJpljmgTWk~DT*x11@Gt2F3S^W6QN zyEhB#iQs_zu`$oy5B*BtXrW?Yaer5E!9Z1;xo-GhgEKHRtL2yZm*#Gi^NFq#g_nkg zK-J#5x;0|mp#VN!75_-CLBnfuKycY zBX0&T{%LEOEo$$QUqfS36|&AnJ&|YDhtKkp87k&nyNz#a!YlM~&9U$0TY@|R``!uM zKGeIi4Dey%TRYKn!UpH|v%iNS3k@{@;0I?9@x#OLtu9^hBAmx9*o;k57BuGdg+`#13q3T6QFH!2CrBe=YjhVp6-PQ zj$N+pySwhZ%-NJ&H1Fh?yxAz9cIaW|oX`JeFGm<>Hx)!D_8n}S(w(0^dY&IFZYdrT8|9RIc8cqjabqM7l@+zcX4jp75Hi!Nd^O+X1I;%2%lQ0E`UOYVNZ-}m?Ze7~RX z>(=Kj&Weei9t{A9$;sB`ORHacm62i6SLNltla^_s-Xs zJZG(0)y<~^5VpoqXcA4vMQV%SM7f|2>T|j!Gyv)Id~VKC&Wn(lFLSsw@ZhO)Fyydm z;3C?H8{Jyo?#Qn7@CCJt3oW(f7S;;Sn+v7;)RF-wFLIF2S>f`keHwVwu3Fj$#TX2Y zs)*$pc#M?EmgT3&QC(8s8XpdB;;FB@Od&Zj3;2%;^k9HmdCv^ZEa2yi?m- zSmWlgeBLWmdMr{!Y{?<8l)d*m3Mxu$)VUsqR2Hs6Cs-<-yi3f{X<+FFwK}Y76-8UD zloCgHn?i+96k|g;vyDZRW-CimJWg;p7qas%yncD#dvl4N+EQK=BZN+}RZNl^&Pk{qJI%`|N$C`n4e z<9O>^=^JZQNg{>e4zW=yXobQ?6AFY;Q4B&5lnr4y9!F@($`Gv0W~EgY7?UVs!OnTB zlR_e?J%igflOY}6%ogvG2FfE%&Zp)Xze!W~LEfT5y|e}bfsVc%_W_XGa&(!6zPqQl zHF|!x6aSR@j}bn^U7ch~FRoY)Csr_NY>| zBqAKN*lvXRVzR+kHCbOKyvn}}w%T1ESEseh1e}~K% z+zequSKkVJn>`cAoI_vWtABegQcPhU>ylK7ZMadCI5BF`|C#ADE+W+`R zck9hef5o-t0MYp@3+Qv(HnB-EbL**B)xgi}4(9|I)*YH( G+VmgBHA?>g literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_13.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..c46dc3babf7be71b3a3f35921a861035b33582bd GIT binary patch literal 1689 zcmaJ?Yfuwc6utpOiW6EYiilH}&@w#S>?0eJtVE-PK$K7lQQ`yYCfPs+l1-C^gji9m zjzVQrT3Z!cTB%d4sG}82b*L%WinT*kpgyraa5`42=m==hrW+vEAC5b-d+$B>eCK@U zHCvUPmCg^H8VUg5t22~2+`5W;lS2ZzuhcXkCe}&WX)wpg=xIo8p$h37 znlhHZcaly4AaJc&t7CPVOwzzugp^N5=(5;2Gyo~HT{g;4OtX-lE;L)^f_q1g2_Umk zF31yWP>n5>E;47h?R2g?OKWf!8)Qbo>{(EXi{uPgXqJLpmJ+LjbjbxHc1dpU6C(m> zM1?Ju3r0!lG}%xpW2YgB5Q7aUib4{ZP>-6VdRm6gfN&JY5DZ5!F^pp*E+#QCH1-HM ze|DpZ%u%Ywym2SFponE{B!W1dPN7pIWbB0qCX>k!6i09z<}_eOxs|0{u+;}V*dNTo1lBt$TgOc1b4hEuQz)r-Y? zjNqh%U<_}3E`6ho%1O8|Y<@PRNGuYW#Fz+{NC^pyVT1{mQ8WsR38Ms)nM_8p)F41O ziiodsp6evPh-**Z_Ss}`hi9`zTe*RU#kQ*s4~} z(Yh`k+E!_8M?;j;z22^_!*M@vZEw-UTDI516+fNey>a-MYeiLhO=QRIA$|$cFy7YM z)r+35I1;(udw1od;VogF=8u;=7-vgIAFFs*S9b%&y;FrilEzn*4LuEMX`O~Qf(&Me zhnEMJZvoxcQ^t3k&G;&B92DE{bw(;qzkl$DUElQ%>*JRGb_HY%MmO^(fbZk8fFdyw zI|Nqo-C+dEYnr*;RkL0J`V;QVS_IEc;!O@P>08I;g9DYdp7nJR%JVgfjzgiV_CHc& zmWF~O;G-JJUgEvK%BG*2oF52=d*D%IAc(0#`rR&RbQynnK1M%(E)7hki-y`Mx* zXu$FT{Icd`Q|V&98g7e*l9D$Bwd)+47tSy1Tl2c-lbaEWp6-QmDga&N4uwLUXPkfS zlkRTbpd^-@xp;it%dM(fcDP_*NjTIOy%D%BeVd(k?m+x~Q&0Ra z2{2E0>FR~?S~xRv-Q^8^xes(#Vy5t>)SmvkvXS4D%R@EkRDRjhDgiY8)|$`nC#+5! z+z6gT&p%ifv8~~#Rt+T{&TkL2Oj!4gredO}@#yxf`hsIX{Cim5+F(#8yEbiE(cWuK zmG>6`L(-bgP5nGiR(0cm?4A6xXFgaE)OX`?%iej8NGLO?e8ui=D9Lf+Q(eIy^5qZ9 zbZo=B0U;+FJDpRTtI~#dG_9=v@|Efpr3F0Fq{s-{`Q{hB_0s}>t#yPq&e*Av@-i+` zx~~TtiVJPG%41@x9dQo>H+}YD%!7*Ba{=H=bJm{$wGoK-_G_JY^<9He9=X)u7R=NB z+Zo&!9^ZDgc*wo@M-d=rFMM?ed~GR@3|K&i&TPw)-yDebfa5)rV(;wPR^$6wsME5P J`{piN{U76AYVQC5 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_2.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..01f07c68df29a7319cb3d143560f99c85dd57beb GIT binary patch literal 1707 zcmaJ?Yfuwc6u!I!Q2|9!t7g`qMbu4plU*~+2;kjA*Iq}E6=kcP@JSY+Iu`bI8f(8;)& zxC&8O7ErKABh~Q}uy;wsL$YMx<2v9yM;G;M!KqUfPg5uEV!)5*1 zb$UsvTsi8EJ;}Ja3}cn>`A(;k=M?g2dk!BZ2!f9Y_yPgUYQTNcBB`PC7#Wx4`YH&sRi%1u*y0#X6`M4^i?s4l9>O=9J&}!QJD61Je;RMq zcBJQ9DSj&Dp!4inwj%oQF)*9GcRTVZvTP(Nb^}`$(j=#~d1lJOB+6x6_J*f3=pz#EIoXL7W0b zP@z(Q%Eh8FY@)@%kQOa9=G(yf9>t2^iIv3JDUzY>=`?K`>jQNz&Crfq+6oDTJOQ*o zMQRNek0jDlrB^}ADZ606gZ7KLFjK?q1#h-h$J zgJP@{o#sG-;8titZhumE}SWI zKR?*L{qlyq=`GLuHf?TiSO>dX_X!8QW^kr99tUO8rJPTz!Q6BlWKJA<5L4h@T@v^Tc>2JqRZ{^^B+a~u5s748r^%l z3{x^V0n~zjKXVQp3qCGLa&$blfdZS^T{l@}9`bT?u&Ol0+26y1cO;jrkGbcH>=e?zSPPo&$JF1kmfq$=<|J$`K-S=*Wm2WgIs&*v0D{6aPty*Q%;jF>FYM^|$ zybU~k{Ql17d(pcGUFwLQ2wRn)tGlHdgzWbDb4|mqciQ(g1s17-@qm?)@O#&Lyy+?Jv}^q;0eg6SP)4Z4cgYs*?RZl7i~p11B`j+XFW7Ec~#}C+NC}> zADi3XA5lld)Rcx4)=Y1e`px*Io{Fwa@+k~kK4AKOzcT4_?p039oa%Al_IO@>+4?IP z+xwsOD8JRoQ;u}{eIra!Lnl)^bIRvjU(_4lF9eUq=Ot8# fJAFIi-CkgF=G2C5SL>#Eejka7WcjIO*+u^WnIm@> literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_3.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..148fe46405f933f4c4afb993733866a6c4742d4a GIT binary patch literal 1680 zcmaJ?c~BE)6yFez7zU?Crdrf?T}IK`%^um1O-fKC2~Y`PAXU^_vq?5#g=Ew0rb*D& z$S6fBVy#uisiW2dJlZl<6g)--Ydyv)TC`OZ=;+ikQpKYdiY?u6SpRU`nceUE-u~Wu zzjy7f&dte)lO{+30Eo-V)a40lNVtaOuaL7|CxWTfY6Qg*9ESx2%mv*%6@cAb;)n$u z&Dp$+hi6zf7`8}RSs$;31g=9txI9MVGsA9fI8{Q@kO1XDFgc32T;a$D(Hx&g|4-wE zXwDq;&`2K5u|BU&sE8wRL|Mq*%N>P*0vnCV%Lrwmigm2b=c3(wmQD)^Z{&8yt|1Af z%}ykvFzrx~FhQssFlBY9;bf~_tt4m^qflzZ&WrR7XtDt(^~7u}O@(3lbW*3l)AbmN zDGWHKBUK~1S#FM}+%|f|HzWAg>6L~w)R6vCT}`@|rg+wCX4&GAKFBR(d6p|=Js_@- zdzaTQIgND{{EgaRg#2?AEDaSB$T zR;AL45rUL}hV|{wrEjQF1&I)bXM~MLp;RawN=yN(NJ0f;7~z1`6pg}4!mh&94u@Sy z+8{)rh=e=mxlS4p3GEr)KAQ~T@NBkdw=hs%VRAaXQpdy2YyI7{XX<>e#O=ij>68#*xgPVCR7hqVt%AD0{# zou1PoF1T-2MUofpMO@nYch$i1E@1!m)^+2W)`ESrqRH|VkWTtPWU}aPP(%2>@H3}HJ36|Au4n&0d=a)mm_hHC7?jcrZKb6L!AIG-Pdpx+K|vRwsuNB6C#*vvZp&Jv*o9;K-Fjk2hgQ5lw`EIvVb-<$4R4eA5_Vn;ZR~cSOB%n=6eWi{0z51gfeseD7TxKSx&G znB6$zVLVW`h@5DOPi^DXnQ5Nd?a^RGqqwe>NR&Le711*xh7q?$cDZkgdv~l7g*GI; zbAEJV+okWe?Ty`8KWoX#>P1BCf*Ihk!&fBw0{7CkNgWNw{w?y-eP=_a<4HhU$>B1S z^zzps16#Us_8Nl$G9UMpZL=5noOKU!A`dl-+Og}4W0p53t@){^r>|^x5+z9l{1x@{ znooE=ae({g$;zso8Gk|^@>k2G(S2q7Tq7R3QPaLTrsEZp=v?APBFNuK&$gYZ0WAB9 zB#(D@1p&<%i}OxN?=LHU`zNxpB4Z0)8?zaBItm5iAH{e73w}H`{Ex`e=jgtfZ7KZ^ D-1uoN literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_4.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d402b0dbfe4d4021bc076b83bf0098e9ec4ebe1 GIT binary patch literal 1691 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 YV`bz=*E`=i=KmEKQ!)(SFU{TlAI@}Lp#T5? literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_8.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0f681e6abbffe2f8c4bad77476392253f324f0f0 GIT binary patch literal 1645 zcmaJ?Yfuwc6uuBq6ck@niWIjCt#-<0cau%BNr^%d&^QEQf{GN8O?LArNj4^{2?!c% zZPjTjw9_(GQ7hu3wOXwY>J#dtwu<13R;vTr(m|bSrPV4`=mv=OhvUxd-h0nI-#OoT z%`VqxPaZlXeh2_ysCJ6Rz^?)Rl|~BqFX^Q!`Q=3}Babt(7S2a`7?4i0CI-?vDJx@O zD7s|s4@@cmf~EG{JT6a{r7*KjAr;gS`kihb4M6H7znd}_GaO`Mtag_YzH{IR4B2TV zJX4~>bZ#|cvrj4YFvimCTytr$Sx&=~CPJxx1#iH~a1`WsI$U0bUkUfxRq*?u7=@u; z6|Ptb_mRre=^-`iVIY|hN6Z+8K{C0}gjq-vBgax85hlV>T!i8hM1(6u5(O@S`X8A0 z=b#?G^TrNj35h@ZPyawVeadDI%ae0$M7Br04 z?6JE!JL`gi7AX@uk5j@t*S;W}Zk_IlVVAc*ReaJ=KjlVoA%;4g!N_{Gy_|vhpT;w_ zy}2cB1~o8VcAm$~SHzMO0`u8>zN4Tb&qk5svGZl292(X<&&jwrtwss+H$vJ@D@a0O zrU@yAFcvY15QNNvP$r8Uk(y|^gkUh7!l;m)XW=n1CY2Eyxe8AwaXdp!YQ!RS29Dw4 zOcAajWg)EA<>e@snF;x}^S=AB_mb3?m~+1g8lxLP!Y$k;_FCBF0P-i3ulo zDFOH6>8H}y*QmUN55pZ|qYz8PVv7V9BQlbZAvjK05IMzQh=ibJxZGl)C8QZfd5UPT zbDrv?kce;3;P%O6@P{X}#klx^^6-;W$LXZ})D6^UAC*P z2R|F^ISNH*th>GFM)oLFWjk7TuTE>uIj!!>ho+RfA4TkokBMB_I$ocsifJp`v>(!+ zxjo?Fn${k6|D8+WG$`0RS=%B2 z2?6cuZx$NCHav26Gx+n>j!^|wJL8MahF|WkJaKn(6P9tTtl(Ul4U8=u2Cg66k=d~I z0ko#!({2^;mU zPneSuxF`5%DYa$s>di3$qoY%^QPK>67DO6UYgbgIfEvq*(xN>-zn(dAR=w`{`RF~3 z_?eRrKr2&Wra`+KP*!4{exP z5Qe=quBP62I4kx7JNoGK{K427V_nWmn%n1Y3dNr^zB9}EDVnSB;TPMdc5hvN>hA3D zN3T>j-cT1-)!rQ!eljbqxOPrT%L3nQkUw^4Cmhi3=kCjY+;IM1|Bk4Di+Xt<2!@DD)E!uWp;qJisWb4B_5#Wga@wkSSKmfir V#DeNB?Tz3MK%0@R*{&*j`#(KRS^)q6 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_9.png b/assets/dolphin/external/sfw/L3_Lab_research_128x54/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..0f391b75e5977c5395829f3035b5f40916ab6bf2 GIT binary patch literal 1655 zcmaJ=c~BE)6#vqIWkjsj3!%>JL@H?6?3rr?B_yD+Tp||Kslz6_3lWly*~J9ZHc&k4 zC@98uz;^Iz8AefySSbR9wu57-N3m)LmFl!Aty0E1Y6a;Ai1iQ0o!Ncg_xAnX`@L&R zTFQcuv0-BY03oJ@#&k(~q*omzm%dtoE|Je5lY^fgJ3$H4nc7Q$6?6=77Fbm?S}2bOuq*sD_ERX zhiK*Pkk2D+<_pAFg~W9v37aE1`MG1eFj^|9Xo#D3Aea(GY&KtJ!`6bB&i+s1rPe}5 zp@T)zS%EKbTBMF}GyPzxdan-TGnCj+sZOiZ7CPU^TMBHfT{IbE71AFiV`V5Usj@Jn z8iiSo(846C;b7X#>0q^)(Wyul#b}iF`*|52GZ+aqp*O^1dM$<}7_>$LHzZ&vMkL~x zQLFJ|O?E+~?H1M_+bYE##m2u9OBtLjE%MF`p3nEsL0T>^@ZYeaGjUAzhyD7HgLl$|-G525!C}ZQYo(q>Kbf4h;<*y!!by0A5>TGU_wjzczgu z>}-d|1!g{K5hD*v(CAE; z=do+(Y+oh?`f9o>UT?MP`x9k7+qwXBW6yd|_zF+s+Mi#$mGT)EB`Z7m6zo#x40=J= z&F+A*hKhjO_X403tv3YTqkrIh_Fy7*c0xp`YPH-muC;VQD#%@&FPnV-z=@K~wudp{ zVPAui?#K@hHN*i&@ptg4sr1z4J3D$0r}6qpt*b!gAg28`qU}gv(?C>oT=%9gZpO($ zdHyO;S3EUt%5_tG{EV%;1KYSD&%3Q#22R)ga;Bp+a9vRLgx~7pd7+JS%$?x^8z)EY zI~{=5lrJicjN9Bg4ylK7cQcjcf6ux2(Z}uXmIqX z-1Ocm@9#4jYmypJ*_?=e0FG6pM0@5WJ>DLe9`fTm&#JQ1pWX@ls>}->{?M^5Otvwz zKBmGx-*&fmNz&311A*$sKS`=+PJQ#_{<$0O=dKJ`)_ri>ygS~MCq%`c9;5sb$e)#c z?-agxk0oOI3fcLpX0&xyTu|dbhmer-gOdbZ^)&U`F?Zx|-GYLr*ESmLou9};FL{n@ z-k<1_Rh_GrXI`wV>)r01wZ69auY?YB(ZGNJ@-9!?S{q*YM}s}QhYIbl{#WK%xnXHV zbEl#H%5{DjME2*TUOU&KICetDOl$e_WADQ==e-xH)#GpHywO#f7u>PG`XTM^TfVuV zw<)`wp1bdOXZ+Jj@O_P=?9xZzSX|z~j^apar`Sn0U1-jcEsm&r&~tlldGFPsEjG%ha{2rq9{%*j64>fT9Pu zxfAFQN%%P%WDnL@gUCoA{{RjA9;g8a_&t-$KPR9*JQ4Hy1K^%;(0&iZAK>;c_&t&S zuk-u^{2tHr2iNc(@$h>8f&KUY1LFV>KDd0^f)6jp3?6WAusy&-KnI`ja6tC|`@usF z^aIN<4`rD{KLGN^1LisKACNwy9RPW80rNQg1IvsLSPk(MUkEr5ctG}Nr5p%8Abj{Q z{s92|LFy?e2LRkZ$Q!)@>`oydgVYpw4g3rUK=pYTD1gQM2c-NSqf-VDOt3H@Q2)i` z1ti#n$QFO_nLJHaAo3`b_&$Nb2Z_{)Mfin-&H?@-2*8>J0H6cVI3Y7Fm;r%B=wT>M Kf&79N5r7yR#J4B_ diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_1.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_1.bm deleted file mode 100644 index 49d9e5135894c85d2339e3d8fa92c5fc4f6ade0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmV-{0e=1g0DS=fE#L@$kN5y!a0mz~0H^#1o&X-O@F4?;9y|bg$G~HN2d97@x9}MF z0qO7{i75cWPB3~%0p|yRd;#hF2aNC@qV@k6Mt%>!`P4z}zz6ZYAou_9Kf&&wNH`3E z`#A@|q($au6Dg`#r{w50Pq3+4|D&6{eJ-c1qeS;@DFeE|A7Jz@OwkS z>-z_p5JBbsvxCpR4~2;Q5@iMl%8el3;CXQY_526yFdlqhe8&Oj!UxY_o_;iWfQA7) zMH~bOJ`j3>N!~a3Fc5wq`k((GI1hk5MP;5tz!Wehk$@z^EF%Cgxss>7 diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_10.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_10.bm deleted file mode 100644 index 9f8e4fb7ed8f1b5803b8ef5eecac7cb1f6652f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmV-z0h0a!0BHdLU;F?5hl8sD{{RR*J^=OjfA8S);7@!J@Opm(>-hipFXQG1r~AeR z5%d4x;9`IQh5`>S06j;9I1;gq#2%lB86e5b4;Y8=GJ$a#kUZlP@X84U9@+ER1Mj{m zAbOvS9w3tk;blUq4<%89?j{d}dV~BBK=ywKJk7)pxOjb>1P@n9gVo-Sg9rFO%_apP zdN)WP;Qt4|03LJje}mP^VDtnSKE((A3n)GyNbv{Y|H1ZuV0qyUod(=ap3d&gU{d(P5XfT;Q1V%`<@S%0spyRQwRLu92!IgA1qbJvi~!*B Lr-#%4zkqmvm1MAU diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_11.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_11.bm deleted file mode 100644 index 38c7944ac4efc73677137956ec3861611ab226ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmV;20eJoa0D}PlUjzU1pMi?O0tdI_|N94@0uB#v_y772Kg2v-;PH=vhXMZz7y!Ni z@&AL%;UD;LU}NP6r}_uL<73rG*NQG$e@AM{Cs>P`=Z@q@-D59Ue((LRv& zN(00!O7#c$y@Bxo2gd>4p#KN>Jx0V2M`?rG01xnggUsF=a&2M5c20saqCvIEivAK-e2>Ci#^KqPz~egJwX6F!eH zdax3I{s+kbl3_## zoZ%Q?^d}fRcjyxbh`fX988Ch(%#;IybU0p58yr) z2oFJ^gV0`|z$pXRpnebNK3FI42b{zF4@vv|1f&mR0sKE8@`wZ1<{wBr5&;+=ubebr zfhf-)5P*8&-b4=+F)z>_F!}H(f1UI(C)zLg2b3E8ABg_}<}>>7l-uZ!DE`f`{&|KR@z z_&>nq@c+TX{15p6JpslKS^$5rAHXT6>--OR_&>q@4@a;+!Tt|;JP02c0D4cs>G%i2 z0YUTsRG7Uu0QG@`{2qc*2eHKg=impafj@#$uzvyQU_g1yALb7qxq$!Bc>q25u9^Z}lJtq(d2t9xO@OnTn0_OjK1P*`C_4ks@@(0iWXF&RUihMu>4^QwsyIcN0s(wn3jGPF}2tEo2AAg8GNCh7ThQ1g8 diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_15.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_15.bm deleted file mode 100644 index bff1cf3e63b00acf617e13219e0f3520795af81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+Tz0KWkMCjveQYybQTaSs4Jz7z0zd@e9RdjB`z^nichU}V65`{4BdL*U@_ z@PEJpB`_e)1N?1vzE&(}+QOPDClZN+%>IDF5g0xr_y|16A8CPs&w=dzJNzGk2aW>BCSdea3?4iWz*>OK-iF~P zp^U-i-5dlkHdp|CK?mdyxI91~fU%B)+u#pN1_Eji&juc157;;?h4yJ}2-E1Rb70`X`L&A4ziukr4swWCV~s ze}MC!@gd@}-~;3S-xzBAf%9R&LP7Np|IpwDF#rfW|G@MFh(Avz53~t@1`Gow@q@*J zVDFdG0pXZ`{L tM-T3u6#0M*{%r9EkAUKh_qm5y044JWjf@{20D54-@qh=Ue0szMpMW$J%IyFE diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_16.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_16.bm deleted file mode 100644 index d234a954f4ee7c9ed0bee2d02acc3f5e2af4a91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmV;p0Z0A;0JH%BCjwvyYybEPcMb&L9KH+x{0yIa_&tA{@OnTX_+Wbf!RdesDHy-~ z@KOH-tpNOgzycmPcw}H8^Zx_W;2t;_-2vwU{{qegK0pC*Fk{q$Pz3}IEC0jC9|xga z!RPq>i;e*pKA1epCIBcw07u9V8TsjCVE2au)8YPro09)Og9FmwKY99P0rG7?daI8A zcT)*O!SDx(Wd&B|w5E$q`ED#8&J-h()Ka9j5%<~7xykWrnpg_p0;*6K*0T=NA26#ps0zGH{fO*6c13(A2fPjMnFRlGPfCC4u&H?Z^ iqJ8{efq?_me!OvO00+PiDf#?GtbibTPvGJRAQb$zq{j#V diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_17.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_17.bm deleted file mode 100644 index 30fdc120ad021a74ff8a082646b39691bbd26d22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym-)0Js4FB*K0OZ}<2Lehu(FxEKHU89)2jKs`Sb@OlY`4lZr@Jj25SfIvaV zfd7C53}3+_fCu0YK&Z#T>=+Pv{4e05fdkAOK=FfrhoS%&B>;|K0^ni8#t#%RgNpy~ z@sCn4eK2|dKWDWd7x*4vAw4EQh$qtrmGtz#a&m*l7!OMUKtt<)ESNlx&3~VwP#%Qz z@2Zp^2+_b#!R)>;c;Fxj0|&%^0SB1_**<~6fzN^W1Mor6CvXS5RABModwc=t01DrL|Ch!d z3m|*P|Nb02G!{iO2d$3*2?w{}9*}ZcEX*FT@P86a05E`j2TUHnz_o@dHBKUe}5TlpfC>z{eJ+F01WYnI0btD_yhxp90!1ZQuv@%9_s=4 m98mtR@mLYX9qT{f0K}eP0|gK~Z~_AWC@7hvMHu{mp*QfG#m3

$53V#B1JycU^Pj0m!7Je5ih zGJ0LX{EZv{h{5K*F?ir04B`jOe*q7f7u7zY!GX_#_XFTTZ-6}j0xvtj zJ}?k+dEWu^1P_=z{0jpIj4*z8;C#X20Q?9HbRU)s1XLfM3_L_1uy*;2>HuHRc*Lv$ z5jWHj8a@aD+|TacCeXKP`9wd8o)9&~jP>&+rdOd95J;_zsvoe}ME3m_A|d z69>2W9*c(fV< tJxBt9ID$R^1O7OmJ%oklhlA99oB$yMmH-Mf;DhG?3L;pEOd!LupMY8c%9sEE diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_19.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_19.bm deleted file mode 100644 index 01492a1b431b3b9bb6440a2149d3d44373449a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym-)0Js4F9AhzW1hw=01wVxz{tjFP|NaI~=smt0@OZ)i<@|$#*ZtoQpTqwT z7dQMKpYR~a0qNlX`^N+Y5oqurAoKnPL>^zr_@sg84iI?YAb;>#ln;OpKZlNfmT|y? z&*E!f0R92xKmQAm7AMmOnMA+^cq$0^!Q~zYth^rA_%J;#3DXCh{ss?8fIZQK4`gwJ z#?B9t`XfgGkT84;$YfyiXAnGL_y|16ACL$f_#Vpifbbykzqr=D#pF=pgL!2hludK=MhLJiz7;C;&cF z;s7z31JWOV;6dTw_WT3S|KP*IL1dF4ds=V+{eza$7!QHygU%2SpaFx=_zy(MgV+2I zMhS!R0uO%>JzeJji~!5V4^r`;&jIlVt^6K;z$k;F<2Y`Q283W9UG!M`{h6flh m5)gq6fYH43Hps8B|y)^9S60o}%&xs9cBa4@h`8*+vym zdoG9`!{k*MKNCa`Y4|^Y=Kzn3PF Dk9w{C diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_20.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_20.bm deleted file mode 100644 index fadf12f2758a1a1dee3c312f7d6a02121cb09094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 463 zcmV;=0Wkgn0LuXY9CPIl1h<3!1v>}wJ`ZX5Jvblmdwe_K^Zb9{V)p-Y@8Chef9LQC zz&QaU?+2H|{|A6v1*;g9JZkG zKOj6}VE+ffeM`fDP#8W7#Bnfr|AFa%hs=TYhZq{H!RD__^HemR_x5gR^C?Gxm@9~6#@{53g!0HeVH-~-rzpW~p|5$ZrtsYn6t zFf_2hA_w&V5WLEyZ(sn1#sSV65Pl)%u{s$20ESy1fIR*Iqu>Y+f+8RQf{YF$QxK97 F0pwOj+h+g( diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_21.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_21.bm deleted file mode 100644 index ea71be67e9dd3055355b2fe819ebb34d9f16cc9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhBw0Kx$P9CP^r1hoTy0D%EV;s1k!+duyT7lY692e*U14?q0=0S*VR^WT38 z5VWI!Y*I=fL|j3>+45<@=?E4ht}RfCOG(a|fwC zLG=s|mH-}qfO#Us9wV{`+#Vngz*xsY^?!g^FcDCGAI4()AbrQwLJz9}?0*yf1K2_9 z|A0^+2=TZB>j4Bmjst=Zrup!J^8XpI40wR~FNi3-0QcX!)E^n}`7_8!fb$E9JVWG> z7yALubiW{cL99TM00=%K{wO&t!S4f~_^|NMSwVnh{s*1@#ejr^>;gCm_&;C(_g5G^ zNhS}t_&x9d^%j^u-XsrR0{p?`P!It_f%2X>2Y3oL1o{AkfPhkvAJhOa5?O=BAP;eY w1H>pr_81{ljp+vpAUu3&_6MTKd>l4=2iXXR^Mm*Rg?|DG%)v(oBBPOwW_ZrTP5=M^ diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_3.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_3.bm deleted file mode 100644 index 30b2bf584cdeea2c4a2035840419681914c9bc06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmV;90df8T0Ez(sANmFcPxt_!AcX>+03RRk{2U5i0DFcC{su3AJs|>x3zzU7k-&Px z#-$c0|%M>nC1^yMnT?S@>ifd zVfct2fFEB-eo_bc|NnvTp&s%0Vd44z^XJV0fd8-H@)HO=*hCK>&^)*R`VW{r(nI)2 z2>hrFQ3s*Oe-MA*Jgflt_+Q3^#}ItA)ruf;0Sp8le=z|A;a)}25Qx0N?A|i4gVgd* zV*?mHmm&@@0E`G;m;rJC1g=ey2b2Ilz;OqNj7MZRAbJ!=9$OSq1IYeG6OVv}5|iPA s|D)xxkAaKx69=yVvLN&5eu{(uXHobi;OHrh{BB_Rn0x?*Kr#>kK(D#FBme*a diff --git a/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_4.bm b/assets/resources/dolphin/PaxGod_TikTok_Marketing/frame_4.bm deleted file mode 100644 index 4bcbb83bb02052c171c7e836e6e96c1515d0eb71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmV;10eSub0D=Jk7xVuD1E>4|P!KtPzwq#J@B#7$PXIl@#2`PwKBwel2b>^}17ZV| zIst$KoD3|W@f?Uh!3Yl_ddI==Pf&l~!SH`jc@7L8A8>k~%is@mdjr%0C-eu?o!jXH z56C@<@DEdYA`Biwbb+tPkYM+Nz<~-6fH=GmA87*zxcH0+4r843?9I82lzk1@?Ri-mB=3|0tb@4Ab0>tJIEg&j5>&a z{qTH1K_ed=4zX@v_T%5d1H}iY^d6Xd|AM{|5P47@=mHr3076mlc-R5$0l-7ZA`f^N z2uA}C@C(jBb|86Q%LUN~oWLI{bch4*;t(YIf9K%zVTeBfg4R%aIthG00Wyd@&m=A& z0y)eccnR=5e*p75lrlgMQNf4L_;VkCK?)-W{sYXwP(q5Xgw#WFD6l+Tf)6iz4j>O- kgnWi8l1PfUfD8{Wgw6yGhy{3zP>3)-X8ZoW<~OF?kh?9*{9YgZv-h{2!G39_``>oa`UL^FN?Hui*IL1Vx@e z`S1hLj9~RJll+1H53f7}{8w859Y6l?d&~jrKLH3oKk!w%LmNCmXy(VxaNx8jU(Y Y1>iib|1KbKQFnNK<9^wS}1LQ!TzCI2tU#2KeYRs;9fxdbQCxq>fr~VegXauWU+(%9*_`!o7HS!{|BxBAKn27zsmj( zfr$g#;174R1O8wqAbCOX0QV29{2qsLj04+%58L=X;Q;mj_($!C2e1Is=0{L_d;%jt zf1n6X#|ICR9RcHiOPiSBAAov6*yO%8f`i5eM=1C`8wL+pNIgd-2M3WbV~fEEAUwa& w90UY#KhpvfN)P-8iX`S>^j!=;;13}X!GOc*{}A`jRap#kPcH^8(MA8LaK%Hcr94~0Pi zjP7ED2l`-v@Tg#XGlU2!2{qBVDd8WD0QSZM z*M1K)d4t>j4>TUkErLr{v}bm+}G_GYH@T>lnWq$RAna*n`YmAok~ygdU^zAdo*t zA`c`1p@bfb^9Rr*f$Wc1+MxmS3kRZn!RZHe5Pgis4{-T|)chd#ccdKrApZyA^g;dr z9{?C!f)DUA0w65F{|B!CUqyol+xUV04k7%5%7Ab2eY=Ps>HL2XKf(SF@P0r+3brtO zd;$IsP%#6_UJvc~Ab$X1zk}hRK>r7i^a?>^2bn}c?HC8o_#SY8dbmgUcU)jSVc`B< z2tBZX^+gCgr}zM{@B!*d5P3Ju9`F!(F^>TMPygON41nMC3^WVVY&NTvq$BqRc zdW;MnIdM6U%m5>T2aLQPGylMWTqOqwoCmK=b}X|MT(kgVYLF@Ok(F z>%hN)3Iq=?z&(5r@j*w)%nvWb3~*%T2aH4fNJtquLE|1Rh(9~$u>_h#f$BjZdw+rI z2@rm!6dp$PO%OjKVE&DR;a;$?davQYK=$|p(J&~K2f*Ng_YVhbYAj9Mj@O%yoA83OUFg@@Xu>T9}{=oQGus$H*{|EF9-k|>n_&>q% z0SEXXxD93a1JDvc{9q72!Q|F3d=dxd4>`a+N+KU0I6UJ3^+1Sxex`H81J&Xn@%@9( z7!O$ZJin@Q2eN2W1aB9>@d4@z5P2))^gx0l3mF^b|NFqf%!1L$f z(WU={gUw)J@q>wso?rn7qCEUR_<%hBfc5wQg(^oC7Ky0fAAy1xNFKlj`~%38pap!4 EJYmqPVE_OC diff --git a/assets/resources/dolphin/lvl_13/frame_11.bm b/assets/resources/dolphin/lvl_13/frame_11.bm deleted file mode 100644 index 3260eb7800723bee43a902294673a27e9cf4b2f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmV~$QA`^J007Xta#xP)6|cv&9+#3_uZ0~&Xdz&5AM?0fyKBeB_0nd*L`&1erVD0E z#>Y%H+rnyF8`3f$j;T3H*-9A;Q&<%Js7r@v;sOXiY7Ao<7n6Nx;t~^Md=CV^uUS2a z-j@ZLApqt@%P-G29+>o;s93;~Hn}pkdf|dBUkNh?;2)`-Ud#P)$o!S#*YQ^PoUZ(Q zd@SI5a>x+WQUa7;n)-3|d@Nkd-L##GGsR!kk){oZv)l&|Z0&Q&U1;@NG4io{uOb#` zj(lInIQ}X#KSHv;j9LSmb7oOvM0VvuV>ZSIWfWts1a#8M2 zg%2kha)Ujc*x7zZV zLn+}uhlo1d7KVicf0-^XadU0Hv}P*~LkKWFh{WH>KLul1w-wknyH~vDNTNKzI9Ier zIWf5fswLDb723gSbbSc;DmcV3_?d@aP)1D~(J)oW^QzQC*!cZ%#8Bk997fvhG$kga zi?nI^&0egyQ0k>!wfNgjez5BJq55qz&J~k>13jzQ-=m9j9w8p(sD3EpLH3^&wY%Fv zOCv>kS-n}0F6bTE+4?TDMTm=)9X7A;C|fu+(oL0;h^bQwXfrXBq;54cUwfUDjrr)C zwkS~#0KFbJ8sO5t%Z^LsDn|_Ym1a#5+KS@|KexF}2KKvYSg5JXxjMU2udsVx(yjl7 z)`oA#=54-`7==fvEHvY!+BJ13rPsLtbu=_9_1isi+V8S1znaw$QAz_{#Jw0Z-HA;p zX}S8{r*g@*Vj&k~=h7nc5!myva)~5t`o{VRSeX_E7NtU@$B06i zzRBwX{Cj*>9Cg}CN0*c|lxzTUeJtrEGkM8^b_Zwr1Nh`@PiWIup~$uNtXMHY8|fexiVu0#KtVS^DRmIZkGM`7H6@+rL>FfyEUoHJaJos%;IHFgRBIIy zF8gZ|DgW0Bsujj(F5C?cN-YbUlBTM3D+r*5=nqZICJz!A3m5Mk6Io{Z7y^Xofu(mo pQx5{S5)7Wop1Qs=_jmNCj(g>f$Nl0-aD8L!>iMyaXxU}Q{|D>ANS6Qr diff --git a/assets/resources/dolphin/lvl_13/frame_12.bm b/assets/resources/dolphin/lvl_13/frame_12.bm deleted file mode 100644 index 77eead7d0b48b9747b03a876e31f15010fa0ca94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894 zcmV-^1A+Vj0D1$h)oQ(11O@>EkOIqBYNOkI+iPuaQ3!}jBatWuM{TXeR;yat)Ybt& zpw=>&3M2xlYl`(n!>fx5MhR7`3<}ZJt5&+UuB<8v2n`G>1P>a9w>8w;RjYAa3<5#f z8VmvL}&q_okB1XK~aQA zN-zpUBA`kb0-!)5KM<)zA{Z`&3Lqa4VFiR>A`uIWf+!{+0S5$NP!Oo`0YeIamV`JW zF%p#k@-U#`14KMB5OF{<5DfshNFpa70YnetXebkKKm~w=9L|BDk`zhIFhZG;2uv^> z30Oel3M>M|V2~&f#6Thk8Uaj2qXB_n3`rt^Kw?2sh>T7Nh{;j_Y>q!JEf+rK14@4Y50>uP{R#XbC1|d{} zCkVbKF#r)iu@(jdwRRw@C! za*&`%z@$U-&{B;fiA4zHU^)myhJ}cLL1YqIgp#GCi8)E?B|(H#qFD$Q1i&V;!3@M+ zP)tM;kqDt`B9JNsq5LPofoLQ_@zF#eSSdsk0&_E1-~)pQ!crm_DuhsaG=r$fBCvx% z#AH-hL>7Yq1c>-(6b%+a0YZdCBrymi5&AHL;KZRYN>nF9M50h?EAOaYophKc$5fMlw5ZDw6vLKTI2wZBtUc9Tpt%)T>-a+D^ZFRd&)T?Xmiibp6 UPhp^H?OMI9>sKkN!eKB72r5T7W&i*H diff --git a/assets/resources/dolphin/lvl_13/frame_13.bm b/assets/resources/dolphin/lvl_13/frame_13.bm deleted file mode 100644 index 18694587b8ad4e5bb0d768037bd7e2b0ebf9bff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmV-(1C0Cu0B-}W)oQ&^O4=a0y;Zi`?%P{ydkFA2tQC0}D64g?ZECA%>fqoJ4Ml1J zs;zZ(LgCfLp%%HUA_b{|WICN;fc0%%SX73Q?SNo5(g`NhRd(&|s@1w|3jvjq@NH0t z4u;jO)lgs+2p&Qaw1sRS&?rSiHvrm1AQ)Iw0)ar4>nOAc7Xk$VqDUYT2n+%R0x}E+ z5dhH9F%p0%(PUHzhC-<;lwfEW3_zquVn-NG0)cA6z=b0K$iOucNCinaP)dYUXdq#g zQX&wH1`r-t2~}7yBcY(csD<$f3<53MhpG5vVYh1b!lt z01gHSHzg31#26q!05w7qZxgWsOCVW9!4^b*KoNck*svN16cR-O7Lr7ds6P`yNI;@% z5P=K`J|J>{gv7pLp#+Ws2@(vHK@>w0Hxv?(kP*Rzh(t}Hpe4$n3OFVOWJCgm0YtQ9 zQvwtd0GuFEiGzB!lz|42a~T3uWEDvyiUW`-i?E;=h*QA9A_Nd% z(4bE7eF>;wl$=%r9vgc2b| zz(gH`0fIsy3Smr)6C;F(MPP#>M~OsY6(~%KNl>CtG!Y02G)ZHi!Ux9@g26x`Fj*9U z)IH5WD!%a;IU9Fj1dAd3`9bK6oF7AP#{RkAdA5O2*_bL z9Yrb|K+xeZfZ>r21twI82G&(ztHfjxAYnO15yFD~YTdfkS5DX#xdaO#dZzVlTVB?( JZ2_S{Ab@|;EaLzG diff --git a/assets/resources/dolphin/lvl_13/frame_14.bm b/assets/resources/dolphin/lvl_13/frame_14.bm deleted file mode 100644 index 71d54910da7fe10a80e78d5c71801fe467a0f307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmV-(1C0Cu0B-}W)oQ&^O4cEIy;Zi`?%P{ycL?Y>tQ~j|D64g?ZECBi^cXfLj;w{4vRWfiW2xxE+41|&aLKlt#1yQ2V1>*p! z!Xyxk1W{N~38Z*BB#{XXM7}f%06?OWh!hYCG^!A!Vi8D&AT}{kDG)?BG6Uy5Q=~do-h{BnhJo|5Xiu^ z5Q2#r$c7>j1dbr`R6$c<0m8Kq*sz2&P=X-=!~l3esK|%{nIuUKjn*o%4GTa+A}l31 zgGVGOM%ch`ln6qka2O(LyhsqQ(F=?~%u6vDkm#3WNf>|tStJS~;Zgx4f=LVu0!0`E zq!vY@2?$(Uq;e6^$fQ7#M;sJ>lA+0!2ns+0gayV45Wpl205SvU%AiqNNYr8ypx}W= z2pbsyU_yfgkzlX|LZJwY5I7nvgrYJCko4Kc7Z^aaWf%$o9B>r~h&Xf_iUmdmf`UjQ zk^{*=FhQXs3q+}u(iBRBiSg0lf2<8|iA_GC9NN`%J zftX?tlJTSlDG^r;0t;0dizJYPAb`Mdl8gk1QZkUBz)9l}gijL$+gob3=Bm27wxgwkfJ8MD zY6h~^t<~*qU0GB^TULZXt1y^_rnhVA)pfO~trn%VfM7b%3RO$1TGsWeTDWL1b+lRp z)fB_5&0tgxch+r^6xyS{hKmm{dU@-s)f`0?`9RM^z zLrQ=|V3L6F;3ydw1S0Sz-X$FfM9{f zP~R45P(Wh{DTn}|kXVKSp(3FkiiJoB2n1JRIUvcUMJ6C|28=`!G9|&#DKJS4fYvny z$jB%Lk`D|5q(c(etwl6I(Sbl{nxIJl1_a$01_mVRAZXH}kbwx)7@~+8LHwmufw+Xm zkp+K|pr{0)fns7naYhV5)LB6|;v|WI#6b~5g1|@<#gTQ0AX39nl0L;`R7#TwY7&W5 z5(5Q*=tZP-7(uLHm=O5YG7^YJLO}f(0{CTB86-&tFdP*KK2VHALP{ShMNk4vp&E)z zvK1)|&^#mIfXIh}?-eOPFq92QbVLJyP6()I6iq~`BGViJ1fs6;Vw?hrQA`e!ptvXi z$YBc+sRe|1FbGtNkpdo=FjAwar)VHr0qDpDLP98(r}bBw=snS4V7G_@bzHAf)oQBs ZVDN}Uf*=wTVD|Rf-EQ`)t=>Q|K+(c6Oa=e| diff --git a/assets/resources/dolphin/lvl_13/frame_16.bm b/assets/resources/dolphin/lvl_13/frame_16.bm deleted file mode 100644 index 22f4a416846602a6111f7f193c7ec31ae1b2c565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmV;419toY0EGkX>VN_XT|`$`sX2Y7P@G1})vf0BYTCGL0|l*s&?>YE z4x_7T+Q^_42rdc%Qm5J>aT1WtpfyN@14|;1L?{uRRSF3Npg~|dN&%!`a1109P1=ND zARHP5LX!x9Qcs1Dwnb!85YWY7IRQ|~Fam*~YB6w#K652@#-< zM20V6!a^t`!8w>nO5>3{2z-qNfTTiTAu)iC6r><>I*5Q}0TIbSumAxU6WEV}2pl4S z;z)9kKuCi`io_6N8!AN*TtI<{g9)}~pW= z2()4iGO7`V5L_q)3i~^;Q zB@PovO*Ls`Dv|+k;2UE}4V0=QLT< z0IE=EQ5ZlNa4?7^1vEHHL11K%iX?|qQlvYIAqbGbs>-p9x^H>3Mq=hRV0lVN_XT|`$`YOU7y+iPuZ;hhH-g4+SxYj)LYRaaM5)>^P|ibbNg zfCGQJDNN(2^zNT3o%2LQrBHCt## z0s+B*LNXAD1tj=c3uH7(AYrP&X;BIUlK}(`4@)HogpPzHG6^IL5Gg7o#*YGkK_C>V z0KAMN01S;%IY0;v5|IRv1q1>h0*XZfV*r4F#(@xs2u2|Ukjo`76G~cVUR$e zuvOr|H4=&t5M(Gp3=Kd4G#5yi1p;uYfm~AK0fJE|SwLXXA{Y$>6BJb%M3SQch`@$o zZxpcPBowF=3L^xnCWxRzv4Y^R1d*a5g+x&TP|#qN2}Du_ffJ6Bg-C>fMt~9+4hDfx zifXh_3`7ZjrFz@SwiQ_` k2u22Q9TvB(s=C#6y{NVXL?S|T`;JpFjX%g7* z0pveWu;1_i^C=H79={LxJg6Vwc#GS?|G>V>fMOr;JxN1{2bKZ?UqAtz1RgWG+whAbx&zn{AoL%>fI;iP2ePcd7!UN>05k9p?}DsA8Q@ij1Hc{t@CSfA0pJe+ Lcmu#50Pq3;hy>DO diff --git a/assets/resources/dolphin/lvl_13/frame_19.bm b/assets/resources/dolphin/lvl_13/frame_19.bm deleted file mode 100644 index 99d056efd0ef50742345bf8fccac81c89f56d955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmV;@0WJOk0L}pbHUc^ShlB4C4E|5S_l$&i0r`%A;3MEsfj|b2pMbz2&=15O0sbd6 zd>$~&2mBu#3H|&CKLZhe0fi6+AN(jlLI;=tzW|{a2s~opaR;yS|M!8B2mS*e!~?(& zUpPFy^DudQ1p)vc^ncF>E)V@AJb-wI&;1AUmk1u00BFG=A82?zh2tOxpZW(U2bcK> zAoep19E2eCm;=iJeg}{69zURXqsDMgFj&F=0rUrow2)$J7$5MMAo7DJlfaA+_=C}! zi;+o)JpRKW01RLrU?GG1p)`+W!D1y48242p&Om2e-f; zqj3kZKtbpR5PKrc5P$~&2mBu#3H|&CKLZhe0fi6+AN&YD03m(@>-Yr-z<3|{xJW_k{Qv#nWI_Lc#6CU% zdilZS@0o+k;3yCP|D*nRIdFgJA>;$ZK7Z&xoVY;p#6Tth(Skre(C~W;#y}50^bSrB zFY*vU>}D7_2tn#EOYl5@fbsnU#Xd8Fd4k3d_z$2wRiuLxSit{;!3UHW9;m^CegWvs zMaZPY9)lqO3}7B$A%pv&Xi*2id|-d_`2)^4KTvp!+9(e+*n`jnAOwMY3WI|OnS9md z0=!WHa(me!=A9ANjUwN)UO#ASL%85In-< z4{yLdM&b`*fP>HsAofL?Apz`25PEW&{2Yjs*Vx1Rnv2zkv1lfB)kF-~j|4|A2bM!r~aDnBBfLH;e1b}_9;{gYtykr3Jh6lz54;6U- zkb(~xfPBotFA#YBf$RVq@I3?Mj~IYF!DKujdH@f=OAvcG1U_jp|9^q#01$cb7lI!_ zuz&_I4|v!=frI!5oKSwK@fVNq9%c3inMi;FuP76YjqDFw!Pr6Y-zXG=oX>Co-2vqQ z=V1T$^qB+Ba8N#P4gPund4Lno_XnTA9x#AF&3-?0s9A(94a$)5QpOa4=DV= z9%6w9nUsO!!2E;C2%Ru^jYR}v^#_xPLEW&{2YAMiPN6Z`lOd`}z++0E5v+A@l(V z0Am36jgJJRAOVU4+!#NAd$`EHfb#$p695lk`J>7WFmRE*KnVi8K!NhVC=iTc-~0N# z00Ju@=)f_+@ez={fCB;kf6e8f2gD2>Ofj$n#q=NqhyDTPQy2u`9pTN(hzz20qSl}0f@PP z^#us*grXxK;(?pS6%crn+5zAPm;jU_0Aqoij2{1hdJ)7P`~Z3lgdXq+@m)di0PqKZ dJOSVj0C)qy9suwMfII=<4*+-rz#ahb0{|ac!Lk4V diff --git a/assets/resources/dolphin/lvl_13/frame_23.bm b/assets/resources/dolphin/lvl_13/frame_23.bm deleted file mode 100644 index 9b1574d58f431c52a39a297eb6d980f591bca9c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmV;b0agA10Hy%|HUe?~hlB4C82?Yf_l$)60r`%A;3MGs&%odj=m)|N0RMy9J`WgV z1NaXg@p-4=g76rN_zzG}|KKnV01!dtzz3h;6e9r#j9>Bn0*KH-=ms1BOuqu56bJx+ zfb{Rk!R9YNvU7%(_* z;PL;<<^c1D0LWBD@hJ}j@*iM%2?)d>V;8Iq>Lnr{$ZSF9=m#(09xLH82}pT>^$iJp zNQ4g`;Jv{jV+${2n-n1ppc_hzHmnCcIIt1;jQ$`X`e3cm^Wo7vxAl@%{_j=np@G z2$n7&5h*}R@JJR~4a6S!0(gK3q#*YIFTfwe`5QPtfF1zw2Y@^Q;12+J1Hc{t@CSfA L0pJe+cmv=7wAZL? diff --git a/assets/resources/dolphin/lvl_13/frame_25.bm b/assets/resources/dolphin/lvl_13/frame_25.bm deleted file mode 100644 index 23cb600d530d0a2dcd18006218d80521496cd5a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;w`0IUH3HUe?~hlB4C82?Yf_l%7EFW~!*KzITCk3irN_y@ud0RMy9J`Wh= z1Mm+Y@p-4?((o9I_zzzO|Nj98kWfM6zz3hh|Nj^d1OFeqegL8f5CHxG;yWAwOoQX# z2h@xZAn_as0DY7H^d1cW@6F&IfOwD3`49g?%Y*+(4k7_S281^ox0072-Z5c>cI zFzz)N|GVQc`T&FgGk|*=%is?=ApMKx4`?TWc0lt12rz->OC$P#28a(Yg~T5=KoG#V z9!7Z^+Taf=1~MQ2zm&v2fCR<|hW=9@06sZD@&AL-)F1@s1JdXZ6zPBq#t%>T-Uj~= z0&@rCPapiA01r5D41wbTfdK|T!1xpy93ewrh#0}^19FK7zkv1^h-^XTPiFFPKjk6f z1C%r+@d6UagYEnX2oQb*G5-VDKtMu(m*9{flnV$w_yq9+m_7gt@CWezM$Ql52Y@^Q a;12+J1Hc{t@CSfA0pJe+cmu#50QdlW(YW&f diff --git a/assets/resources/dolphin/lvl_13/frame_26.bm b/assets/resources/dolphin/lvl_13/frame_26.bm deleted file mode 100644 index 6b465c25699eac8b5dde4f64b5d835ef8a500af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd%(0J#AGHUe?~hlB4S82?AX_n3_QFW~!*KzI}IeaE110eJWz@DKPsr{M99 zKtBNS{}-Bnet<+c1|t3g*TFykz(9ll83;UZ0Q2~N|KkA>%+r7x*3_@vsBN zFbNnr08NAbVF*0~|L4))MoREHD@jrvo@V$fOzCrQuugD(H^WbwK=iy0-{QwD!_k+e98W4P91;T$V06sau@;Qx=9x;G= z@qy|7`@nAi_3#6Po?rPq1MmzeFbsj?69WkdYyk6y0Lh#oLyzD;Wd;X}h;RlX{sZ8g zAn^f+yub#oJ_r1yJOFZrguWp37r*czAVK&*#^MiQ0Raf6CSwpVSwZi>WuXW`?v+Kk n1K^Cn{SXL0fF1zw2Y@^Q;12+J1Hc{t@CSfA0pJe+cmv=7aB9Qk diff --git a/assets/resources/dolphin/lvl_13/frame_27.bm b/assets/resources/dolphin/lvl_13/frame_27.bm deleted file mode 100644 index 4fa2d79957cc32e675a2989b239f390f1491a4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmV;r0Y&}+0JZ@DHUe?~hlB4S82?AX_n3_QFW~!*KzI}IeaE110eJWz@DKPsr{M99 zKtBNS{}-Bnet<+c1|t3g*TFykz(9ll83;UZ0Q2~N|KkA_;@c&pcdD@$2j~wuK>Wkve-ilv&PWe6*#pc3A@qWH0Rj&~ zdDa2t@V$fOenRo^ugD*K$a(luVh=z9V?E&Uhd?|4_{0l@{#pQhbAjY@8z4MYrT{K5 zJwM-g3;aL{;0Fmjzw&qhJmA1G2aE&^Bq6YT0c8vUlQ=?$AHaUf3=bC&;0#6l2f;W& z;sX+UFOz})DGvY~p`kB`Jq7Rl2nY~<5HYxe*g!x+DT$cG3>Hv(@EK@A5PPLjZb0}W kFh4{B58wxYJOSVj0C)qy9suwMfII=<4*+-rz#ahj01JY=ng9R* diff --git a/assets/resources/dolphin/lvl_13/frame_28.bm b/assets/resources/dolphin/lvl_13/frame_28.bm deleted file mode 100644 index 1d72efd60014c48d647f629f41a4363aae51f1be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmV;v0YUx&0J;GHHUe?~hlB4SIsZq&_ZW=)FW~!*KzI}IeaE110eJ8r@BpLF!Q&i& zegWhDFEsvj0El2e;PL(g*MWckfd{~HAbWg2|M7tE0D}zt0Y(B3FTgy-;}-!4JV62v zLD+)?6e02O2hZ6*2aFN{-;;yPet*dS`W{Rl`SfuR3IIJJ|Kj0)f#M$!c|rjr4uztYvkOR*A8xVPZ0pgz!dGG~f4=><6Z-Dhi4)`8J@&F7$ zylH_Ch%iCvFbA99yYu3Bjf4O*fO)LMJ|MyR1I|!CF?o-~9+E(LuE@S%^J@qQd;oz5 zpa?(%LZ*a7DZ2cQsv260FEux o9{>ao&;fn`{s4Fbz#ahb2Y@^Q;12+J1Hc{t@CSfA0pJgS0DaEBr~m)} diff --git a/assets/resources/dolphin/lvl_13/frame_29.bm b/assets/resources/dolphin/lvl_13/frame_29.bm deleted file mode 100644 index bebc87340589f997cd4121ab7b8fdf3e9f73b120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0Zsk^0ImT5HUshhhlB4SIsZq&_ZW=+FW~!*KzI}IeaE110eL{60Y{&M#yJ4| zLEsjgVI1xJMb()C=L68DFblvv zcmUzQu*d&1f&K;z8W{OJSVJ%eoG>1c2oOAD{13=}97BLH7x*6o;RlIGNA7+ypo7QI z4p7jS#2!L1?g!iW5D}q3z~T>N0RadeB=k diff --git a/assets/resources/dolphin/lvl_13/frame_30.bm b/assets/resources/dolphin/lvl_13/frame_30.bm deleted file mode 100644 index c5111e0ac6461d8749d64f0be9eb69614e7d8bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmV;c0aX400H*-}HUshhhlB4SIsZq&_ZW=+FW~!*KzI}IeaE110C_;514o|&#yJ4^ zLEsSdpK=S|>!~g#n4*&=-55N>)Ao50ttgs*W_=rK` z2oQV-#6CU%Ab6{JzAO%Me zJb&?dfIQ)V^nk#D;~(IDL1aTPc?}4}Kk0FhS%18Gt>5 z<@N`{jDH>Yxjarn02#nM*#v(edP)iEUqE@6&=4T>0SEzn2ZBGS09WM@_;^9{zyY5n z{vh{%p947`|KH$1^k6rh31g1U!d4LceXEERmh7b^7dOOKFU;`%){iZ+f+y(w1_rHV3 z{}YG<%&;H<|9{{RAb7|4ACOrP%pNWwz!-=uB=>O$JW4`8WoVm>23~-C9>g9cA?6F< z_8{>YkMJJf0DyrA9zW%agU^6t68n%y3T7b(z5%v`AqTtyFh)>(02H494*+-rz#ahb W2Y@^Q;12+J1Hc{t@CSfA0pJI7NwL=e diff --git a/assets/resources/dolphin/lvl_13/frame_33.bm b/assets/resources/dolphin/lvl_13/frame_33.bm deleted file mode 100644 index 67659665b8d85a4015a13cb151525b711900e644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmV;k0Zje@0IvZ6HUshhhlBEQ|Br+3F&X|(!S@`9_%Go6f#3uA9)W;{0pNqcKj8MC zgT^rc`~%1QUTOdO0|4M0i}(*xVE@Dd4-=4s+u{HJipKyC8Ry_CAoEU$tbyYfAC~|y zAoeZ@%tPbg0tf(olmFyC9RTmm!R9YN%A#GhksU4*(u+ZRB_SWOv`xkXBx(cD z_8{>Qk1+oSu?L9^e}MM-1Ox~_pm_h5E)PBg1is`GGpIfA4znQ;J<_QF_ygnsr1$`M d1Hc{t@CSfA0pJe+cmu#50PqKZJOSVj066afy}AGZ diff --git a/assets/resources/dolphin/lvl_13/frame_34.bm b/assets/resources/dolphin/lvl_13/frame_34.bm deleted file mode 100644 index d195bc756a82b7cd7c00c759a8379e3c160654b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN|~0H^@~HUshhhlBEQ|Br+3F&X|(!S@`9_%Go5k3jGN{0E2#U>*oO1O5+b z_&j3}55PQs#pa*?pfC;r$iIN~CJ+2TAn`c}J-#3R_^faM@t%GHq7O9aipU-@artlq z0uN%~$iV_S5x{^4*+2e6;m{8J+#X`{{zuv8|49xY9{=Lue}Up38UQq60P%zW0p`LG zdw-x{@eT+*ECTc}kUV~X^N<71d=F3HJVOExJ^^e&<}WGWJunF|2Z%615wj5W+YBfd|1np&knv{Xjwh6?p^40*`P4K{ye| z_=Deo4=M(7K7JT6{a@*r|9}LTJ^}fF6Ce*J81Mn(3EB zPc8u9LF^0>n1{!}1P}oGC;!NN8Uf#vgUmjE$ojZM1OG`5ARZ(02aoxlU*LF$#()hN zKs;dozz41D}BWBR|+asL1bFn$B`XQp5tQ1H-$#uyDS0Rz$ANYelr zIDhFe|9;>v@dv&99zXb;Kp#K&5Ikf20C~p%W&Z!bSfXMt_gkIl*@$doo zdk}bt$CwXMP?yCVKlmA3OY#IC&^&*@_7D?jjACDM2?dlM_y<{(h#u)wc!)k+><{1v dfII=<4*+-rz#ahb2Y@^Q;12+J1Hc{t_yBM>#P|RJ diff --git a/assets/resources/dolphin/lvl_13/frame_36.bm b/assets/resources/dolphin/lvl_13/frame_36.bm deleted file mode 100644 index 770e41ae2b69e0fb892972a904645bc6b3edce25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmV;Y0a*S40HXl_HUshhgM;#M|Br+2Avym~!S@)5{4e19jzI7M{EtAuLIoHU04VeD zc*YK8_$BBJ&21`JPN74~>8tFo1Z$!RW#e zc+eSy2^b&n9^vwc4n#sD!ukW)05{-ze*xzp2NwWVAojik(*VdX*f2-r01$d4#6BSQ zm;>9t7Jz+*!Vi;qeF5-4B6)+(P+y>XLKlp=5C@>RLE=&$;JJJO;SG-f9z*v01H{%K@ez*@{|d1Z z2s}mXUos&;z(NmU0TD_9UqTB72rNMNz&gyNK=(?aNP+MGP=A0t0pJe+cmu#50PqKZ RJOSVj0C)qy9suwMzyPTYws8Oe diff --git a/assets/resources/dolphin/lvl_13/frame_37.bm b/assets/resources/dolphin/lvl_13/frame_37.bm deleted file mode 100644 index 75a03b2602b38d4ba68ddeeb21f5a231ddff91b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmV;l0ZaY?0I&f7HUshhgM;$%|A&L_Avym~!S@)5{4e19jzIVU{EtB30Q8T8+I|lh zc34;UhSART~ud;#Ma2ABYWT*_ diff --git a/assets/resources/dolphin/lvl_13/frame_38.bm b/assets/resources/dolphin/lvl_13/frame_38.bm deleted file mode 100644 index 80995d1b317ae5fa1c83fd3bd2ebbe0d1bfed470..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{${0ILB2HUshhgM;$(|A&L_Avym?!S@)5{x9JBjzstX{EtB36Yx2a9()fN z%14nz-O;Q!z-4*|%(fWnXfhvEPKj0b=O7zf}!snHdd1OFcp2tErW zBOv(r0q5+W|Do_m2YyBmFra`3`5*p6;lS}h4j?|D@*WAWLFe!Wj36E`|L{E4LN6Nw zFoEL(2gLv$f9MFjMT7hgumDw}4?loC*TN4#`76a*N|8nl@E$|*LI^zY2r&@Bo;{zz;V1W&!EY2aD)H34jNX{C=PK1>hd1 z;wP8>cL9HhJ|IBxiOd1>|ACDLKY;z03?72v2a6bk@XH5l|A&LFAvym?!S@)L{wLu3jzs(y@O{UiZ~*z>3XeVq zjCuj^29Nw6)BCXqU>|^Z|AEWEzyF{x4*|%(fc5x)|KkDRf67Dn2dZ>a#eo0E{~yqN z3d9~FF%OLZ9)7|2!{CL%k%P;?6c7OaBmc;J8Uf#%z%c;vEC@XZf@~C!gU8?v7(hH> z|KNIy#^4V~I6V#LU*)K=GVM+w5B=dCoED;ei9!5WhLc`~V^G@B`0*0Rk3q9!A0F1I2zV^yCB4 z-dBKWfC!vF^%(#Ea2NQ4-u}ZM{7xVbm;?_1QXU877E{1_2ZSCZAqxlqVgU37h&;vZ zz$Xc;K!Q>qAU$>f@imWt9$mtFe*yv@A{hUH>@Xl8{sHnJAQ<=;LSHcgkHy$v_(GuA mf$#uB5QFs|;12+J1Hc{t@CSfA0pJe+cmu#50PqKZJOLn*y~ou6 diff --git a/assets/resources/dolphin/lvl_13/frame_40.bm b/assets/resources/dolphin/lvl_13/frame_40.bm deleted file mode 100644 index 39311782a4d655af00063f06c87029e45b5e5d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;w`0IUH3HUsnjgM=_1Fz|K6CqL-;KI0P~K6nT)J*Utx z5WqeLArd_NFfoV+;2uBVa_}$z=nO!DCn5d=*Wv&Fj0b`Lzlek$zkqm(#{vJ3{sHnU z5O~GI@9ZCnxWDo+d3XWloFC*o!ae!C1CS3G2t4Ee!GV90Lx?R1G+_eqkN=5+4>5Ry z)A32a5cB4fD(c)94QqX#fzM zKlK>@|8N)hgWmoRD4akaFgO+i{}=EB&PWedsE~{P3n;)n1;P(M;JJ7N;ZFznCxL=U@EQlV%0s;@{A0h$)kAZY0^8g_5K&E04d%!2dWe30kJ^=nF$OFJ0 a0PqKZJOSVj0C)qy9suwMfII=<4*)oL@3`#% diff --git a/assets/resources/dolphin/lvl_13/frame_41.bm b/assets/resources/dolphin/lvl_13/frame_41.bm deleted file mode 100644 index c4b12da8aad3d4e4d58c12baa09a1e5bee000bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5+|0IC51HUsnjgM=_1Fz|K6CqL-;KI0P~K6nT)J*Utx z5WqeFK@vRtFfoV+;N(Bxa_}$z=nO!DCn5d=*Wv&FipPQfzlek$zkqm(#{vJ3-U0F} z5O~GI@9ZCnxWDo+d3XWloFC*o!ae!C1CS3AK!eIZ{1_McBshTi!U5&}CI~#m|e%{Q>SzBzTj^9|^Jtm>56 z;rI3f%(x>l2aSLpX~F+P%p>2Ez&Qs)2b6#KATRRBaRs4(z##(hkBkJkAo3TFz&arD z{z3o1^H~TyZUFQDKtg+&Fh}G7 z82~)cVjmEHcjC|wvdn|>e;=Sc$LLQ`d~g$FUobF$25^rr1)ScXApi`Z9(*u--T~#n zjK|sN4>~|RuoH;!_)=mIOhY{958=O<$R2!%2~fe~{|Api9x%gLgU>JzPk=m4qW>TP z6NmmkFZ>1mAO%Mf%zyDX06t(4Ab7?60QnCN0E9tdSfD(I!Vf>-d3XfjPY4h~W8ep` z!5%>L<`38&egYW_*cL>R{R7AR4`BfX2~;KXAg~n7LJxQV{7mQ%fh__&*|k5BNUgkURzatYG(_7e;*m z@Il}LN1wrlLje2($NUan1^f^(0tlRk_zz!){Ty5akptWC4-r`4KlAzL;2#392aH@0 zAocbG%(x>l2eNQ~(DMlQ)^YC)C3>_lmLb?;NhRt9(09y za5F6OUywZ2_&(#2KL`9DkURzaA9Ld9&!8Rv zAc-D-1|bXs@dto^fy=+rv$i-3YJz&(E-@Y!HL^ZDRDLt+mYxPAYC z^DYR?LGM5RL(C)JlfXF;3jjSM|I7G*f6F1nAqE2ggg`xj@&B{L9zyZ>2Sgq}$UpcV zYas`Xz#f0-7<~comJoQ01co5;C!;Ju=A{t92gy<*u@AIx9+(AS-vQ)5AOOq(=9m!p zg9ILu0DE`HWA<5)J`Lsc2f!dp=npaZm&raQ@&~j-fJ-2GfP?@ufO&X0XY~i2pae0F z1`VD^@&}y(eq0I6eD*0Z2c`f9bB^*jOk@u{LpD#1@7F0E7#~9woy61H@iG0O*6q z`3L_4&14|<|3Jg&4?BQ;03tjhsDsKt&Omx8L@-73;1K1oa1?{P+Q}FQ6Df=@8%^2p(V|01V(BUJe*OZ2|Mh z!NKO=AOO}E<$#>Wk7AP$dTr#0o?g3J_RrHfII=<4*+-rz#ahb2Y@^Q;12+J1Hc~umk+{l diff --git a/assets/resources/dolphin/lvl_13/frame_46.bm b/assets/resources/dolphin/lvl_13/frame_46.bm deleted file mode 100644 index 61dd65bb6f494afe6b47cd08a2c61e7251ad50d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5+|0IC51HUshhfrI)U54eQq{T~P1Vk7*YgYG#I@L$3A9)aKk=YS$S{JJsd z2f_~k{}-Bn0wD|o@(+RFf(9YrIT!FAzYqF2xF7Nm{sHQZANZ_rANc*?AF*)z`vKx< zA(;c&I6vro8Uf#%z%dXBfITDs!2uJ<9zO^S0uXi(c{9iSUq66!LFEVk1I>gW@w@}i z{{au6Jm&%QAc*jR=_qF)JwJf)SB!uhTm``c));S00&s7F^#BO`f#x3&V1v*;h%x?m zL;s1ljpbr)J@)KeYe}Ftmqu>v?{C@xU`8&)W zbM=`2;$ZRsDmY*eEC>ECU6(=A(fdU^;c_)W}VlaCC0pe>Ac$kNn z4^dF3#PTFE7qGyA;{g2w$NUdr0E5fGsuKB-SS+CT;0MSGK=^=966z0t0)zYk;12+J Y1Hc{t@CSfA0pJe+cmu#50PqLE0K7T9TmS$7 diff --git a/assets/resources/dolphin/lvl_13/frame_47.bm b/assets/resources/dolphin/lvl_13/frame_47.bm deleted file mode 100644 index f29e31bf40536b2594d7243331de0af39e501050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym-)0Js4FHUshhfrI)U54eQq{T~P1Vl()kgYG#2@L$3A9)aKk=rnoxbYsvD zgdPF@FEsuHLKp}99|OSz7l7nnz5J9|wwPf57nh(29$W>%1Izdi7$Lnl3BkSx)Bqs!zyriy zzyXK@%?3Zt{CFNKG5{t4kS6o`1I#{S@)w`L9|*E9m>56;k0=L$&>-{y2t6Vm3<-Tf z=AS5s0szlYdDsW%0EZsLrXctL4|D&2E)U=yegJxYKmYJ}^a0}x6^d*?1Wq6LyncZ3 zE{~u-fb{?V;4kq2C_HCtG5^HI;to*g|KLzO2mUYM2eI^j;o%32JOnBg2a$L| zjB)|^F%S40qQi_}4n_P2ufqNqF9FDb?2RA%1V|u31PCyp0Q4XTykg=Z53leZBe4gF zOhe`XFJL^NkPiHe9{%%{K4z^f1kh}cmRC#0pl25m;h%<;s2n=Xg?dlY`_Eh2M9dB|F{p}T7Z!N3mh&;pWUL^4F1ZCt0ufQHBvG4=SxDQf+F36@M zfd{Z`LFMpG2tC7M4<*qT&48}6F%UiQ0Q4IOJ>U_*A)JIC17-*C1Hc{t@CSfA0pJe+ Rcmu#50PqKZJOSVjfB@^Wwz>cS diff --git a/assets/resources/dolphin/lvl_13/frame_49.bm b/assets/resources/dolphin/lvl_13/frame_49.bm deleted file mode 100644 index f256f89241598fdd2efaeb0ccd62f7a4ef562448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmV;W0b2e60HFZ@HUshhgM;rOIRC@J_ZW=-BjEdvM1B|WeaE1D3HUza@Gy|TJ_RBF zmzsVL7~})+4oE1QecV;fDe>t|KK3<|HD53_#h4g{}(5}@E#1J<`$zxK@?ihWqlhgCJpR!C@o<6UFA#cvpyUB(kNJck@w@{@5E&R4 zKUBgm5PMDq=ROCJ@P0t?PmF*ZUI5tx%lHo#pv)P@*dTce$N(VpUJm#lcmQ~Z&}=W} z2b^sxAoxg;yuJYQhycof4>I`!={_Lx0SEw5=pR!0N&sY&AbcmxUNZ)J4$uH!5B>fI z4^RS5KLPQFv4mtWMA(DRIr#^lz#cJ(2O%~f0sRAq{?i|~{sDM^SOew`AbEf0a38?^ zLB#_nkNz((2eI@+#eg{v1M&}oaD&7KKj2|Z0qBk%06c~5{0FGac!2fjH;f*C#RCil zR$t|j1KYq4J_2Y`A|Q5JgX7>2LJ))A01rX1gWv#(AqVJyLHq#l2Y@^Q;12+J1Hc{t P@CSfA0pJe+cmv=7#O=7A diff --git a/assets/resources/dolphin/lvl_13/frame_50.bm b/assets/resources/dolphin/lvl_13/frame_50.bm deleted file mode 100644 index 57f92030bf92268e9753fae50adf22cc747f0097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;w`0IUH3HUshhhlB1RIseDO_ZW!(C*b>zMEn=}byBnbRKWBLb*yg}#S4Ujy)fboVv83MT`!2`%%KmiA#%zxkDc~`+? zFFXJ|gXT660)xoDe?WV{0qgJwoInOv01$)3zCa--uYexK_i2zmB?j|`SOMmLMqq#j zfjsbk@9Xphk$mT$5O~3b>wpKIU|c5h@C<}nJOFw30p$-X2s~#H4uCxWK=Nsv1^y_q zKACtyJNVdY{bM5cm?07$4XGe*ioI a;12+J1Hc{t@CSfA0pJe+cmu#50QdkQ2DHrp diff --git a/assets/resources/dolphin/lvl_13/frame_51.bm b/assets/resources/dolphin/lvl_13/frame_51.bm deleted file mode 100644 index 51abab9ffb6f5f3ed04e21eb971281fdceffa2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmV;X0a^Y50HOf^Kga(M2V6p9{*Qz1F*E#6!S@`A@IT=DpFrRN@_|4Gk3NGyCy)<> z9s&LbE&~1<7{&ws48q^5ROC-Z-@MvMG?QiKL@i1p+H6BAN&K%0AGN5fW#i( zz<83z0pF2>;(iYki1+5=F@RVB=^rhLaDT}m#2H2c4=-dqU@4*h7ti1iKja)ABJ(VW zJ}LwB2#@@DKR|h-Nqj-E2baJMD)rzB$R1z7c)<Tx(%0MtM zc$35)KVW%)4uEkk{9Hdg0C^kC9}qWKm&^np_3#7L9!2$Oj{rV^^G}pRffxtKNbnPn z2s~fn4~PWg?tU0^FhT498Nhg5<)9f1A+|6Od1nFSFB>3yX8`s31JnKYfWO6ljL|O( zjDPcT5RcRzQ1~!BWBw0-J%5Db2bKf&3@ZRV3u3br5eMKNqxSp*#MUb@DGx9nt>R6W z_#Ptm7#I+K5HOH~*g!x+O$Zc-E*4OGlLQMO1ik?ezz>zf1NZ^p4*+-rz#ahb2Y@^Q Q;12+J1Hc{t@CSfC00G9WEC2ui diff --git a/assets/resources/dolphin/lvl_13/frame_52.bm b/assets/resources/dolphin/lvl_13/frame_52.bm deleted file mode 100644 index c1d027b4535873b419c38e8cd4b3e07129969beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHLH0G0s&Kg<6Q2V8^2{*Qz1VPgDG!S^_mct7C#oAO8;o9yjp$a0Y?^A7DMl5kVr}E;4g?h4e!8-@B#54ADqMFXa6NPY z^SF6|;~pajJYa(Hf1KbPKl5Pt216K4m_1?e3m|-N3$p+Z&>o-doDKde)-Mbh1~GYn zJ->tE2b6z-`3J$QibeiTm^}+)fFTgQzX9`6h&*`!_4pUa9!+8XEEvE;QauPg+2jNz zP?O9+%X2XZJ=_8hGZ2H^QlU`?zySmFHei1MJOSVj0C)qy9suwMfII=<4*+-rz#ahj E00Y3R!2kdN diff --git a/assets/resources/dolphin/lvl_13/frame_53.bm b/assets/resources/dolphin/lvl_13/frame_53.bm deleted file mode 100644 index 17c7df5a56f2333bc5ae35a2c6db1a3142b76e53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN|~0H^@~KO_GS2lRX$cmR0M!S}%Ad~e|U@M1h4@O}I-7!Uje81R4){v!|% z^b8*0u?7eXe}MBEAS^|L2^kCrfd>nSy-9*R9|QyJk{{uDzv98*2?QQLfP4Hz0uL1s zgWKW%{tm>LBT)y#IRDb{K!ext4;cJF9wIRZw_qMozpFdiOd1y2M_@MJpcUs3?4Cl2kcy;ksk~P05UJ&J_%wEKR`6aA`d0-l*ArAzz&DBlPZ2=>kL)lYVEzI`4`+D;#k4^9CI~!6oYL+$_^0C<1!^_f6HmEEpC)_!vw<;!i;d1Ii9g5O|Bo03?wIp$uT) z^%to8ibMVf&~Qvd4`f*b2f!8}d%!LLLoogq?f~%@jDSA?0SAtJ&>;2v zfBazc&kNi>J`j0)6`~I!z>-V;VGwy8L>@_z2am%3K`014Qz8!)NQcNCa|SUF$$TL8 z1&|E?!hr|C0N%n6G^mH(I1fPhhRhyyz<^W|u1I^wd_Me;1 z0ni7vf&m_a2kag>$Vfavf0)D4>Ayw z+kyKBj2uWH_9ThGLF9rMIy}G%Zy}(A#n2%54iSh!@%|@_1K@HXe3{f9@CXnl03HDF W2Y@^Q;12+J1Hc{t@CSfA0pJWlTDMmK diff --git a/assets/resources/dolphin/lvl_13/frame_56.bm b/assets/resources/dolphin/lvl_13/frame_56.bm deleted file mode 100644 index c50cad768e8099a9cfcc7378743e90eaa4480202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?4-0JQ-CNB$lT$p`*E3V0Y0;vf0=Ij|6Ldf&nBI7pYj{tt1&OnCqJ2tK$I z93T9SfbyTh0E6I|z<nS_KMf8ZHG!{z>wkc57J!5b3` z00J0boI&fr|C0&>z%-A*9^%9Q1LMGqPvZ!D0QcaROZk8BtsCM0Zw&yLAkh!Dz#cdI zfIMDKA3yo%e;M+?gVa(W0s@YB9^&!fgUjHp5P22^l4ubJk<>}!fO8+h{tqY!Jy^*f zK!`mo0QLVt!R*>4N&lH*4{!n=#2+9tjsw%64~yV^Rp=jtD8Ix2)4+c!2p(O5d?pAU zT?_a<4gLoJ`$W+K3lk9rL>?`&Ar~Ng zq4NL0@B|_!usq=4K?k%P1V6BO4Fn!2^bjaKg97Lf0~`dtKj0Aq@8Dt}d;g8)z*~qu jKaaG02tEs90L#ETKpp__2Y@^Q;12+J1Hc{t@CSe(h1k8N diff --git a/assets/resources/dolphin/lvl_13/frame_57.bm b/assets/resources/dolphin/lvl_13/frame_57.bm deleted file mode 100644 index fbd3d748304ca6f8772128335fba93078341e2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?4-0JQ-CNB$lT$p`*E32X!m3ULqo{2ts0I6ZIR_Z%QRf8zHXBu9=9%ml{= z|A2$u5Ck6t#smH;=0DG4Y{11--@jr|q@B`prK=C7pJ$?((Zx`SyA@k)&0SA$MR>U7D`UFAu{)2XnhlAP>4lW1a9x!MCjAkJ6j04Jn{x1n!e$hMw1dKue6X}1!h$ZC_lgiE`k6sFh}H45PTp67(c@i1Kj{FaqtnuA0Nls jBM=^};Q(jgTp$dH1GE9)4*+-rz#ahb2Y@^Q;12*muGF?v diff --git a/assets/resources/dolphin/lvl_13/frame_58.bm b/assets/resources/dolphin/lvl_13/frame_58.bm deleted file mode 100644 index 239eee125eee673a1b62411b05bc9e473476917c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmV;w0YLr%0J{MINB$lT$p`*E32X!e3ULqo{2ts0I6ZIR_Z%ch9~c3`M0o%3ec&cI zKlvR2=LiB1f@1;yK*8+~i~$GXF@S#x=np77;0Qm7m`FZ@)K~F72bKKlK=;1~)36^wd8!B=Vj%~m0s%jP zqsjru2epC$9)|%fP&8!1KNX#720Jh&)VU4==!c$K$~Gi^SMJzP6iMZAK(HId_Vz%0||&cf57?%2nbE&0AKOEybu%l pgW2|w2B3f&_|6apeg(n+$bdUQ9suwMfII=<4*+-rz#ahb1OW7+x`Y4# diff --git a/assets/resources/dolphin/lvl_13/frame_59.bm b/assets/resources/dolphin/lvl_13/frame_59.bm deleted file mode 100644 index 9a094733227b329471dc2696adde2e9364c074bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmV;y0Y3f#0KEYKNB$lT$p`*E32X!e3ULqo{2ts0I6sF74;%Qs#|aVh|H1cwnBf29 zbO)Ru2tEmn2mJ#Fv_3EdAB4sM{41b5p!0wr{w84|E13}k<^BhcfIff08-K@xfFGaX z2H)`E7sO&9_V5SDXh)Iw1Kjw3#gO;`{2yKPCL1w>{b_79JY9(&+m=kq~+|i86oT zK!e?^K=N>qKI4G&Qi#3hf%Zk1eh#AF5CczvfP=~~4=V@wJ|uDYM$n=Q7+^e)q}wn2OvEGg2b>Q8 zQZ2weRiqCPAdrNHv_3EoI0x{qfbxUR0E76Mz&-_YA|QOf!13@0&-^1{;a~^n_(8Y) zI7RU+2tEUdc^`m1d!3(1+p=KoEn;GN=&;p}axpz7TsO zNm75{z=PeaPh$t{a39madO1`+rt&(H{pY~(_us+d?+^oDh3172dJD{UVDb?NJr(0W zfdkKw4{HPhJq!nkFhk`A2d^@64;pyJK;`0Hj!e zdbdme2LcHQN8|t)IebCpBoh%h7(h^R@P-5);(;HCOhM!R2e@!xV8H8TcKD11A9O0C)qy9suwMfII=<4*+-rz!3U=ymtTq diff --git a/assets/resources/dolphin/lvl_13/frame_61.bm b/assets/resources/dolphin/lvl_13/frame_61.bm deleted file mode 100644 index ee37db3f7bf884d0f1aafc06d701336c9beb815a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmV;w0YLr%0J{MINB$lT$p`*E3U~+*<{$a^Ik*sTDa1eb@OzFBA24>$r3;%5N(70>t)F!_I^Vj&No_(sFRzz@tm zgyR2)2p%wjxP$5e&@_+09=-$Oe;7mH2fhSAK=!}@hvENsALIY?@Q2r64;lS{9!w?= zo&1zP4g3Ot4^YT}2p%Ib;0xcv4?X+@9!HZ8iUdwW@cx6zyd(4npa?P^noS!iNHMr^#_~>075K4 zJw@gJgMkEuCG>-r$Mz2)AcMsIKm_Om$h;we2e_a^<_{n6J;Q?o1_%gDqySWavB%(I pAbbCTC4e)Keivc@&%o?J888QE1Hc{t@CSfA0pJe+cmu#50DyT$$NB&O diff --git a/assets/resources/dolphin/lvl_13/frame_62.bm b/assets/resources/dolphin/lvl_13/frame_62.bm deleted file mode 100644 index ae5fa1095712afd22ce9082493f0d2861142f34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmV;e0aE?}0I2~0NB$lU==eJ(ANlwtun=&1-@)y`93VV@;rARQ&z=v=1ji5mfP?FS zF@gV}VD^W`0E6I}z(0j_FPz{AKMR-$MCbenn0&vIF_4GP{3CDp@Nfh351}}};lc-u zA_4dZ(WL$W_3#VGSWF@C1K)xmAbVg9#Jv+~en0;{2z_<{@t@EE zAn`w-0GGuF0gN0U0D%vfJb%FV4htNAz#%e_ec0plfsw=>|KLe*4CEh$*nl(eOArQ3 X0onlY2Y@^Q;12+J1Hc{t@CSe(vVgp? diff --git a/assets/resources/dolphin/lvl_13/frame_63.bm b/assets/resources/dolphin/lvl_13/frame_63.bm deleted file mode 100644 index 33b19acd2aef002b4e47c713e18ef3ff380541c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5+|0IC51NB$lU==eJ%ANlwtun=&1-@)y`93VV@;rARQ&z=v=1dk8@fP?FS zGlBo0VD^W`0E6I}z(0j_FPz{AKMR-$MCbenn0&vIF_4GP{3CDp@Nfh351}}};lc-u zA_4dZ(WL$W_3#VGSWF@C1K)zRAbVg9#Jv{ren0;{7=3mC@xRak^3J|3krI4@m$$ zpkVedE0}@%90$<6?|}5s1JDLx^ZNkET+j*Ne9oi~d+|KLeE#Ka-^U5Eoe1hD{R Yz#X6u0C)qy9suwMfII=<4*+-q0G`mrX8-^I diff --git a/assets/resources/dolphin/lvl_13/frame_64.bm b/assets/resources/dolphin/lvl_13/frame_64.bm deleted file mode 100644 index 5c60ac4d0bca39140a7e4b73e9d12d82c81ba5e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?4-0JQ-CNB$lU==eJ%ANlwtun=&1-@)y`93+GN{|~r5Bz*t;1R%tNz)0}l z_!xbO2f&fQzrgp0#sGuhxxhaKbT6FX2tNxL2uA1p0hA0rU%+_q1Lyt`xBM750r`i_ zoM7@3i~}9w9OZym6vH_ZOY;9+&`p2hZ$3BVnFfy|G|U; zAHfBOqyLYC>VOX@crZ{z3mAYrjivuB4}x~FIKaJk<#GGO!{-bivv`O@h$qTOh(rxI zLA*ib2ObDKPvkLAfINU=4`2cRgXaeW2tChZ2O0|~P2?YNVE+O5e;)yyf$#i%hyyfV@9iR^Ycmu#50PqKZJOSVj0C)lbTsFAo diff --git a/assets/resources/dolphin/lvl_13/frame_66.bm b/assets/resources/dolphin/lvl_13/frame_66.bm deleted file mode 100644 index b1f913f2e4d440f7081a07c3491c85371e6430ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0Zsk^0ImT5NB$lU==eJ%ANlwtun;hMf3M*7;6cIb{|~t#Bz*t;1RlhLz)0}l z@wx(tkbDUo3;Z`hdBy;P;JLs*2nN7G=Kw+YSinLzKi~|YVeI0r*egAodTA1Rj6Td9{ZC4<(3$#L6J^T$BUpA2^Uc5hVv$h&?0? zW&Z{Q9xyO@KaI?Q`GEk+I1ixt-vQ`j5POHqzxHa9HAC!$7a0H)o{jMb#P}X?5PPS` zJbyR`LjDg`Ambun_JbG99$qkb*GJ}95P47rBjYuU^d4n_Ag|B!{{{#=zXTQ@kN!R! z5PB%ifDb5eFi=Db7=S#7q5u-m_$O-Fa#x`|H1wM_c$N;9&mUE`QqXMgN+4rAovf6Fn~gTAbY9Dz-J(P{{b*R cWLSVPYG4llcmu#50PqKZJOSVj0C)qy2FuL8qyPW_ diff --git a/assets/resources/dolphin/lvl_13/frame_67.bm b/assets/resources/dolphin/lvl_13/frame_67.bm deleted file mode 100644 index b10502f84d957ac18c32c80943c12dbe833a0ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmV;n0ZIM=0I~r9NB$lU==eJ%ANlwtun;hM-@)y`gM-uk{|~t#Bz*t;1RlhLz)0}l z@wx(tkbDUo3;Z`hdBy;P;IY6z2nN7G=Kw+Y1IOSuKfny2Ve|x1R!W2`aGCDya&Yo9!J0rehGBH0QzSiG$Eg=F30RbWa6HtTg zydc3)mjGV;5O~0T6Zi-{gX4h*pY$GWVZZ~%{;?2vnM59Il7M|9>JbOZWT4>kfrH9G z)?e^oLF)c6`MgLT@E{pS0rVd`;5{?|_?`pDzxG#{0fXod7kGdeo{$&$02+MA5Pc`a z9*a^3s*rP#G5PcX;|4F7JaL~k_}5?p@+=5Er~?u4i^h5nGQhwPXMp+sf8fFa58xia z;s3|M?FcCtIDhcqV4R2)F#`#M$h1BQ+eATQI0uj%N5T&syiNh=7pQ!p>mnfzAtJ)^ z0uW3`0I>l8NB$lU==eJ%ANlwtun;hM-@)y`gM-uk{|C7tBz*t;1YX30z)0}l z@wx-sfg^!`hUgC{d|(JZ3!DS+fNTUFa0DNPj07Tc{s77bA1~yL&cERsf5C!>Pr=QB znAH!D$Tu9-xr`5A+|L zaDc#6Brl8zJm>Hbdk4fGpU`==kKupN1IWrC^IVhz=^s#tK2s$J2b2sRQU`QHKkJO`KAUSI|fpgdk=08)BDU*rI5^a&n)0DC9KeFO)T1EGHh zs*q!m5&4743|}yK=R9~n{dNF9BEW;nfdIsO#p68(nP6ZDF$azV=llQ1!GaGT!9~7f z;Rn1RAb-$!!;|EK5KzPnCJrC@XnYg42!h6N4_J6Se(^X5pcXNJdcoF2LLEXyf#ORL zAj8Y*Q55MC#CRa_Kac=nfFb+?#s*#xdk`2NBr*RyU;GRapss}8K==WOKLLZ_8xTGJ fh4BSAJx}5Q@CSfA0pJe+cmu#50PqKZJOSVYs9(CU diff --git a/assets/resources/dolphin/lvl_13/frame_69.bm b/assets/resources/dolphin/lvl_13/frame_69.bm deleted file mode 100644 index c149d28db180af221b13974730deafd4afd30452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmV;-0Wnz#KmGzQ zV0qvsI6wH^0pwUd1jYmY8=!pS145a=KL`c~jNk}Ai<|@C4?o~MpyBfWNWkO|FYpYC z<$(W#2LMk$z|Dc>00)d9XdwC!iKId8;6@2FzlF_Zjw5PGc$9)W=ej0_(?#)$*i0Fl6YXaVRSIpCN_?hlQ!l!ay!JK(&~ zq&{N!gU$l~AbX$8KEm-z4E_iYJ_Y<9^T@zFL4)`K3>dy(@y>kR;|&Lhyh{QPDg*-& z<2{HlLFA|q0RzVY^B)X+7$G7rt^?u^7jYshCpKN9dmz{2YG;@&}AMd=C>C zgUARV^yXd#;~ap00pol(uM_k9|Ca90sk|I9$(;mz(?XJ5PTd27(gL6kO4)43?GC9{%jTpkN{{6K_EliKpAic YXam3=0PqKZJOSVj0C)qy9suwIfDkjd#{d8T diff --git a/assets/resources/dolphin/lvl_13/frame_71.bm b/assets/resources/dolphin/lvl_13/frame_71.bm deleted file mode 100644 index f682f42a6fea0e46015c3708cdcc8d4a9bec9bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmV;i0Z#q_0IdN4KLh^<2j?^Y4+rNH{~rhR{2h1>C(iy4y9YDF{|DW}nSlSmLG^fs zKtIqheSQJs{0E(Y9^dH11K=+|@p-@ShzEckf53Y9359?I2+)53_4pSPfU+NeJ;kT; zSqMGv|Hkon7D5ki$NjuxQt$)fKQI!M0zeO6;5=vdfT+vC?jH~chX?VGAqai1@c?K?lY@Q6Z@V&8%n92g?~CAoCfCe7FtcC5ZgNrae}MBZl8|BT@;Qh+jRFr#H27X5!3UM_8Z7Y#je(p%@&62nz{cW1hrXW!eK-7Q0AqTkNLFMo<5IxI+4-f%If$k{~ bdH^M|zz+a;1Hc{t@CSfA0pJe+cmu#5Nu#`X diff --git a/assets/resources/dolphin/lvl_13/frame_72.bm b/assets/resources/dolphin/lvl_13/frame_72.bm deleted file mode 100644 index 20d7c28dec57312822f24fefc68d5bc0dab00b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmV;k0Zje@0IvZ6KjZ%a2VMj7|AB+>J}~fpUVriMedH%U$@o6w6CZ{AA92W!0Kt*s z=>Nm_9|w)_4q-z4V z2t2cZ;h%%Y_nnLb#~=?pU_5*96Oh7EqKgrEzC|2B!6^wnzku^$2t0Uz_4otDL?H1o z2z>7V_5uhzf6WyKr{Ls3^8gh9{zUQzh!jc?1RwFpf$SR)Nqhjr4`A4WP{bhjD2OG% d3ORrSs#pQw4*+-rz#ahb2Y@^Q;12+J1Hb_SzlQ(- diff --git a/assets/resources/dolphin/lvl_13/frame_73.bm b/assets/resources/dolphin/lvl_13/frame_73.bm deleted file mode 100644 index d2db4273aee08ce966f866de0cb6ee7c16f2fd76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;w`0IUH3HUt0v2joB=Fc5!0!THbs!@>73ga6~;`%a$;Fc4t+01trVKj3=!DBx55!Qdajdi((*Bro_rKN#|969)bdfA{?QK=C;b z;2x{d4G0v0^k@;_w2J`!fBpm>J^49cLG9-V2}FD3K?lEt9)I9?kH%mRP6_Nm?RZ3| zfF3d6dd>moe+QIs9w$K#h&-T}3Hq#o7S2 zVDg3o#fU)lfP=;!4<{i&ApkP497rBtuzUCeB!A2>=Vu4iI^($N2z|1I%1N z@!)@Bpz=kCeSZxyg!}>HFbA0UgW`h{kt`SR4}X9?f57wj1Ix@0kKjCvLT?ZNxl8yD zF`$FQerpmRp?qK@_t*o-7$U*I1K2Jg^DYR8LGAPhm;g>f4`D!q&|d`-1h@f5FaUe- aKbq(O@CSfA0pJe+cmu#50PqKZJOCg#q`#B^ diff --git a/assets/resources/dolphin/lvl_13/frame_74.bm b/assets/resources/dolphin/lvl_13/frame_74.bm deleted file mode 100644 index 80c1b9cd874370032f9d745d02b2d3e5a094b231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XO~u0K@?RH-rBl2lV_Oo-hCWAHSdc3?F0fI%`J^*<8<6!nAhyb8sQICt*9zVc--~Rykf+voC4=6Z1 zXW;Ul2hM&kAb9^l<9vWef#tA|hs~HE@rM9NUQqCQe}UrGA$h^U`|yGM3*<}^_<#ls zA23f(Et8!A`gfG0pxujh&;YP#6mIketW-4_o9hCXj!@J+HxY@Cyh& z-}CACKX8D17DSXc0C@b`W8ep%q+7%I0+2jI>PZj*2}m9{;C#SA;`0#t{v-e3es&?? z^PmIJW+C#2i^>KcFbKJiu?G*3Jr>055ct5s=5G*uKu70b2cQ5!fETI!X7BU|sBA^%6cBig z1ioak2ap(lO0kE~0p-Bs&%x*5`vQi19VmnY1wRJ}%zOYLf0PIwQvh*U;2#P60yqya z0L&Z3cL#}>OhW*J1K9>Y195-o1u+MZI8DX)2bc9gq45t5gYe!jm^l?9nlPDQ5Tp-K zK>h+`53G2M!2%2)0}!|20sslU00<64k%QaV4?sAO#2%sq7YO|dF!?Y9JO#Qy3OtJ7 cz!ew=Xam3=0PqKZJOSVj0C)qy9suwIfUaV<5C8xG diff --git a/assets/resources/dolphin/lvl_13/frame_76.bm b/assets/resources/dolphin/lvl_13/frame_76.bm deleted file mode 100644 index a83101b12b8cb6f258532391bc7e3febf072ba12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmV;n0ZIM=0I~r9H^cr9-^cz259m0*q2T=Z|Ks5O{!hXAaUcm0pd1VMIb;_<2mS*9 z|3GjDW{60^BM1HjgdXvT6a)DOIhZ}CkYk90&K?hG@H}`BG#HD-p3~!LgT@F_5PJW_ z<1h!0`B8{G zu;B85gT_7$90U#l2nUP|9%btANaUH~- zfbzft&NvTaSp&}immqop!~mE8xP$y2N%RM)96{qd2dw};|1dcJf$u*TqnMx&KL8kD zoB&vZ#Xd9-usmb>0D1i5;PYRN`TzwGdH8ed^Y~xj&|yfk#t8uCH;PUlC>-D(U;)kp z%3=>PNi@zl{x}EV24DREeE9(LfdkL-pg}PIfuzdZ{Ai|7v^`2YquQ4#qE&>n&j2dMm+$hRPVAjBR>^nWPaLE_I?1pprLu`q++UVoLb z1I7bj0}LAhKTwGLfPxPgI6TDyKT8LkE-euUmxJRU4+uP0;|73V!Q}$Lcsu|7{mdRv zNZ{0g;{fJ2ib4-49l#zg@c<4n++g#-f6rtOP`Lg8W&hwT5I%tNzS5>z!)SC9|y)h9uRo9#ti@hh`fs39dI#9&ha5x@YVPce!P2ws5oa*2q6=>WO| z&6Yy*Fu*L&>HsehM8S>#C?SlUh5(=N!2l9MAG@r?77y28gZsb^&C)P79lhZIB~h%pD^6iw(4N&r34Vh@pd{#L{fSQY>_Bl2?_ zG-Lo_gYW@j4;%Pse&KOokUV@J82ETWC_JEd z0C>B^9^7hDF{D+9suwMfII=<4*+-rzy|Gsxb6S| diff --git a/assets/resources/dolphin/lvl_13/frame_80.bm b/assets/resources/dolphin/lvl_13/frame_80.bm deleted file mode 100644 index e0e79f4539a5f4aecf5b91f0344786924587a75f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 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 G!~Xyp3Jezj diff --git a/assets/resources/dolphin/lvl_14/frame_11.bm b/assets/resources/dolphin/lvl_14/frame_11.bm deleted file mode 100644 index 45542d4f21fd7219c46b890efe5b20cfcbc55292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 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 GC)t07i31=2 diff --git a/assets/resources/dolphin/lvl_14/frame_14.bm b/assets/resources/dolphin/lvl_14/frame_14.bm deleted file mode 100644 index f81a46173a9ad01033942dc0c2c05b91433c6c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmWksO>f*(6g{@=V85i2^J-Tmi|WnPp^gPo7s-yr^K?eCodmhY9-?$pA{r$H1VX?L z>6b4vkjHilk;~SC%B!Gqw?}fWJ2e132#0E+$Wa)eI z7n5Hpo1NJP_4mSE^&DV8*CffcIJu5{fw0`Tyycw^Q^CdiJamf0(Ie0EyWF?)|?j5>Aiu!0Jj7rD-w(z~3 zZ}>n&FD5v8`Rc}k_A{et+RXuj*)5gsBoajK2r!(4Qen57cCd0=yM>ED$QyC5-0Vqc znYd8y#=4!_`M^e6w?3#S3XRTJf8%J`E}2m@NQZ1TsL;^P9#qv!42W7jB{in$_Lf<~ zY)I^2q(~C`1r{$IOxd<&-%dVCDFLm3$Mw#Vt{veaCzmz=-gag+>P=;dV!c8y1wwxw9Skb%E_&b*Exg$Ni zY9b3+y@2YkkVX*0gegwkM);!`B|?hvUw%F2Ubc3S%I5v3Gm%x>ZGio?L$y z^|{AC-Cf_5(0p6&aTD)B8>fH#xdvZ$r1&cojau_j^R9$wS#mOp&1vl)F-;fM&O*9cr-shNw+%xUDj13smiPRa^u(dn7qYg6oOis0D zaCQBK1SeG^w-->kO`=rDNJcfmOF8?LNpb2)!rc}k^7dq})?Y8<_NfTjys1Cz_p6(! zio)H`L*E->$4M5;c$B8@?4)VAW(%K;C*bUdR<9h!JvUtxuVNVP@5yrADy5BQ&Hn+} Cp#!`C diff --git a/assets/resources/dolphin/lvl_14/frame_15.bm b/assets/resources/dolphin/lvl_14/frame_15.bm deleted file mode 100644 index 67dd289552413da2c1acf6b55550fa9dc9b947c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmWlYPiW*+7{I^xHYqP@g-lEr?XK`LzN|A@i$y$nkW847B(4zOCPhaNZP|sk{=tKI z_07;ir(UKp74bAJnI%nKs6u=3qNVF)FI8GyDvAd$3VU?VzP{V{_`Z+t_j})iDmpH8 zu%M_a9puTp>!Ag=UK(r{LzaE&+!fzf1{kBreYQUM>+4BNtTYXo*N8jBd~W>WG<=p^ z)`?u-S>BIs<12^kGKPaTS>wGq9j@O5qmN!OL;c^$#Nx0KuvIh0@$I52X$Bp`NnzjFHj-2P|ln~tROcv zp#gAp6mbzzWF%u(x`C2zZe+R=`=^!pfg^R;FT^d|Rt=QSDALBqJAukE5eoanoS{Gj zuJId*-SnaL6qNwBS`=%N(+KBGudVA1rtcp}`DP7NyRcE8=60>dBlm43z zA0(oE@vdrCT+$J4ExUu-=t%Wa9eyOOwOyw-g2C!}8mVyPvF3DUZaR=&a}K3^46zqN zr^hay@U!P3Xhr6rfSB|Ss-ND$Fh3!IY7p4uWd3k<0m_m^{ae8MBl>v$cLYPZLIj}$ zO()&Q6^41;!XGJgiv<}dWHmCU|@Fyz%lZ$^B>*8WWKckTp~Sp&w5ugg7& z_kTTxz@3bn@TKk>AzE?~l!a1MyqS=Wkynwdcb&bq=u_M9!Idji6*w{qGT!Wy^mYd! zmj35pU;bO@ zuns3>Ndbbe_vvN031j#1bUL=OpYJDEKRR{T&iC6k8|EK;VdeS?0F)b1?O;Q!p6FNi zd(~W7V|F#L-=|&EsAPbshV|Q}qqE=Ii~#~M3}h+BwO?O1K;am_tih4HoG5&zDj>Ib zVTL<5McR;GRc2m?0-$KZQinE%NbVp%3{N&$K;b0>tTBXBk`CHY;yz`Erm$mF+=<0^ z@v#JND(q8feIAxcIDNL#&4b+=8E>ZCy=@~7(Tsj$%JVM47jap^ppTR=6C@4hWenQ@ zO<6AZ#!v<6Qc$ZPtT%q#wU|Z|w|GT`XnwuluOpoEpt0ToHS#pm#DS$L$Ev{q&vAV4 zwbe>FIc>0t&$O|is-jXa(j~8mWgtk(@S=Zth;0l4$sqTLczRz}U%}Nsj ztl?<@yXZjP+3R5_oB2coFC4ARf7A4H6CIvBn&f`AQ4x7bhj;0#p?IL^MB)jt3Mb)uTL+``-%! z$?(tTpva!r^fwp&Q99_fn;3+9t%~!p=Kn&Czi(l1mMYBnd)E=H)!~d-GfF7o$)9r>{O_I{XNF?{DxlQC&;V$DT zs`v{reP`%;Ka{=Y>KTaK*m;V7k C+7GAz diff --git a/assets/resources/dolphin/lvl_14/frame_17.bm b/assets/resources/dolphin/lvl_14/frame_17.bm deleted file mode 100644 index a6e7c34d904bd9744c7b8f1ac71208011726ab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 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 diff --git a/assets/resources/dolphin/lvl_14/frame_21.bm b/assets/resources/dolphin/lvl_14/frame_21.bm deleted file mode 100644 index 3da0e896115d3a5ea0f9de680e9446896fc3862f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmWktL2KMb6#g{GW>&V#tdL9^C}@{is-4CVOb$Jcwla~_hK?17ltK@Mw)oHl3Zc|J^-%gts?6=pd%X9(@B1E@1@o9nIw-69 zK_&+9zBs+~ld4MW`1=r`vf(v%_L~@IaBKiNv_57Qi922r`M}#)liQbVt}bkLMOI8ax(?99Ej3R#nSFX+UJ_fwgx(w)*2hBwg?X7`*=!}l7c-7?yTHI^jb4PSqIo8}ge{y|wh zTD;ZDRj0fi==2C)=iFvdHW0pRHTXTIqv1ShuhDEb4LtiJpg0KFzeRgDb=`q~2e@}F zj;b2<)gJsL04XclS93m0FJ^EUq`znjm-N}QgpM9d3AqxTY3>ZvLE!oIzOotfjv27B zo> zv`6E4m@LG;5&Yh($(<{U5Ue2cX;IT#TF3K(H;eEYX@wFxYNo`XA=t8KZb$X}k+~EB z;(@R|YDjOPx-(_QP`TMS5R9g;!p1ctd@5YYYlBRFVCi(Kki}6a^@;3ON%v&cjQyMS z+FU4#r`+ys8OZaKh-mF~37Uw%d4G|bMEkvj`t?mblcKSU0CjmJ}GdH0Kr-WD)i3s&UU zVh4lQt++nF4C9G?U;BcKVY%qRaJ`0Z3aK^x&?TtMtE|vCPejpMRs^&~EGamOIlmCx o#NsA9OO0UZk=Xntsq)FgHlf;Au;L_Aj`71}reFW`_M~%LE>Y9dPv^aSd zEjnQ_SC@aEK-@HeI_CGTK6l;5J0@is1%n)Arpo3&p0Kryvu5+Bsb&;@ zc;UP??wAl20_Igs^3q591pI&eMeHw@#sh1aGC(vCcTT^~;O>eEd4?X=P& zw`{RkkVhGn48X8Hj+M^7vpLOtzv<($oy}QvOQ_*7A=^7CIxA)!E$BBpPx4&$IkrQ~ z?@Q5sFrxH_*8%^JVf>v>re(?Xjmo~Qo;|!jklp0L0EVd6sk`dsp?4Pf0A({Y4l~zp)2QvTQgkCSJ{_5FsKpD9VDPjQ@ zDGE{ZAzx*>)h3+IMATbTgGNqWXuR?_8O=C{{&vfiFYY4Ee|3WEQ79Lgq8kzT-jZv1 z7vj9>4P_=%H94Jo&-vQQsc|CGD9Lt$ekCI55N2w@aDt3O&60tX%us} zVkPD(V5DpeOXY}4kcUwRi51nNPu#YREs0YEuVwvrEnB5c_)U6b!Xx6_@Ph6Vw4t)J zDDF?5p09*V@rx#e9h<6n-1$^72y)09=}?Jl>!*+6;0oq#%zMAjyoZa&oAa{LqYOyR zNLpG{x}ti&=J9kddJile?y0N7g|1ZBmV%jCIV)@;h0@o)2pFx`)m0f1$l;yMV~nDC sTsobCVmWZ51BVl7j5M+d#yj;^oDTgZFHI3{fCZ8KVx56h)-K9_0bTn5l>h($ diff --git a/assets/resources/dolphin/lvl_14/frame_8.bm b/assets/resources/dolphin/lvl_14/frame_8.bm deleted file mode 100644 index 8e230b675080a51713a4bdd0b1c9d29a995c6506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmWlY&uipl7{|ZwYci(U7BktIx{e;+jET%-sg&Xm6ohn4mn5!|iOD#05o=L!hwaV1 zC_*|rh1r3HPMq$+Q##C)Ns59?>#|;4dJySpEwn4U2R*nT3;qd$ndkOAUwFRH^Wk}r ziV#8(K@jLW&Uoq60SeGK zUZmFc+o8MPfSma!#H@9FMP2jXcS zFxcb@epgVU)U&2MT;;>vh@-;&^nf&q2$z`Ft0{5&wVge+DjMqLxTpT!qio_;iE{zi zF*G}zS7#c#e$rwzvWV|F8zki4{gM=6#8JClx&Pp{PvmrkGb9?kb6u{Jg~MFujXViM zOEAlyo66G^l@=+744!?N>~`I|&o3`j2~bViL!_kBIvhO0I`WXVEoe3x8yC|CK`r7; zS(wo3AL-G-Pc*weV{-sEAC5K-uZ?+Zi!&1*-m+YOJiL;Mlz~xZyS!-xpB(P_U~&f( ziAT7{cNUx?Tu75i!6mGJ(Adx3ry?5}(x}#%o%}m&@$dz%aPzD#D?gr8-V7)vBEIm( zX^t~{>cQC&tU^0Cv)Z^9hwI0cfbf~Q&0Z!0K9UB3cl1>vx^r#L|5QgnhK(nGIy8>D z33{WCs_8Ht{ugK;7uOK5R47>jvoci8y)FZCd(KI`(V=ErW@`X3l$7+wGX diff --git a/assets/resources/dolphin/lvl_14/frame_9.bm b/assets/resources/dolphin/lvl_14/frame_9.bm deleted file mode 100644 index b569be2857d41d69d944ea491dda6a2ad712085b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmX9-O>f*(6us~9EZMIhy)iRY*u8P>;y40|Ap1AgAZ+vHxb}3UB9T@grHukzv>O)S z3=?TOD$>+)Bhi&7%z$kgL7^#|Esp{;SrIEYp;6&SIPF`aCDbLNT1*D6@cE>!lh&27urwU=vkhD7LoF?3^1>Vd*T<%V z)F;u3#&ke{xHo8^H(NwX|7EUfcpnA zHM|+3Y%2nbLofa8%G|Q{W5e-Jxsq^Lb9DOFB)+#M>5ycF+$m%)B7tWpkwG&k7;5rqFYY!g(%cIJ#>H&mm zt^?W`POE#(>mngxp>~bg<kz4l(z5NAZw+Sx-n1Z z8Is@5r`a70Io|D5OFarmd-z?Bs@{?!J2HnX^Yo$zA?~`%^L;zo9u8P8LAvxkt@l~I z2(G!_5(YENy_~((!cDrFRR1;mXaT*gv0>iN9DeudmwpyTHFwIeNo#6&`Jd6N(@vYn LTe;1D&hq~NKmixz diff --git a/assets/resources/dolphin/lvl_22/frame_10.bm b/assets/resources/dolphin/lvl_22/frame_10.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_11.bm b/assets/resources/dolphin/lvl_22/frame_11.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_12.bm b/assets/resources/dolphin/lvl_22/frame_12.bm deleted file mode 100644 index 42a5184d671a08042c9b29aea0d3f11e90868293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I!p03QPXfII=<4*(Ybf&?h|{=7a=7{kHy;JAN)g9iu1{=xYBgYF+N?tj7q z0|kr_9t&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_13.bm b/assets/resources/dolphin/lvl_22/frame_13.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_15.bm b/assets/resources/dolphin/lvl_22/frame_15.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_16.bm b/assets/resources/dolphin/lvl_22/frame_16.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_17.bm b/assets/resources/dolphin/lvl_22/frame_17.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_18.bm b/assets/resources/dolphin/lvl_22/frame_18.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_20.bm b/assets/resources/dolphin/lvl_22/frame_20.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_21.bm b/assets/resources/dolphin/lvl_22/frame_21.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_22.bm b/assets/resources/dolphin/lvl_22/frame_22.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_23.bm b/assets/resources/dolphin/lvl_22/frame_23.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_24.bm b/assets/resources/dolphin/lvl_22/frame_24.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_26.bm b/assets/resources/dolphin/lvl_22/frame_26.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_27.bm b/assets/resources/dolphin/lvl_22/frame_27.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_28.bm b/assets/resources/dolphin/lvl_22/frame_28.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_29.bm b/assets/resources/dolphin/lvl_22/frame_29.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_31.bm b/assets/resources/dolphin/lvl_22/frame_31.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_32.bm b/assets/resources/dolphin/lvl_22/frame_32.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_33.bm b/assets/resources/dolphin/lvl_22/frame_33.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_35.bm b/assets/resources/dolphin/lvl_22/frame_35.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_37.bm b/assets/resources/dolphin/lvl_22/frame_37.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_38.bm b/assets/resources/dolphin/lvl_22/frame_38.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_39.bm b/assets/resources/dolphin/lvl_22/frame_39.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dd04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_42.bm b/assets/resources/dolphin/lvl_22/frame_42.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_43.bm b/assets/resources/dolphin/lvl_22/frame_43.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_44.bm b/assets/resources/dolphin/lvl_22/frame_44.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dv&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_46.bm b/assets/resources/dolphin/lvl_22/frame_46.bm deleted file mode 100644 index 42a5184d671a08042c9b29aea0d3f11e90868293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I!p03QPXfII=<4*(Ybf&?h|{=7a=7{kHy;JAN)g9iu1{=xYBgYF+N?tj7q z0|kr_9t&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_47.bm b/assets/resources/dolphin/lvl_22/frame_47.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_48.bm b/assets/resources/dolphin/lvl_22/frame_48.bm deleted file mode 100644 index 42a5184d671a08042c9b29aea0d3f11e90868293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I!p03QPXfII=<4*(Ybf&?h|{=7a=7{kHy;JAN)g9iu1{=xYBgYF+N?tj7q z0|kr_9t&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_49.bm b/assets/resources/dolphin/lvl_22/frame_49.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_50.bm b/assets/resources/dolphin/lvl_22/frame_50.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_51.bm b/assets/resources/dolphin/lvl_22/frame_51.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_53.bm b/assets/resources/dolphin/lvl_22/frame_53.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_54.bm b/assets/resources/dolphin/lvl_22/frame_54.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_55.bm b/assets/resources/dolphin/lvl_22/frame_55.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dd04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dt&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_22/frame_58.bm b/assets/resources/dolphin/lvl_22/frame_58.bm deleted file mode 100644 index e66ca8219849ec2bf27c04908295c67256371633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?PdX05JmpfII=<4*(xWwgVV={%`*PAwj|Mf3R)g|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_59.bm b/assets/resources/dolphin/lvl_22/frame_59.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_6.bm b/assets/resources/dolphin/lvl_22/frame_6.bm deleted file mode 100644 index dacc6be35193b5d523a602457ac67dfd94a69c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(cl03!nbfII=<4*(Ybf&?h|{-i%(7{kHy;P`)lg9iu1{=xYBgYF+N{(r&) z0|kr_9v&_Gn4j6Vn%lIs85#Sj7 z0p)?=hR5I!CmD03;Q(2qYwwUxa9u`dfcE4 z;s6VrNu&=L;6CRZ2w=E@@qdm`AdvulPr>91FnmTJ5Jg#F0q-A$z%Y}*c>|6CvYQ5fHNYHoeS}S z{{G|q7ze;!SHO_K_tX3b`_Vt~1JMLO3%wj*D&fE3ARj?^gUk7eAQT_{|K`B|!SjLd z%jJND_&@vo7(DC{Fd+lR1`iwij78<(fWm?0pf!pFKmr;s1_lZbFF{0s>%eau0y+0r&rB pkQmZt4?sYJ_6~axGK1LCKfrzxL=2Pgd;j=g{s1sPz#ahb0RW(&`Q!iq diff --git a/assets/resources/dolphin/lvl_22/frame_7.bm b/assets/resources/dolphin/lvl_22/frame_7.bm deleted file mode 100644 index cf189cb368ded2805b58f81ffc94acac3949439a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_>d04oCjfII=<4*(t<22=6@$iz!K7WWQILqU~2bcIBUI=+uS*O4im3SU;{=hu( z_zVa=a2Nl0IKQ|21Oz}a;Cg>S!+-c+_z(bi!Ig*nFB3FCA`gLaSHa`pzygFH9`Jbl z0Yndrz5*xU2i>OuARmYTU_kTi6Ut~j93Vaa0rIi|hd2+b{m5)U`>|jkST*?r((q6j z{Q?09{sYJaLG+)%C>4(byr3rotbD)m@Ob7tV4@GJd_m*Dj$fNZ4@$tiLFG@sL;!*g zI0fKi}Q|4FkY`!9(~8j2`g^fM2ga{$vlp4=)4+3OQkb|GNMD$UV9cct|{Hm+$=U z9K;oP;35CWAwc^H5yO9h=NG;l4iE4Lj5|1 z4749G;Bi6#;tzpwU?zYv2flckKw<}~pi?3O6_|tW9{_y_0Dg|q0+`@D;PRM$6Jiffc&^5ULkGWO@Bh!kje^Gz zdu{{ckAi48Nbz5Yz3K48(C@+JKqs|65eSLL8|8opqWnq20Q<%j!VX9Wus|U3jB(@a zq6eq=z98}VKx6QT0Qmvq{Rf;tK1m}04gP))DTcxx9T|W)@E`x*?hY#-fPAMA2r&?$ z|F4`pG9dEc0EOsZj6eJLkGQ}*6Yx;afrA78|FEB*)PBYZ75Q8MqkDnCa25W%{;ZV{ zdVjE`0-yiC{OAw#9$W}1P=Vto;eYq_79g+3frE#G%7F(t5C7^9H+aCo<=`NQFhB$k zE($>X5FmPn$Rr>Fu7HFebx2q~Kt+(31jrun;1K@=W)DXoz$3`QAs9UmW&UdjRDtvb zKzl049zyvCkQ9ORr%-%P)ann5{0o3~V0yF%z-C~3{07Jmh#&B5fcOA29D(=%@CSeh DuWkkk diff --git a/assets/resources/dolphin/lvl_22/frame_9.bm b/assets/resources/dolphin/lvl_22/frame_9.bm deleted file mode 100644 index 42a5184d671a08042c9b29aea0d3f11e90868293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I!p03QPXfII=<4*(Ybf&?h|{=7a=7{kHy;JAN)g9iu1{=xYBgYF+N?tj7q z0|kr_9t&W6{EJ~07#1I`16|3L5;@L1R* zz%lp(%L9WJ5Imq0@DTa|<-za+3VaVM@Cbgv^OP#c7EllIc|Z0a0<44Q_=ornCnNYK z$kssdzwQI)Gw>IL9-I%DIRDlE1P1{D2d3OyRsYm~;0q{2vEl!S{lFAafP2aQ5c}Xg z|Af;AsJ#K_IN(D!0s6nkC=g8mey8B_z=P~iFi$wXqwu%}6Zju}U_7I`4ljUT9KZg4 zArOOq;2@#K3)>$0EyNAJp!0nUL)|b16c{E@4`<*WQVeu_6i^`f-vj61$;bErp$`~* zLFq7`14jT-B1r?z!C)7RBj64=27De;0RYdyL;gS>10Ihe;P5Ztq5MEE07Ah3|8f2d z1KHY)x$e;Lu=usbs-V7BV_Im$>2ao+8f5=IQa2S90|C%QddEvLfLcl`( zAN~G}9w)+vDGZ8V`~R%SAo7GkLFJ%;=mCNNC1GY52WSw8J>v=Uj)U3`4_!nk1|au{ z0ER)`36MP+f)78$EFV_~X%LJahqC-YcmYxev%o>(6+nC7AYk%q7(GEF1^xr=pg{6l l7(Ia^)DV571uVe!kFC%jH}|-mlpeqZ2l<$R`T+0;fCzwk`ZfRn diff --git a/assets/resources/dolphin/lvl_27/frame_22.bm b/assets/resources/dolphin/lvl_27/frame_22.bm deleted file mode 100644 index 5a43344a55a46cf325d5b6f37ad789ddb00ceded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmVAz8!&A{!ui2MH+N0g?v^2&(-DurSc>2RH~2kH!yR5P=B%U_%Wh z0uG8$dQc_><5eJ$3u_8&pqdsz5j~NxW)t#xpo|_-2*d*kT3#SfWDuZva3C=p;y}Of8^An3 zf_EtBK|$#NoD0vf2ApsrrUjG(&uAzpcs*$lN+6Jd%bM6%%GM5IPn`O%vcTr5j>Ft&AfO32|;isV-=v-;V^-C-~uK~Adi2uG5`Po diff --git a/assets/resources/dolphin/lvl_27/frame_23.bm b/assets/resources/dolphin/lvl_27/frame_23.bm deleted file mode 100644 index 7b8845d8677a3b78903764b7dc332519e70c1cf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmV+`0@VEh04D+f7q|pG2n0YK0I`Dr%0Lf*$lM?n2n_%q5Xc4s2Oxmp1&;uM0Ehhq zfP(NjE^sK2J|H0SehgsVfb<{`G(dz8a>+MEh(PwBfQI0oaCyW) zLkt8YLxKN4t^hbIQ;0_(7~pys2SuG4EL-jR~2!ZMdBqBLf z6fl6O;3MxvDUcjw2eFs|MBHHY02CN#CgcJj?IDKa2bi4QVp$c@0}uo|2smWofcS$p z$R0cK(@+Wm%pe*U5`kb%CjyK>FnM?j1q2Qa;}tM8EPx(RfH1(J)DU|K$`H^W2b_R| zk&r<^#Qq$_F9Z);0<1`d1A$i_2q+RV7lv`1Dij0p|A52-#~zSOgG3b=8ytl~2pPnJ zg#dws20q6ugb2o12?bgK4iFOf;6^flPHEBzbTE>YfpJJI5-DfG2=PJCz#$+(+()G! z2q-;e5J3TbATthxR35Z~F+?j(qKAXkcp$Qx0LlyxTp$>!5V!}x&LH)IL_lMpX^a^( zAO(U*fMd}6@Zcn2N1y;`pds`%N)Y!j0a&pL@dl0p15i5?grE^Agc?9eIRpe6D-(iP tJ`nsM9JmaTfOr7q0l*B%aBV>V3>a`Q3^>$=1}r;(JYg_`K;Tb?Paq#z#*qL3 diff --git a/assets/resources/dolphin/lvl_27/frame_24.bm b/assets/resources/dolphin/lvl_27/frame_24.bm deleted file mode 100644 index 7853397a7cd95ded9b1d4cdc775321749fac14b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmV+g0{Z;{009C34T1phI0s#;Be{c{P4@eAP z0~9zt$r1olM28d};(vXD%TjX)L)F!U3!dq@L>=`I6g zOA8=TknE@wLV^Rx4q#z~Vx|W52b>^4QOXE3$0Y@Ar^EgaKmg1jz(Tk{@sY665>6lo zNCZZ>=TH0u9*}AT^LYe9lyQzR2pAlvk_idW_yD57V2owJkWk(t5D@Ty29OUp1m>(W z5O}E0Fds?fT0stQqyljQ8Wh5NO!!5C>nH(~LdgTPY!K!EDgaob6(|LRp%Z8%0*C}T zA)KM$^}+#)ksAk;7#^@lhzxX%G5j`+9+Ds!^gidI2MK*}lu#J*U>Cq>fCL_rEJ65- z!aosmz#~xzG{BNj8o>Rqau38k6k;&|3>*ef8UPGzNpl02fb38lI544t29E>A5eR3F H1<+wKUhBSL diff --git a/assets/resources/dolphin/lvl_27/frame_25.bm b/assets/resources/dolphin/lvl_27/frame_25.bm deleted file mode 100644 index 09ef56feba9a1f87b167d77ccd3ccd60079ad7e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 zcmV4q!Ae z;CS!|i;w{bB!wh6DgYp=0c8h>#EOPbSKNc(mP|tjxDeT>4{8K`UZgV<9KgyY;|G`> z2V)KmAU(xn1SJqL0p^n^!MMTeo`;Z)fItMG7zV&OGVz-Zz(W&}=s95a&=Lv;LLmAU z3qVLD(NG{t^9PaK;DBMYF3d84ay6bgAb|0R4+th)3Oxl-vjBO_AQ{QYJtKkfbD5lA zckB=xzYqvKLk1=~1mpM~FvnkksH1WP&;b zj(7>>SRVoNm`rMx0DC2pkq@SP0qrCMA4&mG=tP0Z0HOg7SOOe`C?2>*VNfGwB8LOk z2@wH~f(nWwx&z8Y0~&?R6e!^*uZoT;9)t(X9w2(mp%5Dc(cnPU01O%-1dJ4i0Rf~y zgd)Nx5Xe3dcr%FLAkj4tOk3q(1DAsUb0+}cAedm89?fun2nPZXPY|HM!DS2q2veE0 A1poj5 diff --git a/assets/resources/dolphin/lvl_27/frame_26.bm b/assets/resources/dolphin/lvl_27/frame_26.bm deleted file mode 100644 index ff8754c592aea753544826453157de084c610ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i^|000623?c#GfJh)T0DM6JLl1yJZ~*v#fQRt`0uTX%4iS(Bk|Y4K0AYk%>kI=ReI@{c;7tYyKS0UM zEN5XDkUXLo1OdUYgcJvqBESwW05IbK^nyhSX>b&m1O5*l1RQ)p;SZcbIRM8SmK;DJ zF+kuO0a|bXq*N+`JzkCNN8$7 z2n=u%P=k5kCzWUf7#=30oCD6`Bdb^;%LQi;0DBSYXTmHGSs)npPz%RG43AkL5ap$z z*hYcs*E#?!un^#S;Rpqwf`iCj&`AgkdJ|{{Is#`f0eF!kfb2kc;NmZ=$!<0WaK-_o z4_I^}2^fYv1V}I;g1iUe2PGJUKnnqo0LH`zATc|LOfX(BAcg{i7rAg61Hgo00ONsd G8XSOo7`g-i diff --git a/assets/resources/dolphin/lvl_27/frame_27.bm b/assets/resources/dolphin/lvl_27/frame_27.bm deleted file mode 100644 index 527f8128b45da82d4063dccb9a93297cfd10e7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmVu?Q)EGj-fI#3I0D8gD$&djL z0WyG7F9{&g=m>Cp3drbS_!W}P6YK;v>4eA>f<+O;L&0%97(Ewh3_pn78EzXGU>yL2 z0w2T$8c>OVJ|J;`F+>Z-5&Imjk{J zalrtKfg>0o5JBe%3k?DcP(XOpFhKH0jB^w~K%m4ZM#YCR&>mDUF-9OC4?hLA!SnDy z@zb(-;5+bfvfv^&;yFMr1hfDQN`$wf1%kjNjq-qOpfrzwKJ6nB=tYz3L`W3^ zBw{E~J#dV2&_hAx4hO6ff&(6jpnrzMWgZR#z~p@Ja5xGb00T0DL8cc(D8K>2Us`k_ z_$DE+16Tk!BKZ!905Bnfz)R)g1C&An-xkTic;-VZmH-An;1KX37=R$)U|}*L3;;d( Bxy}Fp diff --git a/assets/resources/dolphin/lvl_27/frame_28.bm b/assets/resources/dolphin/lvl_27/frame_28.bm deleted file mode 100644 index 9ee0fb052fcb98892663272c287fd2a275830538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmV+g0{Z;{009C33=p+XK4~Pf|eh?5L02nZ!@d&*DO&|o26SyAbVgMvSAAA6O zfEU34gafb10|&A>p@1O|vAJM|&Igc70saqG+`$*355;K%-e7M?!SUddU_pb3{y_7< zAP&K0Vu(GQ$qwQLL_|XLW*i2P-!F&%0uCT~!Nvj)D0BlDA6dikG6Nyd1J%|o^QaHp zR!{=)h>RYkgE|mC1|+=@d;kPCNJ9sZ0Ro1-FqsLB7&G*ugW4e&z#GKkLHIQc7>W2n4`PQ3ufg62J@*(ie;pas(MfK*W(C0%!#U$tN+X)4(fR z0;yl*3?LC`JK*#bj>80OA>l~Igbzv(7?oq-q8JbeF#vgih6RcsAUvpGVlk9){%{LI za8C#DfqXpl6nVkm(Sb7Ir)2Y-3W@GkXD6tDhY%M@1i$!SCeVNekPkWpfAN60EbzC zUOocyMIzj=6KDAJ4`cv3BHXkPkQn44K=r{P2sU^KaUj40;((b)(f@#dumbj(K#1dX zfO&$Vmp}m1p@ji)iljlpUtAe{g+fFSXoJ=QUoQ|Gxey_OU?8+{y2J|Qe|Z!m5F;pS HNU#7g|1HO3 diff --git a/assets/resources/dolphin/lvl_27/frame_29.bm b/assets/resources/dolphin/lvl_27/frame_29.bm deleted file mode 100644 index 15853c597a51f9ab733ab3a87d1d4c839d2d95c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531 zcmV+u0_^<(01pBH3PK0pU(5FMfb{3eJ!%Z~^i z=KvnZ=HNub`#4g_T>ymy57<78=nqn21N{Kt_JS?dx*+$K3(zWp^nrp7B0v%m1I~yO zKLw;(F@So-2OkN9BKA=N|2e54zYQ!Q*U<2fvAen>CA#nT%1-3xj0uVmY9M-87{bUUY9A877#sj>q6*Rnrhx8BlL3-l zGy;M~l9@r}VB#;#Am%mdEh5a35_AadY9;FE_r;UIC({{#+GfDpzA=MKPN<3Mv-6d*ox$^_#0 zp&}@N#}F4g1p-C5f*lAHR6{CL=tnUQ3@{Q<#bH1^7s})U4hRv^%LB)_w1dVB7%%|E z66bV>)+`XuQMy1dcrdX55}ZaT!(f)ePh1!7fcnn0s-w>m5$mjq7 diff --git a/assets/resources/dolphin/lvl_27/frame_30.bm b/assets/resources/dolphin/lvl_27/frame_30.bm deleted file mode 100644 index e91e1a06f05da38c94291c86c8d7186176f0648c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmV+s0`C0*01W~F3<`ocsgW3r&2qr-I@JTTJfJ6^G0s$r>@r(o3NDe*)tU4g} zickQB9Ku1)dFK;{k^Q>--NG96J0DkZ^;?>HmY5r~f~L{y*n205i^@& zW)ES|fE1wT;s7I2&%^*j1B008ApSTqIDz<%AOi#b0-k^Z#6j=(2daTp#1Hj^7>pl& z@{tqd9z6z`8|9!;<$2%6Ob;p3e8hs{PJxG-cL1Ih^+ zVbpvcFbjY_!6jgFAU<#qQ364XCNDSyP#%GC2fg4NybyarIRNxPApGJS2v|J$5H*nl z&H==ioM0Yw4kpy%g98tv_)aFUL;4B^Y#uxK{je5K|7=Qd6oE(K0Fsh_{qS+QkKSS^ z8`%MY=>!xHb`OA`kBA}K zAOtWtJ>HI<5Pq770HFVXtDM?k`@e(LK&s;h+PJ_9uuy%hj2~ztAINlnCL=$L1!SP{ zx)6`}*b$nKN)+!iIE>UDQ-Xn{&;UYlj^G$<4`D#Snsg5$0t4<)4`1Lt`~dZy7*2i( zH=_tl9+ALu$A~3Ahylh4Fb5(*1L?p{h&=EA0DDLx;{^x1%@ishUc4Cq;q_}9z`h{% zh=2cP^dG)Q`@e&M&+rdp$xl!W4@@ASed{tu#6!XV-^WF!-&h3zQbGZD!X;URe}qwQ u!O8!ZgVc6n1P8G|Kny=)S`X=ZVflmu_=7q1DfLi diff --git a/assets/resources/dolphin/lvl_3/frame_17.bm b/assets/resources/dolphin/lvl_3/frame_17.bm deleted file mode 100644 index 91da198be54656b90b67990d32bc3c647339b92f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}D07U@+H}n4k2lN~t(C~kQ`Z)lC1MB_&o`>)rGw>k8LHB=vd_Um(1_%sL zat|y32uyMdAO8ddG4Or(z(P|XeEh&dQxF3V%m4QQkUqc%0SEEH_yGSU2t6R+_V5SU zAmIN8x`Eq55AXu4AMg+F;p9X}4~9snk)Z$ML4Sets4>99cacnJkU<_}g9&jIg% z{}`M;*KiPn@$x0204H!BWpU^@-{>JTIS?U=VDkJBEFNA01CP~^G4Oj&3t|sA1^8g^ zA_t$qV8P-SrU1gk_5csCK$s8z1Rk(20D)p20Q(FC#HsZp7yG_3F!2M>PGb@ui9PH9 zasL7Y++g&;d_O<^{2W|?^`DB0Zk;dyrkngRAaR4;@<0U_p{YUkYd`^C!R$aV{frzx b0~QCQfP+E)2g>yU^iW`YFHj%g`e3vKO5v0= diff --git a/assets/resources/dolphin/lvl_3/frame_18.bm b/assets/resources/dolphin/lvl_3/frame_18.bm deleted file mode 100644 index becbfe3b4c73d8f8aefc5591433eba389a20e293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmV-S0ki%A07wAhxQM& eS&Qh{p!!a#y@B*UaQ&QZ-hlovTKyI@5BLZfXOWr! diff --git a/assets/resources/dolphin/lvl_3/frame_19.bm b/assets/resources/dolphin/lvl_3/frame_19.bm deleted file mode 100644 index d93bd32e2b4e8797c37635e92917f72326a3aa31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T408Rk_H}n4w2lRX&)6joTLH&CN_527hKz;w<8~_l5?gQ}uz`^$eLD)RN zLq7+{_!u~F5R}LtJn#^dBp%QZeS5*=V1QWw4h|2W=s&+;^FTfTUeWM>gV~fI1yDFY z`~acxgUw*z@f?Ug-$Hp85ilSgATj&{>+nb*n6xMGcp{kt-vWYL z06s=f0Pq9O1MwXgKDVE@oA@AT5`n-v3^#}fOdc?V8;lShC~+V-K9m!O`@ zfdh^F5I6?;gU&&K{elImBhnYP13m~E+xG_%y-o_$8=5H~=9B s<7q+oTtERpf$adFgZP5N_Xqet&@K=6dZf%h!1jQH-5|j6UJyQ@V7qpfO8@`> diff --git a/assets/resources/dolphin/lvl_3/frame_21.bm b/assets/resources/dolphin/lvl_3/frame_21.bm deleted file mode 100644 index a730668b4d450f643124c352c3c6197c763b3e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmV-q0h|5-0AK+CFT?-;frI=Xe~q36!Q!G@;66x6FaeRl z0;Dovds_7~0}s&_Km<4#EMXo9I#K>0 z^Pq4@4$?DWpkv?wpiaWT&J143_xjgZ2a$er~Wd z`2*4+`~Ut*L%_$U(7<4E-<-$5?=X7jK>|?{X#?9417#1~8esLnasy?*A&7oB1GDaf z=g3h%cs_0l5+5i%XaFHLAU()v5Ac73lKv0ze}mw_!2buFKpt(>00?=({{Z|C_#WU1 CTbt_u diff --git a/assets/resources/dolphin/lvl_3/frame_22.bm b/assets/resources/dolphin/lvl_3/frame_22.bm deleted file mode 100644 index e5dee4c6e9162cc278cc621ac07ec793dcb7667f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmV-n0iON=09^q9CIkQfkAv^P5AT3HXYdFRK7WAof&=IL4;#z^5djClIDhxBc$V0_ zpZoj*ARdkYJiq4c2a%9L`cxPh`alDL0Sr7I-+)ku2ZE!Jc>o9EV=#Sw%yK_K0jOC1 zfCDfQO$7oESU4z1X$~1MJij9~87Q#6fiiJ20VoMZNC-V(6YzTf0p<%k@IH%&_)*Y2 z_zqPEqQLMCRX`{t$P3{AkW3PL0fLB8IFYujgVW#zLb!wAqMQu)J^pOMG?&KkHi`i~1gFl=c9)F-X?$Qho7$Ye~1~DM|3Jw(DPndd{{Q$P_lQ6PBmh`Cq`~8W2f#R>An_1Dy^D$uXn;J9MjwY;1JVQxAQ==K z9*?#c*gpy6aB%zs-P}L~VGsb`#t-m+gZu!D1~0%pgXn)SeTV!X@&f;Z{2wOqO5&A5 diff --git a/assets/resources/dolphin/lvl_3/frame_23.bm b/assets/resources/dolphin/lvl_3/frame_23.bm deleted file mode 100644 index 4f5a3813585957e215848723d1a16f4ff8c61854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmV-%0gnCw0Br#PH~I$%2VaB#2bcrz@&AX|0r&s^$M68^zyrpA0DzCI9#A3m|L^b! zFg|~P^M)U29zVDQ;GKW}oC3iF2fqLwU-$>W1SRPJ3!GY8j< z=4a=hm;;0Yu6J zyfmpme*>L^%Yf8k0xSyw9tZ3K{KIeoqYWZp`uH6P9|gkT6$l?>kvO9bK}YyFpgl=v z;8Ku21O|05c;UhE>=Kj-Vz6*|-%cu_FnWIuDSUYuX%9jbIpDnk=lu&fehw!<@B`fR zClmf~LF8FaN}Uo24{f#Pf+eHR44 zKm+}Q+W`&_>;ilbxOgCbfc5)>+X2v6kbe9H1^)xz0R13*!2u(C2dD62koaN%f2kF4 zpgg=EVW9{Ne!+2{v?QKjQ3s!b1|T?mAQC<2D2yN;ebFg^2jDMdfRGe^@C?BL3d7?E zq5y!xKu^GZv;bvKsHFZx15Y45Is<|)Frh<4KoRMK)`5ZpoBlW!f=OTe0OSXdU}umG diff --git a/assets/resources/dolphin/lvl_6/frame_10.bm b/assets/resources/dolphin/lvl_6/frame_10.bm deleted file mode 100644 index a282f8c9a677cb037602550e5a6fe357393483db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmV-M0=fMG073%4fl>tkoB@yF|NqCp=YW8~H~{v8fzH4KAVGu3G9Uts0LWl|0C<5) zAq0X3&K?hV#3}{_DF?t}AoYu4hG!svLJEQpNRCJzbOE@7*8vdG1Jptw^q^EMNHhqL zJth?j5{)1!QNRPv5y)1EeBgKp5It!SKLS**0MUX2(g`Sm&_BW9gNa5G4`>l2VC*4M z3`8Eqk^m4qd_erfKpm2%y094VXPq!df7EiHZ@xhXTk*QNVj( zE+AqDl>8pC3W43T~#;ITH8A}|jc5IkZWFT_2_LotFC2p%yB1QYiMfWZOf0vQYfL=PGS6Zr>$ z1H^(bCfL9tfb;x7!R!SPc&Ek?au^^iNFrMjfWrXg2~vnXh++j17{r0&2nVVRf#!N3 zSb@bnVDwiIEN6i8ffY_f4;+Fdon%fBdC35Spa---6e3Zg4Fn!sANV~KWDhF<6lfsg z1B&!PWggqBc17@~>+Lp+c@T>>W| UA;=ZNj4CeFa$gRFwi6)0C|bZ z1_LN`0|8(Moc;kA{0`6IAHZ+{=1v%-5FT<51RsO(CnQWBgwcXgU2{dNQJ`yvM2|F1rW?9QF31Zfk)s{4Z?L9 zC-4smxK+s6U;#oX0QE+oKfnbLpm+i3okjt(#2?rIeoz)755RE1f586y1I?PO1A!a} zABO@5)CvS}Abmj~hXNxIK41m`2h<_5Kfry!F%S>M{2ucFdBFY?^)P|Pa0@HI45Cnf z06iywviKRwFAv~H!RG|{L*O0&cS`9t79_6>9A>P=I*E2%;G?0VWC|eh0u9M8XLcNXQFifCrQ! zKo$^qx~cV;x>q&g@!vIK>!Lu5Az{N z69^Ao5fId<7$5<80qPAPdZL8rK=Z&0)Bs@ffnXuP_+b$=wj%`q63CIGfZ$Jo`VbKT z{~U$~C`AC|B@=-G337!&fWr*t1S3in1_C!BAj}gi4a>A}8d8U@;JIc~}gC0XHNffe8E>g&rwEz=O^Q2#`S$f*cqa6nsGQ zfWaaPK zkU;ST<2#T6XaMwpLy4-eC=@^*aBzG;P0@Zc~!Ab7*% z0kW_+Ozt@BBe-DT@_}R^a1Q}oNy7+t2t430h~acl<6!V81|I{60)+BD0HDy|8V?FU zSE3I{0Kja}2!|R&@Lq^KOd|pam9hZ{@a)?36gv^!yCW218-sgV2V6 z^nk;`?-2o%5TZW-b6^re)DU@KAYj6uFv(m%^8tuFh@{&fc)}j#7!{NP4%;wc0EzTK eQJg>=CBO%u6oNy*fw)V+97Lf<0E7G(h&(`2TK$gz diff --git a/assets/resources/dolphin/lvl_6/frame_13.bm b/assets/resources/dolphin/lvl_6/frame_13.bm deleted file mode 100644 index 09fb5a6eeafc5a7bf7e71ec768376649f7dc62e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmV;D0&V>P0FDCxfCdi$fWI~c|a$C zA@Bp&!5^Rt4jvD9{~R823xo@R4_*brKo2?u5(W-U{K9<@2bBVW9EX1a=U>o7VF2>L zP$ZMX0!!==h+sVM6pz6HBkAFdDo+ED_z)5=0D(q9#s0xWcrgF)JdWdm=zqcE0f9uY zbMX1W$s%7E3W#9E@i(L%fgqR+g(NV@gm50w0C<21$S33nlrSEVfO|mX5FmO12k;MH z1Oy(8K?krX*ai<<{0JV$5%dGjeh(`EJz2>Q2f9pD!fr5pK!NE2fP>>e4>2%<-Utsl z_&m)*060W}+JN-n1KR%w2beUWU?GT5Kfv*P5CD7tA&x)BKo24CgUUI85sktC*BS$W zXZQ>lJZxS8sPF<~V8Ad2Km4Gk3LyI&0St5)6@bJ4;PDKMApk&eh+u){YZ3^-2n9k1 zj5ET$8~dz6BLr290!V)thXfuo;CX{YA~J+|U_bCU^gtevfoO!p5G~P$0mMQe@dAv% z3Lx?SKwyCLCW(MTq*x!|kVPU7Fi?R`0uLBKQ!1BeK}0J8_A5Fg;dm;>$@3?2YJun;mqKtc0=EF1_P;M4#Q zG9C}wgb*In@Osi9m;idm!RthVLIL@sfkHpP^oN4RAOai)U?0#(JP;nRaC*R?a8KYq z;4q+mu?7SWRpA5306B;lKW_{M2e=SH`ydDSK0!hNDgZs8Aoe(qz#riJfIvb2;0Npo z9;T!K920;K@P5Jp{Sd$dj{XQ3a6M)K^1uJ*;DMP~0qI}|yazaQAOPqf0P&yyNSn1Rn52 zF$2XIKLJ3&0p|!i6a&I+5POvc=s@!D1H{Tq!hkT#f?OW}6k);h7KsEw;!GX@Jeh{n zARyp{f<+>rfDQtIAbASN9=ISHgUJXW1HJ&tgeNe201iYCMWBElB)C9)#6jnP2h1d# zO40wJL;$!3p@YW$S}=MJ#2zq?1^)mbV0kNq9xUO80}Jp19s#UD;}Gxz#n>PLgR;@Q XK=QB#$-Y7&2c!jPQvtw;gbY6bg$cc_ diff --git a/assets/resources/dolphin/lvl_6/frame_15.bm b/assets/resources/dolphin/lvl_6/frame_15.bm deleted file mode 100644 index 95a2088b872c73d14363992b9a95a8fab8a5b7bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek)d0DuAifCdi$f&s=L3n(W58bJR53_KsuuzSJ*^Z+n_gZv)Qm;?wP;Pr?D z{2$=;gg`&g5PrbF-|&gZ0qH*nkSszX4|w=IPv{8{dc(o&5g>bjL;#o$3;6-_fd{j& zo#%kT1I`8y@P9x-;~*cc0|*a5(1Y864|)JSbO7`n5I;qufOobe9+Loj!U6sdJNyDr z2^Z;r1__b}ya*q3fP27!@dO8?2Sg7_AU-sJ@}Gmvge>ELNdf&t2c-$xt5OH*++iQ! zdEkNm4={-UgdS$`2iNc(!l4J0FbE+0S_nO0Ezt*zVEiCq2gQLRN8tyL;2zirAUs53 z510fj9wQM4yYz{~;~;yEgjhjS_%H|_SO|bThNKUP0K9k%5(lv4Xdv;J1I&Iv@qs}g z*ceK*fCDf`kUZe9DAWQ5A253IKOb2?fE+;acaS`%5D0gJvL8TtA_@WEgWmz>4j_9# ia1ro*{1Ku-Bk_aa3SjeqwuAsbfPaJhAK>&~7(ak&)19^e diff --git a/assets/resources/dolphin/lvl_6/frame_16.bm b/assets/resources/dolphin/lvl_6/frame_16.bm deleted file mode 100644 index bb1351a5124478544215fe8597f2f6961e7e0b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>3E0GR>*fC>RX1B@UTcmQdG<_Hg2`~)Ad@PC8e5D!>*JirDI@OwevK>r7{ zKpwC#e^0^v!GZ82;QN4w$G~I|e83=F3;YA%Mi>Nu9)ht4h#)|t{QraF04ouQ!QWyJ zOn5wC5D*!D2?K!#q5MJU03Yx@Fz`TFfJ^{bFnUG-`-89o#s~o*d|(eE54;GhfvEt% z1L6=5P6h}bXu$`*fF5`7c#B3L-&`O+!Rjp;06if9|AGV5S~LK9K>_K&2gC{x4>`a; zho&^&n;gZ*4k41hi$fbw$=gZvM; z5Iti6_P`j%Vf{Cuw3|X@IDkCA;E@ND=ugD}_7ty3Xs5m Hi~JrSfElLG diff --git a/assets/resources/dolphin/lvl_6/frame_17.bm b/assets/resources/dolphin/lvl_6/frame_17.bm deleted file mode 100644 index 143c15d27df5d0c78087ba04f40ce708a778d3ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmV;a0apG20Hp!{|KKmbb#U!AUK2k9;MPT2t0=34^rs^(5@i(f*4FFAoT^1JpqH@po7d1 zP=I*=i@@s;dnb?{pwS!-K#ZgDfP>YbU@`}c2p(pFhl2(%4>%w^$D{%%Fg&1efO{&% zreOA95C}=c4;VZ^9%PZgP2dv%dPo850GvP}fb%N|JjFu-2@DJ$DUpUq7zPh@fXpHs z05JpOgU5tUA;9yGgVseDgTd|q_aqea!Qq480OSvO2Ltg3I3K_szybe*!~j6?p##`H TK=h&m{2#OMe*OXe5Ab+^z?`)t diff --git a/assets/resources/dolphin/lvl_6/frame_18.bm b/assets/resources/dolphin/lvl_6/frame_18.bm deleted file mode 100644 index 72dad90d7c9af8813bd17d2fedd1ad66e94c1fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmV;00eb!c0D%Gj|KJ}8I2@pWGVo8qVh=bNKf&$52d{zx56B2V`~|n*U%~r;2d#h~ z-T)Z{6dsT{03d(BVgHi`0e%Ode2J(A5c<#-rXNe-J;UsqAbfxe@DDgRKf&|x2g>}z z_76`WJmKK~zyssN5AF*rPCx|{j0XS@J^(*3;DLaH)P^AQgM&r{4^S|J&IS({U_C(s4?wV(6;43(8wfri zK=n8(xIyY>5J@YL9-`53pwz+W7Z7@}h#qk8dVCFn4`}%GoZ}C1Abkwxo=|$F$R3PR z2e_z;h!0TcgUtwF^#+M(l!y;dXyPDn<{|^s5;%_$`2q1zj~|i&f(NC59x)^ugVfSC z0C^vXCO8mzf`}eI1rlJv=|aE*#y$_MWMe1$0}wp0;Pi+{dJzAF3?5KmddMhWfGFPq j^Wgva%%mVJa6E|#;2$7A;2Ge5gZv-gfglmY?|Xdpb}=TZm693GG$djZ5AOaXv{%m8C?2c^VLE9M8AKyyqn z03zIh=^}y{4Lo4;4h<4W4^oi>*q}-B2ebx}Bq$I(fJ6^CAL39CP$>h_0Z0d^)Pd#$ z5O|RUBt=pOoP6*i#NZf+9%=!8Bm!UqEI2%p0uN9jU;*d92ecR-TzCk)j05;)nK*&! zN*F;5tN}9zq~KIM12K=z1`jR-9iE`~fMNk7z=wnDAP;d!!NKRC2gE!clmL8Z!Q`JH hd^ZFi;Qt4=fgE7+H;_KOAN6?y>=q#Y5Qsk~|A5#Wm(~CP diff --git a/assets/resources/dolphin/lvl_6/frame_20.bm b/assets/resources/dolphin/lvl_6/frame_20.bm deleted file mode 100644 index 732f0dba7f1f5b41a8074ff2f4588b00af6c0d34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4*P0FD8Gct8L6I2fS-r3d&CAYk_31No@n6d?M*1K8By_b-?M0qZ~f z6bv6F@%{uD9>2eE0v?q4th z1J?ie7#Kch@DK1gegN@@gVF#3AOQcN|KNIe#lmSLF@nTCm*V_`$MOG{;3MGmzXHS_ zBtes|1md5_2s}d~#1MFi2mnj5`UBEN`+#|tgdaXYc@+ji504N$l!6bQ5^Vp{0DN#k z=lloG1Ri&Qd|(M;5Bd8LW&rr07Q`M>05F5;NHhR^3Irdq0C_e<9-y%SpZFeFKzu?0 zvf$8up3<3xbP8JLva{w6w%03SoCNN&`Ab7*v14P*u++;t%d0{k4=WUc7fH;7E zW8_UjS13HM;6ake;2r~MD~bX5frHA65dn|*#Gvv2z<3luc|Z>0o*;R^A+3E~eD0Ki2Aj!=33$083?@dMNU0E{1;9+&tZkRFHPI|w}BP(xujR34B> zH^Dq`z=s9^VN0 zc){}kkCccWAh8F*0Kw=Z5PCb00Y3-603IMy2loIU;Q0iIKf&f-fXM+(USRt0f9K%- F|A42>!#n^0 diff --git a/assets/resources/dolphin/lvl_6/frame_22.bm b/assets/resources/dolphin/lvl_6/frame_22.bm deleted file mode 100644 index 048c24da4fa83806c5d36691daa04f7c366e3729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmV;e0aE?}0I320fC>%^ZvZgB1p@_?Kn7d@e}mcr4{QKEhh`7(d6y6XH}HQ?!R&5v z0t3oF0RID&jv^!Y0EhSuKlHrvar^{4USE;vcs=6t@Bsu~CldpVoL>VJhsXuzKNpEm zp`QW?1Ihsi7mxsC7se6E!R8b=2NUtZAQb@oVDyG?d*gwJ1Lh@yR+v2G3-pmg3*vPU zeAuD|@}Gm}!yr+Tq(LP>gaguo4=i{-us#rY@WJPR2c83g19+DNA5e06cmd}CfQ=7; z!w`72#1>%mz#j!%AoTzkJZI97AK-Eas0@GqpZ@$FEwcy5{2wK8|NKGbXApX!$N%#Ojr_&dn^rnVD}~%KGXz*AQ1!R!~z&#J_99zDTx$;>^Ue1G)$xqV@RIH z8NewJJ+KfkV8j-t4`ATl0An5p)WUrL{tt*B91rLI29hv)z%X<55(DD^4@>|*!RP-6 X_&>q^5AaFw0qMX8_&>q^5Aa}s7D2Wp diff --git a/assets/resources/dolphin/lvl_6/frame_23.bm b/assets/resources/dolphin/lvl_6/frame_23.bm deleted file mode 100644 index 9d92c467761d3c2ff2d110f220c85660c3cb2657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmVf&C_oIn0K)(j1Rvn`-~-rhVEVs<{2urKde6c9L1WSY4n7JH z5kNlxA^!u?9(f~>@F3zDK!{{WrTF|8Pw*coaQws~4>8b#%izK>2$=*TAn`RH@&b$# zq5Ki05EdW#3SjZ@5(Xa_1e8EXa0?)Oe}oYS&lB2o&X-47~nji;PeL`1A$-%mL5P0FnZuW zVDZ7w0q;QIK!1Soh=bAu4@e(_;eVt9;z5A1um*o*C7?Zc@PCAU#1Dvu10O&5L+&sL z2tFbI|AY)5FpLC${rF}IE>_-rI z+yU$WFnE`S;r^eQ#hkz)|M)@X;AOc3#$XR80|kr!$C!V?;;=;V1IzvoH365%tU&RI z1I<8CP?7`01R(MRlw==bk-!rON;nVw`~)EKB#i*ZL{SHpJRV`epcu!1ksx^U!R8zh zaZCZ}?+2J@fCCH%p+rID0E2?c1`nyg2y6`#2fqNeJ&5=`=iu?bj}9FMgLno451)tq lhC*Qn#{gT!C=d+30K)(fT*2qy2hZL9NY-` zeUJ$N{0+za4M;d0K*B#@K!6&5{6EM5zkm@3rUW9th#UjNZ8B+K2F-#to%mRc^8yGw z=ZT{Sv4oMM1_!|8ehbnE-{6i=kbF#U!19lS(PWks0f*Eccn=4~`dA2nJ~$jPacBYY zK)^x4!g|=jW%!FeelHKzJN+@Wa9I zBOU;FL*pDXh(0s#@(03PcoXn=-@)SWV0r(B1lK0>a4+fd2a5pN&<`WxFNhxM0^lo* z9|{4GEXWEV_Y91IWAhRDteI7&)*`qz`dXBa9y~U>P~YA0V|BfcBP+8EgXaMLI5<84f-V+8 z1I|DXNdlNx#S90$gTVP8@cdyw`S63r9|Q-)L&1j!lpYcfp7=a-_;`bPy#85-?C1q6Vb#3C{fd_b^G@du1U01tQ!3I-1w`8Z%8K>1ILel-hbfbf*~Q;d>(uLa2`qm2apuJANlw^;1DtqiAWw;&-^@kunB+&S;7xg z0s#mfSU`D;NJxP4zyr>}4>BNw;Iu$A2apIs0tOkcxiG6m+T&x5AGfTI0vWv9*__9yb56PkAvI!9|D;$LGT4Ye}m9cfc5+X{8%9W L2lzifgZ>AQ5k164 diff --git a/assets/resources/dolphin/lvl_6/frame_26.bm b/assets/resources/dolphin/lvl_6/frame_26.bm deleted file mode 100644 index a83bf396aea87d4a66fbdef5c81df00348fc55dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMtb0M`NkfChdBEC4M30I`RI{2o#8d;9@p4{88Dq2TxM1N(pvSU5ky?|?Os zJc24cFnYjG1p`b8n1Snm4j1$OAy9dZghC_aCKdbyJMc*Vg~9+U^aJ`2VQ`GZ*dkH< zgU>!{R;geX0uOQmoRc08l>q~UA4n624~ho|j?K3+9>V990= zUm<+K=wC<|5FT_jS%cC81PA&2f8Y5X03OWYgdfBnG8VA|+Y#Ugkhod|Gch>gFd*^2 zhJ+r#F@!+D=+GjX#30}A^!yAkLgA#&As!Em{0t!YkQ>VW1{Go}iUDB!fB%5;Mk2U@ z;(rkcg@l-CTf{CJ$_X{lp;hKoWSty(f=N6Z zFnY!aLIn^YgU9|4P|-&q5MX?ciot*?5IlfF4AY{6+`>f&U)|-28w#%KZQU diff --git a/assets/resources/dolphin/lvl_6/frame_27.bm b/assets/resources/dolphin/lvl_6/frame_27.bm deleted file mode 100644 index ab5f00161ba05e071ab2f911712058c6b63fcb93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMtb0M`NdfB*CFF<=2_`~{3W9#Qan{sI0AAbo<&Mqr|#1JA$@@Or_)@4yGF z4EFc~*#pV~4{%U}&?4XO_&|Z=o*+=b#bOj7IM38#t~dm8z+YSX%!J|q8w7BiQSkVK z$UYWK=Fg> zKmR z`eFg)@CS;lLGQp=55xXt5PQKeKfnKi|3C$pJ&)typU@9xe@GMv9$)zwJ|H0VpabIw z4>=A1{J?Psq(m+t^%ILcf#(7T!u&zvY7l!6#vl(?0|Evh&k%U0g+O2e0}O$FAoETj zJoF3ESBO3a!@viR0{#XRVk?LqKhSvp;O2ryA{cN7@dubBkH{YodY~3y0utbZ)c}W5 z2aWt5k%IDr;J}bDdjCP?zz~zv&%zHMz&xNB7(5!l4|sSWuFwg>kip|W;C}(;TOI^3 z9<%^@2MC-%^MHSW<~$N{gXaNYCm20H;PZfd(nIoFN7T+P;hvYj2=8F z2s}~+0T+q*zym}{3_T!6!Uw1vco6gfLBa0890h#1RnGV2jT_v|A9mhMFoI-AYOodKo$c6 z=wHEvG9Y^RAQ}t!@XSI0NEZSFK%ax!7z8LFJa7Q?Q3^~(gMfwL0%IRe8%S58M;nB~ z0Rsn!5I_RpEChsPAt4kDJU)E}P{1O>Q8So4=M#odz#+lHE0lazQ^+CULFiW~I6R=l z@rRrg9zZgIg~o7G5$OiX4hs-KfW)*h1;GQzHe3NoB1RyXAbEnuz*jhMJk4YeDZ$+1 z5ddKTivj`|;5_6K0bv8mf;Av{&?E+e84w7T90uP5s_%Go4phz$r5Bxz2DEJKz1Rl^edJ=~P|AZ|?lu*EV zfd&VJ2c$wVa0i?jUO0ew!T|&LhoXdNfWiO40p$dF3^_bvfrx*>f(aLqOaP+l5O~M| z?hGSAL?|ENV1b4L12B1{1RicAE(xH5L;VGli3-A4AbNpB9zoFukYs<(;sppif`V8e zc>e+A2mz6Rii8g*aYGG+U?Cv`2k>PmbnqT{>gVW*v Ffq-?6?W_O* diff --git a/assets/resources/dolphin/lvl_6/frame_9.bm b/assets/resources/dolphin/lvl_6/frame_9.bm deleted file mode 100644 index 5b9819925f2edf900d9e525e54e8474ae6e5ce02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 zcmV-q0-OB-0AKaREu2z&+s1dJdafB}LKM}fl!?g9=EC?x=pAOnOzAW#T@@E<>j zI6P$ zoI&{jz`O_^u*d`)3Roa};0(haGn5fvAn{HefCM*&=-?wRAqS`cyc`fn*^~kg7UGPC z#{igS76cD?1=+wh2v|M53Svx)U}B5`fGGq3F^_?PFcLs|$Ohs87~DjtB#RIOLNFcxd1yx@4`>I55(OIwIl<*&6^;OeK=_R*Mt~2vAbe;C zd21TpA50FX2R89;?X y`VbKK074NQ06fHG2^)Zvq2q)HkN84Z2>1*@L=Pi~oP~Or3-}af0Q6?A1OEW_0o1wx diff --git a/assets/resources/dolphin/lvl_8/frame_10.bm b/assets/resources/dolphin/lvl_8/frame_10.bm deleted file mode 100644 index 4af8d83116ee1ff077e717ec8ba533b076e475b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmV;b16BM10Hy=|fAH`qhlBnAAASFC0{j7o{r`!?G(Mm>+kd_OTq?0us)9xfLbQKC zqrVUhRs-1g2gZM)kV3u!QT6}ecnDVGcd7)877+n~d;|kO&`O}*kFb1i@M;u-fDa!0 zeyP=!ZY#A>(B1GbOptuI^;k^;k^BGtfA#uC0ss#wJXQe^fKfF-@xRbv6pxTRYH(Zx z5(NOX{D1ZBREVB>gyB#CL-XIysPHO)Jf%V528hIbKmP63(XU#K{uCV?1VRNw@rFkK z09%&+EFKW(mPdxlC=ak6Qz;Ar2r(=eJhK1580X1jA`c8gAr}Xi{hn0v*+3vL2oxQF zAOxr22V+5yVIUCjdr9CDQ2_u3K06=*#KnR<5OByN=CS}BtaK&vh`~4Mq7SSS1g|I! z|HuzmOahpVAOQdT0QEHtLO=o#82_|j^@czp5Qu>QVIS*yFn|Op8H5O;I2Zx=e${Y! zu7zAf@;4NN^5ZBb0boEO!ahqY^aqp{0mzUHCygeBAc90F zQYe&`QG|JjyhCFKW{7-o6pV%nq+k(vz%nTzNsLCNBBIqH9AJ4;Adt#II9{WPD~^Y8 z)*qIFQ33}HlB5A0R8mC=4~&upl7LWTTpUFM2|%GzYEi)W1Z zCFy;^qeQAfAUKQ^5K%b8^%Bncq9V_ zBB4njP>_3n@RCe~C3-JG$V4Cj1cqQJOVNU1A`)6HQ~+9CR7MG?kw6fm0>ok@03kCB M0mLt{$x$*C0BDJKh5!Hn diff --git a/assets/resources/dolphin/lvl_8/frame_11.bm b/assets/resources/dolphin/lvl_8/frame_11.bm deleted file mode 100644 index ab8ca095ac3c34a24f8a18048f2d379ed1356868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^9~0H_21f8cNl21EV;9smB{1^j;h;PH{jv|gZa+j_tIoF=iY)qkh>E(Rm? z9zXql3)uUI$}4D*d;x>^{{QQ+4aI7!{=dPvPz)eId;jQO0u|^BkLUkxfJq=e06^d9 z5?D^-RjLP%{*?gG3<`f#s_cX5zokAY4<{CWggYESykPrlJTM~&(GtTc#D9b5NOuU#qEcN=5=;39 zhB;b)Z~W-%%PP($N@z!-)j6p%=$x|&2+QXeQrq5~3OmQxWxk!YkHNc<9lvaZTr9vVwDh3dqIVc70 zsUeU;sxb{LQVRr-LoqN9)P4n&#Z(}aSOy9OkiteF9*_R7P}dkGLm{e+KvhF3$n7oA ziWaL0kbx@%J~9domI?0Nz@mszp;9UpT7(7(6xOANACRF{G!TfCCIN*njRL9F`^cbD zhzu7+K#)>$39-b{JzMM~g9RkWLLo-M$iS#F2~Vb50fa>|QYjRJQBcAchKWSAQ{oUE z6eAIcr3}U*PZ*9@WfP(c2SXAMjHo^^8U+$b?SKVFr3%tfGPDRTMgYwktm=~xpy3ZA z34ujNjK zUsYcV0LWk`#}R;3Ki~z=hsLBMDkKmd(fACKK?}o{e^^_5b!rC>T%3;J@`aM&Jk`VcycA5Dy5rLL)zf zUNw5Jm>ghODJOuyarqZu2tGgk{?j191Je%x+-kKz@t@-$nJ+**{_u}SfBnncQu)h)D~j5P*Ka{rVBe=-{DO2>5UxLrBVgAo8=D zMi5{a3`4|e7?-F%dIjlFA`l!$`j0^molb#Bfk0v*A<1AR8BQQPrf8u?lmdw)s^p|v zpm|Do0@4Qyz;aMZB|sif)98bQo-heT5~V4ksERXyq(6lOGAtBILxQA#UBsOr@SO&! zNXkkwNkIpYtY6~@h+w2t8We>nKloGv3Jw?s1_>y_MI|{(5|BaTLtcqQXcQ?-iwQ!M zdOz?=0`OoENK7IrLZnn-6j&|vJ}^KC&~y|H79s@-2o9q74;X9-K2az{MyTc*j280> zh*BgB!Gd5URICmvQ39zKpSV1qy=Fp3632|uA?q8ONj3ROyi zQYr}1f@mpti3JKlL=TKY3jnf6pj02!1|@=oVMgOBp+KaV73kzG)U70P-KZQ77kJsgznJB;}XR|AekLPOi%-K z=>3`_RG`Q*H3%S7V0es{x2->cKyXn?ERqXRs0YSD0I6DOr=gT+B^Vt>6BSB=!gW$h zR9*=XqQz5#0+h%ULx6x~dQce*22n^LjZ%S?kwIiqO(fEj2%=E1uq>tuRX~zJU=$i{ zRsbX#?$`BI+VZQ_STvInD1}I5RFC)pO(jv)M4*s}5IwK%@q$ulvmU&+ z1pprSN(Lfu(iiZ9+y4xNNVl>IKtys700O|MSc$X>0IwP@r~q`TtRev+jN&9vl=#sg SkO+)MLx74(Xqc%0P-y^CLVp+l diff --git a/assets/resources/dolphin/lvl_8/frame_13.bm b/assets/resources/dolphin/lvl_8/frame_13.bm deleted file mode 100644 index 5e1fa0856dc9f69fe03e404283ffd980179d6de9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 937 zcmV;a16KS20Hp)|f8fvx1cUwnE&uu-_yUjn|3ua*&7=Q8jFXP+)`TzH_SOgQmO%RCl z!{fize82blOp^c)5CLD{ACIs9#s(ae0#oS+oc~d{*Xp?9k!=!Vd1^2Uf*X#aB?5rKAmEbF>;3>z!PS}O4>%w6 z>L3BAKyVQNc;ngw|A+bwr&NSUAQ*~7ydGQi`2_|Q0)b!y;~#Je?7#zug#$(i4;k@j zzz1WZg9Za4flu@R_Nc&Q5dr|jKh!{bO9iF?ALImhX+o+CL?AgB2lh^2AbG;1kPHnH z0SNtP`vCNx!r&AEaZo>(_>2f1dHfLc;1DHAYEDPrgA>Lf5y?OmLw|{VLFG@9j|2dE zFZ_Op-9345WDNm;WF(tfE=SZ4Ej%z@IS4>}a#W0zlZX#0ydon328|*GNRd)W(WjGV}hhbA{2%ZN@5U5Ajm|6D8lHe zP*8bAVhiCHj0+(`s6r$)1tCRGqAntU|8dhCzy{L@F#1g;)uN zM1erD6sZ6RVOU@EQh^A8Kwvou1WHMT5e$M+{e}w$AO{v8=`c|WCKi>2yg;}C0fa&z zBN3G7q5uN@Log8>19)T+9YEY@R4Oi(z$q9E5qp=EU#sYZZ)GJ*)eue41RsS+h& zz(F8NL4r~$5qJzE0YHUiU{YH|8VRJ3K)jOrKzw3S8U&*dxEclm2O!?y;1Ns>6A=oa z$Y~H*M5c{``$QsCDyBk3P?cd6<3hkkJr~>%s9-W$Bo_lHi9uo-uT|DR5QJc=n2AQB zsY0MZpil{?w+?0yaLBMAp_J80<5HsfWV8teCZ$A`RVuhj1}Z58m3?3lC>E<#TI$tm zwz~Wa0Z^*iu{aEe`~bK3Vz6-$DFZA)?+VmvHC0F?DkKkY`D9Te1)#44KNt)~QY8?O zK>_Xef;T#nwq7Nwk*nTh=1yhDdJ*TV+ICxY7fe@fTFk^y%506IyqA|u30MUYq zf!G2RpjtuUfnjBafJ7qzzvzMM7=T3y z9sw|DF$jzz>j}|)1LSKMBn3Jn5z%5QP@hOVbMPf#&_%@vib-&l4-h=djD~fp{ z1dfWKkiiSZ6g`X%BSDACK&nuT6$+?G8Wakn3z1*qG%A63T7v~SB zOhXA0(P$u0NQ6_XZ@@w{2yvlAaR?!T;3$N5h}{m zF#`e8#Gteo1y>UQf?!-@3W$sZm@rs{D%l0ZP$C*kr9zddglMTyEF^<-Ady5Mm0GP_ z1U*{SRto{iN3bvm6$kzRTl^|PAe6!}5(t1kFqo`Vf!Z)Yd`M&v*c5{WKnJ`M0ZEcl z3S$TdxBfYjh+$w57qEeb0EG|`z#=dT6Ude0NTnNwq5>MMQj>^@NN7?FB#4eAQN#z% JBSXL=hD3&+ZJ_`F diff --git a/assets/resources/dolphin/lvl_8/frame_7.bm b/assets/resources/dolphin/lvl_8/frame_7.bm deleted file mode 100644 index dcee3d025102f3161af7ed60ae4b0fca7341e97b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=$80G|W@|KM;4Mg#l?AAi271^fYr|38pisy$FJ_kY*_3<|MTs)9!a@Th)6 zG}}p!U7`*gZshjM_P!up%e)? ztbhlnzz+#RFbI19KnW8Lj6onRA&>R}>nRQn1|YZ?1pi zS5T5E{0|`@9t#Le1EhpOazXTjLts(}3`+$FkyIoj^N>KX0?{aqQ$<9=)eeFm7$$-! z?GgyUp)#750O%m`pg^Mo(SXS{1@VMcc&R}p4I*MQ5&*!WQmTw1RTn3e21Njb!a5a7 z4o3;1>QX0=8YV($JscF$MHHe$ppY3Xgg!7&tqHy~tVW6vpp;c25hx5oLtKF3brE?K zBSQ+H$Y`)g9TO4Ii%>uE9HfdBAc{pX83b6!F}+8y;HX%M1}6bPh{<4aC@iC@rWiyb zLxhk@p+=#9jzX2F|H0%HEL1}kfY4zokXaz;ZC~^thet&qi9(_f6L{evT3P&(NfJJe z3W1=JRUlF*hLceb3l4)3P>N+DPN9O}D3n^N5MmIiEEam4M328 z`~UvFl?m*7fdz${LaG9R5ey!o0Nif%U+?@1p#j2t1*8AaVxiuE`G4ek90UL!Kl%Qn zRRRyB-U$fE1Iiy&fKW6YZ~yRsG71$F=nonk76lN52*>;XuhCGVA1xdTK?DR3Q}I8S z>9G<(d0He82nu|^Km7cTLs0nx#wZRf5oCTKk(|{xrQ(G`A{Yq-B0=E=4g6{#^MODH zBLISM!RE&){uTiOgq%hI4=?--=s)~?z!olnh`=CjBLEdXLL4B8LBZ`uphRL23Jd~; zCt(->r1%IDd_%(khmObqaWZh11mYm^+ymBA0KywcCNuL{01VbKOaOFX6p8-C9;T5` ziacZxFaHDl4@hJJAq0d_3FH6p2h*!(`UlSe2!O(31rY^}ev#=HqzVTBfSm?~|B=alPvU~e zBn2S}j0;f!%3?f$@_^tm5U2(rLNF?=CPk?alW<^ANf6Lv6-gwDi9`pG=wum@c)UhM ziNZv(D_BvC0eOO zS6)vl6_kE54y6k#kcdKVks0&^G%|_~M+yIwP@z;^6bh9wH4LM6^Be4^1qhHtB07l# zk_!;P^(23QYibQ2v zh(r|@F)K_q2?*3=Dij(f0n||pOp~RP$UrDkC8)$CvI;@GWE5VgC}dGgElQz9h+$5{ z2*qV0lnMkQMJRwKhKgS-6JTnwD3t<{ft6H4;(izmg9$__i~=JPl~5p0N6)v2LJ#7 diff --git a/assets/resources/dolphin/lvl_8/frame_9.bm b/assets/resources/dolphin/lvl_8/frame_9.bm deleted file mode 100644 index edccb27c32314fad77b41b1e6a22aead9e7ceedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^9~0H_1{fBo=yN5k*`|Ni&&s4w6QKi~ZyBT)Wm~dSR?`i)c^lK^?D{EfOQ}JMgsw$ABR+08~g?YFE9S401g<1 z0-zrn{i;DF2aWzz4j3i^5di$(>-cCCKuR1}h&+4u zSO=gUM&W@#pb{7dgcLXU0T6%r_@xQ~fTRcqhAS#qJgMQKzyn4RL|(puvzxWEk<;01hS`EFk=05b%2&hKU4#h(-k;eGmZR zA+Z+-2w)Tc&^=)=2*P-93^Bj>0qPwgaKNCF5C4F`tf90(C_)i|fB7Nz!9)?_FCX=s z9eg4lDWeaTpWuK;8F?{P@X3-f>3aj zjG~A|;*c7G$VLNFib`@c1E9~~*a}9JIx#IKBSA!gWq2X+WQcrVkcR-sqOmHZB3c3MY;O0aSpSjE0K_8;ld{`rhR#ng~Q9B_hR2Acw)K>b3Xy41x=yp-?E1 z3KRRj!Gi}puquxn;Mk|5+4{wBH0R% zL?jPUs8FFYsU-pnfstqM5Qrou5edS@G?@&AC_XfbtbnXI4K9*VqJcqG;Jf&dS1{3%i}xDgO)K=*=Vu~aC8LV_QN z!~;PB!Z5}p4|tA7iIIRrppXoZkYE4_Sp O1Ax;&Dv$^wyl^1!`F$t= diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt index c0ac50f72..244dda579 100644 --- a/assets/resources/dolphin/manifest.txt +++ b/assets/resources/dolphin/manifest.txt @@ -1,210 +1,357 @@ Filetype: Flipper Animation Manifest Version: 1 -Name: lvl_1 +Name: sfw/L1_Waves_128x50 +Min butthurt: 0 +Max butthurt: 5 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Laptop_128x51 +Min butthurt: 0 +Max butthurt: 7 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: sfw/L1_Sleep_128x64 +Min butthurt: 0 +Max butthurt: 10 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Recording_128x51 +Min butthurt: 0 +Max butthurt: 8 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: sfw/L1_Furippa1_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: sfw/L1_Happy_holidays_128x64 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 3 +Weight: 4 + +Name: sfw/L1_Read_books_128x64 +Min butthurt: 0 +Max butthurt: 8 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: sfw/L1_Cry_128x64 +Min butthurt: 8 +Max butthurt: 13 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Boxing_128x64 +Min butthurt: 10 +Max butthurt: 13 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Mad_fist_128x64 +Min butthurt: 9 +Max butthurt: 13 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Mods_128x64 +Min butthurt: 0 +Max butthurt: 9 +Min level: 1 +Max level: 3 +Weight: 4 + +Name: sfw/L1_Painting_128x64 +Min butthurt: 0 +Max butthurt: 7 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Leaving_sad_128x64 +Min butthurt: 14 +Max butthurt: 14 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: sfw/L2_Wake_up_128x64 +Min butthurt: 0 +Max butthurt: 12 +Min level: 2 +Max level: 3 +Weight: 4 + +Name: sfw/L2_Furippa2_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: sfw/L2_Hacking_pc_128x64 +Min butthurt: 0 +Max butthurt: 8 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: sfw/L2_Soldering_128x64 +Min butthurt: 0 +Max butthurt: 10 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: sfw/L3_Furippa3_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 3 +Max level: 3 +Weight: 3 + +Name: sfw/L3_Hijack_radio_128x64 +Min butthurt: 0 +Max butthurt: 8 +Min level: 3 +Max level: 3 +Weight: 3 + +Name: sfw/L3_Lab_research_128x54 +Min butthurt: 0 +Max butthurt: 10 +Min level: 3 +Max level: 3 +Weight: 3 + +Name: sfw/L1_Sleigh_ride_128x64 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 3 +Weight: 4 + +Name: nsfw/lvl_1 Min butthurt: 0 Max butthurt: 14 Min level: 1 Max level: 30 Weight: 7 -Name: lvl_2 +Name: nsfw/lvl_2 Min butthurt: 0 Max butthurt: 14 Min level: 2 Max level: 30 Weight: 7 -Name: lvl_3 +Name: nsfw/lvl_3 Min butthurt: 0 Max butthurt: 14 Min level: 3 Max level: 30 Weight: 7 -Name: lvl_4 +Name: nsfw/lvl_4 Min butthurt: 0 Max butthurt: 14 Min level: 4 Max level: 30 Weight: 7 -Name: lvl_5 +Name: nsfw/lvl_5 Min butthurt: 0 Max butthurt: 14 Min level: 5 Max level: 30 Weight: 7 -Name: lvl_6 +Name: nsfw/lvl_6 Min butthurt: 0 Max butthurt: 14 Min level: 6 Max level: 30 Weight: 7 -Name: lvl_7 +Name: nsfw/lvl_7 Min butthurt: 0 Max butthurt: 14 Min level: 7 Max level: 30 Weight: 7 -Name: lvl_8 +Name: nsfw/lvl_8 Min butthurt: 0 Max butthurt: 14 Min level: 8 Max level: 30 Weight: 7 -Name: lvl_9 +Name: nsfw/lvl_9 Min butthurt: 0 Max butthurt: 14 Min level: 9 Max level: 30 Weight: 7 -Name: lvl_10 +Name: nsfw/lvl_10 Min butthurt: 0 Max butthurt: 14 Min level: 10 Max level: 30 Weight: 7 -Name: lvl_11 +Name: nsfw/lvl_11 Min butthurt: 0 Max butthurt: 14 Min level: 11 Max level: 30 Weight: 9 -Name: lvl_12 +Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 Min level: 12 Max level: 30 Weight: 7 -Name: lvl_13 +Name: nsfw/lvl_13 Min butthurt: 0 Max butthurt: 14 Min level: 13 Max level: 30 Weight: 7 -Name: lvl_14 +Name: nsfw/lvl_14 Min butthurt: 0 Max butthurt: 14 Min level: 14 Max level: 30 Weight: 7 -Name: lvl_15 +Name: nsfw/lvl_15 Min butthurt: 0 Max butthurt: 14 Min level: 15 Max level: 30 Weight: 7 -Name: lvl_16 +Name: nsfw/lvl_16 Min butthurt: 0 Max butthurt: 14 Min level: 16 Max level: 30 Weight: 7 -Name: lvl_17 +Name: nsfw/lvl_17 Min butthurt: 0 Max butthurt: 14 Min level: 17 Max level: 30 Weight: 7 -Name: lvl_18 +Name: nsfw/lvl_18 Min butthurt: 0 Max butthurt: 14 Min level: 18 Max level: 30 Weight: 7 -Name: lvl_19 +Name: nsfw/lvl_19 Min butthurt: 0 Max butthurt: 14 Min level: 19 Max level: 30 Weight: 7 -Name: lvl_20 +Name: nsfw/lvl_20 Min butthurt: 0 Max butthurt: 14 Min level: 20 Max level: 30 Weight: 7 -Name: lvl_21 +Name: nsfw/lvl_21 Min butthurt: 0 Max butthurt: 14 Min level: 21 Max level: 30 Weight: 9 -Name: lvl_22 +Name: nsfw/lvl_22 Min butthurt: 0 Max butthurt: 14 Min level: 22 Max level: 30 Weight: 7 -Name: lvl_23 +Name: nsfw/lvl_23 Min butthurt: 0 Max butthurt: 14 Min level: 23 Max level: 30 Weight: 7 -Name: lvl_24 +Name: nsfw/lvl_24 Min butthurt: 0 Max butthurt: 14 Min level: 24 Max level: 30 Weight: 7 -Name: lvl_25 +Name: nsfw/lvl_25 Min butthurt: 0 Max butthurt: 14 Min level: 25 Max level: 30 Weight: 7 -Name: lvl_26 +Name: nsfw/lvl_26 Min butthurt: 0 Max butthurt: 14 Min level: 26 Max level: 30 Weight: 7 -Name: lvl_27 +Name: nsfw/lvl_27 Min butthurt: 0 Max butthurt: 14 Min level: 27 Max level: 30 Weight: 7 -Name: lvl_28 +Name: nsfw/lvl_28 Min butthurt: 0 Max butthurt: 14 Min level: 28 Max level: 30 Weight: 7 -Name: lvl_29 +Name: nsfw/lvl_29 Min butthurt: 0 Max butthurt: 14 Min level: 29 Max level: 30 Weight: 7 -Name: lvl_30 +Name: nsfw/lvl_30 Min butthurt: 0 Max butthurt: 14 Min level: 30 diff --git a/assets/resources/dolphin/no_lvl_up_manifest.txt b/assets/resources/dolphin/no_lvl_up_manifest.txt deleted file mode 100644 index 2656b86fd..000000000 --- a/assets/resources/dolphin/no_lvl_up_manifest.txt +++ /dev/null @@ -1,212 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: lvl_1 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_2 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_3 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_4 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_5 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_6 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_7 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_8 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_9 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_10 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_11 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 9 - -Name: lvl_12 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_13 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_14 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_15 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_16 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_17 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_18 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_19 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_20 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_21 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 9 - -Name: lvl_22 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_23 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_24 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_25 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_26 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_27 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_28 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_29 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_30 -Min butthurt: 0 -Max butthurt: 3 -Min level: 1 -Max level: 30 -Weight: 9 \ No newline at end of file diff --git a/assets/resources/dolphin/lvl_1/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_0.bm diff --git a/assets/resources/dolphin/lvl_1/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_1.bm diff --git a/assets/resources/dolphin/lvl_1/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_10.bm diff --git a/assets/resources/dolphin/lvl_1/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_11.bm diff --git a/assets/resources/dolphin/lvl_1/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_12.bm diff --git a/assets/resources/dolphin/lvl_1/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_13.bm diff --git a/assets/resources/dolphin/lvl_1/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_14.bm diff --git a/assets/resources/dolphin/lvl_1/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_15.bm diff --git a/assets/resources/dolphin/lvl_1/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_16.bm diff --git a/assets/resources/dolphin/lvl_1/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_17.bm diff --git a/assets/resources/dolphin/lvl_1/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_18.bm diff --git a/assets/resources/dolphin/lvl_1/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_19.bm diff --git a/assets/resources/dolphin/lvl_1/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_2.bm diff --git a/assets/resources/dolphin/lvl_1/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_20.bm diff --git a/assets/resources/dolphin/lvl_1/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_21.bm diff --git a/assets/resources/dolphin/lvl_1/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_22.bm diff --git a/assets/resources/dolphin/lvl_1/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_23.bm diff --git a/assets/resources/dolphin/lvl_1/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_24.bm diff --git a/assets/resources/dolphin/lvl_1/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_25.bm diff --git a/assets/resources/dolphin/lvl_1/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_26.bm diff --git a/assets/resources/dolphin/lvl_1/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_27.bm diff --git a/assets/resources/dolphin/lvl_1/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_28.bm diff --git a/assets/resources/dolphin/lvl_1/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_29.bm diff --git a/assets/resources/dolphin/lvl_1/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_3.bm diff --git a/assets/resources/dolphin/lvl_1/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_30.bm diff --git a/assets/resources/dolphin/lvl_1/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_4.bm diff --git a/assets/resources/dolphin/lvl_1/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_5.bm diff --git a/assets/resources/dolphin/lvl_1/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_6.bm diff --git a/assets/resources/dolphin/lvl_1/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_7.bm diff --git a/assets/resources/dolphin/lvl_1/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_8.bm diff --git a/assets/resources/dolphin/lvl_1/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_1/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_1/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_1/frame_9.bm diff --git a/assets/resources/dolphin/lvl_1/meta.txt b/assets/resources/dolphin/nsfw/lvl_1/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_1/meta.txt rename to assets/resources/dolphin/nsfw/lvl_1/meta.txt diff --git a/assets/resources/dolphin/lvl_10/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_0.bm diff --git a/assets/resources/dolphin/lvl_10/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_1.bm diff --git a/assets/resources/dolphin/lvl_10/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_10.bm diff --git a/assets/resources/dolphin/lvl_10/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_11.bm diff --git a/assets/resources/dolphin/lvl_10/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_12.bm diff --git a/assets/resources/dolphin/lvl_10/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_13.bm diff --git a/assets/resources/dolphin/lvl_10/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_14.bm diff --git a/assets/resources/dolphin/lvl_10/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_15.bm diff --git a/assets/resources/dolphin/lvl_10/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_16.bm diff --git a/assets/resources/dolphin/lvl_10/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_17.bm diff --git a/assets/resources/dolphin/lvl_10/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_18.bm diff --git a/assets/resources/dolphin/lvl_10/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_19.bm diff --git a/assets/resources/dolphin/lvl_10/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_2.bm diff --git a/assets/resources/dolphin/lvl_10/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_20.bm diff --git a/assets/resources/dolphin/lvl_10/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_21.bm diff --git a/assets/resources/dolphin/lvl_10/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_22.bm diff --git a/assets/resources/dolphin/lvl_10/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_23.bm diff --git a/assets/resources/dolphin/lvl_10/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_24.bm diff --git a/assets/resources/dolphin/lvl_10/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_25.bm diff --git a/assets/resources/dolphin/lvl_10/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_26.bm diff --git a/assets/resources/dolphin/lvl_10/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_27.bm diff --git a/assets/resources/dolphin/lvl_10/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_3.bm diff --git a/assets/resources/dolphin/lvl_10/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_4.bm diff --git a/assets/resources/dolphin/lvl_10/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_5.bm diff --git a/assets/resources/dolphin/lvl_10/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_6.bm diff --git a/assets/resources/dolphin/lvl_10/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_7.bm diff --git a/assets/resources/dolphin/lvl_10/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_8.bm diff --git a/assets/resources/dolphin/lvl_10/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_10/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_10/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_10/frame_9.bm diff --git a/assets/resources/dolphin/lvl_10/meta.txt b/assets/resources/dolphin/nsfw/lvl_10/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_10/meta.txt rename to assets/resources/dolphin/nsfw/lvl_10/meta.txt diff --git a/assets/resources/dolphin/lvl_11/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_0.bm diff --git a/assets/resources/dolphin/lvl_11/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_1.bm diff --git a/assets/resources/dolphin/lvl_11/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_10.bm diff --git a/assets/resources/dolphin/lvl_11/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_11.bm diff --git a/assets/resources/dolphin/lvl_11/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_12.bm diff --git a/assets/resources/dolphin/lvl_11/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_13.bm diff --git a/assets/resources/dolphin/lvl_11/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_14.bm diff --git a/assets/resources/dolphin/lvl_11/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_15.bm diff --git a/assets/resources/dolphin/lvl_11/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_16.bm diff --git a/assets/resources/dolphin/lvl_11/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_17.bm diff --git a/assets/resources/dolphin/lvl_11/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_18.bm diff --git a/assets/resources/dolphin/lvl_11/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_19.bm diff --git a/assets/resources/dolphin/lvl_11/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_2.bm diff --git a/assets/resources/dolphin/lvl_11/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_20.bm diff --git a/assets/resources/dolphin/lvl_11/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_21.bm diff --git a/assets/resources/dolphin/lvl_11/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_22.bm diff --git a/assets/resources/dolphin/lvl_11/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_23.bm diff --git a/assets/resources/dolphin/lvl_11/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_24.bm diff --git a/assets/resources/dolphin/lvl_11/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_25.bm diff --git a/assets/resources/dolphin/lvl_11/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_26.bm diff --git a/assets/resources/dolphin/lvl_11/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_27.bm diff --git a/assets/resources/dolphin/lvl_11/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_28.bm diff --git a/assets/resources/dolphin/lvl_11/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_29.bm diff --git a/assets/resources/dolphin/lvl_11/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_3.bm diff --git a/assets/resources/dolphin/lvl_11/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_30.bm diff --git a/assets/resources/dolphin/lvl_11/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_31.bm diff --git a/assets/resources/dolphin/lvl_11/frame_32.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_32.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_32.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_32.bm diff --git a/assets/resources/dolphin/lvl_11/frame_33.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_33.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_33.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_33.bm diff --git a/assets/resources/dolphin/lvl_11/frame_34.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_34.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_34.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_34.bm diff --git a/assets/resources/dolphin/lvl_11/frame_35.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_35.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_35.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_35.bm diff --git a/assets/resources/dolphin/lvl_11/frame_36.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_36.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_36.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_36.bm diff --git a/assets/resources/dolphin/lvl_11/frame_37.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_37.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_37.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_37.bm diff --git a/assets/resources/dolphin/lvl_11/frame_38.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_38.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_38.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_38.bm diff --git a/assets/resources/dolphin/lvl_11/frame_39.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_39.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_39.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_39.bm diff --git a/assets/resources/dolphin/lvl_11/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_4.bm diff --git a/assets/resources/dolphin/lvl_11/frame_40.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_40.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_40.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_40.bm diff --git a/assets/resources/dolphin/lvl_11/frame_41.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_41.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_41.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_41.bm diff --git a/assets/resources/dolphin/lvl_11/frame_42.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_42.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_42.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_42.bm diff --git a/assets/resources/dolphin/lvl_11/frame_43.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_43.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_43.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_43.bm diff --git a/assets/resources/dolphin/lvl_11/frame_44.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_44.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_44.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_44.bm diff --git a/assets/resources/dolphin/lvl_11/frame_45.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_45.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_45.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_45.bm diff --git a/assets/resources/dolphin/lvl_11/frame_46.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_46.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_46.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_46.bm diff --git a/assets/resources/dolphin/lvl_11/frame_47.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_47.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_47.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_47.bm diff --git a/assets/resources/dolphin/lvl_11/frame_48.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_48.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_48.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_48.bm diff --git a/assets/resources/dolphin/lvl_11/frame_49.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_49.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_49.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_49.bm diff --git a/assets/resources/dolphin/lvl_11/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_5.bm diff --git a/assets/resources/dolphin/lvl_11/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_6.bm diff --git a/assets/resources/dolphin/lvl_11/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_7.bm diff --git a/assets/resources/dolphin/lvl_11/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_8.bm diff --git a/assets/resources/dolphin/lvl_11/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_11/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_11/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_11/frame_9.bm diff --git a/assets/resources/dolphin/lvl_11/meta.txt b/assets/resources/dolphin/nsfw/lvl_11/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_11/meta.txt rename to assets/resources/dolphin/nsfw/lvl_11/meta.txt diff --git a/assets/resources/dolphin/lvl_12/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_0.bm diff --git a/assets/resources/dolphin/lvl_12/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_1.bm diff --git a/assets/resources/dolphin/lvl_12/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_10.bm diff --git a/assets/resources/dolphin/lvl_12/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_11.bm diff --git a/assets/resources/dolphin/lvl_12/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_12.bm diff --git a/assets/resources/dolphin/lvl_12/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_13.bm diff --git a/assets/resources/dolphin/lvl_12/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_14.bm diff --git a/assets/resources/dolphin/lvl_12/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_15.bm diff --git a/assets/resources/dolphin/lvl_12/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_2.bm diff --git a/assets/resources/dolphin/lvl_12/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_3.bm diff --git a/assets/resources/dolphin/lvl_12/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_4.bm diff --git a/assets/resources/dolphin/lvl_12/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_5.bm diff --git a/assets/resources/dolphin/lvl_12/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_6.bm diff --git a/assets/resources/dolphin/lvl_12/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_7.bm diff --git a/assets/resources/dolphin/lvl_12/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_8.bm diff --git a/assets/resources/dolphin/lvl_12/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_12/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_12/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_12/frame_9.bm diff --git a/assets/resources/dolphin/lvl_12/meta.txt b/assets/resources/dolphin/nsfw/lvl_12/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_12/meta.txt rename to assets/resources/dolphin/nsfw/lvl_12/meta.txt diff --git a/assets/resources/dolphin/lvl_13/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_0.bm diff --git a/assets/resources/dolphin/lvl_13/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_1.bm diff --git a/assets/resources/dolphin/lvl_13/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_10.bm diff --git a/assets/resources/dolphin/lvl_13/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_2.bm diff --git a/assets/resources/dolphin/lvl_13/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_3.bm diff --git a/assets/resources/dolphin/lvl_13/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_4.bm diff --git a/assets/resources/dolphin/lvl_13/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_5.bm diff --git a/assets/resources/dolphin/lvl_13/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_6.bm diff --git a/assets/resources/dolphin/lvl_13/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_7.bm diff --git a/assets/resources/dolphin/lvl_13/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_8.bm diff --git a/assets/resources/dolphin/lvl_13/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_13/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_13/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_13/frame_9.bm diff --git a/assets/resources/dolphin/lvl_13/meta.txt b/assets/resources/dolphin/nsfw/lvl_13/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_13/meta.txt rename to assets/resources/dolphin/nsfw/lvl_13/meta.txt diff --git a/assets/resources/dolphin/lvl_14/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_0.bm diff --git a/assets/resources/dolphin/lvl_14/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_1.bm diff --git a/assets/resources/dolphin/lvl_14/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_2.bm diff --git a/assets/resources/dolphin/lvl_14/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_3.bm diff --git a/assets/resources/dolphin/lvl_14/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_4.bm diff --git a/assets/resources/dolphin/lvl_14/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_5.bm diff --git a/assets/resources/dolphin/lvl_14/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_6.bm diff --git a/assets/resources/dolphin/lvl_14/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_14/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_14/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_14/frame_7.bm diff --git a/assets/resources/dolphin/lvl_14/meta.txt b/assets/resources/dolphin/nsfw/lvl_14/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_14/meta.txt rename to assets/resources/dolphin/nsfw/lvl_14/meta.txt diff --git a/assets/resources/dolphin/lvl_15/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_0.bm diff --git a/assets/resources/dolphin/lvl_15/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_1.bm diff --git a/assets/resources/dolphin/lvl_15/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_10.bm diff --git a/assets/resources/dolphin/lvl_15/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_11.bm diff --git a/assets/resources/dolphin/lvl_15/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_12.bm diff --git a/assets/resources/dolphin/lvl_15/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_13.bm diff --git a/assets/resources/dolphin/lvl_15/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_14.bm diff --git a/assets/resources/dolphin/lvl_15/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_15.bm diff --git a/assets/resources/dolphin/lvl_15/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_16.bm diff --git a/assets/resources/dolphin/lvl_15/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_17.bm diff --git a/assets/resources/dolphin/lvl_15/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_18.bm diff --git a/assets/resources/dolphin/lvl_15/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_19.bm diff --git a/assets/resources/dolphin/lvl_15/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_2.bm diff --git a/assets/resources/dolphin/lvl_15/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_20.bm diff --git a/assets/resources/dolphin/lvl_15/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_21.bm diff --git a/assets/resources/dolphin/lvl_15/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_3.bm diff --git a/assets/resources/dolphin/lvl_15/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_4.bm diff --git a/assets/resources/dolphin/lvl_15/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_5.bm diff --git a/assets/resources/dolphin/lvl_15/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_6.bm diff --git a/assets/resources/dolphin/lvl_15/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_7.bm diff --git a/assets/resources/dolphin/lvl_15/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_8.bm diff --git a/assets/resources/dolphin/lvl_15/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_15/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_15/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_15/frame_9.bm diff --git a/assets/resources/dolphin/lvl_15/meta.txt b/assets/resources/dolphin/nsfw/lvl_15/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_15/meta.txt rename to assets/resources/dolphin/nsfw/lvl_15/meta.txt diff --git a/assets/resources/dolphin/lvl_16/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_0.bm diff --git a/assets/resources/dolphin/lvl_16/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_1.bm diff --git a/assets/resources/dolphin/lvl_16/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_10.bm diff --git a/assets/resources/dolphin/lvl_16/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_11.bm diff --git a/assets/resources/dolphin/lvl_16/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_12.bm diff --git a/assets/resources/dolphin/lvl_16/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_13.bm diff --git a/assets/resources/dolphin/lvl_16/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_14.bm diff --git a/assets/resources/dolphin/lvl_16/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_15.bm diff --git a/assets/resources/dolphin/lvl_16/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_16.bm diff --git a/assets/resources/dolphin/lvl_16/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_17.bm diff --git a/assets/resources/dolphin/lvl_16/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_18.bm diff --git a/assets/resources/dolphin/lvl_16/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_19.bm diff --git a/assets/resources/dolphin/lvl_16/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_2.bm diff --git a/assets/resources/dolphin/lvl_16/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_20.bm diff --git a/assets/resources/dolphin/lvl_16/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_3.bm diff --git a/assets/resources/dolphin/lvl_16/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_4.bm diff --git a/assets/resources/dolphin/lvl_16/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_5.bm diff --git a/assets/resources/dolphin/lvl_16/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_6.bm diff --git a/assets/resources/dolphin/lvl_16/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_7.bm diff --git a/assets/resources/dolphin/lvl_16/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_8.bm diff --git a/assets/resources/dolphin/lvl_16/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_16/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_16/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_16/frame_9.bm diff --git a/assets/resources/dolphin/lvl_16/meta.txt b/assets/resources/dolphin/nsfw/lvl_16/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_16/meta.txt rename to assets/resources/dolphin/nsfw/lvl_16/meta.txt diff --git a/assets/resources/dolphin/lvl_17/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_0.bm diff --git a/assets/resources/dolphin/lvl_17/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_1.bm diff --git a/assets/resources/dolphin/lvl_17/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_10.bm diff --git a/assets/resources/dolphin/lvl_17/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_11.bm diff --git a/assets/resources/dolphin/lvl_17/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_12.bm diff --git a/assets/resources/dolphin/lvl_17/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_13.bm diff --git a/assets/resources/dolphin/lvl_17/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_14.bm diff --git a/assets/resources/dolphin/lvl_17/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_15.bm diff --git a/assets/resources/dolphin/lvl_17/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_16.bm diff --git a/assets/resources/dolphin/lvl_17/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_17.bm diff --git a/assets/resources/dolphin/lvl_17/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_18.bm diff --git a/assets/resources/dolphin/lvl_17/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_19.bm diff --git a/assets/resources/dolphin/lvl_17/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_2.bm diff --git a/assets/resources/dolphin/lvl_17/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_20.bm diff --git a/assets/resources/dolphin/lvl_17/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_21.bm diff --git a/assets/resources/dolphin/lvl_17/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_22.bm diff --git a/assets/resources/dolphin/lvl_17/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_23.bm diff --git a/assets/resources/dolphin/lvl_17/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_24.bm diff --git a/assets/resources/dolphin/lvl_17/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_25.bm diff --git a/assets/resources/dolphin/lvl_17/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_26.bm diff --git a/assets/resources/dolphin/lvl_17/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_27.bm diff --git a/assets/resources/dolphin/lvl_17/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_28.bm diff --git a/assets/resources/dolphin/lvl_17/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_29.bm diff --git a/assets/resources/dolphin/lvl_17/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_3.bm diff --git a/assets/resources/dolphin/lvl_17/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_30.bm diff --git a/assets/resources/dolphin/lvl_17/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_31.bm diff --git a/assets/resources/dolphin/lvl_17/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_4.bm diff --git a/assets/resources/dolphin/lvl_17/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_5.bm diff --git a/assets/resources/dolphin/lvl_17/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_6.bm diff --git a/assets/resources/dolphin/lvl_17/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_7.bm diff --git a/assets/resources/dolphin/lvl_17/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_8.bm diff --git a/assets/resources/dolphin/lvl_17/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_17/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_17/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_17/frame_9.bm diff --git a/assets/resources/dolphin/lvl_17/meta.txt b/assets/resources/dolphin/nsfw/lvl_17/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_17/meta.txt rename to assets/resources/dolphin/nsfw/lvl_17/meta.txt diff --git a/assets/resources/dolphin/lvl_18/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_0.bm diff --git a/assets/resources/dolphin/lvl_18/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_1.bm diff --git a/assets/resources/dolphin/lvl_18/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_10.bm diff --git a/assets/resources/dolphin/lvl_18/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_11.bm diff --git a/assets/resources/dolphin/lvl_18/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_12.bm diff --git a/assets/resources/dolphin/lvl_18/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_13.bm diff --git a/assets/resources/dolphin/lvl_18/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_14.bm diff --git a/assets/resources/dolphin/lvl_18/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_15.bm diff --git a/assets/resources/dolphin/lvl_18/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_16.bm diff --git a/assets/resources/dolphin/lvl_18/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_17.bm diff --git a/assets/resources/dolphin/lvl_18/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_18.bm diff --git a/assets/resources/dolphin/lvl_18/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_19.bm diff --git a/assets/resources/dolphin/lvl_18/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_2.bm diff --git a/assets/resources/dolphin/lvl_18/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_20.bm diff --git a/assets/resources/dolphin/lvl_18/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_21.bm diff --git a/assets/resources/dolphin/lvl_18/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_22.bm diff --git a/assets/resources/dolphin/lvl_18/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_3.bm diff --git a/assets/resources/dolphin/lvl_18/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_4.bm diff --git a/assets/resources/dolphin/lvl_18/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_5.bm diff --git a/assets/resources/dolphin/lvl_18/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_6.bm diff --git a/assets/resources/dolphin/lvl_18/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_7.bm diff --git a/assets/resources/dolphin/lvl_18/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_8.bm diff --git a/assets/resources/dolphin/lvl_18/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_18/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_18/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_18/frame_9.bm diff --git a/assets/resources/dolphin/lvl_18/meta.txt b/assets/resources/dolphin/nsfw/lvl_18/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_18/meta.txt rename to assets/resources/dolphin/nsfw/lvl_18/meta.txt diff --git a/assets/resources/dolphin/lvl_19/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_0.bm diff --git a/assets/resources/dolphin/lvl_19/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_1.bm diff --git a/assets/resources/dolphin/lvl_19/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_10.bm diff --git a/assets/resources/dolphin/lvl_19/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_11.bm diff --git a/assets/resources/dolphin/lvl_19/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_12.bm diff --git a/assets/resources/dolphin/lvl_19/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_13.bm diff --git a/assets/resources/dolphin/lvl_19/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_14.bm diff --git a/assets/resources/dolphin/lvl_19/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_15.bm diff --git a/assets/resources/dolphin/lvl_19/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_16.bm diff --git a/assets/resources/dolphin/lvl_19/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_17.bm diff --git a/assets/resources/dolphin/lvl_19/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_18.bm diff --git a/assets/resources/dolphin/lvl_19/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_19.bm diff --git a/assets/resources/dolphin/lvl_19/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_2.bm diff --git a/assets/resources/dolphin/lvl_19/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_20.bm diff --git a/assets/resources/dolphin/lvl_19/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_21.bm diff --git a/assets/resources/dolphin/lvl_19/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_3.bm diff --git a/assets/resources/dolphin/lvl_19/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_4.bm diff --git a/assets/resources/dolphin/lvl_19/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_5.bm diff --git a/assets/resources/dolphin/lvl_19/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_6.bm diff --git a/assets/resources/dolphin/lvl_19/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_7.bm diff --git a/assets/resources/dolphin/lvl_19/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_8.bm diff --git a/assets/resources/dolphin/lvl_19/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_19/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_19/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_19/frame_9.bm diff --git a/assets/resources/dolphin/lvl_19/meta.txt b/assets/resources/dolphin/nsfw/lvl_19/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_19/meta.txt rename to assets/resources/dolphin/nsfw/lvl_19/meta.txt diff --git a/assets/resources/dolphin/lvl_2/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_0.bm diff --git a/assets/resources/dolphin/lvl_2/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_1.bm diff --git a/assets/resources/dolphin/lvl_2/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_10.bm diff --git a/assets/resources/dolphin/lvl_2/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_11.bm diff --git a/assets/resources/dolphin/lvl_2/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_12.bm diff --git a/assets/resources/dolphin/lvl_2/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_13.bm diff --git a/assets/resources/dolphin/lvl_2/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_14.bm diff --git a/assets/resources/dolphin/lvl_2/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_2.bm diff --git a/assets/resources/dolphin/lvl_2/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_3.bm diff --git a/assets/resources/dolphin/lvl_2/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_4.bm diff --git a/assets/resources/dolphin/lvl_2/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_5.bm diff --git a/assets/resources/dolphin/lvl_2/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_6.bm diff --git a/assets/resources/dolphin/lvl_2/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_7.bm diff --git a/assets/resources/dolphin/lvl_2/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_8.bm diff --git a/assets/resources/dolphin/lvl_2/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_2/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_2/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_2/frame_9.bm diff --git a/assets/resources/dolphin/lvl_2/meta.txt b/assets/resources/dolphin/nsfw/lvl_2/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_2/meta.txt rename to assets/resources/dolphin/nsfw/lvl_2/meta.txt diff --git a/assets/resources/dolphin/lvl_20/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_0.bm diff --git a/assets/resources/dolphin/lvl_20/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_1.bm diff --git a/assets/resources/dolphin/lvl_20/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_10.bm diff --git a/assets/resources/dolphin/lvl_20/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_11.bm diff --git a/assets/resources/dolphin/lvl_20/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_12.bm diff --git a/assets/resources/dolphin/lvl_20/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_13.bm diff --git a/assets/resources/dolphin/lvl_20/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_2.bm diff --git a/assets/resources/dolphin/lvl_20/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_3.bm diff --git a/assets/resources/dolphin/lvl_20/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_4.bm diff --git a/assets/resources/dolphin/lvl_20/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_5.bm diff --git a/assets/resources/dolphin/lvl_20/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_6.bm diff --git a/assets/resources/dolphin/lvl_20/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_7.bm diff --git a/assets/resources/dolphin/lvl_20/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_8.bm diff --git a/assets/resources/dolphin/lvl_20/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_20/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_20/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_20/frame_9.bm diff --git a/assets/resources/dolphin/lvl_20/meta.txt b/assets/resources/dolphin/nsfw/lvl_20/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_20/meta.txt rename to assets/resources/dolphin/nsfw/lvl_20/meta.txt diff --git a/assets/resources/dolphin/lvl_21/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_0.bm diff --git a/assets/resources/dolphin/lvl_21/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_1.bm diff --git a/assets/resources/dolphin/lvl_21/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_2.bm diff --git a/assets/resources/dolphin/lvl_21/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_3.bm diff --git a/assets/resources/dolphin/lvl_21/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_4.bm diff --git a/assets/resources/dolphin/lvl_21/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_21/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_21/frame_5.bm diff --git a/assets/resources/dolphin/lvl_21/meta.txt b/assets/resources/dolphin/nsfw/lvl_21/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_21/meta.txt rename to assets/resources/dolphin/nsfw/lvl_21/meta.txt diff --git a/assets/resources/dolphin/lvl_22/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_0.bm diff --git a/assets/resources/dolphin/lvl_22/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_1.bm diff --git a/assets/resources/dolphin/lvl_21/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_10.bm diff --git a/assets/resources/dolphin/lvl_21/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_11.bm diff --git a/assets/resources/dolphin/lvl_21/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_12.bm diff --git a/assets/resources/dolphin/lvl_21/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_13.bm diff --git a/assets/resources/dolphin/lvl_21/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_14.bm diff --git a/assets/resources/dolphin/lvl_21/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_15.bm diff --git a/assets/resources/dolphin/lvl_21/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_16.bm diff --git a/assets/resources/dolphin/lvl_21/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_17.bm diff --git a/assets/resources/dolphin/lvl_21/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_18.bm diff --git a/assets/resources/dolphin/lvl_21/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_19.bm diff --git a/assets/resources/dolphin/lvl_22/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_2.bm diff --git a/assets/resources/dolphin/lvl_21/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_20.bm diff --git a/assets/resources/dolphin/lvl_21/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_21.bm diff --git a/assets/resources/dolphin/lvl_21/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_22.bm diff --git a/assets/resources/dolphin/lvl_21/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_23.bm diff --git a/assets/resources/dolphin/lvl_21/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_24.bm diff --git a/assets/resources/dolphin/lvl_21/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_25.bm diff --git a/assets/resources/dolphin/lvl_21/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_26.bm diff --git a/assets/resources/dolphin/lvl_21/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_27.bm diff --git a/assets/resources/dolphin/lvl_21/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_28.bm diff --git a/assets/resources/dolphin/lvl_21/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_29.bm diff --git a/assets/resources/dolphin/lvl_22/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_3.bm diff --git a/assets/resources/dolphin/lvl_21/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_30.bm diff --git a/assets/resources/dolphin/lvl_21/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_31.bm diff --git a/assets/resources/dolphin/lvl_21/frame_32.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_32.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_32.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_32.bm diff --git a/assets/resources/dolphin/lvl_21/frame_33.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_33.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_33.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_33.bm diff --git a/assets/resources/dolphin/lvl_21/frame_34.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_34.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_34.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_34.bm diff --git a/assets/resources/dolphin/lvl_21/frame_35.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_35.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_35.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_35.bm diff --git a/assets/resources/dolphin/lvl_21/frame_36.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_36.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_36.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_36.bm diff --git a/assets/resources/dolphin/lvl_21/frame_37.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_37.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_37.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_37.bm diff --git a/assets/resources/dolphin/lvl_21/frame_38.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_38.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_38.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_38.bm diff --git a/assets/resources/dolphin/lvl_21/frame_39.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_39.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_39.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_39.bm diff --git a/assets/resources/dolphin/lvl_22/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_4.bm diff --git a/assets/resources/dolphin/lvl_21/frame_40.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_40.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_40.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_40.bm diff --git a/assets/resources/dolphin/lvl_21/frame_41.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_41.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_41.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_41.bm diff --git a/assets/resources/dolphin/lvl_21/frame_42.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_42.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_42.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_42.bm diff --git a/assets/resources/dolphin/lvl_21/frame_43.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_43.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_43.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_43.bm diff --git a/assets/resources/dolphin/lvl_21/frame_44.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_44.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_44.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_44.bm diff --git a/assets/resources/dolphin/lvl_21/frame_45.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_45.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_45.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_45.bm diff --git a/assets/resources/dolphin/lvl_21/frame_46.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_46.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_46.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_46.bm diff --git a/assets/resources/dolphin/lvl_21/frame_47.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_47.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_47.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_47.bm diff --git a/assets/resources/dolphin/lvl_21/frame_48.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_48.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_48.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_48.bm diff --git a/assets/resources/dolphin/lvl_21/frame_49.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_49.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_49.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_49.bm diff --git a/assets/resources/dolphin/lvl_22/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_22/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_5.bm diff --git a/assets/resources/dolphin/lvl_21/frame_50.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_50.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_50.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_50.bm diff --git a/assets/resources/dolphin/lvl_21/frame_51.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_51.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_51.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_51.bm diff --git a/assets/resources/dolphin/lvl_21/frame_52.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_52.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_52.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_52.bm diff --git a/assets/resources/dolphin/lvl_21/frame_53.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_53.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_53.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_53.bm diff --git a/assets/resources/dolphin/lvl_21/frame_54.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_54.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_54.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_54.bm diff --git a/assets/resources/dolphin/lvl_21/frame_55.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_55.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_55.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_55.bm diff --git a/assets/resources/dolphin/lvl_21/frame_56.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_56.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_56.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_56.bm diff --git a/assets/resources/dolphin/lvl_21/frame_57.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_57.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_57.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_57.bm diff --git a/assets/resources/dolphin/lvl_21/frame_58.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_58.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_58.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_58.bm diff --git a/assets/resources/dolphin/lvl_21/frame_59.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_59.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_59.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_59.bm diff --git a/assets/resources/dolphin/lvl_21/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_6.bm diff --git a/assets/resources/dolphin/lvl_21/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_7.bm diff --git a/assets/resources/dolphin/lvl_21/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_8.bm diff --git a/assets/resources/dolphin/lvl_21/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_22/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_21/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_22/frame_9.bm diff --git a/assets/resources/dolphin/lvl_22/meta.txt b/assets/resources/dolphin/nsfw/lvl_22/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_22/meta.txt rename to assets/resources/dolphin/nsfw/lvl_22/meta.txt diff --git a/assets/resources/dolphin/lvl_23/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_0.bm diff --git a/assets/resources/dolphin/lvl_23/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_1.bm diff --git a/assets/resources/dolphin/lvl_23/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_10.bm diff --git a/assets/resources/dolphin/lvl_23/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_11.bm diff --git a/assets/resources/dolphin/lvl_23/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_12.bm diff --git a/assets/resources/dolphin/lvl_23/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_13.bm diff --git a/assets/resources/dolphin/lvl_23/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_14.bm diff --git a/assets/resources/dolphin/lvl_23/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_15.bm diff --git a/assets/resources/dolphin/lvl_23/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_16.bm diff --git a/assets/resources/dolphin/lvl_23/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_2.bm diff --git a/assets/resources/dolphin/lvl_23/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_3.bm diff --git a/assets/resources/dolphin/lvl_23/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_4.bm diff --git a/assets/resources/dolphin/lvl_23/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_5.bm diff --git a/assets/resources/dolphin/lvl_23/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_6.bm diff --git a/assets/resources/dolphin/lvl_23/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_7.bm diff --git a/assets/resources/dolphin/lvl_23/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_8.bm diff --git a/assets/resources/dolphin/lvl_23/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_23/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_23/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_23/frame_9.bm diff --git a/assets/resources/dolphin/lvl_23/meta.txt b/assets/resources/dolphin/nsfw/lvl_23/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_23/meta.txt rename to assets/resources/dolphin/nsfw/lvl_23/meta.txt diff --git a/assets/resources/dolphin/lvl_24/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_0.bm diff --git a/assets/resources/dolphin/lvl_24/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_1.bm diff --git a/assets/resources/dolphin/lvl_24/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_10.bm diff --git a/assets/resources/dolphin/lvl_24/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_11.bm diff --git a/assets/resources/dolphin/lvl_24/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_12.bm diff --git a/assets/resources/dolphin/lvl_24/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_13.bm diff --git a/assets/resources/dolphin/lvl_24/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_14.bm diff --git a/assets/resources/dolphin/lvl_24/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_15.bm diff --git a/assets/resources/dolphin/lvl_24/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_16.bm diff --git a/assets/resources/dolphin/lvl_24/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_17.bm diff --git a/assets/resources/dolphin/lvl_24/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_18.bm diff --git a/assets/resources/dolphin/lvl_24/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_19.bm diff --git a/assets/resources/dolphin/lvl_24/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_2.bm diff --git a/assets/resources/dolphin/lvl_24/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_20.bm diff --git a/assets/resources/dolphin/lvl_24/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_21.bm diff --git a/assets/resources/dolphin/lvl_24/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_22.bm diff --git a/assets/resources/dolphin/lvl_24/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_23.bm diff --git a/assets/resources/dolphin/lvl_24/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_24.bm diff --git a/assets/resources/dolphin/lvl_24/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_25.bm diff --git a/assets/resources/dolphin/lvl_24/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_26.bm diff --git a/assets/resources/dolphin/lvl_24/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_27.bm diff --git a/assets/resources/dolphin/lvl_24/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_28.bm diff --git a/assets/resources/dolphin/lvl_24/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_29.bm diff --git a/assets/resources/dolphin/lvl_24/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_3.bm diff --git a/assets/resources/dolphin/lvl_24/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_4.bm diff --git a/assets/resources/dolphin/lvl_24/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_5.bm diff --git a/assets/resources/dolphin/lvl_24/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_6.bm diff --git a/assets/resources/dolphin/lvl_24/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_7.bm diff --git a/assets/resources/dolphin/lvl_24/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_8.bm diff --git a/assets/resources/dolphin/lvl_24/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_24/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_24/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_24/frame_9.bm diff --git a/assets/resources/dolphin/lvl_24/meta.txt b/assets/resources/dolphin/nsfw/lvl_24/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_24/meta.txt rename to assets/resources/dolphin/nsfw/lvl_24/meta.txt diff --git a/assets/resources/dolphin/lvl_25/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_0.bm diff --git a/assets/resources/dolphin/lvl_25/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_1.bm diff --git a/assets/resources/dolphin/lvl_25/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_10.bm diff --git a/assets/resources/dolphin/lvl_25/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_11.bm diff --git a/assets/resources/dolphin/lvl_25/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_12.bm diff --git a/assets/resources/dolphin/lvl_25/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_13.bm diff --git a/assets/resources/dolphin/lvl_25/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_14.bm diff --git a/assets/resources/dolphin/lvl_25/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_15.bm diff --git a/assets/resources/dolphin/lvl_25/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_16.bm diff --git a/assets/resources/dolphin/lvl_25/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_17.bm diff --git a/assets/resources/dolphin/lvl_25/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_18.bm diff --git a/assets/resources/dolphin/lvl_25/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_19.bm diff --git a/assets/resources/dolphin/lvl_25/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_2.bm diff --git a/assets/resources/dolphin/lvl_25/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_20.bm diff --git a/assets/resources/dolphin/lvl_25/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_21.bm diff --git a/assets/resources/dolphin/lvl_25/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_22.bm diff --git a/assets/resources/dolphin/lvl_25/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_23.bm diff --git a/assets/resources/dolphin/lvl_25/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_24.bm diff --git a/assets/resources/dolphin/lvl_25/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_25.bm diff --git a/assets/resources/dolphin/lvl_25/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_26.bm diff --git a/assets/resources/dolphin/lvl_25/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_27.bm diff --git a/assets/resources/dolphin/lvl_25/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_28.bm diff --git a/assets/resources/dolphin/lvl_25/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_29.bm diff --git a/assets/resources/dolphin/lvl_25/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_3.bm diff --git a/assets/resources/dolphin/lvl_25/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_30.bm diff --git a/assets/resources/dolphin/lvl_25/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_31.bm diff --git a/assets/resources/dolphin/lvl_25/frame_32.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_32.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_32.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_32.bm diff --git a/assets/resources/dolphin/lvl_25/frame_33.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_33.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_33.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_33.bm diff --git a/assets/resources/dolphin/lvl_25/frame_34.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_34.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_34.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_34.bm diff --git a/assets/resources/dolphin/lvl_25/frame_35.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_35.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_35.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_35.bm diff --git a/assets/resources/dolphin/lvl_25/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_4.bm diff --git a/assets/resources/dolphin/lvl_25/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_5.bm diff --git a/assets/resources/dolphin/lvl_25/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_6.bm diff --git a/assets/resources/dolphin/lvl_25/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_7.bm diff --git a/assets/resources/dolphin/lvl_25/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_8.bm diff --git a/assets/resources/dolphin/lvl_25/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_25/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_25/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_25/frame_9.bm diff --git a/assets/resources/dolphin/lvl_25/meta.txt b/assets/resources/dolphin/nsfw/lvl_25/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_25/meta.txt rename to assets/resources/dolphin/nsfw/lvl_25/meta.txt diff --git a/assets/resources/dolphin/lvl_26/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_0.bm diff --git a/assets/resources/dolphin/lvl_26/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_1.bm diff --git a/assets/resources/dolphin/lvl_26/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_10.bm diff --git a/assets/resources/dolphin/lvl_26/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_11.bm diff --git a/assets/resources/dolphin/lvl_26/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_2.bm diff --git a/assets/resources/dolphin/lvl_26/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_3.bm diff --git a/assets/resources/dolphin/lvl_26/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_4.bm diff --git a/assets/resources/dolphin/lvl_26/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_5.bm diff --git a/assets/resources/dolphin/lvl_26/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_6.bm diff --git a/assets/resources/dolphin/lvl_26/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_7.bm diff --git a/assets/resources/dolphin/lvl_26/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_8.bm diff --git a/assets/resources/dolphin/lvl_26/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_26/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_26/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_26/frame_9.bm diff --git a/assets/resources/dolphin/lvl_26/meta.txt b/assets/resources/dolphin/nsfw/lvl_26/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_26/meta.txt rename to assets/resources/dolphin/nsfw/lvl_26/meta.txt diff --git a/assets/resources/dolphin/lvl_27/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_0.bm diff --git a/assets/resources/dolphin/lvl_27/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_1.bm diff --git a/assets/resources/dolphin/lvl_27/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_10.bm diff --git a/assets/resources/dolphin/lvl_27/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_11.bm diff --git a/assets/resources/dolphin/lvl_27/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_12.bm diff --git a/assets/resources/dolphin/lvl_27/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_13.bm diff --git a/assets/resources/dolphin/lvl_27/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_14.bm diff --git a/assets/resources/dolphin/lvl_27/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_15.bm diff --git a/assets/resources/dolphin/lvl_27/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_16.bm diff --git a/assets/resources/dolphin/lvl_27/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_17.bm diff --git a/assets/resources/dolphin/lvl_27/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_18.bm diff --git a/assets/resources/dolphin/lvl_27/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_19.bm diff --git a/assets/resources/dolphin/lvl_27/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_2.bm diff --git a/assets/resources/dolphin/lvl_27/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_20.bm diff --git a/assets/resources/dolphin/lvl_27/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_21.bm diff --git a/assets/resources/dolphin/lvl_27/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_3.bm diff --git a/assets/resources/dolphin/lvl_27/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_4.bm diff --git a/assets/resources/dolphin/lvl_27/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_5.bm diff --git a/assets/resources/dolphin/lvl_27/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_6.bm diff --git a/assets/resources/dolphin/lvl_27/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_7.bm diff --git a/assets/resources/dolphin/lvl_27/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_8.bm diff --git a/assets/resources/dolphin/lvl_27/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_27/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_27/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_27/frame_9.bm diff --git a/assets/resources/dolphin/lvl_27/meta.txt b/assets/resources/dolphin/nsfw/lvl_27/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_27/meta.txt rename to assets/resources/dolphin/nsfw/lvl_27/meta.txt diff --git a/assets/resources/dolphin/lvl_28/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_0.bm diff --git a/assets/resources/dolphin/lvl_28/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_1.bm diff --git a/assets/resources/dolphin/lvl_28/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_2.bm diff --git a/assets/resources/dolphin/lvl_28/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_3.bm diff --git a/assets/resources/dolphin/lvl_28/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_4.bm diff --git a/assets/resources/dolphin/lvl_28/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_28/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_28/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_28/frame_5.bm diff --git a/assets/resources/dolphin/lvl_28/meta.txt b/assets/resources/dolphin/nsfw/lvl_28/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_28/meta.txt rename to assets/resources/dolphin/nsfw/lvl_28/meta.txt diff --git a/assets/resources/dolphin/lvl_29/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_0.bm diff --git a/assets/resources/dolphin/lvl_29/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_1.bm diff --git a/assets/resources/dolphin/lvl_29/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_10.bm diff --git a/assets/resources/dolphin/lvl_29/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_11.bm diff --git a/assets/resources/dolphin/lvl_29/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_12.bm diff --git a/assets/resources/dolphin/lvl_29/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_13.bm diff --git a/assets/resources/dolphin/lvl_29/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_14.bm diff --git a/assets/resources/dolphin/lvl_29/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_15.bm diff --git a/assets/resources/dolphin/lvl_29/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_16.bm diff --git a/assets/resources/dolphin/lvl_29/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_17.bm diff --git a/assets/resources/dolphin/lvl_29/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_18.bm diff --git a/assets/resources/dolphin/lvl_29/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_19.bm diff --git a/assets/resources/dolphin/lvl_29/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_2.bm diff --git a/assets/resources/dolphin/lvl_29/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_20.bm diff --git a/assets/resources/dolphin/lvl_29/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_21.bm diff --git a/assets/resources/dolphin/lvl_29/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_22.bm diff --git a/assets/resources/dolphin/lvl_29/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_23.bm diff --git a/assets/resources/dolphin/lvl_29/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_24.bm diff --git a/assets/resources/dolphin/lvl_29/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_25.bm diff --git a/assets/resources/dolphin/lvl_29/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_26.bm diff --git a/assets/resources/dolphin/lvl_29/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_27.bm diff --git a/assets/resources/dolphin/lvl_29/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_28.bm diff --git a/assets/resources/dolphin/lvl_29/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_29.bm diff --git a/assets/resources/dolphin/lvl_29/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_3.bm diff --git a/assets/resources/dolphin/lvl_29/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_30.bm diff --git a/assets/resources/dolphin/lvl_29/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_31.bm diff --git a/assets/resources/dolphin/lvl_29/frame_32.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_32.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_32.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_32.bm diff --git a/assets/resources/dolphin/lvl_29/frame_33.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_33.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_33.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_33.bm diff --git a/assets/resources/dolphin/lvl_29/frame_34.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_34.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_34.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_34.bm diff --git a/assets/resources/dolphin/lvl_29/frame_35.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_35.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_35.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_35.bm diff --git a/assets/resources/dolphin/lvl_29/frame_36.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_36.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_36.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_36.bm diff --git a/assets/resources/dolphin/lvl_29/frame_37.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_37.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_37.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_37.bm diff --git a/assets/resources/dolphin/lvl_29/frame_38.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_38.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_38.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_38.bm diff --git a/assets/resources/dolphin/lvl_29/frame_39.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_39.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_39.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_39.bm diff --git a/assets/resources/dolphin/lvl_29/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_4.bm diff --git a/assets/resources/dolphin/lvl_29/frame_40.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_40.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_40.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_40.bm diff --git a/assets/resources/dolphin/lvl_29/frame_41.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_41.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_41.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_41.bm diff --git a/assets/resources/dolphin/lvl_29/frame_42.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_42.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_42.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_42.bm diff --git a/assets/resources/dolphin/lvl_29/frame_43.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_43.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_43.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_43.bm diff --git a/assets/resources/dolphin/lvl_29/frame_44.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_44.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_44.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_44.bm diff --git a/assets/resources/dolphin/lvl_29/frame_45.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_45.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_45.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_45.bm diff --git a/assets/resources/dolphin/lvl_29/frame_46.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_46.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_46.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_46.bm diff --git a/assets/resources/dolphin/lvl_29/frame_47.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_47.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_47.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_47.bm diff --git a/assets/resources/dolphin/lvl_29/frame_48.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_48.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_48.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_48.bm diff --git a/assets/resources/dolphin/lvl_29/frame_49.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_49.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_49.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_49.bm diff --git a/assets/resources/dolphin/lvl_29/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_5.bm diff --git a/assets/resources/dolphin/lvl_29/frame_50.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_50.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_50.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_50.bm diff --git a/assets/resources/dolphin/lvl_29/frame_51.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_51.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_51.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_51.bm diff --git a/assets/resources/dolphin/lvl_29/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_6.bm diff --git a/assets/resources/dolphin/lvl_29/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_7.bm diff --git a/assets/resources/dolphin/lvl_29/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_8.bm diff --git a/assets/resources/dolphin/lvl_29/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_29/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_29/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_29/frame_9.bm diff --git a/assets/resources/dolphin/lvl_29/meta.txt b/assets/resources/dolphin/nsfw/lvl_29/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_29/meta.txt rename to assets/resources/dolphin/nsfw/lvl_29/meta.txt diff --git a/assets/resources/dolphin/lvl_3/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_0.bm diff --git a/assets/resources/dolphin/lvl_3/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_1.bm diff --git a/assets/resources/dolphin/lvl_3/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_10.bm diff --git a/assets/resources/dolphin/lvl_3/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_11.bm diff --git a/assets/resources/dolphin/lvl_3/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_12.bm diff --git a/assets/resources/dolphin/lvl_3/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_13.bm diff --git a/assets/resources/dolphin/lvl_3/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_14.bm diff --git a/assets/resources/dolphin/lvl_3/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_2.bm diff --git a/assets/resources/dolphin/lvl_3/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_3.bm diff --git a/assets/resources/dolphin/lvl_3/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_4.bm diff --git a/assets/resources/dolphin/lvl_3/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_5.bm diff --git a/assets/resources/dolphin/lvl_3/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_6.bm diff --git a/assets/resources/dolphin/lvl_3/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_7.bm diff --git a/assets/resources/dolphin/lvl_3/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_8.bm diff --git a/assets/resources/dolphin/lvl_3/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_3/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_3/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_3/frame_9.bm diff --git a/assets/resources/dolphin/lvl_3/meta.txt b/assets/resources/dolphin/nsfw/lvl_3/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_3/meta.txt rename to assets/resources/dolphin/nsfw/lvl_3/meta.txt diff --git a/assets/resources/dolphin/lvl_30/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_0.bm diff --git a/assets/resources/dolphin/lvl_30/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_1.bm diff --git a/assets/resources/dolphin/lvl_30/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_10.bm diff --git a/assets/resources/dolphin/lvl_30/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_11.bm diff --git a/assets/resources/dolphin/lvl_30/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_12.bm diff --git a/assets/resources/dolphin/lvl_30/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_13.bm diff --git a/assets/resources/dolphin/lvl_30/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_14.bm diff --git a/assets/resources/dolphin/lvl_30/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_15.bm diff --git a/assets/resources/dolphin/lvl_30/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_16.bm diff --git a/assets/resources/dolphin/lvl_30/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_17.bm diff --git a/assets/resources/dolphin/lvl_30/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_18.bm diff --git a/assets/resources/dolphin/lvl_30/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_19.bm diff --git a/assets/resources/dolphin/lvl_30/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_2.bm diff --git a/assets/resources/dolphin/lvl_30/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_20.bm diff --git a/assets/resources/dolphin/lvl_30/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_21.bm diff --git a/assets/resources/dolphin/lvl_30/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_22.bm diff --git a/assets/resources/dolphin/lvl_30/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_23.bm diff --git a/assets/resources/dolphin/lvl_30/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_24.bm diff --git a/assets/resources/dolphin/lvl_30/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_25.bm diff --git a/assets/resources/dolphin/lvl_30/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_26.bm diff --git a/assets/resources/dolphin/lvl_30/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_27.bm diff --git a/assets/resources/dolphin/lvl_30/frame_28.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_28.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_28.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_28.bm diff --git a/assets/resources/dolphin/lvl_30/frame_29.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_29.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_29.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_29.bm diff --git a/assets/resources/dolphin/lvl_30/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_3.bm diff --git a/assets/resources/dolphin/lvl_30/frame_30.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_30.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_30.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_30.bm diff --git a/assets/resources/dolphin/lvl_30/frame_31.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_31.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_31.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_31.bm diff --git a/assets/resources/dolphin/lvl_30/frame_32.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_32.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_32.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_32.bm diff --git a/assets/resources/dolphin/lvl_30/frame_33.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_33.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_33.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_33.bm diff --git a/assets/resources/dolphin/lvl_30/frame_34.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_34.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_34.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_34.bm diff --git a/assets/resources/dolphin/lvl_30/frame_35.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_35.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_35.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_35.bm diff --git a/assets/resources/dolphin/lvl_30/frame_36.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_36.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_36.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_36.bm diff --git a/assets/resources/dolphin/lvl_30/frame_37.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_37.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_37.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_37.bm diff --git a/assets/resources/dolphin/lvl_30/frame_38.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_38.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_38.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_38.bm diff --git a/assets/resources/dolphin/lvl_30/frame_39.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_39.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_39.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_39.bm diff --git a/assets/resources/dolphin/lvl_30/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_4.bm diff --git a/assets/resources/dolphin/lvl_30/frame_40.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_40.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_40.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_40.bm diff --git a/assets/resources/dolphin/lvl_30/frame_41.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_41.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_41.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_41.bm diff --git a/assets/resources/dolphin/lvl_30/frame_42.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_42.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_42.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_42.bm diff --git a/assets/resources/dolphin/lvl_30/frame_43.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_43.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_43.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_43.bm diff --git a/assets/resources/dolphin/lvl_30/frame_44.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_44.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_44.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_44.bm diff --git a/assets/resources/dolphin/lvl_30/frame_45.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_45.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_45.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_45.bm diff --git a/assets/resources/dolphin/lvl_30/frame_46.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_46.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_46.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_46.bm diff --git a/assets/resources/dolphin/lvl_30/frame_47.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_47.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_47.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_47.bm diff --git a/assets/resources/dolphin/lvl_30/frame_48.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_48.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_48.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_48.bm diff --git a/assets/resources/dolphin/lvl_30/frame_49.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_49.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_49.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_49.bm diff --git a/assets/resources/dolphin/lvl_30/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_5.bm diff --git a/assets/resources/dolphin/lvl_30/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_6.bm diff --git a/assets/resources/dolphin/lvl_30/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_7.bm diff --git a/assets/resources/dolphin/lvl_30/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_8.bm diff --git a/assets/resources/dolphin/lvl_30/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_30/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_30/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_30/frame_9.bm diff --git a/assets/resources/dolphin/lvl_30/meta.txt b/assets/resources/dolphin/nsfw/lvl_30/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_30/meta.txt rename to assets/resources/dolphin/nsfw/lvl_30/meta.txt diff --git a/assets/resources/dolphin/lvl_4/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_0.bm diff --git a/assets/resources/dolphin/lvl_4/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_1.bm diff --git a/assets/resources/dolphin/lvl_4/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_10.bm diff --git a/assets/resources/dolphin/lvl_4/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_11.bm diff --git a/assets/resources/dolphin/lvl_4/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_12.bm diff --git a/assets/resources/dolphin/lvl_4/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_13.bm diff --git a/assets/resources/dolphin/lvl_4/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_14.bm diff --git a/assets/resources/dolphin/lvl_4/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_15.bm diff --git a/assets/resources/dolphin/lvl_4/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_16.bm diff --git a/assets/resources/dolphin/lvl_4/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_17.bm diff --git a/assets/resources/dolphin/lvl_4/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_18.bm diff --git a/assets/resources/dolphin/lvl_4/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_19.bm diff --git a/assets/resources/dolphin/lvl_4/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_2.bm diff --git a/assets/resources/dolphin/lvl_4/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_3.bm diff --git a/assets/resources/dolphin/lvl_4/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_4.bm diff --git a/assets/resources/dolphin/lvl_4/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_5.bm diff --git a/assets/resources/dolphin/lvl_4/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_6.bm diff --git a/assets/resources/dolphin/lvl_4/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_7.bm diff --git a/assets/resources/dolphin/lvl_4/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_8.bm diff --git a/assets/resources/dolphin/lvl_4/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_4/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_4/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_4/frame_9.bm diff --git a/assets/resources/dolphin/lvl_4/meta.txt b/assets/resources/dolphin/nsfw/lvl_4/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_4/meta.txt rename to assets/resources/dolphin/nsfw/lvl_4/meta.txt diff --git a/assets/resources/dolphin/lvl_5/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_0.bm diff --git a/assets/resources/dolphin/lvl_5/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_1.bm diff --git a/assets/resources/dolphin/lvl_5/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_10.bm diff --git a/assets/resources/dolphin/lvl_5/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_11.bm diff --git a/assets/resources/dolphin/lvl_5/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_12.bm diff --git a/assets/resources/dolphin/lvl_5/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_13.bm diff --git a/assets/resources/dolphin/lvl_5/frame_14.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_14.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_14.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_14.bm diff --git a/assets/resources/dolphin/lvl_5/frame_15.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_15.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_15.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_15.bm diff --git a/assets/resources/dolphin/lvl_5/frame_16.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_16.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_16.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_16.bm diff --git a/assets/resources/dolphin/lvl_5/frame_17.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_17.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_17.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_17.bm diff --git a/assets/resources/dolphin/lvl_5/frame_18.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_18.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_18.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_18.bm diff --git a/assets/resources/dolphin/lvl_5/frame_19.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_19.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_19.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_19.bm diff --git a/assets/resources/dolphin/lvl_5/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_2.bm diff --git a/assets/resources/dolphin/lvl_5/frame_20.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_20.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_20.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_20.bm diff --git a/assets/resources/dolphin/lvl_5/frame_21.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_21.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_21.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_21.bm diff --git a/assets/resources/dolphin/lvl_5/frame_22.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_22.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_22.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_22.bm diff --git a/assets/resources/dolphin/lvl_5/frame_23.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_23.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_23.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_23.bm diff --git a/assets/resources/dolphin/lvl_5/frame_24.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_24.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_24.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_24.bm diff --git a/assets/resources/dolphin/lvl_5/frame_25.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_25.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_25.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_25.bm diff --git a/assets/resources/dolphin/lvl_5/frame_26.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_26.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_26.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_26.bm diff --git a/assets/resources/dolphin/lvl_5/frame_27.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_27.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_27.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_27.bm diff --git a/assets/resources/dolphin/lvl_5/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_3.bm diff --git a/assets/resources/dolphin/lvl_5/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_4.bm diff --git a/assets/resources/dolphin/lvl_5/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_5.bm diff --git a/assets/resources/dolphin/lvl_5/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_6.bm diff --git a/assets/resources/dolphin/lvl_5/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_7.bm diff --git a/assets/resources/dolphin/lvl_5/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_8.bm diff --git a/assets/resources/dolphin/lvl_5/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_5/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_5/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_5/frame_9.bm diff --git a/assets/resources/dolphin/lvl_5/meta.txt b/assets/resources/dolphin/nsfw/lvl_5/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_5/meta.txt rename to assets/resources/dolphin/nsfw/lvl_5/meta.txt diff --git a/assets/resources/dolphin/lvl_6/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_0.bm diff --git a/assets/resources/dolphin/lvl_6/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_1.bm diff --git a/assets/resources/dolphin/lvl_6/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_2.bm diff --git a/assets/resources/dolphin/lvl_6/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_3.bm diff --git a/assets/resources/dolphin/lvl_6/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_4.bm diff --git a/assets/resources/dolphin/lvl_6/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_5.bm diff --git a/assets/resources/dolphin/lvl_6/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_6/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_6/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_6/frame_6.bm diff --git a/assets/resources/dolphin/lvl_6/meta.txt b/assets/resources/dolphin/nsfw/lvl_6/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_6/meta.txt rename to assets/resources/dolphin/nsfw/lvl_6/meta.txt diff --git a/assets/resources/dolphin/lvl_7/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_0.bm diff --git a/assets/resources/dolphin/lvl_7/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_1.bm diff --git a/assets/resources/dolphin/lvl_7/frame_10.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_10.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_10.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_10.bm diff --git a/assets/resources/dolphin/lvl_7/frame_11.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_11.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_11.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_11.bm diff --git a/assets/resources/dolphin/lvl_7/frame_12.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_12.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_12.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_12.bm diff --git a/assets/resources/dolphin/lvl_7/frame_13.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_13.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_13.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_13.bm diff --git a/assets/resources/dolphin/lvl_7/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_2.bm diff --git a/assets/resources/dolphin/lvl_7/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_3.bm diff --git a/assets/resources/dolphin/lvl_7/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_4.bm diff --git a/assets/resources/dolphin/lvl_7/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_5.bm diff --git a/assets/resources/dolphin/lvl_7/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_6.bm diff --git a/assets/resources/dolphin/lvl_7/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_7.bm diff --git a/assets/resources/dolphin/lvl_7/frame_8.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_8.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_8.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_8.bm diff --git a/assets/resources/dolphin/lvl_7/frame_9.bm b/assets/resources/dolphin/nsfw/lvl_7/frame_9.bm similarity index 100% rename from assets/resources/dolphin/lvl_7/frame_9.bm rename to assets/resources/dolphin/nsfw/lvl_7/frame_9.bm diff --git a/assets/resources/dolphin/lvl_7/meta.txt b/assets/resources/dolphin/nsfw/lvl_7/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_7/meta.txt rename to assets/resources/dolphin/nsfw/lvl_7/meta.txt diff --git a/assets/resources/dolphin/lvl_8/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_0.bm diff --git a/assets/resources/dolphin/lvl_8/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_1.bm diff --git a/assets/resources/dolphin/lvl_8/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_2.bm diff --git a/assets/resources/dolphin/lvl_8/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_3.bm diff --git a/assets/resources/dolphin/lvl_8/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_4.bm diff --git a/assets/resources/dolphin/lvl_8/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_8/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_8/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_8/frame_5.bm diff --git a/assets/resources/dolphin/lvl_8/meta.txt b/assets/resources/dolphin/nsfw/lvl_8/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_8/meta.txt rename to assets/resources/dolphin/nsfw/lvl_8/meta.txt diff --git a/assets/resources/dolphin/lvl_9/frame_0.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_0.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_0.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_0.bm diff --git a/assets/resources/dolphin/lvl_9/frame_1.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_1.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_1.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_1.bm diff --git a/assets/resources/dolphin/lvl_9/frame_2.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_2.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_2.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_2.bm diff --git a/assets/resources/dolphin/lvl_9/frame_3.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_3.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_3.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_3.bm diff --git a/assets/resources/dolphin/lvl_9/frame_4.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_4.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_4.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_4.bm diff --git a/assets/resources/dolphin/lvl_9/frame_5.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_5.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_5.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_5.bm diff --git a/assets/resources/dolphin/lvl_9/frame_6.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_6.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_6.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_6.bm diff --git a/assets/resources/dolphin/lvl_9/frame_7.bm b/assets/resources/dolphin/nsfw/lvl_9/frame_7.bm similarity index 100% rename from assets/resources/dolphin/lvl_9/frame_7.bm rename to assets/resources/dolphin/nsfw/lvl_9/frame_7.bm diff --git a/assets/resources/dolphin/lvl_9/meta.txt b/assets/resources/dolphin/nsfw/lvl_9/meta.txt similarity index 100% rename from assets/resources/dolphin/lvl_9/meta.txt rename to assets/resources/dolphin/nsfw/lvl_9/meta.txt diff --git a/assets/resources/dolphin/nsfw/manifest.txt b/assets/resources/dolphin/nsfw/manifest.txt new file mode 100644 index 000000000..1a9dc08c8 --- /dev/null +++ b/assets/resources/dolphin/nsfw/manifest.txt @@ -0,0 +1,212 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +Name: nsfw/lvl_1 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_2 +Min butthurt: 0 +Max butthurt: 14 +Min level: 2 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_3 +Min butthurt: 0 +Max butthurt: 14 +Min level: 3 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_4 +Min butthurt: 0 +Max butthurt: 14 +Min level: 4 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_5 +Min butthurt: 0 +Max butthurt: 14 +Min level: 5 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_6 +Min butthurt: 0 +Max butthurt: 14 +Min level: 6 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_7 +Min butthurt: 0 +Max butthurt: 14 +Min level: 7 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_8 +Min butthurt: 0 +Max butthurt: 14 +Min level: 8 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_9 +Min butthurt: 0 +Max butthurt: 14 +Min level: 9 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_10 +Min butthurt: 0 +Max butthurt: 14 +Min level: 10 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_11 +Min butthurt: 0 +Max butthurt: 14 +Min level: 11 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_12 +Min butthurt: 0 +Max butthurt: 14 +Min level: 12 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_13 +Min butthurt: 0 +Max butthurt: 14 +Min level: 13 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_14 +Min butthurt: 0 +Max butthurt: 14 +Min level: 14 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_15 +Min butthurt: 0 +Max butthurt: 14 +Min level: 15 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_16 +Min butthurt: 0 +Max butthurt: 14 +Min level: 16 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_17 +Min butthurt: 0 +Max butthurt: 14 +Min level: 17 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_18 +Min butthurt: 0 +Max butthurt: 14 +Min level: 18 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_19 +Min butthurt: 0 +Max butthurt: 14 +Min level: 19 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_20 +Min butthurt: 0 +Max butthurt: 14 +Min level: 20 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_21 +Min butthurt: 0 +Max butthurt: 14 +Min level: 21 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_22 +Min butthurt: 0 +Max butthurt: 14 +Min level: 22 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_23 +Min butthurt: 0 +Max butthurt: 14 +Min level: 23 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_24 +Min butthurt: 0 +Max butthurt: 14 +Min level: 24 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_25 +Min butthurt: 0 +Max butthurt: 14 +Min level: 25 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_26 +Min butthurt: 0 +Max butthurt: 14 +Min level: 26 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_27 +Min butthurt: 0 +Max butthurt: 14 +Min level: 27 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_28 +Min butthurt: 0 +Max butthurt: 14 +Min level: 28 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_29 +Min butthurt: 0 +Max butthurt: 14 +Min level: 29 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_30 +Min butthurt: 0 +Max butthurt: 14 +Min level: 30 +Max level: 30 +Weight: 9 \ No newline at end of file diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..46079c3728bbc787dac3b6bd912534c3cb26c2dc GIT binary patch literal 481 zcmV<70UrJV0Nnuq41gct{-6W=AJ_nYgZv-l{|EQLAJWJOKV)zscEkbuK!`yZ+7IZ2 zA`k^H{0tv403h%n5x{%GBY^UdKr8^Whl&a-KGuK#@pCZ$fTREYfXmDOv4I8_7$4|8 zWM9wy{zW2%1H=e2Efj7e5vqyGsa1l5#-&xN^>_NMRwDg?{NgbPBEkVj5nrNFDx-1l zhs9(-K@X&ej6;zJl%Rf5@%aPDK9qp^!U4m790)wJ1NH}yWI^RnAHn>AY(wU59C%i$P0j1>yyZb2eSZ&<<EXw3P3+Y`9bg> zGw`qs{?L2IGCmF}0sTSa4~A5K;qqV!{Q=`2l1RPCF<=n=r}ZkY=Heb41yFw9{7xhI zFDwB4@9UBO1B(J5LHS?bB2PRR{qOIQ2c8r@kbrq&0D=!9D38oEA@{_G&~zj7CzJxB z|4{mWm<1(&sQl034`;q07 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..e12d70796299cef4674cbc2e84e90f9f89cdf652 GIT binary patch literal 461 zcmV;;0W$sp0LcLW41gct{|ER#!Tt~HfIq?gs0Z|t0uSgIKV(oKe#l^e?7&DN0RIQ& z0znW0m%@IofB=C?8Ndg{z#eBYLYzDVKl;Doq5uEy!2|jNkN@@qEZ_g1{{Pp(1NLHZ5`cK(00m#7Q7XS*{roa9 zP>mvRO#zP{B1I8dfDER%u^N0_S{9+ME27rFS^biz)e|IKu$OrfJzlYp@m=A^i z13({@Y<|qu!2#onAFWhAQ3xC$9wqgWREOoTfP>0NKU-)#WTfGU z2i*Rg2mm~v^OfMhED%ZsA%8#U20{r$lt1U=0Kh=#f%SiFb)nte>GVQX8}N{kLpDxphzMk`jYS_5(oPa(oq11 z=rM!(lE5Gm0saHX2qW|VhsXpn@ObC|;s8K;MZx|L9)LMu1M+~tA^`CL5CH-H5Ac5g D_X*BS literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..b416740f2772d3a057f2fd7817d1b16adc40af47 GIT binary patch literal 531 zcmV+u0_^<(01pBH41gct{-6W=AJ_nYgZv-l{|EQLAJWJOKV)zscEkbuK!`yZ+7IZ2 zA`k^H^c){C0wF+S0QZDP0pybz04(9)A^*i^+Ry*~UJ(!=fCu&iFE9Sa1Q@u)f57#T ze?Ry66pAD$83+_~QMimosuwDyRuT^yr~rDq{Z^|He!zZl7=w{wfTM`7(I}N)@Bh9Z z7$`hyLG_Ulh;k|-k`Ky0KOlJr#iT$%52PR*H}SxO$b3We2asfNK=G&#;Qm@60K^CI zA1_o5fFt{N6@Y$KvHOF|KwuI3io_mN1^}7x9D%Rn9wc*+m!`v1q^8X)k4#Xu+Y4~RT;0Q1NX)2sad=j0k7 zaDWCve^7ZuGEfLWJcsCiJcrH!4+o6|{`>pHGlCB@`lHGpQCE}$15`htJfxB+0svwd z5&O^ABUOPy0pcG)`Qk?-1cXR1Blo|)MymygNFZzV2b72aGx@y&3n3r1{5(Bg1R{Y6 zU#L8X11Nw*Xb}=HkIJeaNU6AJ8B+R4hv^D{NTeDU`iIgI4;;aiNAlho790vA_Wy=N zK0XWpePmzYc#p;<0FqDuqCY?QJb*(NfJdkTf&dsjCHM#kKP&VI06m}p@_;}v5)gQS VL;#<_c)&s99)L&z_y-VwgV=lG-g*E4 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..b7e15ddeec980a2775b4df50901a2996a7991609 GIT binary patch literal 437 zcmV;m0ZRS>0I>l841gct{|ER#!Tt~HfIq?gs0Z|t0uSgIKV(oKe#l^e?7&DN0RIQ& z0znW0m%=`-fB=C?8DIy+z#ecc0u1NLHZ5`cK(00m#7Q7XSuV1`CY z4;p}dWM9E}$YfC2*hpfPa4=c@OXF0}r_UegN^% z56ZSbf5?6Z=>q-_)qejQ`Mi1+LHxrffbqZ|-TF0H6yP2(0sBV>RDt862aJFoGC}&=L+8+l2i*Q}m=6*VKNtN# zd{AKc(iigvh_l84D1Xf4Vj}Sms{J?+L-`NuDi0_HKz}+YI5=bx0sQ4bu z1P4KoAI(-jfESHKe=;lefF3as{MB|b@OZ!2ev*QC=rM!(lAnlwav*r0gnpm!`2dDq f4<3LVKnM@;dPTwU03VaEVh!?X5CFmc5Ac5gJVnKO literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..202ad6e37bf56c5959bb6ca06bfe101de96248f1 GIT binary patch literal 459 zcmV;+0W|&r0LK9U41gct{|ER#!Tt~HfIq?gs0Z|t0uSgIKV(oKe#l^e?7&DN0RIQ& z0znW0m-wj?004;!0}Kbnz#dcx1i%(>@DTs%|B8qI|1SuL5I_U_0hVw7&;Nho;}HS~ zJtSYC8Azf)@d6BsMH`63YQNBU)oQSjz<~y<)!*v1SdHWl*@?s;hzKA7uhA%#U$6fD z85k%$YC-jpe+AokJ_ZaE5rzZL-w|V$E$z-5DKJ! zoPXj14;BGG-Ua9f3$0RibCfPNrA{TK*8!OC5Y B#Yg}E literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..cdc0a2a343182740de054af8ad6e8a42848e616b GIT binary patch literal 450 zcmV;z0X_Z!0KNeL41gct{|ER#!Tt~HfIq?gs0Z|t0uSgIKV(oKe#l^e?7&DN0RIQ& z0znX0XaGQi!2g5h;14N;0O*kL5dZ4`iiiLI3xIt9f&d@b46}d!fBXLhfO-M#BK-i# zBvAk$$h1+oj7F>d2aQ&$4;p|FYQ0_lt5t~JK>e7QLr8QOfB{$NluEDH|9=dKJY)g( zk$(l_A<-p>esS^pWnd5*0R6+|3BXV)Gy(gE%ZraLjs~bdnU163^}>(p6OjCW@Zt6! zoEJb3A^FzF>jDRu{(^{EsSrG-1O1RM=zd`FU&wr5PzwNkhw2X% skiXadA0QBe#zDjX0t5hH_RvoO$`6hhIbZ|wE{qWVE+GIYKf(SF;Hdb~#sB~S literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L1_Boxing_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..e8ea3aa683605683a11be4c74d8946e2c7f720d3 GIT binary patch literal 442 zcmV;r0Y&}+0JZ@D41gct{|ER#!Tt~HfIq?gs0Z|t0uSgIKV(oKe#l^e?7&DN0RIQ& z0znX0XaGQi!2g5h;14N;0O*kL5dZ4`iiiLI3xIt9f&d@b46}d!fBXLhfO-M#BK-i# zBvAk$$h1+oj7F>d2aQ&$4;p|FYQ0_lt5t~JK>e7QLr8QOfB{$NluEDH|9=dKJY)g( zk$(l_A<kmk_ZF^z(e$o2g*laz(8aN z_Oye?{SlyG8UjCRz&v2k{s#g9fFHF~9zU3V0>V%c`&5DB@du6k9x@U7+d<={hrlQ1 z0jVG2QwV@Zpb$J${v@;nc|k+!zd8+o9#D7u)oK9pfUoBhNC%b$e&O<~gNFe_f6RwK z4=LdOvY_&)kLwT*DZu`N=kOoah#oWvfc~nm5O}~B^NEB5&3_^LAEb%}06`1=f8p{0 k2s~sQKky(x1`lln@EoA{;e(a{KO$(s3FH7^e}nuVz*X;M1& literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Boxing_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Boxing_128x64/meta.txt new file mode 100644 index 000000000..c66998e7d --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Boxing_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 9 +Active frames: 7 +Frames order: 0 1 2 1 3 1 2 3 1 4 5 6 5 6 5 4 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 2 + +Slot: 0 +X: 78 +Y: 16 +Text: F*&K!!! +AlignH: Left +AlignV: Bottom +StartFrame: 2 +EndFrame: 4 + +Slot: 1 +X: 78 +Y: 16 +Text: What ya\nlookin at?! +AlignH: Left +AlignV: Center +StartFrame: 10 +EndFrame: 15 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..9147714c1e291e52f40294d265c696fc6ae5c708 GIT binary patch literal 889 zcmV-<1BUzo0CfYDU~v!(1pp2(7#2ba0isYMQizTMiKK)^720#ulnk15?AeiDP5lAF}9xx0=5)*)eL;*vIpiChW z2vinH0iZ(RGDw921%bdwu@VA^!67(^gd$0#2aG2o4-<&cAdtL-LlH72#WvB=6^$ zQ4eDvkYafN;s=b1k(9{N4`V=qLP6;57zC8|VIja=LFk?n*oQ|+K#)c(0rfqO2M~K0 zLcBrgfS|x-GYE)0a1;oDJz%jH=$^&_5eJOHQYR5Y3=H-;3J z;z8oY7x91w7JEuWz-l1((jLbHfPrEcLJv$`nD!u1$iSfx51=%mkPI2@tdRit)S(|j z=))uM2pR0k!v={`0p0qmg=NQEQeV1R?l2Z%kE5OOgnjNpVn!Fb7!WeAc$ z1f!Ci1qa|V88Pf!BLt8DgdQNl02G+^G6UF@MnQu3AJPpFJ)KZ6R{(lZk7QmNq$-fb z5c;0Q7EYlDjAR%wz!1ZaX#~JRBoNTZ*umpY&^ko+GK>x)fGHaQC}0`G*q8?;2qK8& zqX6?gh@e5^EWpA6;sF>G18D?3jFJVBghWB(z(^j_0Z;-Ah@3DOh1zfsJ0dJZgCxkx zBv>4DAMhV5A-G`&u@;PjAq;>|!R5p~i~txiC=7!EIPg0}9$AS2XlM{9j0y$u|HHxM zgo#2j7?=dAD@2h4#s&{F*vT*;@sUtu7a#e&;DGUjA4EDN0kK~j=L9v1ET|GFO%lZK PKzQIK5;%cCMPd(Nc|%A2 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..789273d9da32277651ffe8631e3a657068af1b5d GIT binary patch literal 911 zcmV;A191ES0E+{N=4y}%1Og=ih+t@t4n&eg0Fhv70YQRPq!LI-7;z9u1TsYts7N6& zNR z$o4WBCPEN{DF6geBP212?4l5f4nX!&3>F~_FbN^-b_y{ZiR@&UCTm-JP96%9yJ9qKr|GH z6vS{)br8r8V*q^)hY(Aq0kl${A!ui1e~BN=8CK2M3m7kc%A! zN|87@PGy}NWfDhP$O924kJkioWNEfk>LZ!5Ro1U96{xXJ()mZ83-379(Dvl z9?48N5cq?L9xxmLSadvsXyjl+Q2-YLLnMO4G#QEnN+Sih1JV+EAn3s&QYadmV_R1v{}fpA@PAsAdmpy;2~$R%tRnq7ckPkiSeHU z#tT3_o+gt3p-ctm0E5y8r2>IMXcZuOz}4dt*p5b%K*~-7>U$ZKjtdf`VltnAX+t0w zv)W9uSO9pJMj0O$j6(o>7zBeQ0NQ*3-lnVhs$3g!A^0FS%5hBEJ4 l45L(JRvY7d;D@rr(jpWI1Om$MMTnlp5kSylWRMF8JwP+AOc?+G literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..a3c87e0a6de7d598766d94945ad530339de2d96f GIT binary patch literal 910 zcmWO3QA`tO007{-UTg2VlWR{l4p!RhabVLjJ?1UZrRd-G=&p`Qkv=S$$tsjd+zY5# zOlnxK6n0muwjFDVS+F2;WG|z-B|aEaLWKikfIckx))b6;=n~i*F-tb*>-YM>Py$hf z1*6D16uKlZ+#2hY7#aLxoMIV_jt6P(W}6dc<>Hu^O~T6vgj_qoJB^|`!{gT(Hyndk zu*s5}hDPLaKNSO&Z~#Bm2MZ1R4LUI<*f|E27LK91wpMox%#&iA1w6Q{y0@V5O`R8& z;bj;oo*zuc-=`nzpv28JiEd7M`G{R>fK3WhD$^tBuvEQBrG|!s-N1Yypcw5J^aUBT znp&PcazMLt!icV#>h91NNZHjtnVZwZK5N2Ld%@`C4g5Crfg*&U-5lsV@$c37;rHJl zmr~feKIp&K&tHnRT7losYBnNNauj~}iBh{;e~o2Qge6`F@7R=Lh;ry|9}rgsm(W}B zxT}$N9bLzrkE<3AZKfYM&&nR#QB>#Q2|I7_L#d3<1gn;1Ghq+m-!7$9bizL~rdi`k zX1EsS(5w%m52LR2K|I~;^ZGZDC*r|->HaY3sMBbO_u>f&?@Y!JTN(_5zjnm?`n!HS z+hwXE2{jYv`uW}ZLm1RW9;@Q z2Q4h62Pot!f1d1FeDD*zD}zBJ+Qqm*>WuU}745z8#Xd@B*!Y;)%V)E)l}Z{$lTE==&kxd&ed~{#*&6c=+@X{`Af>@ zOGD93Ti-4170XD=v*KJ(Y*>0t=(8kfrf{D!TLrGqUr}$Cp@ePuExPdalNZ`dsD-r8 in?r|oA0o2lG%nSK^SznFf@KnUs?wiQ+WepN-~R)iPDSnj literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..ba3012b7e5a476c4d58f100bc9a8ff16e28a31ec GIT binary patch literal 923 zcmWN~-%lEM008j22iDH-bR?NuJW+c(CdW#W3JB1r=X;5%peN8vT34J+c05U-O*d;@yWx$5HozO?*(cecOtOb9P@p&`EO#ew@na zA3d|`+nnDFC=`LL@xGU#Q-aOc{WA1oLf2WZ0v+KD>BoGBmG*$@B-G^>o+sRlhn%c{ zB^Meq;rJcjFILI+SDWBn^`8+ebdPSo+!hr*%m5LwJ)tE#`=PJXX$c48%ScpWPsb@f zQVOwuJ!D@Cj&!+_o`4ceeu1?yH)k!-89iw`q$E4l-1|DzJP2Nt^&32BeE%E#Oxm$s z2ieoNC7@>%U1)NK2wxW(F;-!UygG|yqe6E=PHvkjw^S!ms{tzvl`b#BH>=s;DvesW z{{MF@+^631wT~~yA0y#YoZ0b*qoA)z2q9qZ0aqRHZuk_+>-$d*SBIEt3sFJQGYJFC zWNhCR8}l*DsiLtQeQtQ{C|7UnYb)}6(q+_1^G3L(P2WWTeSIFt>8UO995IS0!gRcK z11cncz;~e&6BZKJnWu9|^$5=M^u$mWD!a{DofF%g8yP?NIZlzXTkCs6_Ky+biB99| z>Mu_IIu|64`K>-zp*U7DU3^I?_GJVOb{mU~0g5BVauYn)C2d1Sm1#R(F|j!|x)0L} z$d#~l7V9&{xNnK5Me$?o9W7D3_R(tZ;}CfaMXJm6jE^03Ve)Rgh1WLt7(e$Gx#lqr zH9pCYq##jW<02w^PfxVq_dp}hKLDj-3H0=|&O+C^3_&TkO u!B>y&mLZ0pg#?B-%Q>X*d-qc`wX#V$vsWyO$N#~c`oU33;av~mpZ^Cg14kzS literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..1ce28c7adb733388b90d31ce7bc1d5e8a5998ebd GIT binary patch literal 894 zcmV-^1A+Vj0D1#}QXrB{1tLKaqDU~1NDLxH1(HIc0P%!K!Q(>2$RZR721bbxq)8@` z08rs5fbq~&q!=1RRsjSSh}dBuA);uaPzV$z3jm-|P9nz~L_$Pm91uKUFjy2IL^!V}{~{_Hpxj^)EDQpmbsSgo z|BsPCQDe+Vl!7HlfWf2i4fGlXM37=i0zDXoCjrEPz&;RIhcNa~DO46E(13XeL%^cM zp)^PbAoe2xfMO}W=V}K8gLXqMJ5Il1yu>guJWSJm(@FFL)gveqLix52pBLIaS%2ATcSpn!e6j;Fr zqbQJMECBPsNKs=7J(Vs2kPoH;14w|L%4bqzjL>o?5f6?e_Hrr|l1KSZjQAc|0*Hvk z{xAs?+g=G8r&DRN@aDL`WVW!2lE(9w)Mhf(H@!KcpD8G72RMBpWM;Jt)BP zhEX6=7$iz!A7m)vL4ye*3}hHFz!1Z*IKx;|QifF+lO)Bo63%I7J2t2!!3I0Ryrg$^jCf zz#&webR9w>p|T#v0!0w`(IF=BpNq?gXc$rKau|pt26^C*gUd*kc%7yW>EmNf6W9Z91RfmQV4{nAz{7?M0O{Eq`@%&afrxd UkMj?d2=*|_Op+oi5P6M82x}2S2LJ#7 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..4cbc4968951c8b4391c7da7a5a90cd8bacf4b245 GIT binary patch literal 940 zcmV~$T}&DW007|Q?l?|B?+4tlrFdKqi%ys0T07Q2oE;wbWtuP&H<;dtx?j^-axY%(8X+J`L~)QX_U8Z9ud{ z$>+pFOveYBQn$Ug3U1KaRUQgZ(uYiM9tjX|W|ir+Fo9Y)A60z&614IFo~{;ZsB}8G z>lV(_4p<4=ne-g*jG*{J0+%vKmTWQl?=Wl73gna`S8yez4&Y5;6QHw*o+PKQCFA&v z>Pn8iUM(WsXR1McYhBpj5T?Ofj+i(w^$Gb{Ekwr=Is_ETi|tEL&i{bU`kj`qnA@X* zX=_^{16!p&47ymo~9}?nvBU)V5th52&`>CH?B68DV_ue1Z0Y|}sd=m`$>P;`B9+>0-W?$EqiBJTcng%6I^rVw7^)5R$I52k`b+v zsW|0TBE|14D?*WL1Uy4#3HSV72k*TeC^mH(2tjQ@ZSG*QJXb`2{^qI`xVFX0<8b;% zmP)O-#cf^Acbh{U8iCEDUN^R0h|ETfH%SLxgf?)!MN4N%HAqu`sbLpJEQee!=Y(jx z!pn)ifOOH=!N*2@#*^ZFd65lMo;VrOJ-3~%ToWkP`jF1zqr$1gpYtjm$<0xHG;zZM z41JE?rLW?8qYcC^yFGDEsz&U3u`j)=J7EwK?pjGbD?WV#l@A+cr3z)HQeU^<#l+Y? z83vi*2yFRRvr{knUi6z4wRpkx{Bko}zj<9_C`Bl<74CpCUyj%z`yJJ;uFFy3Sx93n z!EI6w?8KE2M@^r|^$bJ!ZueAwv+R3o43$Q@c59@yIB<}S(QgCS`Ah+`4pKN*C3`>G z0X8>G&wvTT=3%QIDWs|SP*p$BhI*1@^CH-6} z8sRvjnX=J@Zeneb(+ySPWJmCLTJss|d8A#+48_@t=YLJ&c;0kzj4P5zIS<^Ydb;0CV@8DJs>ST3f;!oz4Qq#njP8&mm z4|j#EhrP~gN6cL2($%IhK9#u#qYoY{?dYOrGj2g+A}O6SW-+iX4O`;o_kqBt3O?#Z zy{|zO%#%O^lPe|j2@k}h@-3jD)Eb66(Rs>kxy;_2fAg?}U|V56H2x`~b>r`_QP_da$rUj{+@SF>ERH?Ar$xD$G(q!Iu3& z=AhSa?sDtyU3N5nnF?^=HMz#d(oZh_^?y;GZ^^YCx=uUhb z*rJtC_V9yegYZ@iTzB(ns?pDdzih%yBL3cf8-4BqxkJ_++E*{}i9*;dVIpiD1mvdE z7c&Gv=0mgY!jG2}o8T!fF{&x$yNAduRwusRC`s&?xnPMca21^r2;Bl6PuVQ>DsI!# znEg$zz1fjM`hf1?8vwSUP?n3h=8o#pPa$u3W)0G_ZgYb!n{ZWFLE1pI%<$1kyQGe%XP&cIJ^jLqS-rA;12@yr8SeWpszx|iGk7$a@z0+K>dJOmfhpA^% zp`zMER+wYtqd7%o@3dATQi(Z<_=sxZB7EJih4VkW(?%qFfF-MZ1NfD~P3uoAnWu1Q=4FIwVrhUItE9sJ{Sg>VWYLoBNZiP&N0vi{VmU zlo6L93Ggo*x&0_h+v`^S;Zz!yC`rNTB(T^K%_YPMq-) zLHj8>d8J~H_}h~|L5QoC+jNmv$*&xR0`YM68=;J;7$Ad_T{PAmg|^g1?JA<;o3aAwlK%8M1$Hce;#> n8<&_P_`=$s9S@Xh?bL)CyiFcD^mvAzRDm-T{+8Av+L!(ZB@#`e literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L1_Cry_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..da28419fd279dac8ad18145dc9a1385df41ce7c0 GIT binary patch literal 934 zcmV;X16lk50HOnsz-kZ(M1mp+97qUo5J?0QMUkjTDKZEx3I&0PKp`+d(7=O31fa+R zBLalLU{HW~;-FFtKon{cAQ;53p}~MeF;oZ^A}JDzNH~-MaL6i9ff$3v6Cr_7BpBKt z;9!voNZe?YD9})NluS(mB`Si%xCF7F4h91dz|kNai6n@6FalXYDpCm~B=#VYkV6c@ z1rwOWs1giFWN;_4kYJz^oJ@jCN(Kq-AyP~fLQw#qz-U4tg1{pOvVuV(GMJSH2|}bq zFbA=KKygr+Bt|k1875I^FcaA=&O*l;4ImyzvaDb{pZE-lg#gGJ#(^Z2Kuu!+{(tH6 zD1?(B#Suuo#z27>`~v+Vkw_vCi4H*aoQNC);R4V=HWdg16i;X16ORH4C=-~%G(eF( zl)wrw2pp1;B!IMqqBy8Tk}?k{H4qLl3LJuxe-qflLFJ63LM)mXlRQWx37|p2D$)hA@jDQ|FpU6CaMgfJ$u_5tN3?zy_5P3yl5jYkGK>(#mBQ7Dh z1IFYZ7?^x%FbWg`Bn%(KA_3%xz#`Bn5Ugrc2o#0@k1xQeV$eol&@zyK_`xOuAr_1R zO$CWkF#z$ALZCk-aYG;wWw_+90Pz$FFjwXe7zBeQ0NN=9sxtt3z`^ARh{-8f2*5od z$FVFH0*M604#WU->J5l@XG35XnzfWlGC6#_vJpg<@v2vclh5FmMFi(|1VjRFZo z2Z)3~12i>^kU%mF4k8H$;0uTzSc*WHWEltq67M+R1Io!1h|)9=C_n^YnCL&?9&&(q z*su_c6e3V>8TdT7hq1&_Gy(C5$|oKN=!4DxtPqgNA`%~`{vHo3B?>_iqF6G3L6G=A z@GyCz#vz2H90ns0uz$_x1O*HR6F|sHBvmT~@qTba*ubz92!sX&5VJGV2zeP6BY^^- Iq{he(P&v{|ZU6uP literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Cry_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Cry_128x64/meta.txt new file mode 100644 index 000000000..1b7d13dd8 --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Cry_128x64/meta.txt @@ -0,0 +1,41 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 4 +Frames order: 0 1 2 3 4 2 3 4 5 6 7 6 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 2 + +Slot: 0 +X: 22 +Y: 40 +Text: I miss you +AlignH: Right +AlignV: Bottom +StartFrame: 9 +EndFrame: 11 + +Slot: 0 +X: 17 +Y: 40 +Text: my friend... +AlignH: Right +AlignV: Bottom +StartFrame: 12 +EndFrame: 15 + +Slot: 1 +X: 2 +Y: 29 +Text: Why are you\nalways away? +AlignH: Right +AlignV: Bottom +StartFrame: 9 +EndFrame: 15 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..8558f0f5bd29c5b76d6c222d7c85d52ab284e154 GIT binary patch literal 294 zcmZQ%P-0}LU_Kzn@PWO-hVcPEGKca1{|5=LKR6@^KBzs%;QWF8js=SaV=L1IH3#+w zjC=Wa$Lk9CK2LLbCB`HWC7-b4J-I(2#5*^aR#jFO37OA^}lG0 z+|rGb0(J=^42cT^7&dV~QQ$D>eXOc_{ROn zF@fr@3~l#CYqA>JnHt;}--j?xV@OjHWH4R8=5nZ+`OXCc$HW5%-!TYew6i2RaBQex qY<|G*k(2y_nIWe@{^$!y!>R_h^8##l82@^(f12R{$K;eQ(miEr(rzy}T-4@vmuCID3D#ndPOCK}D<0GEJ3z=sR83SEjo^TZX!IK-3> ziNINn5C^BCGGK6e{VeAfmnYNr-w(X}2yp-9oF4V?A^-pJuzS}*>FzTkF3V*x;2tB9J0MLWRxxj&o+Jp}~{F*?nWid2Jyde1>pZ*FDh=qV2UziX+ zED^wYUSK5g2etzS1TFe?zy&~B9{?XR02xcc=YWHh6b4apN=5XjI9KX?h!Y8XA|2#F`05eA_3Di@J)Nb`;Ym%t`9dA(X8 z2xA!h!RrWO7=TX<4>Yid1Rr#W1wpVVVUYvoKo7<-s>ojD@ogA9WF`fO0g{*xBzr)@ zLIoR`JYp*P;9np(2!R2B2Oz(L#EyUig8+xIdw|dZ_vE;P#t1?X1b+8pA;ANu0sP;Y H1;juD{u;iw literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..c91ed2fd23efc317a9fec7f9244f5ecf26bfdaf6 GIT binary patch literal 698 zcmV;r0!94+0JZ}EfFeKmfrIjX59|Np9uLp{LL3k1U_W#*kbcNuF#vwR<^cS;@vIO) zd(Z#CF}ve9B@qX-JRV&5#tfn=$M69PXF`dC-_IZZ0Sk>X2aoI?k-rCw2tNFDh(7RG z1aJsF{OCR-a1Q{$x3&;_+0i069sK5s4--KE3qB7Yqr`7u@&FI;)>rrp1JI!=ED16{ zi|2eOP$&mL2sL^*JbV9r{(!)9X&8`x@E~~0{Q&eFj|1S45O~kx-2i$rMgb51`=XFY z{7@c~_&7X%AB}K5FZveQ1B3uPee_r!fBx`1X5jOjOTpql6S(+u|M*Be_!7x95WXpK zPLKW!4>$%49$ov|$bZxR2|R!U30bH0tOFAfIQ$(2*5D`?RtQVL>}ORfY^cfK@wo4#6MrnKs|tmU<0WTLH;XP z27sI(^o9V%@FvkNl$ajh@M$c>{x_Jwy*v;P#4Z6m2#gaC7YC$sfA@mGI8b;bBL5Hv zl>>p}ulg3lJ^Tm<|BIl5$ALfoSM3lU2l@jagnjXN6H#zK_4KgJKlR@P9)Acv7K8uq zuhJkK&-_qkJ@}dkx*z}k{!f7M-}}L#m&pO;={q_P6AHB35AhFN`%)TJ2HpaDrD0~`qk(=2CEZ z0f)!)C5Sy^VDfDd6n=P6c!CNF4@>zJeV5sIJm5g`(0}*gLcxQ{tS}II8iWXe@eB|E zXaM&oh#-OHDi9%W;4^FixNpGtzyG;6_}9XI3LFReE(ABI%&-txX8^(=_6Q6zF#`F| z%pwXHSUm6OQH)?em-v`H|E9r!(1@c42fM^ULUj;%Vgc))|K1Fy>Kb?a9=!ZL{EAT6 z1w0;~ugGj@5C#axa1?NQe1YPw7#HjRdiZJo@l^SIcmMtl`T!3dm;X)wiUZI8-@skq zAn}sVy5IRje7^$Wz<=Pt@uKiS==&f4;{o%GgT|Nt_kZdD@qLIqwsLTI)$jj*{(v4o zPrv8!!7vCsb@%_@{(}R60SDkA5P1JeqyPQ^#q2GC2cG?kAOw2~a6#jN_us+G|A+7a f<$u2eTmSC}k$89X5PN_N?%5stv_aF0B#1shQS}MQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..aa5353e988d02785f45759a024931abe7d580086 GIT binary patch literal 584 zcmV-O0=NAE07L@+fII=<4*+-rz#ahb2Y@^IANT|F;Rk?x!S}#`z&(Kbz(C*~0DZs# zKZbz<@kP z-_ZGk-W5OxmVe$YUN}5vRseX=FaHn!_#S((c=Kc+^8fh5iJ!HD#(O>ojswBL|KI=9 zyXAl$Ey0L`%fG>Z-}v0Uoqw17zfWUvCftXMrUwwc* zFdOIv=nzr}54)K^iv!95wSa!G^7S~tJCHd1P#$^^c)jswmy;2(?+ml*DY%6Tpaje?1R4~z?+C+R@JB71OJ%^j$i~g#Q}fdP!0e4@$U+bI{^s# z3(Nlv;0TA07lYt1>XG_?f57p%{4ekc#4b7D#lRpxNFUrDAR+mp#tHC`{fFbU28aM| z{|{g!U}Yi1z%rjedF|ox@OZ&E5DPI#e_na`JbB{LzW^w(J#=94pcIrmEe`+y literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_14.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_14.bm new file mode 100644 index 0000000000000000000000000000000000000000..837c6c71defd8be280776e7881817fc68276b5d0 GIT binary patch literal 610 zcmV-o0-gN<0A2$B|KVUk{Q*P)Fi?2?0rvt2kDwoLFnIg{_W=j^KOjHgdBMT)0R98a zDj@jq1I#KQ_}~M|;Q;Id;{Xp%fIlVx`hWxc9=`B>kL(_GhKz#+o><3>gVG5B{Tt>8 z4;U5;!}CwXJVamY_&z)lfe}FLAMe0Dt_H!Nasoqr`-9r~&_@VJU>l>0Krj6W95O)w zgJlpe;FN#haR>y*&>wsRUrhppDF-nZ{sYsG|A@(;VDX@2Js+@oPGA%6%nc+tE0kSi zuxJH>Lj(tm3qcDYD|B!X2tYh=AoBP#)&UWmL9h@2c-lSS_KA8RbO;895vb?`+9^1J zKqL|g{UbmRX+$ywAO;Ttt3U_0LJkiYg@OTE2b}yKQ3wz`aF!;BgU_B1DFg(5A@ZVV zdEoJzgVn$w5#o2S;PHin%RrqGp+G;L5P3mC<-mYJ58@9VCwyLBV0pmdiSdjD2SN@Q z8NBEa$N2-wgZ=&g0qGDH4O%!v8W;Zm|NDc@SRg@@1ImB)|6{@DKq!m?&N3Yo|NZ%| zgUlq?4N0o0xY&yEj|qzoQt^FED>06iEa;GRJCuV4t{^!eXG#1C2(0)+vGdoW=5 z-AFJnC>}#T4`yhz^{KA$Q(_^4>({vevs<0996^* wNHeH?5Gg=DU|{j6KxP1O`UB1b0N_Ay5Dfv)f$A(Dg8+f^cz{o!766F@+?Nvri2wiq literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..4cb6e53325ca82bc1ba52fafee1ac42a1860a50b GIT binary patch literal 719 zcmV;=0x2edpMFaQvP#()oKH^LrM60rl^I503^{{iLsHy|)^ z0P@TO$c~T*6avV`F91BQ2NQrnAQ7N>U;*j-2b3ZK1#_7gbPDB+U69S%_nXL) zC-VRZJnv)jfk2!FPbpLAzn>Mrz?udRAJnuSUypGxMd<{tLA* zrXFq&{(Uec2t8nMZU^Um&;LikL=Pb#gU11WpyB_e!8i^9U?f3-fro8?!+z!9@{kxt z1Au`*;1$q#@xkK^fn+M+^1?tt<^J!N#5gpGLDXAf4;s)scmMbcfMkji;6cIZe>Vs` zWDyAj0>L;3j_JTF@t8;f0&ac3Iqm7QxJHZ1_AZpe1D;lp}-`8@&O7E zf4~2Td|(6-v^gM1u%*MM5rYZhlmIgItVWU zM*v6&Tz~M)@I2@cw)t=ZxC7z zA2bOE00<&62h@N_MMD3>!RtVd0SE*!_y@oqya2gi1HuX-s!%Wq5(kL{%Bg_BK>)`F z0hGWVuplXB7K?0mW9)pqY1KH}Ok%5B<9%eKGis(y(512t1 zV1o5Im^_lA7$AJa0isACd4S9wN1+GifZ8p>2hD&2D1rsA;Y>{dhy%&&jsbR%2w?#C za0n!fqF@vd!9nLh_()r-01$a420;v=I8aJZka|FG^IL|R3GfZ_(Gk1Pbd4kST{ zMsfi11Bg7X2ZO{(1R}5@neYJv=m)TLP6L3zL7)(Ddpk-XLm%(`ia3bCJkmrDD-itP z9{_m_j2T6gp61a(gZ{ZM1zPgjQn6h8mzDgPw@^3 zz}F@lG7%UECQ4EVmjV2M^?I5VRtF3sqyij97+5^uQ9ycvN8SY{0Kl$5kq4*%+69tk z2m(_@KO~R>1LeVjgXn4{VF%kx+rka7e&8S}(IJomV8H&oCqy1_6AdOzA27gr0I%$+ AWB>pF literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_17.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_17.bm new file mode 100644 index 0000000000000000000000000000000000000000..02af0bcf325201270bdfadedbec283ef88d23ca3 GIT binary patch literal 400 zcmV;B0dM{R0E__u6hI%*fPX>)+z)6lKcGPUz(7I#PwD_arU3pz{4gKTMmK;k_{2d3 zDe-;_GJ(K9|L_=t*8Igk0EA=6#lS<%$2b$10XzUQ!9pRyf*1$@!z2$7S_H`=&>jM< z!s7x5oq?9d6#|P{0)!VvvyBn0Ld9!N0es2xXIKD?hHNkcf>bJ^nHs1)f5le^scc3> z4<_k=4fG(wLZAU;7sx;mVIRmiJ>nnuh!AlQc;G$qANZIMe+_j29wYxF0t`96e+YOy z`5!qud`_ZP5CH#(h7U6`01AE&KlnW>;6u0r4{JaeiG>Chtc7q; zL13H+9^e56h;T+EH$XAiJOEMf2b8WMQ;(nw0EJZm6mSf&0DG5>a9{?&7mP;0180j7 u0|XCSfDp`V06IWm_y=K9vXGzv!6FDmf$)kW1cS%`P~bR%6du3>^KMRlm@CSfA0hhpbq?iBy zfrHw>1U~>!W5JH5eJR~-y#2rfd}y7oJamf1Q>IQc^^4Dd`_ZWV0xQm9$)Z!SHb(hAEy8x69Iam zOBw%{f(jT9T;K?EQ}fZl!RiVqqNK+He{2K-RC^G)$P4e(0vmi)@u~tG3IP}gy-;dn zF%XCWtpGA66d7V;Ljw#DSa2}=fCL&L!5EMNEFJ)0_yN)z82IHt7aRxi1V9;pFHiv4 f;sD!#KdAuzRg>(&`v8E*0s8e2eMA64*bo4KNFID{ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..94357802fc84c61ff65389b3e8e592c882f7dbf8 GIT binary patch literal 351 zcmV-l0igZ?09ye7cmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 z2i!OWI01zM&?Z0!-~kRW51RlG<^cHxAW;AcDnX(E78q1Oe8BN!R}iTkwCZr_kd6iL=zu`d>--(%?dhyEu35Rdu>4}3@dMx-zKoNNH~<27iUx!LC*lA+s1!%z z06$O$N8q_n<%^kOb)bFk~5wa1*0=zys#M xtsVp)fDe)2|J%Yg5C*>#0W3lQWN;tNQvg>1!5{>@3%Md74DbuO_)Y8hDgXv`km3LU literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..b0d0e691407afc3067f1adb44437407fb75e695b GIT binary patch literal 324 zcmV-K0lWSI06+l%cmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 z2i!OWI01zM&?Z0!-~kRW51RlG<^cHxAW;AcDnX(E78q1Oe8BCSxu9Tz!-0d`03gv02*iL9VDJM6zz&eu$Iu1<*x)~l&@y86 W01ciX4Y&jPkPqb`gZv-h{{T3j6M%aF literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..3413e507294a89aad208259baae4b7e14c2fed36 GIT binary patch literal 387 zcmV-}0et=e0Dl1hcmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 z2i!OWI01zM&?Z0!-~kRW51RlG<^cHxAW;AcDnX(E78q1O89{;T1P7!C`45Bx)GV+V zJmMe^SP&IBa2WtSlS^`dND1uC5CO)4_5N5S{2t}8859eE4|oLt2{}X@+NBsi_q~snrkNk~DU-LNF0ppx47bE8< zU>E)9K=FoP%)$>&1^fm#3k0eihX3V`WjVd+2l)@g z1Jtar7(C)2rw{?afT_cP$N}t{TakIiA_Yj$KEKNZpM%`CBO-xt0q%z*kc7wK9|ydG z`3MP@;vNi1zzAX=_=^y~kbedK%>c|wLF17B#NYxE|3Ja%IR}m-|07Zt{LVH2c;^d6 z$oa|G1^;>wJYkqKFoV;9e*ulc!77Jg!R7x4mw^0Ji-f8S-5`1&jy*V#LDb?8Q}K8q z@#usO7z!L`{$2zV@Poz&4u%8IH9tm)_?6E9iUx!LC*lA+s1!%z06$O$N8q_n<%^kOb)bFk~5wa1*0=zys#MtsVp)fDe)2|J%Yg k5C+%*{KOyzM*;lRFa>ZN5&%oUyOJUR&j7oxgxI3xgWa$Lk9CK2LLbCB`HWC7-b4J-I(2#5*^aR#jFO37OA^}lG0 z+|rGb0(J=^42cT^7&dV~QQ$D>eXOc_{ROn zF@fr@3~l#CYqA>JnHt;}--j?xV@OjHWH4R8=5nZ+`OXCc$HW5%-!TYew6i2RaBQex qY<|G*k(2y_nIWe@{^$!y!>R_h^8##l82@^(f12R85=KBE9Kzz`}J1UMKzV8BQKC}{+U0724`4BWs}hy&t)1xbKDEC5uH1K<*& zRTR5KMyg4E8C8uffcQXg0QiI$i}?cw%4DP;=sp7je+RS>9*_@-1=%GK{KMc8_mjYZ z>eUyM1JC{s5HN$-3_$!F5IoR=C?I?Pf%_N-od6!d0-8@2g)j%qq7d{bKt5`UGE0a) zbq1q=o7g^JqF)NVgXRh;0{y@RP&u1@&}{^;1L=Bm0DZv)qLLs4#wQR6U_Sg1ba;d9 hyh!N)A-cc^a0l^w00j;Q@jIEc5A$+^{2$%`d;q4lY*+vQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..114b26391f8643130725f03b5209d97ec8e791d7 GIT binary patch literal 312 zcmV-80muFU05kyrcmu#50PqKZJOSVj0C)qy9{}J$VSx>WL;?FSkOOc32Y^r@AJ6zg zZx9F%f(HPHgW~}KfkyzNa2Lb^4S){_RDtggh*$vU0tdhTK^Oy^5FZeDFdX3k_{WZp z;FNgzz<>q#kb~H^GXOFDBxnd6r_zQGf^u~z?r{gO9X^zK;9Vc&1y3g)261O<@i6EY zJS-vXAoYj=mJsj|Ldq8l&;blEKCOi!lqlUm^1wnt34j}{f)QXGEdl`)1Ej(@IC8r1 zAYk=-xgo*uNEd996aa-)W57N~3{_FYl~hqM61xf{{eTGI0o&ki(y)of90xeSK4K_) z2dQviVEsC|Jjdk(up4#=_JONI0s9aqI03v1&Y%PP0L{2Vx5I>AjsawYgnx+xAb><* KfO)#k4i8}640;Rz literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Furippa1_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Furippa1_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..a3731113d7eb0246f9931b91523c4a2abd59ff40 GIT binary patch literal 898 zcmV-|1AY7f0Dc4ifEGXC1TX=m;QpiV0EGb;4wtm-(tiN(1Ih&%EWwfuTUCAfb>0&k_Hoa4-Hr`1pVD zItS!tF$kyrq*5Ox9t9DAPcR_zutGoI{p<$aM1ewBSKv0Fc)>?PZx{^Y z!3PJA{|{#epnPICgs6kZPlUhWAcLU?l*jSF|IfkYaR-Y0f#Z1eP(kPP2bKr_0fPg_ z2}l0}&;Or-SYQ$0c>f@j|KL2Ph+%}pk3$Fe|Dco4$NT`0m{Z(g{~h_1ehV@H5Imp| z|CIj*-w=Ajf#nYQN9Yg}fPfMw1P6?B#UH>8NB<*_d0`xQyc2;ijCmpAlK=cL^Z)0D zFFwFW;~YSFL^;~aG=^8%!l%X`7{&w2QOwcDyfThG6jD(P;C%BM7-jxZ!;*qV4KU6c z&*9;R-~SvrI3QsY33MJEIDlv*F#8-MholV*3SlOL#_Ny{27(Vi+;D84hy(`VC&9^a z$N}&`pZwv?? zVe+^{J-+`B{2navACP>y5kGH#f&K@kf<_-KhyUMy2an&69|wNoM<7#)$B&o3qJz)D7lg<>un>63L+HsL_x=+Qg1|qQ`w)D%Uif|k z0{{n{4+2aO`FlU-0fEASUnx{AHL)gagS9kU?k=55yi5{GsrKf~y$hBY_T( z1H?WgF~2qlUNH;=#2!BY`9Q?NnH=;2!C>%2XP*H1L3jf3huB~k2>-%ALim6GC9(e> Yh7l1FiS$9_nHu3dU|{itgN5cG^5QF;&j0`b literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..fc065836431dfd863a8009232f1bcca4c862cbd3 GIT binary patch literal 893 zcmV-@1A_bk0C@xdfEGXC1TX=m;QpiV0EGb;4I}>m`~pi+K;-}7FhTK2C-4iv6nq#8 z1p)yHfdkjz4_pKg9+B{1jfcSkkkSF`l83-J5HNV$Bh^57lZYO82sk`(7z#)|fr9`E z4}%jzkptHw3y?q~!1Aa{un-`5;$Za%1n`76JS0Yf4<7-rc`y+8{s=`1giyib9N zf({QK|33Z?K={Nj2~h`*pP7HgK@Y+YDTmH!cYGJu>c$<6z3R5M;`@;d?4#W00=yw z5ZshM2E-70!hz)ui9zTP6M%pcCjI3jqFK;RytQF~~;(9Uy>W z1L8v$K|}@P5Wr8t+B}z%UX11b>C_|Ncv3{(*_27;T4;A literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..04984ed0df85526fe4bae4a15e92a55a85fd3414 GIT binary patch literal 901 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 MOlySk7nCGEz?UPCtpET3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..3f2aee1e5bb68ea60466cc8668022141cfcd8a1b GIT binary patch literal 893 zcmV-@1A_bk0C@xdfEGXC1TX=m;QpiV0EGb;4wtm-(tiN(1Ih&%Epti)0v^RPlc-~H?c-9!hJ0tOEl$ASYqiC5q@pm@YV;{^P`XC4SR zJb(CmI6W~Rn2qDXKL?JV34g*tA}+D`er7+82mXE!D~LRDFOlGWZyt&WJpO?4sHue> zH;g48{0~3=eh6O^`F|jk|KL2Ph+%}tkLB_IK_{P&_yGas0D$~=@KT_x$N*57kPL8N zIsOg4AoYa<%L((3&G$NP)kpfET+ zf?^*lghSi!@c-iYNFVY6V4nxep%eD^_#f!MG6cCP;C!+l|9$)(KY#oX9#S9tyq+=t zW$yw1tKR|Tu#v%IK=FrrFYpiDUg-!2jN!gB;CRD5lXwQm9x(uUOX2?H*?Z*Uk^9Z; z0P&7bqO^Mb4u$PxkHRk`zyr_6%imE!=imp70e&&bm`~pi6K;-}7FhTKYC-4iv6nq#8 z1p)yHfdkjz4_pKg9+B{1jfcSkkkSF`l83-J5HNV$Bh^57lZYO82sk`(7z#)|fr9`E z4}%jzkptHw3y?q~!1Aa{un-`5@?iA{1n`76JS0Yf4_2#)4NE2t2G1kMW#f_o`q#pb%hq#u?*0iC6LWuz1Kp;|K?g7gV%Wk(7+Gn zc=}QQ!1FN-5WXkz#Q!*y|KL2FWAKE~kL8i)VJH89*nkWkPzV-B9|ebeAnQT^3?@Va z7$#01gKvmEVPB{OG8L19&>$xP04FXF1N=mEP<#OtfATo@mJ!F9!yumshL~1=|Aroa z{P4r$0FjV!pld?sYb??kUuFj|1q}lp4=G18M;`FXIPeLF0s+9whtDyghF|9tGdRFt zH~@L3gmyRo#*PDLpB9Es0f$Z?8UT3M{}MbEpfVuxjnf9AkrklGXq5nYOYkxrFcf|e zINu^cNC%w%0mH%2ARn9*e>q^Nb`fL1k>DseCn(>1QUCqpp~t_2#zTOi;jj=n|Nrm* z-`GA8@Oa1{g&)V~Kl(ra=flqzl!MV5l0-k;|Nn>o^V8r-;tw9gwn;FKdw={N_1^UX zfx*Y(A1j1o+uwPO-w6Z$7sx(c2%o?I0N>sCkRf>ZC*ktQfBoi>`~Cg!KzaY={3jkh9{Pe0F?h)!5HNX2L+HsL^B7X@%RVGOhR%00K@<>d*{GDP#yrhVfGMt#yDRO|Kzqm;aI{VAoGp`#t#6l M6U1Inka@?!;+wtm-(tiN(1Ih&%Epti)0v^RPlc-~H?c-9!hJ0tOEl$ASYqiC5q@pm@YV;{^P`XC4SR zJb(CmI6W~Rn2qDXKL?JV34g*tA}+D`er7+82mXE!D~LRDFOlGWZyt&WJpO?4sHue> zH;g48{0~3=eh6O^`F|jk|KL2Ph+%}tkLB_IK_{P&_yGas0D$~=@KT_x$N*57kPL8N zIsOg4AoYa<%L((3&|!Sd)t!Q;aZk1_Unx{AHL)gagSxe~khG_=CcKls*uUM~480NCDy>ALai1 z3K8Ixg?b?I_y@>LPzXkN1~3i;UU~2jlox<67=45uUI_gQ;s5-W$NX6sL_{86fO#fH OxK9z-!XY5?{{zVG1)d%N literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L1_Happy_holidays_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..32758660c24335e2ded4a470789216e8bdd7e6ba GIT binary patch literal 893 zcmV-@1A_bk0C@xdfEGXC1TX=m;QpiV0EGb;4$4|_^;~gsapL#L1pYCk6`%j%hoApE zF?bvTJs9Ev1>ijGWtu}P?BPQt7{&w2QOwcDyfThG6cRAVhHyT4jSMpXIN^iJAutD; zXnZjH|Ko>8hqH!ZK7hlg5Dfr4Y+&)?d>}9&c}D4w4gy40gTcZ;KhPV5{{tbzAP3fPmk8QUCtq1AhmI{BRUJHUbAf|NZ~_ z^)ScI13Z2de;=Ix=>PYa2k~|=iN~ThB#3{x|NjsEXW;yl1Rgz!Y?5Id_W$@l=)6KS zKM?v{BOc!S%wh2eqQIwt^5{hU|M&*}KM;vPAo2P!4H#RkK^EFCJ20rVvragLmvUmKp@b#PVjy*>?Fbg$4|_^;~+0|KK(t1BAr`;~mK3;IQw69cVxS2bBsv zl84~ff)7|wJby9FlpcWrI0ykEaEJ$%VWNZJAQ%t)jy>gsapL7M2ab?dfB%LafBf*p z=x`70!-)fU7du&IkjncwP)Pn{7=U?7Ihr{4hEd0&f<_G?%m>dgp@v`Q958uAECBOO z4~8Fq{BY>-_ymH%Jb=Te5Dfr4Y+&)?L?94=c}D4rVMvP5csNf41_|JwU}QLC0Q?|v zzDEKH0slb3a9~t}>G!GbexwJkDzf$=DxL7C9dGI`8fb`B!;P8)x@*nO<2>fBLG5f{v5SSo5 zVl;aF4u$Uzj{@%!piZD)3CE9zzMzB5UNI>LDg*eO$V2G4ANT$zAca6bm-!HUxIpp1 zU|wtm-(tiN(1Ih&%EuvQNVxXaqlc6k5>;3`{Cz@icA0S!_WVo z8n`HUJ`OlMq8#mInnNq>@lT_G@MFQ{DCTJ6-Wf+8i$Dbr11=vt#)cVxlyLC42nall zXYlaD@BfY*9s>q~a3rvJbm9S^ki+b7jvNvN7=dskka*p2N;(KU|8c>BK|Bbdlwjnz z;;}&E{Eh??5Kka@@bKVa_~4`Y#i))19&}t30t0>VNB{eXC*ZzQj1LbD0D(@|#fJxp ztb7tr$RuO<%;o>T|HOmDUOovIqBkUnemVdDKmX?kCzpal*p|sA5sz>G$NP($#2#Vt zxI{g^{}28zgrA4op%eD^_#f!KlYkE?kbJTq|9$)(KYYCW-Z}~I{$5WQ|FZXh|JC}J z=ncYQJA%f6;|}&;;2*laa(-bMgqjaN2aGe>H-K!a@k|6J2{4vJ{mHWT$>1LkyiS2S zflMcnT0MS;LiVah;TMTWIZzqIV6=K+9&$|3vSKz^US^?f2Z3xo>*QY*ZA2lW2mtKzZ1 zdI9G^w`0ZQ{{L5l<@|y0A?fk_Q^DvTAb89a1^1i4E}#GPb_Nd{cE zZ!j1bJbWJ*_&qK_@&9-h1%UUE#2(1;fKQZz{#T9C|NO4}s3`KlNMIa}KRyR^-~NN+ zLS>bM_{kgn-VJo`{ek0p2b5v`@_c_Y z>ix=8J|d8T2jPDQi+q9S7zd>N{($os2n@d+_jt$t0P&3i%YY9*`8-aeU;nLyfM5as ze}&=?C|X8AGkb1r2w8lz+(spoKN5nRZ&C%<-m;OAi(pI1I7&?Bph>K1tKx1 tM}R3V1b?6kAON-q4wL@`ygXn6KZ$@qLm-enL;$`3`V9~P;12+J0DzyW_2~cr literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_1.bm b/assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..210f0c918cea285c191659adaf8d55e740f72e12 GIT binary patch literal 557 zcmV+|0@D2f04V|hYy=2+2pBoRC4hr~h6E3)J|YABhlAdM1b|v86Q~@(9`Xo81L05S zKsW&Rh(sVCdVIJJB?p8^AQxN2cn%|B5sV&r0RDgf_xrsr92X!E*dY-xvCu9Qh%nrZ zMUV;)&^|Tr_@77~Pzs1WL*fr2Fn|W6EfD&w$R2e-xP#8?NC%Yw9$tVrhtrV&z5~y} zc4QCIKky%jJa9ns%zJJi@$>V6=K+9&$|3vSKz^US^?f2Z3xo>*QY*ZA2lW2mtKzZ1 zdI9G^w`0ZQ{{L5l<@|y0A?fk_Q^DvTAb89a1^1i4E}#GPb_Nd{cE zZ!j1bJbWJ*_&qK_@&9-h1%UUE#2(1;fKQZz{#T9C|NO4}s3`KlNMIa}KRyR^-~NN+ zLS>bM_{kgn-VJo`{ek0p2b5v`@_c_Y z>ix=8J|d8T2jPDQi+q9S7zd>N{($os2n@d+w|K|?0P&3i%YY9*={!!OU;nLyfM5as ze?{UCCL3O12hu;lFCYWJ9su|N)o=Bl literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_2.bm b/assets/resources/dolphin/sfw/L1_Laptop_128x51/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..ff2851c280846f4470944424c7acfaee9acc2d6f GIT binary patch literal 560 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 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Laptop_128x51/meta.txt b/assets/resources/dolphin/sfw/L1_Laptop_128x51/meta.txt new file mode 100644 index 000000000..90cdc5ce9 --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Laptop_128x51/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 6 +Active frames: 2 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 4 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 60 +Y: 23 +Text: I have to rest +AlignH: Left +AlignV: Bottom +StartFrame: 7 +EndFrame: 10 + +Slot: 0 +X: 60 +Y: 23 +Text: but not today +AlignH: Left +AlignV: Bottom +StartFrame: 11 +EndFrame: 13 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..d4cf85bada7670d1b6d1fccf281fcfbea3533e1e GIT binary patch literal 514 zcmV+d0{#5~0R900HUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7_&#_a|NJ~3bO0E_0r~&_ zLc#fgf+_1S0_hxEt6Wya)gUQR*)_1V+FO z7z#dS009CF48J-Eq+kdzV0?#$7!SetgUT2Wj0DDM1_$24#ZZHT@8NXYz`)}eH^;O4 zln0Ff9!T>Cm&*HI2dBgT|Br*uiEkH{03I;_V1S4oIgOnh9#a7PNI!D&c}#EsF#s4m zXdk)wKRg0)2jqdcKp~j}{2rI#`GeAE4@?L>Fc9#1l1u)|5J30??Qjs2sGv81IbH$f z7z30R03sOR9J>JWrT~WkKM=5p$R2=lpaaN!a14QHU=%PA$N}YmfP>co!TVQZpz$$? zJmMHIIHpPw{5g^&!Q(`-KaPz=2dsk)nViA^!vf9bU>pE(LIL9Kf8&^R9y0LUa6k1=GY_X{KMX`JK=Ot&20jlPVfbvp^#_wQv1j4L E03aFJ-~a#s literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..f1f0e89f0bf92ab9618b0b7416579212bc000e05 GIT binary patch literal 526 zcmV+p0`dI;015&CHUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7_&#_a|NJ~3bO0E_0r~&_ zLc#fgffO%jd@DIoS1`k?5Jg5g@jzA#h^#`;X0Srf|yyOuW z1P%chN6f-ufGCIzOYxwJ1N1&T03g@_@;?xMU?ww55FB^__}Eyg7f^ltE}MHq0vrz` zdwV~*Nz?)(fWV{B9$zc%dTI|phyVW{2cHt(x13-k0P%=1v0-uyo>ePBWB90!&h3?!2O!Q0{p7_dCC zpkcTON(=%R2tDHf@`AtwMH2^>WEM2Q5a0*m79IdSg=IhomxF&H2aW?^2pSj&WB~FK z2t9BdAGLNm4-+9s0px5X$wEJX;sgu4ycA0#_~_I?d*){_fOx>OWpW>gJhl=j(JZhs zIS_oPAn~AVIgrQ@WOy9TXNTbjqrf6G4CF=*s2T-=A_*D<3CuAb20zRwDgDCDW&;)c z9#}s>cwiRH#v>4rD*!yO6Tj~B_v4;S=3w&RKp|EP2fGDB;&>?ZN+2|6;Pj2xeUtqL zWB?^WkORgEVDNb)aR_9BL;w?@$HC%4AAww;egp9H90pn$gh3`M(U>2GBG52-z$4)C QwjYMfA8E#S?_px7MM3xQx^3kK`}Tiwm85(F%jJEqWm+YG_<#TL@Okkq`+Gn<;s7xL5Il1m zIy_WAau3|UL_ahkgU*5bpV)!-;1i7eA94kW1N?u6bO-o8K?J8De83Tc1R#9>;NT$- zD*zy&ZL*Z{%g2S5Vf!RJH(Fg^1i1{$C69#S9!3=ifHE?@z?KL|d% zm=7q30jLxR6_aoeD=-0!D4-k$AOOf@fdj^70APEc-T}a0h&<2nK#&8_{@{_1gV6rt O_dmJ4&+Z;K;UD0o(vidf literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..fe93787f2dbaa45e6546910e547ae553947e3827 GIT binary patch literal 294 zcmV+>0oncm03rbZHUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7_&#_a|NJ~3bO0E_0r~&_ zLc#fgf2W^ zzlsC&KlAbX1LA1{SLOPl6%XYHZzwnC|36wsz&$_tR*7If0CA6l+TIU1fDAxH4@mfb zwd3Hq#h!Rdepj07Hd7$hhjgMtU=fF3X~en5Nx{D^;}2uMGSqz}6Q z6oL3I-A zU;%;e5dbi}_5kv;02n@jLBL`F3=cTO2p%&q0|VUt@Hjv{Pw)>IKs?Xz!Vr2N;1(eC UKf$bFAA@-x-vpF literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..3050ba38f22ac4c8f1ccac17830bfd3455abaa1f GIT binary patch literal 542 zcmV+(0^$7u02%@SHUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7_&#_a|NJ~3bO0E_0r~&_ zLc#fgfqEK2tVN7p!VtSN3MM3xQx^49f z64)Ex+5O6Pf#{Dgd3>+6?yMXhUl0HOJ`X-6zi()A7Q!F{5D^2%F|(u1K?EO(2ku`Q z510&q1P>Yq?tcyh7GNI!0XUP0A2I+StBHOf`cD)CI1M}S{K4z82c85Tm;~`aJU}5N zktnbL_27Vp;07X5KzIOhzySsw7z30R03r~1zyO0grUi(8FbKdr;vNhIgjQ4ld3Z17 zQuuH994Z(rWB~GjSO8_<&)6`WAGLNm4-*)N#sm`_1pknkC`a(-Q}Ym$hXWkAKaPz= z2a*U&1BZmnApl{4X7eCHm@J9`{)fg1Wr2~%gXB0U2jV{rB8pUboX-!!Za5?fLI|Tk zutZ`s3Ixb-K=SwsO5tX+0Z1N^i9if(nT$pu9#Ft}&p4aU-;Q}RnS;_`1s{JBhs5wv z=#)fI-{HV9dJJyI?4Rf}AOR{5f*u_i_v6Vwh(jb2AOM{QKN~+1+`sTY0r+`^qX(2< g0F@XN!2B@~xkuJylMpDtt%u>W2h<)+(#4;L5FzQ{VgLXD literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..0c0c832385caef6fc7bcbcfb485699100bc5df3e GIT binary patch literal 557 zcmV+|0@D2f04V|hHUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7_&#_a|NJ~3bO0E_0r~&_ zLc#DX932A#1cd|R;s3{j^YQ=BgYt0z&jaQHJ{~{+LJv#8Jg^aQaR3H_4>~|Rs0U$k zhyZEk^9Q&19#!;ti_Sq2fCEG%H}reVCIIn|kcR$WeFRV*Fm#Cn+&*7890R})f%xD) zC?W^G0%J76d|D@A(0t2hK6TgA2?39|xQ;9$pFj8IWHH9v~i2 zM@g=T0Ca$QtxgaRI$@B%fYJw%0N@m0c~Pj8KzWQ3h7T;(XEF&a8l;b7BL|d-03q_> zhmXM`LKi!k%<%jm{xEso1LY8j#9}lG1PkU5Kk%TZ_Iov$3_$bXd&q?>#NraA0PhEm zcm3Xe{Btk>g3Fk$E&sa(L*jTSr|}ew|9~zm3~syZpXd+5e;NdU9)1rbjv)*`njmA~ v^Y|&xz}PCWh|3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..5e74ea12ae20161d809bc90a813fe9be78929a4a GIT binary patch literal 488 zcmV<%yeeI8=-kVJ3*^S`6sVK7#T|)H4`lBX0Km`YpD=k) eBhms0%n#(BICwm~5%75159Hf0d4Y-ri$9QvY}0N4 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..5c556cfdfd3f46173b2f6eb279797637000bb792 GIT binary patch literal 469 zcmV;`0V@6h0MP*eHUJ;s{|ER#!Tt~MGXFo|{elPhAK?E7&*B~r-}nFi5g>enh5-l% z@AeiCt^hn>@SuH&L?4q6{r(6Kvhhd3?Exn!fI;JU2bKaZ4=(^bzu@tt1ImDQAbOj` zA44Jsh`i(x5P8qaM2}g7z@BmN82K!NwL zu~Z_U`}kcp@_>0y3GeLwR;45T*k7|G~gQ4?ejxO?ej~aA`OqCi4>)!L2OvL?oMYhjxF|&aL-?6Ppb`W58`K_LC<{bSXD1+1Da2WmI9#{ytJ%6C_|I$I_K!h9E093Gir^bE) z8~8k=5fFP5NBsu}l)_*SVz~bS=b(xY*a$y}7=BCQ1RsP1e>4gR5Ml`Oz)WV4AbspC zRS2j(EFiH5pTg<4lmpU!Ul4iwKe$!mPh|GQy|NKM%GztU?$+!oVnoUsPU@Z1)F@+QZ zfW%rd0CC0QF$n~L1IA}_h&D!LGns?j@-TpS(SV}>;4j1;d78*Pvq$ovNCD|0@eYbc pg)9Vo9*2KBl!o7_$TtjQ9y%<0*Hd~*c<== literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..e992d75c7a000c28168c9a683b2cd8a00694f195 GIT binary patch literal 486 zcmVMe+nUkfkr_Q z54bo%=P;NL-~7T&1W+FkKg4`LkPiSnhwcv>)B}Jo90bN`0tdAy)+X`TSgH|Fef%z) zc|twG=j{IFD@gXFKtbj5zSpv?62N>9gMSa765qG91I{3MC=fie8#+8xKGX2|$Uk!Z z5d6SoA`p2{KXdyKKKuf62h@RLK=zC)#2=7|CIEgya|g5tAF#*{3?3kYgag|h0KrE< zqKpurgV!_(8N37k2LT8@xq=M)6-f(h@=Z)VyHzy^BjPDE}MBlzG09LXZI;uN5DM3 zSK9VfqF4`y|NkEclnaS(+u8x=5CMn?ppXp4&W{xj%o0H${mb-2^FkN^aFQAa?tfwj z%@RT26O8;HGC_E(NFOsme@{P%ax;)U?2$lz(IS9?Q;@3zR|h04abzmBIiZc>&M>KfoDZ!RJH(ClbI9e8>TG15^G3%0vJ^7ruTp zKbSnZfCH9ZJRTo}A6?7`ltch?8H9p?K!I5|0P?c{5&>{BqJVH1fC2J9`1CSBf#Wj( xFg?%e02l`WejxKdwq^l9kOR>EfC2=Jd>)7N01*Ap=l~;opVb0D0)7$wKm>gitj+)c literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L1_Leaving_sad_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..6ebc55c16edc741797d5b69ba3482afcaa5896cc GIT binary patch literal 317 zcmV-D0mA+P0678wfENA-U;~5vAK?E7_&>qz12^~VKfwP7_&>q(KV=WVAA9f^{lWPF zf&Bsbe*OJH{txhfgV+2IoH#tM{(yY#!R5a@5xv3ok1=`o{mA|2^UM2R^@H?3|t=KG1jt$I{^1IinM(At_Me}}*z9sqgH@)V4?JpJG?0T4WF z^v%bpKYjQoLb^XRA%o9<1mI^u_a76F03Utzi39w9hI9w`K0yShAbkJPf&?IZz&`*X z59gkL|NaB+K8_!lKEMUfAJ_oF#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{IV1C`3Kw{ zUl05g9z*sAmGglI59B@p9uM9E2LPN0@K^H&_&`JApQtn<4FLW@)AI)6Pr>6456ln9z!-F3K7E?FeBggb ze*yzA52n1nVDe{=z`kMfUz88=7g!G5KH&0zLLd|k#UrhCo{!8Pa7LKyDITrVxIW+k zh6Bg#eV>Qa`YiIyQWir${QLjq^5KJrfdKqd!ROciuf!HB;WvyhKB@AsKpy%7)(4cp9x(y|1Jm3;5P4vawqu603MGK z|6k#NL4jZmA`fqbd>-Io2bch0!1@uK93Gem2tBa^^AIC!Y KBj9xacmu%J8sK#R literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..0ec761cbfd5c88d482ea64236928813bae064c6c GIT binary patch literal 540 zcmV+%0^|Jw02l&*&>#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{IV1C`3Kw{ zUl05g9z*sAmGglI59B@p9uM9E2LPN0@K^H&_&`JApQtn<4FLW@)AI)6Pr>6456ln9z!-F3K7E?FeBggb ze*yzA52n1nVDe{=z`kMfUz88=7g!G5KH&0zLLd|k#UrhCo{!8Pa7LKyDITrVxIW+k zh6Bg#eV>Qa`YiIyQWir${QLjq^5KJrfdKqd!ROciuf!HB;WvyhKB@AsKpy%7)(4cp9x(y|1Jm3;5P4vaHi0=0J@+7-~-X(KkNSj8vub|4I&R`2-so3^#zDL#v`MJgXBhjU_gV*0RacJA{Y-v e_?bi=kq_a4U|?mBlmq~f598r{5%4;IJOSX1q3;R+ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..d4207c95d87c1178737332cfb846c4f3ef65a217 GIT binary patch literal 542 zcmV+(0^$7u02%^-P#_Tq1QG!O12ljT;Q#!8zzIJGykL5>0DH;->nI1mAYQU?GJpo2 z94H6~e3%FXf&mDCK(G{mddUIt{wOd$EyYNc9`7=z}mRhrgny-@$j3-BLbA^g9e z_$g>Z?hh#c0uB!$`vb>;1As?^_uxW|;6HN!c-RB-Ss3^{cm?@Cj4&QhH2p&$&hZ0)zhG90flh@xLfXo*%pP z1HsS_r)I7nJPi5)5by`rUSBu(m&Jf3^AD2zNrC_v9f1C!@&}j*LFLxE&qwADGWg5^ z3T8KacwU zA0+t`2Luloa6EI@dEMu%4@eXS0SyO~{2o5x_`qWn2owVVFD3}bY5JCa~EC@Xy7wBi=0q_SD{2suugQ`W&Fc|@q zLFh0X3=SL*pa9rlkZ^uPV36>6nFJoth$r~Id;omRAP_7B03I-aVG2YZQGkDc0p_m| gdqg0f2sk{I;tL>pL4jfbI2aWG5da#91Hc{tz=$g6mH+?% literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..35955bc2021298f14e78677f1134681ff57ed248 GIT binary patch literal 505 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 JKpp__1AyX#(Xjvk literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..887a4b866414750fa353f434e7890755aabf34e8 GIT binary patch literal 524 zcmV+n0`vU=00;tr&>#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{Js-G)4;UJLV1F1nd|=7=;6Q&cJAsfx@DDg}JcH%gtB2G4 zKOY1%KAQ6RgGLDeh<}UbA0_zk4Wj}V4lq98^AL;-9zAQU^nPITfPNqtYDcSeE)Tx~ zeh)9T_I@8(%$N z{(tG<^C^n_VUh)K%psTxV%;DJ@q>641suR-f$Jh%ns01ONh O00d);od6yH@B{!JY}+dU literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..8e9a34e971bd15694ea1fbbb480a712b73950009 GIT binary patch literal 515 zcmV+e0{r~}0RI7i&>#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{Js-G)4;UJLV1F1nd|=7=;6Q&cJAsfx@DDg}JcH%gtB2G5 z30Mp?KAQ6RlST;uh!_U0A4T}^5u`30XW%v=^aq$kv5?N?)_OlMdVC-lXgA|^E)Tu} zeh)8&_I@8(;Ko{FBlFX2vacnC(6M9!7GNr z0paF6^PA6D9#a5#lty6z!{@=}?jMLeph^*rU~f6V`$i}bC^P~efq?%9>;H#?#sR^Q@$WSZ*-3{j$2f^%sWabcl!NKfz5P88k5HNc$#L6J@{1=!2FfdF25&`^kpaZ}j F0Dyyp+Bg6J literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_8.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_8.bm new file mode 100644 index 0000000000000000000000000000000000000000..a430e480a6fff0f3e6a619747de0e6cb40819722 GIT binary patch literal 517 zcmV+g0{Z;{009Dk&>#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{Js; zhw2Q#90dJ;P&@Pj;qYJ75As4E0)DW6$OI37pPmK>{lGX32k;+$1qS^vfOFtK>bQJ+ zHE{WZ#a=xK3?Eh>EqQ$KGw1|CfG`pH2g!aT!H<{6fq;PP1L_YYaaaN4+`7+4<_|OI zgUi{vmj~Z50GK#O`F)><)_DM;1Iiix|IhzE|M`5la0wIx@&90mJi7n&_>0Da5`acH zG7$PF%E17kLk@|F2ed#QqOkxRowgwLLkIyS z0QCWgJ*FS{2t8Ni089uynj!#6_&w=>GJ+UJKo5E_J-8rp2b~NbxC#h8zu@$Qcni({ zQ;0np10YHi3jntudS`+11`q)9FyQ_EU_tKp5P8o50uN>QnM6KC=Ku^06(9o*3!y+B H0Pq8VP0`#< literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..487f50b354b087e2a65878b92ca3e653f1b244da GIT binary patch literal 526 zcmV+p0`dI;015(t&>#^A1P~1p07L#i-~^w8-Y_m%fIZ~^^^^nOkS|#{89)P1Etm*= zm0x{Jss;s6yGFo;0{j~F+A3NQ#jJYazLhy&9B85Rftr0uZ> ztOLv)AOOk%>H{XZ019FMfP>k7AOygJ-M%0LpM&Bs0~jHMWB~Yv1J{BJFd3c5A7*n0 zpZp$&@h><0>>%~LNC1Tbz#)hpU;&SV;Z{h}gM;!3{D1@70Rab}^L`I?_?bi=Mb-cm Q3>6>)4GDPw9suwJ09n4>asU7T literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/meta.txt new file mode 100644 index 000000000..93e59e49b --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Mad_fist_128x64/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 7 +Active frames: 13 +Frames order: 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 12 13 12 13 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 67 +Y: 24 +Text: Am I a joke\nto you?!?! +AlignH: Left +AlignV: Center +StartFrame: 15 +EndFrame: 19 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..eb0435241d2b00a3fbe2e3a1e97e551679c7d6e4 GIT binary patch literal 636 zcmV-?0)zbl0C)lbcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`iv$8h zK_O6p1{Bs2`Ai@Z7ze}uDF>ts9$yRufOaqdd54IeUy28U1|M850txl)+#?hS1n3qr zgkjJiMDm6khWrmj7{nkW@&|~0uoy)EtIQrK!8fE1eF+DlG*RXNAM6Gb{RI^Q5bZD- zG{z7D5cydEg(e527(7Aoi2}-y0vLEaU|-;Q;(zh`#z4F=59~e!+B^jjNH|FZ1Rfxv zfs&4aK)OkwR1=uz!Q%%9oPvP^kW6qu@u>a(@Si}uq7)DOzLNriJ%{EB7BSKo0uMX{ zOUM6^N;nWOd4FVc8Iq)6eiKm2Bm!}SP$v?|6(kNYV0hpq5dw(BC?@ix2gDwbh=u|| zg8%35699PQydU@sq#jfOP=E*?KVW#lBoA0M{tf&8{=w!iTps^_2Ji$#08l@`5U2mj{+UES*f@NIq7NMyetS?&;P%F1;BrYNDttqya(3+ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..9988e18a013ac36e3165fd8338d50f2697aaa98b GIT binary patch literal 640 zcmV-`0)PDh0DJ-fcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`iv$8h zK_O6p1{Bs2`Ai@Z7ze}uDF>ts9$yRufCexCd54IeUy28U1|M850txl)+#?hS1n3qr zgkjJiMDm6khWrmj7{nkW@&|~0uoy)EtIQrK!8fE1eF+DlG*RXNAM6Gb{RI^Q5bZD- zG{z7D5cydEg(e527(7Aoi2}-y0vLEaU|-;Q;(zh`#z4F=59~e!+B^jjNH|FZ1Rfxv zfs&4aK)*@gR1=uz!Q%%9oPvS)k<4&F@u>a(@Si}uq7(=mvXcUWJ%{EB7BSKi10e^N z0wv@B$R!cz2Y?Ay5C6{W6GuuyFYa aL>^oJ{J&ricvuj(pZ|XT3xNL)kRQNZ69Ys5 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..fdf7d166565a175b6777a3e23b5f5857ce966880 GIT binary patch literal 652 zcmV;70(1QV0Ehwrcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`JJ_S0znD{6cj%3$PL002rsX5x!nh(f&&mPom2oo^rk?f0rLiqXEF~=fIYjh z2#7rI8gP1(+Wm~wgUf(#5P5z9tqhyH&Qg}qV=FCw7CAT$f)5FS`u1QToD zxC6!!0iP<3NB9&Idk(gVW*v01P}1 zU)T&M`U)WUg32HRA{dH9K6XGENrCAG4-kA}K(Z)|0v-<-6C^?9iT}s%83ORcKd|^0 z@E%wSB9L&B2nakuLjxrp0)da0z^Etz&x6Je4><(_!62C6f#Xs8|KUD?c|<4>`8_5C zkQoom6f%O*&^HnQd0--5Km33mKLB|_C6gJFq+os@{Qw>*A%svZa(ERaUNB&I-~rUQg5)2>1_cN`Ieh`rp2Z%l~AXyYf0S^a^36dc4#Q)>>jDdJ!AJ}{g_zx@v5lA>m1Oy%+p@EW) zfk5X;;8YX<=fUF#2b_X|0hUZ~K=G*k|L~tcyrL8jCY=p6YtJg^Zj zAO1lo;6TCTG8v4?QZPRc{(&fv3C0mXpUdD>kT}7Cb#_3@|)lVDq4SYV}&J_C^md_`s+V z4F<1N04az(ejofCp^RMzq5tOq@rZCJK8LXni~uvkc>HJc6?weO05SjN+7sa9`@tk` zNCZ3mcKyfx@bF0k)(wAye*gcld5hNvzu&>U0TBQc5AXyj|MI`4Q4jVGA0a4%%YXlu U>;dl!0v7ZC@87|2AK}si_@xCB0{{R3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_12.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_12.bm new file mode 100644 index 0000000000000000000000000000000000000000..7ee0db1f8689ade0169268c41da929e3ce02e039 GIT binary patch literal 610 zcmV-o0-gN<0A2zBcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmACUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)=78;41yF0C@6hz*vL!*-~tc;{d=9x=oqL`Kw!iRr&RzDJo1Z?hzHCXIh@E8 zTEk}?2t9kT2#KUjqskTtJqhVx2aYHnd;=hZ%kT*w{QfBm0*n@67zdZ&9#9$u@(2YO z6k#ksU**p+0E9qk8G%svATdf1e53&Kpw)g0gM~GOeu46UK!NE42ekqKKNqRNMdVZ; zgHVU!030p?3AOLs0pp;RY9&Z>g3usF^ar*8@I&+fHUkKt7yAGf2R?*@(4KJcIe%a< zpXex!;tME%43c7b5c$~vWhMut7(7Aoi2}(&AoGELf#-?;$L|>ic#p;(0{#Qb0Yp*` z5_DbeJZ99#{Z*#3&~6q(OKPFndTaU;O>zVFkc{d>{A> zr2cS5A%n*P4;VN+@CZY|Pl4wP52wbjRjS`)VffH$^*{ocz%YLg{tTXd2ciGx0P%=$ zC@1tM90GX&f&6Fl5P7`J05SXJ?i1kT`@tk`NCZ0ld;Q1$@bF0k)(wAye*gcld5hNv wzu&>U0TBQc5AXyj|MI`4g1|qpaQO*D9$WwXzhDn|SP-|L|9<_1KjG2?_}G;RO8@`> literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..2055cd97430d481eede02e2e072cb415394d24a1 GIT binary patch literal 624 zcmV-$0+0Ox0BiyPcmu#50PqKZE8+hD5I&;;%lrn0J_k5>F(B{_W~){H7n~p-aEK%W zTn`vz**F{o9)DivbGt;yf(jvmfkyzvRR9$e(hois9F}0w z%;sF_p@G(ZFWfWm*EqJTml<^v~y!X9S;vH;3V4@fY0gX0nfl^`CFFYr9^KluIQ zAhQwp!{A@Qd0;4tLBdENC&2{_43u;Q_{bns7!)G{4;VN+K-3Nlo&jAMqk%0gM zkO7qf8b2@SeL?3Sg#ii*x@-sxZV-?`eS4kG=oq0C5x~R?r&RzDJp4Q`c!$gyIh@P` z;6yEWJ-e|8i~|uWh(Hsf4?=oF1>=CoK!M}HH;6pH5C~QR9uGJy!Y~gnz&xk{^npes zhVlMf^8)b?r-B0%p$E!94->$X%yKZKsE^Rzp!0!)(t!Y?KsbQ%4-mYHgTVjs|K_0p z4i^Cg+V}1N@xW@ZTBs5*=nx}%1KR*r7zq6U4S>QZ1^&PVfzP2J^f#P54qw;|C;AE` zc>o0>AOT4XAu2!tvH;3V4@fY0gX0nfl^`CFFYr9^KluIQApr0X#vcOy1Iqxd83qzT z0X_&QU}U49FUCOvpunLR5O~4C=O71^#{~l9SbqQbPoQ2=0C`eiP)Wpl<_Z}>Xu<0+ zfO!A%0DH`4P+J58!~dWI&Ja&JOcOv4EC4*>6cc$;AiM||J){^f{(kW=g5W>C5BvsF ze>fu$!Q+7kj2s?#1R>xj!1INN)8kjF)o-#e{Ae|LpaD!^7(a*q22VbN(Esy*c*Hmq z6Z#X50X%>}{xkWAJl2wTtpzkb3W@aX~kc=G_9 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..f108180b8d0c18d4a59ef0426cec93ddc749255c GIT binary patch literal 614 zcmV-s0-5~*0Ad0Fcmu#50PqKZE8+hD5I&;;%lrn0J_>K-3*VbV6h+=59kl@T!Z+4z@Z1HFQ7cl?0-B293D^*`s4s* zK!%UY`X5kv$RR*Nf`{he2?7__x!mr9+8|vzr~rZPA24XP7mfoU;UIXx!RZRXL&4}CB6$PKfFE2g0txk=+zI0h540A60w^f#zHaEbv}r2+v&fN=oj1D`@c=pQ(E9KWy_PxKT+@@9|>h(icUkN|9eGLr++ z3?3l(#DQf<0Sr7IFfZ^t@jv+e;~-ubhxQ)={sYSZT^R-vK>-JdC}3oxpc}?P0-&eI zJ`Wf;JmdiKnBalqQTzYlK7n~e0p&@7K_C(zm?&ihqX(`6CFB3dB^(GCJti|HNWlC* z`UIjtCm2CI=^$}~1IGa^@CsF-@pIt z9%A*u@AvR;07O6q1N;FBfBdiMltcZ4hsa7G^56gE`v7~wz=gd3`}go%2l#Y={yIhh A`v3p{ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_16.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_16.bm new file mode 100644 index 0000000000000000000000000000000000000000..9ed1f5520a8fdf7004f56d86d18cb8e61cdba5aa GIT binary patch literal 638 zcmV-^0)hPj0D1xdcmu#50PqKZE8+hD5I&;;%lrn0J_>K-3*VbV6h+=59kl@T!Z+4z@Z1HFQ7cl?0-B293D^*`s4s* zK!%UY`X5kv$RR*Nf`{he2?7__x!mr9+8|vzr~rZPA24Xc_&8z1{exG4d@aa1`$9i^q@c}kPaXmpmXR*Jp<;*9(V|s zkN+T)N0;IcAMB1}GE|HY!~dX4Bq@=EP$v?|6(n9TV0hp)46%enC?@ix2gDwBhoHeE z7%%>Q@h}IDJHh{e+Ck+&6$k)<HssI$k9zPHM4IVg12SMn6`M^A490~|LZwCP<90GW6AB_HDuQ!>120#3}LVO&b zcqEO<0Ed6B-?;zY9tj|N!LRUd-~aXxF?!(l`}jA2A|L{R{s4tP{#W$MA^yR`K-3*VbV6h+=59kl@T!Z+4z@Z1HFQ7cl?0-B293D^*`s4s* zK!%UY`X5kv$RR*Nf`{he2?7__x!mr9+8|vzr~rZPA24XP7mfoU;UIXx!RZRXL&4}CB6$PKfFE2g0txk=+zI0h540A60w^f#zHaEbv}r2+v&fN=oj1D`@c=pQ(E9KWy_PxKT+@@9|>h(icUkN|9eGLr++ z3?3l(#DQf<0Sr7IFfZ^t@jv+e;~-ubhxQ)={sYSZT^R-vK>-JdC}3oxpinQ;cohXc zIq-PF!RH{Lek5}o5Ikx>fBYxVFDQiq2P~w(ppXd<%oH+$(a=5;5P4uCUO)VU&}JZb zMQRwzXRc_o2TMdJnsjsj5vphzMV6M0et;txn6bYvJW{(kW=2aY?z z|A5LtK-3*VbV6h+=59kl@T!Z+4z@Z1HFQ7cl?0-B293D^*`s4s* zK!%UY`X5kv$RR*Nf`{he2?7__x!mr9+8|vzr~rZPA24Xc_&8z1{exG4d@aa1`$9i^q@c}kPaXmpmXR*Jp<>eKo2Yg zOUM6^1I3&m@q$YxGbKpC{6G2tJW@jlpjzbcDoDIw!12HX#t8z5P)+4X4~RVN2_b?= zFkk%r;$ROPcZ2@{w1dceEJFv6*d8!_OAuig1R>xj&K-3*VbV6h+=59kl@T!Z+4z@Z1HFQ7cl?0-B293D^*`s4s* zK!%UY`X5kv$RR*Nf`{he2?7__x!mr9+8|vzr~rZPA24XP7mfoU;UIXx!RZRXL&4}CB6$PKfFE2g0txk=+zI0h540A60w^f#zHaEbv}r2+v&fN=oj1D`@c=pQ(E9KWy_PxKT+@@9|>h(icUkN|9eGLr++ z3?3l(#DQf<0Sr7IFfZ^t@jv+e;~-ubhxQ)={sYSZT^R-vK>-JdC}3oxpinu|cohXc zIq-PF!RH{LKxLC05Ikx>fBYxVFDQir`5~mhppXd<%oH+$(a<^aaCu-NUO)VU&}JZb zjD}+}RE!V9|DZ|=#R#BJS z@EJ%vr~;t?5Ilas@q@}?5exNT|{2Ra#5CK5{079StEBa*+|6t+r5{Nvv|M`Bv9`LXs PZ$JM1{1*ZK9Uwn|IAshQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..19c045034e8f6e540c73ca003e2f6401fe00cd96 GIT binary patch literal 639 zcmV-_0)YJi0DA%ecmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`iv$8h zK_O6p1{Bs2`Ai@Z7ze}uDF>ts9$yRufCez|d54IeUy28U1|M850txl)+#?hS1n3qr zgkjJiMDm6khWrmj7{nkW@&|~0uoy)EtIQrK!8fE1eF+DlG*RXNAM6Gb{RI^Q5bZD- zG{z7D5cydEg(e527(7Aoi2}-y0vLEaU|-;Q;(zh`#z4F=59~e!+B^jjNH|FZ1Rfxv zfs&4aK*!7AR1=uz!Q%%9oPvR1kW6qu@u>a(@Si}uq7(>xo|6KCJ%{EB7BSK&8;Jls zun{jG{z2$75IkU#$&ATTFh2>XWd&k{P%UzJ6(n9TV0hpq5Gn+MAwf5lAU+`Uf)_?X zg8%35699PQydU@sq#i@zDii=7KVW#l$mPd_lJT=9K-3Nlo&jAMqk%0gM zkO7qf8b2@SeL?3Sg#ii*x@-sxZV-?`eS4kG=oq0C5x~R?r&RzDJp4Q`c!$gyIh@P` z;6yEWJ-e|8i~|uWh(Hsf4?=oF1>=CoK!M}HH;6pE5C~QR9uGJy!Y~gn$G{#m0Qx|q z5<__2?lXaShtt6Uico{)AQB1SN#;2iQdCFe4-!vRO20k9ZF0KeD(usQT39)|OWfy?^= zg#STAk01b~L;xuvge6D-Hb5Ckf$0Vh5PV`lvZMpj1^x$~C;uP3WDMo~hrqvp^1v%b zL4=S%Pl5^<87Sxr@sL2MFepX@9x!lu$N}Xs!9ckdAHV(+=ogeg9#ohV5^)~+f`(99 zFnY`&9zXnm9`hNL7Qq1U|L6eogcHt_1keM^01r5Y1m0ALF9HS+X$A}bpS(;UxDW4x z{{fVr&IrUXc;G?f2M3-32zUwbJmF#V_|@vQTkMQK8Vz2k08o&6B#p@chhMLMxc}ZB2_SmGukdf*|Mm|t zdf@l__&0zeAOeB@0EIvPSM<40q+X}7W4n_->`@LIzWE_kF@@F literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_21.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_21.bm new file mode 100644 index 0000000000000000000000000000000000000000..a3a91bc3581ab33a045af57c81ab7dae61254602 GIT binary patch literal 626 zcmV-&0*(Cv0B!;Rcmu#50PqKZE8+hD5I&;;%lrn0J_k5BF#w~i)oQ=O^MV7;5Ct7@ zJYm42{sj&m1xN@y;*k&mLSmU1cqm{%`-Ox069Di}$M-ydL?{6BFT9u@L8Cvk5>yW( z0htrw1BC;`em~Qrf1>xO_&h)Z1p$-{AW$f!Dk2X*uXDNG!5v4yCM*1K9#v2QaIo+g zfQYyRV+M|AGyku^VGtY#{+>rVuXZ63fJmTlKzP6@0P`oD0z(CXN5kj9M2I}R0Q2Yv z1r{?1z&yVn0D1i&VDgMf4dZ*b&I9ojp$E!9BocVQq6YJYU`OW|H3&H;#k z(6vyY2*3lxPayci#v%_)E&>Vlp4=xDP@u$+#vK|22%cX6c?QG)N+DwkJpcm)2c{7~ zD)az64t)s+r@-1pF#r$t0}1|uiU9}(l0cveF?)!7?0_o9Q@i2nmKfVwA22y`F>I26D4;VN+@CZY|Pl4wP52wbjRjS`)VffH$^*{oc zz%YLg{tTXd2ciGx0P%=$C@1tM90GX&f&6Fl5P7`J05SXJ?i1kT`@tk`NCZ0ld;Q1$ z@bF0k)(wAye*gcld5hNvzu&>U0TBQc5AXyj|MI`4g1|qpaQO*D9$WwXzhDn|SP-|L M|9<_1KjG2?_UQkaFUW+5-ZF9-O{_^EbEu00SHZ93Dml01f(p z2pR-5eqYe}@IUk~d=3F1g$4==9XbXAg(-nRE)bAWeS4kG>;w2DD0~7ST{@@$pb{ra zL<8mx9L{C|A%J{8@{oIXVi6n!fEF+SdlSxq;DLwNfNv0aco@Sv0*s&@Fj;{RLF4%N z8;1N3NEBj7ZyVjla36031}Q=hl!7o16kwak05GPokH{V*(MOm(;9&HmRcJLXu<0+ zfO!A%0DH`4P+J58!~dWI&Ja&JOcOv4EC4*>6cc$;AiM||J){^f{(kW=g5W>C5BvsF ze>fu$!Q+7kj2s?#1R>xj!1INN)8kjF)o-#e{Ae|LpaD!^7(a*q22VbN(Esy*c*Hmq z6Z#X50X%>}{xkWAJl2wTtpzkb3W@aX~ke+>Xg literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_23.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_23.bm new file mode 100644 index 0000000000000000000000000000000000000000..8dc4812d42fe771bda8afc65b33c394ffcbe3d23 GIT binary patch literal 610 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 C9|6+< literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_28.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_28.bm new file mode 100644 index 0000000000000000000000000000000000000000..23e28db9307c8898c7ef411199e12b92491487c0 GIT binary patch literal 640 zcmV-`0)PDh0DJ-fcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`>fJfI=z$6f$!9hc(K)_I?FenAW5)VEm08&4}Aw%F10_nkM70`Idohc9x zr^00hfJk5;5B#Ja(g4Wd0Amn<1KuUz84rR6A6@~xV4;zOF@|&)89+Q>vjQN&dE6TT zxNpGpfkq^N@x*Z4#2-%t1}Q>-VR@Jzh&)k(Zy*4|n!^Qz00w|f6nTTr2L+!>V-yNS zR)bY+7qeBB^ z01!~X;REEALYzl{2aFsZzc|P|=pTRlC(tiQ3lw04F_?V+@d-ebW+3%tj5EjokORko zdtegGV3G(F55xbUN+^Kyhf9Iw%zy*O0VwxoCt@LpSYR+u1f(9jjfi|`0>Ok}Bc2Zj z{sSqZPBFpps90f;m;^sO4;VhCbF<%}$3YUNQ*A06tQm z_X7VQumeU6;TeVl;s3$PKfytWeiVfPoLDds4h05LYzK=CXOAKH&*mxexV+2&G5zKC z6X4|g!6gI_q&t0m{m1_B@JR#K4S#|D|NpRgi`NIg-@&{A5dahnzG&gE>7cL=>>NHq aQ3sa)|1a1B-WCKc=l|cog5W>HqzCXOv=cS} literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_29.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_29.bm new file mode 100644 index 0000000000000000000000000000000000000000..db54d6e42cb72b5490f105d96a4965ab024afc10 GIT binary patch literal 639 zcmV-_0)YJi0DA%ecmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`;12?z-00SHZ93D^*`roJk zfuKW2;{*PO&w>A;d*E;h1Sl>rI4E@J7zz}o1pv50LFd503P<=PD0~7ST_AYSC?N5X zI#M7XC>fA@0I*>g2BbAfp9Di#=ICIJu61I9l9{pRN=anMLUUy1+o0uLWN2m6P<&<{g!7mR{2fCr2p z{rmw8g1`+JGel+>4}d&nALxJjA^1`h2614(L^uHRwlLOs;vbCs9x=rDyvzVG{pI!( z;NknhB?J$oJAHlq$Nq5eNdwjme}Vr0|FC(B*9X7f!Mp(x02BUQg5)2>1_cN`Ieh`iv$8h zK_O6p1{Bs2`Ai@Z7ze}uDF>ts9$yRufF8l(Czs-Z;DLkJ3xI-sdv^%M0s%S&jG-8G z2oXG?hT*>h(MB-{2>gNKA8ZB@Kq~VGiZD&-1D`@c=uH%PfCu{lg#STBK!iI?22C-9 z0E9kPKp{zi=>`uFd}2VdqyUB<4;UBt9(bSpe({hm3`6@5fi{l;L{bhCK>-JdC}3ox zpinu|cohWZIq-PF!RH{LKxLC05Ikx>fBYxVFDQir`5~mhppRksf`yE9iU&SU4=e;r z$N!K6$KVekkj!REk%9P4LJt&>!YC8@dfck_;FB zKX{k}#~tARz-=J%pbCTlK=Jzn#t*4t3?l%9JOugyh6ju+9&`_lUaM8U$ie3al;B?@ zpw;St1u+MY!~cVnP>W;GdLRC94;Y66gD9RrI0NGV2q0kJ8T`dwZ!-W4fBANV_&GlC zNgI*@4*y-hasRwL50)+hm0Cxfacmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`>fJfI=z$6f$!9hc(K)_I?FenAW5)VEG08&4}Aw%F10_nkMR2d8cMCnL? zeI%3UlmH?>5B#Ja(g*|#00S6=03Lh-_`z~~8zlq50}rggXfRqtA`-?K(4b`i@q)%A zfboP%p$6f<1JVT)p##Pl9E=Cs!2yLagg!CA_>_d+U;zh=3_dV`_>)B*Zc~DX#sD80 zMOK4VY#tW@1P7%M9?)6@3JQrBAQWDUfH4dOK5w!It`R^YA%H+a;s9tI`V$4ff5EN* zAM6AkAlU#2++iQn(F5uXN^inA!Q}!E5Paa%0D8>7!1TaCcm(u^(!YT8qeBB^01!~( zmBIiyR4K$~q5s9Q-1l~Dob4wnPVnE(f$yD>Wv3_`;Jf_Nn$@_@>H+l`2PXad26U?ZLn2mhZa zqE0cv@u*l~hk=LZf#W~aPIi0rIOrrFFU0@(fd`B~QGMax=m(*=3&uehzyrn)DF1LT z@(TboV9pVkU_Joz3JgQ=q$mvH!GMTx0pn~3i%n;bA^6Y1;#?bx%)kR5-d|xp4j;S{ zP(b=ax7Xj?f9DSbkUe16_#f~8`v;i4aC`my8^93|0YJ;UQg5)2>1_cN`Ieh`>fJfI=z$6f$!9hc(K)_I?FenAW5)VEG08&4}Aw%F10_nkM6cBjGohc9x zq=I}Y84LsA|CEE?0Rq4P#vuR)o&abtP)NZj9taqHY!d)^!WhFk6bzsqFkFRz9ypE& zJa8A_dMAfM4^aB}ATUZ41`CYf#sT7D6L|mz4i6|m0B8i!N1H%kP)HOO87dErBCA2F zwhI9S!UM(;6c3FM9-mrfqzd#4}1X}U__<>C_ID2A3wr)f#)*+1J(@r5CMN-^snGOFwourJi$YX zgbosw3Kfw&LE{&MgVX03c^w1q|BU)Y=>cMl2--6bpZ-AY7#U#NsSNS|=n}2u9B@zu zsKF!19x!lt z!T-_=05o9D5tv{;0P_Ds|IrV^kf1Y*1_B|#2c5B|v&RtpXW;RUC&lJq0gvx5u%8DH z-U%omeIeWH@9sbIhk{5RuxtDe_y7Ha%wD)X{{9W%2#5fnW%EZ3e@z8|e_f>j5{Nvv X|M`Bv9`LXsZ$JM1{1*ZK9Uwn|(F6bw literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_32.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_32.bm new file mode 100644 index 0000000000000000000000000000000000000000..0757af4f173a37f9d1900fb94e3bf87ad7b11f27 GIT binary patch literal 644 zcmV-~0(<=d0DuCBK%y{+O$s0n@O?lb5P*I_LE}Id_~qw@ZT=0OS#loUTV2uM8m7zhYGq6O1}(5NyQ#tJ7Kgwes`A4w$oCC9$| zK7akpJRY(L1PcHI6X41~V+p`R!Q+$Q*(e?e8gN19V3-5OkV+OX&V>Ug2aFdXUs$mC!?-Utj5g#izYa6Tm=2aI62P;hxeAp!9whyY7N0Kh`kb@I3`1zyc3~0sV*4 zzku|kLjz?HfP#k>t`Gsrp-v)%U_s*-goD%P83&gl!}tHjeIoRLu}T3rk9_~~2~jL& zAoej2kN-dij{^1*7z0#6<6wYzMMEm01I`^T2bO>yp6tZzL@^5t1RgvH7(8GypLXM7 z9~uOL1b7?=_rd??$|#eJaAay07-8UW7!Y{R^%I?*{{jEdNIqYQ_&nkIi|-EqKwk~O zUNQiA!Q~(B1^z)`28joEc$Ws^^DqF% z@0YkwgNN?~k|;n24!>UiasQk=5(?MV# e*f@NIq7NMyetS?&;P%F1;BrYNDts#BoN#H literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_33.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_33.bm new file mode 100644 index 0000000000000000000000000000000000000000..b1411659cf3a8d9db4cf3aac513c3a733dd2e58a GIT binary patch literal 578 zcmV-I0=@kK06qeUK%y{+O$s0n@PC8+A8-JFgWKW%01&>T1N;02hCUCyW~){H7v8uY zFyQ=>k`6Ddj2?iG%!~{l&>!Hr2k`-cLILd%FQ7cl>JLl=93D^*{Lmqz^8TadK?)6& z6hAizNIdu$2nc06mby1Q*8u-XQXX2hI{7 zC@jJ-4;)7X9-;DqMkIjt7pH;)6rlsh8NrML&H~RU1SOWiqq+lT-fHTk@m_-1=a3A;i6WRwpguz&350C5y6aD{y z1RoFjBip=V0-`P$Uo|!DGB1{(hs!I2Vrs zp<#v|3+xXW{G<1qoZvtD2?xvZKY(F@;}4X7F!$O90t0XtiHJev2M3HF{UERdMhym- z1IOSGFZ4hC5d0|$12_kaLx2xEV@$vUJU5TVeh(Ppd|qY%82|F^3Gi_J;F3iU0HNRO zx9&gldWZl)>juBUzkmPOJjLsS-|yhw0EmDJ246Y<^1r5nz(20ifC)q%TmSsOU=Mg$ Q5VxQIe*O!9{|=BJz)g$(>Hq)$ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_34.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_34.bm new file mode 100644 index 0000000000000000000000000000000000000000..0f4dd9c27499c0759c8c2fc1cd845ac5f932a649 GIT binary patch literal 476 zcmV<20VDna0N4SDK%y{+O$s0n@PC8+ACM4#gV*8z01&>T1N;02hCUCyW~){H7v8uY zFyQ=>k`7<2j2?h*%!~{lL-NSLe}d#6#0CWj2dn_Tpz}A@0uB!-2z_7x@}NUU<^2!L zf)pDlDSmDcka_Vi5DAprM+ z%p(Bt=WuKS_kl(vfbqm|;9&OfKw^|A1{axu_=DJ(FsulCVE_RK)D8xAO zF5&sY;2?(bj|1U&FedoNAmI1FIz|Hp{BRxa4;&(ZV6glAfF3TP7o-k-2^WX}LGk^7 z!hgT;0E6NJ%McKU%)Y?Eg9nH|5b$`+zrgelrUD`Thtj`*`vndz5I;gV!Ug4@2aH}4 z4@d|+XaMo3{r~ZwNWNeaAD{j~Di5?IJ~#-MkN-dizH-f~45S}e z?+5>%C>Ph*9y9QIlf*tV2nHA)Fz|mt#qJMJfIp%f0DKd~9x!i={2x&d<=PYA;rrS1 z{=0tT|2TMlZ}4y5|Mm}@hW~#C@B~C(9}51O3jqGX!{s=^MB|W}Kf+(I2ek|Q05}4OK%y{+O$s0n@PC8+A8-JFgWKW%01&>T1N;02hCUCyW~){H7v8uY zFyQ=>k`6Ddj2?iG%!~{l&>!Hr2k`-cLILd%FQ7cl>JLl=93D^*{Lmqz^8TadK?)6& z6hAizNG!0wd<0}Z!9fRs85K(+! zA>r{$3?M#mkoiGu69@+v-|_GR&^}Nsg@8UVj66JE-TEXgbFu4EvJc;W-`9NS|@c;-uAYbSg_x=D7d0iKkPB2k8}AW-7r1M=hFeV#wJ<{tphgT^lj2b6%YG6{|f1pui1|M8zl{K4f( zZHxj#^Z&>tLGq*n*8vjo|L6esn9P+U1MvUg0P}0z1wsHIc>RInKL?%xD0m6<0}Kxsczr%KdaYLbBL|!u9(oO4 zr~p$Cc>DqD(0UtGLE{kM1JHb60iGMj<39(Z%)kR5{#~Iy4j;S{M&y7)zt?Zvf9CZN z0E5;Ie}jJi|FC(B*9X7f!Mp(x02B}K1S$XWzotP+K%y{+O$s0n@O?lb5P*I_LE}Id_~qw@ZT=0OS#loUTV2uM9*0QQI%PD=o|KqnX|oN^OK2Z((>5I6@O`|SDu z_b~8!VSnH;z(@vT0F;2le!mI*1Hl7M2t4o*^7=7`bOaedJYcp7fIOrS`UV304@ee5 z!2t5%;rsymcpjsn50Cj`An}0%#xOW2B?llpq0vgUGfa@uXE~HCDl3AW%pb zl)iL8dqFUeC@c^hGy(Ad5da|Z@F)g=8z2HmiX#PwfBbj=b0>!h1oF?pj7L9|1_rM) zkek$wKj;_q6i^62Oq?Q@B*2oA$O9=b{DFf44-kA}K=Pyjh8_(Ai;n0_lbZ! zao!L722y`9P=E*?KVW#l!RLTN9s+#;!vn?^A5V>5t5v?p!R8-L2Cq~ADTq9NAN(0S z`VT|@&H>{P;80KKPB;Yc-ai@q#2#-m01SWmc7*sjKJZB!k^v6?UB7YvygU*>^@CsF z-@pIt9%A*u@AvR;07O6q1N;FBfBdiMltcZ4hsa7G^56gE`v7~wz=gd3`}go%2l#Y= E{$-vCWdHyG literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_37.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_37.bm new file mode 100644 index 0000000000000000000000000000000000000000..cfbe16d18672d0aac5fbdeb7a1bdef4cbca25c8e GIT binary patch literal 570 zcmV-A0>%9S05$>ucmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`>fJfI=z$6f$!9hc(K)_I?FenAW5)XgikfHDhfpo#?B6OrcKN1)R!~ZD< z&H_LS7yv$~9taqHcn0wYqylsV89+Q>vjQN4(*b@5qzW-458r|V6rlsz7$))n3@NN2 z^d^ct!RG@9r6Q|As>jDdJ! zAJ}{g_zx@v5&NFX5b1q=+7bO!*)AXF6~=fUF#2b_Q&QydUHYCnJcC(th_fIO)% zC?o0;@HF}@{OhM!D z|KQ2z(0U*Ka1R)V0)l@+alj{r@%Yc?AoF>c0Av5lv?syI_ku{=kO+7B?fZ}Y;oy=7 ztQ!9Y{r~@9^B1lUf4_rx0wMq?AK(a6|K)#7q95!WK0;9kmjC}R*aO}c1TE+P-@k(3 IKf|O4@Q(KH5C8xG literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_38.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_38.bm new file mode 100644 index 0000000000000000000000000000000000000000..14c557d067635e889b2a2430ac5cd76698a538f4 GIT binary patch literal 601 zcmV-f0;c@|09672cmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmACUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)E;sOP!OP@`M5$rh2@ch;vii(EIYyD2e^FTz6R0*<_K31dEf!<~!AsP?L4yD1?-K|v1N-3rz-1@%f&mHu4;%ArApQ2b?TEpBlYZt9_A&<3X#{019IO!Tdk?GI{hKhyR=d#v#C11d+KQ5bO2t_aFPi!6Xk@HU16z|Ng<|FI*n~e+KXbL;z4f nz!0bZ%Kn-Q0RF+lUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)E;sOP!OP@`M5$rh1ITg`r!767f!oZy4^wUA3Ck$H<<_LHmOYqo&X-i_PzKo5D0$_rqCcuhhNI6*w=FiikFumJOjP)+4Xg76?<_K;w|`TNAe3xNLk zKkykz{NR8>fCI+@4;VN+@CZY|Pl4wP52wbjRjS`)VffH$^*{ocz%YLg{tTXd2ciGx z0P%=$C@1tM90GX&f&6Fl5P7`J05SXJ?i1kT`@tk`NCZ0ld;Q1$@bF0k)(wAye*gcl zd5hNvzu&>U0TBQc5AXyj|MI`4g1|qpaQO*D9$WwXzhDn|SP-|L|9<_1KjG2?_@D9& A-v9sr literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..42dd423a8b6e874642ae9a85a3d3290011748dfb GIT binary patch literal 621 zcmV-z0+Rg!0BHgMcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmACUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)=7W?jDi#hC@6hz)B!-;As~YK_dA`~2Lt~?_rTy00_oL21UVc93R40Hhhl2_6M8{9$x@>qXgbhQ-YJr z@jxbuJir5mz(GE}yM$taNUG3kuY-cnAVl(pP$+=)d5l5=KOlIIhyZvDB7jxq`yc|q z=g^RO;0f>jfWm*EqJTmHWWf*siN+8rOCSuS!1RL$h(0kOSyBP%0{;Wg6aSCiG7Rw_ zj6MbY2bKbeq#PuI0(=lqz{y8IU<`rJq=pFq5#0P>{3 zpp%IA%oHzUqyyGr0P+9i0QZ>8ptcAHhyOqaoFJZbm?nT8SO9s%C?@ixL3j`_dq^-} z{Qcr#1;BrNANUNU{%}SigU1377&tue2t&Y6f#(Ykr^c^Us^4T`_|R(gKmwS+FnUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)E;sOP!OP@`M5$rh4t=tJD~Q67fz}GAbW?*8abTEKRdAqh&=EB_9wOafOrsi z@D1V*E&v37^e=o29xz#iU>;Hcc+fBuDNG0+Fet$oe!Kghf&u(W6g~mqfW;_5^88pJ z5+Vr-ga9z6u#d`N0Fb~wANfco9_9CJw%1`G60u%rq zI1qTj!RLTN9s+z1I9Po?HF~X9`y&s=gIB5m6vhFA_Ay5C6{WKN<{ey?dN+9yz|K>>XSkRQOJ>;)MB literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..4fdfdf8ab52cf3b1b78a08c99e264803ea0cd81e GIT binary patch literal 636 zcmV-?0)zbl0C)lbcmu#50PqKZE8+hD5I&;;%lrn0J_k5>F(B{_W~){H7n~p-aEK%W zTn`vNR9!DssJpch#r?h zF@r}lnIMR`zw`N6Jv*@oi~|5$7-RyWMhBTZ|M~NXuEwE6fN&6E4=w};Ap*cG$3s|v zOd|mDkZ=R#fI$z6M%Wo4ym$9M0Q_K72t@;g&KRW#K3|IfJvCS+Fv74S^Oy(L1rP_6 z3?5$tc>~3&G6(>8iR4-oc;FhvKY(Fy5Kpge;TWn#QsqIar3MN#5_v-b?|@jN zpj?X&-~S2p3(6o5DohFqIFEe6Lntj6J!TLOAO1iOd5p>nV1Rgk^ZOJcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmACUQkaFUW+5-ZF9-O{_^Ea>z@DOl$7!Uw5Kp9XW zqw@ZT)=78;41yF0C@6hz*vL!*-~tc;{d=9x=oqL`Kw!iRr&RzDJo1Z?hzHCXIh@E8 zTEk}?2t9kT2#KUjqskTtJqhVx2aYHnd;=hZ%YX?V{QfBm0*n@67zdPq9#9$u@(2YO z6k#ksUH#9&0E9qk8G%svATdf1e7_a|c+hIU1;N6a!apg1eBcludO*SD@CTIw06!P0 z!Aa%#2#ZjM;s6{j0txl)+zf-Dm1-qObAr$yMDm6M-vD?a`2)lN*bE|oU+e%_9QqOu zLV3f$<^6!df1si_h%BN2GD(T#L+4}xl$ainVDSgWBnu@7gU$v12c9SYAG~B4;y)OC z3-}K#1rbO%NdyG=AfbVhj)1)x1PX%!gkV;r4> z-!M?h3q}uFgagO_kOSUhGJ@D39v}Sx9&mzr(qNhZd0+wO5TKjNkpI@An`3!@(pEST+6) z`~UvI<}X|x|9=MX1VjK(Kfn;D|H}TF3jqGX!{j9pd2j#n{eV5;U_#!1{rmP1|A$Bq E;MT$mhX4Qo literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..248dabbc663c5cd619d7e0e465205755a01ae162 GIT binary patch literal 622 zcmV-!0+Iaz0BQmNcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`rp2Z%l~AXyYf0S^a^36dc4#Q)>>jDdJ!AJ}{g_zx@v5lA>m1Oy%+p@EW) zfNdEB3W9(f_&i|X^N<6|V}b{bNALfH`UT|>2bCrSkQoom6f%O*gVzBP@&Du!jsy%I zlNpkvV16I{0#P6nj3AzLkT}7Cb#_3@|)lVDq4SYV}&J_C^md_`s+V4F<1N04az(ejofC zp^RMzq5tOq@rZCJK8LXni~uvkc>HJc6?weO05SjN+7sa9`@tk`NCZ3mcKyfx@bF0k z)(wAye*gcld5hNvzu&>U0TBQc5AXyj|MI`4Q4jVGA0a4%%YXlu>;dl!0v7ZC@87|2 IAK}si_+6a|p8x;= literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_8.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_8.bm new file mode 100644 index 0000000000000000000000000000000000000000..5a46b96dcf6f9e7e51649e4782cea238a40c645d GIT binary patch literal 644 zcmV-~0(<=d0DuAjcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`ra1{hTm92nhEQ5M z1^^y-2$zrlAe2X-9sqd%WOEskq+os@{Q^-TOpGFdIF>-EBJqO*#{sBhj3OaHHa+fAjZ=fIM;D5Bvtw4=Mw!-~jRa1I7<2VhjragggZL0fq;REFN?Zjb5u& zzR1DmA1D+DL95jO3Sti*hyMnT93%sv^gsOI9x)CD1RghofRl~^JU5TVe=%2^%)kR5 z{#~Iy4o|!iM&y7)zt?ZvfA0?jkUe16_&4wW`v;i4aC`my8^93|0YLu%LZAOD`ehLR eVBzu-h&;Fd`F_A2@US6oKmPsv7XkhqAU}W~iUJ1! literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L1_Mods_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..4fe07c9b1da31a7544173038bae6bc91761f90aa GIT binary patch literal 647 zcmV;20(kua0D}Smcmu#50PqKZE8+hD5I&;;%lrn0J_=zPYc*Q0@V&4g^Vb8$92`IZ z;6mmAC^$UgAOXOD%OeM%4-_8oFn>UQg5)2>1_cN`Ieh`) zP7hLhU$L5yd2kKl4==zxs8K-R#2~W>z&yVI^vXkl;{uEkhwJ>g<^jY0|JlO>;DE&_ zLGq9T#{jh+QSjkSVIQS{9yp+Sz`^Md|Igx(x2i!!E0C>V6 zG>pOMQH4N(8`2R$s{9B-RuMrD&^}NI5InGo0au_rXb=JUz~|7AdVD|N0f&Lh`vHXi zK|~)ASwsM2LlH=a&d38PFg+l_;tz~S7DW+&L&4($WQaVmKluIQAYK@U_8$WN1IqzK zQVtS90SAaEU}U49P%qMW6$Jn}@OZ(&=OCbdBy$`PJZe9G{3p;aD1`zCETq7a10nf> zhEQ5M2f{)RECfr(|B!kN#19;NzGE^}j1R;Aph^nG2%t|SuqsHrV8HRfN+47T1VVyu zDnNWe=>#r}g9ZQ3-X;L?$9O;R8Av>+4zqv*$LtRnJf;y4z+e!EfS*7x!10BH&Vli( z)oQod7(Bz`T^I&~SE>LM#2!Bn{ti(f9uGn2fBC>XVjKz#qk#i}4~zga!+88>^A&l# z%m6X}<=PYA{dWDw{_yZg1J(_HgMR=2uz8Eu2fyFJya5pa6c6wODgW}n hrcn>}4j&;XgUf&am+S%W3j!AN|L@rBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fOpudH`hRdR4*Wh)9!NbZ zIh_adpMUy@#sNqNo&#Y~)W$gb{ZIfw<%qwoMxiOILU335r~rTTb_l@W@(qL~OfVgI zeCQ0(z(yk#h%A5}HsJXK%7K8eLA8=uh6f3v53GX$#DLYLaheS-${$vcoX1}goXBPx zfcn5D6RZVhBl(EHZ3Xi-3W>5=-f&+BIKrB^N0FX!kSqp_gX>^~C7P% z5DX>*Z>qx=#&i!H0)Su~h%)?Z6x76{hvh|tRbb%t t!9;K;@{=FN1`k*l`~Wxltd|IW5PF(K20Q@x(4WHt2Oa_t4=MnBbU+(OFu?!- literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..3c9623d4c79a19e74bfe403f8819221e10322d62 GIT binary patch literal 764 zcmVrBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fOpudH`hRdR4*Wh)9!NbZ zIhhCZpMUy@#sNqNo&#Y~l*Tyw{ZIfw<%qwoMxiOILNHhQr~rTTb_l@W@(qM0fI1y` ze8A)2z(yk#h$uX*!SV-{0|8)zYb3Y~1`|XdSq1}%0jo&xGzwjmKCK}+j=m#7kjym! z^?*z#SPINX!x4bm3+8MX2Lcb^*g$j`sD{KoTB}mbpce}S2VsPOSgNW4AdmpFoCpp= zlK{|ap->H1s2+Iy1O_n)fLJQO(D?O1#el=WAajU_e4xSg_)+H&Ys7>;P*?zcKhxSI zGx!D&`XEGHG4|NPF3j?jV2LDx(;Sa(OSRfd<0r8I}kAEZeiLFwq0vN0iUOd2f&LEKuLdZY`8i5i< z8v%oO0pr*_kN{$!@qoc#5PSy~Bd7)KEAWA;h5;di+#nj8@I05|qab+9VBk@$&;A4gii65A0QiH;RX?~G2Yw$Y3?v?W z3f^Wx{O8~PqA`FZL>^KNbw*Pda1O3<3vNf`iK3A0T-E2Y~?9$#579CWt@GV27^@! zWC(ox191n5U`V6=53lfSAn|+%d|<)!;BUj?(;)dlU;*>^LG^3#6A*py6WYC2(gqmt zec&E3_~dXreF&6b*bP+Z9#PN#RslkkP%eS-yj5nP^0+}Ya0+Ci0k98@5I&p;7yJJ+ zm`5rB@qtxms`G%uiK7^ihsp!0mn+Tzb2prd zf#MJ4CW20Z<$#35A@S%p^W2$+0l7vTBA0pp;6LMRac`2Roj0Qq47 z<52KG_y_TUf4}oE`B;O4D2PEY3-N=OM*bfd6h;v+jzS^$500-KFCX}Pagq23LI;E~ z41T|V`~$|r75G5M!vNw(I1n9W_#R8~QII@@g8;5i{saPDhyZQ?^wdx81_9rP$^$6} zrGGOZ{&VmDQ5e7_0Q10VDl(YIAAhO<2t2tH2nB+%DXT&-SNf;`fAV%{i-kTgngHl^ z;q#CvL>@58t@94-g323+F!{kVJJ*7zQdKu@9E2)DJtwR311;1&XSm8m-hGd*Jy}AQ}x+DgYl$ z1zbKzVX#$yq46+?0Dc<1R1HQU@`DH0{vQ}Qpo8NDfCtZkAJ%H2p<)lj0=ZT6j0QX( zZ~*=_|NQSCLPZ!h16Aq=ox}O~xXLIOK=`5ust-7XBjNazz%~K#f(O$94}^aw^El-| zJ}@N^tBwhb@xbHKF!?}rTcCMEpkK&@5(xkglm@Gv7Z?5m3h==2m<_(G3||~@JY(<( z4-^U^@vK#Fw+gNtJT?pj0&))+H2{7zXhy3BFDeEByfFI^{HU;wt^}S`6M*0$0f7&U xnhEL^hyY~V355d@|Nr0WvRoz9R8R#_@F*NdIS0mtItQFUqBt8E7-#|U(EtcKLwx`M literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..13916806fd62d4aed731cb58265eab34adb4b755 GIT binary patch literal 762 zcmVrBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fOpudH`hRdR4*Wh)9!NbZ zIhhCZpMUy@#sNqNo&#Y~l*Tyw{ZIfw<%qwoMxiOILNHhQr~rTTb_l@W@(qM0fI1y` ze8A)2z(yk#h$uX*!SV-{0|8)zYb3Y~1`|XdSq1}%0jo&xGzwjmKCK}+j=m!Skjym! z^?*z#SPIBIKqF``nXq6S2tR{i0f1tn8xZ+wtxGb1Tr2?b!ayulRREAk09noeJW~Up z)k2^euTVVk_yBmqAQlR*^gcaMabPg;2pX6}3?1VOfZOV@#qpg3 z%71{MVLr?8tW|Kg3aoSm5U~%+iwLU0$L9u+&*K;q s`ALuC0|%TV!$ALk|M&W=mk53o`bKaNGbsngg#Hjg6b26fD;RuqKoWI0G5`Po literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..751fbc3efb282916cc38d5999018e804cd4c0a37 GIT binary patch literal 759 zcmVrBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fOpudH`hRdR4*Wh)9!NbZ zIhhCZpMUy@#sNqNo&#Y~l*Tyw{ZIfw<%qwoMxiOILNHhQr~rTTb_l@W@(qM0fI1y` ze8A)2z(yk#h$uX*!SV-{0|8)zYb3Y~1`|XdSq1}%0jo&xGzwjmKCK}+j=m!Skjym! z^?*z#SPIBIKqF``nXq6S2tR{i0f1tn8xZ+wtxGb1Tr2?b!ayulRREAk09noeJW~Up z)k2^euTVVk_yBmqAQlR*^gcaMabPg;2pX6}ciuJ510UA7%7K_Pe8f{#_%5zxU5Qv;P^?P8vyvh z1L6-k1mfXnnnx-D@qq`{!2pj*Ba$%rKu_WiItKznA~lG7pfy{lJfqwRg#v?zz-{$d zV))L1PFMTAvg;PWVy pM*@E-G5la)^`3vg1AnT?aEIXstOyKT0Qk_K!vhDPSm*)q(Ew_YJf;8u literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..c1135b467cc5fe2e313984e30a04ded3dd814e7d GIT binary patch literal 759 zcmVrBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fOpudH`hRdR4*Wh)9!NbZ zIhhCZpMUy@#sNqNo&#Y~l*Tyw{ZIfw<%qwoMxiOILNHhQr~rTTb_l@W@(qM0fI1y` ze8A)2z(yk#h$uX*!SV-{0|8)zYb3Y~1`|XdSq1}%0jo&xGzwjmKCK}+j=m!Skjym! z^?*z#SPIBIKqF``nXq6S2tR{i0f1tn8xZ+wtxGb1Tr2?b!ayulRREAk09noi2jNM8 zXf;r%2CLK$JbnTL_=UhM6<_FldZ6OKVc-xyq)a|gVEX(h^N2T!P9G>N06w4T?GhRB z4TyaZA}$#FY;hNeBzQj%2*wJrDB@^!Ve!BR%m6VA6!J+bpj`vwcn^vsRwYE?)1`0? zfP7$q@duoPae(;DW0e5-z=P{xYK{gmBM+1W{vh(cP$mHJf8L-2#t(j-z3jS2iPFmd1^0P>&*$3*xWIm`e6 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..a4681af98e85a780faca27f632565d56a90abee8 GIT binary patch literal 757 zcmVB0PzBVP#_wh1V*4h^Q%=r4;6re#y}sidI#q!KOp_)f#@Ib|JA;~|NVSF zaiA#b1NRjIjbK0F{}1|oq7Vqjg1#Sx_{cBtNru2bFs=pzg&nX(e-Qe|)~{6o3|1Ks zpV(mf2-Q+6sFiCqKp~AmBoql03&9`$N9z+>rBnnlSRlM?kSPVi2@upQgaA>f5hQr9 zSqB0O5bPdE05MQ_z-+K%nDOE|fONp1LOSv&;#X!fI=t` z5Wt_t1^)lc!{uTJj)MUKz%RxQT^sm(U{M%EBB20>U_3g!aJ+xv@y18T<2XbV?!ABf z1IEJ@_(0&F2sk{U`pfV8P)bMOCA7{DnI3j{I&fY?-JF^)d}Q~(fpOcVuBl+~daEB#aeKl(capz;lbCV)B} zcznR(Ef~aNu>}W}xIRGiutBwwTm}OPq7T0k16GmXXcW6BeW3?2*TiTt8HS)f(+SoB zvk~ybU^asJ-@)U+gZMTO9R?~Pu@9E2)UzlB!odO9VIUSNs(?r&04(PM1CXS^G#aQ> z16Aq=o<9Krj6zofRsM&^stzm$9svWKL__5U53jfcU^cr6ZnJ5c|hPO1_=NUlm@GH2bT|nFn~aCm<_(G z3||@0yz$V81RMl4imn#nRgQztV0airGJroCG$U0G2b;Kj5epFfsIZEx93Ef+$V6}_ n@{=FN1`k+A`~Wxltd|IW5PHD?#lR1Z3H&fHdP0HaKo5?HvfnzS literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..36f2d084fe3277d555dda68b3a9675916ce237c3 GIT binary patch literal 785 zcmV+s1Md6*01X3xP#_wh1V*4h^Q%=r4;6re#y}sidI#q!KOp_)f#@Ib|JA;~|NVSF zaiA#b1NRjIjbK0F{}1|oq7Vr#7-N!1m0(_h@t{H>K=F(N$51I5i%Xy{O8~P zqA?GT_#QAVR;r^ZjB)qiVbxF|ANYBQYV}!7S`mW3)j$J(fPY{Z2nMfJ2@DJeULQue zU;^U>2bH)!Kw*qG$AA|ZE&~CC(Fe&^Fo*;~z!w=F27ybmhsbsy@q}yw;}L+!W*UI` z1H^7HYQS7U;sF~#e81rF!(erRae%-vQ4NTEy+HB2U@F0J2aXZ}VydVIst*_k0PsNZ zq(C$ps8j$DK=H4J2(Ct9{)faKRsi_Nuo3uxe4xSfoL9cEIP}6mA12U;&V96I0|$?S0TQeMhJ65_C&nR!3=9In;187I{2w?*5(45cgiJm^&;0;CSWF}W@c@W^ z1Lgkz%){kk#y~K_LH;ks4qY4gd|*a_fIwhSPxE|n!twuy#~B~EKrb*MSii>q_y>)K zEAWBQFdxVy0{$Nx@I05|TN(xf%#jdy)+hf00YyRUfS-rPe{e7k{61712lyT#p|9p- zAI^RM>IfPH1OE@;YxP>HjHWTi-+_lz4JrmYCUU%fg3b0>gwY4f01qf9^08Hs;Aj-PD13q902~~DQL2c* zWHSILht2`PPZd-iAQ7|&%l;1&0Khexs0;%Y5ZH&y)Gr_a)vBQJ!ayulRRHxt0stNc ztUgqT27^@!fNHQH^1Kbi9wu?HRez!J2cGzDAn}L?$_yVK2qb(9@#>YvKp!Y91FOM< zz(37_pWpz(A82F)@qg-r2KfMw2hOWOXO07ZKAe0w9DNCtVAu^+4mcYh1P+Y|z{+SB zK=_(R2ObBF0yrfY46XsN4~!F3%oKS@r``wz$~jOEj0>v+pM%E$BPaxFMjt2+st0Tb zmjVU^64-~z1J!|Y0p&4*cpx}j2H#bNz-P#_wh1V*4h^Q%=r4;6re#y}sidI#q!KOp_)f#@Ib|JA;~|NVSF zaiA#b1NRjIjbK0F{}0FF1|O98#2^spFn(9#Aiu!jf%=7TI}jK^e18!7$JVb^0Ss0d z5cl9e`uNpSE2x!gH9#SaK_nN81P}2Q{zvN*TBTG3F<2)8VbFkJBXCHDp=2NejXI17Q$+fWtn3P!r=2!UhHbV7^4d<2b(u&Jl!wgU5l6hzG~{|DXrU350-N0pkNN zj0^q$nTN{7jDTUFJO?1wAm!1&hsFgFtUw?zDFgxqsK*P({vRAVa1LJ-NlKe|!K)`vDBM5<3C;tKgMM3QZ4~+icU>*2;s5lSsJWYdN z%*a2S`~TENGzbU&9%3C{s-r24argS50E5T-0Kh;h^;u0?5rV(fKm&hco&Y{Dkifuo z;q;6*$AA|YC_Jsf@>Pr?0TA#7#!G;}VKhPV9f&+(7XY}(@H7ftls-W56O0>h7Z{8N zLon0_(ZE%}xP!z3Hh}qm!Q*&5czt6;s6@>TtVZ6fLN-k0qTMV0l+*E z7--To62B0rGm~YybuYLa-bg=7gh&92aW(nPzcnFK2RN04%iPa1Pllz zu@967s{-T$%3}oZKybJXzN-y@^+B=?5`@Ac7$x}DD!5yR*NqVslrCWq;X^0`@jDHw z4I)wu0u?5RSZqV`qQWk)N+Q6a(jNrD&>``YK_^g3MED**LxBE2|NH$`ON5@mG8_n=;>2_ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L1_Painting_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..99ed507179a3dc7a64a99f871d18c55796a97cb1 GIT binary patch literal 777 zcmV+k1NQs@00jepP#_wh1V*4h^Q%=r4;6re#y}sidI#q!KOp_)f#@Ib|JA;~|NVSF zaiA#b1NRjIjbK0F{}0djKPmBu1I7ne55oLp7ysl0KTxg)0_;C8#6Ge0tJOe56^2A7 z@;C?jH&lx1C0fl;2xCx51p-X~fkpq3`oz|$RRIiE2rnAoJY$eZhM{C20*ye4BWHj> zZUFJ@9!LN&P$bQ$M&E2Yw$Y3=|%4 ziq2+1{O8~PqA`F$0pkY(4!)x)jB)q+pa6n~0WlJc3acrrLNHhQr~rTA!G}OF7#&@`ss42EH- z53BqiZEy(eDD+a z33bwjuI>)nnlDkWeER*d`kRx77g0 zRTmbF4nZJ-SYVLI1!Aj(xOHM{frdmRAB+SJ5kMb}8WHMI|3CNotd|LO2b2N}C@_p71Q!ta(5F)Xc|fHc0C>Pq H!XF(FZihX= literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Painting_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Painting_128x64/meta.txt new file mode 100644 index 000000000..e5f5fc0a6 --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Painting_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 9 +Active frames: 13 +Frames order: 0 1 2 3 4 5 2 3 4 10 6 7 8 7 8 7 8 7 8 9 10 11 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 57 +Y: 24 +Text: No mistakes, +AlignH: Left +AlignV: Center +StartFrame: 11 +EndFrame: 14 + +Slot: 0 +X: 57 +Y: 21 +Text: only happy\n accidents +AlignH: Left +AlignV: Center +StartFrame: 15 +EndFrame: 18 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..1169e42d690a46a34ea8a8e1910843a4d46556f7 GIT binary patch literal 653 zcmV;80&@KU0Eq&sfICzG;QxpGKjHrm_%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRau0{9hgxfsM+m>fXw~f#LNB$6cx5CFg?0rHaBWj;#3R%jnca6D@B-!7-gtkq8g=fEHq zx5|D+_=m=;Kj0WfvJYVSz<+`P)d%Yb{}+u*N)JgmeE-+*c^7!R>aI*NP#nfa zF(wC$mqm)zTV-@8L^=f!%SJo^@q+8H!=d$4Cm0AF!a)K5K>PvoMU6v|e}P~mei{5T n@fo3FwjuGSOfUt3o`2wf3;BI$91Hjmd=v5T$N$Im3ZMYM>|;S8 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..80e2f39bb69255c5c17ab52708c536680e2ad7dd GIT binary patch literal 653 zcmV;80&@KU0Eq&sfICzG;QxpGKjHrm_%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRau0{9hgxfsM+m>fXw~f#LNB$6cx5CFg?0rHaBWj;#3R%jnca6D@B-!7-gtkq8g=fEHq zx5|D+_=m=;Kj0WfvJYVSz<+`P)d%Yb{}+u*N)JgmeE-+*c^7!R>aI*NP#nfa zF(wC$mqm)zTV-@8L^=f!%SJo^@q+8H!=d$4Cm0AF!a)K5K>PvoMU6v|e}P~mei{5T n@fo3FwjuGSOfUt3o`2wf3;BI$91Hjmd=v5T$N$Im3ZMYMr(i() literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..959b02556d64ec11a58378b58d291bb1843394bc GIT binary patch literal 650 zcmV;50(JcX0EPmpfICzG;QxpGKjHrm_%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRau0{9I8tTOt4|-EOM`51*@hD*gwD)E^yosFHfQ?UsAw z4vf@3HD0M)>au+-zsMgMczi$u0GJ2LOJ$V#D*aiYeIdZ{tIvG8pC+?aJP)4$fLh-v z`4{3J8m#|-VH(IigXaPM2nSRjtRMVdH7zJTB;oV_U%}&~-m{WSA1mxP{|A6sG@$hl zmm3cQk3cyM<&%fUs~@v?Bk&4D9cpq9z zTd5g>ScBRwA1rvhLGeEilzS)mg@eSLU;*HN|70=9Mk3&WjMK2%nMbO*FvUP~85qQv z9x`1PD^+ck(4i3M6hkc-@B_vRuEP$8)l8gVAa@A_2mJ%^2hA2W4n_V2fRXrT@Xy3% kg^JjR#+@+076y6$f&4G!^`LMs;6dfevkzfcae_rL=k*0*)>*ndAk^n*Y(dar-io8a%~B(-0te4sE2rB+|<=li$$$v(C; z8XZ&u0jSkWzPz7T!#O0X!)n3t2aP~JnPB-swVJ6=Jahr`@MHt$c&g1o<3Os*zr2w7 zNeAPE)y9G2zz>g1u%NAwcpEpQt{2SOsDm0KNy*9$Ma116V&C z5`ahV{eV@YqVa$S%pQ8(Fla;L|A6ZM|KIok>b2YrR6aNO3XE8S06k{QgR1R7FQNIb z*k8ggDz2&WEs_G3%T#|NAiasQKmo1R>abJzm&et;m45@n>JN^)RRRy3_RBr;2S#ci z5FnOLt0&US{DJY8hr|FTbJfXgvY#bit27UnRsk>vjb3}@)cG}p3LB^1iZ04*;@hLFykaHXa8a zfN~qlCl8c<&ESu~DG+rj$Ugz{@x~*`0mw-N2QP%x1LFjKjldo(&ipZfTGpwzy^3J*XBuiQR1t92tW1Dpfe zE*~DQI9?^O2ekbDQT(6bUNi!6fCqv9{gB5Y7>9xeGfu;5Wge>J!xaI{WMdOxc*%5F ztyQ*HLWD!0Q4F+Wzz-NMy9_!XRWfmaf!rhzAM_8vA2e9hIT!dA0!QJW!#@$47As;O g8g#<|SQ+R32k^g_)`7skfd|1q9}Iu|e^9Cb3>pbCT>t<8 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..389d2a8ef52e63d603a3d5c6357d14886acd4518 GIT binary patch literal 650 zcmV;50(JcX0EPmpfICzG;QxpGKjHrm_fevkzfcae_rL=k*0*)>*ndAk^n*Y(dar-io8a%~B(-0te4sE2rB+|<=li$$$v(C; z8XZ&u0jSkWzPz7T!#O0X!)n3t2aP~JnPB-swVJ6=Jahr`@MHt$c&g1o<3Os*zr2w7 zNeAPE)y9G2zz>g1u%NAwcpEpQt{2SOsDm0KNy*9$Ma116V&C z5`ahV{eV@Yun7DFK4A0K>4QQa8Tw_B>gPvZcp`nR&L;COvO@z-jgL~_;7Y_s1W zbY`LP0tsa5vVAPS$R8Pad_V$cJzSQ{De_hNvq1TEU=sj%)#tulPm@`yo(Iw#4;^om z{EP7qmjHlOkb4Ktf53sjH9`3=kMKY>Ehs%C;q$?N#p9&jvyx07E9)d+@CzoC9-;E% zVc>D-2O+$&aQR2<-U$2xkq1(ogYX|O9AZ3>9E6ZSa`;V9J}^)G2H+1FJCr~JDEx=U zRS1$yJ_3=Fhtje?8Lgs8a6k-ze!GDAVJRPv6b?XMPyKv8P-WpHj6=Z#8K+^jGLKbqVTyp}GBJs; zJY>2oR;t@8p+X_hD27@w;0KHsU4|VGs+l;zK<*L<5Bdk-51K4$9Ep%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRau0{9hgxfsM+m>fXw~f#LNB$6cx5CFg?0rHaBWj;#3R%jnca6D@B-!7-gtkq8g=fEHq zx5|D+_=m>7Kj0WfvJYVSXkb6V0P2JB)$m~d;_<0zLFp$CmV^I)2ac0^&PgzQr;zXb z9sy+1gVa7;d@K$<0OU88PG2bfyTKoTQXuP7kbVQ@;*3X>1CWvk4qpkXH;exPxC6#d z1rL;?@*gNPl41N5jFdi=k@;Czb>0qge< zm8y}LC5Szu;qu0d#2*vz`9`vTh*&&H#sD4%|Mo*1gkmlT7|lBksg!!FlMGY`A(4zp zf#W67VzpM;T?!EnfkZOVj{rPiy6iCMeN@TD0taxAK!4Cb0DSdQs)r)~0>DW8Gx%rX mGeX5|L*q`EU<(60|G@qi^7_y?7w{nXC*$Fd|BvbwKmmYdgFQk3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L1_Read_books_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..451c80a26af36c0bfe1cdbfa307f6e6cbb98b292 GIT binary patch literal 646 zcmV;10(t!b0D=OlfICzG;QxpGKjHrm_%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRau0{9hgxfsM+m>fXw~f#LNB$6cx5CFg?0rHaBWj;#3R%jnca6D@B-!7-gtkq8g=fEHq zx5|D+_=m=;Kj0WfvJYVSz<+`P)d%Yat{4SNN)JgmeE-lec?1niA#9RT5*kRE6sgsNZ4&fkx|Db*V`Rb)r4n_V2fRXrT@Xy3%g^JjR g#+@+076y6$f&4G!^`LMs;6d%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRaqeZ4{R+MdKdPyqS^%UjA#h*vf#{r`Xtt6jj=d$0~X2CD#S2mtk)E(`czAMpIw>?$FE ze~06$e2Zj20tFqGsto|X5e4iuR>*(~w_B>f%jfFe%D;i(^#{jYswAGSdu5*a1EVz$ zjaRByI;@{dFY*V*ULOzuz$O9mlG$ZGO21ZUA4qUKYV+SNr^&3j(cAjY~=oNjQA}*YJ4hH>~872g>^m|H0rEO(;D><;KIn zc{Nf2>b$(2U?ti@E;pjk})1o4njyEIeaFmTbjZ@@Ed?UWbjb=N5PVO=IkGrcvsyOfgU##zrwF2aK0R ziq%_XbSOkR1rW#)P2^;0Jp2pz&f0slb!0rN$TLy>=hU?hGS{4?%c+< zAOOz11N86I1Z!1;zySlg*6zML59jDUkQfHDRqy)qd>#DcmaFw26aoQQs>}Vn|91a5 zC)UQbdaF=8b{eU7*OTh_XC#$aZCa}}2aSL}nPB-sheIj{j{rV?41j#^6Xgq`B4-ooVpgRaqeZ4{R+MdKdPyqS^%UjA#h*vf#{r`Xtt6ji|i;n@Sz#4)8J!Z>;s*k`w;rXxFTgCn# zj;Zo3kpKu3c1_~G5e4iuR>*(~w_6AKa@I`*nv(c0QLKy%H2rJ62u|N9}1LNONv3}&5%)XF_o$%ZNen8?N?!10pkv0AHa zu7wDPK%yCF$ABI%U3M6BKB{En0Ry;5AV26IfIeuksB$mxECi3kKZbrIG%QxcJ~Ziu d0I)O9{14%OFRcTCe*zDJem)rg`2L|(02rJOIJW=* literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Read_books_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Read_books_128x64/meta.txt new file mode 100644 index 000000000..7432507ce --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Read_books_128x64/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 13 +Active frames: 2 +Frames order: 0 1 0 2 3 3 4 0 1 5 6 1 1 7 8 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 1 + +Slot: 0 +X: 5 +Y: 28 +Text: Predictable twist +AlignH: Right +AlignV: Bottom +StartFrame: 14 +EndFrame: 16 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_0.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..a278e3a9d693124ef13784e913883e49b5c1e994 GIT binary patch literal 663 zcmV;I0%-jK0FwfMU_apf@PFW7LAU`#0MHM{0uB!zWPn=m3FHDD0I*P`Fc0vUzYy?v z!@tn@2Lgj3z(8Su@q!62UqK0wYO^1xgqQlG|x3FPo#@?i5q4L?O>f=ppCD2)?I zb_bj?!J_&=uR!sIN;H{fDcfQ?PoxI;4;Veb9^d`{(&7&;J;WYggowR_9yJhoQNiP$ zfO#L|{twQ60rGc@3IIQh{2!zbGWfvn!10GpG?9q-e7;Z}2-Iib@sCdd<30zJI|U&0 zkcJ5){zvjr%fLKbV?>a0ary9g&LP0@xOk!Shy@}+lE>5FKv98WVcrkWykHoK1dAUh z2c#Rp1cNXJA19(?A}}0;hlPaWcpy+n1;Pl!~zK*X^uP|KZtldZUK>S3@C`x)A3%I)5G({}5=Ei{mcTwbXka~Ifb;MZ z#xoJXMnUFK5GnuT@R*hY5(zE8k$iMl zV0ptV8ZV>|{0|s(<3*NYowg&S`ao}h@q_#{AoU&((&GdNj~*kS2an+*FJT9bL>^Rd zc;}!5k#&fEbMOz7ykJlP{Ab|(AbFR@1Yamod}9&t`Fx-{8zd0^Q4{#aC&2QDV5AeD z!hC$51o+1<0P%5+5OfU!WpgkJ2< zfSxg!jsh|dGJt_k{~v_Jun>?*Z~^K77%;q1A_gD8JW`|pKzZOl;PHchzzmrr0KrmY z0uQh}?+``^!{iX7b rwNoj#XR&PAKo{o(Rt~#VA7FaQ2ksAPBsjjn_K_#v0SE`41HzwhY5ozm literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_10.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..7684384fdfb09f1dc5e2dde7b898fa11630b8d79 GIT binary patch literal 629 zcmV-*0*d_s0C56nmLGlK12bKciBJ}_K0P+4{@?i5q4L?QbgUn$vDD@Lb zb_bj?!J_;???CZ~N;H{h2f!dU*p8Fo0lq?bPDR|M&0-*KRNgZ&|WYo0RA)Zev}*@Mfi+I{!sV_$^)T4ykdR&2aG!fAWyt< z@dk!C#>pUGymH}ifKDJ3i35G%-UwpEu@VRS!Mp{*U<^J_ME*fwF#rhRINkv9d?6Ez zL+&#AMkjO1OU)L$$zM!`3Ifihz}TagTdp+1$^CSV+fPOF#cm;xmA%K5^#rTJV#(4mS zKsXc`4gvxO7z7$%4;Xj)J|!9)hQR=s0fqy>2ag^Da0CpxLlFN^;1mIP;BXT#v0x{X z7(@pN0FXf<7%T)dY*YxuhY9?Iz+wRL!f+r!@q|z!5*Qc$4+4Y(#}UAQgT^61hDhK> z@duBh7l`m73PC`@$f7^W3=#?OgX9e202&4Y;Ubj&G!RcGg9nobqynF!vOy*=n3P6| zq_Zs!8DP0>@-h%iQ7?0o{KFBCMi{k^o1I8UV(q_Wk})3# zm&*en^pJ)LB>qS8QHl5Z7l4P*q#T@nd>%81c1k&TgF`M53M7LikEg(?5(pM1IdF3c zz;O}@7Cuf7NOyuTfG9+siHwNAauOaE6OG`4FbW?y#6j`!2?2a?Qg0csSVIVqL>{C8 z7zPF{4+8-f^l%}*2sk`JV~qdL;L{8Qd-1^dXW%f&1Oxq#2an<( zfH#i<04o@fJYX2F{r&*~2c&WVAqSQbVmttO42A+w5PA9o<3ND}#Bxv$1q2>j0Ql*l zm+lNhU-HKY)0T1OU)L zc;G+uaQuVF;51Np!=xS$9zP$)&%lA@c#;FgBmemQ`~ClZ{sJjDrUOB)kX)|)zQwzD t06(PzL8{eErrn;!vtw9d@Wb!1W)%J!A#=2f6*=5P*5a6Y#Yx0w4eY literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_2.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..f5dbbc71c2ddd18c7644ca48385fa4066c1f6daa GIT binary patch literal 628 zcmV-)0*n0t0B{0;U_apf@PFW7LAU`#0MHM{0uB!zWPn=m3FHDD0I*P`Fc0upzYy?v z!@tn@2Lgj3z(8Su@qnmLGlK12bKciBJ}_K0P+4{@?i5q4L?QbgUn$vDD@Lb zb_bj?!J_;???CZ~N;H{fDcfQ?PlN{f3E@HR0QUdy;1>{hz_^zXc?w1V_7Hf~LFGgT zj(P#)bPxDHIrs<3-Y_Tt{xk4?kUY!r7>|d`oO7;G?R0K??;PvjN@5CD!7jo^VnAQuQk;}HSEKqL@o zh6+vNUz9o#Ac%jca0& z5C|lJra16;i^Lu`0LZuo1P>SnEB}9hKtbX*AMh+-Ao9XJ1yCUIh!@L%Y7ij$1LHt} zU?V`1Ef5s80rAsA0qYD0pMah*n2rK64>Ev(PyZi;#IO*MNpJz;g&+Yzh2n`2FujBl zFff8BgdSK2P@u>8{{SjvkOKu+i;zR=4?DyWVlenegU64@@$>4F4h$Os5&!&t{r>;I zeyKPHG0-~bMau8n>|3{Il)6AP8m&~yZQ1NwHc$omlLuk0)d$!fvVr@9+DQ&Cusx(_ O!62UqK0wYO^1xgqQlG|x3FPo#@?i5q4L?O>f=ppCD2)?I zb_bj?!J_&=uR!sIN;H{h2f)HM*p8Fw0lovq4{!&RG7JwN{{QK52bUh=41ZZ#DDn*fPA1jA0!@r4;b|D9y9Os zJ^>EFNIfJWf=NG-{FHL>28KAsi6G?T^WgEELxJOPYYgH6NRVW)^!N}IU|5)QfZ!O3 z1dAUh2c#GtcnEx+iHwNAauOaE6OG_*i~`^?97G=<0FW2Q1t#%>${h%hL?9FZ2|zG0 zZzKW&Ul4fMAQJ(wf=2-!{6HYn$N)S+V~qdL;L{8N{9p?Lf=C);j|Y$99uFIXK>_0c z#eeVPp$CZAKm`E@mJwnkfd`3TKm))v2oQY%@t{Dk5uiyHhzeT(`01g5^@an_z)u*= zM*$fJoE#o-5Bz=;62L-1CBO%$0AE9ZM2HxF0P#wQ0YT@0|AWR2{{S*%lS2hoj0ir! z^SnVBqYsdHJb3(nA3muy@WwC^AOFYi-|zeP>XSc=AAzorT(14T#k+QCPox7us?|)U o-JZp>WdL8C5m-9yP$qK1KLENcmyCGcn=DFz&rO3ng9R* literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_4.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..e0db66ffe303381a4cee87351807509ea9dfe0b2 GIT binary patch literal 662 zcmV;H0%`pL0FnZLU_apf@PFW7LAU`#0MHM{0uB!zWPn=m3FHDD0I*P`Fc0upzYy?v z!@tn@2Lgj3z(8Su@q8k$iMl zV0ptV8ZV>|{0|s(<3*N$d<-LPi0M9%8{j-({|yK{VUS>Wj|b^-f&<5o5zqs~08e2D zjYJ+)aCql|=l&1Qd>(Kp0RA)Zf5QYp;$IjMe4$10j7R^Fcn8V@p|U{_iwf&=_tj1%Dx2aUo72%JD0CH`-WBhdrI!<+{Ie2feJ z{}@CQ0f>VG&jAmU!9TGW3_=M&!g0I}(STeALkNK5AQA{9!v!YsgUTHUkVHS!I0Xao z55UE|kO&EULE~V6Oa{UU90Ysu0E15;0PzKmGygw>OfU!WfGi3LAZd;~9wPAvjlrOR z@ql8#_wmq!#B3k}fP>2j^b$aW#vl$Z0jNNO=nsto1%QnLNVGsw*ayc=3<>G{5-|XW!aN>4em{?&RG4sJ*a(mRnmLGlK12bKciBJ}_K0P+4{@?i5q4L?QbgUn$vDD@Lb zb_bj?!J_;???CZ~N;H{fDcfQ?PlN{f3E@HR0QUdy;1>{hz_^zXc?w1V_7Hf~LFGgT zj(P#)bPxDHIrs<3-Y_Tt{xk4?kUY!r7>|d`oO7;G?R0K??;PvjN@5CD!7jo^VnAQuQk;}HSEKqL@o zh6+vNUz9o#Ac%jca0& z5C|lJra16;i^Lu`0LZuo1P>SnEB}9hKtbX*AMh+-Ao9XJ1yCUIh!@L%Y7ij$1LHt} zU?V`1Ef5s80rAsA0qYD0pMah*n2rK64>Ev(PyZi;#IO*MNpJz`02na5Q6dHxuz-Xf zilPUW0n{Op|9}}XNCASR#snW=dEOw55r@b;9z1?OkDpYU_+uCdkN@NM@Av)t^+}(` z55U(*E?0ivV%@tmr_uqS)oP|wZqH)bvVbqn2&^4;s6N2;ln>k<(nxWAf$btsyaEsp IJO_n7;4e4@;Q#;t literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_6.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..b2676b7ce2fc232e1fcfb5069feb32a5271de2bd GIT binary patch literal 664 zcmV;J0%!dJ0F(lNU_apf@PFW7LAU`#0MHM{0uB!zWPn=m3FHDD0I*P`Fc0upzYy?v z!@tn@2Lgj3z(8Su@q8k$iMl zV0ptV8ZV>|{0|s(<3*N$d;$Y)i0M9%8{j-({|yK{U^Qt zJZd2Fql3phHb^1-q9^f; zPruN(1Um&FocQ4dLVe1cY+wP zC&<9R@9~5|Fc^q8fVeCHhsofd*o+1t1fXF!-T?7@Arpv12N?j6K_(a}H;f)r_(Xys z{-MAqABcViE#%-p2tp4V1Oi|-7!Lyh9{g}1amW}vL1T>n&*0Mx0sMF$&Kv?6AZd;~ z9wPAvjlmisk%1$^CSV+fPOF#cm;xmA%K5?!V4I9JZF#y zWCMXgkl-L7VSquV0P%-^qvBDa$ZQY^fEZvr0C@4>HvmA(q%jZm4go+Hjt2oV3l;)- zA;ds%kO>4DA%eg|M#VskNNAtPECwI}947(<4;V!PAt8}};P5O&0wIXtKtbaWphF~i zBrw3K9td6|z=SCU0|z4H|KKo5C*lu~Gl&3a7z>1p)Bo@T$N7WFgVF&{(Rv{B7)**i zMABK7hYYZ2zYsgnJYmv}CD^Q?d4LEWVfN3x1_uC9i2ecN?1F>HzZr->`VtQ<3H{>{@OgZ&G6eg^C*SB^ z0v|$2HjY!(p0BoPnw4emdPeg-Y%z$eCh4;usmU?vz30|6HFa3Q`3I6OgPjQ`Kz z(+mWA@xb_J;4sMq1O1N&h`ewH@!&uOV-g390~PjzAq@Vps@BB;erm01K!= z>A=I_0qV&l$bkp&4-w#i8VC;@2mX#9ka-*iiVqlcgTdp+_2g)d$!fqxc7`fWH9u MKfD4E4>*E;0O;od%>V!Z literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_8.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_8.bm new file mode 100644 index 0000000000000000000000000000000000000000..05f98d639bbddc8653ccabef2808aeb876a4b0c3 GIT binary patch literal 663 zcmV;I0%-jK0FwfMU_apf@PFW7LAU`#0MHM{0uB!zWPn=m3FHDD0I*P`Fc0vUzYy?v z!@tn@2Lgj3z(8Su@q!62UqK0wYO^1xgqQlG|x3FPo#@?i5q4L?O>f=ppCD2)?I zb_bj?!J_&=uR!sIN;H{h2f!dU*p8Fw0lovq4{!&R0RlGP{{QK52bUh=4>%+N>>%-| zgUXH%9P^N2F0l{JegW(kj0ylhjQk({1qYFQV0Ykn!>1ZZ#DDxRACw0}%81a6E1o2n6B*NRVW)^!N}IU|5)U zf*7$ZM1n<+lY`O?;4TXQVe)z=G9v-VNO)LIH-J1}2t?x%2gkr91@Xa2ykPR5!Xyz0 z1poq23=CVzz<>~h9ySOBz-%xc1_C|!;6US$FnEH;8ULTbrWgbG@IRb51TsL=9C$o` z5b${15uzy=kUU@*ul@c30SAbPU}zDLgUbl95YU6fus`S@03LpT_|PC&2+$;pLqP(T zz&<)?U_D`g^Y9bKGZDZ>LFWg+flvP*gv78AkV$X>>Hrte;1MDQAI2X54_3(o%K`rf zi10uS1Pqt@iXV`9-Y9_ahe$jgJbpiqpMeHWNDml~|Ks=X_x=0$2t4AL4Ft9+V9Rt5q_ac6%1hlmUJq0fGa^U8)bTJxA~lSpj|l?tgd$ARci9`~W@N5<~z1 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_9.bm b/assets/resources/dolphin/sfw/L1_Recording_128x51/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..65b723203c3cba419975bb816eceab751c8021f4 GIT binary patch literal 661 zcmV;G0&4vM0FeR!d;1$^CSV+fPOF#cm;xmA%K5?!V4I9JZF#y zWCMXgkl-L7VSquV0P%-^qvBDa$ZQY^fEZvr0C@4>HvmA(q%jBu00K}94gzKtECljH zh=b$c5(xD31%QT)ih&rA(J_%23_?Rf!f+r!@q|zTBO=Gi;8=+U3lYG8gT^61hDh>Q z`g{tJAc10h2ttrhFmf(VKR*PLP9fPNIDiI$fVfD#KmGVTf06Kdz$yAKBp-hWi5JI3 zW?CFF!J_&=|G@EwPBd3wdD|j7PoxI;4;VkgLzaMi3?pqG57OfV2ag^jpa+aH4FG!x zJZd2Fql3%d7R?fd}vp5#WFt z2oD?w{*E7zc^n3c4;XZV!Q;o{`1$w{Jg*W!c*KAIAHRRU@87^hCltVFHPQ=}-?!Me vZr}&>plCH(sg&EZ*tTq-5de8X0pqUK2iP8?_y??jzX10?yaEspID&ovpRo_7 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Recording_128x51/meta.txt b/assets/resources/dolphin/sfw/L1_Recording_128x51/meta.txt new file mode 100644 index 000000000..de37d5b2e --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Recording_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 6 +Active frames: 6 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..9560e1f41551cbb914ece9b331178782165c8e38 GIT binary patch literal 580 zcmV-K0=xYI06+r&fII=<4*+-rz#ahb2Y@^Q;12+J1Hcat2lW5^46XPGZ~wslgXVt# z6&OALfBrxJ@(+LLMDH*UIX%JY4uEG3?SJ?I4hI0Z5}ZDJ_zVMpTX1>z;1CP}P(TxJ z2aE&k52?63xq$kMgUWEUU;)O#<=~D$3PT?UtTY~24p^N(^}X!1MtZ;9#?Gc=!Q>KmiVO=5A1U+yR3i0S%9w4@g)%OM?KI z9ESlpKPWt7!10I-OUyt>Fg!p77#NmdfRG@1LIflJ|MSzw0|f{Gp^y%Q2Z20K90VSM zL7Wsv!ayzfsDK2-5(vOB-?ecTh_+BD1@MSoV0hQhq971>z~C4_5X?J^;($nClnVp_ zoG?O=&?W%!m*6N6Dg=W74;T`NyeBaSjsgZ3902fOTnq>Q2mNmdC}1)Oz&!95@|c(g zE)EzBVmSUJaGb|6_Xm~)_%P@3KuqNz_dkXKf+h?cz%UOC1fVny!}wqnD*;4XgMf}9 zO98Nd3<8N5@DxN8DB(I4hyMi!j1u6P5Miwgh5nAfF%U`f45$UsdKMG=H-Ka?aQ5L) z8{`!m$L)SH5Af($WMU<-<^JyRpm+fz4g!e)s2Ax6+kXMTOhMu?69|w8;Q^p~FYs_- zZ~%f25&*-)VvrF~!h-@2I|t#WT@U>30X=|!!Qz1tAweJ;AOF4q>i?KX)-&P&v_{4M S-@)pYUZ^~NANU9~LW4vded_Z7 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..238b50a2e7b89ec4d08249e43b1fc9ed16fff178 GIT binary patch literal 589 zcmV-T0fII=<4*+-rz#ahb2Y@^Q;12+J1Hcat244IGGym{Dqu?RG{{#9D zf7qm80;31N$N$Iw{z3E~8_WaF2O@fZLMIM@XAST86dVo#a4Wcc_wX180M~u^1Oos> z5Cq%7;{f{u>TVA%U_PSY@|*+eHV-cZasW~lp#TmV4=e|d|HB5a-v0&%lmdJK6Ps_~ z;PZ|^`~o3AED;dI3AF& zc$WqNFgXqaa(+;F$ARMz7?+rUkYIR#3NSG&!2uvZ^n?gR)I9KUU*KS&02DF-(17qK ziQ|BS&`2|ai1IQh5E5L4gOIfNm`@=zr&M3G4&@4-^QA3JCz%|NZa}SO5HB b6IjoP0?`{6|9=OnReGTD_TVA% zU_PSY@|-Og0CBhk`T^jMKng=22A|*m4S-Ne1LObj!|UU}!LS$sfQW{Cb6>vx4?ut* zMmYoU2!sGjLGQsR5x{u-07D*XExaC_0g(O%1|J!?JqBXbADOv9;y)<>JZya6dP3lZ z^Ozim0XYYxHVA(x1VCb5V~Rn6;(QncU}9N<0ziS{04P9&OGD2%oD38o0){|35FP~a zsBjQ^2?lUc9|-`r;-UZ)7=lm?H|!og^3fK`1pvMg3(OB1`E*1A4;UN+2m%?0a2_`J z1cY`r1qne4LqM1V#$SM-3dTWz2aE|sUK5yu#{mP7Oco^q;9x)aKkIlwLjjCN0q20f zl*GU>aB#q2k;m~PgyuPqxIC~W!G}MJ0%s`)x%@B;5U^n80f2a5B>|vzAHx8lSPCRt z7~&ML8wc>fD3K2Y1RhA?Iu(ci1qX~G;F%C%tqX={O$ogfPcZ_fe|4=AR8b5z5(k0m`K($;sCTp U#sA;I>XlxoJboYe2sA>2M3T4c#sB~S literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Sleep_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..72fedc5e13cf89e0b10e68e27ddbb31f86f17de5 GIT binary patch literal 597 zcmV-b0;>H108s+}fII=<4*+-rz#ahb2Y@^Q;12+J1Hcat244IGGym{Dqu?RG{{#9D zf7qm80;31N$N$Iw{z32k51r-#=LHcx0ptJ}bOShVYyZFqa5x3PuHp0Fz+fB$TZ7NP z0Dxc!f&iO%JYXMSeNDmT%m>t59#e%Q01h_*pFlhj$N@-Lga9~f0)kKA)Ee;9#?GdJM&=KQnTJ z#C}o$c-Z;C^o79-=P)@A0&;#>A^e~b0f~8t2?hs=@L&;viDn210tbiyp#l*#4?G-K z_!uZa1q^_6AUp};c;F!P5)9y?J`w?M#Y6xoF$AC(Z`!zvL|Z5n0{BEPFg$DJ(GUnc zU~mi|2xc9?c-!C-5!l!iB?KuA0$>jregc3i83q6zFeMRqPGS!n1P(zkSdFa>1~C{1o&x?;69C1*!vTgzAHtXS|eir@8I=HuT&mC5BvlgAwi-5Z;a;$ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleep_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Sleep_128x64/meta.txt new file mode 100644 index 000000000..ffd845e8c --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Sleep_128x64/meta.txt @@ -0,0 +1,41 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 2 +Active frames: 4 +Frames order: 0 1 2 3 2 3 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 2 + +Slot: 0 +X: 53 +Y: 20 +Text: In a lucid dream,\nI could walk... +AlignH: Left +AlignV: Bottom +StartFrame: 3 +EndFrame: 9 + +Slot: 1 +X: 53 +Y: 20 +Text: OH MY GOD! +AlignH: Left +AlignV: Bottom +StartFrame: 3 +EndFrame: 5 + +Slot: 1 +X: 53 +Y: 31 +Text: Just a dream... +AlignH: Left +AlignV: Bottom +StartFrame: 6 +EndFrame: 9 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..3b57cf9ef6486b76a2550dce25e33cb5a2b2126a GIT binary patch literal 727 zcmV;|0x10f0Mi2a|G*o-0;c>Q98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5hadjJ2(Api;Z|H!bH@eKurD_Fnr1~(Y|N7PDxcqGH354fBQfrCd^{%rx6a~F^R zF2n{IkQY~e!2y9^=iv&#KzuX^claML3=Bj4MQM#3B=8CsBR>IC3=9N5@|pw3$b%oR z{v+`*v;s-;zrcI|VPY^KWgo14UyEO&F&cgkAKi`-fXBcv0QcB@qcsSvRx1$)tlj~j z@}fee9F>a|KOQ~FLwuLA+{;Orm)@<0dxwehG14Zt;ur~qmxF#r`- z8w378VfyV9ssuL>ac}idsAv8IfUk$h03qWKjKli_@ND&1s8RrZ0pis`pdTh^@WbiV z|Cz?C1%Po2Lj={0#z7#Ff5XG7BaRRrJc0s%4g&z91IA(C43+~?xB`?$91kXVhSKUo zC`3ky5P%g2T`HAoHC&=F+Nl8Xj6ep1To5Prt2NU|q?3#W0)OZnh{foQM_brbP1keG+e!V~FgrBDox z6AurN!XOxh*#HVE4-iZ1HiZk(+>c#1IzOONsk0RlsJS! zBo7)40?hz{5Dw~D8wJ1~G9Cs8{{bK#`Y|ZLc}Ii6pMb^yKrXEhEhvC#pzQI$1B9X> z;?-j0kP5_L8X)t4RsOIz1wM%Yuvh`3KnI`mejyq?2sStx90GU`GQo5(cn~1Lr~e6@ z5FS_!UaNHifDFbl-RJNMVgMzm*9_wvm{=@O3>ZB(8m(9mY#agr$bEuQ01{|wqjA7M zU~p;o!5%~c-O8jxQietg$N(y|Rw5u6#lpcK4xo&89H@ZcQNw|UhfusW3GN{tAcFuT JU_>x_MF>PQC-MLQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..f199ae6b5442066adb85716a33f3aaf724029beb GIT binary patch literal 835 zcmV-J1HAkJ06zox|G*1>{{h#41x@%qIHCN%|KI>p_khZO{0pp9KGXi-9bf@=4~Yyw z2i5=oK*IjKG5~YTMuF>AfWVgtl#wq8E^r?RD|P zPpkzGk)MaU$^(FBwFzJ}R+#bN0QZu7ukaNx(BKdcc<@2zDE(vN|6lyX9wfpClm=1z zvBEqT_<%e}f)6-0!{r&Macl6(3=keT^SMSe9!Ml(0gu8^AO%4Omi__2hCr(ETCI;k z1P7&D&Oa^>;vcH7=%9u{gM-Ib4;KK!E*D9LO9}7?mHw*$_&{Ot>;yVd5yt#~@IUsy zRCX0e&EOC?q$exl2bEMlKiD6F)-)Jg8ztrpj`LI>ACk0t@Ee3S0iZvO0h< zP2>2O$Y2mjH6kGymB2V#tyBjIhlhj8F))x!Vxh63)nSlCc+WxOU=5GLH6g|i#wZUd zFZu_7fxxU7*n~?9Rg446^8uK^1mmFdL?jyhRss?a7z_i00GLH67uZ(=2UW0Lf#(5% z@F5IAf?z#*sDf}o=L~>A@e^1E0)QVM1Q;4P0dSB95gHVZtbRHe$TUDA(;0+98V?$h zjC9suXwU&7Ko|ua4kz(|Rx=bh1n?dt0+9*EsKYA+|KS4%h(w}Dq11=R0fFQH;qVB+ zJZ=l3t%t?|27=5c3-SyNCIt}J2gEcn-Uk8?fI*A{EdhvCgXLhcKrnD|D259G5Y`9C zfHEIpKu82L8jWB+L7|^~1)@MW4l7_EAkd$P7(s%9R72$qut(3vKsW}-K2r<<_&^FX N8sL1F0swKCkHoy}U#0*6 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..26e7927e1d94c7a7d3116bff27dc13b8b57889f0 GIT binary patch literal 684 zcmV;d0#p3~0H^}^|G*o-0;c>Q98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;p{|CT7bzA)qWpIc@a)1x8_{3^41)_iwMqvWda0pqaLa-j4$0sue-uhl>x za1H|icoqte)E;QDfx`p?>x0iD0Z}fVt5pn`1IPIXfLDVe9!jjjfDa#}KLHO@kDxqb z@cOP08nv9A`lYj;4nIkzK|$(LW1NN2BTHV)rZ#+5U{`?kP3iof1&k=WPC6P7yCdPA5nyXjUHKFQfygpBN8f16W{<06usK z4q^d>fNTHS{Z{$@uxtQ)fA>M?^szM%+!LGrKy S2mmwU83KepV1q&^h)d-2z#O#z literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..b695c4b6d0d116ec8f9c358efb44707b9ed67599 GIT binary patch literal 725 zcmV;`0xJCh0MP>Y|G*o-0;c>Q98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a z10R4!17lU{|L-9p5;x=j0>EGF0P+vbR{unZB@_UVh(vOM2tpVEgX0nC!8ipOk;tGJ z2t2@GDCYmwsFaY*|Ks*EinZhfP5PHqQ;{cK9IZ%Hb{NS;$c~=wzz>si1yb^K6LFKUY zLFbi-1n9zg_|QCqLkEC&pb*c1Je5KZCSC7f&(Fn1IGak zV+a7jBft%gQieqs9tTml50pf_SPG?@0UUq^#_9qdtRNm*4#$!K1N>|CT&-TJ)kp`G zLm}CK_#pLw=>KZ7T`)Lo5e)=d1s-CE@O@wS)|4JO2@Y}*1hR=lx>er%P#!S~6idU$ z!UxAhAT7~6tQbg)dVCKM`PFEo;>kQ+Vyb^2&ZI;q!{4jsg!aBp+BG zIBZ=(`{f#I9u0)Skb zr9;aD(=nQWgU5m%Emkf_4?6{h9Rc`2D*sp<0-r<&nE-#h2z&$izYvWcgn&pid;dRx zTma+H!QesZ7>aN>F$@N;Rk|Yx0W23t1P(qW7zJ@KAOyf-U@*w^197U=gOq?+ZGk{+ z7YeFaKnocBa28{L-O8ju_OKs>099zLL_ko&0pCIAxaC9=Ljafpj(jCa?jasr0;7pW H4@jW^NW3no literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_12.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_12.bm new file mode 100644 index 0000000000000000000000000000000000000000..345e700aaa99be2916a9f9feef881536de722cdf GIT binary patch literal 775 zcmV+i1Ni&_00RT~|G*FL0;d29oA7*bL-F?kmH+<$48T0V0~HTHd>*h5;6e6aRI2}f zp!WHUQW4+}xI91t8yc@y|M>(b|H1|@$NmL?zlc~KVe+cq_<;Ezlp;7J6-@`mBZUXt zjzs{0Ba;7s2c=r8MF*$;e*j(x0J9i~1_}ZG2cVfO1OcJI3MU_cg-`#0fyktg3@{*} z@RmwI2m?L928NIR zC$s>7P>;>diNuG%3Fa6Q0MaoZ&G?vL;PeCtqXPjgiQHxXctF2rz75+`pmpsRPafaH2psKB6#(%B8r3K$@dKp+GQITJ3y3SuG?Y z2OuJiiV=p@dbdIHk!2u|c!$CdQG`PWqeTyti;;wfAO=55ibW6WMBqUK!vKfVB$7&{ zR|+30CXNXpltAFu3Kb(+s@Dh05KkHWnh0VX7b3A$!H3HssQ7#&Fh~jraXOt>tUgi= zi-@@3F^gfU_gVmas2U)7NdRKi9bWjpcn&CxqwoZobzpS|`S6EhAcSxsi!l!q{P~FC zkU=LO3;Y5F0IP@3VLS(q;!gmEP!Hp)51#|*4;TbO0dSx}IuG*z3@!!@5D4HfI)?D- zpkVTbLjj`*0}L7wTn~(LUyW#b?T Fe1MDNKs5jW literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..40b52b3a5cc9af9cbef6be5c9009d1c2d1675a8f GIT binary patch literal 693 zcmV;m0!sY>0I>q{;$mJ8_yW5Wh?fWoJMesQXp>Gbc5nas1d^$W_lxRl7^G%_3Eu~- zf&qa20#t^vQxN<`Z}$O|ARa#f?EioCPT#D6Vu@HLI!Q+I0d>~SwFq{`w2pU8J8CR-NYM;^aRYBu$fI#4Z z@<0dxwfdky&@dbd{Z^|{L5Ki=;twhW<6$a+KsW`{)d$W&gc}F|gUBB&1ViQL#X^9? z=noitf#dlPr&RbM^nhZ2o&8iQK_HQT!^9sb1}pvJ510W#<;wp?0|kK8ZUgPCzCo&i zqq>LMQ8|F?rBba%tCgz{tiuPuu8!0CA6*6VVgA+ngN5oakUXpo0fAQ|q$94f1Rht; z1`Z3Lf#|eC0^JA8fq#H_Ash$+1t_ia|Gvf`5*$(V*XewKe~3d|52hBY4){Q3Au+(< zb>Y<4YN9a+6oeiyDiy#!m^!S6K?I0{#t9+d2h-Q8iBJLO$dEuEhjpM;VVDR+MhO6) z7zbD$E%AKeF&H-j0uK@abzpS^`9z^G>4pI&Bmxf*e1YQ~fM2ixajX4cWI}*JqmY>g zf&%~mkMn*V7a+hRBmtmQAi(mt2#28mBxuBM)W|?QumQnu2z+EvFAs)>4>8EG4gn;B zf`)+)fI-3IxE~OFV-T=;Vt?^~c-RQ98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;p@eK#ctAFAQZV?EMD3k!f@rd+6_al)&FbL}Z)vB~n`>zB5 zS&Tq^Rs+r536ECnQ&a0Kz~%5CHig1OQt2)B*=cfI}+gA*i6l099CQ4jFI>4w6*@fN%lD zztuvalL`g{fnRbJR6Jqv2M7RX8w^w_06u{6YM{h{phz&6@cH$BL>^eL_l!1|QW-)4<;wp?HPWe8qgBe) z>aA3a0K|2d$TI{$2mPwebkqWf$|o=%Fyuqys`Y>4T3iGY0WiVvFs0S5_u`AefM_q1 z2qwE#qR|KobWb}2fM8XD0?|Rm0KRZAa32P%6n!mJs2p4i`~$$G71;m^Di10L{sH&` zj<7s>sBmClI1A(h{0|#|eK6tCKa9j0DM8=|(uWW~l!P8XC_DgwcUcTT{!KE5MhFSM zj7kaw4=550NCnlQ<$>ieh`|bkKt1-W7bN&c`4Jd30HSq&sOV|*NQZ(E3x`NN5c4qq zH{uba(1!yvg-1{WKQj%$NIeW52LT772Z{q8Fb)G(s@(}j2N=XdC>01aFitQCGy=Fq z80CXu6u(m;1|ooNHCnUjZKxif4Gs_}5D3^1LPZ=01_KCU4m>(Az)Ls1osg_4ir!XFpGzR{(&exB82`| B9i{*P literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..2d75157c5aa73ed2dbd48356dd3409bb63a642b9 GIT binary patch literal 819 zcmV-31I+vZ051dh|G*1>{{h#41x@%qIHCN%|KI>p_khZO{0pp9KGXi-9bf@=4~Yyw z2UY(6Km!jsFaUGRMuF>As?kU1f67Rggcm$OeJ}Mf`uFSv0jkf*^?-rM zq!8y>KuD<1A^?y@raW@0gUT_8Ac~l1a0myycp&qzeQL2^ul`~W5@7?#ZZMe)1HpfY z1H_0R^MgPj#1Z1x;glF4JaOl8j6eYc1HfbOln4P(LFK;_j1mJ}iq&j-2p~Nw;PJvh zJ`gEYXGH`u3>+Rhuz1oS5X!w$Pm;oX0p)+HgT~K>BjO(Ti0Q5kS~} zA|>>IYcG&#r4AXvs9j(s^c)Q41MZMQusR-80KSk3h7W-qkYaFDF025)x(npP{gd=z z@Rp}Qhtj~{7!`6k48(@Uz{n7JUpN>zEP@9TjLP5~Ezo?p7x)K)5x{^*W-(b65{ln8 zIQ}95A>n)@QXF9XVbIJa@&W!K3~~iv#>666TC7GT8kmU31A&LZG#+S#gI}tU%Op|| zc)+Mr2&Dr13M>s)B@m%D$_XLh6o%CVzFJke5n>#Bm#V3 z7-k|g3msYfu~gVM0s;>ighCn%8jyUTxtM&z0FxAm(a}P`C^QDu9e`i30daxIhvQTa zjAw<3ka!?400_e(L~+!I#zQ28&?*pMd0ZiY@vVo(jTngEsgQtqU@0&thPzdO%)mT8 z8W=p_8Dl8bgX7>R30z_D2sk`r7zl>2{z0OkVt?^~IJpL+SU-?F@6-TbkOl*a*aynN x0tbi$L4pYwG!mj8EW$WJ+jDvET=-{r}@Z;v5=` zNDv?dLya1V0O0@YvJm`8=uiw7{~li;14e96j4`}P>Hs)BMiC4*r~zO!n50wv2QP{_ zzxZk-l1co5o6&e60?bgTRDgKE1<&8GP;gv{#0DY$2tES?0mR~B5)gbqAkhpr9uZ-p z1Renxh(IVfOoSm)KJa?jBoGO%9swEnhu;CAfN-i~QCPcpe$WcEjsZmC1D5^|7)1sN z0f0dgC;%P!JYbYApb%pb5PH?Y<^HvS1jr`^)q~0dJb^$eRZr;oD!d2=5&`fZjFJF= z5CLoTPzW6&0SqsVBBS*OomQ&@hFk(d9U8;~fL%RSsu?h#U^o%{1;8>PFe1YTnztk{+q5vQ~U>Kj} zenE)UU^N?n`oJ+??;Hmp8Y`%MxnJnS8o?^mYPnjl`s*){XyyPmf6)5MComf}15_U! zSE#~3@|a-w7+48$E4A?X=r5B9BpX$t(FhB49~p!Kz~C4ZVyqxaD12SReBfZT8$he1Ly|qi_$V48C&^5Wrv@0Q!2*=OF

k4+K610RC^oqpL5JiYpyJ4E_i}5K#0V=RlH&h65fj4gfeU;nfVs z2_>LZAkf1Az#z~H;Cy443JsS1OoSMU0k|I)shm1bFNTK*CkO;=3^TxBWKv=fQ98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;p@eK#ctAFAQZV?EMD3k!f@rd+6_al)&FbL}Z)vB~n`>zB5 zS&Tq^ROc4_>aUs z&>RFNLjdq!z(NmbGy)7k9xZ-|glqg_0R;a*@EG(X@8AIOfY&0VA&7(4t`8g}1K|Rd z0fgYXut3rv5X!w$i&XxPlBy3IgaQWy50U^t1+Uct27!R!SJY!sL5Ki=;twhW<6$a+ zKsW`{)d$W&gc}F|gUBB&1ViQL#X^9?=noitf#dlPr&RbM^nhZ2o&8iQK_HQT!^9sb z1}pvJ510W#<;wp?0|kK8ZUgPCzCo&iqq>LMQ8|F?rBba%tCgz{tiuPuu8!0CA6*6V zVgA+ngN5oakUXpo0fAQ|q$94f1Rht;1`Z3Lf#|eC0^JA8fq#H_Ash$+1t_ia|Gvf` z5*$(V*XewKe~3d|52hBY4){Q3Au+(Y<4YN9a+6oeiyDiy#!m^!S6K?I0{#t9+d z2h-Q8iBJLO$dEuEhjpM;VVDR+MhO6)7zbD$E%AKeF&H-j0uK@abzpS^`9z^G>4pI& zBmxf*e1YQ~fM2ixajX4cWI}*JqmY>gf&%~mkMn*V7a+hRBmtmQAi(mt2#28mBxuBM z)W|?QumQnu2z+EvFAs)>4>8EG4gn;Bf`)+)fI-3IxE~OFV-T=;Vt?^~c-RQ98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;p@eK#ctAFAQZV?EfD3k!f@xb&!_al*DQP=;gRcI?CUMK*w z7>NpsM8#mL#NZq;{a_$*?f}8r=~jx!J^*2(|AFrqj6@;C0fDMV-cv{gf-4B{fyN{8 zF|-2#A;Nz@AYo!KAYc<}C;Pu&qA?nN4;sXa|Ch&!gdZLa7yj{8io`+dHwTUbWk178 zfWmNC*dSmMy!-~MMXG;E$rVlv0+mj{O2DFk5CLoBPzW3YnIO1TYPBDzJnFF695MkY zkHaN!CTm4ij88BFk0|p-u0Edh|GYSL(Kk)Ekp+;f!2a8n(BoD$r06&NTy1)9k z5MZG3=p@H{HyH$hOd;Xb5yk-^kKixi^8h3S9y9|8@B<}))NTN!5eJkYmOs$h-AH8! zp997S6Br!2RjAc+wR)>nB7@)umI3G@0}_naO~HszV2~RG13{_}j;q!GjcH@i8Ws`* z5E=<}E4}!qfGS(ArHVnb^+qwMkND*p~n;B1h7G@4bq|If#U#!1Ih&) z{CC5}s>R6x;~1O+$N3WjjbG~nfK%vzaj;Gj0{~l$1NpxYjUI#t7(9VsAoI8YhoOVO zlf`y0U}(V^1c4pV=tg6IAPf_L1`@#_#WXR=fdGCGIsFVCTa8w%np^=u^nb9+;5@7s z3aHpq0xB6a8ew<`mIHSxkqt^1ff&aMd=DrES}PF{3}DVS4+IWAC?Wvzq5{FN0tW%X VFD-(5h)0khzQM6ukceRPiVzU=EPwz2 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_19.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_19.bm new file mode 100644 index 0000000000000000000000000000000000000000..f285cacab961e8e33c1bdf4d7ce66957c7c59927 GIT binary patch literal 781 zcmV+o1M>U<00{&5|G*FL0;d29oA7*bL-F?kmH+<$48T0V0~HTHd>*h5;6e6aRI2}D zzukyPupkBz11KDR0!B;( z4n>9hbHN1KpHLkA^)TQxcx#YgT^t4k$?0*_#fj(6#RqGfI2_^pZ^i~=HNs0 zfS*T2|KH!#Vozu>0A_Lg1%8RdhrkKu7!m-}INk9u{2<`;-`oWw-JD1uG3a~=N|k(o zfM@V|1PdVnfP>Rk4<7{nVPJw-FadG+4~nWP9R>e^KZQUp5Qz{xwfd?A27x|+R3@+q z^b!QcDy>xfI0(lB5$fPXU~*7+@AX=tu)D?q2ddb4u{kdQJXKJ6LI7imh)gmvOdxo* zPVonw(xFwv+A)=I`A{H$@kI=N5ul`MBAT%IP$2;Ef%qU5imbySG!GGcVHn6H9Kt*M zP|$v%;xCL(0fdJvhJb+>1&BU(2_^yw5cnAeG!GvD{P7cjc*rFNLB@l|f&CAZA_Js^ zPvpiyqfsCnA6NW7E%EJqJ`xak$mmcE6;``ns@M}^DIEkK0U5DEFxszH=)N%S5Ine- z_&r7u3?7XYelr|kJY*B}h|*$_L;6r=5D<8XM+ZcbNh+0GD13L^#BhVgL5!hLsT$2z zx&BZo_&nwm92X&oI5+u2JAm?ta4--YPN!At50t`b1Be6000bO0Uh6;)mjkH`28`fL zAVJmdi{t^FlNClxkr~rNt5MY3Y0Y(p^BtQs2EWmvx0QCSB LfIgf6d|(UYVyZr{ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..725bf4d70709364efa6acd8effec922ed9ce8d0a GIT binary patch literal 781 zcmV+o1M>U<00{%+#N@mW{QvR)06)VcB*Fv7a1V|yCee)l$Nm7;zyI(QjYL!44}bvG zW*G^m{vY534}2c90+9WG@N$rV2YwGps62dM`Zzqm1NQ-xU>+jDvET=-{r~e|Z~)-c zVnBfaA{=DYNCyZ1U66<3CrE%`zxeX`02(v+hvALlPf!8H;FAbpy+8{Qfp8-K=sA2* z%ug5$!dd)*o6&e60_;Fxl>m6a1<&8GKww|_#0DY$2tEP>;oxFo5)gbqFd?zy!YnjE zgTN?UjQs}*kc28n-VbjhjBxM>&%{2^87IpB!>Pa^%NK)6KUn&_jsZmC1D5|7lz!}R zhztSp4R-;wQ)rZnC09Ooi02@E( z45kuE#sdLAv|u$s@zr{aB~g>z8AXtQmlC^Qs_3PG;e*~R5N%eAL?A8JtBEjxP-8O; z1ZJ!tN-b9rA^c2aCLyzHF-Ow?4adcYhsa?N3_|R{1BI&4s7Udipax;A4yLY6 zVe!CVXmAPPz=#3@9)S!%g9e}cCU8pt9B=`_ZwP!tL*3`_Am(8V6au&(I|YgXgE5FO zU>kw)2grajA7Nxj1z=&BV4&0QfV4;lyFZx#i^2>d0ab(P46sMf#y~*%%rFq}d4LMQ LA4X7s9RgaQHuy(s literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_20.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_20.bm new file mode 100644 index 0000000000000000000000000000000000000000..8f8ada578d40fb4ee2a5b022e983b5bd5f1466ea GIT binary patch literal 708 zcmV;#0z3Ty0KfwHHaPUX7{r}Nukq!_c015d2$f!_+eFcUyVh7j&VD%VB_#bcz zOfmuxybTj5a71%|@YF9906xpX02E?_g1|t3g6QwqFc=#I0PG+L4h{k!9+LS%un>qD zKxpPSfJPt~U&lZH0~rsz9;4Bs-?AV0kHkLY0g-?7H}|AJh7F?s>Fe}PA`OA#7zd93 zekKrlf&@}CDEsr?@%SAY*0^d3PffUMVF zs(>d3e=x9XYV{weJnFSr95X?G;BV~ENCyDAdaYD4VL+ciIu<&hWJAeS2Mz);K*U%f zhynBmjD9c-WJ3W5{MExF)jkM(f#Z^dEXo-mkTHZjLGscA$^&o>5CH*WsDwa}gTU2b zH5-8X@*xm80W?EJbq}vnX$OdWAo9INtCgz{rfR7UfPdrlVA+2|=QzPt1H%A^>jUGe z^%zP4M8Rbw5{Miaz?Itgd~lFl#QseLF%FAFAT7{*VGwAK#zO>miS;O<@rXboP#p&x ztT^N8kIKLi5O~P}<5&-#6h1fz42lCFkH8>$0O{+GaM0SkeHL;@-T>cHv&@*oT_8Zdz{ zhmbyV3xp#92LlaX>jNSXJh&bRJ^Ks>AK`?xVe^1!|8bwd6m9?^=s(B+RLEt6-~}82 za9hKw8HoU<7)$6FpwJ57d}EUW0dOGm;CXHb#j3Dy0VRVk5CCilBC5B9VqU?ikOy{u qI5aR4KL`js;1yu`KqCfn4xmg(0v{^?Ab<#78vuO41^`IH1oc4Hnj!K4 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_21.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_21.bm new file mode 100644 index 0000000000000000000000000000000000000000..3ad3bb076bec7b0795d035e0e2d2a0dbb9ad4f7b GIT binary patch literal 717 zcmV;;0y6yp0LcRQ|G*o-0;c>Q98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p$A7^W`+&+3 z;D?A{06)<9^+D(e5CVQb@GJy8Ujg*0!{8$dAB-b80Pq9oK0g=$!oTu476Sk@JC5d$bz0tX_({yE_JfDi_Ye#n35<~M*wF%mEShyMd9 z54@(30s!d$`hWaK;vQT41o}EB(1nDg*Z462W^w!leu=~fto|@S8fO_eFdu+DpaPNZ z&Lj{R^VO!{@qka@@(30}0v}k|e5dmZ1QNl3{*#g_4;=;nfj@;nE)6u-#-I?&1o{C` zp1>>LPi_ECL4tzB9xx~bei0y$IfOhqpisauaEKp*0ay(P0U#jp#K9ou5giT# zQMeD3L|#}(a>!@_vbvDSmNSf`5+U#|jH^+q4T37@_i}CnKLE>FX?|vx&kW|iNpo53UMWPTE=$4yiDGq?{Z zhX6j5IDkB66G#{oKq5dptb`t14x}&&Gl&5I_tA+!z@c|IMgxxkAQx7LmIs_O*$2Ns zAY=mHYO!)ac}zYZkNgH0Kp(0gY4kvOa5NAIHW&;)&G>|9^dNaaG;lb_;0iYY5cDv3 z5P8!fmJfgwa2mZ<>69P?m`pIA&@n-v703uZI2;H(_!uw^#;aBiKmg$2@Cd*ZYzQHO z1J~GT8vy{fa;XqKegkp94vMW6h=>UiAOs*EDj+Bl=#dzJQ`|y4xB&RTLFp7AYvU=z literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_22.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_22.bm new file mode 100644 index 0000000000000000000000000000000000000000..b8201b0a15a2b99c61d0ea53d4fa148a1ceb525b GIT binary patch literal 829 zcmV-D1H$|P067Er|G*1>{{h#41x@%qIHCN%|KI>p_khZO{0pp9KGXi-9bf@=4~Yyw z2UY(6KvyaE|OpFlbmI_8Q9yoIEV&Y2@Yk9egy!OPw849 z_~9TKm>_sy5cp(*v9*=i1LOFBWT27>L=Fuwplm-868Z2mFp2z{2x1-$LhAu9ufyRX zf)j@Wq2)je<$%GD1ok{|7~!a0SOI*n5Kfppq<}HZVJ%P(fc&6&z*xv5;9-zrM`K{G zfW`sf9gKnzz=lvGGPnl|bRQ6S!@=VOoO~zq7_5qkMGuz(eh(kToHjoQ)Q1>9Cjj@s z;=~vn3c-ztM6jXq=0zZJ2n0eI1kib+5)F8Kpi_8gJYf?Er2_j3;9$e$4C-7V7zjTA z#5SlV1J*w|r-BcD0}KxlHGp6!1@r27AHpUqL}&;)u=zkCdN{;TOi>7E5Nbj4434tF zbQ2T;j_VWohDTw5%&f$KG9mcY1LwfdKp@y*F+`w{4M=?88aNzd_yrq+NMIGP`M@cV z%Lm{JI0{S(A+FUx$OkaOUqHo{fW#`*SmeNfTnIe)9#M=0Ls_b@8N>iMI5^ns5DJZA ztAK!vOV~9s0Kjou0{Fq9fRXqghyYM%B}Be4i-0WyqzV`Y$UZgzK?hWTRm1s$1OS22 H42b+daxhmr literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_23.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_23.bm new file mode 100644 index 0000000000000000000000000000000000000000..00a1218317f09a65413802979757f771ee59774f GIT binary patch literal 763 zcmV~@R{r}$Ko(7+*{0DDEG5DAjFU=)X- zfD->`h(IZvYXANd@CUB{5s`p)ClUw@dLCd}ydoXqpTXo1ErbLK{A@|F;B)d<&y0)M~j} zu=!vb;{=dOAb0@T|3l`t7)1U}1i)&;lK2LJ>z3H^gniawb9pc4oPJVYZ~52h48T*PpL#zCwO zrno*(Dfm3@0rbI#${E}TltX|YPgwlskT`%mU=PE(v4p-|NMJN)5CQ@3i{}7^+~F7w zJOF@QSRFtQ98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;j{}6vFu>K&%;Sh*mKLg_l{{!wvB7{ItMvia&TC0_S9GQ3^ z0?cAO5CMgE><9tC3=ja=2p)>T07D1@AQf(`Ks;1&o4_L&h(rvaFfkDO%4q-~4j1vy z|HOVKHh>dGi+;!fgy!IZzsUdk8vPMy)A$5KVWa=)$iiY^c*Y@`FaG`k7lVV=Zw9hJ zrcv@3@-PPljlytH8fO~60+>)gq~wakFfb0p;z0(0P6!FFjYu#)3H%Y!KQI(2BUBv zD2xhc=7d0?5b*ikNM#6s<#SMo8T4h6p$PJ|daG3;0V)4MAm$Ojj}QA*n(3euE~XM4 z0H5$RLGjgkzwxas14;jaL_P@7E~R(B6o5)M@JR%s2Y}URv_b;i8pomkgiqwqK>F2a zr=jqF{vQblJat&3>1w4w@xXt;W1xfJ7i0h^s4QR{z?N%;G4=IE&8Y*!h57q|&r_llBz_>y%27>-?#3M(c1IhuTgWtaZQMdqyp@YDK z&zbzcyhU(2y;kZ402zq@rWi};7@*J!;%H-&0s(L!^Wb@IHCnJB*f;=^!NJDIU_lHJ zYA_Lrdj_To9o(u!H7H;Vegkm;9a<|95DZ|>LDUJ3j;EL zI6z{t+KlQSC{IufRUA+~q;e=m5DZk<3Vo{8SZL(Q=DZLAW-$J-_$}ABq6mC<`5f16S(6A&C(Yh&`jT{6qo=z`ujX@$UzvtBqB_hlYOyh?NKc zdp31niCng^c0RRM`ZEE6yE z+5v$51J0{efWjc04m1WfRvw9T^;)PHJb&|;1T-Es0P!5;Y215BL517Rc@j4jA9~S^7vpPaV=LXRv#}0VmU{MKqL?eG?J}V{)fr| zue?zs5C90$ESk+%sKQVRPexBTfI%P`4kb`HHQM`pavOO)(g6bhNH}^h;QF^g@t^0M|6^MnA$$pf%J6XUAi z7s$Xj5E#KAIfxBntJQ(j1LXkIKwub11Rwpc4;Xx)6@q}lKk&!}PwN9AkUXpf!6ys~ z0qoz0MFt@9z*s?~0ULlMdJpmd78(K#5*XkEg5D7Ms)ii__(VX$MjGIKY#&YpK0XE= z!1#mdfXx5l@!+vs7$grdNa3~=@Ud>s>Oe2Y0}fCa1BAe$i4jQr38p|G`OF0+eG?^s NKAZqaPl4!xEl^DOKEVJ0 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_26.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_26.bm new file mode 100644 index 0000000000000000000000000000000000000000..0ff492fe16e8358624ddec2a55f75925ad7a73df GIT binary patch literal 731 zcmV<10wnzb0M`Pbd_Uj}z<2 zkGKq^6EE=ggJVFkf4?Av04L-BgwWs6C?9ww0{_H7+#-P--~;YafQa-#_YuHAFbL}Z z!J-sV`>zB5QHX>DK8shdNGjji`~Ls(C?q{aUkDXm2S)yX=;0@>KsOL5a+qLXA@_sQ z9{}J${$EqD{6pVjDy~yM zc&MPn`gK?|5`h4f^Dp_UU~?T% ze05%<32FmFCX^J$uv|*%m}3wegrbPN7QpDVLIT}tq!2Cy!w54F`qgN)TL8Rb7$^w* zu}9MY4*~#g926KRKULw?aJ5u$-X=IWz`$e4)YodD0kOH^hJyftSOe#Ss=y}@46nZd z1AsvA0rT~T$ASNp|DX^Y0);NL0Qi6h<(&tO1Az}-miPo9^74J)5GV)oKUS*sV08fb z`ZMIw;6UM;!10IAq5ptJG!V!o!|GKOAcM=m4;uzzAh#X(bVyQ98m6G|L_1Qd%`sp1V4NXun*ut$ZJ*p|3z{40hA-a zPq5h4dcXh3Api;Z|G=;p@eK#ctAFAQZV?EMD3k!f@rd+6_al)&FbL}Z)vB~n`>zB5 zS&Tq^RS576&vyFTnGlRS=DT;7CE^0)TKLh(_PY0m1+*1XdysTD(9Wu}E>jb#Q=S z$ARTdtp7*JRR@#?pbs2G5da_p*XoO7fPiYCR0{1+>JK`tRMt=mrMNOEeH*sF=tAF$%^G3Q8KK0tOWxR;)fz z9Y#77pdDMxOeOsfl$xIu7c)%e4hzw!?UpfYWI3V(a7zPRcuGMh0 zSp|Xvz<`6ssxTfL2SuvaYNQ+h=@{49-8O1fl^E^-KTII)Hp&0r5kO9)aMG z^J4q+`2)qgTBz0nBM`~rVeksLe4>yFv;*q^jmIWQ98m6G|L_m|58>|!)K-50zycG#4_E{+ra$5xRbXK8 z{0iId11LlU9zOx>e}DZ{8CVK~1@HsVQZyiWP#_=33LQh^RR@*;f+j`)454Un8-NT! z?KKCv(SPwUdBCIq_=^MI_`DziViY0(7$7|ss5uxoEPRr6Brk?=3mC*;9}p-90A5NF z2fFx)Y+h%XNZue_!tMmsvkT6v|q(AYZil5suYy~ z1dnlufrLIVP{|_9dLRdV9_aO|#X$1uQAr_m4W4=5Y#sMH{QBu1bG92NwICH4b|pr`dH$AL0{@_!J#hGWkMp%g*t2N{B-!A1l@I{+vyfC(E3%2ogX literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_29.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_29.bm new file mode 100644 index 0000000000000000000000000000000000000000..6683473d350856f101b589d304cc3c5e5891dfff GIT binary patch literal 334 zcmV-U0kQr807?P)|Kacm6a(S^02B-!d;obsK%@X5`f*|K;CVm+#eWzq4j>OX_wXLs zP#FWt8SwAV!RbH}tRSKw^_qj$A>jYV!3h`##6%F0P!h!7^fJDIw4F|0O zI59%PgVz8FaQl>q5RoDK0FcmN_)MrhfW$%|AqEB3A!!m1!Vf%vLCnw(7-Zn`Gk|=^ zAY1?-fQTOu8Gsa^AlBet$l@6|Fg>Rj2Oz-~k{2kn0t9WG0Ni5$^i?YnNoJ~80ce9F z4>eK|l7O{PdX|VDs0a->K1oau@PC8+0pJghgSUZT2ke1Dzz1t8jwkGqdl&)k90*7h zyb$nv!yph~DMz2g08v=JO927k1KgI1f+?}BWCC+xY!Dym#s|4nf&LH0sDu0sVE+gB g;sO2-wb_IGA8WG*+AaVM7zXqlAD$2RyMP`55dRg2-2eap literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..a88887054366bd60e50e271a7db3a3a9d7f28c77 GIT binary patch literal 725 zcmV;`0xJCh0MP>Y|G*o-0;c>Q98m6G|L_1Qd%`sp1V4NXun*ut$ZOUA|3z{40hFW2 zPq5g$eOK z%Y*ob>Y?xhg66^E;21^1=}@YFNy(Lfd>}CR_5vLUfFJ|_TKv=l{{g^F;1D{cMFt=O zs>5I(*dKz{G#D9NLB+q-LZBZdX!qbZ3a9`>#vd3T5&;0(L9xMczO&|+21z*JF2`Rgm1;FytzN3tNS{eAg7JXXgbDqs&2-QSCIbNnfO!WZA01b# z{~FSR#sNW$z%Yf?uJ_`YdMDyzA%Hm!77qj%8aN09z<`_R#G?VBjDti1EioV$R)?09Ks451XwV2^ zKt1-W7QGtAVut{p1H^z|SR4YML@*74fA9nd0Kc2@2+`<6vB2^F@c0B^9yb6G^e}i3 zAin<=H literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_30.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_30.bm new file mode 100644 index 0000000000000000000000000000000000000000..0a7d98defb737b2aa4ea048a848e7dd5a205af62 GIT binary patch literal 219 zcmZQ%xX!?!{)bWF%m4g?=k3{-e~|h9L&Dac>1~7i13CWxHL-S#lLXGm@p~NL*~f6{ z_x}eEzBDtOZm@GIN>I?SU|HJmTwzKFV?aZ~*A_`pnS?1#i~$Q0zBV!jGfa{HWa-tx zFC6iQ@nu7mK|}?UB7-P{+~FklKL&h74AqjILLE=p7i2QNvnu&C=ZgG^CE=QVjQ{o} u%P{|)bAVNMhW){Bv(<~6|1k7!Xa8Y;@E^km_68fq2mA~b%m?HMayS7?PFNoR literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_31.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_31.bm new file mode 100644 index 0000000000000000000000000000000000000000..77c296011de3abcd44e867f3cbd378e4c91223a9 GIT binary patch literal 176 zcmZQ%Si`^||BH|B91EKO|H+2k3mg75Hg9i`d-#32dV{5hK~{2ub3^m<1I#*%t5KOo9TelU?MOUGxuNn7D}lX_>x<{OdOg3ib!2?j5La{v-c} zh5d*9!G8=l9DpSM2awS7v?lrQj?CE_Zrw@ Z80;6YerKp)J|M^NfxW?o@c}=S0|50YN9h0n literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_32.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_32.bm new file mode 100644 index 0000000000000000000000000000000000000000..074e8c88a7b5d8bbd1887c38699ddcadac14b64e GIT binary patch literal 173 zcmZQ%SjoUp!F)iD;RAbv4dVlToE(lO=0EZm6zZFQF>$YAu;0L-B9_o`a=HTh6C*|m z_9urJ#n_)S{}*L{w@QTn3~QJa|IL8<5F7a!+`CRV qerM>jF>>T@;s1Qlpo#gDqC+F|C&`9}=1=Sm?in1;zxXlTqW}PdKt8Ad literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_33.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_33.bm new file mode 100644 index 0000000000000000000000000000000000000000..9da74cf2d162bb012eb46d38465b51ebd4ce35d6 GIT binary patch literal 356 zcmV-q0h|5-0AK+Ccmu#50PqKZJOSVj0C)l*fd2>d2p{182lN~jGyoZ30rh|ZoIF=h z5D@SI{qT>L_xKOEUxl!raX;ij06r7{2fzS^1`mj(Rx1(z{@ryd z0gw1!RZ686sr@I=eE$IYs#R*WAE-XGlBEdn1N&9#gX>j_g*^}e^qkQiY`u5b$iKuR?Y5e@_xK_UPw6a+M5^o9~p59okDqyYO#m>qx~ Ca+%Hm literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_34.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_34.bm new file mode 100644 index 0000000000000000000000000000000000000000..a52e76f571956be4f51d8935ba47f1b4e05fccff GIT binary patch literal 699 zcmV;s0z~}*0Jj1FC*%MBzyGh``TlRg`W_H@f5D9~fN%ljKmLE`Vqk2D zJo6Ex83WhizC5Ie1|$X#o&Ki8G6KS9(>mYPLND5FbCNeyYEsG87yhgrS7oE|UzF6W|XU_&nhl2>t>cD2U@)!vntq(g8St zK;n>`uZSMdNCm+rFt|2L%xxRsJm63cga+XafM^fn0IUPe20I8gIt+#%XZ{gr2NwVY zJqT@8a9vCMGN2DBfyA)-sE8D06Z%z%9#+JOVEVX-M1rxkmDv}`0Q_(*R7gbwVfcub z%pOpF1lETP;M6X#68Yc?CI0uwAy^#`Dga+Fc+5W#7}SFkf}wR_1@k|SA`bwvWHA^_ zC83J_wH3+yX^<{)}NV0;Ke z5MYB*2fQ)?1H?^LVha!e!U3YQA^_qeO_B$cU>Yqmm_#9n;D$Ah>#2!1#j53ryl0vU`&zL076z)U0qfTN5aF@x~~ h2nH}^@twxO9|IWx$D{xmmH_-91+WOn06ZXT4Aco>9w`6- literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_35.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_35.bm new file mode 100644 index 0000000000000000000000000000000000000000..d035e592e87741cdf4e155ebc733f17cd5da0f46 GIT binary patch literal 812 zcmV+{1JnEg04M|G#N@mW{QvR)044k$KMahM2oD{=J~+6WMl=5(_ygDe4;%#}Q55%s z;sXGx%rX;C{6D}79{4=qa0&p3e!uuRNI(O>0hAsAH3yH2|3?Ry0Dj_ufJOo0EE^sG ze$m(mG-M&csKmdZ^}IkN)JO*h|6P!W+xr2D(jXWw{ye@w1%bwY5d1M1N$LP7{9Xw# zh8xr#u_zY;FaCp<#TpfJjSJYWL%@7*9UFZ|*I5dQ=p2?6l% zF);}UJ|P$o*zw^O8X!U86fQ=7gM`RJKOg^iJt7n@C;n@PfJS~H_J~P7SNge4{-G1OhP;2d`d1pz=X40P%=G4hyT0 za3PQ>yb1wQs((kxRgh!8To{1-WRL^^fD2!0kYHQ`n2a|#aJYn{5c-9~s z0_p0dSquaR0YHghE&-7bB-bGTf!Ht*%mI9G9)R%&#}NR4&M*)RC4e+NU;SJ@QHTe= zXMlm?C{hUoi~b%E_{9Z76yQhd7(mc~5^EHoNFfso1cMQ(z-l)E^NAY95ePAkKsHxU z`NBcs{16D(C0dPFD^?#UKsZbz0FGb>hy4$bJh&JM{i6Y@500zUVHs4w9x?_{eofIMV83=jSSKt1pXaGnw1@MrKI1OR|tSRF#E2-88?&kK{u4MQfEYLc z;O>MX4;aUHpTL8)gdi!At_RM+Vt`=GVx}#?__ai#APk4tSrP$Q7-m{1H2dH!5&`bd qQ98m6G|L_1Qd%`sp1V4NXun*ut$ZOUA|3z{40hFW2 zPq5g z0m6sV^8uK^HG$M44gwMn7z_i00JsOykTwgjJm4@k5r7BRs)#299&pG30PeH^`1l~e z(ZE0^1O(qXi$fU(hy+?M(!7?2D+NAav?C~yhjJV*ugfsqOUV6adA z0D%A(^L`y2SbT689zXsc0E`31-~t|l{GbqMEW%*~umQ&a92W40#56J92Lca(L5N^r z6~Ot}EKm#_92igy!1#mYKp79Ppd=_%z#JY1_=PF!Sse$Bj@8F UAbjQ+1Mq+rz#m3XfE@x_pd33S&;S4c literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..125ba431d4bfb39d873c5a164930c43d0a4711a5 GIT binary patch literal 791 zcmV+y1L*t#022fF|G*FL0;d29oA7*bL-F?kmH+<$48T0V0~HTHd>*h5;6e6aRI2}f zp!WHUQW4+}xI91t8yc@y|M>(b|H1|@$NmL?hk^_MKw}S;Ru9Gp$o!!YPw+ieDjygu z1mvLgk;t%+4}v)F_yBrUsD1{y#6kJL^GJmVOMhs)3Zf&MgcMY)5@CcLw zS2=*ohQk2|rmc7|3FZ%hRigC*B9$xsSAYi{h4Nu6fKVY4AbD%`Ou;~ij8ua$fUd9gVwm_WiG8U+C+Ka5l=VUdzy1H>N`NZ%kI z;K5>T7|OVOzymP>4z3lTq-r9Xu=+qGAR+q(hGCGJ2Z%m#5D>#R7N8*gL&P62c|fca zP$1ZY>oADHFc2IBXb?UD`TQgNh>RM53>;_(Xdlq|L_83PTslGEhta5z4iBsT9~I!t z;Zf88&*YRS1`4ZPuhno6dLVe9G3dpL5r)-zw?*-cVj+|Ygc=!OsKOzG(W0-*VHCep zAqF9&#Uh9E;BBZLpA8NX0)SDZl1iml3LhQ>1`s10dyjqqZ}U}T1ZM#d!&UCI1^GrIfboP}JQw(c16RIp zoq2mpAW=N5wlL;^4h8~~6taQP4hFbxslz!t)P z9awzq9sp>=&;>w(bQmHJEC&W3{Dvq80fE#vhgAaz6&vp}_yffxFpA)OW0L?t<|7;r z06ddIJ{?tqfPpwi?2dN;@YQe-5r~dPAABR8g#K`7VC0L$M=<#fM&Jk@#2h+A5zGh9 Vzz8n^l-}cD511gp2^bLxe1QM%L)HKQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..c7917673584161226988c904c1991d7f613ba2f0 GIT binary patch literal 706 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 RoWK-w;VK8yfHF}jm&jl^EYbh~ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/meta.txt b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/meta.txt new file mode 100644 index 000000000..3e31e1d69 --- /dev/null +++ b/assets/resources/dolphin/sfw/L1_Sleigh_ride_128x64/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 18 +Active frames: 19 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 21 +Y: 25 +Text: AAAAaAAAAHHh!! +AlignH: Right +AlignV: Bottom +StartFrame: 30 +EndFrame: 32 diff --git a/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_0.bm b/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..aa7454666240b57190099b0e7bee4a1c218982cc GIT binary patch literal 443 zcmV;s0Yv@*0Ji}EKZDN$0uSIHI1l_hC_yp+Kl(TXAbno|W$=T8=l=m8m;8S@@YzQ{ z;|Rb;N#%r(j3a>=gaHbAFNy?V2y=iTh|nIN3xE)^1%dz&JnkF-$%E8XcZ>i(fI>Vd z5Iw(>@OfT==l=hI7xD}qsDNN!`ltZ@uzv!$wNvmY>VOIQ1`hro;Hv-Y;lrv`YALe5 zeQW-p>Eg9gpdi1?-~|!V01Nw9XO{x6RUN1Rf7eYZ_2fsd!ydOzcpaw8M zz&!VwudVz(omdZnYYP17oUI#WkCQB3=l9tQ9sTB z_zw-&fPEOiJl|;86}W>&zzHHE01m(n8~{AW<_|#0-wKKkNCXH7Kj4_H2mqb}@t+C| z4`RT=0)!nHa6O3wFai)fVSx4=4FDcUK?j$D{tq~DfWhe;z(>L593>i%&_u;71nvM( zAbH#ah5Uiu0K!lrc+Lr{{DYtcwm1k-J=-Y*pv6RnfN>y)$a-J}C5!@q9}s+;1b%-2 le1E_Khb)7A|KLM6j6fQf$OQZjhS3ME06J$wkB{VRvG5NIyQu&G literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_1.bm b/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..a23d250b969fd3914a84d4ad0b4e0594ed714ae5 GIT binary patch literal 448 zcmV;x0YCl$0K5SJKZDN$0uSIHI1l_hC_yp+Kl(TXAbno|W$=T8=l=m8m;8S@@YzQ{ z;|Rb;N#%r(j3a>=gaHbAFNy?V2y=iTh|nIN3xE)^1%dz&JnkF-$%E8XcZ>i&|Iz!v z7)ONy2d@MF{|A-m9)I9afC>lj{euUpAQ%_^ssKCdjDh2-pZGuepaMsMgT9COD!=;p zaO#y>ioCBMTK}jzc&${c{i`gOgIB5@AOOGpcF}Mu^-NYQ0RcN*?e&e_#Fnt92cSJnt0{@k4=QueBotUVi}i(R!tVJP0&c$6z0m1cU?c zK8!F9UIF`e qCxBGs1LOJs|C)vY2p>QFFjxrqJ-!eh;n9Qb{#z^p|A-&J*>B)^bG`)t literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_2.bm b/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..cd39b17ec8969063183447fd5463a0ae27cf0fc4 GIT binary patch literal 463 zcmV;=0Wkgn0LuXYKZDN$0uSIHI1l_hC_yp+Kl(TXAbno|W$=T8=l=m8m;8S@@YzQ{ z;|Rb;N#%r(j3a>=gaHbAFNy?V2y=iTh|nIN3xE)^1%dz&JnkF-$%E8XcZ>i&|B(B@ z7)ONy2de~c;PSl#&;9=Z91r371`kv~FfaX70C(3J1IJZA@PG9{0s;(p7(3{Hf~)_p zhYzX4sjJHI^{@Jar;62jpc>-IcmYB>Kmj_%v|IoF&)nla2hZT(ZsAHG0OJS|F_1J; zh7Uq0g9qRZ5PQr90ty}gKCBu9An*V~1_!l+0YQh8L>^oMIRFUIIB4)Z;gg5~;6Mau z7{d^H0P-5700b~U1^NM?CX8_waDRXhVaL&cR1QK9Fo2ST5MK-qf&_;ZgWLc^eyBlU z1mOTTfCfSG2gd=DQ~>z?0q%Ps0rCOvUJwBY#t;sF@r;Th4`h(Kh-h#y`yfmJf5=Gw F2F$Z&xby%3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_3.bm b/assets/resources/dolphin/sfw/L1_Waves_128x50/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..2d5452d7c931fbcc2cb933335456f4f647e40ed1 GIT binary patch literal 472 zcmV;}0Vn=gaHbAFNy?V2y=iTh|nHi$bZ7%2`qtNfCU&xjsD@l446GH(}dvs zFE{{vaOZb}7~jC+JSY*k;4|fUUw}h;2cP@?m>s}Yx~e#<`w ztE$Z+sDKB0%MeL$Dzl)ehzbsX7zFqpAaQmb@~Ryl@OVN)fU1LxEGW@{e*xqIAJ{zr z2l!u)zyvQs2e{;1MAR?={4f6ic>sj^AO-9Ygj6^He8M1l2>3kVfcKtI0prjIzxw|O z;AqjKpeBrP{E!>~aDRy*s2{{0lfV$p5@mtVK%fzTNnj3zU<(!cp#=tsOomDXAo+d< zq5x2_&;#T6S2+xT2gnD%fM95H2f0we_W*|j_u>Bl2*`o&{%(o@fsFSbfb|Gv1PCYK OI$#3+K!3#e8!QB;G|RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%w_<{$@5kvxz0fQxIgkl7w0B8|NsF;XAJ_#fLl;I)@34o*qEd+qX!Sf*hMj;#& zDFfXWF*roRK%kmL0!a{t1L{e9q$h?!{DXtuDgUUHhd~E0#!LT`0uSM?UKtQA-7L0R1hYVN712hFV6ap|Gd#F&xVj&O%T7YCsC@?+hkO&~K){|ERc09Xc%RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%w_<{$@5kvxz0fQxIgkl7w0B8|NsF;XAJ_#fLl;I)@34o*qEd+qX!Sf*hMj;#- zhvFU&bXdgU6A1)8g%pSck|7N6Kvv`cStat2o)xIj0q+$5)Jj5s8V7>@4_uf3CUraT zJ@H@t8^mB33H#*02g>>B-i6?ggY0}i1Nhtl?f=u@2gCe>zz{4CAjyA%LmmgftZ*Ol z2&`Kd|CfOWfNUQCgg^&?$xq9oP8t32KJijWfCur9ql23PCV+uU{r_LbGzf9{;63me zpdoND@G$&cKxN>#t6Ts!pc!5v&W~N`v`S)hAOpq;!UQk`SUd+J7>EKe0pf8G f13UojemDXL)Ive`i@Ey%2ET*(n*auOz(3#s%S5EX literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..c5312e5e5a820aa4379d24bfda9c4e3a6c296f8b GIT binary patch literal 465 zcmV;?0WSUl0L=ma|KJ!1JOBb92k?KvV|ai<1QYz9hz1J~2hIcX0~p1CgIV|t0%5=@ zSun5w`-VUukO3HgE-(-8gboCi*f7LHlA#oMki-Dc9wdEcFgU`3ATxj=M-Bu3hlAJe z1_Bj>;eQ(miEr(rzy}T-4@vmuCID3D#ndPOCK}D<0GEJ3z=sR83SEjo^TZX!IK-3> ziNINn5C^BCGGK6e{VeAfmnYNr-w(X}2yp-9oF4V?A^-pJuzS}*>FzTkF3V*x;2tB9J0MLWRxxj&o+Jp}~{F*?nWid2Jyde1>pZ*FDh=qV2UziX+ zED^wYUSK5g2etzS1TFe?zy&~B9{?XR02xcc=YWHh6b4apN=5XjI9KX?h!Y8XA|2#F`05eA_3Di@J)Nb`;Ym%t`9dA(X8 z2xA!h!RrWO7=TX<4>Yid1Rr#W1wpVVVUYvoKo7<-s>ojD@ogA9WF`fO0g{*xBzr)@ zLIoR`JYp*P;9np(2!R2B2Oz(L#EyUig8+xIdw|dZ_vE;P#t1?X1b+8pA;ANu0sP;Y H1;juD{u;iw literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..c91ed2fd23efc317a9fec7f9244f5ecf26bfdaf6 GIT binary patch literal 698 zcmV;r0!94+0JZ}EfFeKmfrIjX59|Np9uLp{LL3k1U_W#*kbcNuF#vwR<^cS;@vIO) zd(Z#CF}ve9B@qX-JRV&5#tfn=$M69PXF`dC-_IZZ0Sk>X2aoI?k-rCw2tNFDh(7RG z1aJsF{OCR-a1Q{$x3&;_+0i069sK5s4--KE3qB7Yqr`7u@&FI;)>rrp1JI!=ED16{ zi|2eOP$&mL2sL^*JbV9r{(!)9X&8`x@E~~0{Q&eFj|1S45O~kx-2i$rMgb51`=XFY z{7@c~_&7X%AB}K5FZveQ1B3uPee_r!fBx`1X5jOjOTpql6S(+u|M*Be_!7x95WXpK zPLKW!4>$%49$ov|$bZxR2|R!U30bH0tOFAfIQ$(2*5D`?RtQVL>}ORfY^cfK@wo4#6MrnKs|tmU<0WTLH;XP z27sI(^o9V%@FvkNl$ajh@M$c>{x_Jwy*v;P#4Z6m2#gaC7YC$sfA@mGI8b;bBL5Hv zl>>p}ulg3lJ^Tm<|BIl5$ALfoSM3lU2l@jagnjXN6H#zK_4KgJKlR@P9)Acv7K8uq zuhJkK&-_qkJ@}dkx*z}k{!f7M-}}L#m&pO;={q_P6AHB35AhFN`%)TJ2HpaDrD0~`qk(=2CEZ z0f)!)C5Sy^VDfDd6n=P6c!CNF4@>zJeV5sIJm5g`(0}*gLcxQ{tS}II8iWXe@eB|E zXaM&oh#-OHDi9%W;4^FixNpGtzyG;6_}9XI3LFReE(ABI%&-txX8^(=_6Q6zF#`F| z%pwXHSUm6OQH)?em-v`H|E9r!(1@c42fM^ULUj;%Vgc))|K1Fy>Kb?a9=!ZL{EAT6 z1w0;~ugGj@5C#axa1?NQe1YPw7#HjRdiZJo@l^SIcmMtl`T!3dm;X)wiUZI8-@skq zAn}sVy5IRje7^$Wz<=Pt@uKiS==&f4;{o%GgT|Nt_kZdD@qLIqwsLTI)$jj*{(v4o zPrv8!!7vCsb@%_@{(}R60SDkA5P1JeqyPQ^#q2GC2cG?kAOw2~a6#jN_us+G|A+7a f<$u2eTmSC}k$89X5PN_N?%5stv_aF0B#1shQS}MQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..aa5353e988d02785f45759a024931abe7d580086 GIT binary patch literal 584 zcmV-O0=NAE07L@+fII=<4*+-rz#ahb2Y@^IANT|F;Rk?x!S}#`z&(Kbz(C*~0DZs# zKZbz<@kP z-_ZGk-W5OxmVe$YUN}5vRseX=FaHn!_#S((c=Kc+^8fh5iJ!HD#(O>ojswBL|KI=9 zyXAl$Ey0L`%fG>Z-}v0Uoqw17zfWUvCftXMrUwwc* zFdOIv=nzr}54)K^iv!95wSa!G^7S~tJCHd1P#$^^c)jswmy;2(?+ml*DY%6Tpaje?1R4~z?+C+R@JB71OJ%^j$i~g#Q}fdP!0e4@$U+bI{^s# z3(Nlv;0TA07lYt1>XG_?f57p%{4ekc#4b7D#lRpxNFUrDAR+mp#tHC`{fFbU28aM| z{|{g!U}Yi1z%rjedF|ox@OZ&E5DPI#e_na`JbB{LzW^w(J#=94pcIrmEe`+y literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_14.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_14.bm new file mode 100644 index 0000000000000000000000000000000000000000..837c6c71defd8be280776e7881817fc68276b5d0 GIT binary patch literal 610 zcmV-o0-gN<0A2$B|KVUk{Q*P)Fi?2?0rvt2kDwoLFnIg{_W=j^KOjHgdBMT)0R98a zDj@jq1I#KQ_}~M|;Q;Id;{Xp%fIlVx`hWxc9=`B>kL(_GhKz#+o><3>gVG5B{Tt>8 z4;U5;!}CwXJVamY_&z)lfe}FLAMe0Dt_H!Nasoqr`-9r~&_@VJU>l>0Krj6W95O)w zgJlpe;FN#haR>y*&>wsRUrhppDF-nZ{sYsG|A@(;VDX@2Js+@oPGA%6%nc+tE0kSi zuxJH>Lj(tm3qcDYD|B!X2tYh=AoBP#)&UWmL9h@2c-lSS_KA8RbO;895vb?`+9^1J zKqL|g{UbmRX+$ywAO;Ttt3U_0LJkiYg@OTE2b}yKQ3wz`aF!;BgU_B1DFg(5A@ZVV zdEoJzgVn$w5#o2S;PHin%RrqGp+G;L5P3mC<-mYJ58@9VCwyLBV0pmdiSdjD2SN@Q z8NBEa$N2-wgZ=&g0qGDH4O%!v8W;Zm|NDc@SRg@@1ImB)|6{@DKq!m?&N3Yo|NZ%| zgUlq?4N0o0xY&yEj|qzoQt^FED>06iEa;GRJCuV4t{^!eXG#1C2(0)+vGdoW=5 z-AFJnC>}#T4`yhz^{KA$Q(_^4>({vevs<0996^* wNHeH?5Gg=DU|{j6KxP1O`UB1b0N_Ay5Dfv)f$A(Dg8+f^cz{o!766F@+?Nvri2wiq literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..0000a886313b8c265743efe166ccfd156492d830 GIT binary patch literal 740 zcmV2edpMFaQvP#()oKH^LrM60rl^I503^{{iLsHy|)^ z0P@TO$c~T*6avV`F91BQ2NQrnAQ7N>U;*j-2b3ZK1#_7gbPDB+UsoNaWG5dPb%aa%Ma{d z|DEDsz@&x(4~zyiF!OMK^XY*gSOo$Hj1CRJ{O`H{==f-1o&bS^#{qtz;s2(wI1VBV zR2T#eE<0=n8}}~2CKq!|)qA>9R0!Kjw;7H&PBItkNnc#WQA#nkC@B-!W2amiSaeM(VZUFM|55zur z3vdiz5rDaP0mKg|26UD%2yi^UB;p606xKKhI6S}qaC+Xa&=0^Es2%ZpVYol}I2f=O W5qn`E9|>4I?g03JC zA2bOE00<&62h@N_MMD3>!RtVd0SE*!_y@oqya2gi1HuI$kb}V0E5g61P?e66wYH9giI33j52{(AdrB`gVf+cal;Nwlp<4z0LlXagupw1_IjTN zArTdbFoEVNECQfnMiC(pJ>mfYBMcB;p<UWSb^&U9gP8?HUvQ}Q-S!Aj0Rwr5P2)idN68af)NZK2tD!;9ESo92@?RI zh6)clN5Vq^MF;@_GKB&s2`okA)ew0}AXG>YEJP^P6xl@}IEWEAK;n-a1iZRX z2$W|b1X>6jLFI4qM!wUzT z3Mdau03?0jVqgpk5>2tL|o-Vkkr_W=P; Xi41@f1_$-wIw13am}x#>`Gy0~KbO0F literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_17.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_17.bm new file mode 100644 index 0000000000000000000000000000000000000000..edccc7396ec68d5dd2a861017a681b2763c1a4c1 GIT binary patch literal 451 zcmV;!0X+Tz0KWkM6hI%*fPX>)+z)6lKcGPUz(7I#PwD_arU3pz{4gKTMmK;k_{2d3 zDe-;_GJ(K9|L_=t*8Igk0EA=6#lS<%$2b#|96X)?8DOCw>-+=J90#Cef#ZOI;2`rr zNu*W-zzdWr%n2f(z=7vr0gnR~(2t^UO zA(FI0F%QWy6vBy!gahH8Qk*0~K(B;I3|a{RiG$`r{)|F6C{hQyEMjnpgn_!C1EfGC zkqBTsfDa_TQWL`<{z1X-6#vvpL!g70V9{3ED{Pb`z z{6$QLp%MGwB+w8k2!*2@&>_PW@qo<%P6Ysrd;zFN8>kq@Vj&QFT7bk%C@{HXFbbps z2rLtU1Ka>0(GCd2hUf-62Y?DM5-X@w>^KMRlm@CSfA0hhpbq?iBy zfrHw>1U~>!W5l;g-C!L zl0W%Q5+I;30>DxO7J@)xVEK@LqY#b?6oKxG7@Q(uAZRcEsSpVyLKqJ)14%EGgz(5e zkZ^m&KlKuj=pg18$$#=-LHsq$0JyLIj0iCIxqugy^V7gQ1=t6u@PYIH)8HS)UkBB| z3OoV&8U!AM(Ju(SP^F9i%fST<2d;7ffXPqKM*|0_D59#990~of7zs24E{z!Gfesk2 zj0R{5a3};|KKD?ejKo492DJdlm{4VjjSi^*f(s2~KnDhha7H8miwA%hFA@Mo0zNrV r1;+vWK@bLD3)BEMcz`zG59&Zam1IO9e?TBI0DiqhA5j1hwgdnmDfpDF literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..ade67d1016ab61cb52596c9cc607f61b30ea100a GIT binary patch literal 402 zcmV;D0d4*P0FD6wcmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 zgM;h+e}H-;fa$RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%w_<{$@5k!K2A>j55m7)=dhC$9x0x1;}5y*hZ0qjX1{HF;JzCZ!*0Z0s52?33R z=0X09LO3Q-pM%{NF*roR1;7Wq0+9fcL@|&bgnSO2M@{~-Pg z`;~HE{G0+20RKS2?~4EE)P?_Wjes7!ub!O9I1l(BLGqFw1^f^<3jjTT`f_mi55+jR z1Km0&ija90cgzFaY_m wD@TC`afymcg5DYcK17NS<{sClcm>^jCiVOk07yZoxc~qF literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..d05e8ae2b4715a5e6ec362ef63a96ac6b1ce0895 GIT binary patch literal 374 zcmV-+0g3(r0CE8Ucmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 zgM;h+e}H-;fa$RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%w_<{$@5kvxz0fQxIgkl7w0B8|NsF;XAJ_#fLl;I)@34o*qEd+qX!Sf*hMj;#& zDFfXWF*roRK%kmL0!a{t1L{e9q$h?!{DXtuDgUUHhd~F9crWf%$$#=-LHr>E9{8{R zj0iCIxmW?~%K7Qw9sn@V0rs9Cc-#a+4^RG|0RAfc0&#E$xFEOz!H-S>?oAT#&^!?M z@I5hq`FIqefboIDfyaQ!PuYh9Cx`)}s*_NOaYN-MfPqLvEg0s34j2(2`(}Wr0)R#X z?{x|o%tRspYfub{g$4(`QUL@O8pwbS4G`drNC6fP05D!80E`5E0ALM{1NglICNEF` U+2R1(fIq1K{-6W=AK?E4z^3n-*Z=?k literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..5aef127622c6a77c35d1a33e111aca2f49d2cd7a GIT binary patch literal 440 zcmV;p0Z0A;0JH%Bcmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 zgM;h+e}H-;fa$RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%wQ2`JD;DPdlQ6Qhld>|g7Vzfdr5Xd~@AP-m(NT`^OL^FU;NF#G0!h2Z~y z1R(cN8C*Xf{P;cXKr)^X2ObZ4qyh;5PLIO|QJBX8IyZ~}K5Pon;6dDCVv^vuhJX)| iB7^yeKn#up`Kn+F;5Z-vw}E#gL;;=wcV7v;e+58OX1XQ- literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..3be1790d74ca3b2fce974f633aaa7e01de7b81dc GIT binary patch literal 449 zcmV;y0Y3f#0KEYKcmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 zgM;h+e}H-;fa$RjDQco7?di^2q-W;Yyl#|@IeI_2duyZItm^@#xMy0JwnA$ zkjM}vKnJWaK2Zt~@UX!3f(ObGM1p@I_<(wbO3?_!Lm=~rfee5J0x1;}5y*hZ0qjX1 z{HF;Jz89VW0Z0s52?33R=0X09LO3Q-pM%{NF*roR1;7Wq0+9fcL@|&bgnSA&^yK02ABu5sl|h@N4$1{oLzFaIwB3HU+d1BXKa<$%dg$HIOkbHE~@p#TZ^fDM3?0*L%z2j+mt z{9*Ua0Sm$Z00=?upfb3AKl$)`+JI#|APzhp^+*H~0G%I(45KlQ0(5T}0DRaLqrii> r#Kk4SZw&w+B1H%D5P%sR2lG_G6~J&n0dE5CNQeVG0`9&Odj1N48I-`J literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..c457e78771463e34c9357d1c8dd27ddc2984d33c GIT binary patch literal 466 zcmV;@0WJOk0L}pbcmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iRsfe-*w zfDrs3;Bv47+x>rldLw{xzzM_vcnBT>4>S>w0AN7$;0#I?W&{)(2oFKAa4@_OK}G@V zFaZvNhmakVf)Ec#zzAv*83F{T0QH6k${|970Y?oG2cXod5Q-!d`47Yc)G}6xMj{yp zoJ1lZ^g5KniHPJtWB~RgkN#7Hh+hlBu4oECV$etoY#%ZY^kNagGK~Bl=&^~yCJ-(F zJ>V3G1d<_)fczui_mW>J5(*px@ec+gprW7pj{%53$UlPqrmA>d!Z<8ZJ_q1bSFfAr+x@E?kC zaFs!uqz@$MpN>5^kU`GLIxQa1~30F0txs*;{%670p)fI+{{RRR literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..7e83e14a5ae80fed0dfe4163d65bc5bb431613e6 GIT binary patch literal 350 zcmV-k0ipf@09pY6cmu#50PqKZJOSVj0C)qy9suwMfII=<0ssHtVC(QeU=iSb&HzL3 zgM;h+e}H-;fa$RjDQco7?di^51Rl;u)Gj_%m726q2vr=0C>O%Y7!X&24R8n zh)|%w_<{$@5kvxz0fQxIgkl7w0B8|NsF;XAJ_#fLl;I)@34o*qEd+qX!Sf*hMj;#& zDFfXWF*roRK%kmL0!a{t1L{e9q$h?!{DXtuDgUUHhd~E0#!LT`0uSM?UKtQA-7L0R1hYVN712hFV6ap|Gd#F&xVj&O%T7YCsC@?+hkO&~K){|ERc09Xc%0uQ)60v!(r zR{%IO3BW$C0V41N>M#Q=83LhzGJ-(C^9BKwAP8Uv4IDx~4vYZk^aVmUI1ua{fP7E@ zhakcO;=ltb^g{%2i2(?>Fo=jgCIcd#L*yt3hzN^^2B5%|)sXl>LGuU!4I}vrfdk=u zQjhdr1%S2iy=^F@Sx>ClCl=KKu}Lc!TT!I0STn5Zzz{xC8jTfC7gD R_?^t!2l=@{{txc}J^=C5d%XYv literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..269e5b1d860d851c52cc46fe88b260d4ba0f9a9b GIT binary patch literal 317 zcmV-D0mA+P0675wcmu#50PqKZJOSVj0C)qy9{}J$VSx>WL;?FSkOOc32Y^r@AJ6zg zZx9F%f(HPHgW~}KfkyzNa2Lb^4S){_RDtggh*$vU1_!_XK^QuqJ|N+vyhMTVj~yS< zRu5?Tz<>q%l!Mr|GXOFDX=n(91Jb4sgGzO3?r{gO9X`5w;sv+>RPy2AV{`xuwRpaA zI)DZs1xQicLF*6$EGgh1g_J=6$94!I?6c8+M zaHrubuL1@SQ}U7|9|VDR$ss@pRaQI$8=1_lq)tCP%rP)h-~V2@}Tv@jpB0&{>Hz`W`JKd=njggbmVMfl(rNH|CM PkTM7aMhFL+tl;4G_Y8T; literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Furippa2_128x64/meta.txt b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/sfw/L2_Furippa2_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..3ff70a91699daba73b1e15ad953597404f21fd73 GIT binary patch literal 543 zcmV+)0^t1t02>1TfII=<4*+-rz#ahb2Y@^Q;12+J0B`Jbzys%g6hLdw|K0cqe5e5T z@Be+^{ICCh;P->@0qgMt6&wa%nfN_FVDqCCi~Yd<1JYxS;(zF%kh%paaHZP5cASF948q4a5Hr#4N}<5C6Ua`VWl;A`dt!&`zW8hy%nv!0~`!f5G&n zWP#@b2aE++H9-6W$_4okq)X%vEBp)|gZKxW6XYLBC-@&f|JZ%E;Prrm#$y!ZgW3_| z2bg_v;Pdkb*T@eqyaXQM_5Fj?o!c9`#aq|Apyq2d!Ju$TE2Y z(jhqNLO%fV_)uUL0C{jf^9sN`RpSeXBSap5&;5e&4ERJ~5FvPj&j3dr2R;wr4~z_6 zzW{iR4gwb-0E5U}Ao2K5@DLxxRKm7gw!T;ge!Qv$-0kBDfIJLkx z_$%1iFc1$N{sDOZ4TcAPFBp8ImR@_1@VA>6y~llIsgt14`B1)1DF5+ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_1.bm b/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..ed11583f8f8149118f44b8da3aa791c579bffa72 GIT binary patch literal 545 zcmV++0^a=r038DVfII=<4*+-rz#ahb2Y@^Q;12+J0B`Jbzys%g6hLdw|K0cqe5e5T z@Be+^{ICCh;P->@0qgMt6&wa%nfN_Fa~y9I|3)bn`+@uipnT|{AI4rM3b1N{@`-$b?E?IV=Kli+p#0>Y;Cn$nLH!4p|Mnjkrz9R*@Or>O;vZ0X!aP9p z508)@SnzrIgY)-*gWNtpka>Q=>Q5m0&q3u#2Z_9g=S2sIIA9u%H@{W-{fEwt|BnO8 zQOom(#2$k2jRVv69}>a9A0rk5lw+0afPK945PDOA>D$$MzhLo|KnLSK2b4ppyMTJV zV)ZYWJcHxgClhpk_ptl!|MU0<`#=A?gU_)$fcmdt^WTHss!t#Ay)EGNt9n@mPat|k zCml#f;2vKJ3250rBO1N>HKun6_R8bk9J3=_fg1CN3p4_|}^4G7=@#fE+W jd6S9=SST1i2jn~unFHUzUl<4D{~rgExRvGrM(KmhGyew= literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..41850505b54db86c1a371b051d9d4d1a5eee03da GIT binary patch literal 548 zcmV+<0^9uo03ZVYfII=<4*+-rz#ahb2Y@^Q;12+J0B`Jbzys%g6hLdw|K0cqe5e5T z@Be+^{ICCh;P->@0qgMt6&wa%nfN_FVDqCCi~Yd<1JYwn{D0`6kh%paaHZL5PFSF948q4a5Hr#4N}<5C6Ua`VWmOBo8<$&`zW8hy%nv!0~`!f5G&L ze1Ycz2aE++H9-6W$_4okq?7y)EBp)|gZKxW6XYLArz9Ug|JZ%E;Prrm#6CVidqO-w z^AD~(9)4i@{z2vUfP>sVzp#3f$bPfXc~Sx5Zy@>6LE;V=2BVGd)qcNw5P4C*@!)w% zIeu{X{>SSY2dC^lC4+!IMl1y=$1B$W`+4Rd^rr*Ux2pAi!Q(1`55{~CD2G#b0QGvs z>R&K<2gkNfCg}g~VfWqt=kO2qfB$y}pJI0b^09*q9fII=<4*+-rz#ahb2Y@^Q;12+J0B`Jbzys%g6hLdw|K0cqe5e5T z@Be+^{ICCh;Q#o6ijF!s2lyU;uzAsdWyk-5NFGxhZxjDT2bAUk&Ih0LUhr?^{AM%& zc+6?PfO+5WFg^kBf8qGw&+%42{=M-4c!%2G5C@OYK9sDGJo@mE zc=|o{K>R}C!13q@(k1c-oEH%f2ax_`w+Vy;Kp#mW+(G3Mh*81i|NV#C2NLAw0p$S) zjK(R+2bK3FD9}BG9%1#tVEmF82t5Pi9${8@q z2*e&H@(-OCe-PjU%K`7ze!pPzqi@@zuiwBh9&q@B(4I6H2k;(Wu=xGpEO9&y{{sNv zSHa`!fPK945PARLL1B}F$G58We!=4^fKi*n0)R(>Kwd=sMpFN#Ee^9sN`RpSeXQ-Omt0T1*4V7x;<5f}m}XaK=BksNp&_&&aA;IDQrw8%>hrtZOCMWe~5Kj4f5%sw&91P}4qAq=a*2S$ke#lr;fe8!`HkEck! ua2PZrfe#7~;P5^Gd6S6{KljlC++%42{=M-4c!%2G5C@OYK9sDGJo@mE zc=|o{K>R}C!13q@(k1c-oEH%f2ax_`w+Vy;Kp#mW+(G3Mh*81i|NV#C2NLAw0p$S) zjK(R+2bK3FD9}BG9%1#tVEmF82t5Pi|pA|Cm+*;;$H7I-Cp{;0S-8`vu||@QA=5Lh%L(w20%t=fV5| z@qvrR;14f=JV<50dWnFs;zAb)Jbn}W1PAd|tJPtUFnFE{0S*rj|3Clyf8p>$Fo}u) z1rWH-HGU0LVlXyL1Ovx^fL=erp^x|@0P_!wa{&YVc1S}i@Ild{KQVB@JRdQr-{a}h vFPsJq2;f7)gZMlTfF5MxL=XLTK=&V%0zC)^&w#!n!JmW8TuSo*9{?WUP=735 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/meta.txt b/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/meta.txt new file mode 100644 index 000000000..8ad8d42a3 --- /dev/null +++ b/assets/resources/dolphin/sfw/L2_Hacking_pc_128x64/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 3 +Active frames: 2 +Frames order: 0 1 2 3 4 +Active cycles: 4 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 22 +Y: 25 +Text: Mess with\nthe best, +AlignH: Right +AlignV: Center +StartFrame: 4 +EndFrame: 7 + +Slot: 0 +X: 31 +Y: 25 +Text: die like\nthe rest. +AlignH: Right +AlignV: Center +StartFrame: 8 +EndFrame: 10 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..3fc3644065c7118acc02181bf59501908732b125 GIT binary patch literal 699 zcmV;s0z~}*0Jj4FfCfGf$p7FUupbCNU>qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2l{6bGRIV1M}j;2tm-1dtw{{rZrHD$M^G($N}S! z2Z?aK!1Dk7!RHWwhui=$_=f@>42~UJqSM`&-CydE|Od3pbU@dk(pe)D*Gq;Medn)&zO^^3>E140LmD=|NxemDa1 zh0p8|37|YdBfpq3igEt3^j~*Kuh<)aUfs$XY5Gs&7yaCY%odWRyQSg+4w=1yg|qkID<<)vNDd9{|YR;1AKy{v_k^4~~`r2*5zqBLet&|I!k9 z(O?iy_x^nVfW$YDaCp!G<3@l$;Lzy50s#>GK>R=Z_~>-x(YAXca{ze!ATtx0KqHa( h24lnIhl9ivFpznG2ski+AcM*d4`jHA#Oh?hfB?*oKqQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2l{6bGRIV1M}j;2tm-1dtw{{rZrHD$M^G($N}S! z2Z?aK!1Dk7!RHWwhui=$_=f@>42~UJqS^Z)ja(BB|=SRLi({sY7sAR+tD#AATKgT`y;--Fga9uN%(9yqMT{(bo13(6lp zus|k&@dS?keQ@9k$K?;d1I8HuN0fSavJiPf|K0$3bOGa^2b5;V@`C?7FbR-6U^oc) zJhZt_loRpefN+812U3sVh9L9!ao{j0A3{I)v&_rlFB_B!G0cF#VT<#hm&_h8d|*6g z4)c%~&Sm0&XCQDI0DS@C1R1zUW!UwIhvH}g8ZG*9fd`*}Iw14FQXm>g1x5fbBKY@Y z`$z=?;8YNJ@F21IL410(edw6yVbP!G{}OTdhsR3*h+rUb>;wbh=l@7a=S6@*Ki~L! zh+-SaI6P&}?)rI1eAh55xbzj)zVo8)x(90|$@712H+20yvc%#pVbH7=Q?2 WAoBnez=R<5gM--MG4LS#6Ndmx6F-&! literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..f808193580805a0d405d7316ec33cc3708428222 GIT binary patch literal 699 zcmV;s0z~}*0Jj4FfCfGf$p7FUupbCNU>qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`Fbr z;9&=kY#vwm;5@Z@sJ%)9c#r?V6@05Tu}|7a%==MeNb|NeYDLMlT4_&@L(06a;9 zz~}F(?t#L8)58DL5rOJGRqKzH{e7q3%Ty&^-wM;?FZLh`erCEF2UbFva=L z%ja^jU?BkUm^;l1Ao7_K1`-M$0DT=L|C_*Q5#ZTWL+>;PjN#%iDv&(90nrDXg5dz< zKx&Rb7m0j(vVEiiA>e>{AQeso7C$I2k5;d}M~Gx@@CWGU{}OTdhsR3*f?yzOk%4?X z|LF-l=%Athf9KE$3`2Pb2aNz8G;9O~+A($j#2CZj|KG<$r!I}N!4q%{L*W6KoXPqQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2l{6bGRIV1M}j;2tm-1dtw{{rZrHD$M^G($N}S! z2Z?aK!1Dk7!RHWwhui=$_=f@>42~UJqS^Z)ja(BC0=z$^~(^Zxje?GWy2V?S!{{iC+fFsI0C=hwX|DF(ebOGa^2b5;V@`V08a0!q+U^oc) zJhZt_lq2EifN+812U3sVh9L5ScscMG6c3>v{8{E@@fVHC2{`OPU@*n`&&%g>fkCqr z7!1MQasv6xxKJI%4g)|Bpgcf>Hwg_hp0N=8O#nlR|4uL<^Y8~m9+@8ok^xbG3&_4b z**?%#J`0V=9y|yveo$W?tzUXXIoNb(`TxY66e01_k&15~z(5qE{*aT-ivWm!zwq}E z#5a&|c+dgkMs5rnc?*sM$MFO3|L^0W)4*VM&&SRN4qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2l{6bGRIV1M}j;2tm-1dtw{{rZrHD$M^G($N}S! z2Z?aK!1Dk7!RHWwhui=$_=f@>42~UJqS^Z)ja(BB|=SRLi({sY7sAR+tD#AATKgT`y;--Fga9)Ar89yqMT{(bo13(6lp zutFw)@dS?keQ@9k$K?;dSRs(e0z9MB#gK!_7yj@A%b*V&_&lRFKa>~w;f73s;{m`& z!R4jOe4w9?95aLu7&?@H1ThDn!;c+-K>88?#hzwg5qR97QI2GG0}NlB{JvoEgX1qS z8H2p!1@oDBpc%^?27n(xc!36P5*c^BVj=jN0EUZxoM1uc;0}m9@Dzy#k^xbG3&_4b z**?+%K=>5|9y|yveo$W?tzUX3IoNb(`TxY6ej)MFyGH>7k6<7l4?p@sPdY3D5&r+f z>;X~ULBZod2aOs527_avalm-~AbubH{B$~T7~4OeI2b&B5E+Tgpb^BV<}WZnIK%)$ X2?v+}rUW4eq#Pc{0gr(P;G8%BxBEH0 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..a961f4c0a17681a1c74e2d84e79a148aad724c00 GIT binary patch literal 693 zcmV;m0!sY>0I>r9fCfGf$p7FUupbCNU>qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2l{6bGRIV1M}j;2tm-1dtw{{rZrHD$M^G($N}S! z2Z?aK!1Dk7!RHWwhui=$_=f@>42~UJqS2Y|N1+?Jbr-k z{z(Djpa0MQ+B-vhh2sFQJIl}f2Z%I4L-)VHpdSnfJZ8Rq_&sOy$OPhq4;)rve?I(h z1?4ZkSRoTYc!EcNKDclPWAcmtED%U!0UlA|K!eUF{P2Uzpbs4QJfk*0lqd1yf=q$q z0l-JW<)zAep&t)CBZLnaKY}0lA&5Mno(_Bl1q0|u{}y?fd`07Of=)XS7z{CfbMpDz zpipeUJZ28_kQdHn!hr4|a2f!80pbK1xJYT3_yzz!6F?B+uhWbOJp2LC2c|{=q<~al z0`f19c2BewkAeeo2af^^ACwozt5@EU4t5HgXpn2anqQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`*b3CAG{16 zU9fxV^-+412Js*Nhw|~C|NKYyIQ@ghI{@Hc+wuSXugYP76pcVikN|*`h5-zKLxb^u z2b2nd6bGRIV1M}j;2tm=1dtw{{rZrHP-5s;UI*I%px2mpVO z`b791w0H%49$)BuqF)3Dk01ZfhloW;KoQhW0pv^`2S0sRfWR<-@$>+M9*gn^j}!j` z^iSsi@oz8YPvr-l0s{YU&0HQZ77*Z5=pSegf*%P7uaEFQA1C}uIC(%k@BjTB;2u9f zc}FCG@z4L~|Lq;2zCiM@JIl}f2Z%I4L-(JE#{q!{jMvY<2dsWPAQ})naaoD{`|-dR zlsy+^C*#Ke;RD7Fr60izLFe$}z+g~5gn#j8nU};~Hz*WinE`;q7w11Om^@(k zzvVEiif$)HNAQeso7C$I2k5;d}6CK_F{T%<|PCpR%>0l8I1PxL!FNdG~At#*{ z0SNzp=gBM7f{zT>g@%TVyCo+IX5~G;> e`61x(1q>t}U;+*dAP6AxgM--MG4LS#6Ndn7H99^3 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..2f030833a27a95c21247e158074d5fe721ef4e51 GIT binary patch literal 712 zcmV;(0yq5u0K@|SfCfGf$p7FUupbCNU>qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf50nsIf%KjO&KOTXdB@{R^9P(y zBlm%W%eD_Vz&y2jsJ%)9c#r?V=Qt0&<3IoSgUaAPdB^M?G1vzJ{@;)P?S4}afTU^& zRDc8oq$T0FLxb^u2b2oo6bGRIV1M}j;2tm;gpeMd{rZrHD$M^G($RH4mfILfu?gy9u?hhygLINLf0LS7S2zWe@LZBde$RZGk5IpJl586z} zqb~=pzgPqi0RJKMiGV$5@Cx`mztH(af(Q>DKmVT(5Q>n1Bj^X2FnApO^0En z0)um)Fc@O|=jHRcc%V4oc+4H=ATONA1UYCN2Y??yc!36P4;dajHZ>6Y%?$%2zg!?y zAbEHLq7OO+;sMBj)gS`$FOPOlv=a(^e2@yK0t+9M7ssnt-oQQqk-NYjqo4dq$KoFy zECLaLfvQFY@bmwqB=e%cAfNC2`T+rmZy@0DpaaH@0D-}w(S8I1A^3s#fA{gw>B*yP u_C)3Y@%TVyCo+IXBk&Bzhsh5Ih$vwo^8gTVVE{n~lpG$(aS@5s$%6o#P)TY4 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..4519819ea5c7e9d0127fbaf538f5aa276c881d4c GIT binary patch literal 732 zcmV<20weta0N4WmfCfGV7(hN_|A2W$0rLUygZ2T!2b6#WKLN=A3V#6N1J|GrP+;Z( z<=H`&OaarjzAtI!uJEq|Mv%+LINLf0LS7S z2zWe@LZBde$RZGk5IpJl586!O83}kjb^5>{fCu>xq)Y+pM}Sws<^G4tCGbFa@&Ekz zc!X4h0Ubo}9z?<5bNAJCP~idN=m7{l7vv8fC;kWMpUwf|-e1h0$`3jO1^(ZfxIADi zA;725KF}WoJ`xXKAK-pIPxzE@@_>2Y|N1+?Jbsz*c*i7w@z4L~|Lq;2zFzQn*d68P z{sY7sAR+tB;p&mVgT`y;--FgK9}o=)9yqMT{(bo13(6Nius|k&@dS?keQ@9t$K?aR zgT@&EN0fSavJiPe|K0$3bOGa^2b5;V@`C?7FbR-6U^oc)JhZt_loRpefN+812U3sV zh9L5RPB_pQ6c3>v{8{E@@fVHC1qSCpU@*n`&&%g>@j!9F@t8Z#KwmkK2y)Ok4*))Z z@d6Co9x^<5Y-%C*ni>X4ez-uYK=SYhL>_bt!~>B5sz3$gUmonAXeJc+`5+Ze1QtIi zFOOEQy?}fJBX@v5M?d(JkHkJYSOg;h15}I);phKIN#{j?K|kO5^a2AA-a*0RKnIN) z0Rw|WqWlO1L-7Of|L^0W)00No?1{_)Pl0{-8R|LuNL3;?8R z0#twm1f(zsWC9!?i}*aCPzazs2m=HE$M*p7fWRbx^!M-7gg+br*l7Utm+#?!{1`lF z0P(~J*d9N>oPIzL9DqDah3*HJ|LzYsgakg|0guEu5b${*g+M^{kVGL6AbHd9AGDdm zG7|85>-B&^01xsXNSFiGj{vWO%l!|OOW=U<G{Jc)zA=kKcOp~3^l z&;k&8FUTG|Py7$jKb!-_yuX=0lpb^l3;n+}aCpF2LxE4AeV{%Fd?X&eKfwHapYbT+ zMw89FhaaKmVWqw04I13&sIpcbA{|4-ja8hwp!ZDn|kj8Lyvy4_W;1 zU^F0j;e*`fHloP?vfWV-A2>;^GGcSm|Zcs_b zVgmt&FV22nJCq6ym3igEt8cGaefnh<)aOA;n*=5Gs&7 zyaCY%rbYqCfYl%Z@-L5ePqc22f&=7$RX7k>{Gh%)TE6s%cX$KzbN`7rC`03=BNQD{ zFeNDeq$KmAz#<>-{Q3a_h;Ja^@t_07jNBMBaxcINkKza6|KG<$r+~oipNO2m9zO^S n#O6>4=lTJd`1v8=@dXSd9$*3v3?K*~@`HofE-~;R{1b-&_Jm6b literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L2_Soldering_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..1339c607e63f0d52de7d04b4076e94a820e1a774 GIT binary patch literal 698 zcmV;r0!94+0JZ}EfCfGf$p7FUupbCNU>qQN{0AfeDf|P74_<&hL4%kFv=0CeUw}U$ z;QxSl0sBA)zwdqz*j|DT1s}vdgXE6`-|ikC&OYPf7r=cdfcGbeJmc}D`Fbr z;9&=kY#vwm;5@Z@sJ%)9c#r?V6@05Tu}|7a%==MeNb|NeYDLMlT4_&@L(06a;9 zz~}F(?t#L8)58D(8>|NlpL2anUflp_fAGynPj`$uSRm%Pj-aR-l|_zw_hfQRq*hrm7pVdzbK`|x`8 z*MguBc;d4Y`S;_1FDzXBgdp++j{bdcG>ik~2Tl#*1dllM@bWl001;PbV2bX|4AoGx1ARLGd zQHUb(FOPOlw17lB5Dz2*slbBA0l5{1PxL!FNdG~ zAt#*_6hH6$`T+rmZy@0DpaaH@fPlfE5q1E?7{lTJ-^W9zE{(In6L1Ve;Q^SO$^jgQ gz%w2nAP`~zp;M3n1A@UIc|pPKml*gEehI^X01SRc?f?J) literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Soldering_128x64/meta.txt b/assets/resources/dolphin/sfw/L2_Soldering_128x64/meta.txt new file mode 100644 index 000000000..b705bf623 --- /dev/null +++ b/assets/resources/dolphin/sfw/L2_Soldering_128x64/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 9 +Active frames: 5 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 9 10 9 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 1 + +Slot: 0 +X: 71 +Y: 28 +Text: I am busy rn +AlignH: Left +AlignV: Center +StartFrame: 10 +EndFrame: 13 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..3c59712a8d77f631ff015adfce37fb3f85d52d67 GIT binary patch literal 874 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 Y1_3DlBnJQV$Bzau4kQr3Eg$Y5{N^H`Z~y=R literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..215b347b7a9e11fbe54e5c3c1d4c0de052032346 GIT binary patch literal 833 zcmV-H1HSwL06hc$fII=<4*(o|bI>q({sGbN29zQJzy>eu1UE<|0s{~tUw^2&By=d4=w-Z12dpNHU%O7_Q{9$r~jew=>!77fIp1i|M~y_J^grm zL-4>J1^>YS-~Yd#{2#yB1F$cS0ek?B?4mdMN6rI)XP}IK6F_jFhw2I$;5fJeLHJ_0 z81Q)B{1A50&)^sD2ev=(2aWUKDG&kRKmG&p1IB;&|AW%u|DcnE05$pN<2eThoxAVB z@q^31J-TM+r1P`P_(|d;jQZJ|_JPa)X4~-i;PxY&{>~3jK!d~vF~Csc!Qu`${Quas z9L#5CBM^9_L>_-n|Bo>_+1!7Z{t!H%9SI0{dAX2y%*%sA+!==dKbQY8;Pl=9_BOkMyuJ zaCrD&^Z)lBpKAw;9Pj(Uc+da;AH=@B=;tTXeh(TtkWu4Y^gV?>fbqfqZ|3pS{6F3F z`h4mT<9Ofm+0Tdno}XNXOn^E1{$t^P?kCqFq5uCp_4ucUf89@|?-8Q^{Qoof*N1Ko zP2Fb^#T<|L9y}eNbv~1@c@PGF8KDQoK9js9B`QDq{AUIa6#7Q-o}b_xZ1J2u+-NXx zNblo#?@CaA|G3N(@BiFDV*rtd;J-fq`~m?PhJUU9I0r$9Fnk;&8YBUX!atU4oCCqe z{=o1*kZ9-s@wok>-81}fdDzSjJj_4Ah{xyu3v^HUgXeo_4#6gm#2z<~1-cjhgY)gO z3d34lCcSow%Nr1F?VJ^>(rSOjAMpyZe3Po%>qkO+hWfDtJbNV-4%jwTQA zT?lke;{c9ahy~|_lY{`#j*z^)5U_Z`0jB~7kL$z_ADMWe0P}#rB_HH~*dmyL;Kl*O Lf*1v&1;c;2w>n6`-9)|0vH$j5C8Ln z;y>Vle=i^GfIYAO=sp4icz{MG0KpLu)N}YaKY{~jfI=^y;t~D({&*ZefdHsLAfL_0 z|K<-Z`1od22nK=!0{`~Ohxe!dr|`)H0)c?Q|K{eB{(JiH|A)pu0Ki}T5DowN5;#A9 zvIpRwzyJk&0FCUTH~B}-1Ats0jDHhAaG;0k8Wn*61_uE6Vz?Oac;5UFegHUzV}9^^ zWB&kn-zE{k@svl0;6D&NXYr4KJw6x;2{=FlU!FoR5O8_Npd23{l;K{vA{rM0P%)kzdrULz#}loGy{M<5J17OaF8I71RgNR1%Luj2p$LW4IKae zHy;&@!|}lxjt3w8Pl&{0^YK{5KbSZV1Ay!jX#7FrcomE@{Re^AJQxso@&DiWpWvD> zXnZ;iF!&G0|Gx@MBG)ZFvoEOJ=j|YeVbKvoVpT+_YEcQNP z4=FsS@ehD_AQu4`P6B2^l>6W2#){=Fc|g7fL?e{{3ZxnZ*E>f06@Wiedrd9tRcz0|2x@xNrdA CvT4fz literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..0e5389fd348d5324148c4c07b3a2add349915ba5 GIT binary patch literal 745 zcmVq({sGbN29zQJzy>eu1UE<|0s{~tUw^2&By=d4=w-Z12dpNHU%O7_Q{9$r~jew=>!77fIp1i|M~y_J^grm zL-4>J1^>YS-~Yd#{2#yB1F$cS0ek?B?4mdMN6rI)XP}IK6F_jFhw2I$;5fJeLHJ_0 z81Q)B{1A50&)^sD2ev=(2aWUKDG&kRKmG&p1IB;&|AWvpG!k%t2ERN9j2s?d!QlA8 z<=>v21a>6y1rH58K(U_#!~onrI6uIrKL^MVPO@tim;p#R``W4%8xDE{LxKzTra05ON) zzdrCN|06KK*+4!5GFJ|LK0o-(AZjha@B_vNfnN|rV{!3V&;J|{c;IpW-~aStG5Pqc zWBUWnpUC_p z1Mx2qJbCaq1_A*%6$}#|4-f$7;yCfJ&>#~4c)+pq5P3=EFo=8tK>)A_#sfjgFUp@u zhEE_72nPTnQYw<9x;U6Q{6r&wL5bvUL;~}|Nx}eV$4FjYh*&&efYX5k$Mxa|kIcMK bfO)`R5|8pgZ~shq@M8etK@0-X{^9??uxMX* literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_14.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_14.bm new file mode 100644 index 0000000000000000000000000000000000000000..a13cda839d56f230294e0d8dd150fd1851da0094 GIT binary patch literal 747 zcmV2w>n6`-9)|0vH$j5C8Ln z;y>Vle=i^GfIYAO=sp4icz{MG0KpLu)N}YaKY{~jfI=^y;t~D({&*ZefdHsLAfL_0 z|K<-Z`1od22nK=!0{`~Ohxe!dr|`)H0)c?Q|K{eB{(JiH|A)pu0Ki}T5DowN5;#A9 zvIpRwzyJk&0FCUTH~B}-1Ats0jDHhAaG;0k8Wn*61_uE6Vz?Oac;5UFegHUzV}9^^ zWB&kn-zE{k@svl0;6D&NXYr4KJw6x;2{=FlU!FoR5O8_Npd23+OhpZ*7p1Rl}=c@PGF8Q}ti z0Fw+QC;s3X{AUIWFXA|&7|&1h|NpbbaOY8g3(hf)^!&l&`;5U6MFCP2GX?qg|G>i; zhCz=)JP<&^uyBwdkOUqu!%%=q0RzDPL8G7l#^d6#n0`1TF~H;hsqq+$ets($$MXjP z;BXy+O&^FnZvwG~f1vO?2ZI6+9zXm46Z{iK4G)JwrXKf#dVX dh6Tz@;($v($pNrMF#z$81B(FxfLb72H~{T)VI2Sf literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..7129cf103810c9464627eddab0dbb924fc2344aa GIT binary patch literal 753 zcmVq({sGbN29zQJzy>eu1UE<|0s{VKTHSzz64-8X5|KKm%W% z1I7*?FktX}VDj(JPJ$c~c>;%qo*`KS!~onrINU>HJ_pbg=iv1jiEK(^1OLat>>o5} zfCL_#emn#UK=kj=*#qDQqyvY)8<>5O!XF-axSy&gdJ;k!gW zF^NzBaD&^!2jBm){QFx}f$cy4{XcU0@O>a4Qt;8qqK_KjK5&1#`MgkN z1KjOD`2~w1lQ)$^G4O|ngdVyW0DNolPY5Jn`~Z1h@fsi?{^#+ac}M;L z^n&m`K?a zlgI=@0l)~4f`3v!7e^BZKZt~I0g{efhy~|_lY}}m@ECvwG4dCW|IrHvj1U@dFU0@# j;s=kq({sGbN29zQJzy>eu1UE<|0s{!77fIp1i|2cqvJ^grmL-8NK@Gt%d z2LJv1|KR=PQD3PzfCYb)eBd|;7$q7bGy)0;exaeB2aA9tABHP|j|YwK!3S*|{sDgQ zdt?6$2fq36Ifwx8AO8XPRz*Mj9)$cr0-%&mzdQ$w96n&d;P~J$5C498bP?E-$TU1O z@dl6>U;_k@Y-hpo05=bg2T^fgC;kL@@We=4Q2GH5KR*}BbVK9Nkb~L|{WyL8e=iTu zEu1h9K>9!QI6^#szVvvY#{nO_UJD~Y2@ik&8J!E_hlDVU{vCE-j6MPUfwIfP2cQ3y z=B;3O&;S1)#J;>A5CK5g#y}Ja04KwP{@=rh0BVFd-XH|{f7ycoC=Np=Kpg#lFbxm` zWHdkj=bpb5@PnHFh|z!kf0_Ji!ykYH+l&9_|AFJd53uk+sTtu15Uyfn!H3#EjP$_* zLuZWP!DRl0g{Y;UICp|Kl)^;WWGiM$iA_ zasR{uVfZ>02Os@Uh^VLHv5)^SbMQdm38nD`jo?-=|MVPYBV%fmPw~Jd3=SNq7={P) z|KEs)Bj~{Y;BXk{@;?Z`iv+wN3qA>eqB!_G0)Sx=(7>_t5SdBkFob}}56%D@eI^+^ zfJ7i12nB)xBB?P;qltr`#6l;rkH90BB7pz={F0V`{Sdeu0qh_Gfj}c4uMj+bW#WW4 Xi~usf@<41IKtUb>~Ib@{~wkbh70x|R3Cg`2=afxz{qLyC;I`f$n*p1 z9}FfovM{)IFjO$Ce+1Sl&Ms5Ie5K;h2R3UKWC9q63@ aKkONJ*1qcBby1VeTmJ|1y=Ueh*cbr54M!>f literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_18.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_18.bm new file mode 100644 index 0000000000000000000000000000000000000000..49d7c170d5a6e965b34607189d6058e9290e38fa GIT binary patch literal 216 zcmZQ%xWe$i!G`exKSKrc0Xc>b>@d#%&)*jOZ`^#Caf&?S|At*`^$!G}AL3J8u)2$d zal%K9jz5ze?V4M7<|%LAf54tuUsrLf{{I8boh^S^7$YJzF54L<96Wruj^XRB29AjW z0!>Xvnw;hX?KrvN$_xpMlR8p@>0p~0>UjdZZ~kz(+iU-Tckc?tgE9+wg-^08te#NA zSiy3D`K+AAaYnHPj1x?X8C0Gr1ouzSQPDc6DaR20fZs7eOYz};2JH|BmZ=8{W*+~S M;=#2Y^#8=o1M&-)1VQEe{(t1) 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 KKs;>!?jQWU@wXuW literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..57321af8c5b7ec99e732473f6a6c7feb8e83eaa4 GIT binary patch literal 872 zcmV-u1DE^(0AvIIfII=<4*+-pV1IyRd;j-12Lt8|Z{Pp>^#8=o1M&-)1VQEe{(t1) z@%;b({&0JKZ}LER@_+ttdf&n05A#5O5TEu>jt^Vs$_FKZVFEhxbpoYT+6>RRjGSE)aab)%%7{5hJAVKk)zg z(0`u&fBt_svBEfbj0gXI4Ilmw-*Eo}#tj66VFBaMy#K%V`9%CaKgi??8RNnK^Yb=h z2gVKKM~q_#3LJj}9t0A2&+c%=c=546{C|!=@DG>wKl%8;JRcaDsDA?UUygtK2mi9KL_z2d~r~*dM4E(u45_jQ#+P5qSJT>+9$L zxI62A!e9RV1J3{d@#EvS;&{X2zvFR(%dd~};kWbuWK#Y82NVK<0m5Q0yPf|3rxcMv z6r%tS54xX^p6`L<4~kd6->_(eMhg&ya^v7(pTeO~5cz+5|Jm*r_rc%a;t{N(C_$tD z@W$`m%a?c_F!@gofBfP9-J|#a`8MA4D8aqDMgW6HkN@=V^nOR6|M1#Rz%af)iT``w zmghs^5Gn+_+xZU;J)S-LzH2$-gU=)qURdORuYrJQBp>Pb*XIeydoc#$N00jdAMss2 z(3qVvNeD)a|NozG3_FA7{6Rd@Ib=iq{{R0x|NeXzgT;Zsp^=EBL;3mt{J=#6z`+0T zAH*IJ5c~%SL{JcTl1v^y0pO4Xh&T=e4iF9)72-kQ1&9PfV}RH|;sEi0`XoL9SgFU) zf1qL@a|i|k0f?dS31SZ)*gSlI^n_8t;>Qs{&?p~B9Dp8lY65)9Lm>S@>;X{+jynKO zKzRRQ{s;g>XPLlwlmuck_=Wy3aT&w|hZw+4haNsLP5|(|6U+?{PFjQ2LKo_7&Ay@f8>DJBA9_tvxNXKfOy&9TsQztlC*;W literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..32233b0afe45a7fb6c061bec43e7484f157a5b64 GIT binary patch literal 873 zcmV-v1D5;&0A&OJfII=<4*+-rzy^M8{A$Fu+QgVz2J7<`Z(FrW5Mjt^V+$_M6v{vkh!k32*m@%!KN{x}Sl1&oS( zFCE}ugUkQs0pp*UgM|b; z@c92DkSJ%51}_|c10D|>_&i|95&T9lg7NXk{s8e8jDF_~SC1MJFBhS#hx?!W{9qmr zj8Fe}CkOz0?D5b4VB#_UMgQ#a2bxfO|Lgn#8Z!C+=pMg-c!CaJf$@QlfB*V}#(w}l zjJyya_4xDu+#U75;V=JuLFSPkUp_s4AB;R6BlHK4k00g3Z|DBVr}+GE3IqnJh`#Q3 z`~I9>g#}8C06aeIK0bTC2aY~3KK_2eq7fJ^BNNS!h6*iGfd|X`-~Pv9-@Xq1|L}#w zQ9=zL|Asd{&ffdL@#n_!uW{l3=l}1$|1q-np+l@%ax9J)S-LzFVE+hySk=ugg{B#3{%-~Z>I|IdQpeBX#Cnnx^%e?LF*IDm!+ zf#Sg6P{_nmA@~juh@dzaAN~XQgTf*o0pO4Xh&T=e46=8L2Y?nJ5ebe1VFQE%h6U)5 z_yuC8A3gqoh=Ifb;{n7__yn;BkL(^eNF2fefPg|M;PGRKU}zK$AU$Z*1o@PPLGppf z0q2gu6ObN1m_2|>Ao0!v#GoS)pTs|~{{#RcGswmSnqMFMe<6O1AVzTj;m#l+@#Ck) zCy0;8I1tG(0A?^H;P1ji5#&S3qw$EAhUEel2|z*V08pKX9zX%l#C(u&Si_*eG4eqs zAo7#Ke2n7wKtN;2f@GKFPlTg|ykPQ#REwkk=!3*IKm+JPZbSm}!ha`m2A9GQkcjk! z<>-a}QKBIz#A87d{dj@n^T+=cqXGwvGC?4b|B?e>iefL92m}xwFlV^g;9NKWG?%`+ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..ee2ecbebbc7cefc4ce8464cef44ffb79e475a0c5 GIT binary patch literal 827 zcmV-B1H}9R05=2wfII=<4*+-o@9;uE{6W+2&%z)W4nQ%#fB)~$9xxmrJw4#_{(mCz z7!?YM{`-U9^AiW3^Uvo8rTiW-7<3B-L;Pg;;Pt z0fIz77mn~SLFNDRefano1R@wWA4mV@A3xMSF@Au2ICu~DEVw}Npa0M{${x2_qJah9faG-~O z{u+!N9wHI`Yw`RHcsy_5@&G6Eo;V+XJVoLUeE;FZi}44woSYy5?~CXPVDbKg+IiFm zsJ-xw(f|(pesTB*0A5e=2dD4j|FC!F<+1*H!RC=4$Ic(W@B8rOadwbA{y#g6{sG{- z-#^|EaX=^#8BEK4!|%ua);ttRj6vb|ar|@s=YPN9pWnZquxQ}t|6L!GkMHmAl6WX5sw7|Dex!>07!#?ham<5@Q>gm zegIg21SU8LAsm1OA@B;s9zJ{h0th}30Ky;?J^?I2;=>Slz#t&;0u3A1AqE^!J+^{2--i~ FKll_*j(Gq8 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..12d90e652d46d9fd9a7c340a0019380a56eea386 GIT binary patch literal 763 zcmVq({sGbN29zQJzy>eu1UE<|0s{~tUw^2&By=d4=w-Z12dpNHU%O7_Q{9$r~jew=>!77fIp1i|M~y_J^grm zL-4>J1^>YS-~Yd#{2#yB1F$cS0ek?B?4mdMN6rI)XP}IK6F_jFhw2I$;5fJeLHJ_0 z81Q)B{1A50&)^sD2ev=(2aWUKDG&kRKmG&p1IB;&|AWvpG!k%t2ERN9j2s?d!QlA8 z<=>v21a>6y1rH58K(U_#!~nhy9~>Wn@dubdLF7vidI1hT4>0>9L>`$)x zLp%^955fPT?hM0!pUcJV2mWyRY~g@HB%}DD!XPjY@4X&O0WcIF0mHxld;j>%>-gyr z*qY0OL&5<@e-67Z#RyH&01t)_KmT$0_ON*0-~=@A&;S1)#J;=_7zl{L%{;SLL6@!{(CqNjD}2rIr{!!A37iZ^Uq(3ctME|fM2m1FaOW;KaB&> zazD%dBa8p%|AFG}FagiO1qP8CZJYaYq$TV~R_}qL} zGatdwU>F>K^*$pJkI%(pAO2wf_<94dNu%)vjo?-=|MVPYG7Jbjc;vB({x}4ofy0#p z5Fd~Kei9gupe`^t40HJ(gkVL2P!M?Y;BX8C0&r>=COjS>0nfy7@OT9R0Wb%Q3m-8D zl%7)veGGyDU=fT4gOXpBK9dZdKq3$h07Rr!B}sH~Fmw2bM*w#i1ajm+FFYiiAO?(d th2`jlgT@FAI1oI4ULbh<%f$!>oCX0X|0D*%6vPh(Fb*UTz%39i8~_#AO{4$- literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_8.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_8.bm new file mode 100644 index 0000000000000000000000000000000000000000..21b3d87865ec292a31aebaa209f4cf694b2752ab GIT binary patch literal 751 zcmVq({sGbN29zQJzy>eu1UE<|0s{~tUw^2&By=d4=w-Z12dpNHU%O7_Q{9$r~jew=>!77fIp1i|M~y_J^grm zL-4>J1^>YS-~Yd#{2#yB1F$cS0ek?B?4mdMN6rI)XP}IK6F_jFhw2I$;5fJeLHJ_0 z81Q)B{1A50&)^sD2ev=(2aWUKDG&kRKmG&p1IB;&|AWvpG!k%t2ERN9j2s?d!QlA8 z<=>v21a>6y1rH58K(U_#!~onrI6WtU2M3@)LCFUKmkbbb@Op*Ifx||KK5y^<_=Cy; z(2)NiXLA4*4{&B1{Qh734G4*Ne711l;qy>oz`^McSr7N#k0X2E|GoGGVpI=`9ufjS z7=77(AO`Tk$K!|R+QI1uUzdh||M-3-_3y-g;U8xhJZS&)2*>M!`N9510}0>!0f`3- z4?-T$8~%GZ4>XXBOCggW3<9B;52ygL8W5=Y>+w$uP?{--(SQDbnfz!TF!Jex%ZvZ# z|AFJdJ(vKe;PN00{xiZKH2(=n0+oIC&oOot2{CB732_M{M2oER< zkfHc5&%6ph$jmeR1sDPlpz7hznFs$FgnuXZhzEckFgyzQf+HJ`{vh-3#|4@=9Dn!! z{TPgXek&ON@W@mLV3S2+G0VWLVgKkj}(;hq+z&MaY0JML&fAF+aQwRV6 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_9.bm b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/frame_9.bm new file mode 100644 index 0000000000000000000000000000000000000000..c88b734a4a70677c8b4b9c0e3e4de653a2f93a0c GIT binary patch literal 725 zcmV;`0xJCh0MP>ffII=<4*+-rzy2w>n6`-9)|0vH$j5C8Ln z;y>Vle=i^GfIYAO=sp4icz{MG0KpLu)N}YaKY{~jfI=^y;t~D({&*ZefdHsLAfL_0 z|K<-Z`1od22nK=!0{`~Ohxe!dr|`)H0)c?Q|K{eB{(JiH|A)pu0Ki}T5DowN5;#A9 zvIpRwzyJk&0FCUTH~B}-1Ats0jDHhAaG;0k8Wn*61_uE6Vz?Oac;5UFegHUzV}9^^ zWB&kn-zE{k@svl0;6D&NXYr4KJw6x;2{=FlU!FoR5O8_Npd23;JhpJaAresh z!XPjY@4k8;oB#K}|BTL);s9zM6NY^lb=nXQe+(Xf{^RrQVELc_{y&L*cpo%>`UGS3 z$iO+U9vmO_sxXZ_Kpyo7alCK&?BG5!88QIp>-mX*J-8VS5C8e+uf-%F_Ml=kU;m%x ze;TlZ+QEq8|M~ymc+f%ZAP12EXYrm8J*F5+PyN6(_|6O#U&t5?Vi?a)^Z);|#&G9R zfI;EFF^prqKQMUy<1j$j;2#iCjm1aqV>FGMf@@F%gxjCdSa2n+(z H0^z^_*t$-| literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L2_Wake_up_128x64/meta.txt b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/meta.txt new file mode 100644 index 000000000..8ae3b093d --- /dev/null +++ b/assets/resources/dolphin/sfw/L2_Wake_up_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 10 +Active frames: 18 +Frames order: 0 1 0 1 0 1 0 2 3 4 0 5 6 7 8 9 10 11 10 12 13 14 15 16 17 18 19 20 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..07a63d6424edfe232cc55faf2756cca9485384c3 GIT binary patch literal 398 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 K0l^!}zz-0n&QtRM literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_12.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_12.bm new file mode 100644 index 0000000000000000000000000000000000000000..392905a559e718552e9db176de5b7cc96aee167a GIT binary patch literal 541 zcmV+&0^2HpaDrD0~`qk(=2CEZ z0f)!)C5Sy^VDfDd6n=P6c!CNF4@>zJeV5sIJm5g`(0}*gLcxQ{tS}II8iWXe@eB|E zXaM&oh#-OHDi9%W;4^FixNpGtzyG;6_}9XI3LFReE(ABI%&-txX8^(=_6Q6zF#`F| z%pwXHSUm6OQH)?em-v`H|E9r!(1@c42fM^ULUj;%Vgc))|K1Fy>Kb?a9=!ZL{EAT6 z1w0;~ugGj@5C#axa1?NQe1YPw7#HjRdiZJo@l^SIcmMtl`T!3dm;X)wiUZI8-@skq zAn}sVy5IRje7^$Wz<=Pt@uKiS==&f4;{o%GgT|Nt_kZdD@qLIqwsLTI)$jj*{(v4o zPrv8!!7vCsb@%_@{(}R60SDkA5P1JeqyPQ^#q2GC2cG?kAOw2~a6#jN_us+G|A+7a f<$u2eTmSC}k$89X5PN_N?%5stv_aF0B#1shQS}MQ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_13.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_13.bm new file mode 100644 index 0000000000000000000000000000000000000000..aa5353e988d02785f45759a024931abe7d580086 GIT binary patch literal 584 zcmV-O0=NAE07L@+fII=<4*+-rz#ahb2Y@^IANT|F;Rk?x!S}#`z&(Kbz(C*~0DZs# zKZbz<@kP z-_ZGk-W5OxmVe$YUN}5vRseX=FaHn!_#S((c=Kc+^8fh5iJ!HD#(O>ojswBL|KI=9 zyXAl$Ey0L`%fG>Z-}v0Uoqw17zfWUvCftXMrUwwc* zFdOIv=nzr}54)K^iv!95wSa!G^7S~tJCHd1P#$^^c)jswmy;2(?+ml*DY%6Tpaje?1R4~z?+C+R@JB71OJ%^j$i~g#Q}fdP!0e4@$U+bI{^s# z3(Nlv;0TA07lYt1>XG_?f57p%{4ekc#4b7D#lRpxNFUrDAR+mp#tHC`{fFbU28aM| z{|{g!U}Yi1z%rjedF|ox@OZ&E5DPI#e_na`JbB{LzW^w(J#=94pcIrmEe`+y literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_14.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_14.bm new file mode 100644 index 0000000000000000000000000000000000000000..837c6c71defd8be280776e7881817fc68276b5d0 GIT binary patch literal 610 zcmV-o0-gN<0A2$B|KVUk{Q*P)Fi?2?0rvt2kDwoLFnIg{_W=j^KOjHgdBMT)0R98a zDj@jq1I#KQ_}~M|;Q;Id;{Xp%fIlVx`hWxc9=`B>kL(_GhKz#+o><3>gVG5B{Tt>8 z4;U5;!}CwXJVamY_&z)lfe}FLAMe0Dt_H!Nasoqr`-9r~&_@VJU>l>0Krj6W95O)w zgJlpe;FN#haR>y*&>wsRUrhppDF-nZ{sYsG|A@(;VDX@2Js+@oPGA%6%nc+tE0kSi zuxJH>Lj(tm3qcDYD|B!X2tYh=AoBP#)&UWmL9h@2c-lSS_KA8RbO;895vb?`+9^1J zKqL|g{UbmRX+$ywAO;Ttt3U_0LJkiYg@OTE2b}yKQ3wz`aF!;BgU_B1DFg(5A@ZVV zdEoJzgVn$w5#o2S;PHin%RrqGp+G;L5P3mC<-mYJ58@9VCwyLBV0pmdiSdjD2SN@Q z8NBEa$N2-wgZ=&g0qGDH4O%!v8W;Zm|NDc@SRg@@1ImB)|6{@DKq!m?&N3Yo|NZ%| zgUlq?4N0o0xY&yEj|qzoQt^FED>06iEa;GRJCuV4t{^!eXG#1C2(0)+vGdoW=5 z-AFJnC>}#T4`yhz^{KA$Q(_^4>({vevs<0996^* wNHeH?5Gg=DU|{j6KxP1O`UB1b0N_Ay5Dfv)f$A(Dg8+f^cz{o!766F@+?Nvri2wiq literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_15.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..9ff56a5b6bd83d39c6585dafb084113387bf309d GIT binary patch literal 741 zcmV2edpMFaQvP#()oKH^LrM60rl^I503^{{iLsHy|)^ z0P@TO$c~T*6avV`F91BQ2NQrnAQ7N>U;*j-2b3ZK1#_7gbPDB+U69Vy z2d})|M3D~)2*KxjACw9NtPlv3%2fI<=fqYpC`JMNAOZbLLFM@O69xpR5TL;;kZ&wM zv48$|iGu=y7zjQv7}Uef!T-;u1c9OhgeEXZ92#R14<0x?VUR4PTpn0R2t2>t^7yL9kti^WY(e8% z2af;$0dNeKDo`E-93GeRaKs{72$D!_6M%T`oC3cYgo1+sguF|DVj0x`W)B_(0t2Li zLmEV1AFl)B{S1u`0c1CcR7V2<{{Q|V@qlR{6sUUupb^dk^nd z`{45EK&FvLi4;m6ARtKSAiN120pwi|{4+ccIs`5tFCG9~z98}UgU&C2CJn$IUIF-r z&jD@$i~=whF90}!d04o9jcmu#50PqKZJOMC(e@*~H;Gcu)Kp-FI{sIrE!~!3HfrIK{fDVi> zA2bOE00<&6fJcGxAQBVFfe%V z2?Po(1P}^v0C>zG2xA9~2ufh`6Nn_h0*o^N!C(S$6qr3?0P+rtY{w!sFnNW<3O&Gk zC9wT8f5ItaOfd_~*OhgYk2s}k& z0iYO!9@H2I{!R!IaNrw+4_FxNU{(lyfXFOW;C>`v@t9B|0P2CSOq13hXmkeVx$Jlghm1hk|1&b^56rE9-u*b zk`z`43?iih97Y&eJm674dC)Kbk@t^KHL{N x0tncHk_Vv>zzCfd@UEO1VEw>AQ=&RRdj|v`*MLBS&H_(>K!T0}e_#N^0q7Yl$LIh6 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_17.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_17.bm new file mode 100644 index 0000000000000000000000000000000000000000..80cb06fd3cbd753e5bf6f00f85a67bee5a0590ad GIT binary patch literal 492 zcmV)+z)6lKcGPUz(7I#PwD_arU3pz{4gKTMmK;S{sc4Q z5e5Umrk^9=vnU*SF-SfRq7N02#{ta&$w0Dd;runk9{8*#h#oL? zpn`|t4+otp@uYxyFYqOpfCv0UAb8RN;~c<20p|dpgVzBAfI@5F^SA(p1TP>la);yq zKzQLakl--Rh3F4FUyEM>0}MDG_)L^!Tu=xYJ>Zd5NxcMq_(?FdlcdpjPc#Z}#e8CO zMO1)BJ^*vTP$E}QF^t4QAoY-1fW%BFFu7zj3ZaNaf^Z;vQUGEN5a5hRZjc-Rw7dYp z@GDp(AySW^3;=~uQ?zglu?Pg@5T)Z>8J(~N;}N1AS>nV%!5)YJPa`p_olv4@E&zNWkwRctC_R7$4g-w>^KMRlm@CSfA05|Yd-vDL6 zrh}m*mk*cyGWGx=$00Bbd_3^slEc9uABn*Va1<7}%{%~tpfJ~gKoN{-w5JrATcm{vup{D1Q;0w-&W_W-d nPOl>XE1giJZ<8y6l#+*4fXD!a1qaL2M1)X4c|-t0*bo4Ks86b< literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_2.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..c014858502e8d153d61a39604e4128198513b5df GIT binary patch literal 463 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 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_6.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_6.bm new file mode 100644 index 0000000000000000000000000000000000000000..f46aabadf6b1ae21e3d61fe50b3691c7d6c063cd GIT binary patch literal 521 zcmV+k0`~m@00ja7cmu#50PqKZJOSVj0C)qy9suwMfCl~!-UT!tw-1;80uQ+4CIOF! zfyz7&Y&;SH_?!XCzz$pm1_c0`cmW1AUIhRSF`!xn!~k{xc|%|jFhIeE;s7}SJa7s*c2Y|^a2<$=eApaMJ1^j@| z!R>*_Kw@C=fpCHE0HnYqkPIjP=^qEYn)yh8Q6L}Kcrhml0>RW^6G#X858%Jqpc#ot zXmU_2n)tuaFnUfwJ=1rhkb4GHFf2>f6M#O8p7;QxRG9?>hP z5UwAO{(K(N3s4ZJgaOBc+JRIt3;{Yn3>ZDB03nQU6Qg)(hyg(5U{;R;55Nb=@PF;$ zpby**&oKZjYfqw_UW%0@E literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..07a63d6424edfe232cc55faf2756cca9485384c3 GIT binary patch literal 398 zcmV;90df8T0Ez(scmu#50PqKZJOSVj0C)qy9suwMfCl~!-UT!tw-1;80uQ+4CIOF! zgX<3jfPNA+B6Pzk4iom2tn#;^n#umj2)0D*(zKo1-Q8UO(h1Iz*AKn{saKo1xP zj)D&Wh99IJJP5=B5D$o;JZusHD1+iHh=9~65D0)iBuBB7U;*_bz<=hjC=9?K6dnWu zJph1^L?03l@i1UO`M~5LF))3=DKH5lctQ0hzET0@{85TQ@O2P)tcExaXbwsRlUEPn zt|0ftVKhMTgRKM}^sB~_0qDQLmSPWjKs;lZ2p~T25I6)Tz7J>+ysiLY@6g zO6mkG0L(-p09gg72t>kz1KNR9F$l2MLI7Go2tlG85s3g704*;7Fnj>!2c7~xfHC`l smN*Z2$Qet{2y6j)(Cp6;1F6;IUcmu#50PqKZJOSVj0C)qy9suwMfCmBpkAw5U0GI>vco7%~KIHHT z1UwyF2?#uA0Q$H{0pdas1jYg55Woy789)b&0yYnrFg&mmpnSl=;|QQxQ?mgFj3+_D zH%LT7<$*}RbV22y8i+mb03m?St`HayJ>`HQ!0=-bC@?+bz#*YeA@E2bJ>)?_LF)kn zj#5D@pd-aX!1M3}$K?YDxMXsX30DFi3Q$SHKg+Wz(67Z8-P9y0uM6tm<%3p;CwCweq`t<5GWL?94Aeas{f2wnmn4S)O| z0YKn1MNcxw0z(|^5sxL?E_DWKtbc>!Jr~=4-}B)a6tGph%)1~B0Iz@!4=gh~K|3LmQUL&XqM4gg-Ku?-MBWDtu45FU!Lnhgj>GYI4e z{Gs!Z0Y`xY2dQ*Ny* dI7Rs27DoVFD1bfW41$AzguwvwjseIfKm^${pj`j} literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Furippa3_128x64/meta.txt b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/sfw/L3_Furippa3_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_0.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..cf2120ff470ed140a0d47f8adcfedd64a8d20cd8 GIT binary patch literal 524 zcmV+n0`vU=00;vAfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyY2a$|_{Be1B z_1@fzk3(N>7S?zlxT`9#A0ogVTq9g@ew41d(XP=VSg~;Hj|y3A{t&2LqOX zBrqU(%pwvm*nHFC4;V-A;4y&t56?soFT@N!Fvf^Kd8K*sdIr~590(U zs62`y4-ou9;1~gjhQ)p~0s7tW2a<#X=NDfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moydAvUe z4CbAH(1Y5=_NBlv@yzD~LFxymuRHCPz&0?<#{z&4SzY_JCBSe2<6sB2t&TES06g#j z_w~xK7yu)fFdrfL=z-<Ggk>LU;sg2?ePEr literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_10.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..1354c78f2ce9d20f8e2b08bad75be024c8b4018e GIT binary patch literal 550 zcmV+>0@?im03rhafIt8H0hjbC;12+J1Hc{t@CSfA0pJe+cmu!?uZ39z`kHnw)XbGA?pLmwE%~} zy@2_@_h9ho7eF67`E+st0xO6;`d`8WiKJjOAoj6;sc;N`6C=RTdV%Td&i`d_4UCf|z@P)xSAP9Ta2yHddcY5D zU;pbRfN%rjV88?4*DAnZ2jegY$6OvT0{Fay9`gBW6i?!y5PR3_um}%|P7f3M=-eY# z4~*V0FA#gz^x&a{#3T>}`sy9SPT;0k$7k=NpgZVC3@91cn6=9t;9u5Rrbv=ARIF!Y9FT7>Rtoa!<%S{|EAhPy^%- zU-Ud~P-+4FLFENYoC^Sd7$H4DLu*4rY^Z^6M{0Si0fBpab3Vf�Q4{f5&!@I literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_11.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..c15289b5ec4e1bf2622a9d4e63dabf35ff48e539 GIT binary patch literal 572 zcmV-C0>k|Q05}5wfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyM;G#;+THpei>dh@^8Tmxey$#5tZuD#Z~-@3~0->EJGfjrMx z0ps8L-+TXkU;pbRfN%rjV89E+9y5$^JbiMk1^|9D0C@Gmn5fFIDpmcnf zp7Y|Lf8wRFCXWIH9}s$Q|M0MQ#tGvDk!Z!|WBz~Osj-6yNIo!fd1wMd0*DU=0WgS2 zzhU!Fh&*8v;JA!LzF#>fgs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyM;G#;ROdh@^8Tmxey$#5tD^_AbhQd|cDd7iKX+gJbk$zU7+ z_}DN2_w~xK7yDIo{EcjsC^iG+9t zG5_(!<>TT1B|@gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyM;G#;+k_jh%>`t!fpTmxey$#5tZuYH%D-P_9V->EJGfjrMx z0poe!-}is*U;pbRfN%rjV8D8}`g!-iRu3Oss{w!?jKCf~ukD||x(AP39xwv#QwTB2-kz-2Z#&A9`*hBC}S|m1Oa}! zhj8DxG5-V(!2oZpv;9-P&)-ErfIrv4{kCslF9AsiJ>$PR(fmQ=V;}zDAj zh=ayO`{U>Qm!A~-{}nBWM0gM&`2){~|Am9Z`ZNe2e1+v>{(s=9v4%hm;vX0}9JB!; zfkZG6F$lyYP(C7k0pke21;#KRDn5EoNznt#@P8;}0!8BoxB4D8C^Z27qVj^J&IN!U zi9LbjVGwwS;uf9}h`|@-K*>)zAo9E54gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moydAvUe z3?`9)(1Y5={-wY%@JxpTLFxymuRHCPz&0TApaa%de*H;s8~}LO0qv_}jFtcoJODkj z{<&5I01p{}J@5Tsc)$zd@)3K><)~3Vihx1yTdu$$De(u1{d8^-uLs5t5EqC&>HDxy z#$l2O0{wLk;lFTW{s`lo%LzKVeWf3Ji4Y~H|L0+JAW$9{FA_=CvCKmItp zynH?6s8%5JkwEDADJ3VxKL5o_Vh<<~d_n2M|H8rNK!QlLV)L>8Kk!u8fCSzl@q>ZO zKoS@bJmwJz7wkT1@du0}_;47&e23?v2bbao9~fl-J|Oo0L&fC=pdZv;P*l0Vum|yi z6Vx6>5eJBVA#e-;#6x1g8UX!n_yfs80rQUm34lT8z!$CjJ|q-(p*+9)`S=`IVh^MN Q1IPRcAXxy-TqLo801PJV%>V!Z literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_3.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..dc0fb9b79cc78fac3cda74455bf92526b8504378 GIT binary patch literal 529 zcmV+s0`C0*01X2FfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyx?2gVN&7l=LU z`|wc4VUh>}{dErEzi?yz2pxg|-&tq+r+uHkih%%suY>z+-oRc0k`Q~xes!bxgUH4| z{y4n6d_Ux zgMrIH5*QFX<`D@O>^^Dn2aF^5a2UXRhv%XPm*NH=7-axHAol-5#pMQ|AJkq@RJp*g z2l0Xv)E-3<2Z(+la0~#%Lt?)g0R3+G1Ia=G^N#@ufI;WL7p?q0Boud{Jiq(-_#9Yb T52OJD$NUK(SpdykB(Z=1M>Oxj literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_4.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..025477a7a943d7eac253ddddafe16f07fea0a0a4 GIT binary patch literal 571 zcmV-B0>u3R05<~vfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moy#QwTB2-kz-2Z#&A9`*hBC}S|m1Oa}!hj8Dx zG5-V(!2oZpv;9-P&)-ErfIrv4{kCslF9AsiJ>$PR(fmQ=V;}zDAjdC0$f zeE*X3;-7!wrLhN;2tGjb;s4=a^PoWk9JtssDFT@N!Fv JGgk>LU;r>`30MFC literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_5.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..89a4cd6acf85afc12c608940bc379d5b1464e61c GIT binary patch literal 574 zcmV-E0>S+O06GHyfII=<4*+-rz#ahb2Y@^Q;12+J1Hc^RUH~ZK7yu!Ef~mg&l>gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moyEJGfDao0 zJbV7%r~kLB|NUgJ0D0goL&5v*|KRcU%CHy#_{;(0wcGc8b?|ug!Q%igi^zRn|F`}> z_Xmu=T7?t%s0Y>D?$P#p(0JGDum}o#LE?X18-#1Y@q@$#;tzWM{1h>mWP$*{T|>BU z+!+6Y2Vj6V)>;0k-)HZlpg@lx1>$^;)8I6U}&_*gvX5J?w|UUom{{tBBA0Gq@?gHR9Z4=5^J;8+P4?4H2#D2O~m z@e6=p1|tMtl>;T`r09X;cfcM>5D%Pq2uuPGJ^;OM;qf4&y$R+2-_O9}!w`KS2p&J+ MNdm|QYT+e}07|gs< z0+a|ongB_2=NJzFKIZ&r9DHANybK@1{0G+80S$qCz@u&L?SMnp2bF384}p6D^MCHa z;m|ICK6moygT??~7m$PAUoAq3{8R!Ddi{0*0Z)iLPwS&_jd(sVc!0b??_b}7 zhBFM1Ko{$%cMbc4AMilz5C;0oKh-TT1B|@ZO zKoS@bJmwJz6c31>KzPDGhXITS$bNbtd43>a@rF<&UNC!qq2ls`P!H-aC@NgwSONHx z*d9d@2Z(+la0~#%V2kpg57zI1Jd_|GIPegd1Ri_=df&t1K}UKM%m2ThfyIU(`alpo Of54IjkPOwrOBeu5#pKBV literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_7.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..fb6d9bd292c739951e00a03612b86833b5222191 GIT binary patch literal 655 zcmV;A0&x8S0E+_ufIt852lspgKhS;iz(e>4-y8%#zgs<0+a|ong+SfFdhJW`Tz5N zG!8y5l&I41Fni(o&u{_Gwd0_X$Y z;r`#tqmT#@TtV!i9sF8g4;lbH%EMoU*a72!{{z^>Ao1V>%lHpousn6}Tm%I;Keha8 z!Gqy}z&`8v2b5|V0QG~`KqeZz1_1_$1IIKkPhxmM<>HaRIxwL6N<3fuygmU@qTo6p zfdCwjJl-FK2XjuqXhH2_|5D%>|E6Dop!IgYySuI5*PZ^#;2RlcYk@$ud+faK?%r2^ z{Yh{f38q@W4;#+@|GWQc|NmJm1AreJ1_RZ<)6c#7xnKX+D!^a|<1h!0tNUl~?xlau zxIAD5@p%ucy{-Q-23Po(%TS_!6#)9KcYfWnpR4>=>#zt4d_m%WT^w(JUJr~OATJPm zcdN6rHKZgN~2g{H1l72zw_<@JU89)z^J%7;gc|oWL^#_y{ zE^sUX{9uIj2a!ZU;vZQboc=Hj0K`LLzZwR5d3lj=zxR9rof1`a$*CIJVZ0A6_y p{rn^(6nCV8VdMYr=iqV&z2mSC6afRr{4F2=@9*sa->Za{FaVQOM?U}n literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_8.bm b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/frame_8.bm new file mode 100644 index 0000000000000000000000000000000000000000..a0377f635fe25d6ae38494e2e28ec168af6f1f3d GIT binary patch literal 645 zcmV;00($)c0D%Jk|NZ~_|M&_Z3G;);_z%CBJbnQF`UCIo0uXceiGk!D-3L^J| z&NuYD3?IUn5PMnjAN{TZ8v=R)3!o2ykjtZx z2oan?^A?x`#()o+{4T%`90&LxTmX500q^tI!Eg{1;QrU~uLci>2LSu4*dQSCjYA+F zuzJV@!&iX7AkhGL=7s6({)5lOBY<>aLG+Y(zxjB40;5O3bU^|DIUaleOZY%_G`t3c z9@a1QE&-43Wq2A7R`StyE@tgPm*Gn$0|I`PJ1Jg=*53Be4-PiB> zxcs78g&U0(KsK)bH`m+QhsJ?LfIw5?4-@+6|M(h^d|>ebc!S=rxCIPm86bc!*HG>o z_Xa=Uf!H7o^_G9CciH>ss1OJG_&>JI>;>Q{AqTv7=UP9AJd9)i1Ro%I@c;0zc%Mdr1P_qBtbfn^6*e%)0lY)w2P2k)zyEwE%~}y@2@7+&i#%bPJ#liT>hU9DqQI;tz5V#iju9pabT=3$O#n z0saTq03Kh!d~4vi2nuk2XZY6x2g3t^ebw==1dM7K0QG~`KqeZz1_1_$1IIKkPiOQV zekmLSqY4kCqs9Nr!@+|^z;rScHu4_9LwW0+&T zdEe}=0kM{5xD*RlUh7@&-DP+0)RzIko@cB8@$da_z5l+i|Milhm&hJ9dh7xMpAdMT*GK=s z(}Uv&hzrCX^l|X`zcBd(0e-rNaNIaC_yj`10B@|b{Zqcr-$g)xKi9$iwr^lB0Z9lw zuABcR@;tv=__%1Pk`El}cen>q32l9qc zBw8?gf1%@YgHR9Z4=5^J;8+P4?4G{xc^E_jf@01)tm2VkEkh=8RH9=ZSk literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/meta.txt b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/meta.txt new file mode 100644 index 000000000..1d415b4b8 --- /dev/null +++ b/assets/resources/dolphin/sfw/L3_Hijack_radio_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 8 +Frames order: 0 1 2 3 4 5 4 6 7 8 9 10 11 12 11 13 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_0.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..db283e81fbb46514ec3a63dedb87bba98daeb086 GIT binary patch literal 611 zcmV-p0-XH;0AB(C9v}oX06F|W|M~y;20#3`JpT|Kgajs8?>{Feln0y|4Y0(-C|H1b ze#7Yjgbl!hQGMmP^FfkZ{(4=*JIk|}|Q#BCT6`h2W`agbO8 zUe7-Od}#U4@H~1P4h3P}!192K27NKCgT@U8C!TZU4=M~g;13_bAXDh;6iC5=_{D9tfb60|+AxcxrGc1{wqGfrH#I zFh$UV$NuRUAk1~a@(CBh2dw^-#2!@PD1**04;T;f05=#8I0hgCg9FQe4>)8L9C!=} z{9rZ!dP0r`0JvZvKI!m1W`WXx!-Zq+;mlAa0)}!0#r}Z!AaVFSz#fwWuz&~_F!*F( z&`?Nc0vHcJ<_;Ga2dn}n4>*6q3viYd#bPmN1h5=j4j=vtFyjpbZXoffD~B~v1BMS0!Vg3qc>D(j1F-*q3?7~ge*j`T1L%MXMh`v)KESLHh=bRFH!b|) xaRBTC(n22@;1qe0==1{c4`bMf2Qi0(z%7CJ5D(+ROd0S!garY-UjV~52cXVC@<9Lq literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_1.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..c600743700f179ba45f3713af0d427024c0b683c GIT binary patch literal 614 zcmV-s0-5~*0Ad0F9v}oX06F|W|M~y;20#3`JpT|Kgajs8FFofaln0y|4Y0(-C|H1b zeuL=&gblVi*Vs{7vFNSUds*4@7v6$R3bLgaSUV zF#4v(5Rn;sJp2Lj&VPa9(BN<@4)+I)1W+^Sjbt7$XfQo8K=Po&t^o1;0t9}2Cs^b# z5MX%#2x1@s2bDts1^HjW=ji{x1RkOF03G-r)({Yz#6QwFEXW@hfDq_6kWYm?3^Cvk z;1_}qJp>E*UmSqstPzL>unH*g!9eZ-fnbXWT4E0>2l(zh5kV*h5JnpC)ZkDIGzZxO z2e@Ehi=hXP{n9W&nCpY&5-)@gS^X)9JgLG_2b^FYFdyUqZZI5h3_u442bTaIaL6b) z@E8&Jz-$2Yg&Yb2aKJ!))8Kl|1Em3n3dh~Un4n4p4CD)o{Q>YmT9()Xafmk6C2d@Bb zTlvJ|0oVtmgg!ICDDxxH=mp>&$FUF&V-E*_TLbVQAIF54GvIp&3Ilk)0fuf5K-I|j AUjP6A literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_10.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..694302a9de7918f0009e738f417aee84929cc94a GIT binary patch literal 576 zcmV-G0>AwM06YQ!9v}oX06F|W|M~y;20#3`JpT|Kgajs8FFofaln0y|4Y0(-C|H1a z{(s=~fWiji4`F%WAQ1rjUtk&Vc?bqT4?=ju_#g0jNIn4(1Ld6mKx2@~WCOWRcd$IXkvtp&@n2DjkU{6tfMm3Sv7B52LevrY zgU1zU6^t^#@(=)wL;xW1;?zOo0|%$0|NozZ#!FIw90UR&2ERZjwde=N0uPG_eBrP! z@P0?-|HA*l?pz#HpjbYjc}IXlfP;g}B_y0cKUeTrjz$4sj6g3C1o(wV{Xc*(NrWvi ztUxmYvj0ch#Gn{Mlud(R1c^Xl;P>4E2^v4~ki;MmC;`4`{>`4n793gXT2=jDH}1^mv2X86<#s1EcsD2sA<>MHmz^P);C_ z@!(+hKM_1<_3cxEV0<=bAA8&^YMpFP7%pt(_jsnU6)DW1% zh3SCDumk|1^+<{YKnn{Z68!)T3&0ix064&W*c=DE2gD~q4FZ>7A20}z6te*NkV^oi O7ze{pY5-D3m;pc_5AB-( literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_11.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..246b955cf93c8b6abccaef6f44dd1b8fcf01e296 GIT binary patch literal 585 zcmV-P0=E4D07U`-9v}oX06F|W|M~y;20#3`JpT|Kgajs8?Qy>+`d;`bH6T!eM0P%w<1Ri}T21`kR2cO}nAoays z1!4~%0SrU{Ao1eVLF4$pgU`|b|IfkWC8+{O@m~j+0PoNV?RY*h%fLPCA@jh%>;d^7 zmBs*~5Cazn6)3=ef#)6p4gwAjER>Uh0fGMkVmTNEf-wLj3VeT`_-76P!4P=FBngp# zWDVEGEIQ0!9He2gc|SKmmpW#vuTKKp=xL2Z$g*0)HTTR-hpA4v0Ki zg9Hea2Rs810L%a+4`{>`4p8U;;6d*i1d2RL0uOj(kXAFnh{1uR5fHe*p^}1VqsIZm zfrH%qa1Q_^jv}!rAU$s%2pB!Z;s7b|2t*?wR*1|)>42l~90EraAeP1)4?l(-AV2|! zgvuN*KlUF0V-Ny|&w>9BkK_ITSXmIDAIxBNfCCG_76bqw`mi_;cn^q9f*J)bz&>CR XASq@6^B|T1N&FxOY7IaNNYel)t_A1i literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_12.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_12.bm new file mode 100644 index 0000000000000000000000000000000000000000..b6fb1130bb895889494bb5ade77a02bde7d64d3f GIT binary patch literal 571 zcmV-B0>u3R05<{v9v}oX06F|W|M~y;20#3`JpT|Kgajs8?>{Feln0y|4Y0(-C|H1b zf5GVigbl{$PW`(gUcXM5qN{j$Y?L&5Mnlr2>m`&KzT+3=VWyFD^hl;o$Q4Kxh#Hc>DwBo`b-F<2Zqz;2w~8Fg*W?^nruNfdGyx%sy0bd3hl7 z2n4a7egOE<^PlJpav4m3cPZ}m2cMEBgMfZ3>M>FYJhPuD21`gQ8O6XPEkRGD0~Kf$ zj55IT5CDus03h+=)Is9|2dAU||DS`#OHzOw1Ogxizd$Fo=m*9E4~qzV;jl08en;j1 z!vDeUTpU!OSU#Y6M}R|sgM-T@B%DA$SMXSlMgd@qKravk_=QLPKW_?DSVGep!~-xZ zFZ6x9N&$p9MA$X}NR$R14}H)ek)!_^3_<|{fI$Xg4-i1WJ|FlPJ?l^qd4E6RvIdAm zpgG_ekBFo|_KZP5KREVHN0I;$lFVFzcya8Z91B?gFfxvsfd_r^(&?$BS^8kqfOE3?a1h5KGfP6Iu JpamppfE4a4{Feln0y|4Y0(-C|H1b zf5GVigblZNCreNFnGtz;#ePmJcH%p#C)WX z@VLR?5QvR~01sUxE&&9G1Ir*$5qN{k$Y&TQ9>x3~evkkDfAWB6JP|>8fE)Y|7=%=KG%$PcLE|5b#6J}9{zM^_zb^tK2MT9Le2aW^z$AG~B z;`StforZh`8I0jlDDeliXbLdlK-vT25P(3S5J8ycfTRx?z&;~TP&onw9xTBNh$LV! z=+Hdia{znBB#A=cKmqeuI0yhC~6P5ffOzqZ9xjyjs2bT_F4@nFI7?mIP z{sA9@mq;F$2y_GS!!3+4h#>XC3JV8-g~kEz0H-gD;RU!A$R3bNfD~Zg$SlGP4?xk! B`X>MY literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_2.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..1025137e462b44c2341e193471c8b457d4451c1e GIT binary patch literal 618 zcmV-w0+sy%0A>OJ9v}oX06F|W|M~y;20#3`JpT|Kgajs8?>u;K^nyrYW-I1e0-Lm*#YJs^FyKMwk_VLr9dHMa;1D45={mx!Dc}Cya0zmyn=iw;9-vd zhXDr%rh*0hFOL9nRtUrb*aZ}L;GlO12ZI0!7=(ZxbPw^|cp&kBs0I*58t~NMPz*E& zVFL%dXkd$>2ao;IFhQ8>gX9t~gb#84DTq9&!chmDU>-1URk2L^%fAlv|X z!yusJz+hlI$PIuVkfVV>E*J<7+I|mNpmd-x;aKgt^AKo+Mj6N#7y1L>f!yPh0D4Rg z!T=yx&gKz=K|vv$2w*(_m^o`OLFoXAgU%oDi|{3daafF60W1d>1Bd^Ma5%$38;Cq= z3gdudj6(*8h6o-aQh;wT6fk&}5PBf<$KWU`;s1aP9-a(;0^tMTA4C9BFnRDX_5~QI zgdU@F-_AS&K?kISJ~O~5^CQ=Y12{qIdl3NUAo1rIhu}azj0_$DI0vwRpf`_!a7M%c EAd|oRBLDyZ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_3.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..e623a1c0fa5cba36a8a2f364e19c96d49a644e13 GIT binary patch literal 608 zcmV-m0-yZ>09*n99v}oX06F|W|M~y;20#3`JpT|Kgajs8?>{Feln0y|4Y0(-C|H1b ze#7Yjgbl!hQGMmP^FfkZ{(4=*JIk|}|Q#BCT6`h2W`agbO8 zUe7-Od}#U4@H~1P4h3P}!192K27NKCgT@U8C!TZU4=M~g;13_bAXDh;6iC5=tAQr$VqsIjUxHpA@EFo!#Jg6VzxbR>SMhK(?j5Xn@z@Qjt54r{qaKOPA zLje*Cq+o+F*9XWXUkDuRra#0%CzE6f=-6FZ2h%Ul;_y9+LyGfCv^pvlyBR z2@K#v0q6X|@!{b0fJDLP4@eEpSXUK@#h?7QS@!$>1e>g3O uJ!B#Ao&iUh9*jUOfc8CzfO8OdbOOvDfdKw6Fn9#m9>M~E-aG}tnS;Vi*Vs{7vFNSUds*4@7v6$R3bLgaSUV zF#4v(5Rn;sJp2Lj&VPa9(BN<@4)+I)1W+^Sjbt7$XfQo8K=Po&t^o1;0t9}2Cs^b# z5MX%#2x1@s2bDts1^HjW=ji{x1RkOF03G-r)({Yz#6QwFEXW@hfDq_6kWYm?3^Cvk z;1_}qJp>E*UmO7BtPzL>unH*g!9eZ>QUr`arXcd5e~#n9fKC`9kPsM1NMJPVh<{CltJehf$JbY$N=16IN%t74h#=206gK4 zP;uZeBk_RP0qF`j6awLZfZM0Q^_mAt0}d6ByMZx4lnNQh7Z>^i;DP(#a{ziw4#EH+ zSjXV;gF!(doCsh%|Cl&@Fdnc7m^|VC2wmb>R~3lGpc24wa5#VXEW?a65x9fKpsqLu zI36%)cwm9zB`5~-0mCl|VF#iQJbnX%1K5AS1`kgLKY{Ro><^*OJ9v}oX06F|W|M~y;20#3`JpT|Kgajs8?>u;K^nyrYW-I1e0-Lm*#YJs^FyKMwk_VLr9dHMa;1D45={mEOrk1|zUOhybKu^WbCb3c(17 zJ$M6h-_9ox4!}JmA@QC8N0}avKraCHJ&1sF7{Feln0y|4Y0(-C|H1b zf5GVigblZNCreNFnGtz;#ePmJcH%p#C)WX z@VLR?5QvR~01sUxE&&9G1Ir*$5qN{k$Y&TQ9>x3~evkkDfAWB6JP|>8fE)Y|7=%=KG%$PcLE|5b#6J}9{zM^_zb^tK2MT9Le2aW^z$AG~B z;`StforZh`8I0jlDDeliXbLdlK-vT25P(3S5J8ycfTRx?z&;~TP&onw9xTBNh$LV! z=+Hdia{znBB#A=cKmqeuI0yhC~6P5ffOzqZ9xjyjs2bT_F4@nFI7?mIP z{sA9@mq;F$2y_GS!!3+4h#>XC3JV8-g~kEz0H-gD;RU!A$R3bNfD~Zg$SlGP4?xk! B`X>MY literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_7.bm b/assets/resources/dolphin/sfw/L3_Lab_research_128x54/frame_7.bm new file mode 100644 index 0000000000000000000000000000000000000000..c9b99a0144864d530c76fb9864ad23ebd5351253 GIT binary patch literal 585 zcmV-P0=E4D07U`-9v}oX06F|W|M~y;20#3`JpT|Kgajs8FFofaln0y|4Y0(-C|H1a z{(s=~fWiji4`F%WAQ1rjUtk&Vc?bqT4?=ju_#g0jNIn4(1Ld6mKx2@~WCFPFaCvzmcsK=M9x!DfgU_V^$!P^*4==+|N9GS4 zRiIWN@&FLTKmrdQEkqtai}*bKAOHOP9x_^xB!3m~d4LZ60G`)_;~cyL-ohU|3=Y5_ zk@;L;3LyY7aB)(M2lyUw;1J*-;PS~yI1m^g@D?MHfLJ3C0zjw7`TvG+;0zLB3ruSe z49ETl0O^aw6e02zP;f$bQAfyx~KJP1AGK#@m@Ktb;ek_yInF&Hp3f+80f6f#gv6nNk` za4>tHjsf5Vk;GOd1P86-;R6S_yg&s$0SJU-3eg#eeJ~V$1As{4gc8`pf#>kUqzC{o z@R>t}=l;Xs3}OIK`S3sC@%(?l3kxC?1Nn>&umE9r0>FR-A65qe?*Z`%&_h6_*ayr4 XBn2$MK4cQWDL;e&?LnvkNg7}UlQy?A6d%eNqrfDR ze?Q`~28cwUIp7$Nh@?RFj6p!-;A;pzV^9dk@(2G%h&`c_NC$vAKY@UQL?R?nfkPz( z;t3BP1`l)b6UKhh5m>|)B?JeeM4({z7mxs~0{Feln0y|4Y0(-C|H1b zf5GVigbl{$PW`(gUcXM5qN{j$Y?L&5Mnlr2>m`&KzT+3=VWyFD^hl;o$Q4Kxh#Hc>DwBo`b-F<2Zqz;2w~8Fg*W?^nruNfdGyx%sy0bd3hl7 z2n4a7egOE<^PlJpav4m3R~_sRKO|2F0IUPX45SiyXFgC2mXKB;^87UgK9CGmpjIIA z01(7L0uLT7L>@nj_&og||NQ(OGFp%%e--d~fDZitp4Wrp9J~YG!XG>g4!|Fg`CMQM zApkLOaZ-#2_#ScK5a1x-^2td!5Eviu79){>SR)VuK&Qv~|Auhe!j%>fw8pUj%zxl; z4w$?_LZBEzSWSaq1dIY`4~@_ufCCH%j6wkdfI$Xg4-i0r1pYwwtw2HK9T0f41_%)- z4tNG20hj9HGzyz=Pg22^4sg1Rn6oAgpJD5rYFrA|Y{sLnQ>!M~(xB0|&YI z;2r=;97SSKKziOj5HNd-!~j#^5Qs)Vtr3`q(*Z}|I0TL;K`o3p9)AovK!5`e36wZq zf9yU0#vla`p9B6MAIJOvu(BaQKbXMl00tL;EC>KW^ 0 - assert min_butthurt >= 0 - assert max_butthurt >= 0 and max_butthurt >= min_butthurt - assert min_level >= 0 - assert max_level >= 0 and max_level >= min_level - assert weight >= 0 + assert len(name) > 0 + assert min_butthurt >= 0 + assert max_butthurt >= 0 and max_butthurt >= min_butthurt + assert min_level >= 0 + assert max_level >= 0 and max_level >= min_level + assert weight >= 0 - # Initialize animation - animation = DolphinBubbleAnimation( - name, min_butthurt, max_butthurt, min_level, max_level, weight - ) + # Initialize animation + animation = DolphinBubbleAnimation( + name, min_butthurt, max_butthurt, min_level, max_level, weight + ) - # Load Animation meta and frames - animation.load(os.path.join(source_directory, name)) + # Load Animation meta and frames + animation.load(os.path.join(source_directory, name)) - # Add to array - self.animations.append(animation) - except EOFError: - break + # Add to array + self.animations.append(animation) + except EOFError: + break def _renderTemplate(self, template_filename: str, output_filename: str, **kwargs): template = Templite(filename=template_filename) From 2deb648ec29ba26f821b45b3ffa7f5671614076c Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Sun, 8 Jan 2023 22:21:59 +0100 Subject: [PATCH 10/64] logging to make sure --- applications/services/desktop/animations/animation_storage.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/applications/services/desktop/animations/animation_storage.c b/applications/services/desktop/animations/animation_storage.c index f7dbc04e1..4f9756945 100644 --- a/applications/services/desktop/animations/animation_storage.c +++ b/applications/services/desktop/animations/animation_storage.c @@ -34,10 +34,12 @@ void animation_handler_beta() if (settings->sfw_mode) { snprintf(ANIMATION_MANIFEST_FILE, sizeof(ANIMATION_DIR), "%s", ANIMATION_DIR); - strcat(ANIMATION_MANIFEST_FILE,"/sfw/manifest2.txt"); + FURI_LOG_I(TAG, "SFW Manifest selected"); + strcat(ANIMATION_MANIFEST_FILE,"/sfw/manifest.txt"); } else { snprintf(ANIMATION_MANIFEST_FILE, sizeof(ANIMATION_DIR), "%s", ANIMATION_DIR); + FURI_LOG_I(TAG, "NSFW Manifest selected"); strcat(ANIMATION_MANIFEST_FILE,"/nsfw/manifest.txt"); } From 0a1f137b7784d7a4961c04286d159401bf243b3b Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 19:32:49 -0500 Subject: [PATCH 11/64] fixed infrared text overlap on remote creation --- .../main/infrared/scenes/infrared_scene_learn_done.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/applications/main/infrared/scenes/infrared_scene_learn_done.c b/applications/main/infrared/scenes/infrared_scene_learn_done.c index 88e3e5a98..ace9bb250 100644 --- a/applications/main/infrared/scenes/infrared_scene_learn_done.c +++ b/applications/main/infrared/scenes/infrared_scene_learn_done.c @@ -9,17 +9,17 @@ void infrared_scene_learn_done_on_enter(void* context) { if (settings->sfw_mode) { popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59_sfw); + if (infrared->app_state.is_learning_new_remote) { + popup_set_header(popup, "New remote\ncreated!", 0, 0, AlignLeft, AlignTop); + } + else { + popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); + } } else { popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); } - if(infrared->app_state.is_learning_new_remote) { - popup_set_header(popup, "New remote\ncreated!", 0, 0, AlignLeft, AlignTop); - } else { - popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); - } - popup_set_callback(popup, infrared_popup_closed_callback); popup_set_context(popup, context); popup_set_timeout(popup, 1500); From 7df2f4a8652a1f230cb0da204f16eab4259c09cf Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Mon, 9 Jan 2023 02:45:48 +0100 Subject: [PATCH 12/64] Delete manifest.txt --- assets/resources/dolphin/manifest.txt | 359 -------------------------- 1 file changed, 359 deletions(-) delete mode 100644 assets/resources/dolphin/manifest.txt diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt deleted file mode 100644 index 244dda579..000000000 --- a/assets/resources/dolphin/manifest.txt +++ /dev/null @@ -1,359 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: sfw/L1_Waves_128x50 -Min butthurt: 0 -Max butthurt: 5 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Laptop_128x51 -Min butthurt: 0 -Max butthurt: 7 -Min level: 1 -Max level: 1 -Weight: 3 - -Name: sfw/L1_Sleep_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Recording_128x51 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 1 -Weight: 3 - -Name: sfw/L1_Furippa1_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 1 -Max level: 1 -Weight: 3 - -Name: sfw/L1_Happy_holidays_128x64 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 3 -Weight: 4 - -Name: sfw/L1_Read_books_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 1 -Weight: 3 - -Name: sfw/L1_Cry_128x64 -Min butthurt: 8 -Max butthurt: 13 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Boxing_128x64 -Min butthurt: 10 -Max butthurt: 13 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Mad_fist_128x64 -Min butthurt: 9 -Max butthurt: 13 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Mods_128x64 -Min butthurt: 0 -Max butthurt: 9 -Min level: 1 -Max level: 3 -Weight: 4 - -Name: sfw/L1_Painting_128x64 -Min butthurt: 0 -Max butthurt: 7 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Leaving_sad_128x64 -Min butthurt: 14 -Max butthurt: 14 -Min level: 1 -Max level: 3 -Weight: 3 - -Name: sfw/L2_Wake_up_128x64 -Min butthurt: 0 -Max butthurt: 12 -Min level: 2 -Max level: 3 -Weight: 4 - -Name: sfw/L2_Furippa2_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 2 -Max level: 2 -Weight: 3 - -Name: sfw/L2_Hacking_pc_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 2 -Max level: 2 -Weight: 3 - -Name: sfw/L2_Soldering_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 2 -Max level: 2 -Weight: 3 - -Name: sfw/L3_Furippa3_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 3 -Max level: 3 -Weight: 3 - -Name: sfw/L3_Hijack_radio_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 3 -Max level: 3 -Weight: 3 - -Name: sfw/L3_Lab_research_128x54 -Min butthurt: 0 -Max butthurt: 10 -Min level: 3 -Max level: 3 -Weight: 3 - -Name: sfw/L1_Sleigh_ride_128x64 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 3 -Weight: 4 - -Name: nsfw/lvl_1 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_2 -Min butthurt: 0 -Max butthurt: 14 -Min level: 2 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_3 -Min butthurt: 0 -Max butthurt: 14 -Min level: 3 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_4 -Min butthurt: 0 -Max butthurt: 14 -Min level: 4 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_5 -Min butthurt: 0 -Max butthurt: 14 -Min level: 5 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_6 -Min butthurt: 0 -Max butthurt: 14 -Min level: 6 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_7 -Min butthurt: 0 -Max butthurt: 14 -Min level: 7 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_8 -Min butthurt: 0 -Max butthurt: 14 -Min level: 8 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_9 -Min butthurt: 0 -Max butthurt: 14 -Min level: 9 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_10 -Min butthurt: 0 -Max butthurt: 14 -Min level: 10 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_11 -Min butthurt: 0 -Max butthurt: 14 -Min level: 11 -Max level: 30 -Weight: 9 - -Name: nsfw/lvl_12 -Min butthurt: 0 -Max butthurt: 14 -Min level: 12 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_13 -Min butthurt: 0 -Max butthurt: 14 -Min level: 13 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_14 -Min butthurt: 0 -Max butthurt: 14 -Min level: 14 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_15 -Min butthurt: 0 -Max butthurt: 14 -Min level: 15 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_16 -Min butthurt: 0 -Max butthurt: 14 -Min level: 16 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_17 -Min butthurt: 0 -Max butthurt: 14 -Min level: 17 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_18 -Min butthurt: 0 -Max butthurt: 14 -Min level: 18 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_19 -Min butthurt: 0 -Max butthurt: 14 -Min level: 19 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_20 -Min butthurt: 0 -Max butthurt: 14 -Min level: 20 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_21 -Min butthurt: 0 -Max butthurt: 14 -Min level: 21 -Max level: 30 -Weight: 9 - -Name: nsfw/lvl_22 -Min butthurt: 0 -Max butthurt: 14 -Min level: 22 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_23 -Min butthurt: 0 -Max butthurt: 14 -Min level: 23 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_24 -Min butthurt: 0 -Max butthurt: 14 -Min level: 24 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_25 -Min butthurt: 0 -Max butthurt: 14 -Min level: 25 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_26 -Min butthurt: 0 -Max butthurt: 14 -Min level: 26 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_27 -Min butthurt: 0 -Max butthurt: 14 -Min level: 27 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_28 -Min butthurt: 0 -Max butthurt: 14 -Min level: 28 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_29 -Min butthurt: 0 -Max butthurt: 14 -Min level: 29 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_30 -Min butthurt: 0 -Max butthurt: 14 -Min level: 30 -Max level: 30 -Weight: 9 From d992b894ced84916d91da608a31e3d496884b25b Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 21:04:53 -0500 Subject: [PATCH 13/64] free settings from memory --- applications/services/desktop/animations/animation_storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/services/desktop/animations/animation_storage.c b/applications/services/desktop/animations/animation_storage.c index 4f9756945..410da1290 100644 --- a/applications/services/desktop/animations/animation_storage.c +++ b/applications/services/desktop/animations/animation_storage.c @@ -42,7 +42,7 @@ void animation_handler_beta() FURI_LOG_I(TAG, "NSFW Manifest selected"); strcat(ANIMATION_MANIFEST_FILE,"/nsfw/manifest.txt"); } - + free(settings); } static bool animation_storage_load_single_manifest_info( From 46655abe072d3c50c0f3c72602b45ae314b75b71 Mon Sep 17 00:00:00 2001 From: jbohack Date: Sun, 8 Jan 2023 21:35:45 -0500 Subject: [PATCH 14/64] restart the flipper on sfw setting change --- applications/services/desktop/desktop.c | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 7a7613a73..876f0bbc3 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -152,6 +152,7 @@ void desktop_set_sfw_mode_state(Desktop* desktop, bool enabled) { view_port_enabled_set(desktop->sfw_mode_icon_viewport, enabled); desktop->settings.sfw_mode = enabled; DESKTOP_SETTINGS_SAVE(&desktop->settings); + furi_hal_power_reset(); } Desktop* desktop_alloc() { From c1921c96a664d28fd055c1024412bab9e2340523 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Mon, 9 Jan 2023 05:26:22 +0100 Subject: [PATCH 15/64] Compiler part done --- scripts/assets.py | 22 +++++++- scripts/flipper/assets/dolphin.py | 87 +++++++++++++++++-------------- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/scripts/assets.py b/scripts/assets.py index 75bebcfb4..f09a895ab 100755 --- a/scripts/assets.py +++ b/scripts/assets.py @@ -4,6 +4,8 @@ from flipper.app import App from flipper.assets.icon import file2image import os +import sys +import shutil ICONS_SUPPORTED_FORMATS = ["png"] @@ -23,6 +25,15 @@ ICONS_TEMPLATE_C_FRAME = "const uint8_t {name}[] = {data};\n" ICONS_TEMPLATE_C_DATA = "const uint8_t* const {name}[] = {data};\n" ICONS_TEMPLATE_C_ICONS = "const Icon {name} = {{.width={width},.height={height},.frame_count={frame_count},.frame_rate={frame_rate},.frames=_{name}}};\n" +valid_dirs = list() +# This will not stay, dont worry! This is temp code until we got time to rewrite this all +we_are_here = "\\".join(os.path.abspath(__file__).split("\\")[:-2]) +dolphin_external = os.path.join(we_are_here, r"assets\dolphin\external/") +potential_directories = [d for d in os.listdir(dolphin_external) if os.path.isdir(os.path.join(dolphin_external, d))] # Get all animation directories + +for i in potential_directories: # loop through all of them + if os.path.exists(os.path.join(dolphin_external, f"{i}\manifest.txt")): # check if they contain a manifest.txt TODO: This code should be moved to wherever manifest.txt files are validated! + valid_dirs.append(os.path.join(dolphin_external, f"{i}")) # append valid directory to list class Main(App): def init(self): @@ -246,6 +257,14 @@ class Main(App): else: self.logger.info("Manifest is up-to-date!") + # This will not stay, dont worry! This is temp code until we got time to rewrite this all + global valid_dirs # access our global variable + for i in valid_dirs: # We can copy the manifest for all of the valid dirs! + i = i.split("/")[-1] + print(f"assets\dolphin\external\{i}\manifest.txt") + shutil.copyfile(fr"assets\dolphin\external\{i}\manifest.txt", fr"assets\resources\dolphin\{i}\manifest.txt") + os.remove(r"assets\resources\dolphin\manifest.txt") + self.logger.info(f"Complete") return 0 @@ -274,10 +293,11 @@ class Main(App): self.logger.info(f"Processing Dolphin sources") dolphin = Dolphin() self.logger.info(f"Loading data") - dolphin.load(self.args.input_directory) + dolphin.load(valid_dirs) self.logger.info(f"Packing") dolphin.pack(self.args.output_directory, self.args.symbol_name) self.logger.info(f"Complete") + __import__("time").sleep(2) return 0 diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index 8cc6a6e50..d07b2bcc1 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -257,48 +257,54 @@ class DolphinManifest: self.animations = [] self.logger = logging.getLogger("DolphinManifest") - def load(self, source_directory: str): - for i in ["sfw", "nsfw"]: - manifest_filename = os.path.join(source_directory, f"{i}/manifest.txt") + def load(self, loc: str): + manifest_filename = os.path.join(loc, "manifest.txt") - file = FlipperFormatFile() - file.load(manifest_filename) + file = FlipperFormatFile() + file.load(manifest_filename) - # Check file header - filetype, version = file.getHeader() - assert filetype == self.FILE_TYPE - assert version == self.FILE_VERSION + # Check file header + filetype, version = file.getHeader() + assert filetype == self.FILE_TYPE + assert version == self.FILE_VERSION - # Load animation data - while True: - try: - # Read animation spcification - name = file.readKey("Name") - min_butthurt = file.readKeyInt("Min butthurt") - max_butthurt = file.readKeyInt("Max butthurt") - min_level = file.readKeyInt("Min level") - max_level = file.readKeyInt("Max level") - weight = file.readKeyInt("Weight") + # Load animation data + while True: + try: + # Read animation spcification + name = file.readKey("Name") + min_butthurt = file.readKeyInt("Min butthurt") + max_butthurt = file.readKeyInt("Max butthurt") + min_level = file.readKeyInt("Min level") + max_level = file.readKeyInt("Max level") + weight = file.readKeyInt("Weight") - assert len(name) > 0 - assert min_butthurt >= 0 - assert max_butthurt >= 0 and max_butthurt >= min_butthurt - assert min_level >= 0 - assert max_level >= 0 and max_level >= min_level - assert weight >= 0 + assert len(name) > 0 + assert min_butthurt >= 0 + assert max_butthurt >= 0 and max_butthurt >= min_butthurt + assert min_level >= 0 + assert max_level >= 0 and max_level >= min_level + assert weight >= 0 - # Initialize animation - animation = DolphinBubbleAnimation( - name, min_butthurt, max_butthurt, min_level, max_level, weight - ) + # Initialize animation + animation = DolphinBubbleAnimation( + name, min_butthurt, max_butthurt, min_level, max_level, weight + ) - # Load Animation meta and frames - animation.load(os.path.join(source_directory, name)) + # Load Animation meta and frames - # Add to array - self.animations.append(animation) - except EOFError: - break + # handle both slash types bc we can + newname = name.split("\\") + if len(newname) < 2: + newname = name.split("/") + + newname = str(newname[1]) + animation.load(os.path.join(loc, newname)) + + # Add to array + self.animations.append(animation) + except EOFError: + break def _renderTemplate(self, template_filename: str, output_filename: str, **kwargs): template = Templite(filename=template_filename) @@ -362,11 +368,12 @@ class Dolphin: self.manifest = DolphinManifest() self.logger = logging.getLogger("Dolphin") - def load(self, source_directory: str): - assert os.path.isdir(source_directory) - # Load Manifest - self.logger.info(f"Loading directory {source_directory}") - self.manifest.load(source_directory) + def load(self, valid_dirs: list): + for loc in valid_dirs: + assert os.path.isdir(loc) + # Load Manifest + self.logger.info(f"Loading directory {loc}") + self.manifest.load(loc) def pack(self, output_directory: str, symbol_name: str = None): self.manifest.save(output_directory, symbol_name) From b7046b21792995a5b7bc43c9ad8fd7b66dddc7d3 Mon Sep 17 00:00:00 2001 From: Liam Droog <61334243+LiamDroog@users.noreply.github.com> Date: Sun, 8 Jan 2023 23:03:51 -0700 Subject: [PATCH 16/64] Change broken BadUSB link to Hak5 duckyscript quick reference webpage (#2270) * Change broken link to Hak5 duckyscript quick reference webpage * Update BadUSB syntax link --- assets/resources/badusb/demo_macos.txt | 2 +- assets/resources/badusb/demo_windows.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/resources/badusb/demo_macos.txt b/assets/resources/badusb/demo_macos.txt index 3c21a4df8..82543b28f 100644 --- a/assets/resources/badusb/demo_macos.txt +++ b/assets/resources/badusb/demo_macos.txt @@ -79,7 +79,7 @@ STRING Flipper Zero BadUSB feature is compatible with USB Rubber Ducky script fo ENTER STRING More information about script syntax can be found here: ENTER -STRING https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript +STRING https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/file_formats/BadUsbScriptFormat.md ENTER STRING EOF diff --git a/assets/resources/badusb/demo_windows.txt b/assets/resources/badusb/demo_windows.txt index f304f5e8d..2ed33b3c0 100644 --- a/assets/resources/badusb/demo_windows.txt +++ b/assets/resources/badusb/demo_windows.txt @@ -80,5 +80,5 @@ STRING Flipper Zero BadUSB feature is compatible with USB Rubber Ducky script fo ENTER STRING More information about script syntax can be found here: ENTER -STRING https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript +STRING https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/file_formats/BadUsbScriptFormat.md ENTER From 185774677b581540f0765b0ff8037706b0948efb Mon Sep 17 00:00:00 2001 From: jbohack Date: Mon, 9 Jan 2023 08:11:15 -0500 Subject: [PATCH 17/64] animations now cycle between sfwmode change without a restart :) --- applications/services/desktop/desktop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 876f0bbc3..5575537de 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -152,7 +152,7 @@ void desktop_set_sfw_mode_state(Desktop* desktop, bool enabled) { view_port_enabled_set(desktop->sfw_mode_icon_viewport, enabled); desktop->settings.sfw_mode = enabled; DESKTOP_SETTINGS_SAVE(&desktop->settings); - furi_hal_power_reset(); + animation_manager_new_idle_process(desktop->animation_manager); } Desktop* desktop_alloc() { From 88b467906c9457216ecb6f239d95d741b47dd59c Mon Sep 17 00:00:00 2001 From: jbohack Date: Mon, 9 Jan 2023 08:55:13 -0500 Subject: [PATCH 18/64] updated sfw manifest. all animations display no matter the level --- assets/dolphin/external/sfw/manifest.txt | 56 +++++++++++------------ assets/resources/dolphin/sfw/manifest.txt | 56 +++++++++++------------ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/assets/dolphin/external/sfw/manifest.txt b/assets/dolphin/external/sfw/manifest.txt index 8d17c1125..070277350 100644 --- a/assets/dolphin/external/sfw/manifest.txt +++ b/assets/dolphin/external/sfw/manifest.txt @@ -5,145 +5,145 @@ Name: sfw/L1_Waves_128x50 Min butthurt: 0 Max butthurt: 5 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Laptop_128x51 Min butthurt: 0 Max butthurt: 7 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Sleep_128x64 Min butthurt: 0 Max butthurt: 10 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Recording_128x51 Min butthurt: 0 Max butthurt: 8 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Furippa1_128x64 Min butthurt: 0 Max butthurt: 6 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Happy_holidays_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 Name: sfw/L1_Read_books_128x64 Min butthurt: 0 Max butthurt: 8 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Cry_128x64 Min butthurt: 8 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Boxing_128x64 Min butthurt: 10 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Mad_fist_128x64 Min butthurt: 9 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Mods_128x64 Min butthurt: 0 Max butthurt: 9 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 Name: sfw/L1_Painting_128x64 Min butthurt: 0 Max butthurt: 7 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Leaving_sad_128x64 Min butthurt: 14 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L2_Wake_up_128x64 Min butthurt: 0 Max butthurt: 12 -Min level: 2 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 4 Name: sfw/L2_Furippa2_128x64 Min butthurt: 0 Max butthurt: 6 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L2_Hacking_pc_128x64 Min butthurt: 0 Max butthurt: 8 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L2_Soldering_128x64 Min butthurt: 0 Max butthurt: 10 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Furippa3_128x64 Min butthurt: 0 Max butthurt: 6 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Hijack_radio_128x64 Min butthurt: 0 Max butthurt: 8 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Lab_research_128x54 Min butthurt: 0 Max butthurt: 10 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Sleigh_ride_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 \ No newline at end of file diff --git a/assets/resources/dolphin/sfw/manifest.txt b/assets/resources/dolphin/sfw/manifest.txt index 8d17c1125..070277350 100644 --- a/assets/resources/dolphin/sfw/manifest.txt +++ b/assets/resources/dolphin/sfw/manifest.txt @@ -5,145 +5,145 @@ Name: sfw/L1_Waves_128x50 Min butthurt: 0 Max butthurt: 5 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Laptop_128x51 Min butthurt: 0 Max butthurt: 7 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Sleep_128x64 Min butthurt: 0 Max butthurt: 10 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Recording_128x51 Min butthurt: 0 Max butthurt: 8 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Furippa1_128x64 Min butthurt: 0 Max butthurt: 6 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Happy_holidays_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 Name: sfw/L1_Read_books_128x64 Min butthurt: 0 Max butthurt: 8 Min level: 1 -Max level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Cry_128x64 Min butthurt: 8 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Boxing_128x64 Min butthurt: 10 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Mad_fist_128x64 Min butthurt: 9 Max butthurt: 13 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Mods_128x64 Min butthurt: 0 Max butthurt: 9 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 Name: sfw/L1_Painting_128x64 Min butthurt: 0 Max butthurt: 7 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L1_Leaving_sad_128x64 Min butthurt: 14 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 3 Name: sfw/L2_Wake_up_128x64 Min butthurt: 0 Max butthurt: 12 -Min level: 2 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 4 Name: sfw/L2_Furippa2_128x64 Min butthurt: 0 Max butthurt: 6 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L2_Hacking_pc_128x64 Min butthurt: 0 Max butthurt: 8 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L2_Soldering_128x64 Min butthurt: 0 Max butthurt: 10 -Min level: 2 -Max level: 2 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Furippa3_128x64 Min butthurt: 0 Max butthurt: 6 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Hijack_radio_128x64 Min butthurt: 0 Max butthurt: 8 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L3_Lab_research_128x54 Min butthurt: 0 Max butthurt: 10 -Min level: 3 -Max level: 3 +Min level: 1 +Max level: 30 Weight: 3 Name: sfw/L1_Sleigh_ride_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 -Max level: 3 +Max level: 30 Weight: 4 \ No newline at end of file From 8d2143add54641a256a02db775ee37ae6aff49c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Tue, 10 Jan 2023 03:15:03 +0900 Subject: [PATCH 19/64] Fix various issues reported on github (#2280) * Desktop: Fix use after free in slideshow view * Gui: long press toggles first letter case too * Desktop: remove debug logging --- .../services/desktop/views/desktop_view_slideshow.c | 2 +- applications/services/gui/modules/text_input.c | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/applications/services/desktop/views/desktop_view_slideshow.c b/applications/services/desktop/views/desktop_view_slideshow.c index 58a8f6d0c..09e155341 100644 --- a/applications/services/desktop/views/desktop_view_slideshow.c +++ b/applications/services/desktop/views/desktop_view_slideshow.c @@ -56,7 +56,7 @@ static bool desktop_view_slideshow_input(InputEvent* event, void* context) { instance->callback(DesktopSlideshowCompleted, instance->context); } update_view = true; - } else if(event->key == InputKeyOk) { + } else if(event->key == InputKeyOk && instance->timer) { if(event->type == InputTypePress) { furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_SHORT); } else if(event->type == InputTypeRelease) { diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 7c419d96a..80680fe45 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -138,7 +138,7 @@ static bool char_is_lowercase(char letter) { static char char_to_uppercase(const char letter) { if(letter == '_') { return 0x20; - } else if(isalpha(letter)) { + } else if(islower(letter)) { return (letter - 0x20); } else { return letter; @@ -309,7 +309,9 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b char selected = get_selected_char(model); size_t text_length = strlen(model->text_buffer); - if(shift) { + bool toogle_case = text_length == 0; + if(shift) toogle_case = !toogle_case; + if(toogle_case) { selected = char_to_uppercase(selected); } @@ -329,9 +331,6 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { - if(text_length == 0 && char_is_lowercase(selected)) { - selected = char_to_uppercase(selected); - } model->text_buffer[text_length] = selected; model->text_buffer[text_length + 1] = 0; } From 4992c89630a1052342ab10cd5a580e55b4c21146 Mon Sep 17 00:00:00 2001 From: jbohack Date: Mon, 9 Jan 2023 15:34:18 -0500 Subject: [PATCH 20/64] updated protoview & usb_hid_autofire --- applications/plugins/protoview/README.md | 2 +- applications/plugins/protoview/TODO | 4 + applications/plugins/protoview/app.c | 409 ++++------------- applications/plugins/protoview/app.h | 85 +++- applications/plugins/protoview/app_buffer.c | 6 + applications/plugins/protoview/app_buffer.h | 1 + applications/plugins/protoview/app_subghz.c | 26 +- .../plugins/protoview/application.fam | 2 +- .../plugins/protoview/binaries/protoview.fap | Bin 15180 -> 21208 bytes .../plugins/protoview/custom_presets.h | 132 ++++++ .../plugins/protoview/protocols/b4b1.c | 44 ++ .../plugins/protoview/protocols/oregon2.c | 65 +++ .../plugins/protoview/protocols/oregon2.txt | 6 + .../protoview/protocols/renault_tpms.c | 63 +++ applications/plugins/protoview/signal.c | 420 ++++++++++++++++++ applications/plugins/protoview/ui.c | 30 ++ .../plugins/protoview/view_direct_sampling.c | 46 ++ applications/plugins/protoview/view_info.c | 41 ++ .../plugins/protoview/view_raw_signal.c | 97 ++++ .../plugins/protoview/view_settings.c | 93 ++++ .../plugins/usb_hid_autofire/CHANGELOG.md | 3 + .../plugins/usb_hid_autofire/application.fam | 4 +- applications/plugins/usb_hid_autofire/tools.c | 56 +++ applications/plugins/usb_hid_autofire/tools.h | 7 + .../usb_hid_autofire/usb_hid_autofire.c | 29 +- .../plugins/usb_hid_autofire/version.h | 2 +- 26 files changed, 1324 insertions(+), 349 deletions(-) create mode 100644 applications/plugins/protoview/custom_presets.h create mode 100644 applications/plugins/protoview/protocols/b4b1.c create mode 100644 applications/plugins/protoview/protocols/oregon2.c create mode 100644 applications/plugins/protoview/protocols/oregon2.txt create mode 100644 applications/plugins/protoview/protocols/renault_tpms.c create mode 100644 applications/plugins/protoview/signal.c create mode 100644 applications/plugins/protoview/ui.c create mode 100644 applications/plugins/protoview/view_direct_sampling.c create mode 100644 applications/plugins/protoview/view_info.c create mode 100644 applications/plugins/protoview/view_raw_signal.c create mode 100644 applications/plugins/protoview/view_settings.c create mode 100644 applications/plugins/usb_hid_autofire/tools.c create mode 100644 applications/plugins/usb_hid_autofire/tools.h diff --git a/applications/plugins/protoview/README.md b/applications/plugins/protoview/README.md index e7209d7d6..4b8a3c3a0 100644 --- a/applications/plugins/protoview/README.md +++ b/applications/plugins/protoview/README.md @@ -78,7 +78,7 @@ cd ~/flipperZero/official/ git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git ./ ./fbt ``` -* Copy this application folder in `official/application_user`. +* Copy this application folder in `official/applications_user`. * Connect your Flipper via USB. * Build and install with: `./fbt launch_app APPSRC=protoview`. diff --git a/applications/plugins/protoview/TODO b/applications/plugins/protoview/TODO index bc66ee75a..0003ccd38 100644 --- a/applications/plugins/protoview/TODO +++ b/applications/plugins/protoview/TODO @@ -3,9 +3,13 @@ Core improvements - Detection of non Manchester and non RZ encoded signals. Not sure if there are any signals that are not self clocked widely used in RF. Note that the current approach already detects encodings using short high + long low and long high + short low to encode 0 and 1. In addition to the current classifier, it is possible to add one that checks for a sequence of pulses that are all multiples of some base length. This should detect, for instance, even NRZ encodings where 1 and 0 are just clocked as they are. +- Views on-enter on-exit. + Features ======== +- Help screen (with press ok for next page). +- Detect the line code used and try to decode the message as hex dump. - Pressing right/left you browse different modes: * Current best signal pulse classes. * Raw square wave display. Central button freezes and resumes (toggle). When frozen we display "paused" (inverted) on the low part of the screen. diff --git a/applications/plugins/protoview/app.c b/applications/plugins/protoview/app.c index 10c3fe599..4e6b2ff3e 100644 --- a/applications/plugins/protoview/app.c +++ b/applications/plugins/protoview/app.c @@ -1,257 +1,42 @@ /* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved * See the LICENSE file for information about the license. */ -#include -#include -#include -#include -#include -#include #include "app.h" -#include "app_buffer.h" + +/* If this define is enabled, ProtoView is going to mess with the + * otherwise opaque SubGhzWorker structure in order to disable + * its filter for samples shorter than a given amount (30us at the + * time I'm writing this comment). + * + * This structure must be taken in sync with the one of the firmware. */ +#define PROTOVIEW_DISABLE_SUBGHZ_FILTER 0 + +#ifdef PROTOVIEW_DISABLE_SUBGHZ_FILTER +struct SubGhzWorker { + FuriThread* thread; + FuriStreamBuffer* stream; + + volatile bool running; + volatile bool overrun; + + LevelDuration filter_level_duration; + bool filter_running; + uint16_t filter_duration; + + SubGhzWorkerOverrunCallback overrun_callback; + SubGhzWorkerPairCallback pair_callback; + void* context; +}; +#endif RawSamplesBuffer *RawSamples, *DetectedSamples; extern const SubGhzProtocolRegistry protoview_protocol_registry; -/* Render the received signal. - * - * The screen of the flipper is 128 x 64. Even using 4 pixels per line - * (where low level signal is one pixel high, high level is 4 pixels - * high) and 4 pixels of spacing between the different lines, we can - * plot comfortably 8 lines. - * - * The 'idx' argument is the first sample to render in the circular - * buffer. */ -void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *buf, uint32_t idx) { - canvas_set_color(canvas, ColorBlack); - - int rows = 8; - uint32_t time_per_pixel = app->us_scale; - bool level = 0; - uint32_t dur = 0, sample_num = 0; - for (int row = 0; row < rows ; row++) { - for (int x = 0; x < 128; x++) { - int y = 3 + row*8; - if (dur < time_per_pixel/2) { - /* Get more data. */ - raw_samples_get(buf, idx++, &level, &dur); - sample_num++; - } - - canvas_draw_line(canvas, x,y,x,y-(level*3)); - - /* Write a small triangle under the last sample detected. */ - if (app->signal_bestlen != 0 && - sample_num == app->signal_bestlen+1) - { - canvas_draw_dot(canvas,x,y+2); - canvas_draw_dot(canvas,x-1,y+3); - canvas_draw_dot(canvas,x,y+3); - canvas_draw_dot(canvas,x+1,y+3); - sample_num++; /* Make sure we don't mark the next, too. */ - } - - /* Remove from the current level duration the time we - * just plot. */ - if (dur > time_per_pixel) - dur -= time_per_pixel; - else - dur = 0; - } - } -} - -/* Return the time difference between a and b, always >= 0 since - * the absolute value is returned. */ -uint32_t duration_delta(uint32_t a, uint32_t b) { - return a > b ? a - b : b - a; -} - -/* This function starts scanning samples at offset idx looking for the - * longest run of pulses, either high or low, that are among 10% - * of each other, for a maximum of three classes. The classes are - * counted separtely for high and low signals (RF on / off) because - * many devices tend to have different pulse lenghts depending on - * the level of the pulse. - * - * For instance Oregon2 sensors, in the case of protocol 2.1 will send - * pulses of ~400us (RF on) VS ~580us (RF off). */ -#define SEARCH_CLASSES 3 -uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { - struct { - uint32_t dur[2]; /* dur[0] = low, dur[1] = high */ - uint32_t count[2]; /* Associated observed frequency. */ - } classes[SEARCH_CLASSES]; - - memset(classes,0,sizeof(classes)); - uint32_t minlen = 40, maxlen = 4000; /* Depends on data rate, here we - allow for high and low. */ - uint32_t len = 0; /* Observed len of coherent samples. */ - s->short_pulse_dur = 0; - for (uint32_t j = idx; j < idx+500; j++) { - bool level; - uint32_t dur; - raw_samples_get(s, j, &level, &dur); - if (dur < minlen || dur > maxlen) break; /* return. */ - - /* Let's see if it matches a class we already have or if we - * can populate a new (yet empty) class. */ - uint32_t k; - for (k = 0; k < SEARCH_CLASSES; k++) { - if (classes[k].count[level] == 0) { - classes[k].dur[level] = dur; - classes[k].count[level] = 1; - break; /* Sample accepted. */ - } else { - uint32_t classavg = classes[k].dur[level]; - uint32_t count = classes[k].count[level]; - uint32_t delta = duration_delta(dur,classavg); - if (delta < classavg/10) { - /* It is useful to compute the average of the class - * we are observing. We know how many samples we got so - * far, so we can recompute the average easily. - * By always having a better estimate of the pulse len - * we can avoid missing next samples in case the first - * observed samples are too off. */ - classavg = ((classavg * count) + dur) / (count+1); - classes[k].dur[level] = classavg; - classes[k].count[level]++; - break; /* Sample accepted. */ - } - } - } - - if (k == SEARCH_CLASSES) break; /* No match, return. */ - - /* If we are here, we accepted this sample. Try with the next - * one. */ - len++; - } - - /* Update the buffer setting the shortest pulse we found - * among the three classes. This will be used when scaling - * for visualization. */ - for (int j = 0; j < SEARCH_CLASSES; j++) { - for (int level = 0; level < 2; level++) { - if (classes[j].dur[level] == 0) continue; - if (classes[j].count[level] < 3) continue; - if (s->short_pulse_dur == 0 || - s->short_pulse_dur > classes[j].dur[level]) - { - s->short_pulse_dur = classes[j].dur[level]; - } - } - } - return len; -} - -/* Search the buffer with the stored signal (last N samples received) - * in order to find a coherent signal. If a signal that does not appear to - * be just noise is found, it is set in DetectedSamples global signal - * buffer, that is what is rendered on the screen. */ -void scan_for_signal(ProtoViewApp *app) { - /* We need to work on a copy: the RawSamples buffer is populated - * by the background thread receiving data. */ - RawSamplesBuffer *copy = raw_samples_alloc(); - raw_samples_copy(copy,RawSamples); - - /* Try to seek on data that looks to have a regular high low high low - * pattern. */ - uint32_t minlen = 13; /* Min run of coherent samples. Up to - 12 samples it's very easy to mistake - noise for signal. */ - - uint32_t i = 0; - while (i < copy->total-1) { - uint32_t thislen = search_coherent_signal(copy,i); - if (thislen > minlen && thislen > app->signal_bestlen) { - app->signal_bestlen = thislen; - raw_samples_copy(DetectedSamples,copy); - DetectedSamples->idx = (DetectedSamples->idx+i)% - DetectedSamples->total; - FURI_LOG_E(TAG, "Displayed sample updated (%d samples)", - (int)thislen); - } - i += thislen ? thislen : 1; - } - raw_samples_free(copy); -} - /* Draw some text with a border. If the outside color is black and the inside * color is white, it just writes the border of the text, but the function can * also be used to write a bold variation of the font setting both the * colors to black, or alternatively to write a black text with a white * border so that it is visible if there are black stuff on the background. */ -void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color) -{ - struct { - uint8_t x; uint8_t y; - } dir[8] = { - {-1,-1}, - {0,-1}, - {1,-1}, - {1,0}, - {1,1}, - {0,1}, - {-1,1}, - {-1,0} - }; - - /* Rotate in all the directions writing the same string to create a - * border, then write the actual string in the other color in the - * middle. */ - canvas_set_color(canvas, border_color); - for (int j = 0; j < 8; j++) - canvas_draw_str(canvas,x+dir[j].x,y+dir[j].y,str); - canvas_set_color(canvas, text_color); - canvas_draw_str(canvas,x,y,str); - canvas_set_color(canvas, ColorBlack); -} - -/* Raw pulses rendering. This is our default view. */ -void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app) { - /* Show signal. */ - render_signal(app, canvas, DetectedSamples, 0); - - /* Show signal information. */ - char buf[64]; - snprintf(buf,sizeof(buf),"%luus", - (unsigned long)DetectedSamples->short_pulse_dur); - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_with_border(canvas, 97, 63, buf, ColorWhite, ColorBlack); -} - -/* Renders a single view with frequency and modulation setting. However - * this are logically two different views, and only one of the settings - * will be highlighted. */ -void render_view_settings(Canvas *const canvas, ProtoViewApp *app) { - UNUSED(app); - canvas_set_font(canvas, FontPrimary); - if (app->current_view == ViewFrequencySettings) - canvas_draw_str_with_border(canvas,1,10,"Frequency",ColorWhite,ColorBlack); - else - canvas_draw_str(canvas,1,10,"Frequency"); - - if (app->current_view == ViewModulationSettings) - canvas_draw_str_with_border(canvas,70,10,"Modulation",ColorWhite,ColorBlack); - else - canvas_draw_str(canvas,70,10,"Modulation"); - canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas,10,61,"Use up and down to modify"); - - /* Show frequency. We can use big numbers font since it's just a number. */ - if (app->current_view == ViewFrequencySettings) { - char buf[16]; - snprintf(buf,sizeof(buf),"%.2f",(double)app->frequency/1000000); - canvas_set_font(canvas, FontBigNumbers); - canvas_draw_str(canvas, 30, 40, buf); - } else if (app->current_view == ViewModulationSettings) { - int current = app->modulation; - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name); - } -} - /* The callback actually just passes the control to the actual active * view callback, after setting up basic stuff like cleaning the screen * and setting color to black. */ @@ -267,9 +52,11 @@ static void render_callback(Canvas *const canvas, void *ctx) { /* Call who is in charge right now. */ switch(app->current_view) { case ViewRawPulses: render_view_raw_pulses(canvas,app); break; + case ViewInfo: render_view_info(canvas,app); break; case ViewFrequencySettings: case ViewModulationSettings: render_view_settings(canvas,app); break; + case ViewDirectSampling: render_view_direct_sampling(canvas,app); break; case ViewLast: furi_crash(TAG " ViewLast selected"); break; } } @@ -279,11 +66,29 @@ static void render_callback(Canvas *const canvas, void *ctx) { static void input_callback(InputEvent* input_event, void* ctx) { ProtoViewApp *app = ctx; + furi_message_queue_put(app->event_queue,input_event,FuriWaitForever); +} - if (input_event->type == InputTypePress) { - furi_message_queue_put(app->event_queue,input_event,FuriWaitForever); - FURI_LOG_E(TAG, "INPUT CALLBACK %d", (int)input_event->key); + +/* Called to switch view (when left/right is pressed). Handles + * changing the current view ID and calling the enter/exit view + * callbacks if needed. */ +static void app_switch_view(ProtoViewApp *app, SwitchViewDirection dir) { + ProtoViewCurrentView old = app->current_view; + if (dir == AppNextView) { + app->current_view++; + if (app->current_view == ViewLast) app->current_view = 0; + } else if (dir == AppPrevView) { + if (app->current_view == 0) + app->current_view = ViewLast-1; + else + app->current_view--; } + ProtoViewCurrentView new = app->current_view; + + /* Call the enter/exit view callbacks if needed. */ + if (old == ViewDirectSampling) view_exit_direct_sampling(app); + if (new == ViewDirectSampling) view_enter_direct_sampling(app); } /* Allocate the application state and initialize a number of stuff. @@ -297,7 +102,7 @@ ProtoViewApp* protoview_app_alloc() { //init setting app->setting = subghz_setting_alloc(); - subghz_setting_load(app->setting, EXT_PATH("protoview/settings.txt")); + subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user")); // GUI app->gui = furi_record_open(RECORD_GUI); @@ -310,13 +115,20 @@ ProtoViewApp* protoview_app_alloc() { // Signal found and visualization defaults app->signal_bestlen = 0; - app->us_scale = 100; + app->signal_decoded = false; + app->us_scale = PROTOVIEW_RAW_VIEW_DEFAULT_SCALE; + app->signal_offset = 0; //init Worker & Protocol app->txrx = malloc(sizeof(ProtoViewTxRx)); /* Setup rx worker and environment. */ app->txrx->worker = subghz_worker_alloc(); + +#ifdef PROTOVIEW_DISABLE_SUBGHZ_FILTER + app->txrx->worker->filter_running = 0; +#endif + app->txrx->environment = subghz_environment_alloc(); subghz_environment_set_protocol_registry( app->txrx->environment, (void*)&protoview_protocol_registry); @@ -380,70 +192,6 @@ static void timer_callback(void *ctx) { scan_for_signal(app); } -/* Handle input for the raw pulses view. */ -void process_input_raw_pulses(ProtoViewApp *app, InputEvent input) { - if (input.key == InputKeyOk) { - /* Reset the current sample to capture the next. */ - app->signal_bestlen = 0; - raw_samples_reset(DetectedSamples); - raw_samples_reset(RawSamples); - } else if (input.key == InputKeyDown) { - /* Rescaling. The set becomes finer under 50us per pixel. */ - uint32_t scale_step = app->us_scale >= 50 ? 50 : 10; - if (app->us_scale < 500) app->us_scale += scale_step; - } else if (input.key == InputKeyUp) { - uint32_t scale_step = app->us_scale > 50 ? 50 : 10; - if (app->us_scale > 10) app->us_scale -= scale_step; - } -} - -/* Handle input for the settings view. */ -void process_input_settings(ProtoViewApp *app, InputEvent input) { - /* Here we handle only up and down. Avoid any work if the user - * pressed something else. */ - if (input.key != InputKeyDown && input.key != InputKeyUp) return; - - if (app->current_view == ViewFrequencySettings) { - size_t curidx = 0, i; - size_t count = subghz_setting_get_frequency_count(app->setting); - - /* Scan the list of frequencies to check for the index of the - * currently set frequency. */ - for(i = 0; i < count; i++) { - uint32_t freq = subghz_setting_get_frequency(app->setting,i); - if (freq == app->frequency) { - curidx = i; - break; - } - } - if (i == count) return; /* Should never happen. */ - - if (input.key == InputKeyUp) { - curidx = (curidx+1) % count; - } else if (input.key == InputKeyDown) { - curidx = curidx == 0 ? count-1 : curidx-1; - } - app->frequency = subghz_setting_get_frequency(app->setting,curidx); - } else if (app->current_view == ViewModulationSettings) { - uint32_t count = 0; - uint32_t modid = app->modulation; - - while(ProtoViewModulations[count].name != NULL) count++; - if (input.key == InputKeyUp) { - modid = (modid+1) % count; - } else if (input.key == InputKeyDown) { - modid = modid == 0 ? count-1 : modid-1; - } - app->modulation = modid; - } - - /* Apply changes. */ - FURI_LOG_E(TAG, "Setting view, setting frequency/modulation to %lu %s", app->frequency, ProtoViewModulations[app->modulation].name); - radio_rx_end(app); - radio_begin(app); - radio_rx(app); -} - int32_t protoview_app_entry(void* p) { UNUSED(p); ProtoViewApp *app = protoview_app_alloc(); @@ -465,39 +213,53 @@ int32_t protoview_app_entry(void* p) { while(app->running) { FuriStatus qstat = furi_message_queue_get(app->event_queue, &input, 100); if (qstat == FuriStatusOk) { - FURI_LOG_E(TAG, "Main Loop - Input: %u", input.key); + if (DEBUG_MSG) FURI_LOG_E(TAG, "Main Loop - Input: type %d key %u", + input.type, input.key); /* Handle navigation here. Then handle view-specific inputs * in the view specific handling function. */ - if (input.key == InputKeyBack) { + if (input.type == InputTypeShort && + input.key == InputKeyBack) + { /* Exit the app. */ app->running = 0; - } else if (input.key == InputKeyRight) { + } else if (input.type == InputTypeShort && + input.key == InputKeyRight) + { /* Go to the next view. */ - app->current_view++; - if (app->current_view == ViewLast) app->current_view = 0; - } else if (input.key == InputKeyLeft) { + app_switch_view(app,AppNextView); + } else if (input.type == InputTypeShort && + input.key == InputKeyLeft) + { /* Go to the previous view. */ - if (app->current_view == 0) - app->current_view = ViewLast-1; - else - app->current_view--; + app_switch_view(app,AppPrevView); } else { + /* This is where we pass the control to the currently + * active view input processing. */ switch(app->current_view) { case ViewRawPulses: process_input_raw_pulses(app,input); break; + case ViewInfo: + process_input_info(app,input); + break; case ViewFrequencySettings: case ViewModulationSettings: process_input_settings(app,input); break; + case ViewDirectSampling: + process_input_direct_sampling(app,input); + break; case ViewLast: furi_crash(TAG " ViewLast selected"); break; } } } else { - static int c = 0; - c++; - if (!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); + /* Useful to understand if the app is still alive when it + * does not respond because of bugs. */ + if (DEBUG_MSG) { + static int c = 0; c++; + if (!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); + } } view_port_update(app->view_port); } @@ -513,3 +275,4 @@ int32_t protoview_app_entry(void* p) { protoview_app_free(app); return 0; } + diff --git a/applications/plugins/protoview/app.h b/applications/plugins/protoview/app.h index 18852a14a..4ad0a9196 100644 --- a/applications/plugins/protoview/app.h +++ b/applications/plugins/protoview/app.h @@ -3,6 +3,11 @@ #pragma once +#include +#include +#include +#include +#include #include #include #include @@ -15,8 +20,13 @@ #include #include #include +#include "app_buffer.h" #define TAG "ProtoView" +#define PROTOVIEW_RAW_VIEW_DEFAULT_SCALE 100 +#define BITMAP_SEEK_NOT_FOUND UINT32_MAX + +#define DEBUG_MSG 1 typedef struct ProtoViewApp ProtoViewApp; @@ -30,14 +40,23 @@ typedef enum { /* Currently active view. */ typedef enum { ViewRawPulses, + ViewInfo, ViewFrequencySettings, ViewModulationSettings, + ViewDirectSampling, ViewLast, /* Just a sentinel to wrap around. */ } ProtoViewCurrentView; +/* Used by app_switch_view() */ +typedef enum { + AppNextView, + AppPrevView +} SwitchViewDirection; + typedef struct { const char *name; FuriHalSubGhzPreset preset; + uint8_t *custom; } ProtoViewModulation; extern ProtoViewModulation ProtoViewModulations[]; /* In app_subghz.c */ @@ -54,6 +73,21 @@ struct ProtoViewTxRx { typedef struct ProtoViewTxRx ProtoViewTxRx; +/* This stucture is filled by the decoder for specific protocols with the + * informations about the message. ProtoView will display such information + * in the message info view. */ +#define PROTOVIEW_MSG_STR_LEN 32 +typedef struct ProtoViewMsgInfo { + char name[PROTOVIEW_MSG_STR_LEN]; /* Protocol name and version. */ + char raw[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific raw representation.*/ + /* The following is what the decoder wants to show to user. Each decoder + * can use the number of fileds it needs. */ + char info1[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 1. */ + char info2[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 2. */ + char info3[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 3. */ + uint64_t len; /* Bits consumed from the stream. */ +} ProtoViewMsgInfo; + struct ProtoViewApp { /* GUI */ Gui *gui; @@ -66,17 +100,66 @@ struct ProtoViewApp { ProtoViewTxRx *txrx; /* Radio state. */ SubGhzSetting *setting; /* A list of valid frequencies. */ - /* Application state and config. */ + /* Generic app state. */ int running; /* Once false exists the app. */ uint32_t signal_bestlen; /* Longest coherent signal observed so far. */ + bool signal_decoded; /* Was the current signal decoded? */ + ProtoViewMsgInfo signal_info; /* Decoded message, if signal_decoded true. */ + + /* Raw view apps state. */ uint32_t us_scale; /* microseconds per pixel. */ + uint32_t signal_offset; /* Long press left/right panning in raw view. */ + + /* Configuration view app state. */ uint32_t frequency; /* Current frequency. */ uint8_t modulation; /* Current modulation ID, array index in the ProtoViewModulations table. */ }; +typedef struct ProtoViewDecoder { + const char *name; /* Protocol name. */ + /* The decode function takes a buffer that is actually a bitmap, with + * high and low levels represented as 0 and 1. The number of high/low + * pulses represented by the bitmap is passed as the 'numbits' argument, + * while 'numbytes' represents the total size of the bitmap pointed by + * 'bits'. So 'numbytes' is mainly useful to pass as argument to other + * functions that perform bit extraction with bound checking, such as + * bitmap_get() and so forth. */ + bool (*decode)(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info); +} ProtoViewDecoder; + +extern RawSamplesBuffer *RawSamples, *DetectedSamples; + +/* app_radio.c */ void radio_begin(ProtoViewApp* app); uint32_t radio_rx(ProtoViewApp* app); void radio_idle(ProtoViewApp* app); void radio_rx_end(ProtoViewApp* app); void radio_sleep(ProtoViewApp* app); + +/* signal.c */ +uint32_t duration_delta(uint32_t a, uint32_t b); +void reset_current_signal(ProtoViewApp *app); +void scan_for_signal(ProtoViewApp *app); +bool bitmap_get(uint8_t *b, uint32_t blen, uint32_t bitpos); +void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val); +void bitmap_set_pattern(uint8_t *b, uint32_t blen, const char *pat); +void bitmap_invert_bytes_bits(uint8_t *p, uint32_t len); +bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *bits); +uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t maxbits, const char *bits); +uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t offset, const char *zero_pattern, const char *one_pattern); + +/* view_*.c */ +void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app); +void process_input_raw_pulses(ProtoViewApp *app, InputEvent input); +void render_view_settings(Canvas *const canvas, ProtoViewApp *app); +void process_input_settings(ProtoViewApp *app, InputEvent input); +void render_view_info(Canvas *const canvas, ProtoViewApp *app); +void process_input_info(ProtoViewApp *app, InputEvent input); +void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app); +void process_input_direct_sampling(ProtoViewApp *app, InputEvent input); +void view_enter_direct_sampling(ProtoViewApp *app); +void view_exit_direct_sampling(ProtoViewApp *app); + +/* ui.c */ +void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color); diff --git a/applications/plugins/protoview/app_buffer.c b/applications/plugins/protoview/app_buffer.c index 0061a4142..df2e7074e 100644 --- a/applications/plugins/protoview/app_buffer.c +++ b/applications/plugins/protoview/app_buffer.c @@ -34,6 +34,12 @@ void raw_samples_reset(RawSamplesBuffer *s) { furi_mutex_release(s->mutex); } +/* Set the raw sample internal index so that what is currently at + * offset 'offset', will appear to be at 0 index. */ +void raw_samples_center(RawSamplesBuffer *s, uint32_t offset) { + s->idx = (s->idx+offset) % RAW_SAMPLES_NUM; +} + /* Add the specified sample in the circular buffer. */ void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur) { furi_mutex_acquire(s->mutex,FuriWaitForever); diff --git a/applications/plugins/protoview/app_buffer.h b/applications/plugins/protoview/app_buffer.h index 90d186f89..5d997d02e 100644 --- a/applications/plugins/protoview/app_buffer.h +++ b/applications/plugins/protoview/app_buffer.h @@ -23,6 +23,7 @@ typedef struct RawSamplesBuffer { RawSamplesBuffer *raw_samples_alloc(void); void raw_samples_reset(RawSamplesBuffer *s); +void raw_samples_center(RawSamplesBuffer *s, uint32_t offset); void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur); void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *dur); void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src); diff --git a/applications/plugins/protoview/app_subghz.c b/applications/plugins/protoview/app_subghz.c index e89cab214..2bb87af7a 100644 --- a/applications/plugins/protoview/app_subghz.c +++ b/applications/plugins/protoview/app_subghz.c @@ -2,17 +2,20 @@ * See the LICENSE file for information about the license. */ #include "app.h" +#include "custom_presets.h" #include ProtoViewModulation ProtoViewModulations[] = { - {"OOK 650Khz", FuriHalSubGhzPresetOok650Async}, - {"OOK 270Khz", FuriHalSubGhzPresetOok270Async}, - {"2FSK 2.38Khz", FuriHalSubGhzPreset2FSKDev238Async}, - {"2FSK 47.6Khz", FuriHalSubGhzPreset2FSKDev476Async}, - {"MSK", FuriHalSubGhzPresetMSK99_97KbAsync}, - {"GFSK", FuriHalSubGhzPresetGFSK9_99KbAsync}, - {NULL, 0} /* End of list sentinel. */ + {"OOK 650Khz", FuriHalSubGhzPresetOok650Async, NULL}, + {"OOK 270Khz", FuriHalSubGhzPresetOok270Async, NULL}, + {"2FSK 2.38Khz", FuriHalSubGhzPreset2FSKDev238Async, NULL}, + {"2FSK 47.6Khz", FuriHalSubGhzPreset2FSKDev476Async, NULL}, + {"MSK", FuriHalSubGhzPresetMSK99_97KbAsync, NULL}, + {"GFSK", FuriHalSubGhzPresetGFSK9_99KbAsync, NULL}, + {"TPMS 1 (FSK)", 0, (uint8_t*)protoview_subghz_tpms1_async_regs}, + {"TPMS 2 (FSK)", 0, (uint8_t*)protoview_subghz_tpms2_async_regs}, + {NULL, 0, NULL} /* End of list sentinel. */ }; /* Called after the application initialization in order to setup the @@ -23,7 +26,14 @@ void radio_begin(ProtoViewApp* app) { furi_assert(app); furi_hal_subghz_reset(); furi_hal_subghz_idle(); - furi_hal_subghz_load_preset(ProtoViewModulations[app->modulation].preset); + + /* The CC1101 preset can be either one of the standard presets, if + * the modulation "custom" field is NULL, or a custom preset we + * defined in custom_presets.h. */ + if (ProtoViewModulations[app->modulation].custom == NULL) + furi_hal_subghz_load_preset(ProtoViewModulations[app->modulation].preset); + else + furi_hal_subghz_load_custom_preset(ProtoViewModulations[app->modulation].custom); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); app->txrx->txrx_state = TxRxStateIDLE; } diff --git a/applications/plugins/protoview/application.fam b/applications/plugins/protoview/application.fam index 5b3589ce7..df2a77261 100644 --- a/applications/plugins/protoview/application.fam +++ b/applications/plugins/protoview/application.fam @@ -5,7 +5,7 @@ App( entry_point="protoview_app_entry", cdefines=["APP_PROTOVIEW"], requires=["gui"], - stack_size=8 * 1024, + stack_size=8*1024, order=50, fap_icon="appicon.png", fap_category="Tools", diff --git a/applications/plugins/protoview/binaries/protoview.fap b/applications/plugins/protoview/binaries/protoview.fap index 9e1f9c7ec4d853401b2e0937634f17ee1af519dd..f5a03056e172efab800adfb989d987ce2e3b849e 100644 GIT binary patch literal 21208 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 literal 15180 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 U=>1}On1IJ-p`0_t-A55w9JcK`qY diff --git a/applications/plugins/protoview/custom_presets.h b/applications/plugins/protoview/custom_presets.h new file mode 100644 index 000000000..d34446f48 --- /dev/null +++ b/applications/plugins/protoview/custom_presets.h @@ -0,0 +1,132 @@ +#include + +/* This is how to configure registers MDMCFG3 and MDMCFG4. + * + * Data rate kBaud setting: + * + * MDMCFG3 is the data rate mantissa, the exponent is in MDMCFG4, + * last 4 bits of the register. + * + * The rate (assuming 26Mhz crystal) is calculated as follows: + * + * ((256+MDMCFG3)*(2^MDMCFG4:0..3bits)) / 2^28 * 26000000. + * + * For instance for the default values of MDMCFG3 (34) and MDMCFG4 (12): + * + * ((256+34)*(2^12))/(2^28)*26000000 = 115051.2688000000, that is 115KBaud + * + * Bandwidth filter setting: + * + * BW filter as just 16 possibilities depending on how the first nibble + * (first 4 bits) of the MDMCFG4 bits are set. Instead of providing the + * formula, it is simpler to show all the values of the nibble and the + * corresponding bandwidth filter. + * + * 0 812khz + * 1 650khz + * 2 541khz + * 3 464khz + * 4 406khz + * 5 325khz + * 6 270khz + * 7 232khz + * 8 203khz + * 9 162khz + * a 135khz + * b 116khz + * c 102khz + * d 82 khz + * e 68 khz + * f 58 khz + */ + +/* 20 KBaud, 2FSK, 28.56 kHz deviation, 325 Khz bandwidth filter. */ +static uint8_t protoview_subghz_tpms1_async_regs[][2] = { + /* GPIO GD0 */ + {CC1101_IOCFG0, 0x0D}, // GD0 as async serial data output/input + + /* Frequency Synthesizer Control */ + {CC1101_FSCTRL1, 0x06}, // IF = (26*10^6) / (2^10) * 0x06 = 152343.75Hz + + /* Packet engine */ + {CC1101_PKTCTRL0, 0x32}, // Async, continious, no whitening + {CC1101_PKTCTRL1, 0x04}, + + // // Modem Configuration + {CC1101_MDMCFG0, 0x00}, + {CC1101_MDMCFG1, 0x02}, + {CC1101_MDMCFG2, 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. + {CC1101_MDMCFG3, 0x93}, // Data rate is 20kBaud + {CC1101_MDMCFG4, 0x59}, // Rx bandwidth filter is 325 kHz + {CC1101_DEVIATN, 0x41}, // Deviation 28.56 kHz + + /* Main Radio Control State Machine */ + {CC1101_MCSM0, 0x18}, // Autocalibrate on idle-to-rx/tx, PO_TIMEOUT is 64 cycles(149-155us) + + /* Frequency Offset Compensation Configuration */ + {CC1101_FOCCFG, + 0x16}, // no frequency offset compensation, POST_K same as PRE_K, PRE_K is 4K, GATE is off + + /* Automatic Gain Control */ + {CC1101_AGCCTRL0, + 0x91}, //10 - Medium hysteresis, medium asymmetric dead zone, medium gain ; 01 - 16 samples agc; 00 - Normal AGC, 01 - 8dB boundary + {CC1101_AGCCTRL1, + 0x00}, // 0; 0 - LNA 2 gain is decreased to minimum before decreasing LNA gain; 00 - Relative carrier sense threshold disabled; 0000 - RSSI to MAIN_TARGET + {CC1101_AGCCTRL2, 0x07}, // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAIN_TARGET 42 dB + + /* Wake on radio and timeouts control */ + {CC1101_WORCTRL, 0xFB}, // WOR_RES is 2^15 periods (0.91 - 0.94 s) 16.5 - 17.2 hours + + /* Frontend configuration */ + {CC1101_FREND0, 0x10}, // Adjusts current TX LO buffer + {CC1101_FREND1, 0x56}, + + /* End */ + {0, 0}, +}; + +/* 40 KBaud, 2FSK, 19 kHz deviation, 102 Khz bandwidth filter. */ +static uint8_t protoview_subghz_tpms2_async_regs[][2] = { + /* GPIO GD0 */ + {CC1101_IOCFG0, 0x0D}, // GD0 as async serial data output/input + + /* Frequency Synthesizer Control */ + {CC1101_FSCTRL1, 0x06}, // IF = (26*10^6) / (2^10) * 0x06 = 152343.75Hz + + /* Packet engine */ + {CC1101_PKTCTRL0, 0x32}, // Async, continious, no whitening + {CC1101_PKTCTRL1, 0x04}, + + // // Modem Configuration + {CC1101_MDMCFG0, 0x00}, + {CC1101_MDMCFG1, 0x02}, + {CC1101_MDMCFG2, 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. + {CC1101_MDMCFG3, 0x93}, // Data rate is 40kBaud + {CC1101_MDMCFG4, 0x6A}, // 6 = BW filter 270kHz, A = Data rate exp + {CC1101_DEVIATN, 0x41}, // Deviation 19.042 kHz + + /* Main Radio Control State Machine */ + {CC1101_MCSM0, 0x18}, // Autocalibrate on idle-to-rx/tx, PO_TIMEOUT is 64 cycles(149-155us) + + /* Frequency Offset Compensation Configuration */ + {CC1101_FOCCFG, + 0x16}, // no frequency offset compensation, POST_K same as PRE_K, PRE_K is 4K, GATE is off + + /* Automatic Gain Control */ + {CC1101_AGCCTRL0, + 0x91}, //10 - Medium hysteresis, medium asymmetric dead zone, medium gain ; 01 - 16 samples agc; 00 - Normal AGC, 01 - 8dB boundary + {CC1101_AGCCTRL1, + 0x00}, // 0; 0 - LNA 2 gain is decreased to minimum before decreasing LNA gain; 00 - Relative carrier sense threshold disabled; 0000 - RSSI to MAIN_TARGET + {CC1101_AGCCTRL2, 0x07}, // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAIN_TARGET 42 dB + + /* Wake on radio and timeouts control */ + {CC1101_WORCTRL, 0xFB}, // WOR_RES is 2^15 periods (0.91 - 0.94 s) 16.5 - 17.2 hours + + /* Frontend configuration */ + {CC1101_FREND0, 0x10}, // Adjusts current TX LO buffer + {CC1101_FREND1, 0x56}, + + /* End */ + {0, 0}, +}; + diff --git a/applications/plugins/protoview/protocols/b4b1.c b/applications/plugins/protoview/protocols/b4b1.c new file mode 100644 index 000000000..6977c0eb3 --- /dev/null +++ b/applications/plugins/protoview/protocols/b4b1.c @@ -0,0 +1,44 @@ +/* PT/SC remotes. Usually 443.92 Mhz OOK. + * + * This line code is used in many remotes such as Princeton chips + * named PT, Silian Microelectronics SC5262 and others. + * Basically every 4 pulsee represent a bit, where 1000 means 0, and + * 1110 means 1. Usually we can read 24 bits of data. + * In this specific implementation we check for a prelude that is + * 1 bit high, 31 bits low, but the check is relaxed. */ + +#include "../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + if (numbits < 30) return false; + const char *sync_patterns[3] = { + "10000000000000000000000000000001", /* 30 zero bits. */ + "100000000000000000000000000000001", /* 31 zero bits. */ + "1000000000000000000000000000000001", /* 32 zero bits. */ + }; + + uint32_t off; + int j; + for (j = 0; j < 3; j++) { + off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_patterns[j]); + if (off != BITMAP_SEEK_NOT_FOUND) break; + } + if (off == BITMAP_SEEK_NOT_FOUND) return false; + if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 preamble at: %lu",off); + off += strlen(sync_patterns[j])-1; + + uint8_t d[3]; /* 24 bits of data. */ + uint32_t decoded = + convert_from_line_code(d,sizeof(d),bits,numbytes,off,"1000","1110"); + + if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 decoded: %lu",decoded); + if (decoded != 24) return false; + snprintf(info->name,PROTOVIEW_MSG_STR_LEN,"PT/SC remote"); + snprintf(info->raw,PROTOVIEW_MSG_STR_LEN,"%02X%02X%02X",d[0],d[1],d[2]); + info->len = off+(4*24); + return true; +} + +ProtoViewDecoder B4B1Decoder = { + "B4B1", decode +}; diff --git a/applications/plugins/protoview/protocols/oregon2.c b/applications/plugins/protoview/protocols/oregon2.c new file mode 100644 index 000000000..3aa57c72d --- /dev/null +++ b/applications/plugins/protoview/protocols/oregon2.c @@ -0,0 +1,65 @@ +/* Oregon remote termometers. Usually 443.92 Mhz OOK. + * + * The protocol is described here: + * https://wmrx00.sourceforge.net/Arduino/OregonScientific-RF-Protocols.pdf + * This implementation is not very complete. */ + +#include "../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + if (numbits < 32) return false; + const char *sync_pattern = "01100110" "01100110" "10010110" "10010110"; + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Oregon2 preamble+sync found"); + + off += 32; /* Skip preamble. */ + + uint8_t buffer[8], raw[8] = {0}; + uint32_t decoded = + convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110"); + FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded); + + if (decoded < 11*4) return false; /* Minimum len to extract some data. */ + + char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0}; + for (int j = 0; j < 64; j += 4) { + uint8_t nib[1]; + nib[0] = (bitmap_get(buffer,8,j+0) | + bitmap_get(buffer,8,j+1) << 1 | + bitmap_get(buffer,8,j+2) << 2 | + bitmap_get(buffer,8,j+3) << 3); + if (DEBUG_MSG) FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]); + raw[j/8] |= nib[0] << (4-(j%4)); + switch(j/4) { + case 1: deviceid[0] |= nib[0]; break; + case 0: deviceid[0] |= nib[0] << 4; break; + case 3: deviceid[1] |= nib[0]; break; + case 2: deviceid[1] |= nib[0] << 4; break; + case 10: temp[0] = nib[0]; break; + /* Fixme: take the temperature sign from nibble 11. */ + case 9: temp[1] = nib[0]; break; + case 8: temp[2] = nib[0]; break; + case 13: hum[0] = nib[0]; break; + case 12: hum[1] = nib[0]; break; + } + } + + snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1"); + /* The following line crashes the Flipper because of broken + * snprintf() implementation. */ + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7]); + snprintf(info->info1,sizeof(info->info1),"Sensor ID %02X%02X", + deviceid[0], deviceid[1]); + snprintf(info->info2,sizeof(info->info2),"Temperature %d%d.%d", + temp[0],temp[1],temp[2]); + snprintf(info->info3,sizeof(info->info3),"Humidity %d%d", + hum[0],hum[1]); + return true; +} + +ProtoViewDecoder Oregon2Decoder = { + "Oregon2", decode +}; diff --git a/applications/plugins/protoview/protocols/oregon2.txt b/applications/plugins/protoview/protocols/oregon2.txt new file mode 100644 index 000000000..362631431 --- /dev/null +++ b/applications/plugins/protoview/protocols/oregon2.txt @@ -0,0 +1,6 @@ +11001100110011001100110011001100110011001100110011001100110 (Preamble) +10 01 01 10 10 01 01 10 (Sync) +01 10 10 01 10 01 10 01 01 10 10 01 01 10 01 10 10 01 01 10 10 01 10 01 10 01 10 01 10 01 10 01 01 10 10 01 10 01 10 01 01 10 01 10 01 10 01 10 01 10 01 10 10 01 01 10 01 10 10 01 10 01 10 01 10 01 10 01 01 10 10 01 10 01 01 10 01 10 10 01 01 10 10 01 10 01 10 01 10 01 10 01 10 01 11 0 + +We need to seek the following bytes: 01100110 01100110 10010110 10010110 + 0x66 0x66 96 96 diff --git a/applications/plugins/protoview/protocols/renault_tpms.c b/applications/plugins/protoview/protocols/renault_tpms.c new file mode 100644 index 000000000..3022a5d4e --- /dev/null +++ b/applications/plugins/protoview/protocols/renault_tpms.c @@ -0,0 +1,63 @@ +/* Renault tires TPMS. Usually 443.92 Mhz FSK. + * + * Preamble + marshal-encoded bits. 9 Bytes in total if we don't + * count the preamble. */ + +#include "../app.h" + +#define USE_TEST_VECTOR 0 +static const char *test_vector = + "10101010" "10101010" "10101010" "10101001" // Preamble + sync. + + /* The following is marshal encoded, so each two characters are + * actaully one bit. 01 = 1, 10 = 0. */ + "010110010110" // Flags. + "10011001101010011001" // Pressure, multiply by 0.75 to obtain kpa. + // 244 kpa here. + "1010010110011010" // Temperature, subtract 30 to obtain celsius. 22C here. + "1001010101101001" + "0101100110010101" + "1001010101100110" // Tire ID. 0x7AD779 here. + "0101010101010101" + "0101010101010101" // Two FF bytes (usually). Unknown. + "0110010101010101"; // CRC8 with (poly 7, initialization 0). + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ + bitmap_set_pattern(bits,numbytes,test_vector); + numbits = strlen(test_vector); + } + + if (numbits < 13*8) return false; + + const char *sync_pattern = "10101010" "10101010" "10101010" "10101001"; + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Renault TPMS preamble+sync found"); + + off += 32; /* Skip preamble. */ + + uint8_t raw[9]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "10","01"); /* Manchester. */ + FURI_LOG_E(TAG, "Renault TPMS decoded bits: %lu", decoded); + + if (decoded < 8*9) return false; /* Require the full 9 bytes. */ + + float kpa = 0.75 *((uint32_t)((raw[0]&3)<<8) | raw[1]); + int temp = raw[2]-30; + + snprintf(info->name,sizeof(info->name),"%s","Renault TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8]); + snprintf(info->info1,sizeof(info->info1),"Pressure %.2f kpa", (double)kpa); + snprintf(info->info2,sizeof(info->info2),"Temperature %d C", temp); + return true; +} + +ProtoViewDecoder RenaultTPMSDecoder = { + "Renault TPMS", decode +}; diff --git a/applications/plugins/protoview/signal.c b/applications/plugins/protoview/signal.c new file mode 100644 index 000000000..2ff632811 --- /dev/null +++ b/applications/plugins/protoview/signal.c @@ -0,0 +1,420 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info); +void initialize_msg_info(ProtoViewMsgInfo *i); + +/* ============================================================================= + * Raw signal detection + * ===========================================================================*/ + +/* Return the time difference between a and b, always >= 0 since + * the absolute value is returned. */ +uint32_t duration_delta(uint32_t a, uint32_t b) { + return a > b ? a - b : b - a; +} + +/* Reset the current signal, so that a new one can be detected. */ +void reset_current_signal(ProtoViewApp *app) { + app->signal_bestlen = 0; + app->signal_offset = 0; + app->signal_decoded = false; + raw_samples_reset(DetectedSamples); + raw_samples_reset(RawSamples); +} + +/* This function starts scanning samples at offset idx looking for the + * longest run of pulses, either high or low, that are not much different + * from each other, for a maximum of three duration classes. + * So for instance 50 successive pulses that are roughly long 340us or 670us + * will be sensed as a coherent signal (example: 312, 361, 700, 334, 667, ...) + * + * The classes are counted separtely for high and low signals (RF on / off) + * because many devices tend to have different pulse lenghts depending on + * the level of the pulse. + * + * For instance Oregon2 sensors, in the case of protocol 2.1 will send + * pulses of ~400us (RF on) VS ~580us (RF off). */ +#define SEARCH_CLASSES 3 +uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { + struct { + uint32_t dur[2]; /* dur[0] = low, dur[1] = high */ + uint32_t count[2]; /* Associated observed frequency. */ + } classes[SEARCH_CLASSES]; + + memset(classes,0,sizeof(classes)); + uint32_t minlen = 30, maxlen = 4000; /* Depends on data rate, here we + allow for high and low. */ + uint32_t len = 0; /* Observed len of coherent samples. */ + s->short_pulse_dur = 0; + for (uint32_t j = idx; j < idx+500; j++) { + bool level; + uint32_t dur; + raw_samples_get(s, j, &level, &dur); + if (dur < minlen || dur > maxlen) break; /* return. */ + + /* Let's see if it matches a class we already have or if we + * can populate a new (yet empty) class. */ + uint32_t k; + for (k = 0; k < SEARCH_CLASSES; k++) { + if (classes[k].count[level] == 0) { + classes[k].dur[level] = dur; + classes[k].count[level] = 1; + break; /* Sample accepted. */ + } else { + uint32_t classavg = classes[k].dur[level]; + uint32_t count = classes[k].count[level]; + uint32_t delta = duration_delta(dur,classavg); + /* Is the difference in duration between this signal and + * the class we are inspecting less than a given percentage? + * If so, accept this signal. */ + if (delta < classavg/8) { /* 100%/8 = 12%. */ + /* It is useful to compute the average of the class + * we are observing. We know how many samples we got so + * far, so we can recompute the average easily. + * By always having a better estimate of the pulse len + * we can avoid missing next samples in case the first + * observed samples are too off. */ + classavg = ((classavg * count) + dur) / (count+1); + classes[k].dur[level] = classavg; + classes[k].count[level]++; + break; /* Sample accepted. */ + } + } + } + + if (k == SEARCH_CLASSES) break; /* No match, return. */ + + /* If we are here, we accepted this sample. Try with the next + * one. */ + len++; + } + + /* Update the buffer setting the shortest pulse we found + * among the three classes. This will be used when scaling + * for visualization. */ + uint32_t short_dur[2] = {0,0}; + for (int j = 0; j < SEARCH_CLASSES; j++) { + for (int level = 0; level < 2; level++) { + if (classes[j].dur[level] == 0) continue; + if (classes[j].count[level] < 3) continue; + if (short_dur[level] == 0 || + short_dur[level] > classes[j].dur[level]) + { + short_dur[level] = classes[j].dur[level]; + } + } + } + + /* Use the average between high and low short pulses duration. + * Often they are a bit different, and using the average is more robust + * when we do decoding sampling at short_pulse_dur intervals. */ + if (short_dur[0] == 0) short_dur[0] = short_dur[1]; + if (short_dur[1] == 0) short_dur[1] = short_dur[0]; + s->short_pulse_dur = (short_dur[0]+short_dur[1])/2; + + return len; +} + +/* Search the buffer with the stored signal (last N samples received) + * in order to find a coherent signal. If a signal that does not appear to + * be just noise is found, it is set in DetectedSamples global signal + * buffer, that is what is rendered on the screen. */ +void scan_for_signal(ProtoViewApp *app) { + /* We need to work on a copy: the RawSamples buffer is populated + * by the background thread receiving data. */ + RawSamplesBuffer *copy = raw_samples_alloc(); + raw_samples_copy(copy,RawSamples); + + /* Try to seek on data that looks to have a regular high low high low + * pattern. */ + uint32_t minlen = 13; /* Min run of coherent samples. Up to + 12 samples it's very easy to mistake + noise for signal. */ + + ProtoViewMsgInfo *info = malloc(sizeof(ProtoViewMsgInfo)); + uint32_t i = 0; + + while (i < copy->total-1) { + uint32_t thislen = search_coherent_signal(copy,i); + + /* For messages that are long enough, attempt decoding. */ + if (thislen > minlen) { + initialize_msg_info(info); + uint32_t saved_idx = copy->idx; /* Save index, see later. */ + /* decode_signal() expects the detected signal to start + * from index .*/ + raw_samples_center(copy,i); + bool decoded = decode_signal(copy,thislen,info); + copy->idx = saved_idx; /* Restore the index as we are scanning + the signal in the loop. */ + + /* Accept this signal as the new signal if either it's longer + * than the previous one, or the previous one was unknown and + * this is decoded. */ + if (thislen > app->signal_bestlen || + (app->signal_decoded == false && decoded)) + { + app->signal_info = *info; + app->signal_bestlen = thislen; + app->signal_decoded = decoded; + raw_samples_copy(DetectedSamples,copy); + raw_samples_center(DetectedSamples,i); + FURI_LOG_E(TAG, "Displayed sample updated (%d samples %lu us)", + (int)thislen, DetectedSamples->short_pulse_dur); + } + } + i += thislen ? thislen : 1; + } + raw_samples_free(copy); + free(info); +} + +/* ============================================================================= + * Decoding + * + * The following code will translates the raw singals as received by + * the CC1101 into logical signals: a bitmap of 0s and 1s sampled at + * the detected data clock interval. + * + * Then the converted signal is passed to the protocols decoders, that look + * for protocol-specific information. We stop at the first decoder that is + * able to decode the data, so protocols here should be registered in + * order of complexity and specificity, with the generic ones at the end. + * ===========================================================================*/ + +/* Set the 'bitpos' bit to value 'val', in the specified bitmap + * 'b' of len 'blen'. + * Out of range bits will silently be discarded. */ +void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val) { + uint32_t byte = bitpos/8; + uint32_t bit = 7-(bitpos&7); + if (byte >= blen) return; + if (val) + b[byte] |= 1<= blen) return 0; + return (b[byte] & (1< rate/2) numbits++; /* There is another one. */ + + /* Limit how much a single sample can spawn. There are likely no + * protocols doing such long pulses when the rate is low. */ + if (numbits > 1024) numbits = 1024; + + if (0) /* Super verbose, so not under the DEBUG_MSG define. */ + FURI_LOG_E(TAG, "%lu converted into %lu (%d) bits", + dur,numbits,(int)level); + + /* If the signal is too short, let's claim it an interference + * and ignore it completely. */ + if (numbits == 0) continue; + + while(numbits--) bitmap_set(b,blen,bitpos++,level); + } + return bitpos; +} + +/* This function converts the line code used to the final data representation. + * The representation is put inside 'buf', for up to 'buflen' bytes of total + * data. For instance in order to convert manchester I can use "10" and "01" + * as zero and one patterns. It is possible to use "?" inside patterns in + * order to skip certain bits. For instance certain devices encode data twice, + * with each bit encoded in manchester encoding and then in its reversed + * representation. In such a case I could use "10??" and "01??". + * + * The function returns the number of bits converted. It will stop as soon + * as it finds a pattern that does not match zero or one patterns, or when + * the end of the bitmap pointed by 'bits' is reached (the length is + * specified in bytes by the caller, via the 'len' parameters). + * + * The decoding starts at the specified offset (in bits) 'off'. */ +uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, const char *zero_pattern, const char *one_pattern) +{ + uint32_t decoded = 0; /* Number of bits extracted. */ + len *= 8; /* Convert bytes to bits. */ + while(off < len) { + bool bitval; + if (bitmap_match_bits(bits,len,off,zero_pattern)) { + bitval = false; + off += strlen(zero_pattern); + } else if (bitmap_match_bits(bits,len,off,one_pattern)) { + bitval = true; + off += strlen(one_pattern); + } else { + break; + } + bitmap_set(buf,buflen,decoded++,bitval); + if (decoded/8 == buflen) break; /* No space left on target buffer. */ + } + return decoded; +} + +/* Supported protocols go here, with the relevant implementation inside + * protocols/.c */ + +extern ProtoViewDecoder Oregon2Decoder; +extern ProtoViewDecoder B4B1Decoder; +extern ProtoViewDecoder RenaultTPMSDecoder; + +ProtoViewDecoder *Decoders[] = { + &Oregon2Decoder, /* Oregon sensors v2.1 protocol. */ + &B4B1Decoder, /* PT, SC, ... 24 bits remotes. */ + &RenaultTPMSDecoder, /* Renault TPMS. */ + NULL +}; + +/* Reset the message info structure before passing it to the decoding + * functions. */ +void initialize_msg_info(ProtoViewMsgInfo *i) { + memset(i,0,sizeof(ProtoViewMsgInfo)); +} + +/* This function is called when a new signal is detected. It converts it + * to a bitstream, and the calls the protocol specific functions for + * decoding. If the signal was decoded correctly by some protocol, true + * is returned. Otherwise false is returned. */ +bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info) { + uint32_t bitmap_bits_size = 4096*8; + uint32_t bitmap_size = bitmap_bits_size/8; + + /* We call the decoders with an offset a few bits before the actual + * signal detected and for a len of a few bits after its end. */ + uint32_t before_after_bits = 2; + + uint8_t *bitmap = malloc(bitmap_size); + uint32_t bits = convert_signal_to_bits(bitmap,bitmap_size,s,-before_after_bits,len+before_after_bits*2,s->short_pulse_dur); + + if (DEBUG_MSG) { /* Useful for debugging purposes. Don't remove. */ + char *str = malloc(1024); + uint32_t j; + for (j = 0; j < bits && j < 1023; j++) { + str[j] = bitmap_get(bitmap,bitmap_size,j) ? '1' : '0'; + } + str[j] = 0; + FURI_LOG_E(TAG, "%lu bits sampled: %s", bits, str); + free(str); + } + + /* Try all the decoders available. */ + int j = 0; + + bool decoded = false; + while(Decoders[j]) { + uint32_t start_time = furi_get_tick(); + decoded = Decoders[j]->decode(bitmap,bitmap_size,bits,info); + uint32_t delta = furi_get_tick() - start_time; + FURI_LOG_E(TAG, "Decoder %s took %lu ms", + Decoders[j]->name, (unsigned long)delta); + if (decoded) break; + j++; + } + + if (!decoded) { + FURI_LOG_E(TAG, "No decoding possible"); + } else { + FURI_LOG_E(TAG, "Decoded %s, raw=%s info=[%s,%s,%s]", info->name, info->raw, info->info1, info->info2, info->info3); + } + free(bitmap); + return decoded; +} diff --git a/applications/plugins/protoview/ui.c b/applications/plugins/protoview/ui.c new file mode 100644 index 000000000..e22e4d57e --- /dev/null +++ b/applications/plugins/protoview/ui.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color) +{ + struct { + uint8_t x; uint8_t y; + } dir[8] = { + {-1,-1}, + {0,-1}, + {1,-1}, + {1,0}, + {1,1}, + {0,1}, + {-1,1}, + {-1,0} + }; + + /* Rotate in all the directions writing the same string to create a + * border, then write the actual string in the other color in the + * middle. */ + canvas_set_color(canvas, border_color); + for (int j = 0; j < 8; j++) + canvas_draw_str(canvas,x+dir[j].x,y+dir[j].y,str); + canvas_set_color(canvas, text_color); + canvas_draw_str(canvas,x,y,str); + canvas_set_color(canvas, ColorBlack); +} diff --git a/applications/plugins/protoview/view_direct_sampling.c b/applications/plugins/protoview/view_direct_sampling.c new file mode 100644 index 000000000..a287dc14a --- /dev/null +++ b/applications/plugins/protoview/view_direct_sampling.c @@ -0,0 +1,46 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +#include + +/* Read directly from the G0 CC1101 pin, and draw a black or white + * dot depending on the level. */ +void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app) { + UNUSED(app); + for (int y = 0; y < 64; y++) { + for (int x = 0; x < 128; x++) { + bool level = furi_hal_gpio_read(&gpio_cc1101_g0); + if (level) canvas_draw_dot(canvas,x,y); + /* Busy loop: this is a terrible approach as it blocks + * everything else, but for now it's the best we can do + * to obtain direct data with some spacing. */ + uint32_t x = 500; while(x--); + } + } + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_with_border(canvas,40,60,"Direct sampling", + ColorWhite,ColorBlack); +} + +/* Handle input */ +void process_input_direct_sampling(ProtoViewApp *app, InputEvent input) { + UNUSED(app); + UNUSED(input); +} + +/* Enter view. Stop the subghz thread to prevent access as we read + * the CC1101 data directly. */ +void view_enter_direct_sampling(ProtoViewApp *app) { + if (app->txrx->txrx_state == TxRxStateRx) { + subghz_worker_stop(app->txrx->worker); + } +} + +/* Exit view. Restore the subghz thread. */ +void view_exit_direct_sampling(ProtoViewApp *app) { + if (app->txrx->txrx_state == TxRxStateRx) { + subghz_worker_start(app->txrx->worker); + } +} diff --git a/applications/plugins/protoview/view_info.c b/applications/plugins/protoview/view_info.c new file mode 100644 index 000000000..fff9c836e --- /dev/null +++ b/applications/plugins/protoview/view_info.c @@ -0,0 +1,41 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* Renders the view with the detected message information. */ +void render_view_info(Canvas *const canvas, ProtoViewApp *app) { + if (app->signal_decoded == false) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 30,36,"No signal decoded"); + return; + } + + /* Protocol name as title. */ + canvas_set_font(canvas, FontPrimary); + uint8_t y = 8, lineheight = 10; + canvas_draw_str(canvas, 0, y, app->signal_info.name); + y += lineheight; + + /* Info fields. */ + char buf[128]; + canvas_set_font(canvas, FontSecondary); + if (app->signal_info.raw[0]) { + snprintf(buf,sizeof(buf),"Raw: %s", app->signal_info.raw); + canvas_draw_str(canvas, 0, y, buf); + y += lineheight; + } + canvas_draw_str(canvas, 0, y, app->signal_info.info1); + y += lineheight; + canvas_draw_str(canvas, 0, y, app->signal_info.info2); + y += lineheight; + canvas_draw_str(canvas, 0, y, app->signal_info.info3); + y += lineheight; +} + +/* Handle input for the settings view. */ +void process_input_info(ProtoViewApp *app, InputEvent input) { + UNUSED(app); + UNUSED(input); + return; +} diff --git a/applications/plugins/protoview/view_raw_signal.c b/applications/plugins/protoview/view_raw_signal.c new file mode 100644 index 000000000..58d23e8ee --- /dev/null +++ b/applications/plugins/protoview/view_raw_signal.c @@ -0,0 +1,97 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* Render the received signal. + * + * The screen of the flipper is 128 x 64. Even using 4 pixels per line + * (where low level signal is one pixel high, high level is 4 pixels + * high) and 4 pixels of spacing between the different lines, we can + * plot comfortably 8 lines. + * + * The 'idx' argument is the first sample to render in the circular + * buffer. */ +void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *buf, uint32_t idx) { + canvas_set_color(canvas, ColorBlack); + + int rows = 8; + uint32_t time_per_pixel = app->us_scale; + uint32_t start_idx = idx; + bool level = 0; + uint32_t dur = 0, sample_num = 0; + for (int row = 0; row < rows ; row++) { + for (int x = 0; x < 128; x++) { + int y = 3 + row*8; + if (dur < time_per_pixel/2) { + /* Get more data. */ + raw_samples_get(buf, idx++, &level, &dur); + sample_num++; + } + + canvas_draw_line(canvas, x,y,x,y-(level*3)); + + /* Write a small triangle under the last sample detected. */ + if (app->signal_bestlen != 0 && + sample_num+start_idx == app->signal_bestlen+1) + { + canvas_draw_dot(canvas,x,y+2); + canvas_draw_dot(canvas,x-1,y+3); + canvas_draw_dot(canvas,x,y+3); + canvas_draw_dot(canvas,x+1,y+3); + sample_num++; /* Make sure we don't mark the next, too. */ + } + + /* Remove from the current level duration the time we + * just plot. */ + if (dur > time_per_pixel) + dur -= time_per_pixel; + else + dur = 0; + } + } +} + +/* Raw pulses rendering. This is our default view. */ +void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app) { + /* Show signal. */ + render_signal(app, canvas, DetectedSamples, app->signal_offset); + + /* Show signal information. */ + char buf[64]; + snprintf(buf,sizeof(buf),"%luus", + (unsigned long)DetectedSamples->short_pulse_dur); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_with_border(canvas, 97, 63, buf, ColorWhite, ColorBlack); + if (app->signal_decoded) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_with_border(canvas, 1, 61, app->signal_info.name, ColorWhite, ColorBlack); + } +} + +/* Handle input for the raw pulses view. */ +void process_input_raw_pulses(ProtoViewApp *app, InputEvent input) { + if (input.type == InputTypeRepeat) { + /* Handle panning of the signal window. Long pressing + * right will show successive samples, long pressing left + * previous samples. */ + if (input.key == InputKeyRight) app->signal_offset++; + else if (input.key == InputKeyLeft) app->signal_offset--; + else if (input.key == InputKeyOk) { + app->signal_offset = 0; + app->us_scale = PROTOVIEW_RAW_VIEW_DEFAULT_SCALE; + } + } else if (input.type == InputTypeShort) { + if (input.key == InputKeyOk) { + /* Reset the current sample to capture the next. */ + reset_current_signal(app); + } else if (input.key == InputKeyDown) { + /* Rescaling. The set becomes finer under 50us per pixel. */ + uint32_t scale_step = app->us_scale >= 50 ? 50 : 10; + if (app->us_scale < 500) app->us_scale += scale_step; + } else if (input.key == InputKeyUp) { + uint32_t scale_step = app->us_scale > 50 ? 50 : 10; + if (app->us_scale > 10) app->us_scale -= scale_step; + } + } +} diff --git a/applications/plugins/protoview/view_settings.c b/applications/plugins/protoview/view_settings.c new file mode 100644 index 000000000..22ac5ef0f --- /dev/null +++ b/applications/plugins/protoview/view_settings.c @@ -0,0 +1,93 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* Renders a single view with frequency and modulation setting. However + * this are logically two different views, and only one of the settings + * will be highlighted. */ +void render_view_settings(Canvas *const canvas, ProtoViewApp *app) { + canvas_set_font(canvas, FontPrimary); + if (app->current_view == ViewFrequencySettings) + canvas_draw_str_with_border(canvas,1,10,"Frequency",ColorWhite,ColorBlack); + else + canvas_draw_str(canvas,1,10,"Frequency"); + + if (app->current_view == ViewModulationSettings) + canvas_draw_str_with_border(canvas,70,10,"Modulation",ColorWhite,ColorBlack); + else + canvas_draw_str(canvas,70,10,"Modulation"); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas,10,61,"Use up and down to modify"); + + /* Show frequency. We can use big numbers font since it's just a number. */ + if (app->current_view == ViewFrequencySettings) { + char buf[16]; + snprintf(buf,sizeof(buf),"%.2f",(double)app->frequency/1000000); + canvas_set_font(canvas, FontBigNumbers); + canvas_draw_str(canvas, 30, 40, buf); + } else if (app->current_view == ViewModulationSettings) { + int current = app->modulation; + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name); + } +} + +/* Handle input for the settings view. */ +void process_input_settings(ProtoViewApp *app, InputEvent input) { + if (input.type == InputTypeLong && input.key == InputKeyOk) { + /* Long pressing to OK sets the default frequency and + * modulation. */ + app->frequency = subghz_setting_get_default_frequency(app->setting); + app->modulation = 0; + } else if (input.type == InputTypePress && + (input.key != InputKeyDown || input.key != InputKeyUp)) + { + /* Handle up and down to change frequency or modulation. */ + if (app->current_view == ViewFrequencySettings) { + size_t curidx = 0, i; + size_t count = subghz_setting_get_frequency_count(app->setting); + + /* Scan the list of frequencies to check for the index of the + * currently set frequency. */ + for(i = 0; i < count; i++) { + uint32_t freq = subghz_setting_get_frequency(app->setting,i); + if (freq == app->frequency) { + curidx = i; + break; + } + } + if (i == count) return; /* Should never happen. */ + + if (input.key == InputKeyUp) { + curidx = curidx == 0 ? count-1 : curidx-1; + } else if (input.key == InputKeyDown) { + curidx = (curidx+1) % count; + } else { + return; + } + app->frequency = subghz_setting_get_frequency(app->setting,curidx); + } else if (app->current_view == ViewModulationSettings) { + uint32_t count = 0; + uint32_t modid = app->modulation; + + while(ProtoViewModulations[count].name != NULL) count++; + if (input.key == InputKeyUp) { + modid = modid == 0 ? count-1 : modid-1; + } else if (input.key == InputKeyDown) { + modid = (modid+1) % count; + } else { + return; + } + app->modulation = modid; + } + } else { + return; + } + + /* Apply changes. */ + FURI_LOG_E(TAG, "Setting view, setting frequency/modulation to %lu %s", app->frequency, ProtoViewModulations[app->modulation].name); + radio_rx_end(app); + radio_begin(app); + radio_rx(app); +} diff --git a/applications/plugins/usb_hid_autofire/CHANGELOG.md b/applications/plugins/usb_hid_autofire/CHANGELOG.md index d0924edd3..62929bc8f 100644 --- a/applications/plugins/usb_hid_autofire/CHANGELOG.md +++ b/applications/plugins/usb_hid_autofire/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.5 +- Fix compatibility with Flipper Zero firmware 0.74.2 + ## 0.4 - Show active/inactive state in primary font (bold) diff --git a/applications/plugins/usb_hid_autofire/application.fam b/applications/plugins/usb_hid_autofire/application.fam index 10e3e6cf4..8a184d674 100644 --- a/applications/plugins/usb_hid_autofire/application.fam +++ b/applications/plugins/usb_hid_autofire/application.fam @@ -1,5 +1,7 @@ +# qv. https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/AppManifests.md + App( - appid="USB_HID_Autofire", + appid="usb_hid_autofire", name="USB HID Autofire", apptype=FlipperAppType.EXTERNAL, entry_point="usb_hid_autofire_app", diff --git a/applications/plugins/usb_hid_autofire/tools.c b/applications/plugins/usb_hid_autofire/tools.c new file mode 100644 index 000000000..2b452b55b --- /dev/null +++ b/applications/plugins/usb_hid_autofire/tools.c @@ -0,0 +1,56 @@ +// +// Tools for USB HID Autofire +// + +void strrev(char* arr, int start, int end) { + char temp; + + if (start >= end) + return; + + temp = *(arr + start); + *(arr + start) = *(arr + end); + *(arr + end) = temp; + + start++; + end--; + strrev(arr, start, end); +} + +char *itoa(int number, char *arr, int base) +{ + int i = 0, r, negative = 0; + + if (number == 0) + { + arr[i] = '0'; + arr[i + 1] = '\0'; + return arr; + } + + if (number < 0 && base == 10) + { + number *= -1; + negative = 1; + } + + while (number != 0) + { + r = number % base; + arr[i] = (r > 9) ? (r - 10) + 'a' : r + '0'; + i++; + number /= base; + } + + if (negative) + { + arr[i] = '-'; + i++; + } + + strrev(arr, 0, i - 1); + + arr[i] = '\0'; + + return arr; +} diff --git a/applications/plugins/usb_hid_autofire/tools.h b/applications/plugins/usb_hid_autofire/tools.h new file mode 100644 index 000000000..9c71ea6ca --- /dev/null +++ b/applications/plugins/usb_hid_autofire/tools.h @@ -0,0 +1,7 @@ +#ifndef FLIPPERZERO_FIRMWARE_TOOLS_H +#define FLIPPERZERO_FIRMWARE_TOOLS_H + +void strrev(char *arr, int start, int end); +char *itoa(int number, char *arr, int base); + +#endif //FLIPPERZERO_FIRMWARE_TOOLS_H diff --git a/applications/plugins/usb_hid_autofire/usb_hid_autofire.c b/applications/plugins/usb_hid_autofire/usb_hid_autofire.c index 97c9d4759..1333ba94a 100644 --- a/applications/plugins/usb_hid_autofire/usb_hid_autofire.c +++ b/applications/plugins/usb_hid_autofire/usb_hid_autofire.c @@ -4,6 +4,7 @@ #include #include #include "version.h" +#include "tools.h" // Uncomment to be able to make a screenshot //#define USB_HID_AUTOFIRE_SCREENSHOT @@ -25,7 +26,9 @@ uint32_t autofire_delay = 10; static void usb_hid_autofire_render_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); char autofire_delay_str[12]; + //std::string pi = "pi is " + std::to_string(3.1415926); itoa(autofire_delay, autofire_delay_str, 10); + //sprintf(autofire_delay_str, "%lu", autofire_delay); canvas_clear(canvas); @@ -85,19 +88,19 @@ int32_t usb_hid_autofire_app(void* p) { } switch(event.input.key) { - case InputKeyOk: - btn_left_autofire = !btn_left_autofire; - break; - case InputKeyLeft: - if(autofire_delay > 0) { - autofire_delay -= 10; - } - break; - case InputKeyRight: - autofire_delay += 10; - break; - default: - break; + case InputKeyOk: + btn_left_autofire = !btn_left_autofire; + break; + case InputKeyLeft: + if(autofire_delay > 0) { + autofire_delay -= 10; + } + break; + case InputKeyRight: + autofire_delay += 10; + break; + default: + break; } } } diff --git a/applications/plugins/usb_hid_autofire/version.h b/applications/plugins/usb_hid_autofire/version.h index ac1f5d0fa..669b388a5 100644 --- a/applications/plugins/usb_hid_autofire/version.h +++ b/applications/plugins/usb_hid_autofire/version.h @@ -1 +1 @@ -#define VERSION "0.4" +#define VERSION "0.5" From b5ab5549110591f00458ba1761334563518c5f2c Mon Sep 17 00:00:00 2001 From: jbohack Date: Mon, 9 Jan 2023 15:53:55 -0500 Subject: [PATCH 21/64] added nsfw text for u2f & sfw_mode compatibility --- .../main/u2f/scenes/u2f_scene_error.c | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/applications/main/u2f/scenes/u2f_scene_error.c b/applications/main/u2f/scenes/u2f_scene_error.c index e10e9c098..20b7be952 100644 --- a/applications/main/u2f/scenes/u2f_scene_error.c +++ b/applications/main/u2f/scenes/u2f_scene_error.c @@ -1,4 +1,5 @@ #include "../u2f_app_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" static void u2f_scene_error_event_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -11,6 +12,8 @@ static void u2f_scene_error_event_callback(GuiButtonType result, InputType type, void u2f_scene_error_on_enter(void* context) { U2fApp* app = context; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); if(app->error == U2fAppErrorNoFiles) { widget_add_icon_element(app->widget, 0, 0, &I_SDQuestion_35x43); @@ -26,19 +29,34 @@ void u2f_scene_error_on_enter(void* context) { app->widget, GuiButtonTypeLeft, "Back", u2f_scene_error_event_callback, app); } else if(app->error == U2fAppErrorCloseRpc) { widget_add_icon_element(app->widget, 78, 0, &I_ActiveConnection_50x64); - widget_add_string_multiline_element( - app->widget, 3, 2, AlignLeft, AlignTop, FontPrimary, "Connection\nis active!"); - widget_add_string_multiline_element( - app->widget, - 3, - 30, - AlignLeft, - AlignTop, - FontSecondary, - "Disconnect from\nPC or phone to\nuse this function."); + if (settings->sfw_mode) { + widget_add_string_multiline_element( + app->widget, 3, 2, AlignLeft, AlignTop, FontPrimary, "Connection\nis active!"); + widget_add_string_multiline_element( + app->widget, + 3, + 30, + AlignLeft, + AlignTop, + FontSecondary, + "Disconnect from\nPC or phone to\nuse this function."); + } + else { + widget_add_string_multiline_element( + app->widget, 3, 2, AlignLeft, AlignTop, FontPrimary, "I am not\na whore!"); + widget_add_string_multiline_element( + app->widget, + 3, + 30, + AlignLeft, + AlignTop, + FontSecondary, + "Pull out from\nPC or phone to\nuse me like this."); + } } view_dispatcher_switch_to_view(app->view_dispatcher, U2fAppViewError); + free(settings); } bool u2f_scene_error_on_event(void* context, SceneManagerEvent event) { From a88c0f14eb3e97227b7c1ef7158d6a73877922ab Mon Sep 17 00:00:00 2001 From: Clara K Date: Mon, 9 Jan 2023 23:12:56 +0100 Subject: [PATCH 22/64] Wiki > Docs --- documentation/.gitignore | 2 - documentation/AppManifests.md | 137 - documentation/AppsOnSDCard.md | 80 - documentation/BarcodeGenerator.md | 15 - documentation/BluetoothRemote.md | 58 - documentation/CustomFlipperName.md | 35 - documentation/DangerousSettings.md | 12 - documentation/Doxyfile | 2616 ----------------- documentation/KeyCombo.md | 119 - documentation/MultiConverter.md | 61 - documentation/NRF24.md | 51 - documentation/OTA.md | 146 - documentation/RoadMap.md | 46 - documentation/SentrySafe.md | 17 - documentation/SubGHzRemotePlugin.md | 66 - documentation/SubGHzSettings.md | 63 - documentation/UnitTests.md | 65 - documentation/UniversalRemotes.md | 69 - documentation/apps.md | 98 - documentation/fbt.md | 103 - .../file_formats/BadUsbScriptFormat.md | 110 - .../file_formats/InfraredFileFormats.md | 127 - .../file_formats/LfRfidFileFormat.md | 49 - documentation/file_formats/NfcFileFormats.md | 255 -- .../file_formats/SubGhzFileFormats.md | 266 -- .../file_formats/iButtonFileFormat.md | 29 - documentation/keyboard_layout_file.md | 20 - documentation/readme.md | 179 -- 28 files changed, 4894 deletions(-) delete mode 100644 documentation/.gitignore delete mode 100644 documentation/AppManifests.md delete mode 100644 documentation/AppsOnSDCard.md delete mode 100644 documentation/BarcodeGenerator.md delete mode 100644 documentation/BluetoothRemote.md delete mode 100644 documentation/CustomFlipperName.md delete mode 100644 documentation/DangerousSettings.md delete mode 100644 documentation/Doxyfile delete mode 100644 documentation/KeyCombo.md delete mode 100644 documentation/MultiConverter.md delete mode 100644 documentation/NRF24.md delete mode 100644 documentation/OTA.md delete mode 100644 documentation/RoadMap.md delete mode 100644 documentation/SentrySafe.md delete mode 100644 documentation/SubGHzRemotePlugin.md delete mode 100644 documentation/SubGHzSettings.md delete mode 100644 documentation/UnitTests.md delete mode 100644 documentation/UniversalRemotes.md delete mode 100644 documentation/apps.md delete mode 100644 documentation/fbt.md delete mode 100644 documentation/file_formats/BadUsbScriptFormat.md delete mode 100644 documentation/file_formats/InfraredFileFormats.md delete mode 100644 documentation/file_formats/LfRfidFileFormat.md delete mode 100644 documentation/file_formats/NfcFileFormats.md delete mode 100644 documentation/file_formats/SubGhzFileFormats.md delete mode 100644 documentation/file_formats/iButtonFileFormat.md delete mode 100644 documentation/keyboard_layout_file.md delete mode 100644 documentation/readme.md diff --git a/documentation/.gitignore b/documentation/.gitignore deleted file mode 100644 index c18ff03bb..000000000 --- a/documentation/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/html -/latex \ No newline at end of file diff --git a/documentation/AppManifests.md b/documentation/AppManifests.md deleted file mode 100644 index 195fe9256..000000000 --- a/documentation/AppManifests.md +++ /dev/null @@ -1,137 +0,0 @@ -# Flipper Application Manifests (.fam) - -All components of Flipper Zero firmware — services, user applications, and system settings — are developed independently. Each component has a build system manifest file named `application.fam`, which defines the basic properties of that component and its relations to other parts of the system. - -When building firmware, **`fbt`** collects all application manifests and processes their dependencies. Then it builds only those components referenced in the current build configuration. See [FBT docs](./fbt.md#firmware-application-set) for details on build configurations. - -## Application definition - -A firmware component's properties are declared in a Python code snippet, forming a call to the `App()` function with various parameters. - -Only two parameters are mandatory: **_appid_** and **_apptype_**. Others are optional and may only be meaningful for certain application types. - -### Parameters - -- **appid**: string, application ID within the build system. It is used to specify which applications to include in the build configuration and resolve dependencies and conflicts. - -- **apptype**: member of FlipperAppType.\* enumeration. Valid values are: - -| Enum member | Firmware component type | -| ----------- | ------------------------------------------------------------------------------------------- | -| SERVICE | System service, created at early startup | -| SYSTEM | Application is not being shown in any menus. It can be started by other apps or from CLI | -| APP | Regular application for the main menu | -| PLUGIN | Application to be built as a part of the firmware and to be placed in the Plugins menu | -| DEBUG | Application only visible in Debug menu with debug mode enabled | -| ARCHIVE | One and only Archive app | -| SETTINGS | Application to be placed in the system settings menu | -| STARTUP | Callback function to run at system startup. Does not define a separate app | -| EXTERNAL | Application to be built as `.fap` plugin | -| METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles | - -- **name**: name displayed in menus. -- **entry_point**: C function to be used as the application's entry point. Note that C++ function names are mangled, so you need to wrap them in `extern "C"` to use them as entry points. -- **flags**: internal flags for system apps. Do not use. -- **cdefines**: C preprocessor definitions to declare globally for other apps when the current application is included in the active build configuration. -- **requires**: list of application IDs to include in the build configuration when the current application is referenced in the list of applications to build. -- **conflicts**: list of application IDs with which the current application conflicts. If any of them is found in the constructed application list, **`fbt`** will abort the firmware build process. -- **provides**: functionally identical to **_requires_** field. -- **stack_size**: stack size in bytes to allocate for an application on its startup. Note that allocating a stack too small for an app to run will cause a system crash due to stack overflow, and allocating too much stack space will reduce usable heap memory size for apps to process data. _Note: you can use `ps` and `free` CLI commands to profile your app's memory usage._ -- **icon**: animated icon name from built-in assets to be used when building the app as a part of the firmware. -- **order**: order of an application within its group when sorting entries in it. The lower the order is, the closer to the start of the list the item is placed. _Used for ordering startup hooks and menu entries._ -- **sdk_headers**: list of C header files from this app's code to include in API definitions for external applications. -- **targets**: list of strings and target names with which this application is compatible. If not specified, the application is built for all targets. The default value is `["all"]`. - -#### Parameters for external applications - -The following parameters are used only for [FAPs](./AppsOnSDCard.md): - -- **sources**: list of strings, file name masks used for gathering sources within the app folder. The default value of `["*.c*"]` includes C and C++ source files. Applications cannot use the `"lib"` folder for their own source code, as it is reserved for **fap_private_libs**. -- **fap_version**: tuple, 2 numbers in the form of (x,y): application version to be embedded within .fap file. The default value is (0,1), meaning version "0.1". -- **fap_icon**: name of a `.png` file, 1-bit color depth, 10x10px, to be embedded within `.fap` file. -- **fap_libs**: list of extra libraries to link the application against. Provides access to extra functions that are not exported as a part of main firmware at the expense of increased `.fap` file size and RAM consumption. -- **fap_category**: string, may be empty. App subcategory, also determines the path of the FAP within the apps folder in the file system. -- **fap_description**: string, may be empty. Short application description. -- **fap_author**: string, may be empty. Application's author. -- **fap_weburl**: string, may be empty. Application's homepage. -- **fap_icon_assets**: string. If present, it defines a folder name to be used for gathering image assets for this application. These images will be preprocessed and built alongside the application. See [FAP assets](./AppsOnSDCard.md#fap-assets) for details. -- **fap_extbuild**: provides support for parts of application sources to be built by external tools. Contains a list of `ExtFile(path="file name", command="shell command")` definitions. **`fbt`** will run the specified command for each file in the list. - -Note that commands are executed at the firmware root folder, and all intermediate files must be placed in an application's temporary build folder. For that, you can use pattern expansion by **`fbt`**: `${FAP_WORK_DIR}` will be replaced with the path to the application's temporary build folder, and `${FAP_SRC_DIR}` will be replaced with the path to the application's source folder. You can also use other variables defined internally by **`fbt`**. - -Example for building an app from Rust sources: - -```python - sources=["target/thumbv7em-none-eabihf/release/libhello_rust.a"], - fap_extbuild=( - ExtFile( - path="${FAP_WORK_DIR}/target/thumbv7em-none-eabihf/release/libhello_rust.a", - command="cargo build --release --verbose --target thumbv7em-none-eabihf --target-dir ${FAP_WORK_DIR}/target --manifest-path ${FAP_SRC_DIR}/Cargo.toml", - ), - ), -``` - -- **fap_private_libs**: list of additional libraries distributed as sources alongside the application. These libraries will be built as a part of the application build process. - Library sources must be placed in a subfolder of the `lib` folder within the application's source folder. - Each library is defined as a call to the `Lib()` function, accepting the following parameters: - - - **name**: name of the library's folder. Required. - - **fap_include_paths**: list of the library's relative paths to add to the parent fap's include path list. The default value is `["."]`, meaning the library's source root. - - **sources**: list of filename masks to be used for gathering include files for this library. Paths are relative to the library's source root. The default value is `["*.c*"]`. - - **cflags**: list of additional compiler flags to be used for building this library. The default value is `[]`. - - **cdefines**: list of additional preprocessor definitions to be used for building this library. The default value is `[]`. - - **cincludes**: list of additional include paths to be used for building this library. Paths are relative to the application's root. This can be used for providing external search paths for this library's code — for configuration headers. The default value is `[]`. - -Example for building an app with a private library: - -```python - fap_private_libs=[ - Lib( - name="mbedtls", - fap_include_paths=["include"], - sources=[ - "library/des.c", - "library/sha1.c", - "library/platform_util.c", - ], - cdefines=["MBEDTLS_ERROR_C"], - ), - Lib( - name="loclass", - cflags=["-Wno-error"], - ), - ], -``` - -For that snippet, **`fbt`** will build 2 libraries: one from sources in `lib/mbedtls` folder and another from sources in the `lib/loclass` folder. For the `mbedtls` library, **`fbt`** will add `lib/mbedtls/include` to the list of include paths for the application and compile only the files specified in the `sources` list. Additionally, **`fbt`** will enable `MBEDTLS_ERROR_C` preprocessor definition for `mbedtls` sources. -For the `loclass` library, **`fbt`** will add `lib/loclass` to the list of the include paths for the application and build all sources in that folder. Also, **`fbt`** will disable treating compiler warnings as errors for the `loclass` library, which can be useful when compiling large 3rd-party codebases. - -Both libraries will be linked with the application. - -## `.fam` file contents - -The `.fam` file contains one or more application definitions. For example, here's a part of `applications/service/bt/application.fam`: - -```python -App( - appid="bt_start", - apptype=FlipperAppType.STARTUP, - entry_point="bt_on_system_start", - order=70, -) - -App( - appid="bt_settings", - name="Bluetooth", - apptype=FlipperAppType.SETTINGS, - entry_point="bt_settings_app", - stack_size=1 * 1024, - requires=[ - "bt", - "gui", - ], - order=10, -) -``` - -For more examples, see `.fam` files from various firmware parts. diff --git a/documentation/AppsOnSDCard.md b/documentation/AppsOnSDCard.md deleted file mode 100644 index 9ab7e9b26..000000000 --- a/documentation/AppsOnSDCard.md +++ /dev/null @@ -1,80 +0,0 @@ -# FAP (Flipper Application Package) - -[fbt](./fbt.md) supports building applications as FAP files. FAPs are essentially `.elf` executables with extra metadata and resources bundled in. - -FAPs are built with the `faps` target. They can also be deployed to the `dist` folder with the `fap_dist` target. - -FAPs do not depend on being run on a specific firmware version. Compatibility is determined by the FAP's metadata, which includes the required [API version](#api-versioning). - -## How to set up an application to be built as a FAP - -FAPs are created and developed the same way as internal applications that are part of the firmware. - -To build your application as a FAP, create a folder with your app's source code in `applications_user`, then write its code the way you'd do when creating a regular built-in application. Then configure its `application.fam` manifest, and set its _apptype_ to FlipperAppType.EXTERNAL. See [Application Manifests](./AppManifests.md#application-definition) for more details. - -- To build your application, run `./fbt fap_{APPID}`, where APPID is your application's ID in its manifest. -- To build your app and upload it over USB to run on Flipper, use `./fbt launch_app APPSRC=applications/path/to/app`. This command is configured in the default [VS Code profile](../.vscode/ReadMe.md) as a "Launch App on Flipper" build action (Ctrl+Shift+B menu). -- To build all FAPs, run `./fbt faps` or `./fbt fap_dist`. - -## FAP assets - -FAPs can include static and animated images as private assets. They will be automatically compiled alongside application sources and can be referenced the same way as assets from the main firmware. - -To use that feature, put your images in a subfolder inside your application's folder, then reference that folder in your application's manifest in the `fap_icon_assets` field. See [Application Manifests](./AppManifests.md#application-definition) for more details. - -To use these assets in your application, put `#include "{APPID}_icons.h"` in your application's source code, where `{APPID}` is the `appid` value field from your application's manifest. Then you can use all icons from your application's assets the same way as if they were a part of `assets_icons.h` of the main firmware. - -Images and animated icons should follow the same [naming convention](../assets/ReadMe.md#asset-naming-rules) as those from the main firmware. - -## Debugging FAPs - -**`fbt`** includes a script for gdb-py to provide debugging support for FAPs, `debug/flipperapps.py`. It is loaded in default debugging configurations by **`fbt`** and stock VS Code configurations. - -With it, you can debug FAPs as if they were a part of the main firmware — inspect variables, set breakpoints, step through the code, etc. - -### Setting up debugging environment - -The debugging support script looks up debugging information in the latest firmware build directory (`build/latest`). That directory is symlinked by `fbt` to the latest firmware configuration (Debug or Release) build directory when you run `./fbt` for the chosen configuration. See [fbt docs](./fbt.md#nb) for details. - -To debug FAPs, do the following: - -1. Build firmware with `./fbt` -2. Flash it with `./fbt flash` -3. [Build your FAP](#how-to-set-up-an-application-to-be-built-as-a-fap) and run it on Flipper - -After that, you can attach with `./fbt debug` or VS Code and use all debug features. - -It is **important** that firmware and application build type (debug/release) match and that the matching firmware folder is linked as `build/latest`. Otherwise, debugging will not work. - -## How Flipper runs an application from an SD card - -Flipper's MCU cannot run code directly from external storage, so it needs to be copied to RAM first. That is done by the App Loader application responsible for loading the FAP from the SD card, verifying its integrity and compatibility, copying it to RAM, and adjusting it for its new location. - -Since FAP has to be loaded to RAM to be executed, the amount of RAM available for allocations from heap is reduced compared to running the same app from flash, as a part of the firmware. Note that the amount of occupied RAM is less than the total FAP file size since only code and data sections are allocated, while the FAP file includes extra information only used at app load time. - -Applications are built for a specific API version. It is a part of the hardware target's definition and contains a major and minor version number. The App Loader checks if the application's major API version matches the firmware's major API version. - -The App Loader allocates memory for the application and copies it to RAM, processing relocations and providing concrete addresses for imported symbols using the [symbol table](#symbol-table). Then it starts the application. - -## API versioning - -Not all parts of firmware are available for external applications. A subset of available functions and variables is defined in the "api_symbols.csv" file, which is a part of the firmware target definition in the `firmware/targets/` directory. - -**`fbt`** uses semantic versioning for the API. The major version is incremented when there are breaking changes in the API. The minor version is incremented when new features are added. - -Breaking changes include: - -- Removing a function or a global variable -- Changing the signature of a function - -API versioning is mostly automated by **`fbt`**. When rebuilding the firmware, **`fbt`** checks if there are any changes in the API exposed by headers gathered from `SDK_HEADERS`. If so, it stops the build, adjusts the API version, and asks the user to go through the changes in the `.csv` file. New entries are marked with a "`?`" mark, and the user is supposed to change the mark to "`+`" for the entry to be exposed for FAPs, or to "`-`" for it to be unavailable. - -**`fbt`** will not allow building a firmware until all "`?`" entries are changed to "`+`" or "`-`". - -**NB:** **`fbt`** automatically manages the API version. The only case where manually incrementing the major API version is allowed (and required) is when existing "`+`" entries are to be changed to "`-`". - -### Symbol table - -The symbol table is a list of symbols exported by firmware and available for external applications. It is generated by **`fbt`** from the API symbols file and is used by the App Loader to resolve addresses of imported symbols. It is build as a part of the `fap_loader` application. - -**`fbt`** also checks if all imported symbols are present in the symbol table. If there are any missing symbols, it will issue a warning listing them. The application won't be able to run on the device until all required symbols are provided in the symbol table. diff --git a/documentation/BarcodeGenerator.md b/documentation/BarcodeGenerator.md deleted file mode 100644 index 8b51d0a01..000000000 --- a/documentation/BarcodeGenerator.md +++ /dev/null @@ -1,15 +0,0 @@ -# This is a UPC-A Barcode Generator for the Flipper Zero hardware. - -## Author: [McAzzaMan](https://github.com/McAzzaMan/flipperzero-firmware/tree/UPC-A_Barcode_Generator/applications/barcode_generator) - - - -It will eventually be expanded into other barcode types. It currently only generates UPC-A type barcodes. - - - - -Controls-
-Hitting the centre button on the Flipper toggles edit mode. -When in edit mode, left and right will change the digit to be changed, and up and down will adjust the digit value. - - diff --git a/documentation/BluetoothRemote.md b/documentation/BluetoothRemote.md deleted file mode 100644 index e01b06417..000000000 --- a/documentation/BluetoothRemote.md +++ /dev/null @@ -1,58 +0,0 @@ -_### How to use the Bluetooth remote control function of your Flipper :_ - -Once your Flipper is turned on, navigate with the "up" and "down" buttons until you reach the "Plugins" menu - -![Plugins](https://user-images.githubusercontent.com/829842/187899947-29c8d41a-fc61-4a0e-85a6-6bc8b04e60cd.png) - -Enter with the "middle" button and choose the "Bluetooth Remote" function - -![BTRemote](https://user-images.githubusercontent.com/829842/187900232-493a33a1-b461-44fc-b91d-1fe17e65eaa1.png) - -From this menu (**and only this one**), you will find a new bluetooth device named _Control "Flipper Name"_ - -Pair your Phone/Tablet/Computer/... to this device and you're good to go for controlling your remote devices ! (I skip the doc on how to pair 2 bluetooth devices...) - -Once paired, the Flipper LED will remain blue/fixed throughout the session in the "Bluetooth Remote" menu. If you leave the menu, the led goes off/the Bluetooth connection disappears: The blue led is a good way to know if you are connected or not. - -You will find in the main menu the different types of remote controls available - -![Menu](https://user-images.githubusercontent.com/829842/187900725-791d2be5-75c5-45f5-8baf-19af0026e341.png) - -**Keynote** - -Ultra simplified keyboard only for moving around in a document for example, or for certain presentations (Powerpoint or others...) - -![Keynote](https://user-images.githubusercontent.com/829842/187900971-1b17e292-46c9-4fa8-826a-194aab066c8b.png) - -**Full keyboard** - -You know what it is and how to use it ;) - -![Keyboard](https://user-images.githubusercontent.com/829842/187903229-16f9b944-bad6-4856-9dbd-b1d6182becaa.png) - -**Media** - -Up : Volume increase -Down: Volume decrease -Middle : Play/Stop -Left : Rewind -Right : Forward - -![Media](https://user-images.githubusercontent.com/829842/187903415-21d9e857-56d6-4571-8ad1-186025f56272.png) - -**Mouse** - -Up : Up -Down : Down -Left : Left -Right : Right -Middle : Mouse Left button -Back : Mouse Right Button - -![Mouse](https://user-images.githubusercontent.com/829842/187903920-adcd29de-3d51-48b7-8df2-d434824dfbcb.png) - -To **exit** each menu, simply **long press the "back" button**, which gives you the option to choose to leave the Bluetooth menu for good, choose another remote or stay on the one you were on. - -![Close](https://user-images.githubusercontent.com/829842/187904268-66bb2f50-10cb-4959-b0bb-7b30d18374e0.png) - -Doc by Foul (2022). diff --git a/documentation/CustomFlipperName.md b/documentation/CustomFlipperName.md deleted file mode 100644 index 8e8ab3819..000000000 --- a/documentation/CustomFlipperName.md +++ /dev/null @@ -1,35 +0,0 @@ -# How to change Flipper name: -## [Feature & Documentation By Unleashed/xMasterX](https://github.com/DarkFlippers/unleashed-firmware/documentation/CustomFlipperName.md) - -## Instruction -1. Read [How to build](https://github.com/ClaraCrazy/Flipper-Xtreme/blob/main/documentation/HowToBuild.md) and [How to install](https://github.com/RogueMaster/flipperzero-firmware/blob/dev/documentation/HowToInstall.md) to know how to build and install firmware -2. Follow how to build instructions to prepare all things before continuing -3. Run release build to verify all is ok - `./fbt COMPACT=1 DEBUG=0 updater_package` -4. Clear build files - `./fbt COMPACT=1 DEBUG=0 updater_package -c` -5. Run command with extra environment var before `./fbt` that variable should contain your custom name in alphanumeric characters - max length 8 chars - `CUSTOM_FLIPPER_NAME=Name ./fbt COMPACT=1 DEBUG=0 updater_package` - where `Name` write your custom name -6. Copy `dist/f7-C/f7-update-local` folder to microSD `update/myfw/` and run `update` file on flipper from file manager app (Archive) -7. Flash from microSD card only!!!! .dfu update from qFlipper will not work properly since name and serial number will be changed -8. Done, you will have custom name, serial number and bluetooth mac address -9. Also you can skip 5-7 and flash with `CUSTOM_FLIPPER_NAME=Name ./fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full` - - -## Troubleshooting -### I'm using Windows and name changing / building firmware doesn't work -- Use PowerShell or VSCode terminal(powershell by default) -- Clear build files - `.\fbt.cmd COMPACT=1 DEBUG=0 updater_package -c` -- Enter this in same terminal `$Env:CUSTOM_FLIPPER_NAME="Name"` -- Run release build - `.\fbt.cmd COMPACT=1 DEBUG=0 updater_package` -- Flash as described before (see 6.) -- If something still not work - Run powershell or VSCode as Admin -### Name stays same for every new build -- Clear build files - `./fbt COMPACT=1 DEBUG=0 updater_package -c` -- Try again -### I want to return my original name and serial number -- Flash stock FW or any CFW using microSD card offline update method - -Or -- Clear build files - `./fbt COMPACT=1 DEBUG=0 updater_package -c` -- Run release build - `./fbt COMPACT=1 DEBUG=0 updater_package` -- Copy `dist/f7-C/f7-update-local` folder to microSD `update/myfw/` and run `update` file on flipper from file manager app (Archive) -- Flash from microSD card only, .dfu update from qFlipper will not work properly since name and serial number will be changed diff --git a/documentation/DangerousSettings.md b/documentation/DangerousSettings.md deleted file mode 100644 index d43eeaca2..000000000 --- a/documentation/DangerousSettings.md +++ /dev/null @@ -1,12 +0,0 @@ -## How to extend SubGHz supported frequency range - -#### CC1101 Frequency range specs: 300-348 MHz, 386-464 MHz, and 778-928 MHz -#### This setting will extend to: 281-361 MHz, 378-481 MHz, and 749-962 MHz - -1. Please do not do that unless you know what exactly you are doing -2. You don't need extended range for almost all use cases -3. Extending frequency range and transmitting on frequencies that outside of hardware specs can damage your hardware! -4. Flipper Devices team and/or unleashed/RogueMaster fw developers are not responsible of any damage that can be caused by using CFW or extending frequency ranges!!! - -If you really sure you need that change, find `subghz/assets/extend_range.txt` file on your microSD, read comments on first lines -and change `false` to `true` \ No newline at end of file diff --git a/documentation/Doxyfile b/documentation/Doxyfile deleted file mode 100644 index 1824e5a52..000000000 --- a/documentation/Doxyfile +++ /dev/null @@ -1,2616 +0,0 @@ -# Doxyfile 1.9.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the configuration -# file that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# https://www.gnu.org/software/libiconv/ for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "FlipperZero Firmware" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = documentation - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = YES - -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line -# such as -# /*************** -# as being the beginning of a Javadoc-style comment "banner". If set to NO, the -# Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. -# The default value is: NO. - -JAVADOC_BANNER = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# By default Python docstrings are displayed as preformatted text and doxygen's -# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as doxygen documentation. -# The default value is: YES. - -PYTHON_DOCSTRING = YES - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:^^" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". Note that you cannot put \n's in the value part of an alias -# to insert newlines (in the resulting output). You can put ^^ in the value part -# of an alias to insert a newline as if a physical newline was in the original -# file. When you need a literal { or } or , in the value part of an alias you -# have to escape them by means of a backslash (\), this can lead to conflicts -# with the commands \{ and \} for these it is advised to use the version @{ and -# @} or use a double escape (\\{ and \\}) - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice -# sources only. Doxygen will then generate output that is more tailored for that -# language. For instance, namespaces will be presented as modules, types will be -# separated into more groups, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_SLICE = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, -# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: -# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser -# tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files -# as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add -# * to the FILE_PATTERNS. -# -# Note see also the list of default file extension mappings. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 5 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use -# during processing. When set to 0 doxygen will based this on the number of -# cores available in the system. You can set it explicitly to a value larger -# than 0 to get more control over the balance between CPU load and processing -# speed. At this moment only the input processing can be done using multiple -# threads. Since this is still an experimental feature the default is set to 1, -# which effectively disables parallel processing. Please report any issues you -# encounter. Generating dot graphs in parallel is controlled by the -# DOT_NUM_THREADS setting. -# Minimum value: 0, maximum value: 32, default value: 1. - -NUM_PROC_THREADS = 1 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual -# methods of a class will be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIV_VIRTUAL = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If this flag is set to YES, the name of an unnamed parameter in a declaration -# will be determined by the corresponding definition. By default unnamed -# parameters remain unnamed in the output. -# The default value is: YES. - -RESOLVE_UNNAMED_PARAMS = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# declarations. If set to NO, these declarations will be included in the -# documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be -# able to match the capabilities of the underlying filesystem. In case the -# filesystem is case sensitive (i.e. it supports files in the same directory -# whose names only differ in casing), the option must be set to YES to properly -# deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with -# output files written for symbols that only differ in casing, such as for two -# classes, one named CLASS and the other named Class, and to also support -# references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option -# to NO, whereas on Linux or other Unix flavors it should typically be set to -# YES. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class -# will show which file needs to be included to use the class. -# The default value is: YES. - -SHOW_HEADERFILE = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. See also section "Changing the -# layout of pages" for information. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as documenting some parameters in -# a documented function twice, or documenting parameters that don't exist or -# using markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete -# function parameter documentation. If set to NO, doxygen will accept that some -# parameters have no documentation without warning. -# The default value is: YES. - -WARN_IF_INCOMPLETE_DOC = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong parameter -# documentation, but not about the absence of documentation. If EXTRACT_ALL is -# set to YES then this flag will automatically be disabled. See also -# WARN_IF_INCOMPLETE_DOC -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = applications \ - lib \ - firmware \ - furi - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: -# https://www.gnu.org/software/libiconv/) for the list of possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# Note the list of default checked file patterns might differ from the list of -# default file extension mappings. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, -# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C -# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = \ - lib/mlib \ - lib/STM32CubeWB \ - lib/littlefs \ - lib/nanopb \ - assets/protobuf \ - lib/libusb_stm32 \ - lib/FreeRTOS-Kernel \ - lib/microtar \ - lib/mbedtls \ - lib/cxxheaderparser \ - applications/plugins/dap_link/lib/free-dap - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# entity all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see https://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a color-wheel, see -# https://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use gray-scales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via JavaScript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have JavaScript, -# like the Qt help browser. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_MENUS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: -# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML -# output directory. Running make will produce the docset in that directory and -# running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy -# genXcode/_index.html for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# on Windows. In the beginning of 2021 Microsoft took the original page, with -# a.o. the download links, offline the HTML help workshop was already many years -# in maintenance mode). You can download the HTML help workshop from the web -# archives at Installation executable (see: -# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo -# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the main .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to -# run qhelpgenerator on the generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine tune the look of the index (see "Fine-tuning the output"). As an -# example, the default style sheet generated by doxygen has an example that -# shows how to put an image at the root of the tree instead of the PROJECT_NAME. -# Since the tree basically has the same information as the tab index, you could -# consider setting DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the -# FULL_SIDEBAR option determines if the side bar is limited to only the treeview -# area (value NO) or if it should extend to the full height of the window (value -# YES). Setting this to YES gives a layout similar to -# https://docs.readthedocs.io with more room for contents, but less room for the -# project logo, title, and description. If either GENERATOR_TREEVIEW or -# DISABLE_INDEX is set to NO, this option has no effect. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FULL_SIDEBAR = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg -# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see -# https://inkscape.org) to generate formulas as SVG images instead of PNGs for -# the HTML output. These images will generally look nicer at scaled resolutions. -# Possible values are: png (the default) and svg (looks nicer but requires the -# pdf2svg or inkscape tool). -# The default value is: png. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FORMULA_FORMAT = png - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands -# to create new LaTeX commands to be used in formulas as building blocks. See -# the section "Including formulas" for details. - -FORMULA_MACROFILE = - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side JavaScript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. -# Note that the different versions of MathJax have different requirements with -# regards to the different settings, so it is possible that also other MathJax -# settings have to be changed when switching between the different MathJax -# versions. -# Possible values are: MathJax_2 and MathJax_3. -# The default value is: MathJax_2. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_VERSION = MathJax_2 - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. For more details about the output format see MathJax -# version 2 (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 -# (see: -# http://docs.mathjax.org/en/latest/web/components/output.html). -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility. This is the name for Mathjax version 2, for MathJax version 3 -# this will be translated into chtml), NativeMML (i.e. MathML. Only supported -# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This -# is the name for Mathjax version 3, for MathJax version 2 this will be -# translated into HTML-CSS) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. The default value is: -# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 -# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html -# #tex-and-latex-extensions): -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# For example for MathJax version 3 (see -# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): -# MATHJAX_EXTENSIONS = ams -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /

Xtreme Firmware Documentation

- -

- -

- -

Install:

- -**NOTE: If you are coming from a different FW, it is recommended to delete / clear your "apps" folder on the SD card prior to updating. This folder houses all the .fap files, which do not update to the correct API versions by default if old ones are present (Thanks flipper devs). This does `NOT` remove any of your saved files!** -

- -

Web Updater / Mobile App / Automatic qFlipper Update

- -- Go to the latest release from [The releases tab](https://github.com/ClaraCrazy/Flipper-Xtreme/releases/latest) -- Download the .tgz file -- Run your updater of choice with it - -- Enjoy! -
- ------ -
- -

Manual Update (Because qFlipper loves to break every now and then for no reason at all)

- -- Download the latest release (.zip) from [The releases tab](https://github.com/ClaraCrazy/Flipper-Xtreme/releases/latest) -- Extract the archive. This is now your new Firmware folder -- Open [qFlipper](https://flipperzero.one/update), head to `SD/Update` and simply move the firmware folder there -- On the Flipper, hit the `Arrow Down` button, this will get you to the file menu. Hit `Arrow Left` once, and then simply search for your updates folder -- Inside that folder, select the Firmware you just moved onto it, and run the file thats simply called `Update` - -- Enjoy! - ----- - -
-

Build it yourself:

- -```bash -To download the needed tools: -$ git clone --recursive https://github.com/ClaraCrazy/Flipper-Xtreme.git -$ cd Flipper-Xtreme/ - -To flash directly to the Flipper (Needs to be connected via USB, qFlipper closed) -$ ./fbt flash_usb - -To just compile firmware -$ ./fbt updater_package - -If building FAPS: -$ ./fbt fap_dist - -If building image assets: -$ ./fbt resources icons dolphin_ext -``` - -
-

Safe for work mode:

- -**Enable SFW mode with the steps listed below** -
- -- Navigate to the main screen -- Press the UP button on the Flipper -- Press the 'SFW Mode' toggle - ----- - -
-

Support the project

- -**If you like Xtreme Firmware and wish to help out, we would love it if you contributed to the project â¤ï¸** -
- -- [Bunq - My bank](https://bunq.me/ClaraK) -- [Paypal](https://paypal.me/RdX2020) -- [Patreon](https://patreon.com/CynthiaLabs) -- `Monero`: 41kyWeeoVdK4quzQ4M9ikVGs6tCQCLfdx8jLExTNsAu2SF1QAyDqRdjfGM6EL8L9NpXwt89HJeAoGf1aoArk7nDr4AMMV4T - - - ----- - - -
-

Applications we use thanks to the awesome contributers and community â¤ï¸

- -## GPIO -- [Lightmeter](https://github.com/oleksiikutuzov/flipperzero-lightmeter) -- [Air Mouse](https://github.com/ginkage/FlippAirMouse/) -- [Wifi Marauder](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) -- [Wifi Deauther](https://github.com/Timmotools/flipperzero_esp8266_deautherv2) -- [IFTTT Virtual Button for ESP8266 (By Ferrazzi)](https://github.com/Ferrazzi/FlipperZero_IFTTT_Virtual_Button) -- [Flashlight (By xMasterX)](https://github.com/xMasterX/flipper-flashlight) -- [GPIO Reader 1](https://github.com/biotinker/flipperzero-gpioreader) -- [GPIO Reader 2](https://github.com/aureli1c/flipperzero_GPIO_read) -- [Sentry Safe](https://github.com/H4ckd4ddy/flipperzero-sentry-safe-plugin) -- [Distance Sensor](https://github.com/Sanqui/flipperzero-firmware/tree/59656ca5fb644e0d4484259986b86a0b963f323d/applications/hc_sr04) -- [Temperature Sensor](https://github.com/Mywk/FlipperTemperatureSensor) -- [i2c Tools](https://github.com/NaejEL/flipperzero-i2ctools) -- [GPS](https://github.com/ezod/flipperzero-gps) -- [Mouse Jacker](https://github.com/mothball187/flipperzero-nrf24/tree/main/mousejacker) -- [Sniffer](https://github.com/mothball187/flipperzero-nrf24/tree/main/nrfsniff) -- [Scanner](https://github.com/vad7/nrf24scan) -- [ColecoVision Controller](https://github.com/ezod/flipperzero-rc2014-coleco) - - -## Games -- [2048](https://github.com/eugene-kirzhanov/flipper-zero-2048-game) -- [Arkanoid](https://github.com/DarkFlippers/unleashed-firmware/tree/dev/applications/plugins/arkanoid) -- [BlackJack](https://github.com/teeebor/flipper_games) -- [Doom](https://github.com/p4nic4ttack/doom-flipper-zero/) -- Multi Dice - In-house -- [Flappy Bird](https://github.com/DroomOne/flipperzero-firmware/tree/dev/applications/flappy_bird) -- [Game 15](https://github.com/x27/flipperzero-game15) -- [Game of Life (Updated to work by tgxn) (By itsyourbedtime)](https://github.com/tgxn/flipperzero-firmware/blob/dev/applications/game_of_life/game_of_life.c) -- Heap defense - Author Unknown -- [Mandelbrot Set (By Possibly-Matt)](https://github.com/Possibly-Matt/flipperzero-firmware-wPlugins) -- [Minesweeper](https://github.com/panki27/minesweeper) -- [Snake](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/plugins/snake_game) -- [Solitaire](https://github.com/teeebor/flipper_games) -- [Tetris](https://github.com/jeffplang/flipperzero-firmware/tree/tetris_game/applications/tetris_game) -- [Tic Tac Toe](https://github.com/gotnull/flipperzero-firmware-wPlugins/tree/420/applications/plugins/tictactoe_game) -- [Tamagotchi(By GMMan)](https://github.com/GMMan/flipperzero-tamagotch-p1) -- [Video Poker (By PixlEmly)](https://github.com/PixlEmly/flipperzero-firmware-testing/blob/420/applications/VideoPoker/poker.c) -- [Yatzee (By emfleak)](https://github.com/emfleak/flipperzero-yatzee) -- [Pong (By [nmrr])](https://github.com/nmrr/flipperzero-pong) -- [Asteroids (By [antirez])](https://github.com/antirez/flipper-asteroids) - - -## Misc -- [Authenticator (TOTP / HOTP)](https://github.com/akopachov/flipper-zero_authenticator) -- [Barcode Generator](https://github.com/McAzzaMan/flipperzero-firmware/tree/UPC-A_Barcode_Generator/applications/barcode_generator) -- [Caesar Cipher](https://github.com/panki27/caesar-cipher) -- Calculator - In house / notIntense -- [Counter](https://github.com/Krulknul/dolphin-counter) -- [Hex Viewer](https://github.com/QtRoS/flipper-zero-hex-viewer) -- [Mouse Jiggler](https://github.com/Jacob-Tate/flipperzero-firmware/blob/dev/applications/mouse_jiggler/mouse_jiggler.c) -- [Converter](https://github.com/theisolinearchip/flipperzero_stuff/tree/main/applications/multi_converter) -- [Vibrator](https://github.com/qqmajikpp/flipperzero-firmware-wPlugins/tree/420/applications/plugins/orgasmotron) -- [Paint](https://github.com/n-o-T-I-n-s-a-n-e) -- [UART Echo](https://github.com/flipperdevices/flipperzero-firmware/pull/831) -- [USB HID Autofire](https://github.com/pbek/usb_hid_autofire) -- [USB Keyboard & Mouse](https://github.com/huuck/FlipperZeroUSBKeyboard) / (https://github.com/DarkFlippers/unleashed-firmware) -- [Wii EC Analyzer](https://github.com/csBlueChip/FlipperZero_WiiEC) - - -## Music -- [BPM Tapper (By panki27)](https://github.com/panki27/bpm-tapper) -- [Metronome](https://github.com/panki27/Metronome) -- [Morse Code](https://github.com/DarkFlippers/unleashed-firmware/pull/144) -- Music Beeper - Author Unknown -- [Music Player](https://github.com/flipperdevices/flipperzero-firmware/pull/1189) -- [Ocarina](https://github.com/invalidna-me/flipperzero-ocarina) -- [Software Automatic Mouth aka SAM](https://github.com/ctoth/SAM) -- [Tuning Fork](https://github.com/besya/flipperzero-tuning-fork) -- [Music Tracker](https://github.com/DrZlo13/flipper-zero-music-tracker) - - -## Tools -- [Bluetooth Remote](https://github.com/flipperdevices/flipperzero-firmware/pull/1330) -- [Clock](https://github.com/kowalski7cc/flipperzero-firmware/tree/clock-v1) / In house -- [Countdown Timer](https://github.com/0w0mewo/fpz_cntdown_timer) -- [DAP Link](https://github.com/flipperdevices/flipperzero-firmware/pull/1897) -- [DTMF](https://github.com/litui/dtmf_dolphin) -- [Dolphin Backup & Restore](https://github.com/flipperdevices/flipperzero-firmware/pull/1384) -- [iButton Fuzzer](https://github.com/DarkFlippers/unleashed-firmware) -- [NFC Magic](https://github.com/flipperdevices/flipperzero-firmware/pull/1966) -- [POCSAG Pager](https://github.com/xMasterX/flipper-pager) -- [Password Generator](https://github.com/anakod/flipper_passgen) -- [PicoPass](https://github.com/flipperdevices/flipperzero-firmware/pull/1366) -- [RFID Fuzzer](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/pull/245) -- [Spectrum Analyzer](https://github.com/jolcese/flipperzero-firmware/tree/spectrum/applications/spectrum_analyzer) -- [Sub-Ghz Bruteforce](https://github.com/derskythe/flipperzero-subbrute/tree/master) -- [Sub-Ghz Playlist](https://github.com/darmiel/flipper-playlist) -- [Protocol Visualizer](https://github.com/antirez/protoview) - - ---- From 3a45a3068d61a930191ff5d7dcb74c66b2f2beb0 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Mon, 9 Jan 2023 23:13:25 +0100 Subject: [PATCH 23/64] Thank you Animation --- .../desktop/animations/animation_manager.c | 2 +- assets/dolphin/internal/manifest.txt | 4 ++-- assets/dolphin/internal/sfw_128x64/frame_0.png | Bin 3292 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_1.png | Bin 3306 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_10.png | Bin 3392 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_2.png | Bin 3295 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_3.png | Bin 3331 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_4.png | Bin 3315 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_5.png | Bin 3333 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_6.png | Bin 3341 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_7.png | Bin 3428 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_8.png | Bin 3348 -> 0 bytes assets/dolphin/internal/sfw_128x64/frame_9.png | Bin 3354 -> 0 bytes .../internal/thank_you_128x64/frame_0.png | Bin 0 -> 834 bytes .../internal/thank_you_128x64/frame_1.png | Bin 0 -> 899 bytes .../internal/thank_you_128x64/frame_2.png | Bin 0 -> 775 bytes .../internal/thank_you_128x64/frame_3.png | Bin 0 -> 774 bytes .../internal/thank_you_128x64/frame_4.png | Bin 0 -> 677 bytes .../internal/thank_you_128x64/frame_5.png | Bin 0 -> 997 bytes .../internal/thank_you_128x64/frame_6.png | Bin 0 -> 808 bytes .../internal/thank_you_128x64/frame_7.png | Bin 0 -> 738 bytes .../internal/thank_you_128x64/frame_8.png | Bin 0 -> 735 bytes .../internal/thank_you_128x64/frame_9.png | Bin 0 -> 246 bytes .../{sfw_128x64 => thank_you_128x64}/meta.txt | 6 +++--- 24 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_0.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_1.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_10.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_2.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_3.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_4.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_5.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_6.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_7.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_8.png delete mode 100644 assets/dolphin/internal/sfw_128x64/frame_9.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_0.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_1.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_2.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_3.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_4.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_5.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_6.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_7.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_8.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_9.png rename assets/dolphin/internal/{sfw_128x64 => thank_you_128x64}/meta.txt (67%) diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index e4aa81f81..9fe415ca9 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -15,7 +15,7 @@ #define TAG "AnimationManager" -#define HARDCODED_ANIMATION_NAME "sfw_128x64" +#define HARDCODED_ANIMATION_NAME "thank_you_128x64" #define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" #define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" diff --git a/assets/dolphin/internal/manifest.txt b/assets/dolphin/internal/manifest.txt index 46f873a84..48dc597a8 100644 --- a/assets/dolphin/internal/manifest.txt +++ b/assets/dolphin/internal/manifest.txt @@ -2,12 +2,12 @@ Filetype: Flipper Animation Manifest Version: 1 # Animation 1 -Name: sfw_128x64 +Name: thank_you_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 Max level: 30 -Weight: 0 +Weight: 1 # Animation 2 Name: L1_BadBattery_128x47 diff --git a/assets/dolphin/internal/sfw_128x64/frame_0.png b/assets/dolphin/internal/sfw_128x64/frame_0.png deleted file mode 100644 index 5273ad9f49219d6e66a912e2f50031f81134936d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3292 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 diff --git a/assets/dolphin/internal/sfw_128x64/frame_10.png b/assets/dolphin/internal/sfw_128x64/frame_10.png deleted file mode 100644 index 37d18fd5a21449d5b3768945fa005c0f9a098824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 zcmcIndpuNWA0I>rUD!%dr)hJmnK_0TX5=~}R5K|G744aG&M=rcV=mF4G*NB0w-i#? zO10%JO0+8_B&MX&Wm8Bh>VT}5GEL_FAc(>jOhe|c9+0EP!`Bp z%7if?8A31~N{$hV)w>7_U1P)$9D&LJ9vUhTITPO$UnK$p#F-dCa;MK}}P)dqn;jxWH% zBq%^9gCrOPsel86Y)iMdcXV6;P(dn40Uao|Ac;z4f^;U$4jB0nacdHU&s@P?G-3;% zITOQVGBJ}viH?pYN86DxNhrmZ!C+88DuqfV;Rup+gGdI&kVMkCqYP|R3QGiHnE(?3 zYDS2M$z{$&Tgmh!8AVYOPi@vH@j7GSr!fXN^iyr_9cu zYRj~9VA5zL(4Gl`U!fel4iHENeH$1<1pE!(0_AX+J|d|M62Yhs+nI=qA`1iv(~(Al zU_Kot(NNHlWJj|{NDK&sNC=H)M|EJ(sC+8*i!OXW8-wNQ@TvEIEn5VGagMPFF&U6O zjq1olNjwGulOTLXa^$JKWiU{jn}^!LwxevzBm(^8K#_lDRjWd9Mw-2&J%bMN@VMYN zK4Q-!K@1wMiqD|ZU_Qu0=ng~xfth?vB82cd5eT7Blp+>|5`jO|u&_u>!od(c=D5{A z-utjvz7mWth{PAzm<;fO1S0$_%~MxAt^oJcTOh^LyJ6%E`JquGqeubpr7)QgtUeFU zL|9!2C_)^0E%=KFf158~X`{nXob(?G_}25{068bEOc~&QR2C=xb6a|DCTdYkz84qj0Ij6J1e_%4cEWBlXIGCAF}{&^Ej zgACZgslt8J4XdXFrq=X8a}Fk@cm4GJ65ZJi&yh<-##Fr0K^hHVp&=vQ-tHuY8v| z+?JNsCBpkeKG>NOqP{bM$0EMbm^|NO3o~`~lmgw^3nTg4>x{4oWngq`>?pA6Q z=FkqTNulTTx+U})5eRvAs&}+%o}W+eSPJf$L7}?`KhMv#84o>oITx{R7!fy%4_XCw z_iP8-=e>(5Q=M1Ne^j#kij}C;wCb_oZqkt%tKK!w$Yy1gnk@XjKU-B65`1E_oeJF9 z+c&r*z46k`a}PYvyc1r?+AV4OsYvj?KTfIV*+)4-Z;O*;eW(nz5AN31fp>J|r#-r4 za3DD$@5$MH40gWuy{sA?^MK3Vs{J)(2U<z7%J$q ze-5k}hc*>yoYB7mx2J>kxutFytuJOf0*LCH=lOw&|@&Fym@Q2j(JP-4F=a*CvJNm_Q)!xH=#lUUhCwO z>K5oCJox5SX>aSo{=BVDiom3Y?OTuuyEZF>R@a`bcf6=4(5bb{B`>IWv0bw`{e5~P zzBor)#mLy`E1TwUqw`niP}c~rwPg^;>{YkJVKYK$2rHM{Uf+u-US*4}mShBLxXvV} z3Vqw}yr~r)d)%1V(`mu6$_>lC*CCiPH}s0d2B63E#Bzl=%p?3Q60HAG!%Z}Q$yu$& zHHWngf88(k7*{<38=j~onRYH&btTA73$a-~LH_RexpsqLRO`$stp11q$X^Or+)Gc5 z3eDB&QguPui)1$8d^bed`r*_g<*nT;gHJxQb<-o#k0kf5ZuS*YCu$lWf1X%wye5h} z@Lk$@UCfVwi<=HxJ90drx}rM z7dP}5f-K`5@@KXs3i-2=MDxn(O=Y_8u3wUbYa`z6dY~c}?!^kl*(Dh}5o|O-_lPQQ6Qm<7qe-)_4?unVV9nr{~0$F-t(by)}W=-)ZuA9Vq_(M_3jSun{$tLS)wDO=@uUWs_%ugG#7<$d*L`^=j zDQ(4qTQil<26O5dWd~&P+Y{Z&uZyYGI}?X5?vd8L)mnOYF?C%5VZiIo!YA@U9r@az zo~Igw?aGV+J4O1q_76?*J^bVrvuRJ9PG$tH&kbqY6ccXZWOHf@#Wr@<^t1L^#_`za Zi7!r`3?D!@y;T3l@$uxcb3J}g{s;R+YkdF! diff --git a/assets/dolphin/internal/sfw_128x64/frame_2.png b/assets/dolphin/internal/sfw_128x64/frame_2.png deleted file mode 100644 index df0ee805831216b68493a56356d9e12fe191a54d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3295 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 diff --git a/assets/dolphin/internal/sfw_128x64/frame_3.png b/assets/dolphin/internal/sfw_128x64/frame_3.png deleted file mode 100644 index 5a2badb349fa172697d0cf5635652bbbb98483d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 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 diff --git a/assets/dolphin/internal/sfw_128x64/frame_4.png b/assets/dolphin/internal/sfw_128x64/frame_4.png deleted file mode 100644 index 86b3020a007b0625635074643c32969efa46e56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 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 diff --git a/assets/dolphin/internal/sfw_128x64/frame_7.png b/assets/dolphin/internal/sfw_128x64/frame_7.png deleted file mode 100644 index a1146ced69aa49a729bc05b0170d872b828c5c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3428 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 O5X;$vd3<@$mOlY3W`IKg diff --git a/assets/dolphin/internal/sfw_128x64/frame_8.png b/assets/dolphin/internal/sfw_128x64/frame_8.png deleted file mode 100644 index 1af0ce93b9468bf7eeae38dd149efbbb6de1dec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3348 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 diff --git a/assets/dolphin/internal/sfw_128x64/frame_9.png b/assets/dolphin/internal/sfw_128x64/frame_9.png deleted file mode 100644 index b8ff0e6fa32c32c0fa224c1c38cbd77708de0223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3354 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 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_0.png b/assets/dolphin/internal/thank_you_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7f95c28c32cc110b786d47e2fb9bee63b6481b GIT binary patch literal 834 zcmV-I1HJr-P)pH^hrcPRCwC$T-lDpAPl7Z|37zE8#Q9_!EiJ{GJdF<2+T3q;Hha0 z|K%hVnc17)hj+9i-K=i__!Mzx_#gM5@qP|D1s`0Ix)f z#*vmO!Y2E1^siX!98y}v85Q2=tS4Dp&gyjfU)8ITdq5R((r$ds*$9g(_e+wE5$yjk z035&Ed2DDn>I}!=PzX-tsN-V9d#3sU`9>Xs)jz4HXaq<@ewpTzs8oyhAKiqdk4{Zb zeIw0NHQP+NrCF9qOM(sgWvnm0+p*MI{m;HsY{KA*7`wz)kSSw{&F->u^I1@)jD?Z# z4v{d001$x7_d_c@wrH7RL;{jU1fam=RF&yz;z0m_bP&k5Ae4?3!CenV+-to{0w9~{ zG)4u1&zRaryC5VemEnlwfvcjKlw7*G3;OoHH{GGH4nQ$@E>2(P&&zm24{|{c#psZZ z7T*aP!Em~C?>)ex7#-44mQmSFpIcR{GY()ROd$XSfIbnqI$H!~cLTsWgA#zj zG)7g5=OWbq#sJ_cm|$H3&}#v>hXK=12|)1OMROudfBNRL0O)5-hgYNv>LM@k^i2X# zVHti3rj^FJAO?(t2>=105C8%|c`^XQujg-+oU)1qY?se-Hvp^~)d&L`+q%cfT0`xV=}gm=;$m->ZKzG4ZE@c>OYW z=G58=`Zx3JSK`zKIZZ!t4{$Ey`@YM{69uzQXVIl`sY#a@AeYdC%awvzr_2pyBupUy z1b{*S2*91BiVI>KFn;zy=4awbbS*j>WIAz{)DJkqq|4chS^&s&R{d2c66KPPHkW5- zU59GU0DBf4Jv~)+sVuoTWu;H#UgV#9@EBS^tC_!)C9~~1EWn2T0G+L;c$rmn!TpIHAzH4RCwC$T+5QfAPnpB|Nq=QEyMUB6vz^i$cIjw7()?;STU4O zPrl!8{ba;w@&&t<)}LcG`8KbVGS=KG<|6J#U&`C$Aqg7*+K?${pP@~21#|^DT*?@3 zKYvnN-2QCU>SxvQYT#CA%GZc3VCB$qXfv#(t5YqH0MNFN@l#wGDAo0VZbiU?QO4D^ z%12w(8Yg?B@DtAe&4cZz88-6M$XV6#Hhn3w#|qg{(&!{kr@)*o12fePXp$I|Q-*N$ zyKtmbf2_`w%?Zrl?M`Ceh_N45=Pi4ixR$Kc_#zzs6LYzH^s3j&;Zac zrj)4&)aVPgm3CV)wFpagj05f^GYh)_kOxQvfB;w_fWpJnO2*sp#8h}?89i4v>HREh zVQ8XE&7cTk%o?efr_#4iK_=b-oif>97d|Q7at+8P3KOFmhBAy-wFVp}Tt7KSc8CS5 z%GbhB)(_i5w-$tHJZAR>ARM!pa5X=>@5{nUL*i_Q$>$zx07F3XYN0+^<}$4C?Wt5S8?M689NB=f7Xbd^`kzHh}6T zo`(K(IR$hZ0039&Gpqc#_KfsE9_lLqnCD8#JkC?{P#*}uQLYp)XrU8qONice5jLK| zv!Q$*ssKP-sh@E8jLa+(Q~><%GOjpa7dH|B5&<9pB>Mu8Q9WH{0dRg?#_YD;irabY z6lA!}PcKc#dk?v@UI3tpCEJpp5g3NLAa~XafIhPp@}Pk4JhWN-0j=GOb z0ze`F1c2mv06gW1&%0zOQju}vD{9F3gr`{HqY(wb6doX6Wzwwx!!f{*9zC)4egK^H zE~R@4=`cUKz^itdg2Le(PE95X%d+0O>_1a#!JJlBj`R~TGkxTDcxP!_%$v29Ye`u- z(#d7OlW4;|0?rT}*mwWrHDG?wwQrA^^FA|vbn(;FWdMYf=O@nx#kagBKJT-=nCYy6 Z;TNj``?_X{F;oBm002ovPDHLkV1mq?npXe- literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_2.png b/assets/dolphin/internal/thank_you_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2056da40acb371532d9fb120c7f5f7cdb64b402 GIT binary patch literal 775 zcmV+i1Ni)jP)pHxk*GpRCwC$oZFUzAPhxm|Noz79=hseax)-?izg3Vty;3oApv%& z?=r}KzE<^>W-qnA((FAd`me9u8kfV%=RE}Yi$0B!l@s&`eU%rpvyMmBe#G^L84$?{ zc7*m~HG!C}9bG>{fX}VcPInv$RuAi%Q(;s`n`A)zHfX0~6+9sd($S09!UCxGz;2br zmz8yS{gv^i!O@;2h!&iqxYLj7HAgtqQ&x!CG&JHU*#6pMfK_m4A!gUe_w=LV!fMBA z&C1=K2jRyW1b_e#00sddKo)P10H=H7T~@GZ==7Z#{aXPGom|cdK1T{*5zwRO`dMPV zp7vI&wJYRxt1;k63kO58m2kXw`>kCeuloofqba+anmR0YS3DMt#V%ZeF5XERhO}~J zc>x*-Xxlu5mWz%`Y&AjZBJGTxd*q@|L)t}zBU2s45?8-5qFT2tT9vDYE5SP7Sg z84*^(88avd0D}M!0Jfe0T_~pHJU3z2Ju{#qZ=q}H_`WWbAZ5+$Zvd^@^;N_X@Jv^qtYF>M`Vc2*?2|5j#3K;y*Tnt>7 zO{mM4AW0m34C$PuV?dDKrR@ZrQ~;}(_!~ggv({$N5F;qz&m9AtJ)rE*^~C_9!TuiEZ2Ck2RMKEw)5X#L8PNP|VjAfj zLRC}$sNDcK>DkjGwe>CTYv&T=vrOkPpS3_V=qQ=0{sOocP<1sMlgR)8002ovPDHLk FV1oF5R#N}~ literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_3.png b/assets/dolphin/internal/thank_you_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9f58533d5d1384fd265cc2582b6b249bcad64618 GIT binary patch literal 774 zcmV+h1Nr=kP)pHxJg7oRCwC$Tw9LAAPl73|IWJ~m5}QfZvtWbQALR%jmHKvF^ORh z`TLc&9-Q+|pKZ4rB{6IxA0iFbw^}vyb}0as=gP2PXPA%6tG)tLyB7dy>*Uwput;`H zf$}|*bkwUQ3hCr}47MJEtkJ`nD!xW6bm#1i-U&d@Oq-o8sDpw6w_5TII_*}1>o~5>Htj-SPZda+5?@&)#g?|x2K_(2mk;8000620Kl|- zyuTIWdM0s}rBtuD$**YsrVFr!J41%_F8v2@QggFY?p4*}%4zzxj zP^2_uIYUXkkKM&-7;+pcQ_d==PZ7GA)VN86O1DxwR0)QXhK|!XT~*N)Z5D|AmKsh) ztZA5dA*ZVaZwO+ur6wgv%?~`#Qd5(cMH43Q>Bjpz#>E~ z&IbVGIggSeQLDJIld-uD0O_YCXM&(A{o+Q{1r;#|?931^zIq67`a*wAWc15mYY zl(|YL2D{-GcN=pO=f#F;$yT;id8(~CcSpTs4p0Z2kShr-sq(bmDM~U2wV_xELjV8( zfB*mhuoW#)c=g0J+Sw7na`{tsMxF|Qvq9ea4KDi+I=b4~tqt;O32E4m{eM*i_={?* z6=SmjfN5E2=r+ROL7L$h0A|;lvR1S{9sqc#OyWKf0dVCm`s06Y^| zhyVxx005990a&wv9RQq{&s+z9zstA(Q@jA6ZXl9esk*xl08ANqtj~q+KSssP4Xq9! zlpT^0fH`2~lC{>R&0l)h2!Ml}NbYl|FU7*NFIx5nbDF6Tf literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_4.png b/assets/dolphin/internal/thank_you_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..84f53a8673caa541f327bbeb1c0a5cf0fc7e5c5e GIT binary patch literal 677 zcmV;W0$TlvP)pHS4l)cRCwC$T+x!lAP6-6|3Bw$#;HRE6>SnBE>As@*eeStD=`Ke za-L`7PyK___pFj=@PGQZ*Kr(S4~dqoe-fcL6q>B${x06u9c^C#xFL>@q)Q1Ns-eoZ z9r?53X!`=7%skv@mH8@J84*zZ&B=~kXFP~Z09-scJ(^DwNb}G=TD*JhAX`3jKxQ_^JrlN&o-=000mG004|J5Oj^t zc^*>>`Ikh1$e>x^YPL>6;_|!*f*Ld0B}el(Yv~|Eg&1Whxj}j56(k+U00aO400;m80LI08O@{~o03)7WBQG0!2FA$`PZ2=rgm!OezSI7W zf+qlKl`7YBW@1&L>k@!#lZNpPHKVPGL)~f(*WAo4uAjv0N`S- z1^|cvWB#Z-D|A9b$1lDY=Z1c*-@|u1o94Vv<(Z(3H|ud|-&o07c(>RCsyShFd94sv zdHRom&$&pImq|oHRCwC$TuE}oAPmI(|If~0DlVd>X&Au95raaCv$CFoOY>>S%UL z0JP^V&E={oO-Eajept6A`Vx(p=OVA!zCC8AQ_w#z0YCr{07MA@0s!KwqJN%$OUIcS z^OS%t_4+kM0MCON4zCMlzT{jQEWm8yD2ll9RBy1D>cOY-vR~XO=6Sp>N~u!N8?)E- zNEbAm5&-Kv>P`gM(2k+Dw#KYj{(gqTX{-+4HGJ455BQ)>SVIb20dF*=W|6x8Wv5ja zlnNe@VUWD8tAokIm8-Q8)2{p6-3&^Zq+`3g&Wv(3K`OQ{@?FXhU#~lDWkahc4)c{9 zo-ba3+@}<#Gi_Z;ah9F5=bLOOzXu3GhFfhqZsfiuO4<@|jktR)?$M>y262rZA-@Oc zXUO@Ib6Iy2K2@15xL|BMQ4xnKvjrE7Ex4c{s9arRy8_F%<_T0mb^+QY*@ z_jW-{kf=EOdjY0N1%?Iy&8jWJI>CKS%Zk9z008N`h{w`FrRM6BJHh%etj7TWh@kR9 z)Ec{aOO)r90JPpb!COG{9pS@|K-=sAI(E~12Vzo{Ljp|y7XTnmJ=J128U9kY768Oe zI7$Ez07MA@0)S;Vuip5C`=8eH*j8jx{on^=tay-+ru^G z4cQB6_VVIyWK8odD$g(h`T?fK)aB|kI9q>L07#~Do&oVeS1-(zPa~Ml4)t$6y;M^w z-v6}}lj%&(H*7$Sb|%%lc)*V?V@z-OUXW)i$qzXtYfQ@ndGVMZUBj5hO*p8C03b>L z5CBAZD*)Yz52HTw`Az1kTO-Mh9tT+_SLwN0FwM9fCMB-CEThKlHZF92Q8qQc<-5nW^Mu1(qQvuV*E2eTw^ T*rKm)00000NkvXXu0mjfNT|>X literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_6.png b/assets/dolphin/internal/thank_you_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..dca4f918bb62b565468730f970e3bf25cfe6776f GIT binary patch literal 808 zcmV+@1K0eCP)pH+DSw~RCwC$TG?*IAPi*r|9@_)MnbGFhCm3}9Y0hXYRv2bcr!YI!3WG^0glz;SIi$10+&I@sxDCCzm-c~%j= zHTzBK*}&A<4ghm-W(?&8R$Z(l7$tZeonuS~U0FW8qc3`(cu?du<%J**t_!$Rih*}+ z|G`U6uZKK$ylw4*@R^uLrDjQcSxJ*;Z4Lmbh3MP^fcfej{5FYCk0nh$E9rfjY-l_H zq*j{r{=rC?R0IK_5C8%|*%N@S+xG$jvYGOBB0|J7R>c^m#3IuyV24Lqoe4T}d%mK| z902f?V;$+3J5IBbCg;&4N!yY+B!XGHyg?${TX?HZig_1L`#6P5`{;G-*P?IL1eU)EAXtMH3k@?0BhLJF-2m(MM00e+S00;nu m01yBQ0U!Vr0zd#Li{uwJCWgI;@ZFmL0000pHlu1NERCwC$T8cQkP#DBLrM9hJlm^ z=~OCQ0s=q)NCbcYkO;uG0DS$WV?@l;Bk6=cbWWKpX<~^MmH7eS`AhAECU5*klx0Hh zQj{1ajdL3)o*$Xlg3+5Vo+|=WJD{HC$u~7IrNy?G`-G>nDWqjD!Rj9YA()>p3L;wH zMHqwUw!Af1WBK)>vY0bXX|XMJe&rH6ca3e?%TS;l603#!mTACeB3*}OyTphI)3&T^ zN@ZeQx?X(N7GLQ`CX`Vx3w%TbHR%4iM;)=(o10-^!lEq`#+FeptC2pWkY=nS-WCzd z7nW%G;z6+qx#wEYSosoe@9FD05{J1b#AIxbzxok+ydBXB2>G}Po;lqG@zev2?Yx9Z zOhpg?5&<9pq|E^EQa!of3h6?2jDW0U2mpxy5C9SZAONIm0)RBvgL1C6 zA`^}CD|Jni03glvJJ5RNT}f9cZW!-2+6NA$Z^hE|^dea-ujiLAQxOD!L;wf?i2&?L-;fQB Ut~^uZ>i_@%07*qoM6N<$f+tx;A^-pY literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_8.png b/assets/dolphin/internal/thank_you_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7eca54d710dc020720cb362b85328dc55659dae7 GIT binary patch literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*Qk(@Ik;M!Qe1}1p@p%4<6b1&S ziJmTwAr-gY&UroQumVSG@csXDH_tumbBxtx&(>|fKQ5ju^`2eu<;Ir|_p~}SK_&vR z0K<=|pKZQ|Pvl_We)_TE&gH)~6?LhsIUCi!JpWqIc|!A2sUO1%{if)@pU>As#_&&n z;W~NwY)i%k@^bF$z16x!FQgSW-THMRCCrau#sh2LlRxY4UWoQ=E!58y4NcdaC(N)! z@O*j5=iI!|KkdA4`PCDFmM#NghMV#YpVx1(x{_9tcGogt!**+?3D!-u=kDyv=y`d! zd-3~ifmcoJeq39y*dmVg@XV!ZOGYQCl^O$@0>x^qg{)V@Wp6j)r;y<{rgw^8kziaWEie%>-F=xiQ z&;EAi?xR4br)Rg`vt?e*@S(ZySE&1hPj3r-KW5*p_#Tw~`QPT`%Cq4g3zj9{sdb*e ze9A8wnYrIi^hY&Jn{2Rpd{cZF$bCpiD> zP>`vyV$^*3(3NB2M3KoRk+Uubr8)k;9JRi4o|5f7=ivLU{>$R8`bX_lYB}L?DsiHk z_Zs`yQ)k`;%w7HUhpouk4yEIpR{zpWs?6JWQBe7z#rm|=ciM9MBjc5h$ZlT$YWrRO zA7A$O7Iw_8-SX%oP~oPR_v5|IQo5`kUXe-sWmv%h+yBtc%VpK#xBqQDEZ(N{<=vIS)5#Z_mBd_hIKaX3;QvW}|G<0elrO9Mfa2TJ L)z4*}Q$iB}zu-@} literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_9.png b/assets/dolphin/internal/thank_you_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..70715bf5f4cece33c17f4034e5fb607f8414c689 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*Qk(@Ik;M!Qe1}1p@p%4<6rkV= zPZ!6Kid%258gexl@HhmX{ri4RYY>N3cE>(@3yWtLRm`S}xq%H6U|?WkaA08IU|?Wm zP+(wS0oec-ba)rRxMJqNeXlYE*1Fs8OMVv?aQ4v2#ryv=e)w_d Date: Mon, 9 Jan 2023 23:39:43 +0100 Subject: [PATCH 24/64] breaking things. yay --- .../desktop/animations/animation_manager.c | 2 +- assets/dolphin/internal/manifest.txt | 4 +- .../dolphin/internal/sfw_128x64/frame_0.png | Bin 0 -> 3292 bytes .../dolphin/internal/sfw_128x64/frame_1.png | Bin 0 -> 3306 bytes .../dolphin/internal/sfw_128x64/frame_10.png | Bin 0 -> 3392 bytes .../dolphin/internal/sfw_128x64/frame_2.png | Bin 0 -> 3295 bytes .../dolphin/internal/sfw_128x64/frame_3.png | Bin 0 -> 3331 bytes .../dolphin/internal/sfw_128x64/frame_4.png | Bin 0 -> 3315 bytes .../dolphin/internal/sfw_128x64/frame_5.png | Bin 0 -> 3333 bytes .../dolphin/internal/sfw_128x64/frame_6.png | Bin 0 -> 3341 bytes .../dolphin/internal/sfw_128x64/frame_7.png | Bin 0 -> 3428 bytes .../dolphin/internal/sfw_128x64/frame_8.png | Bin 0 -> 3348 bytes .../dolphin/internal/sfw_128x64/frame_9.png | Bin 0 -> 3354 bytes .../{thank_you_128x64 => sfw_128x64}/meta.txt | 6 +- .../internal/thank_you_128x64/frame_0.png | Bin 834 -> 0 bytes .../internal/thank_you_128x64/frame_1.png | Bin 899 -> 0 bytes .../internal/thank_you_128x64/frame_2.png | Bin 775 -> 0 bytes .../internal/thank_you_128x64/frame_3.png | Bin 774 -> 0 bytes .../internal/thank_you_128x64/frame_4.png | Bin 677 -> 0 bytes .../internal/thank_you_128x64/frame_5.png | Bin 997 -> 0 bytes .../internal/thank_you_128x64/frame_6.png | Bin 808 -> 0 bytes .../internal/thank_you_128x64/frame_7.png | Bin 738 -> 0 bytes .../internal/thank_you_128x64/frame_8.png | Bin 735 -> 0 bytes .../internal/thank_you_128x64/frame_9.png | Bin 246 -> 0 bytes assets/resources/dolphin/manifest.txt | 359 ++++++++++++++++++ 25 files changed, 365 insertions(+), 6 deletions(-) create mode 100644 assets/dolphin/internal/sfw_128x64/frame_0.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_1.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_10.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_2.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_3.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_4.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_5.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_6.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_7.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_8.png create mode 100644 assets/dolphin/internal/sfw_128x64/frame_9.png rename assets/dolphin/internal/{thank_you_128x64 => sfw_128x64}/meta.txt (67%) delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_0.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_1.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_2.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_3.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_4.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_5.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_6.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_7.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_8.png delete mode 100644 assets/dolphin/internal/thank_you_128x64/frame_9.png create mode 100644 assets/resources/dolphin/manifest.txt diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index 9fe415ca9..e4aa81f81 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -15,7 +15,7 @@ #define TAG "AnimationManager" -#define HARDCODED_ANIMATION_NAME "thank_you_128x64" +#define HARDCODED_ANIMATION_NAME "sfw_128x64" #define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" #define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" diff --git a/assets/dolphin/internal/manifest.txt b/assets/dolphin/internal/manifest.txt index 48dc597a8..46f873a84 100644 --- a/assets/dolphin/internal/manifest.txt +++ b/assets/dolphin/internal/manifest.txt @@ -2,12 +2,12 @@ Filetype: Flipper Animation Manifest Version: 1 # Animation 1 -Name: thank_you_128x64 +Name: sfw_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 Max level: 30 -Weight: 1 +Weight: 0 # Animation 2 Name: L1_BadBattery_128x47 diff --git a/assets/dolphin/internal/sfw_128x64/frame_0.png b/assets/dolphin/internal/sfw_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5273ad9f49219d6e66a912e2f50031f81134936d GIT binary patch literal 3292 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_10.png b/assets/dolphin/internal/sfw_128x64/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..37d18fd5a21449d5b3768945fa005c0f9a098824 GIT binary patch literal 3392 zcmcIndpuNWA0I>rUD!%dr)hJmnK_0TX5=~}R5K|G744aG&M=rcV=mF4G*NB0w-i#? zO10%JO0+8_B&MX&Wm8Bh>VT}5GEL_FAc(>jOhe|c9+0EP!`Bp z%7if?8A31~N{$hV)w>7_U1P)$9D&LJ9vUhTITPO$UnK$p#F-dCa;MK}}P)dqn;jxWH% zBq%^9gCrOPsel86Y)iMdcXV6;P(dn40Uao|Ac;z4f^;U$4jB0nacdHU&s@P?G-3;% zITOQVGBJ}viH?pYN86DxNhrmZ!C+88DuqfV;Rup+gGdI&kVMkCqYP|R3QGiHnE(?3 zYDS2M$z{$&Tgmh!8AVYOPi@vH@j7GSr!fXN^iyr_9cu zYRj~9VA5zL(4Gl`U!fel4iHENeH$1<1pE!(0_AX+J|d|M62Yhs+nI=qA`1iv(~(Al zU_Kot(NNHlWJj|{NDK&sNC=H)M|EJ(sC+8*i!OXW8-wNQ@TvEIEn5VGagMPFF&U6O zjq1olNjwGulOTLXa^$JKWiU{jn}^!LwxevzBm(^8K#_lDRjWd9Mw-2&J%bMN@VMYN zK4Q-!K@1wMiqD|ZU_Qu0=ng~xfth?vB82cd5eT7Blp+>|5`jO|u&_u>!od(c=D5{A z-utjvz7mWth{PAzm<;fO1S0$_%~MxAt^oJcTOh^LyJ6%E`JquGqeubpr7)QgtUeFU zL|9!2C_)^0E%=KFf158~X`{nXob(?G_}25{068bEOc~&QR2C=xb6a|DCTdYkz84qj0Ij6J1e_%4cEWBlXIGCAF}{&^Ej zgACZgslt8J4XdXFrq=X8a}Fk@cm4GJ65ZJi&yh<-##Fr0K^hHVp&=vQ-tHuY8v| z+?JNsCBpkeKG>NOqP{bM$0EMbm^|NO3o~`~lmgw^3nTg4>x{4oWngq`>?pA6Q z=FkqTNulTTx+U})5eRvAs&}+%o}W+eSPJf$L7}?`KhMv#84o>oITx{R7!fy%4_XCw z_iP8-=e>(5Q=M1Ne^j#kij}C;wCb_oZqkt%tKK!w$Yy1gnk@XjKU-B65`1E_oeJF9 z+c&r*z46k`a}PYvyc1r?+AV4OsYvj?KTfIV*+)4-Z;O*;eW(nz5AN31fp>J|r#-r4 za3DD$@5$MH40gWuy{sA?^MK3Vs{J)(2U<z7%J$q ze-5k}hc*>yoYB7mx2J>kxutFytuJOf0*LCH=lOw&|@&Fym@Q2j(JP-4F=a*CvJNm_Q)!xH=#lUUhCwO z>K5oCJox5SX>aSo{=BVDiom3Y?OTuuyEZF>R@a`bcf6=4(5bb{B`>IWv0bw`{e5~P zzBor)#mLy`E1TwUqw`niP}c~rwPg^;>{YkJVKYK$2rHM{Uf+u-US*4}mShBLxXvV} z3Vqw}yr~r)d)%1V(`mu6$_>lC*CCiPH}s0d2B63E#Bzl=%p?3Q60HAG!%Z}Q$yu$& zHHWngf88(k7*{<38=j~onRYH&btTA73$a-~LH_RexpsqLRO`$stp11q$X^Or+)Gc5 z3eDB&QguPui)1$8d^bed`r*_g<*nT;gHJxQb<-o#k0kf5ZuS*YCu$lWf1X%wye5h} z@Lk$@UCfVwi<=HxJ90drx}rM z7dP}5f-K`5@@KXs3i-2=MDxn(O=Y_8u3wUbYa`z6dY~c}?!^kl*(Dh}5o|O-_lPQQ6Qm<7qe-)_4?unVV9nr{~0$F-t(by)}W=-)ZuA9Vq_(M_3jSun{$tLS)wDO=@uUWs_%ugG#7<$d*L`^=j zDQ(4qTQil<26O5dWd~&P+Y{Z&uZyYGI}?X5?vd8L)mnOYF?C%5VZiIo!YA@U9r@az zo~Igw?aGV+J4O1q_76?*J^bVrvuRJ9PG$tH&kbqY6ccXZWOHf@#Wr@<^t1L^#_`za Zi7!r`3?D!@y;T3l@$uxcb3J}g{s;R+YkdF! literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_2.png b/assets/dolphin/internal/sfw_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ee805831216b68493a56356d9e12fe191a54d GIT binary patch literal 3295 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_3.png b/assets/dolphin/internal/sfw_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2badb349fa172697d0cf5635652bbbb98483d8 GIT binary patch literal 3331 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_4.png b/assets/dolphin/internal/sfw_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..86b3020a007b0625635074643c32969efa46e56e GIT binary patch literal 3315 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_7.png b/assets/dolphin/internal/sfw_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..a1146ced69aa49a729bc05b0170d872b828c5c56 GIT binary patch literal 3428 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 O5X;$vd3<@$mOlY3W`IKg literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_8.png b/assets/dolphin/internal/sfw_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1af0ce93b9468bf7eeae38dd149efbbb6de1dec7 GIT binary patch literal 3348 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/sfw_128x64/frame_9.png b/assets/dolphin/internal/sfw_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ff0e6fa32c32c0fa224c1c38cbd77708de0223 GIT binary patch literal 3354 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/meta.txt b/assets/dolphin/internal/sfw_128x64/meta.txt similarity index 67% rename from assets/dolphin/internal/thank_you_128x64/meta.txt rename to assets/dolphin/internal/sfw_128x64/meta.txt index 6a104b3dc..b8a080c97 100644 --- a/assets/dolphin/internal/thank_you_128x64/meta.txt +++ b/assets/dolphin/internal/sfw_128x64/meta.txt @@ -3,11 +3,11 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 +Passive frames: 11 Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 Active cycles: 0 -Frame rate: 1 +Frame rate: 7 Duration: 3600 Active cooldown: 0 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_0.png b/assets/dolphin/internal/thank_you_128x64/frame_0.png deleted file mode 100644 index 0e7f95c28c32cc110b786d47e2fb9bee63b6481b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmV-I1HJr-P)pH^hrcPRCwC$T-lDpAPl7Z|37zE8#Q9_!EiJ{GJdF<2+T3q;Hha0 z|K%hVnc17)hj+9i-K=i__!Mzx_#gM5@qP|D1s`0Ix)f z#*vmO!Y2E1^siX!98y}v85Q2=tS4Dp&gyjfU)8ITdq5R((r$ds*$9g(_e+wE5$yjk z035&Ed2DDn>I}!=PzX-tsN-V9d#3sU`9>Xs)jz4HXaq<@ewpTzs8oyhAKiqdk4{Zb zeIw0NHQP+NrCF9qOM(sgWvnm0+p*MI{m;HsY{KA*7`wz)kSSw{&F->u^I1@)jD?Z# z4v{d001$x7_d_c@wrH7RL;{jU1fam=RF&yz;z0m_bP&k5Ae4?3!CenV+-to{0w9~{ zG)4u1&zRaryC5VemEnlwfvcjKlw7*G3;OoHH{GGH4nQ$@E>2(P&&zm24{|{c#psZZ z7T*aP!Em~C?>)ex7#-44mQmSFpIcR{GY()ROd$XSfIbnqI$H!~cLTsWgA#zj zG)7g5=OWbq#sJ_cm|$H3&}#v>hXK=12|)1OMROudfBNRL0O)5-hgYNv>LM@k^i2X# zVHti3rj^FJAO?(t2>=105C8%|c`^XQujg-+oU)1qY?se-Hvp^~)d&L`+q%cfT0`xV=}gm=;$m->ZKzG4ZE@c>OYW z=G58=`Zx3JSK`zKIZZ!t4{$Ey`@YM{69uzQXVIl`sY#a@AeYdC%awvzr_2pyBupUy z1b{*S2*91BiVI>KFn;zy=4awbbS*j>WIAz{)DJkqq|4chS^&s&R{d2c66KPPHkW5- zU59GU0DBf4Jv~)+sVuoTWu;H#UgV#9@EBS^tC_!)C9~~1EWn2T0G+L;c$rmn!TpIHAzH4RCwC$T+5QfAPnpB|Nq=QEyMUB6vz^i$cIjw7()?;STU4O zPrl!8{ba;w@&&t<)}LcG`8KbVGS=KG<|6J#U&`C$Aqg7*+K?${pP@~21#|^DT*?@3 zKYvnN-2QCU>SxvQYT#CA%GZc3VCB$qXfv#(t5YqH0MNFN@l#wGDAo0VZbiU?QO4D^ z%12w(8Yg?B@DtAe&4cZz88-6M$XV6#Hhn3w#|qg{(&!{kr@)*o12fePXp$I|Q-*N$ zyKtmbf2_`w%?Zrl?M`Ceh_N45=Pi4ixR$Kc_#zzs6LYzH^s3j&;Zac zrj)4&)aVPgm3CV)wFpagj05f^GYh)_kOxQvfB;w_fWpJnO2*sp#8h}?89i4v>HREh zVQ8XE&7cTk%o?efr_#4iK_=b-oif>97d|Q7at+8P3KOFmhBAy-wFVp}Tt7KSc8CS5 z%GbhB)(_i5w-$tHJZAR>ARM!pa5X=>@5{nUL*i_Q$>$zx07F3XYN0+^<}$4C?Wt5S8?M689NB=f7Xbd^`kzHh}6T zo`(K(IR$hZ0039&Gpqc#_KfsE9_lLqnCD8#JkC?{P#*}uQLYp)XrU8qONice5jLK| zv!Q$*ssKP-sh@E8jLa+(Q~><%GOjpa7dH|B5&<9pB>Mu8Q9WH{0dRg?#_YD;irabY z6lA!}PcKc#dk?v@UI3tpCEJpp5g3NLAa~XafIhPp@}Pk4JhWN-0j=GOb z0ze`F1c2mv06gW1&%0zOQju}vD{9F3gr`{HqY(wb6doX6Wzwwx!!f{*9zC)4egK^H zE~R@4=`cUKz^itdg2Le(PE95X%d+0O>_1a#!JJlBj`R~TGkxTDcxP!_%$v29Ye`u- z(#d7OlW4;|0?rT}*mwWrHDG?wwQrA^^FA|vbn(;FWdMYf=O@nx#kagBKJT-=nCYy6 Z;TNj``?_X{F;oBm002ovPDHLkV1mq?npXe- diff --git a/assets/dolphin/internal/thank_you_128x64/frame_2.png b/assets/dolphin/internal/thank_you_128x64/frame_2.png deleted file mode 100644 index b2056da40acb371532d9fb120c7f5f7cdb64b402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)pHxk*GpRCwC$oZFUzAPhxm|Noz79=hseax)-?izg3Vty;3oApv%& z?=r}KzE<^>W-qnA((FAd`me9u8kfV%=RE}Yi$0B!l@s&`eU%rpvyMmBe#G^L84$?{ zc7*m~HG!C}9bG>{fX}VcPInv$RuAi%Q(;s`n`A)zHfX0~6+9sd($S09!UCxGz;2br zmz8yS{gv^i!O@;2h!&iqxYLj7HAgtqQ&x!CG&JHU*#6pMfK_m4A!gUe_w=LV!fMBA z&C1=K2jRyW1b_e#00sddKo)P10H=H7T~@GZ==7Z#{aXPGom|cdK1T{*5zwRO`dMPV zp7vI&wJYRxt1;k63kO58m2kXw`>kCeuloofqba+anmR0YS3DMt#V%ZeF5XERhO}~J zc>x*-Xxlu5mWz%`Y&AjZBJGTxd*q@|L)t}zBU2s45?8-5qFT2tT9vDYE5SP7Sg z84*^(88avd0D}M!0Jfe0T_~pHJU3z2Ju{#qZ=q}H_`WWbAZ5+$Zvd^@^;N_X@Jv^qtYF>M`Vc2*?2|5j#3K;y*Tnt>7 zO{mM4AW0m34C$PuV?dDKrR@ZrQ~;}(_!~ggv({$N5F;qz&m9AtJ)rE*^~C_9!TuiEZ2Ck2RMKEw)5X#L8PNP|VjAfj zLRC}$sNDcK>DkjGwe>CTYv&T=vrOkPpS3_V=qQ=0{sOocP<1sMlgR)8002ovPDHLk FV1oF5R#N}~ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_3.png b/assets/dolphin/internal/thank_you_128x64/frame_3.png deleted file mode 100644 index 9f58533d5d1384fd265cc2582b6b249bcad64618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmV+h1Nr=kP)pHxJg7oRCwC$Tw9LAAPl73|IWJ~m5}QfZvtWbQALR%jmHKvF^ORh z`TLc&9-Q+|pKZ4rB{6IxA0iFbw^}vyb}0as=gP2PXPA%6tG)tLyB7dy>*Uwput;`H zf$}|*bkwUQ3hCr}47MJEtkJ`nD!xW6bm#1i-U&d@Oq-o8sDpw6w_5TII_*}1>o~5>Htj-SPZda+5?@&)#g?|x2K_(2mk;8000620Kl|- zyuTIWdM0s}rBtuD$**YsrVFr!J41%_F8v2@QggFY?p4*}%4zzxj zP^2_uIYUXkkKM&-7;+pcQ_d==PZ7GA)VN86O1DxwR0)QXhK|!XT~*N)Z5D|AmKsh) ztZA5dA*ZVaZwO+ur6wgv%?~`#Qd5(cMH43Q>Bjpz#>E~ z&IbVGIggSeQLDJIld-uD0O_YCXM&(A{o+Q{1r;#|?931^zIq67`a*wAWc15mYY zl(|YL2D{-GcN=pO=f#F;$yT;id8(~CcSpTs4p0Z2kShr-sq(bmDM~U2wV_xELjV8( zfB*mhuoW#)c=g0J+Sw7na`{tsMxF|Qvq9ea4KDi+I=b4~tqt;O32E4m{eM*i_={?* z6=SmjfN5E2=r+ROL7L$h0A|;lvR1S{9sqc#OyWKf0dVCm`s06Y^| zhyVxx005990a&wv9RQq{&s+z9zstA(Q@jA6ZXl9esk*xl08ANqtj~q+KSssP4Xq9! zlpT^0fH`2~lC{>R&0l)h2!Ml}NbYl|FU7*NFIx5nbDF6Tf diff --git a/assets/dolphin/internal/thank_you_128x64/frame_4.png b/assets/dolphin/internal/thank_you_128x64/frame_4.png deleted file mode 100644 index 84f53a8673caa541f327bbeb1c0a5cf0fc7e5c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmV;W0$TlvP)pHS4l)cRCwC$T+x!lAP6-6|3Bw$#;HRE6>SnBE>As@*eeStD=`Ke za-L`7PyK___pFj=@PGQZ*Kr(S4~dqoe-fcL6q>B${x06u9c^C#xFL>@q)Q1Ns-eoZ z9r?53X!`=7%skv@mH8@J84*zZ&B=~kXFP~Z09-scJ(^DwNb}G=TD*JhAX`3jKxQ_^JrlN&o-=000mG004|J5Oj^t zc^*>>`Ikh1$e>x^YPL>6;_|!*f*Ld0B}el(Yv~|Eg&1Whxj}j56(k+U00aO400;m80LI08O@{~o03)7WBQG0!2FA$`PZ2=rgm!OezSI7W zf+qlKl`7YBW@1&L>k@!#lZNpPHKVPGL)~f(*WAo4uAjv0N`S- z1^|cvWB#Z-D|A9b$1lDY=Z1c*-@|u1o94Vv<(Z(3H|ud|-&o07c(>RCsyShFd94sv zdHRom&$&pImq|oHRCwC$TuE}oAPmI(|If~0DlVd>X&Au95raaCv$CFoOY>>S%UL z0JP^V&E={oO-Eajept6A`Vx(p=OVA!zCC8AQ_w#z0YCr{07MA@0s!KwqJN%$OUIcS z^OS%t_4+kM0MCON4zCMlzT{jQEWm8yD2ll9RBy1D>cOY-vR~XO=6Sp>N~u!N8?)E- zNEbAm5&-Kv>P`gM(2k+Dw#KYj{(gqTX{-+4HGJ455BQ)>SVIb20dF*=W|6x8Wv5ja zlnNe@VUWD8tAokIm8-Q8)2{p6-3&^Zq+`3g&Wv(3K`OQ{@?FXhU#~lDWkahc4)c{9 zo-ba3+@}<#Gi_Z;ah9F5=bLOOzXu3GhFfhqZsfiuO4<@|jktR)?$M>y262rZA-@Oc zXUO@Ib6Iy2K2@15xL|BMQ4xnKvjrE7Ex4c{s9arRy8_F%<_T0mb^+QY*@ z_jW-{kf=EOdjY0N1%?Iy&8jWJI>CKS%Zk9z008N`h{w`FrRM6BJHh%etj7TWh@kR9 z)Ec{aOO)r90JPpb!COG{9pS@|K-=sAI(E~12Vzo{Ljp|y7XTnmJ=J128U9kY768Oe zI7$Ez07MA@0)S;Vuip5C`=8eH*j8jx{on^=tay-+ru^G z4cQB6_VVIyWK8odD$g(h`T?fK)aB|kI9q>L07#~Do&oVeS1-(zPa~Ml4)t$6y;M^w z-v6}}lj%&(H*7$Sb|%%lc)*V?V@z-OUXW)i$qzXtYfQ@ndGVMZUBj5hO*p8C03b>L z5CBAZD*)Yz52HTw`Az1kTO-Mh9tT+_SLwN0FwM9fCMB-CEThKlHZF92Q8qQc<-5nW^Mu1(qQvuV*E2eTw^ T*rKm)00000NkvXXu0mjfNT|>X diff --git a/assets/dolphin/internal/thank_you_128x64/frame_6.png b/assets/dolphin/internal/thank_you_128x64/frame_6.png deleted file mode 100644 index dca4f918bb62b565468730f970e3bf25cfe6776f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)pH+DSw~RCwC$TG?*IAPi*r|9@_)MnbGFhCm3}9Y0hXYRv2bcr!YI!3WG^0glz;SIi$10+&I@sxDCCzm-c~%j= zHTzBK*}&A<4ghm-W(?&8R$Z(l7$tZeonuS~U0FW8qc3`(cu?du<%J**t_!$Rih*}+ z|G`U6uZKK$ylw4*@R^uLrDjQcSxJ*;Z4Lmbh3MP^fcfej{5FYCk0nh$E9rfjY-l_H zq*j{r{=rC?R0IK_5C8%|*%N@S+xG$jvYGOBB0|J7R>c^m#3IuyV24Lqoe4T}d%mK| z902f?V;$+3J5IBbCg;&4N!yY+B!XGHyg?${TX?HZig_1L`#6P5`{;G-*P?IL1eU)EAXtMH3k@?0BhLJF-2m(MM00e+S00;nu m01yBQ0U!Vr0zd#Li{uwJCWgI;@ZFmL0000pHlu1NERCwC$T8cQkP#DBLrM9hJlm^ z=~OCQ0s=q)NCbcYkO;uG0DS$WV?@l;Bk6=cbWWKpX<~^MmH7eS`AhAECU5*klx0Hh zQj{1ajdL3)o*$Xlg3+5Vo+|=WJD{HC$u~7IrNy?G`-G>nDWqjD!Rj9YA()>p3L;wH zMHqwUw!Af1WBK)>vY0bXX|XMJe&rH6ca3e?%TS;l603#!mTACeB3*}OyTphI)3&T^ zN@ZeQx?X(N7GLQ`CX`Vx3w%TbHR%4iM;)=(o10-^!lEq`#+FeptC2pWkY=nS-WCzd z7nW%G;z6+qx#wEYSosoe@9FD05{J1b#AIxbzxok+ydBXB2>G}Po;lqG@zev2?Yx9Z zOhpg?5&<9pq|E^EQa!of3h6?2jDW0U2mpxy5C9SZAONIm0)RBvgL1C6 zA`^}CD|Jni03glvJJ5RNT}f9cZW!-2+6NA$Z^hE|^dea-ujiLAQxOD!L;wf?i2&?L-;fQB Ut~^uZ>i_@%07*qoM6N<$f+tx;A^-pY diff --git a/assets/dolphin/internal/thank_you_128x64/frame_8.png b/assets/dolphin/internal/thank_you_128x64/frame_8.png deleted file mode 100644 index 7eca54d710dc020720cb362b85328dc55659dae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*Qk(@Ik;M!Qe1}1p@p%4<6b1&S ziJmTwAr-gY&UroQumVSG@csXDH_tumbBxtx&(>|fKQ5ju^`2eu<;Ir|_p~}SK_&vR z0K<=|pKZQ|Pvl_We)_TE&gH)~6?LhsIUCi!JpWqIc|!A2sUO1%{if)@pU>As#_&&n z;W~NwY)i%k@^bF$z16x!FQgSW-THMRCCrau#sh2LlRxY4UWoQ=E!58y4NcdaC(N)! z@O*j5=iI!|KkdA4`PCDFmM#NghMV#YpVx1(x{_9tcGogt!**+?3D!-u=kDyv=y`d! zd-3~ifmcoJeq39y*dmVg@XV!ZOGYQCl^O$@0>x^qg{)V@Wp6j)r;y<{rgw^8kziaWEie%>-F=xiQ z&;EAi?xR4br)Rg`vt?e*@S(ZySE&1hPj3r-KW5*p_#Tw~`QPT`%Cq4g3zj9{sdb*e ze9A8wnYrIi^hY&Jn{2Rpd{cZF$bCpiD> zP>`vyV$^*3(3NB2M3KoRk+Uubr8)k;9JRi4o|5f7=ivLU{>$R8`bX_lYB}L?DsiHk z_Zs`yQ)k`;%w7HUhpouk4yEIpR{zpWs?6JWQBe7z#rm|=ciM9MBjc5h$ZlT$YWrRO zA7A$O7Iw_8-SX%oP~oPR_v5|IQo5`kUXe-sWmv%h+yBtc%VpK#xBqQDEZ(N{<=vIS)5#Z_mBd_hIKaX3;QvW}|G<0elrO9Mfa2TJ L)z4*}Q$iB}zu-@} diff --git a/assets/dolphin/internal/thank_you_128x64/frame_9.png b/assets/dolphin/internal/thank_you_128x64/frame_9.png deleted file mode 100644 index 70715bf5f4cece33c17f4034e5fb607f8414c689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*Qk(@Ik;M!Qe1}1p@p%4<6rkV= zPZ!6Kid%258gexl@HhmX{ri4RYY>N3cE>(@3yWtLRm`S}xq%H6U|?WkaA08IU|?Wm zP+(wS0oec-ba)rRxMJqNeXlYE*1Fs8OMVv?aQ4v2#ryv=e)w_d Date: Tue, 10 Jan 2023 00:23:50 +0100 Subject: [PATCH 25/64] fixing things --- .drone.yml | 311 --------------- assets/dolphin/internal/manifest.txt | 2 +- .../{sfw_128x64 => thx_128x64}/frame_0.png | Bin .../{sfw_128x64 => thx_128x64}/frame_1.png | Bin .../{sfw_128x64 => thx_128x64}/frame_10.png | Bin .../{sfw_128x64 => thx_128x64}/frame_2.png | Bin .../{sfw_128x64 => thx_128x64}/frame_3.png | Bin .../{sfw_128x64 => thx_128x64}/frame_4.png | Bin .../{sfw_128x64 => thx_128x64}/frame_5.png | Bin .../{sfw_128x64 => thx_128x64}/frame_6.png | Bin .../{sfw_128x64 => thx_128x64}/frame_7.png | Bin .../{sfw_128x64 => thx_128x64}/frame_8.png | Bin .../{sfw_128x64 => thx_128x64}/frame_9.png | Bin .../{sfw_128x64 => thx_128x64}/meta.txt | 0 assets/resources/dolphin/manifest.txt | 359 ------------------ scripts/assets.py | 5 +- scripts/flipper/assets/dolphin.py | 22 +- 17 files changed, 21 insertions(+), 678 deletions(-) delete mode 100644 .drone.yml rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_0.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_1.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_10.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_2.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_3.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_4.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_5.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_6.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_7.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_8.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/frame_9.png (100%) rename assets/dolphin/internal/{sfw_128x64 => thx_128x64}/meta.txt (100%) delete mode 100644 assets/resources/dolphin/manifest.txt diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index defde9435..000000000 --- a/.drone.yml +++ /dev/null @@ -1,311 +0,0 @@ -kind: pipeline -type: docker -name: "Release firmware" - -steps: - - name: "Update submodules" - image: alpine/git - commands: - - git submodule sync - - git -c protocol.version=2 submodule update --init --force --recursive - - git submodule foreach git config --local gc.auto 0 - - git log -1 --format='%H' - - - name: "Build firmware" - image: hfdj/fztools - pull: never - commands: - - export DIST_SUFFIX=${DRONE_TAG} - - export WORKFLOW_BRANCH_OR_TAG=release-cfw - - ./fbt COMPACT=1 DEBUG=0 updater_package - - mkdir artifacts-default - - mv dist/f7-C/* artifacts-default/ - - ls -laS artifacts-default - - ls -laS artifacts-default/f7-update-${DRONE_TAG} - - sed -i 's/(version)/'${DRONE_TAG}'/g' CHANGELOG.md - - echo '# [Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-'${DRONE_TAG}'.tgz&channel=release-cfw&version='${DRONE_TAG}')' >> CHANGELOG.md - environment: - FBT_TOOLS_CUSTOM_LINK: - from_secret: fbt_link - - - name: "Build no anims FW" - image: hfdj/fztools - pull: never - commands: - - rm -f assets/dolphin/external/manifest.txt - - cp .ci_files/anims_ofw.txt assets/dolphin/external/manifest.txt - - export DIST_SUFFIX=${DRONE_TAG}n - - export WORKFLOW_BRANCH_OR_TAG=no-custom-anims - - ./fbt COMPACT=1 DEBUG=0 updater_package - - mkdir artifacts-ofw-anims - - mv dist/f7-C/* artifacts-ofw-anims/ - - ls -laS artifacts-ofw-anims - - ls -laS artifacts-ofw-anims/f7-update-${DRONE_TAG}n - - echo '' >> CHANGELOG.md - - echo '### [Version without custom animations - Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-'${DRONE_TAG}'n.tgz&channel=release-cfw&version='${DRONE_TAG}'n)' >> CHANGELOG.md - environment: - FBT_TOOLS_CUSTOM_LINK: - from_secret: fbt_link - - - name: "Bundle self-update packages" - image: kramos/alpine-zip - commands: - - cp artifacts-ofw-anims/flipper-z-f7-update-${DRONE_TAG}n.tgz . - - cp artifacts-default/flipper-z-f7-update-${DRONE_TAG}.tgz . - - zip -r artifacts-ofw-anims/flipper-z-f7-update-${DRONE_TAG}n.zip artifacts-ofw-anims/f7-update-${DRONE_TAG}n - - zip -r artifacts-default/flipper-z-f7-update-${DRONE_TAG}.zip artifacts-default/f7-update-${DRONE_TAG} - - tar czpf artifacts-default/flipper-z-any-scripts-${DRONE_TAG}.tgz scripts debug - - rm -rf artifacts-ofw-anims/f7-update-${DRONE_TAG} - - rm -rf artifacts-default/f7-update-${DRONE_TAG} - - ls -laS artifacts-ofw-anims - - ls -laS artifacts-default - - mv artifacts-default/ ${DRONE_TAG} - - ls -laS ${DRONE_TAG} - - - name: "Upload default to updates srv" - image: appleboy/drone-scp - settings: - host: - from_secret: dep_host - username: - from_secret: dep_user - password: - from_secret: dep_passwd - port: - from_secret: dep_port - target: - from_secret: dep_target_new - source: - - ${DRONE_TAG}/*.tgz - - ${DRONE_TAG}/*.zip - - ${DRONE_TAG}/*.json - - ${DRONE_TAG}/*.elf - - ${DRONE_TAG}/*.dfu - - ${DRONE_TAG}/*.bin - - - name: "Upload no-anims to updates srv" - image: appleboy/drone-scp - settings: - host: - from_secret: dep_host - username: - from_secret: dep_user - password: - from_secret: dep_passwd - port: - from_secret: dep_port - target: - from_secret: dep_target_noanim - source: flipper-z-f7-update-${DRONE_TAG}n.tgz - - - name: "Do Github release" - image: ddplugins/github-release - pull: never - settings: - github_url: https://github.com - repo_owner: - from_secret: github_repoowner - api_key: - from_secret: github_apikey - files: - - ${DRONE_TAG}/*.tgz - - ${DRONE_TAG}/*.zip - - artifacts-ofw-anims/*.tgz - title: ${DRONE_TAG} - note: CHANGELOG.md - checksum: - - md5 - - sha1 - - crc32 - - - name: "Trigger update server reindex" - image: hfdj/fztools - pull: never - environment: - UPD_KEY: - from_secret: git_update_serv_token - UPD_URL: - from_secret: git_update_server_url - commands: - - curl -X POST -F 'key='$UPD_KEY'' $UPD_URL - - - name: "Send files to telegram" - image: appleboy/drone-telegram - settings: - token: - from_secret: tgtoken - to: - from_secret: tgid - format: markdown - message: "New Unleashed firmware released! - - - Version: {{build.tag}} - - - [-Github-](https://github.com/DarkFlippers/unleashed-firmware/releases/tag/${DRONE_TAG}) - - - [-How to install firmware-](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) - - - [-Download latest extra apps pack-](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) - - - [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) - - - [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz&channel=release-cfw&version=${DRONE_TAG})" - document: - - ${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz - - - name: "Send discord notification" - image: appleboy/drone-discord - settings: - webhook_id: - from_secret: ds_wh_id - webhook_token: - from_secret: ds_wh_token - message: "New Unleashed firmware released! - - - Version: {{build.tag}} - - - [[Github]](https://github.com/DarkFlippers/unleashed-firmware/releases/tag/${DRONE_TAG}) - - - [-How to install firmware-](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) - - - [-Download latest extra apps pack-](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) - - - [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) - - - [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz&channel=release-cfw&version=${DRONE_TAG})" - -trigger: - event: - - tag - -node: - typ: haupt - ---- -kind: pipeline -type: docker -name: "Dev build" - -steps: - - name: "Update submodules" - image: alpine/git - commands: - - git submodule sync - - git -c protocol.version=2 submodule update --init --force --recursive - - git submodule foreach git config --local gc.auto 0 - - git log -1 --format='%H' - - - name: "Build dev FW" - image: hfdj/fztools - pull: never - commands: - - export DIST_SUFFIX=${DRONE_BUILD_NUMBER} - - export WORKFLOW_BRANCH_OR_TAG=dev-cfw - - ./fbt COMPACT=1 DEBUG=0 updater_package - - mkdir artifacts-default - - mv dist/f7-C/* artifacts-default/ - - ls -laS artifacts-default - - ls -laS artifacts-default/f7-update-${DRONE_BUILD_NUMBER} - environment: - FBT_TOOLS_CUSTOM_LINK: - from_secret: fbt_link - - - name: "Bundle self-update packages" - image: kramos/alpine-zip - commands: - - cp artifacts-default/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz . - - rm -rf artifacts-default/f7-update-${DRONE_BUILD_NUMBER} - - ls -laS artifacts-default - - mv artifacts-default/ dev - - ls -laS dev - - - name: "Clean dev folder" - image: appleboy/drone-ssh - settings: - host: - from_secret: dep_host - username: - from_secret: dep_user - password: - from_secret: dep_passwd - port: - from_secret: dep_port - command_timeout: 30s - script: - - cd web/unleashedflip.com/public_html/fw/dev && rm -f ./* - - - name: "Upload default to updates srv" - image: appleboy/drone-scp - settings: - host: - from_secret: dep_host - username: - from_secret: dep_user - password: - from_secret: dep_passwd - port: - from_secret: dep_port - target: - from_secret: dep_target_new - source: - - dev/*.tgz - - dev/*.zip - - dev/*.json - - dev/*.elf - - dev/*.dfu - - dev/*.bin - - - name: "Trigger update server reindex" - image: hfdj/fztools - pull: never - environment: - UPD_KEY: - from_secret: git_update_serv_token - UPD_URL: - from_secret: git_update_server_url - commands: - - curl -X POST -F 'key='$UPD_KEY'' $UPD_URL - - - name: "Send files to telegram" - image: appleboy/drone-telegram - settings: - token: - from_secret: tgtoken - to: - from_secret: tgid_dev - format: markdown - message: "Unleashed firmware dev build successful! - - - Build: {{build.number}} - - SHA: {{commit.sha}} - - - Commit: {{commit.message}} - - - [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/dev/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz&channel=dev-cfw&version=${DRONE_BUILD_NUMBER})" - document: - - dev/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz - -trigger: - branch: - - dev - event: - - push - -node: - typ: haupt diff --git a/assets/dolphin/internal/manifest.txt b/assets/dolphin/internal/manifest.txt index 46f873a84..c94ecd217 100644 --- a/assets/dolphin/internal/manifest.txt +++ b/assets/dolphin/internal/manifest.txt @@ -2,7 +2,7 @@ Filetype: Flipper Animation Manifest Version: 1 # Animation 1 -Name: sfw_128x64 +Name: thx_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 diff --git a/assets/dolphin/internal/sfw_128x64/frame_0.png b/assets/dolphin/internal/thx_128x64/frame_0.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_0.png rename to assets/dolphin/internal/thx_128x64/frame_0.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_1.png b/assets/dolphin/internal/thx_128x64/frame_1.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_1.png rename to assets/dolphin/internal/thx_128x64/frame_1.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_10.png b/assets/dolphin/internal/thx_128x64/frame_10.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_10.png rename to assets/dolphin/internal/thx_128x64/frame_10.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_2.png b/assets/dolphin/internal/thx_128x64/frame_2.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_2.png rename to assets/dolphin/internal/thx_128x64/frame_2.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_3.png b/assets/dolphin/internal/thx_128x64/frame_3.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_3.png rename to assets/dolphin/internal/thx_128x64/frame_3.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_4.png b/assets/dolphin/internal/thx_128x64/frame_4.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_4.png rename to assets/dolphin/internal/thx_128x64/frame_4.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_5.png b/assets/dolphin/internal/thx_128x64/frame_5.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_5.png rename to assets/dolphin/internal/thx_128x64/frame_5.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_6.png b/assets/dolphin/internal/thx_128x64/frame_6.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_6.png rename to assets/dolphin/internal/thx_128x64/frame_6.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_7.png b/assets/dolphin/internal/thx_128x64/frame_7.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_7.png rename to assets/dolphin/internal/thx_128x64/frame_7.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_8.png b/assets/dolphin/internal/thx_128x64/frame_8.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_8.png rename to assets/dolphin/internal/thx_128x64/frame_8.png diff --git a/assets/dolphin/internal/sfw_128x64/frame_9.png b/assets/dolphin/internal/thx_128x64/frame_9.png similarity index 100% rename from assets/dolphin/internal/sfw_128x64/frame_9.png rename to assets/dolphin/internal/thx_128x64/frame_9.png diff --git a/assets/dolphin/internal/sfw_128x64/meta.txt b/assets/dolphin/internal/thx_128x64/meta.txt similarity index 100% rename from assets/dolphin/internal/sfw_128x64/meta.txt rename to assets/dolphin/internal/thx_128x64/meta.txt diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt deleted file mode 100644 index 21b3d6abd..000000000 --- a/assets/resources/dolphin/manifest.txt +++ /dev/null @@ -1,359 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: nsfw/lvl_1 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_2 -Min butthurt: 0 -Max butthurt: 14 -Min level: 2 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_3 -Min butthurt: 0 -Max butthurt: 14 -Min level: 3 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_4 -Min butthurt: 0 -Max butthurt: 14 -Min level: 4 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_5 -Min butthurt: 0 -Max butthurt: 14 -Min level: 5 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_6 -Min butthurt: 0 -Max butthurt: 14 -Min level: 6 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_7 -Min butthurt: 0 -Max butthurt: 14 -Min level: 7 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_8 -Min butthurt: 0 -Max butthurt: 14 -Min level: 8 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_9 -Min butthurt: 0 -Max butthurt: 14 -Min level: 9 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_10 -Min butthurt: 0 -Max butthurt: 14 -Min level: 10 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_11 -Min butthurt: 0 -Max butthurt: 14 -Min level: 11 -Max level: 30 -Weight: 9 - -Name: nsfw/lvl_12 -Min butthurt: 0 -Max butthurt: 14 -Min level: 12 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_13 -Min butthurt: 0 -Max butthurt: 14 -Min level: 13 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_14 -Min butthurt: 0 -Max butthurt: 14 -Min level: 14 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_15 -Min butthurt: 0 -Max butthurt: 14 -Min level: 15 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_16 -Min butthurt: 0 -Max butthurt: 14 -Min level: 16 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_17 -Min butthurt: 0 -Max butthurt: 14 -Min level: 17 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_18 -Min butthurt: 0 -Max butthurt: 14 -Min level: 18 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_19 -Min butthurt: 0 -Max butthurt: 14 -Min level: 19 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_20 -Min butthurt: 0 -Max butthurt: 14 -Min level: 20 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_21 -Min butthurt: 0 -Max butthurt: 14 -Min level: 21 -Max level: 30 -Weight: 9 - -Name: nsfw/lvl_22 -Min butthurt: 0 -Max butthurt: 14 -Min level: 22 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_23 -Min butthurt: 0 -Max butthurt: 14 -Min level: 23 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_24 -Min butthurt: 0 -Max butthurt: 14 -Min level: 24 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_25 -Min butthurt: 0 -Max butthurt: 14 -Min level: 25 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_26 -Min butthurt: 0 -Max butthurt: 14 -Min level: 26 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_27 -Min butthurt: 0 -Max butthurt: 14 -Min level: 27 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_28 -Min butthurt: 0 -Max butthurt: 14 -Min level: 28 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_29 -Min butthurt: 0 -Max butthurt: 14 -Min level: 29 -Max level: 30 -Weight: 7 - -Name: nsfw/lvl_30 -Min butthurt: 0 -Max butthurt: 14 -Min level: 30 -Max level: 30 -Weight: 9 - -Name: sfw/L1_Waves_128x50 -Min butthurt: 0 -Max butthurt: 5 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Laptop_128x51 -Min butthurt: 0 -Max butthurt: 7 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Sleep_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Recording_128x51 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Furippa1_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Happy_holidays_128x64 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 4 - -Name: sfw/L1_Read_books_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Cry_128x64 -Min butthurt: 8 -Max butthurt: 13 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Boxing_128x64 -Min butthurt: 10 -Max butthurt: 13 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Mad_fist_128x64 -Min butthurt: 9 -Max butthurt: 13 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Mods_128x64 -Min butthurt: 0 -Max butthurt: 9 -Min level: 1 -Max level: 30 -Weight: 4 - -Name: sfw/L1_Painting_128x64 -Min butthurt: 0 -Max butthurt: 7 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Leaving_sad_128x64 -Min butthurt: 14 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L2_Wake_up_128x64 -Min butthurt: 0 -Max butthurt: 12 -Min level: 1 -Max level: 30 -Weight: 4 - -Name: sfw/L2_Furippa2_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L2_Hacking_pc_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L2_Soldering_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L3_Furippa3_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L3_Hijack_radio_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L3_Lab_research_128x54 -Min butthurt: 0 -Max butthurt: 10 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: sfw/L1_Sleigh_ride_128x64 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 4 diff --git a/scripts/assets.py b/scripts/assets.py index f09a895ab..c1e7ac353 100755 --- a/scripts/assets.py +++ b/scripts/assets.py @@ -293,7 +293,10 @@ class Main(App): self.logger.info(f"Processing Dolphin sources") dolphin = Dolphin() self.logger.info(f"Loading data") - dolphin.load(valid_dirs) + if not "external" in str(self.args.input_directory): # AHEM... oopsie. This script apparently just loads all assets, not only external assets, lol. + dolphin.load(self.args.input_directory) + else: + dolphin.load(valid_dirs) self.logger.info(f"Packing") dolphin.pack(self.args.output_directory, self.args.symbol_name) self.logger.info(f"Complete") diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index d07b2bcc1..02df0416b 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -298,7 +298,11 @@ class DolphinManifest: if len(newname) < 2: newname = name.split("/") - newname = str(newname[1]) + try: # Flipper Zero moment. loading all assets in one script, lol. + newname = str(newname[1]) # external shit we modified + except: + newname = str(newname[0]) # everything else... smh + animation.load(os.path.join(loc, newname)) # Add to array @@ -369,11 +373,17 @@ class Dolphin: self.logger = logging.getLogger("Dolphin") def load(self, valid_dirs: list): - for loc in valid_dirs: - assert os.path.isdir(loc) - # Load Manifest - self.logger.info(f"Loading directory {loc}") - self.manifest.load(loc) + if not "external" in str(valid_dirs): + assert os.path.isdir(valid_dirs) + # Load Manifest + self.logger.info(f"Loading directory {valid_dirs}") + self.manifest.load(valid_dirs) + else: + for loc in valid_dirs: + assert os.path.isdir(loc) + # Load Manifest + self.logger.info(f"Loading directory {loc}") + self.manifest.load(loc) def pack(self, output_directory: str, symbol_name: str = None): self.manifest.save(output_directory, symbol_name) From 1e994b0a312cb1f46502875cfa7571c4b4ff2e2b Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 00:26:53 +0100 Subject: [PATCH 26/64] And adding back our animation --- .../desktop/animations/animation_manager.c | 2 +- assets/dolphin/internal/manifest.txt | 4 ++-- .../internal/thank_you_128x64/frame_0.png | Bin 0 -> 834 bytes .../internal/thank_you_128x64/frame_1.png | Bin 0 -> 899 bytes .../internal/thank_you_128x64/frame_2.png | Bin 0 -> 775 bytes .../internal/thank_you_128x64/frame_3.png | Bin 0 -> 774 bytes .../internal/thank_you_128x64/frame_4.png | Bin 0 -> 677 bytes .../internal/thank_you_128x64/frame_5.png | Bin 0 -> 997 bytes .../internal/thank_you_128x64/frame_6.png | Bin 0 -> 808 bytes .../internal/thank_you_128x64/frame_7.png | Bin 0 -> 738 bytes .../internal/thank_you_128x64/frame_8.png | Bin 0 -> 735 bytes .../internal/thank_you_128x64/frame_9.png | Bin 0 -> 246 bytes .../{thx_128x64 => thank_you_128x64}/meta.txt | 6 +++--- assets/dolphin/internal/thx_128x64/frame_0.png | Bin 3292 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_1.png | Bin 3306 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_10.png | Bin 3392 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_2.png | Bin 3295 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_3.png | Bin 3331 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_4.png | Bin 3315 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_5.png | Bin 3333 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_6.png | Bin 3341 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_7.png | Bin 3428 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_8.png | Bin 3348 -> 0 bytes assets/dolphin/internal/thx_128x64/frame_9.png | Bin 3354 -> 0 bytes 24 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_0.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_1.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_2.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_3.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_4.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_5.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_6.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_7.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_8.png create mode 100644 assets/dolphin/internal/thank_you_128x64/frame_9.png rename assets/dolphin/internal/{thx_128x64 => thank_you_128x64}/meta.txt (67%) delete mode 100644 assets/dolphin/internal/thx_128x64/frame_0.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_1.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_10.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_2.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_3.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_4.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_5.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_6.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_7.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_8.png delete mode 100644 assets/dolphin/internal/thx_128x64/frame_9.png diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index e4aa81f81..9fe415ca9 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -15,7 +15,7 @@ #define TAG "AnimationManager" -#define HARDCODED_ANIMATION_NAME "sfw_128x64" +#define HARDCODED_ANIMATION_NAME "thank_you_128x64" #define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" #define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" diff --git a/assets/dolphin/internal/manifest.txt b/assets/dolphin/internal/manifest.txt index c94ecd217..48dc597a8 100644 --- a/assets/dolphin/internal/manifest.txt +++ b/assets/dolphin/internal/manifest.txt @@ -2,12 +2,12 @@ Filetype: Flipper Animation Manifest Version: 1 # Animation 1 -Name: thx_128x64 +Name: thank_you_128x64 Min butthurt: 0 Max butthurt: 14 Min level: 1 Max level: 30 -Weight: 0 +Weight: 1 # Animation 2 Name: L1_BadBattery_128x47 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_0.png b/assets/dolphin/internal/thank_you_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7f95c28c32cc110b786d47e2fb9bee63b6481b GIT binary patch literal 834 zcmV-I1HJr-P)pH^hrcPRCwC$T-lDpAPl7Z|37zE8#Q9_!EiJ{GJdF<2+T3q;Hha0 z|K%hVnc17)hj+9i-K=i__!Mzx_#gM5@qP|D1s`0Ix)f z#*vmO!Y2E1^siX!98y}v85Q2=tS4Dp&gyjfU)8ITdq5R((r$ds*$9g(_e+wE5$yjk z035&Ed2DDn>I}!=PzX-tsN-V9d#3sU`9>Xs)jz4HXaq<@ewpTzs8oyhAKiqdk4{Zb zeIw0NHQP+NrCF9qOM(sgWvnm0+p*MI{m;HsY{KA*7`wz)kSSw{&F->u^I1@)jD?Z# z4v{d001$x7_d_c@wrH7RL;{jU1fam=RF&yz;z0m_bP&k5Ae4?3!CenV+-to{0w9~{ zG)4u1&zRaryC5VemEnlwfvcjKlw7*G3;OoHH{GGH4nQ$@E>2(P&&zm24{|{c#psZZ z7T*aP!Em~C?>)ex7#-44mQmSFpIcR{GY()ROd$XSfIbnqI$H!~cLTsWgA#zj zG)7g5=OWbq#sJ_cm|$H3&}#v>hXK=12|)1OMROudfBNRL0O)5-hgYNv>LM@k^i2X# zVHti3rj^FJAO?(t2>=105C8%|c`^XQujg-+oU)1qY?se-Hvp^~)d&L`+q%cfT0`xV=}gm=;$m->ZKzG4ZE@c>OYW z=G58=`Zx3JSK`zKIZZ!t4{$Ey`@YM{69uzQXVIl`sY#a@AeYdC%awvzr_2pyBupUy z1b{*S2*91BiVI>KFn;zy=4awbbS*j>WIAz{)DJkqq|4chS^&s&R{d2c66KPPHkW5- zU59GU0DBf4Jv~)+sVuoTWu;H#UgV#9@EBS^tC_!)C9~~1EWn2T0G+L;c$rmn!TpIHAzH4RCwC$T+5QfAPnpB|Nq=QEyMUB6vz^i$cIjw7()?;STU4O zPrl!8{ba;w@&&t<)}LcG`8KbVGS=KG<|6J#U&`C$Aqg7*+K?${pP@~21#|^DT*?@3 zKYvnN-2QCU>SxvQYT#CA%GZc3VCB$qXfv#(t5YqH0MNFN@l#wGDAo0VZbiU?QO4D^ z%12w(8Yg?B@DtAe&4cZz88-6M$XV6#Hhn3w#|qg{(&!{kr@)*o12fePXp$I|Q-*N$ zyKtmbf2_`w%?Zrl?M`Ceh_N45=Pi4ixR$Kc_#zzs6LYzH^s3j&;Zac zrj)4&)aVPgm3CV)wFpagj05f^GYh)_kOxQvfB;w_fWpJnO2*sp#8h}?89i4v>HREh zVQ8XE&7cTk%o?efr_#4iK_=b-oif>97d|Q7at+8P3KOFmhBAy-wFVp}Tt7KSc8CS5 z%GbhB)(_i5w-$tHJZAR>ARM!pa5X=>@5{nUL*i_Q$>$zx07F3XYN0+^<}$4C?Wt5S8?M689NB=f7Xbd^`kzHh}6T zo`(K(IR$hZ0039&Gpqc#_KfsE9_lLqnCD8#JkC?{P#*}uQLYp)XrU8qONice5jLK| zv!Q$*ssKP-sh@E8jLa+(Q~><%GOjpa7dH|B5&<9pB>Mu8Q9WH{0dRg?#_YD;irabY z6lA!}PcKc#dk?v@UI3tpCEJpp5g3NLAa~XafIhPp@}Pk4JhWN-0j=GOb z0ze`F1c2mv06gW1&%0zOQju}vD{9F3gr`{HqY(wb6doX6Wzwwx!!f{*9zC)4egK^H zE~R@4=`cUKz^itdg2Le(PE95X%d+0O>_1a#!JJlBj`R~TGkxTDcxP!_%$v29Ye`u- z(#d7OlW4;|0?rT}*mwWrHDG?wwQrA^^FA|vbn(;FWdMYf=O@nx#kagBKJT-=nCYy6 Z;TNj``?_X{F;oBm002ovPDHLkV1mq?npXe- literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_2.png b/assets/dolphin/internal/thank_you_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2056da40acb371532d9fb120c7f5f7cdb64b402 GIT binary patch literal 775 zcmV+i1Ni)jP)pHxk*GpRCwC$oZFUzAPhxm|Noz79=hseax)-?izg3Vty;3oApv%& z?=r}KzE<^>W-qnA((FAd`me9u8kfV%=RE}Yi$0B!l@s&`eU%rpvyMmBe#G^L84$?{ zc7*m~HG!C}9bG>{fX}VcPInv$RuAi%Q(;s`n`A)zHfX0~6+9sd($S09!UCxGz;2br zmz8yS{gv^i!O@;2h!&iqxYLj7HAgtqQ&x!CG&JHU*#6pMfK_m4A!gUe_w=LV!fMBA z&C1=K2jRyW1b_e#00sddKo)P10H=H7T~@GZ==7Z#{aXPGom|cdK1T{*5zwRO`dMPV zp7vI&wJYRxt1;k63kO58m2kXw`>kCeuloofqba+anmR0YS3DMt#V%ZeF5XERhO}~J zc>x*-Xxlu5mWz%`Y&AjZBJGTxd*q@|L)t}zBU2s45?8-5qFT2tT9vDYE5SP7Sg z84*^(88avd0D}M!0Jfe0T_~pHJU3z2Ju{#qZ=q}H_`WWbAZ5+$Zvd^@^;N_X@Jv^qtYF>M`Vc2*?2|5j#3K;y*Tnt>7 zO{mM4AW0m34C$PuV?dDKrR@ZrQ~;}(_!~ggv({$N5F;qz&m9AtJ)rE*^~C_9!TuiEZ2Ck2RMKEw)5X#L8PNP|VjAfj zLRC}$sNDcK>DkjGwe>CTYv&T=vrOkPpS3_V=qQ=0{sOocP<1sMlgR)8002ovPDHLk FV1oF5R#N}~ literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_3.png b/assets/dolphin/internal/thank_you_128x64/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9f58533d5d1384fd265cc2582b6b249bcad64618 GIT binary patch literal 774 zcmV+h1Nr=kP)pHxJg7oRCwC$Tw9LAAPl73|IWJ~m5}QfZvtWbQALR%jmHKvF^ORh z`TLc&9-Q+|pKZ4rB{6IxA0iFbw^}vyb}0as=gP2PXPA%6tG)tLyB7dy>*Uwput;`H zf$}|*bkwUQ3hCr}47MJEtkJ`nD!xW6bm#1i-U&d@Oq-o8sDpw6w_5TII_*}1>o~5>Htj-SPZda+5?@&)#g?|x2K_(2mk;8000620Kl|- zyuTIWdM0s}rBtuD$**YsrVFr!J41%_F8v2@QggFY?p4*}%4zzxj zP^2_uIYUXkkKM&-7;+pcQ_d==PZ7GA)VN86O1DxwR0)QXhK|!XT~*N)Z5D|AmKsh) ztZA5dA*ZVaZwO+ur6wgv%?~`#Qd5(cMH43Q>Bjpz#>E~ z&IbVGIggSeQLDJIld-uD0O_YCXM&(A{o+Q{1r;#|?931^zIq67`a*wAWc15mYY zl(|YL2D{-GcN=pO=f#F;$yT;id8(~CcSpTs4p0Z2kShr-sq(bmDM~U2wV_xELjV8( zfB*mhuoW#)c=g0J+Sw7na`{tsMxF|Qvq9ea4KDi+I=b4~tqt;O32E4m{eM*i_={?* z6=SmjfN5E2=r+ROL7L$h0A|;lvR1S{9sqc#OyWKf0dVCm`s06Y^| zhyVxx005990a&wv9RQq{&s+z9zstA(Q@jA6ZXl9esk*xl08ANqtj~q+KSssP4Xq9! zlpT^0fH`2~lC{>R&0l)h2!Ml}NbYl|FU7*NFIx5nbDF6Tf literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_4.png b/assets/dolphin/internal/thank_you_128x64/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..84f53a8673caa541f327bbeb1c0a5cf0fc7e5c5e GIT binary patch literal 677 zcmV;W0$TlvP)pHS4l)cRCwC$T+x!lAP6-6|3Bw$#;HRE6>SnBE>As@*eeStD=`Ke za-L`7PyK___pFj=@PGQZ*Kr(S4~dqoe-fcL6q>B${x06u9c^C#xFL>@q)Q1Ns-eoZ z9r?53X!`=7%skv@mH8@J84*zZ&B=~kXFP~Z09-scJ(^DwNb}G=TD*JhAX`3jKxQ_^JrlN&o-=000mG004|J5Oj^t zc^*>>`Ikh1$e>x^YPL>6;_|!*f*Ld0B}el(Yv~|Eg&1Whxj}j56(k+U00aO400;m80LI08O@{~o03)7WBQG0!2FA$`PZ2=rgm!OezSI7W zf+qlKl`7YBW@1&L>k@!#lZNpPHKVPGL)~f(*WAo4uAjv0N`S- z1^|cvWB#Z-D|A9b$1lDY=Z1c*-@|u1o94Vv<(Z(3H|ud|-&o07c(>RCsyShFd94sv zdHRom&$&pImq|oHRCwC$TuE}oAPmI(|If~0DlVd>X&Au95raaCv$CFoOY>>S%UL z0JP^V&E={oO-Eajept6A`Vx(p=OVA!zCC8AQ_w#z0YCr{07MA@0s!KwqJN%$OUIcS z^OS%t_4+kM0MCON4zCMlzT{jQEWm8yD2ll9RBy1D>cOY-vR~XO=6Sp>N~u!N8?)E- zNEbAm5&-Kv>P`gM(2k+Dw#KYj{(gqTX{-+4HGJ455BQ)>SVIb20dF*=W|6x8Wv5ja zlnNe@VUWD8tAokIm8-Q8)2{p6-3&^Zq+`3g&Wv(3K`OQ{@?FXhU#~lDWkahc4)c{9 zo-ba3+@}<#Gi_Z;ah9F5=bLOOzXu3GhFfhqZsfiuO4<@|jktR)?$M>y262rZA-@Oc zXUO@Ib6Iy2K2@15xL|BMQ4xnKvjrE7Ex4c{s9arRy8_F%<_T0mb^+QY*@ z_jW-{kf=EOdjY0N1%?Iy&8jWJI>CKS%Zk9z008N`h{w`FrRM6BJHh%etj7TWh@kR9 z)Ec{aOO)r90JPpb!COG{9pS@|K-=sAI(E~12Vzo{Ljp|y7XTnmJ=J128U9kY768Oe zI7$Ez07MA@0)S;Vuip5C`=8eH*j8jx{on^=tay-+ru^G z4cQB6_VVIyWK8odD$g(h`T?fK)aB|kI9q>L07#~Do&oVeS1-(zPa~Ml4)t$6y;M^w z-v6}}lj%&(H*7$Sb|%%lc)*V?V@z-OUXW)i$qzXtYfQ@ndGVMZUBj5hO*p8C03b>L z5CBAZD*)Yz52HTw`Az1kTO-Mh9tT+_SLwN0FwM9fCMB-CEThKlHZF92Q8qQc<-5nW^Mu1(qQvuV*E2eTw^ T*rKm)00000NkvXXu0mjfNT|>X literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_6.png b/assets/dolphin/internal/thank_you_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..dca4f918bb62b565468730f970e3bf25cfe6776f GIT binary patch literal 808 zcmV+@1K0eCP)pH+DSw~RCwC$TG?*IAPi*r|9@_)MnbGFhCm3}9Y0hXYRv2bcr!YI!3WG^0glz;SIi$10+&I@sxDCCzm-c~%j= zHTzBK*}&A<4ghm-W(?&8R$Z(l7$tZeonuS~U0FW8qc3`(cu?du<%J**t_!$Rih*}+ z|G`U6uZKK$ylw4*@R^uLrDjQcSxJ*;Z4Lmbh3MP^fcfej{5FYCk0nh$E9rfjY-l_H zq*j{r{=rC?R0IK_5C8%|*%N@S+xG$jvYGOBB0|J7R>c^m#3IuyV24Lqoe4T}d%mK| z902f?V;$+3J5IBbCg;&4N!yY+B!XGHyg?${TX?HZig_1L`#6P5`{;G-*P?IL1eU)EAXtMH3k@?0BhLJF-2m(MM00e+S00;nu m01yBQ0U!Vr0zd#Li{uwJCWgI;@ZFmL0000pHlu1NERCwC$T8cQkP#DBLrM9hJlm^ z=~OCQ0s=q)NCbcYkO;uG0DS$WV?@l;Bk6=cbWWKpX<~^MmH7eS`AhAECU5*klx0Hh zQj{1ajdL3)o*$Xlg3+5Vo+|=WJD{HC$u~7IrNy?G`-G>nDWqjD!Rj9YA()>p3L;wH zMHqwUw!Af1WBK)>vY0bXX|XMJe&rH6ca3e?%TS;l603#!mTACeB3*}OyTphI)3&T^ zN@ZeQx?X(N7GLQ`CX`Vx3w%TbHR%4iM;)=(o10-^!lEq`#+FeptC2pWkY=nS-WCzd z7nW%G;z6+qx#wEYSosoe@9FD05{J1b#AIxbzxok+ydBXB2>G}Po;lqG@zev2?Yx9Z zOhpg?5&<9pq|E^EQa!of3h6?2jDW0U2mpxy5C9SZAONIm0)RBvgL1C6 zA`^}CD|Jni03glvJJ5RNT}f9cZW!-2+6NA$Z^hE|^dea-ujiLAQxOD!L;wf?i2&?L-;fQB Ut~^uZ>i_@%07*qoM6N<$f+tx;A^-pY literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_8.png b/assets/dolphin/internal/thank_you_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7eca54d710dc020720cb362b85328dc55659dae7 GIT binary patch literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*Qk(@Ik;M!Qe1}1p@p%4<6b1&S ziJmTwAr-gY&UroQumVSG@csXDH_tumbBxtx&(>|fKQ5ju^`2eu<;Ir|_p~}SK_&vR z0K<=|pKZQ|Pvl_We)_TE&gH)~6?LhsIUCi!JpWqIc|!A2sUO1%{if)@pU>As#_&&n z;W~NwY)i%k@^bF$z16x!FQgSW-THMRCCrau#sh2LlRxY4UWoQ=E!58y4NcdaC(N)! z@O*j5=iI!|KkdA4`PCDFmM#NghMV#YpVx1(x{_9tcGogt!**+?3D!-u=kDyv=y`d! zd-3~ifmcoJeq39y*dmVg@XV!ZOGYQCl^O$@0>x^qg{)V@Wp6j)r;y<{rgw^8kziaWEie%>-F=xiQ z&;EAi?xR4br)Rg`vt?e*@S(ZySE&1hPj3r-KW5*p_#Tw~`QPT`%Cq4g3zj9{sdb*e ze9A8wnYrIi^hY&Jn{2Rpd{cZF$bCpiD> zP>`vyV$^*3(3NB2M3KoRk+Uubr8)k;9JRi4o|5f7=ivLU{>$R8`bX_lYB}L?DsiHk z_Zs`yQ)k`;%w7HUhpouk4yEIpR{zpWs?6JWQBe7z#rm|=ciM9MBjc5h$ZlT$YWrRO zA7A$O7Iw_8-SX%oP~oPR_v5|IQo5`kUXe-sWmv%h+yBtc%VpK#xBqQDEZ(N{<=vIS)5#Z_mBd_hIKaX3;QvW}|G<0elrO9Mfa2TJ L)z4*}Q$iB}zu-@} literal 0 HcmV?d00001 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_9.png b/assets/dolphin/internal/thank_you_128x64/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..70715bf5f4cece33c17f4034e5fb607f8414c689 GIT binary patch literal 246 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 diff --git a/assets/dolphin/internal/thx_128x64/frame_10.png b/assets/dolphin/internal/thx_128x64/frame_10.png deleted file mode 100644 index 37d18fd5a21449d5b3768945fa005c0f9a098824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 zcmcIndpuNWA0I>rUD!%dr)hJmnK_0TX5=~}R5K|G744aG&M=rcV=mF4G*NB0w-i#? zO10%JO0+8_B&MX&Wm8Bh>VT}5GEL_FAc(>jOhe|c9+0EP!`Bp z%7if?8A31~N{$hV)w>7_U1P)$9D&LJ9vUhTITPO$UnK$p#F-dCa;MK}}P)dqn;jxWH% zBq%^9gCrOPsel86Y)iMdcXV6;P(dn40Uao|Ac;z4f^;U$4jB0nacdHU&s@P?G-3;% zITOQVGBJ}viH?pYN86DxNhrmZ!C+88DuqfV;Rup+gGdI&kVMkCqYP|R3QGiHnE(?3 zYDS2M$z{$&Tgmh!8AVYOPi@vH@j7GSr!fXN^iyr_9cu zYRj~9VA5zL(4Gl`U!fel4iHENeH$1<1pE!(0_AX+J|d|M62Yhs+nI=qA`1iv(~(Al zU_Kot(NNHlWJj|{NDK&sNC=H)M|EJ(sC+8*i!OXW8-wNQ@TvEIEn5VGagMPFF&U6O zjq1olNjwGulOTLXa^$JKWiU{jn}^!LwxevzBm(^8K#_lDRjWd9Mw-2&J%bMN@VMYN zK4Q-!K@1wMiqD|ZU_Qu0=ng~xfth?vB82cd5eT7Blp+>|5`jO|u&_u>!od(c=D5{A z-utjvz7mWth{PAzm<;fO1S0$_%~MxAt^oJcTOh^LyJ6%E`JquGqeubpr7)QgtUeFU zL|9!2C_)^0E%=KFf158~X`{nXob(?G_}25{068bEOc~&QR2C=xb6a|DCTdYkz84qj0Ij6J1e_%4cEWBlXIGCAF}{&^Ej zgACZgslt8J4XdXFrq=X8a}Fk@cm4GJ65ZJi&yh<-##Fr0K^hHVp&=vQ-tHuY8v| z+?JNsCBpkeKG>NOqP{bM$0EMbm^|NO3o~`~lmgw^3nTg4>x{4oWngq`>?pA6Q z=FkqTNulTTx+U})5eRvAs&}+%o}W+eSPJf$L7}?`KhMv#84o>oITx{R7!fy%4_XCw z_iP8-=e>(5Q=M1Ne^j#kij}C;wCb_oZqkt%tKK!w$Yy1gnk@XjKU-B65`1E_oeJF9 z+c&r*z46k`a}PYvyc1r?+AV4OsYvj?KTfIV*+)4-Z;O*;eW(nz5AN31fp>J|r#-r4 za3DD$@5$MH40gWuy{sA?^MK3Vs{J)(2U<z7%J$q ze-5k}hc*>yoYB7mx2J>kxutFytuJOf0*LCH=lOw&|@&Fym@Q2j(JP-4F=a*CvJNm_Q)!xH=#lUUhCwO z>K5oCJox5SX>aSo{=BVDiom3Y?OTuuyEZF>R@a`bcf6=4(5bb{B`>IWv0bw`{e5~P zzBor)#mLy`E1TwUqw`niP}c~rwPg^;>{YkJVKYK$2rHM{Uf+u-US*4}mShBLxXvV} z3Vqw}yr~r)d)%1V(`mu6$_>lC*CCiPH}s0d2B63E#Bzl=%p?3Q60HAG!%Z}Q$yu$& zHHWngf88(k7*{<38=j~onRYH&btTA73$a-~LH_RexpsqLRO`$stp11q$X^Or+)Gc5 z3eDB&QguPui)1$8d^bed`r*_g<*nT;gHJxQb<-o#k0kf5ZuS*YCu$lWf1X%wye5h} z@Lk$@UCfVwi<=HxJ90drx}rM z7dP}5f-K`5@@KXs3i-2=MDxn(O=Y_8u3wUbYa`z6dY~c}?!^kl*(Dh}5o|O-_lPQQ6Qm<7qe-)_4?unVV9nr{~0$F-t(by)}W=-)ZuA9Vq_(M_3jSun{$tLS)wDO=@uUWs_%ugG#7<$d*L`^=j zDQ(4qTQil<26O5dWd~&P+Y{Z&uZyYGI}?X5?vd8L)mnOYF?C%5VZiIo!YA@U9r@az zo~Igw?aGV+J4O1q_76?*J^bVrvuRJ9PG$tH&kbqY6ccXZWOHf@#Wr@<^t1L^#_`za Zi7!r`3?D!@y;T3l@$uxcb3J}g{s;R+YkdF! diff --git a/assets/dolphin/internal/thx_128x64/frame_2.png b/assets/dolphin/internal/thx_128x64/frame_2.png deleted file mode 100644 index df0ee805831216b68493a56356d9e12fe191a54d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3295 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 diff --git a/assets/dolphin/internal/thx_128x64/frame_3.png b/assets/dolphin/internal/thx_128x64/frame_3.png deleted file mode 100644 index 5a2badb349fa172697d0cf5635652bbbb98483d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 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 diff --git a/assets/dolphin/internal/thx_128x64/frame_4.png b/assets/dolphin/internal/thx_128x64/frame_4.png deleted file mode 100644 index 86b3020a007b0625635074643c32969efa46e56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 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 diff --git a/assets/dolphin/internal/thx_128x64/frame_7.png b/assets/dolphin/internal/thx_128x64/frame_7.png deleted file mode 100644 index a1146ced69aa49a729bc05b0170d872b828c5c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3428 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 O5X;$vd3<@$mOlY3W`IKg diff --git a/assets/dolphin/internal/thx_128x64/frame_8.png b/assets/dolphin/internal/thx_128x64/frame_8.png deleted file mode 100644 index 1af0ce93b9468bf7eeae38dd149efbbb6de1dec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3348 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 diff --git a/assets/dolphin/internal/thx_128x64/frame_9.png b/assets/dolphin/internal/thx_128x64/frame_9.png deleted file mode 100644 index b8ff0e6fa32c32c0fa224c1c38cbd77708de0223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3354 zcmcIndpuNWA0LUtMpkw;)E*-?W$w3T7|Jb^NGL*b=FGulX3jJ-LN`)vWRq(btV>yq zTvlGUluC$Fi|8gPDP5FAN@9D@6yE*3pWS`?=RKd#Ip;ag^L@U*@9*;b<}{)}Ny{+6VANg;JiX=KF00uP zA|il%ga;GCMH1yMjFnBe1cX9hIlzO11Y!>E_1OzJK)~nVyyz|@7l|DlEO6Q;g*~>p zdP3VmAQm5IV+~k^vrz&OEC+#bkx(pShjVbBdD-Y#IZea?pCR%P4sM0gAmHud2G}7| z7+?@cc!)%z08AEv%%IVhEwcb9BnpX0ViL(DJcYt0G1zn}FnQrnYf^q7+uh!A(iZx~ z!3E3Z5;l<-78XVbqY@Bl5RuGcv4|uJkwU?v2)rypEC<8!VwuSlgFP&RqymXtfQSJl zBgjKSAjLrsqnL>e254OVG#z-SnMSb^N}!_xl+;O2G|~y!yFu%H40vtGO8zq z%%(EgbUL0yW0Oc86d=C zF_~067|5XF`7n)+2VoWoPh!$Q2;|Y=Wr4iUy3qah2o$OepK||~vgIQX$}t@wHVXo2 zbdXBNLkt!V4?{E%zl_DC<9XCT8cbu*co0mPVp}5>peF|u{+U&&ijOkVm@Ed9PlfQP zG6o)`(`fi*Folmt)$juuWF`obm*D_D#12HHA`q<;fd~wOi4t)T4)~86J4A>`T@XGR zbMl|(xpsDLQY26yL>KH4Ij|BGh|#lTs;qca0qUufK!&C_V)6`mz*{CqLILo(Fxeoa zJP#Zkq$~uOkDHtp{6&Pn&X+H=VZks;`VR&21tvoR|>?dn681)XW{R+?E-9;Oa)$>-)i_HAS)FOnXAGXfVf!yi5y?o%;%+r3a=rx-a ziL0_(9XrG4lw+6vAUr;zYM`2b*&yVGy`D{n0ne`Y`=q4N73uEZI{W(A=_i;e#&yj# zH2qIy*xJ0j|9kobwKDEJk%{zOKUYb8J<)gF68&9C81tEJg=nU{X*{87-82~dsdpCgUcBJoxUr-}bxW3_a`@Jq>Q*A53G6sF^OBnD;l$>dI~$x+32zM*j}-aN zp34tKFG}n>BT_#d>s?9@1$XqRcj4;y()5mBA@11K*6Pug@7A|r29AFq`s(>!?Y<9o zW4d#12H*czV&t8*25w2!1@ry2tBx8KQX_IMc#uCV*L)FBwViB8UV8N!DfIq>2U?_i z4cKISPoZH+wQcPu8QV^ul5~XS6?Di#lb7_GD5F*;k}<&+=i~VJj&iX zXKVC|;z!~d3NFUh*}o{5c~#B%&O{TGY(f=w>RmZ9vsuN?;4NrmE*}){e1B8)bgZHC z*TWOV*`u|9^=U?L!}X-nhdS5JKez?{7`ynQ!(lgj@LkvTgr&bbZd6>!_*TUr43K?? zGz6+%z&$N`ZGLj=`~kCD&(lQ9Z_;}wN#x%d>|QNMNi z*a#Ph{K4AXw6OE)j3^ydsz%qyaP`SGCmDc6N0*MVHO1$MG~N|nXYm@Y*zf7W*nqvb ztmisD}FKyVbHX7i{|Z z$>kQ=Th-d-!B){*7Y^lJSeqfFsK@YMzN6O{d~AwL7tY zlRuw)kGkgLx|U2wQjSq~?7qDCmp$jkq;7>h|N7SOl=q6-7mE7&1)dbnPHgPJl8S_K z<1=?U?Pg}BZ+jKHUv(tKBOaUG>T>B+auYT?BmbesQeApX-YVg)JjS5W#*SH>sNr)r zQh)Y-*I#g5_UjUt zbu?+mW6i5h16WFN?1Q|EhX=+#p6vdv|5?S#wARe4m^R0_$|G(?4M!He{Ke71EOJj= zCEG08BYSXtr}o_DA+wtbn!jyM@in8htlS|Z^WS7qy(bnuq#ZvO+&_<@qU+k>?G0?! zvFFa-H>kL@#M9R!-i*Sd?BiWuT{qD}dU<9eFdtChM4m7y>aHPk5j^DB>b9?PRH(FDr zF5dS^sO|A~ua>Hs3*8k}dn(E=ZB%INl@)yapoTk*W2JVqwG5dV?ZNd3%jLF2nQ&uT z`=O3TEp6dI+bP>s@#akIqbGhC-%ZYc+@@L9_%`OAH1Qdz-q*!_8?Js%o^`^Z`I+X> z7C4MHKM0yfXo%_K?qc)~F4Uona~AYJvbpg+*H88hm`%Og%gq{&v)(bFyHlJTtvy;% zX7%Qn9&KGlr)Tl(hvV}DB22Y3k62o`ws>V>Uh86Q&bslQa_op^?i*ujmN>N}23rDH zX>pRR6Ss#;m6OlMX>pVG+N_{N9%_#y4k;?furF3u#^v7Fm!kEoAf{->u@Bq?;G;<5 zTbrOT@ES?k6yX)LkeKUMxNz)F=L}qA_Jo)(&D@jqs;M+(zrSDSeA*vc&$)H1o`9lm z|KY7$E1qnVRSI&_cFnpiGTz>nW9%I9Q;JF6g76_K+-;QeN$cH${tqqEgE@yyF_;qL pYXPtFN0z$xzkhv=v_9#NS;K+@OQO1;UR3^j;X1h57uyCz{~LVqS*rj5 From 3763b999897bcb49d8c8dfe0c82e87d35e48e8c7 Mon Sep 17 00:00:00 2001 From: Clara K Date: Tue, 10 Jan 2023 00:29:49 +0100 Subject: [PATCH 27/64] These emails are making me go crazy eventually. fck off --- .github/workflows/ansible.cfg | 4 -- .github/workflows/deployment.yml | 108 ------------------------------- 2 files changed, 112 deletions(-) delete mode 100644 .github/workflows/ansible.cfg delete mode 100644 .github/workflows/deployment.yml diff --git a/.github/workflows/ansible.cfg b/.github/workflows/ansible.cfg deleted file mode 100644 index 922e8902a..000000000 --- a/.github/workflows/ansible.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[defaults] -inventory = inventory - -host_key_checking = true \ No newline at end of file diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml deleted file mode 100644 index 4cd298384..000000000 --- a/.github/workflows/deployment.yml +++ /dev/null @@ -1,108 +0,0 @@ ---- -- hosts: all - become: yes - become_user: ClaraCrazy - gather_facts: True - tasks: - - ######################################### - # Creating a temp directory on the host # - ######################################### - - name: Create a temp directory if it does not exist - ansible.builtin.file: - path: ~/temp/flipper/flipperzero-firmware/ - state: directory - mode: '0777' - - ######################################### - # Creating a temp directory on the host # - ######################################### - - name: Create a build directory if it does not exist - ansible.builtin.file: - path: ~/temp/build/ - state: directory - mode: '0777' - - ########################## - # Checkout Flipper Repo # - ########################## - - name: Checkout the flipper git repo - ansible.builtin.git: - repo: 'https://github.com/flipperdevices/flipperzero-firmware' - dest: ~/temp/flipper/flipperzero-firmware/ - - ###################################################################### - # Clean up previous firmware contetns folder before build deployment # - ###################################################################### - - name: Delete content & directory - file: - state: absent - path: ~/temp/flipper/flipperzero-firmware/dist/f7-D/f7-update-local - - ##################### - # Run Build Command # - ##################### - - name: This command will change the working directory to /temp/flipper/flipperzero-firmware/ - ansible.builtin.shell: - chdir: ~/temp/flipper/flipperzero-firmware/ - cmd: ./fbt updater_package - - ############################################## - # copy firmware contents to new build folder # - ############################################## - - name: copy git repo to remote server - copy: - src: ~/temp/flipper/flipperzero-firmware/dist/f7-D/f7-update-local - dest: ~/flipper/build/ - remote_src: yes - - ################################### - # Create a .tar based on contents # - ################################### - - name: Compress directory ~/flipper/build/ - archive: - path: ~/flipper/build/ - dest: ~/flipper/build/newbuild.tgz - - # ######################### - # # Create update weblink # - # ######################### - # - name: deploy Docker Compose stack on remote server - # docker_compose: - # project_src: ~/srv/authelia/ - # files: - # - docker-compose.yml - # recreate: always - - # ########################################## - # # upload .zip to github # - # ########################################## - # - name: Delete content & directory - # file: - # state: absent - # path: ~/temp/ - - # ####################################### - # # post new release message on githhub # - # ####################################### - # - name: copy git repo to remote server - # copy: - # src: ~/temp/authelia - # dest: ~/srv/ - # remote_src: yes - - # ############################################ - # # Post result on CMD line after deployment # - # ############################################ - # - debug: - # var: ansible_facts["shell"] - - # ################################################# - # # clean up mess made when creating new firmware # - # # and new firmware release folder # - # ################################################# - # - name: copy git repo to remote server - # copy: - # src: ~/temp/authelia - # dest: ~/srv/ - # remote_src: yes \ No newline at end of file From 7f594fd4ea84fb3714410ba1006b58925505a496 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 00:55:45 +0100 Subject: [PATCH 28/64] bit cleaner now --- scripts/assets.py | 3 +-- scripts/flipper/assets/dolphin.py | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/scripts/assets.py b/scripts/assets.py index c1e7ac353..b5872adcf 100755 --- a/scripts/assets.py +++ b/scripts/assets.py @@ -261,7 +261,6 @@ class Main(App): global valid_dirs # access our global variable for i in valid_dirs: # We can copy the manifest for all of the valid dirs! i = i.split("/")[-1] - print(f"assets\dolphin\external\{i}\manifest.txt") shutil.copyfile(fr"assets\dolphin\external\{i}\manifest.txt", fr"assets\resources\dolphin\{i}\manifest.txt") os.remove(r"assets\resources\dolphin\manifest.txt") @@ -293,7 +292,7 @@ class Main(App): self.logger.info(f"Processing Dolphin sources") dolphin = Dolphin() self.logger.info(f"Loading data") - if not "external" in str(self.args.input_directory): # AHEM... oopsie. This script apparently just loads all assets, not only external assets, lol. + if not "dolphin\external" in str(self.args.input_directory): # AHEM... oopsie. This script apparently just loads all assets, not only external assets, lol. dolphin.load(self.args.input_directory) else: dolphin.load(valid_dirs) diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index 02df0416b..c185ae310 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -298,10 +298,7 @@ class DolphinManifest: if len(newname) < 2: newname = name.split("/") - try: # Flipper Zero moment. loading all assets in one script, lol. - newname = str(newname[1]) # external shit we modified - except: - newname = str(newname[0]) # everything else... smh + newname = str(newname[-1]) animation.load(os.path.join(loc, newname)) @@ -372,18 +369,21 @@ class Dolphin: self.manifest = DolphinManifest() self.logger = logging.getLogger("Dolphin") - def load(self, valid_dirs: list): - if not "external" in str(valid_dirs): - assert os.path.isdir(valid_dirs) + def load(self, valid_dirs: list or str): + + if type(valid_dirs) == list: + for path in valid_dirs: + assert os.path.isdir(path) # Load Manifest - self.logger.info(f"Loading directory {valid_dirs}") - self.manifest.load(valid_dirs) + self.logger.info(f"Loading directory {path}") + self.manifest.load(path) else: - for loc in valid_dirs: - assert os.path.isdir(loc) - # Load Manifest - self.logger.info(f"Loading directory {loc}") - self.manifest.load(loc) + assert os.path.isdir(valid_dirs) + # Load Manifest + self.logger.info(f"Loading directory {valid_dirs}") + self.manifest.load(valid_dirs) + + def pack(self, output_directory: str, symbol_name: str = None): self.manifest.save(output_directory, symbol_name) From 33c6f8356b4f20e2aa0a91f1b04c34a623d91cd5 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 01:16:48 +0100 Subject: [PATCH 29/64] wayy better --- scripts/assets.py | 2 +- scripts/flipper/assets/dolphin.py | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/scripts/assets.py b/scripts/assets.py index b5872adcf..7f086afd7 100755 --- a/scripts/assets.py +++ b/scripts/assets.py @@ -293,7 +293,7 @@ class Main(App): dolphin = Dolphin() self.logger.info(f"Loading data") if not "dolphin\external" in str(self.args.input_directory): # AHEM... oopsie. This script apparently just loads all assets, not only external assets, lol. - dolphin.load(self.args.input_directory) + dolphin.load([self.args.input_directory]) else: dolphin.load(valid_dirs) self.logger.info(f"Packing") diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index c185ae310..8dac971cc 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -369,21 +369,14 @@ class Dolphin: self.manifest = DolphinManifest() self.logger = logging.getLogger("Dolphin") - def load(self, valid_dirs: list or str): - - if type(valid_dirs) == list: - for path in valid_dirs: - assert os.path.isdir(path) - # Load Manifest - self.logger.info(f"Loading directory {path}") - self.manifest.load(path) - else: - assert os.path.isdir(valid_dirs) + def load(self, valid_dirs: list): + print(valid_dirs) + input() + for path in valid_dirs: + assert os.path.isdir(path) # Load Manifest - self.logger.info(f"Loading directory {valid_dirs}") - self.manifest.load(valid_dirs) - - + self.logger.info(f"Loading directory {path}") + self.manifest.load(path) def pack(self, output_directory: str, symbol_name: str = None): self.manifest.save(output_directory, symbol_name) From 9e469b62f0698c4a32cd38af8f13a13aaf513d90 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 01:18:16 +0100 Subject: [PATCH 30/64] remove debug code lmao --- scripts/flipper/assets/dolphin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index 8dac971cc..e86ff121e 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -370,8 +370,6 @@ class Dolphin: self.logger = logging.getLogger("Dolphin") def load(self, valid_dirs: list): - print(valid_dirs) - input() for path in valid_dirs: assert os.path.isdir(path) # Load Manifest From ffa1e6ba1791ad627fedebbcc523101a98e11f1d Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 05:04:50 +0100 Subject: [PATCH 31/64] Fix playlist --- applications/main/sub_playlist/playlist.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/main/sub_playlist/playlist.c b/applications/main/sub_playlist/playlist.c index 4e996c062..b11dae31e 100644 --- a/applications/main/sub_playlist/playlist.c +++ b/applications/main/sub_playlist/playlist.c @@ -681,10 +681,10 @@ int32_t playlist_app(void* p) { DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, PLAYLIST_EXT, &I_sub1_10px); - browser_options.hide_ext = false; + browser_options.base_path = PLAYLIST_FOLDER; + + bool res = dialog_file_browser_show(dialogs, app->file_path, app->file_path, &browser_options); - const bool res = - dialog_file_browser_show(dialogs, app->file_path, app->file_path, &browser_options); furi_record_close(RECORD_DIALOGS); // check if a file was selected if(!res) { From 05092682cac652f2f7f40837a47789a991a56674 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 05:05:08 +0100 Subject: [PATCH 32/64] new passport avatar --- assets/icons/Passport/flipper.png | Bin 2673 -> 6373 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/icons/Passport/flipper.png b/assets/icons/Passport/flipper.png index a581496b57969e4ea3bb65cc8984ae15efb1a896..98d7e15f9c105cc36c1f6d3473fd915a9687968b 100644 GIT binary patch literal 6373 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Μe415)O~BBa>%J~wv1_Bs|XTY+nq zE{BUJ7RpcPb0I<7+uCsM#7SkrM~)m<_R#}uofs`vC=gJ#KXP(%krbAX3R1`67p$CR zPg6FH9Nj&N*AyB>_)3Gx0yD2|Al2){;PAY{%!h*heobzU`H^EcA}_^60%n64#h#Zz zfk7|7+-T6_!`604qpNYk0bFQFptmuCJ8s-UE4B%%XRpBaTQ`%0`eTIsT0d+SZyc+(BY&Q4dr!AKd>^vhYi zvHNcrn>!e3VVavjOtEkdf`GDjm|)N46y(Dn4k&jOM8<>*F)@=G3LUT44=;sIE~`>q zH5sEvk3(V6P;_>>(A3;cTo2(yLkn4R2R7V&A3pv50QP?J6>hute&x9Pp6xKDWW$zU z0<9^7*9f7b%>|<+6Fm-LjAQuu^eN1u8CP~1#C9E#OIWu3M-Cw)BSTS!q6%RSu{dHv zj~_gF6h1PajjB&5Kw+06LeL9Gr|!RLl|s$X(cYuni`3FI6G~7uk^XXI1;$LAiNX<; zFk}`Y2ph&!&4x3sM^LikOuHN3{&)uSm)}Gr+JNP&Zp957He>yr4`KTso<%reC8?Q_ znlS*~^qpEs5Qo@CqiiM7SWPLc7-Jyyi@R=JJw5PpNRyNU(y6vaIB0C!9Gyzz3&9>B z8Tk}Q(ufUfzV9ZHSkTbWfQ~K)B5?_gEp1RyE*v@4jEjyiLXrjgi~_Vcf*3Zw7Q-h@ z$Asw%QCvP5j<6c_O}(gZal#Wb!5z_|xhsU{UwsdcKl^92w6`nzB;@vrT~4?=yU^Hl zf!9eW^P$u9`%Smk1GSlpFj6XbjVdJQOooph#evY{QcJTUZj{m_V#v-g!>E?oLLp>l zWl$rxpq<%?v4Gu9FKn5)Fpp9}P_%ICSg`&YZu9!za$7snZQ(Y91=5&So{H zqj1=G3@xic_Mj2yaE7?>6VMw?%BH@N!3&G;CJYW5G8jQ#U+8bqy5bQbhI@$hCpa6D zoN9)jrqn{ZRTI+UqZVH4%3kAX&rucB2f3@k#ACooqWCemzSP7WbUg&y{p zB#FB}YO)-t;e&AXc9Auc${{{UwVG&{T}Wl7h+m2h5_(?jzKS~v;@M9N=IHE(*XcrA zS2s3pyaN_yJ=oqsOm{)A)8OS-_b9i?lgj-wm9nE1BpZiV1>p^(ZI3*FBPWg%RYF7( zv$9iUAnbH?btx?qV!zA8-m=n>Xl=fTFm;StqeGC9M@b%HcOc+%LlQ!a;(u__Kr~ZO zHPoMko07rT>p)*8y(+8H*3^R53ytVyPs`#KHxWYI`xn|>+-7XLa2^9Fcm0ICef$2! ns`R&sI4=J`0;|oYY!>}5j)ML?*}Ww%00000NkvXXu0mjfhkXNe delta 2644 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 Date: Tue, 10 Jan 2023 05:52:51 +0100 Subject: [PATCH 33/64] Update passport_DB.png --- assets/icons/Passport/passport_DB.png | Bin 1394 -> 852 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/icons/Passport/passport_DB.png b/assets/icons/Passport/passport_DB.png index 3f2d5fab4b67235ba296def50b2648799700a4a8..f813f2afd345e57924b6a46aaf2172f6823c67de 100644 GIT binary patch delta 809 zcmV+^1J?ZV3e*OWIDZ2MNkl8%vq7p(O{Y^mj-MMz&IRWW8dlklb>M}APO&ha6JbE))xS3fLx{D2mT$PcjCsp6u75dCa(gJ zg$7PRSPT#B04M+ofC8WZC;$q80-yjW00cn+PyqIVdff}UEd^jN2tW-$4FI43C;)&0 zpa1|0fC2z00DlSqpa3WUfC8WZ01AKt04M+o=ok0&h4Aeu;6Acq%a`(~0jL3}0Z;%G z@Nf=r@h+O=aF-1JajVbpY;e=0xBM_mlE#+d@(I zXy`|>Bpb)H<`DiDYv&AilG_Q`jQyv4b+;EGjywBwI@!=Wze7mT)a63NR-^sKE^VoI z)R?ikoq$ccROX3yh8r`V&u!>kr%92RWrT-uFLDyYA=T)9ZL^C4M!sP{{#ip~od{G5 z!KOYGM1SiRGrZ}8zEHd`^&M`hr8p^-6^ch+P4@%l#%Nb* z_9w1klb8`Z29rAYwoV*V_sU}`x$^;k2=>c}On+r(1iqr(p}lcf8 z`1(t)=;A?jh;Tj}4!hm%BL%xZ_zo+ZoQUJ`xZm%$+imK*R977gDhrX7tlO~0!6c@x noFc(1Z$gauzl;~WM{(gdOXY*sI7{g=00000NkvXXu0mjfP?B_u delta 1355 zcmV-R1+@Cq2J#A!IDZ8sNkllX;o6cbz`uBp)t$-0vG z9ki>FCto(Z59-Fm7$0|6O;-IwBvE`=8`NcqQKQ0x0aOIphn9#^lNxMc(IOx1t&=-- zI-R-q_O_+HwVvO@&D^;&=iWJIe&?K-!k~x(ivm($uYia#q<<_B;VP@uDz;-QBVQ}D zl%uMv)C3~&1zgS7Oa-bkeHho0Xal69dT>M;azU)B5qNnMi4`?K`c?&`Yy-slAJzpK z2|j@IZGfn{$*d=O2kmDK5Cd|<0A%hH9zgPA4g2kZ>zyLFG z`pj8ifSH(`odpJ%iMw~YfdP>Gz&ZdJU^*@G<_F;~kADIA;gk~mD4&B2IOseKF~Cej zA~M7Pb1eW_kg2%Y>B@ft&_fDxISaybqDq00#<-co;cz;g#{{&swKX?4H#Rof?RMM- z7iwy1N=r+#HVQoki0&vCRKIKQeo}a+AmM*=;!3~Y-{0Twa=F^u+polUsGTxHZ?(#C24K%S0}8QU_62w2`{u8rLqzS82mHIP=q{CwD{(DR+0>=6`Zf zipt8W^XJaRLKL1s>usUYcWT;yk5(?@D$5USo_G65pq_o?;*G92HRp>uosP9$y$$0poCyWb$AX>SUb_~7r z)AEuHtKZ)k`0)2YNnY)fSidE8q=?ITM2m6r*N77r*KszR4M*dx z$-w>@4h6Vyr@QO=wX5VQmWE}L@5F{JXjoOgqoMBL_f03A+fE$WwtELFYWvYW4hAik zj<;MsPQ})q+HX@(R#qm?fP`Vm;PJ* Date: Tue, 10 Jan 2023 08:27:03 -0500 Subject: [PATCH 34/64] readded no_lvl_up_manifest.txt --- .../external/nsfw/no_lvl_up_manifest.txt | 212 ++++++++++++++++++ .../dolphin/nsfw/no_lvl_up_manifest.txt | 212 ++++++++++++++++++ 2 files changed, 424 insertions(+) create mode 100644 assets/dolphin/external/nsfw/no_lvl_up_manifest.txt create mode 100644 assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt diff --git a/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt b/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt new file mode 100644 index 000000000..1fbcd6106 --- /dev/null +++ b/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt @@ -0,0 +1,212 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +Name: nsfw/lvl_1 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_2 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_3 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_4 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_5 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_6 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_7 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_8 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_9 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_10 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_11 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_12 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_13 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_14 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_15 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_16 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_17 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_18 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_19 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_20 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_21 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_22 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_23 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_24 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_25 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_26 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_27 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_28 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_29 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_30 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 \ No newline at end of file diff --git a/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt b/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt new file mode 100644 index 000000000..1fbcd6106 --- /dev/null +++ b/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt @@ -0,0 +1,212 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +Name: nsfw/lvl_1 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_2 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_3 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_4 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_5 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_6 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_7 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_8 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_9 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_10 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_11 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_12 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_13 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_14 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_15 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_16 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_17 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_18 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_19 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_20 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_21 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 + +Name: nsfw/lvl_22 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_23 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_24 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_25 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_26 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_27 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_28 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_29 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 7 + +Name: nsfw/lvl_30 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 9 \ No newline at end of file From 89dddc4709261f00693e002f6ae6d02c061610e8 Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 10:17:32 -0500 Subject: [PATCH 35/64] Revert "Show region information in sub-GHz app (#2249)" This reverts commit 2c450bd835dffa18dfa6662d658c3f75079e9b92. we set region information to fully unlocked so this does not matter --- .../main/nfc/scenes/nfc_scene_start.c | 6 +-- .../main/subghz/scenes/subghz_scene_config.h | 1 - .../subghz/scenes/subghz_scene_region_info.c | 39 ------------------- .../main/subghz/scenes/subghz_scene_start.c | 20 ++-------- .../picopass/scenes/picopass_scene_start.c | 2 +- 5 files changed, 8 insertions(+), 60 deletions(-) delete mode 100644 applications/main/subghz/scenes/subghz_scene_region_info.c diff --git a/applications/main/nfc/scenes/nfc_scene_start.c b/applications/main/nfc/scenes/nfc_scene_start.c index 2a116fe09..f8b9f52c6 100644 --- a/applications/main/nfc/scenes/nfc_scene_start.c +++ b/applications/main/nfc/scenes/nfc_scene_start.c @@ -7,7 +7,7 @@ enum SubmenuIndex { SubmenuIndexDetectReader, SubmenuIndexSaved, SubmenuIndexExtraAction, - SubmenuIndexAddManually, + SubmenuIndexAddManualy, SubmenuIndexDebug, }; @@ -28,7 +28,7 @@ void nfc_scene_start_on_enter(void* context) { submenu_add_item( submenu, "Extra Actions", SubmenuIndexExtraAction, nfc_scene_start_submenu_callback, nfc); submenu_add_item( - submenu, "Add Manually", SubmenuIndexAddManually, nfc_scene_start_submenu_callback, nfc); + submenu, "Add Manually", SubmenuIndexAddManualy, nfc_scene_start_submenu_callback, nfc); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { submenu_add_item( @@ -68,7 +68,7 @@ bool nfc_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubmenuIndexExtraAction) { scene_manager_next_scene(nfc->scene_manager, NfcSceneExtraActions); consumed = true; - } else if(event.event == SubmenuIndexAddManually) { + } else if(event.event == SubmenuIndexAddManualy) { scene_manager_next_scene(nfc->scene_manager, NfcSceneSetType); consumed = true; } else if(event.event == SubmenuIndexDebug) { diff --git a/applications/main/subghz/scenes/subghz_scene_config.h b/applications/main/subghz/scenes/subghz_scene_config.h index 694683f52..1ad41a8b5 100644 --- a/applications/main/subghz/scenes/subghz_scene_config.h +++ b/applications/main/subghz/scenes/subghz_scene_config.h @@ -32,4 +32,3 @@ ADD_SCENE(subghz, decode_raw, DecodeRAW) ADD_SCENE(subghz, delete_raw, DeleteRAW) ADD_SCENE(subghz, need_saving, NeedSaving) ADD_SCENE(subghz, rpc, Rpc) -ADD_SCENE(subghz, region_info, RegionInfo) diff --git a/applications/main/subghz/scenes/subghz_scene_region_info.c b/applications/main/subghz/scenes/subghz_scene_region_info.c deleted file mode 100644 index 82486314d..000000000 --- a/applications/main/subghz/scenes/subghz_scene_region_info.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "../subghz_i.h" - -#include - -void subghz_scene_region_info_on_enter(void* context) { - SubGhz* subghz = context; - const FuriHalRegion* const region = furi_hal_region_get(); - FuriString* buffer; - buffer = furi_string_alloc(); - if(region) { - furi_string_cat_printf(buffer, "Region: %s, bands:\n", region->country_code); - for(uint16_t i = 0; i < region->bands_count; ++i) { - furi_string_cat_printf( - buffer, - " %lu-%lu kHz\n", - region->bands[i].start / 1000, - region->bands[i].end / 1000); - } - } else { - furi_string_cat_printf(buffer, "Region: N/A\n"); - } - - widget_add_string_multiline_element( - subghz->widget, 0, 0, AlignLeft, AlignTop, FontSecondary, furi_string_get_cstr(buffer)); - - furi_string_free(buffer); - view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdWidget); -} - -bool subghz_scene_region_info_on_event(void* context, SceneManagerEvent event) { - UNUSED(context); - UNUSED(event); - return false; -} - -void subghz_scene_region_info_on_exit(void* context) { - SubGhz* subghz = context; - widget_reset(subghz->widget); -} diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index 1177b6454..c9a62c2fc 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -7,10 +7,9 @@ enum SubmenuIndex { SubmenuIndexRead = 10, SubmenuIndexSaved, SubmenuIndexTest, - SubmenuIndexAddManually, + SubmenuIndexAddManualy, SubmenuIndexFrequencyAnalyzer, SubmenuIndexReadRAW, - SubmenuIndexShowRegionInfo }; void subghz_scene_start_remove_advanced_preset(SubGhz* subghz) { @@ -65,7 +64,7 @@ void subghz_scene_start_on_enter(void* context) { submenu_add_item( subghz->submenu, "Add Manually", - SubmenuIndexAddManually, + SubmenuIndexAddManualy, subghz_scene_start_submenu_callback, subghz); submenu_add_item( @@ -74,12 +73,6 @@ void subghz_scene_start_on_enter(void* context) { SubmenuIndexFrequencyAnalyzer, subghz_scene_start_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "Region Information", - SubmenuIndexShowRegionInfo, - subghz_scene_start_submenu_callback, - subghz); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { submenu_add_item( subghz->submenu, "Test", SubmenuIndexTest, subghz_scene_start_submenu_callback, subghz); @@ -116,9 +109,9 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneStart, SubmenuIndexSaved); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); return true; - } else if(event.event == SubmenuIndexAddManually) { + } else if(event.event == SubmenuIndexAddManualy) { scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexAddManually); + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexAddManualy); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); return true; } else if(event.event == SubmenuIndexFrequencyAnalyzer) { @@ -133,11 +126,6 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneStart, SubmenuIndexTest); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTest); return true; - } else if(event.event == SubmenuIndexShowRegionInfo) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexShowRegionInfo); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneRegionInfo); - return true; } } return false; diff --git a/applications/plugins/picopass/scenes/picopass_scene_start.c b/applications/plugins/picopass/scenes/picopass_scene_start.c index 6d1aeedcd..76c18a22a 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_start.c +++ b/applications/plugins/picopass/scenes/picopass_scene_start.c @@ -3,7 +3,7 @@ enum SubmenuIndex { SubmenuIndexRead, SubmenuIndexRunScript, SubmenuIndexSaved, - SubmenuIndexAddManually, + SubmenuIndexAddManualy, SubmenuIndexDebug, }; From cfb95cd78386451da4c5b46f718deb893283c91c Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 10:21:19 -0500 Subject: [PATCH 36/64] fixed ofw typos --- applications/main/nfc/scenes/nfc_scene_start.c | 6 +++--- applications/main/subghz/scenes/subghz_scene_start.c | 8 ++++---- .../plugins/picopass/scenes/picopass_scene_start.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/applications/main/nfc/scenes/nfc_scene_start.c b/applications/main/nfc/scenes/nfc_scene_start.c index f8b9f52c6..2a116fe09 100644 --- a/applications/main/nfc/scenes/nfc_scene_start.c +++ b/applications/main/nfc/scenes/nfc_scene_start.c @@ -7,7 +7,7 @@ enum SubmenuIndex { SubmenuIndexDetectReader, SubmenuIndexSaved, SubmenuIndexExtraAction, - SubmenuIndexAddManualy, + SubmenuIndexAddManually, SubmenuIndexDebug, }; @@ -28,7 +28,7 @@ void nfc_scene_start_on_enter(void* context) { submenu_add_item( submenu, "Extra Actions", SubmenuIndexExtraAction, nfc_scene_start_submenu_callback, nfc); submenu_add_item( - submenu, "Add Manually", SubmenuIndexAddManualy, nfc_scene_start_submenu_callback, nfc); + submenu, "Add Manually", SubmenuIndexAddManually, nfc_scene_start_submenu_callback, nfc); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { submenu_add_item( @@ -68,7 +68,7 @@ bool nfc_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubmenuIndexExtraAction) { scene_manager_next_scene(nfc->scene_manager, NfcSceneExtraActions); consumed = true; - } else if(event.event == SubmenuIndexAddManualy) { + } else if(event.event == SubmenuIndexAddManually) { scene_manager_next_scene(nfc->scene_manager, NfcSceneSetType); consumed = true; } else if(event.event == SubmenuIndexDebug) { diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index c9a62c2fc..62e30784f 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -7,7 +7,7 @@ enum SubmenuIndex { SubmenuIndexRead = 10, SubmenuIndexSaved, SubmenuIndexTest, - SubmenuIndexAddManualy, + SubmenuIndexAddManually, SubmenuIndexFrequencyAnalyzer, SubmenuIndexReadRAW, }; @@ -64,7 +64,7 @@ void subghz_scene_start_on_enter(void* context) { submenu_add_item( subghz->submenu, "Add Manually", - SubmenuIndexAddManualy, + SubmenuIndexAddManually, subghz_scene_start_submenu_callback, subghz); submenu_add_item( @@ -109,9 +109,9 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneStart, SubmenuIndexSaved); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); return true; - } else if(event.event == SubmenuIndexAddManualy) { + } else if(event.event == SubmenuIndexAddManually) { scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexAddManualy); + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexAddManually); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); return true; } else if(event.event == SubmenuIndexFrequencyAnalyzer) { diff --git a/applications/plugins/picopass/scenes/picopass_scene_start.c b/applications/plugins/picopass/scenes/picopass_scene_start.c index 76c18a22a..6d1aeedcd 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_start.c +++ b/applications/plugins/picopass/scenes/picopass_scene_start.c @@ -3,7 +3,7 @@ enum SubmenuIndex { SubmenuIndexRead, SubmenuIndexRunScript, SubmenuIndexSaved, - SubmenuIndexAddManualy, + SubmenuIndexAddManually, SubmenuIndexDebug, }; From fa8eb5d4264115f4b0814f5ac5dd50d4eefed8c2 Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 10:30:43 -0500 Subject: [PATCH 37/64] readded paxgod animation randomly got reverted in dev build however it is fixed now :) --- .../nsfw/PaxGod_TikTok_Marketing/frame_0.png | Bin 0 -> 5391 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_1.png | Bin 0 -> 5333 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_10.png | Bin 0 -> 5352 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_11.png | Bin 0 -> 5440 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_12.png | Bin 0 -> 5403 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_13.png | Bin 0 -> 5436 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_14.png | Bin 0 -> 5550 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_15.png | Bin 0 -> 5602 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_16.png | Bin 0 -> 5657 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_17.png | Bin 0 -> 5702 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_18.png | Bin 0 -> 5710 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_19.png | Bin 0 -> 5687 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_2.png | Bin 0 -> 5310 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_20.png | Bin 0 -> 5672 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_21.png | Bin 0 -> 5701 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_22.png | Bin 0 -> 5690 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_23.png | Bin 0 -> 5687 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_24.png | Bin 0 -> 5683 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_25.png | Bin 0 -> 5692 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_26.png | Bin 0 -> 5692 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_27.png | Bin 0 -> 5653 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_3.png | Bin 0 -> 5244 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_4.png | Bin 0 -> 5180 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_5.png | Bin 0 -> 5159 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_6.png | Bin 0 -> 5190 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_7.png | Bin 0 -> 5178 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_8.png | Bin 0 -> 5186 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_9.png | Bin 0 -> 5265 bytes .../nsfw/PaxGod_TikTok_Marketing/meta.txt | 13 +++++++++++++ assets/dolphin/external/nsfw/manifest.txt | 7 +++++++ .../dolphin/external/nsfw/no_lvl_up_manifest.txt | 7 +++++++ .../nsfw/PaxGod_TikTok_Marketing/frame_0.bm | Bin 0 -> 416 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_1.bm | Bin 0 -> 385 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_10.bm | Bin 0 -> 365 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_11.bm | Bin 0 -> 391 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_12.bm | Bin 0 -> 395 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_13.bm | Bin 0 -> 385 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_14.bm | Bin 0 -> 440 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_15.bm | Bin 0 -> 451 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_16.bm | Bin 0 -> 440 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_17.bm | Bin 0 -> 444 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_18.bm | Bin 0 -> 451 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_19.bm | Bin 0 -> 444 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_2.bm | Bin 0 -> 409 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_20.bm | Bin 0 -> 463 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_21.bm | Bin 0 -> 454 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_3.bm | Bin 0 -> 398 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_4.bm | Bin 0 -> 390 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_5.bm | Bin 0 -> 378 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_6.bm | Bin 0 -> 350 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_7.bm | Bin 0 -> 368 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_8.bm | Bin 0 -> 361 bytes .../nsfw/PaxGod_TikTok_Marketing/frame_9.bm | Bin 0 -> 358 bytes .../nsfw/PaxGod_TikTok_Marketing/meta.txt | 14 ++++++++++++++ assets/resources/dolphin/nsfw/manifest.txt | 7 +++++++ .../dolphin/nsfw/no_lvl_up_manifest.txt | 7 +++++++ 56 files changed, 55 insertions(+) create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_0.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_1.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_10.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_11.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_12.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_13.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_14.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_15.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_16.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_17.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_18.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_19.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_2.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_20.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_21.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_22.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_23.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_24.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_25.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_26.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_27.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_3.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_4.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_5.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_6.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_7.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_8.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_9.png create mode 100644 assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_0.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_1.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_10.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_11.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_12.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_13.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_14.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_15.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_16.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_17.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_18.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_19.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_2.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_20.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_21.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_3.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_4.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_5.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_6.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_7.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_8.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_9.bm create mode 100644 assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_0.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2add0e906519636d5c610033929d0e1d8eba8d GIT binary patch literal 5391 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_1.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..27664d203b68b2ac8699d5a1ec77f5af85ced224 GIT binary patch literal 5333 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_10.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..da62ce4cf9941935f24d7cc69e375ec70f74842d GIT binary patch literal 5352 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 F{2yCOeL4UD literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_11.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..7a850b0011c66e062935a212d2ed5edfe4ac1ad7 GIT binary patch literal 5440 zcmWlb`9IT-1IORTZW|jj=G^AUT+Mw&Lvp4$DkMz^Nlosn&wI?7GB=@ylA@Y)r6_{rb?*&`p~*MMOlz z#KiFV{P_6zl$4a6J9i2Mg3Qd!{QUgF!ouR>;*ye*^78Tn2M*NL)z#P6x3;#nx3_n6 zbaZ!jA3uJ)udi=lVBq}u^H;8185|rO85tQLAD@_*xPANfg9i_0W@ct*XP-QIqEIO2 z=jY$Od-w6<$Hm3PuV26Z{P}Zvd71h1SNvZP%w-k-)Y!y?b+L)baVe^av8k!C?i_1- zhyNR}{6FXai2=+qH{#QU!2XyO8ia-@+pzAs>2RGIzl}9!_Jo?CBU2~7yc(97K+ec8(7A&MxjwD=0*wN-aSJkH=xHjWD+IkgJED2WNBq>leojqE_G$RcYa1*L2lvQy-1Oh z$f4B9+1bs-R1<~9H4-`+@kFeaMaL&4nry*7mhO~jvf^|<+dtIggcye#UsJBCr5^qR z=|op;8{ar7u`$9P&`He*O5dJn0>|3^`0D zE2NMQae0+p{1NSrSN?TffA4JYqwqwfSd~2<5+qhc^rj|`@)wm|k52QwuU*PA!m8<8 znHif27@n?}<~j4`R{vovds4^^p(B{UMdBOw@ z7Ppx*Jhmo&Wq7^V^Nx|eRPVD$B=qJT(07knrOZJ7jK18wYij@idOdABY)jFWd6f`k z>C_g<>vv`ZO^bl|97Of>Fxdh)`Svk$7(yFF@I*D8Bh#d#>+-LT9J}{!m#e%|tf&~8 zdt&?g+CE*qr?+`1OQ~1d#J{{^VuL_o8?}`@}rWX)kaCmWq&js z;j3U9Z4_Wc;atcKyLT06T{Y9B+CQLr`P+w8hd(SCu97i%GFba2GNR{tTT*Qiv{S1H z#?SU3FiRqRQmV_^KBsLSF5e1~B4|S}>FXCrWo!S1vX z)fm5|@S=}gWKMH<0^ipg&aB_Inv7qenqs!k@3l1}aRB+l-*-lMfrwpXMRo$mi zY4Oi!*0A%x8T3>sV;Do?4bsuGT^8VWtwdVigMjzmS=^VcSB22Y8y}DCPY-zU-+sKd za*s>i{L=!M%;3m?*V-}}X51y<<*Y*|)3R;1fjK67g6(r)#%_RAzUK@5+T*!lP(A*JGrDRFPhK?R+J9n3 zdSc*64wRW@l~0>9SX#9mETHg`&E86=?mZ&XKf!jJ(vbtRzFivEj0NUxk$roI)F6oC(09)H~P2&1isfM#+bdgpAlqt0u5AYcB{K)slLwp-UlR;Cif z7vju5Ls}8r&{ll#_K$@C*EI%TmOAW7>m+$BcUgKo0?<|41T~J&n7{S;lfmTe(nwTZq{4MWaqfIlJ{BA|*S4mlE)#4=$k;0!k zMMTwCcx`mxs$<(lrZ;2VE=za-Gs&CyAzesdziIvBv8wLlS;_WG3Z`dTf|GV^F>PAZ zt~CHy*Gya@_$gwRN$Il##xs2ht5Wt$aS}q1^2(iye}e1sDtf7$il%VZ%CmL*u2|au zq)|lM^*(^DzOjDqyRgXbs5Jw8WlL{WJ;i~ufM$r@qu=a-W?vo+T&LiivX>`^q#v3( zlzH@neNy%2TS4&UA3@h_8DZG{1n+d?NfeO}+va!@ah#jRs5Jpv+dPANQTsk1VS5-p zYn*n8Yjva&6ipF@4zCmvzn+1pycAS~lI&O>CdAiUjP5$Y)QXqn&2-Yj{|T7h4$-Xt z?ReZ~>4Ff99Wk1WA z+Il(5FuYmi+=ZJPc3>?%oBqSGaMW)t-~WBTo6hgm%}mR|`(cP&o=l^FiLQB~zoj=| z3U!8QG3)MM5Dpa|oU?`LGOqQM`8_*1!ZNfj-Q3V$^?mqzB!z3SWX=)(jcHUz?$jG| zg~tM|6%wp7Qrv~}(45#1O1Yw5e3M&sJLV{+Z5>{1C+|67r|KYGjwIiyyoDDan980Z zBGt3lp(=ttBEY@+9S~-R$_7b_TDvFNaY2#W@5qFPUZj*FySKdf`0}~v7N;-_sq35# z(9aaFdOk3Lpsd%W<~WgKKC9b8#xhTq{O5D))8B6ypE~8eO(LY8o`s@rQ%#o1c`vWO z`!4BJj;4}z=%ckOXyMAwVc#r?9)_HI+htu$zoOb7NkHEdkJSE>V9Z95e(dJY$WRNfnO6;=M;V*BvZ+=~_013m1~ zwurWB7%%>!>&hV~lRY+Op?5b0=U`oXJPFYUce6ij9z3^3#KMFus2RPyOr`&T_SF;_ zow_(iUOsu*@+DBV^@ZM-#nU44m8Y@s)3JBHyuHDED6KwK^lA=SUx3kAhIW2dAJOGl z)n6|W>Py0OUytr_e0Zw7_0ixhwOpaqaW9ZG`{=^%|K7_#XUk_Mj{-T#DqD7R#hm;= zKNV7)_e%B0#W(Cm%&Zi5Gh`cuUWN2&$&g#u9hO1@Ty>MHIZYP(iIws2yggrHwKD6C zkQO+O&0LfRQfGDPilrR7!QBAHsNL;vX%(lFU;XFEFstIC3;-d{Pds&U7(ti)9{t8n zCL}JNIjh|x!%01He`hk2Zwr zilaN0;z;ch6@3Yq*#zoK!NXrbLn)|52Ju|asTB#2u?ci8xNOBqp7T|YXX2iSalnO? zN0|(J-u4$IvFp_H$-Wr_iA4e-KG#MS%>z(kfWiezl(C^BjA@605vd#K9fS%u^P**f zi=Z~LdjuoYbUcYNNo9WJU^+_|4+hRtXOpUl(kNOlo&n$eV4&Gi8wSEhDga}`U2Ujv+ z3jjZIzO0d#vAdg19k71b$*$*=R)zvFA5a&AT5^&f4PMDrQSC@pYL?yV*Tcc=)uS6C zy34hczN3v`Y#F#^s*KD?j?5+*`Rrca+K}10A^7byA%X$6XvIu@E+-;If)_x6eFpi6 zbpwas;`kfD0Ci*_Ln@q`fi5qGR5ox`yFvyem49=~w7!HCJtSH2V*Ire&N=%%&IUas z!mSRWvYhIna?OwB#4l(SWG^If_t7+fft2N`xJ z*l_~2u?-x#<$sdOe-Z9U&DzKX*j*e93>{fI#-av*0KprmGzC>}d5K)jmFFU1;60X7Qwb4YtzL%iftW09;r(H95#`5oDiK@F>LGOZUpFu^w9KWpW{0BFXg zo@Y>q(*zTFz~!Ie_ck0jBelF|7i`O@a|3jz@vtEh7_xR})%dn2M(wKww69Aoi%Tub zoeQG5iUea}6qviYAMcsrlJEUfzl)qxPXTUjpnB9`@EH(G201k~R}Ix{{Ng;S-1WFY z{f-2-;X-X12|DtwXGL`OL%@!U0tp8@7WO4ws;+z3Zl?tN%L9)li21{=?-J?!+HA&O zy3DfGE_qjfaZUgztjS~ULevWXL zrr2XjclXQF$2PKxz8Ttu0V=#2pbK(ojKgpMlpJKqFk}7Y0aA{4R?P%ps5}U-6hnIN zK?6xAlPmhO-r9-Vp2Ws|zS(Q?{EQOqL+F^h7G75+v_vXXZ*@&UQ}3(qa>EW4D$M^`Ks9m zt|VWv#aqKX4Z>>Mb2Tqi*&_UfY{&^gjegbhFzy=T5k;kq5}CY^>w32{rFgk@DSJjU$$*y+`@&7a7H+`5>ruOu6o#rbH`?Zl8W9aq^=!=(~ z^B(|{vnh8irhi|8R&V_0SlC7iv6Kf!yFmtmygO05uQHY@g)-$>^C51R7s*{odJ4b< z33SK>8lM237=aJ#`WEoJE-}O3@Bqq(RV3=!OV6!ITxc{eP6L5nSeZc6H_Bk-#dYc1~zGEdB-=;fP)-<|eZ zc3A>i-uSyT;xjZf4VAww#o`(AfWEIoZQpdH%#i~Oc+2g;#)_81LF4D9P1FW~kAItx z$e_6x?y-Tj_|PA0@Hf%M=(xb?PV1$HL$=KD74|!tl7K1G8y7t-1R!X_RnwOieLT@R zAr~bK;mi^zrz@h}7TN~<#?maT4QsY z3%><*h%wR6eF`$;9>4OYb62YKA!Rpwk~!GJpUjoD?WrgnD38+TL>)iMzL)@>&oh01 z=vc_F>5ptPYNbDn+nWADz3{bpgHnc4KvB>6PQ79R0M74lWc5SZ0@da9>X4lTc9O%K z0@`G9qrDi~sxff!2&kB``YjjD40L^Et+CPA*H3o<~_K6hhz|STXZtwkWGOm-~^gy6ywWEOtnDF2iRQQ=^cyw6P z1wCl3oSUGG#nqDWT;Q-MN~;(o<1Oz~AZ?!amp@dP@~4}{=&l4Xb_Mi(jgDsO^tE;O z^A(Vu?DSr0)SWBVjrYU!4)Q38h8O^fUWf`4?p-FyY27qU9ZtMm9^+L!ypqSxxdh4{ za4G?pnsl7k^QS#i=%0W2p1w@=<(eP=M^p4s(?y>7s5VNNap=dQ<2`DIQzM>^s6}hS z&FUai3EPwXZeIZ~T+m1nlE|POi=+I)A!YM?MZNt$JgWIf|eVry~xr7)EZ^`8iBR2_#q*5bp7 kKdu^-^3C(*umcBroLFVKJgBSpWb4 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_12.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..b980807c77d2559772c8056372507fe14ebdf8ff GIT binary patch literal 5403 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_14.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3c0165a5533d2aa9d4938597d2b9119278c32e GIT binary patch literal 5550 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 Xpo>=qeqNuDuCI-~2li1=fam`JxmdiD literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_16.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b08d48e7fa4191d9d31db65a6610f28a54337610 GIT binary patch literal 5657 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 N0+>n2nT!EE{|_pV$YKBh literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_17.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..5bdd77c12334ccf87649060eb824da47fe03eef3 GIT binary patch literal 5702 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 Ov1lR+v{EsE+y4V%vHPL` literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_18.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..94b25dd6b3c55d2993496b5c451f4125b341db93 GIT binary patch literal 5710 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
3Oth!)QTS|X8VwMB` zb{@Lt*P#32>iak67HzYgMZTVqK`(Z|BBVd}2y>H=*eio4O7ULbV4rVV9%P7&bl_6r zBJ{>h8^>1SSXfpyb-8CLoAFRs%}SB3DU3g2IkUXBDU35j$IfS=y*HErkmvpc*+F~O9TeP?(3tf@Rp`xMw;X# zC`yDKgb-C8f4zU-^DYUA51OiL4_&w#PrNRz9h$gac3fA!7fbZx(h+lN>?~rA*e+kRK4{fsX?Exd29}BL7p2nHcTeoNT-?(CxAVj(9vzYv_H-{ z^;Jdaw*WWVBTs{Ov-f_p6^^7ho<6`o$3(eP*pT^EmY+D)PC!r1ZB5x*OOh{Wm@=xoXlCp)M|7 z{HI3IGyJ%CcmUo)=Bc6K65M3xTi8(L|5Xqq^EaF>wL1N#)dP9d@euBqXk`acQpn{D zR*o(YVym_KlCTzeLnDestzRZ-cNP^aqE6e;j_;T3E(C%s8tbX-MolX_z*=DP_3Hhm znRDSzOKf`OnHkh8GGwo~7?3oirHx&9pe!UmW9Rj|IuV`wuJH261G(6(u2-n;j%KeL zV?XpVq%C(LO3LEozuDW|F+%hpv!Dj{YJK^G@*F9Ne8zEh!E7?+-}~NV6yW(kD|~gV literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_20.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..e0bbf11e9476472dde7cc3a5e185182475fa338d GIT binary patch literal 5672 zcmWlb_d}A8*M^?~2o6LMw}=~@xJO#J&B}0PY6DlfGTbB6$AMeJk)u}&+}Wa1vn)d^ zv+`3|TDA%ANtBM^WAd|wCr8w>`6#bWVzyn=!Pi9}LU zQzMhfdU|?BMn=ZQ#ugS9bUNL}#>UCXY2CVY?(Xj1-rnoiulMuw3k(e0vSmwnc=)z$ z+ae<)ckSAhkdTm+l*DGUGcq!=va)h>bBl_KN=r*CD=Vw2s_N?MnwpxLo0|_GKFsIy zJ3BjjdwWlwJSh+e1_uX+hlej-yf`*CcK!PGTeogaPEJluO+9$<;L)Q;b8~YG3k$Db zzkd7n?Z=NFmzI{kfB*jL*Dr}gqO*!Zq5eVWNMzRUiP#;pDPnhAR04i?#GXA7E_8Dn z+y5BFywR7h7)0@o*f9XYGHQQ2faJ))M79d`|WMv2v43m{iWId@TQ&{ zLDwP&Le0oUCzv!P-y5Gzk`2vmZLDodY^*G;t?7Hy>0G*ng}FtwwY`n0Aw@+|11Bww zm6jvOyRCDvG(WMk-okjMN4aEbd1J$T)eifz6qUUV`;Y6+A4!; zWSsX1DJ(56shqKFtgWrEwlmh3lR{%r%IoxSIP4Fsl$3d{RpT#nJ@(sjE6+PPXXAig zCV1`sfTFfTqKI+29TRoKi^ul*4_&Fkj;Aj5>XzGS=MKq*UA@b#Qd_urEi0~LTt-e> zR+Yj0ECeJP>ewg8N_hyRn%nFD6TF7PnfUq5hMjifWAP+Sy5Kr%6q1rt-Y61BsGTC{ z>ZUNe74)kPSVYe@Cv=3#C|mZgj@Gto-102jVOJRR27_18QdFX{D5Hg#4rwm)^eovW z7v6YL$bV5=WiWL3jsHYDx&*HYrk8=^YoW>>{Z6;t%7BrbR!cQpxx@8=`*Y%pBUPS*_Od__{@`(k>O8L}?LuiTyOXg32;Hom zek)wTV6&K9vS!&C2K5J1I2vuD-&vX;)GB_ayfe|Vuy&}GQGzuNI?B@(^@`ngD0;29 zH@^JtIbmHg%Z24M=w8CoA5~+087n?OLCfBp9-=JmBIB^U4ix}Ef2s$Bk)eu7E=q}r z$Tn~#3^_%5f7VMoQq7|-y!{YC;tEx_mAA)yUP2jF z%#juWS!1P0cMOOnAh2F93z9l+3#h@wGBFonT28SC41Pmy`9U7Z)k0~B6(nm9{3g(Bf|8`Yc6xdgt(i3=gu_Q^YiMWg>|6f5 z3NU6qeNd(#u#N-8_kigHOs>haDKY&o`4a2U-OhII8^eMonSZy`~RlBH82=J-B(Es;s*n;T_=`;Dogkl7J@yc1k zN-@Qtv*5PRRhvS+OTMj$k#BSJV;tB5-7PON#4^u=VHU-p-<(1o+ z8CI8nz9~XGISVnnL@4VjNq2>mKPYqmESDpDm4=NTbFJcC_eD^23#&UClqpC>uo!R5 zRGL$ zLGW~)Og^Z8x4)SJ6{RnM-;Qedd;L45Q=!Be?2)brK+su8oL_m@8WZn;zJ3G-eByi^ z3Fw@;ZWl>?R{7dX(Xgf%h;g8|oa?nb_G2=DRolU_HapMh!TtyOXhp#v}&1+ToBlZ0w~RexJ3TZW@;qfeioF^V1%51CyY+! zg0QUcUz9yw(vCh%&d(#Js7{o}u~+aQ?kv+eyE?Zlct- zZ8tIz03Rk#w5KJ=eVBXDcONB2r7i(dw{OrHjR4vdag__>>Jle-r}kG%TzzE#pu=`P zrMlQdcgMG`{_m6x=bjeeGd2{dFOd}M%UCZTt!FuyZ)6P7uEAHchTk|1w!8BmyO>rC zN1qha!Z~i%>)Z-ubA{<-(E<{~h49!becpPT3|PZ=G~XiHG2)BU`1;KXu*YDMmtH znkZCeQ5-*1?S3cMd?E|$3K=p$EJF-AXZJ;g=xJBtuURp*5cCeY2FZmP}Z~GdEvCkTXbtwht<1B;Jvh;Q1;H8{}^C<({CU6u= z0d6s;SXaI4^wy}@xzl|YmM(;xRVb~d`M`sZ2VG%jLiL-r`=BzwzzFREq{c27+R!Jr zU+&-e^wSnto{ONKSLrkfI~6hqGfjHW5w5PMK!0C-j||bc$(|?Ya^&H?5pllpOAitQXpg#dWQP5-o0%7)$+)6uEe7SeFop#a z3D6&AR?-x?h+?Ep<4sKy4VOeyO{P=OckOb4~-aJ|UKFb0<@mUB{O zT`mCE=z~fkfX;(E?4_&(9F1Ac3NbcZRWs=vB+CYs5RgO%6$F{br}B=?=fytvI$bZX z!OK?HRir4XkQYsEhCt~Q*l^LrC2Ehgh>Z4x!uvfh0nlbXp#f0T+zJv1AW4vNp^nqB z8@6cYXs$5gj5JLc9DWR_EVdiHSJK~9(W{!~#3!bv0&?6yM{f48XIu_ptp)%(0x7ZQ zuo5x@)aHU(Vg)9};L!}IihwHI)D<0QmP6Sd0L%VUvM528XY#k9dhP+IT8y19r5H0f z%1lt13;tb5?YC$5t>k4sAfgs)K05$tZlE2bQmF44<>gIgXV0CXH7+VD5@0(7)Dl1v zKJyZ?@nRi)^X;SFS69o-mbC_hM_sU{4_x=lptzZ`&9>T4ZBDS|A%6 zfj?z{ZYadf0)Qe9R0Vdhr^x^V+I~80iyk`Kj%A&>D;?vV8CH&`!zsZb=U?{JWFJyj z?R{>Km$-ygE3-kuKyP0!A8)&la>n*E7EoEFj_~rQ@1b-tQ+9a zY7^sb$dBpjd>x#n03s}AyE{bf4@=7L%N|be?DXDf#fB7oYgB~WSYKMg=9&A9Eaof^ zZRLA!1j?QUA!yaTEq4#w(< z00SgGbRW;--O1alx>gUXExtemQRhxvSKRv+RrT2XG4qpIfD^yb&);l!%BJuraBJG0 zmr5Y5Vt3Fyq%8uR=#UgkswmuNDs`wS6CU;{`aU#N(*QYkwW5DE8$32xXu^Jdcd&B> zc)!s0N#(-dB6&$p7lsZfQ0QeTYVLtba{mew!9{-&yc@XT_SsS)1|SC$Y}*m-*Uea` z5N9O&uQ!ZGpr)Qy?9Il{Ii2M5J{F_kcc&U*l-urKs>!W+Q=a(C1vm$K zNE#>p=e5m_^mIvdibHF)h|n8WzU!A4xD$80V2c|DK7{AA?R~!1#S%~vLQtVxPKard zskFWWlo|;+u`m)=RVtI%S<`zkA9Y&-u=PM= zt6lR4*o82jX#m%3*l&F>JR|E$=MOpZYKk2Tn$fQz0$}<@)~OF|XX_1>kKA0!t#s%#6vVmywceXJ0szLrHIdY z?aD%+%MK>8!F#i(Pv-JTVVOo&5#z6jD!gk!eE#g$yzwOGCf|4OVNR4c;Ix;`8V-120@uL+V)P7@uxz06a(C=6Ipc=FntR6J-X?0 zP2F6}(_}E}qvfL)B7wm|)D>M&wdveywb<~)t*dt0MS9yoh5^`EVJf%a zkukHSZU3K=)C_YsBGXL?fKs?P#GlyRXyCJbI#b}SP6tiKAZ-NH=0SS&X&u(|}($xRmK-*tTT1+px$T8F^z&#e7z_}(w<{frN|%OR8R z2_FBO-NOYGguXHnkSZNK^z_-tc!Ih>nPi0v9)ns*ot{aVvB3BBDf1uNf-gLL z-<)~;F;Gm$kC{yW7DdR6R0ZrU(c3(@W%FRlWC9-z8Wi)R^i3R=aYm|ij2=Bs9Ne_* j<&?Lmi`x4C#Q~O?~U@*YEZE|Mhr0U;jLx0YU!U1&JucgT5_-{tOn2B@hT&T3Tc> z*}%YnN~M~bn$qcXD=RBIJ39vl2R56{;c&QIu9uhB;>C*t0s?}AgF`|>A|fK9qN3vC z;}a4R5)%{C($dzfS(BBOB@_zt^74v{i??jqA{L9w%E~G#Dr#zKBoawuW8>bvd-v_z zCzVRu+S)ohJC7efE|bZ6dU`Hiym;x-CAnOF|~q@Z<)X(^$JX&FgtG}98-txH_U za^$%Fe<6qebN-(gQk&zAera5OEdJ#Fj9ixmVb=9CzIF{qZcEbb;mz(eN$kg|P27o4 z8((5Wyo+I|T2=pQ=TW-`_x^3D2<2Max^mc+mDwzIVUdedT^)<%=pV~FFW1mG_=XoqAPcsYaP^<1Re$SaRHk&TnnbVADrhP^?jBgnmnbH}y)in+d&U@y& zY_zlDpq`~DXKVTP%AA^=l3mAHF6DNn+E_K%fun)NtNkHF4lmm6G+rTb?TW4!UkdLO z)P|PfIO(1h_(b)=@_A`oGE;3_W1m65$fM50!SE_Q?ztjk_%8WCHhZGw_Vj_87GsWo z0-diyhvr~X{#Y<7wYdTtuAHHU6NVb>EYm-QpDgtw=@~oNu!Pd|QDn-ZkP5c$BzW;X zH_t*a_EwtnG3O(ggV$>sO5?X1yB)gAG<>t+0aaT8EyED?9k?v$rW)*5X$2KauUFMC zV!X&kqIMI#qC$}T=wFvTVaf*gKCe!I|DI@C9_azZVU$Ner`Zf_g9s6^nu6G*$4X6)QDs!UTCBU z(L{o0oWn|Q;~kfG7L?)**QykRY9$X*w+(cLb(|z_WkL~u7SXW1Br{m$3PsO}HQ75@ zh6T@xwo=2?&Z#0Q@wq8-C{jUx5olE?p*e+B&;df?DA7E;r$B_a?3^^zmBpF&;zL{r zD!sJ7WZpRZDN6YU`+C-(85%n)*3usrl#-0=BCcsHcq;M1DYFZpOn<-mhFAj=UVYdK zJt?X_lskQmsEe5d^R`ZmL5Nqc8^BqZ{MbWzXZvH-u8DWSt*g-RMqI_CRO$Zy1qh@3N4F-$44s^aq(B{?qxE(AQKVn^@GZX5T-zBx(V+f z^CqgB#|5`p@-qF_-s_N-Ye&1z9@XA?`4JCGFOyae*dxOUBsUdnny5!t@~Zp>H-5S6 zakJ>qkQzn>lWg1a(L^K=1(}DPWq@dJ!3h?J$J+Py1wCJFL2^CM2vQ$DEthaK<&St& zTAAFp-&1NIn8SX>yGAq&k@Aq=;}_@7e%fW2SDYMRI=LHmB;HOMH`(-z6dyhV8VKg7 z{O>-ARzgEo-q;LGa{P6ymt@TO3&mO{`1`uNwiEY=}lBB>}u|)XU380C8^s6wR-B+LP=ar-#>-gt&wo*t#3W}+GK=EB? zK#Y_Uh4uR^$(4(C7VAg#V5oj$FG>r9-lPP{9_%@uok3Uh7Aqf^%+JK6tPvv{F^h1X z^q31>F`LE@8vS}bC-cLclLv*9+w>O&PUsZy@0uK$ zsPK4T0TU}w((W-DMG&$98t$$8FQW9CD}CGgmc2ung-#~#2TO`BEg@3LBE478qR@(g zIBJ0lGb{ybJ%$i7oqH4B2W+&L`dT~+6Q{aIBsibEX5&Cc5)Vi-_x-X!|LewDd0WDt z)-XSX@3Q|Ha%1KBoc7O`D7Sa%$uP{>zP>$zTX{deCP&rY(B30~t#y4iHll5&>B0^Z zsxI!h2Zoj`0hmasqqVsAp-ib}nYSz4^c@Nd@Ki27>&mq$Z#5iTJel7%YuiN6bHG6hpIBMn8peKbgvFR=K*1;V?YPyp8E~sYViPm^3 z!db!)bsyB6)gF4D%Py{-sp+sCfMx<408ijBeW^*eO;JjYT&*9UtRVdHObR4ler7iQ zANt`I_6q^deZpI7$NQeP$2^#Hi)V2pT#xB`OTW7bZtHM|b%cU^ty@O}a`F#6c=~a@ zvP_7a*r(y$+7~uwFth*8Ug-`N)j<0HtY8$XWXvO6QGWv<7`CVa0NUHUqV~ z%SEN>5a?JriEWf^*ZwKIw99Xq-G!OX)TGYEL*whB-*X0z5?LbM68T!bU``r;mWmji zh5*6>xlZ5V7JUdZ;SQ(K-WinkXvq4$DFiu^gzN^XyGc`(z2m*ou8*RQ%OTRfwPMlt z6n*&iDf9959Zf&RYF2#%G(eN$MCO(IVq*=|{iPx;PdcDY91BSlz^t`$yMNnlJ6EE( zx%bjeU}Yz|A1T(dNrhddv=y9!g+1|GJ2>A`#4Jk~b1tlVzw4n4efdGzxMLpyA_m5y zRi#Ix7xkad00JzEMqwkD1VhNj^JFIaUK^9QToYaU^uT+$)VUB^ZH-oNZO-e|-P*V7 z;M%g4Utz3fq1i9iueeLD$F8|wTy>Rvv*9Y?Bbq+dragBeT}(B3Wi)(?2GNBgXsyaF z;^~^sUsYCO{f9XJ(EA$h^z^W&aue5ze)rDCiRSm+cEoq$9A9TZln-@REDkL%>Vu5m ztiRv6fCqKLAAB^s2~Vc0nHz|xb^^IrRvm|3x#I1|AKPx0%e|kZrt-!A#icqGqBaa3 zFt!*cEB1Mt7PeeootD*6y@GMVQtm_aRTOi9LrB##CyM0q)ypnLwPh^O!#$ z;4#mH#7X?P$KL$%H8CeHv~Pp-(c``-piQ5u$s`Rb0lqCh)0`S4De4tKTsVJ|0yP~&OFCV7One!?p z$5*CI!5kSN3%4u$kt>NfnxNcJ1vEN5HBagbB*0Jr^p(JjZvk5A_%lpR-gY``D<-d) zwQIY6u4Y3dPF7K^%PKG8W}m%P&P~rwIH~n73)%?pFs;)F6W}aWz&QuW<>9LNh>psh zN=}M;X%_0@74j8OQNU2?Z=h2@GmCXpkd+c4SmwO0D8BtLW(!$mfqWOiip#A8HUwRcf*1lx0Sj>3vv2si23laPR0Lx_Y)?nHf69tc ze9NV5vXn23i5+Sy=<40pkc&Ic00zAB)13~fMOAY*M$3PSAx^&*EQ8`6HQ2Kl@IYEW=Eu%wGhsbe+zo-X+k z2+mY+6FR7iHrQC10XLo?8ufLo^F`d1z))&3DilH}V5%}lBb~!)J+I^j zUYh~TNtn(O8_1eSEcW_?$Qgs?t>+rdi%cFqz*@29?}-Dg)6Ke#QBTkNA2c*;@2_xh zwKP9$;w*uCyfxh9;FTI=DbQ(3@|`F5yl7~`OWC{Dp9gEFz@}`C-}Uf&Tj2%>X?jVd^lj$0 zFAq&7ZL42a^CsAa4hQs7C#y;i(vHtpt;e;i;?!gzs-xWXS;Ja z)d~_!$-Qw)G545z=ua)F8E_b(@AD>YjEv#XHsn@?(KnjQous8~=fn+Bbzu1~}qtdI%jdl80LG^RYK+6AIgT z-7rK4#wf6c)n29A*m;H`j11 z1alt37Lo`(B|KqEicqf4t=%{kor9+$H1cA1Il_(4!u)Kp_RyTWZG)K0nkZ$Ed>!4tQ5zAbKq@q-VNonhtJ%I&lJwI~1h88#C@E+`=JQfHC_(~Y)$R8`-Z z%299;^^L$yhRo#iU9Roy8Q8Xd3{<_79^bR%L39;od1uIbhJQ{>6k^$t&0f=iHI>5+ zbn(b!anm%=kRS{>6f-5O>GG322+7}w%;!gD=2!SsX z(o;znZr)_Nen|YzzJg^zpTg!@LF;_)QHGbX+<+033!5|#V7I)r+47c;%vqCxo~%oM^3?MuCx&@x+jqQ~N;X0jkY?_|QLASM!5ti%o9zq;F7 zgIH?CWgS9ar|}LUakU83IcLB%2N%fyd}_PHEd1C*p?9bG)7!An9VayTMhm^&95!e< z$VkMKiS3D|71NL@J!M}G#-%+k$@64QvR>N9Rr4ofN~~g6brrbFffktpr5$?SbddQ& zXG^OIjSP~`ceOtW^Kvn(bZMRYE_RA4(AwIEvxBUcS!Y*#_1EIT@*VK9-QEN7feMQV z>qy-GU;QQevA*q>)GWp2Jly`L^V#$)Tzkva5rY!v12H4O#~lzQ1?yV0eC zY}E_5{jFqsC8x2cEn)sS=Le7h-}OWIfxOyVXu6ZaCk)A*>UQ5^Uutg~! zr3ll!C(-5Nz3z5*&WT007z=WozD~OR=!4HEbWWaxGzDNR!;JPC0)y?TzwT3fi*oNJ z-Exi9{L6h2J((f%C-dgh1l6}U?67Zj@sOGfv;yHf#9KRd)*AX;!}cdvD(4sP{#)}m%pe03 zvics|Vtom`Sc%w1n6L6N_u?TT%QMYUpeGzI#{tun&iP%5550AF;GSbt(H3@u;`Gk4 zmMGag;*K~V{#ST?9T;Ar$CA;fSG>6m272!y^Of9`831jJKei4~>EP-HM~aL2Di4f$ zXV-6nR6}|9v1_YI^nKleZg~=943*aLT4%SPFlm3i{CUZpktXQK3LPb27x`sG zov_OFiT{m~XVN2C^-IOu0u<0)aH7YAUL3h)zMYqnaOViHHU$^jj~cyDAN*}uszL^J z@$H@<&r3X7eLwDDisVw;S?*5qsA+^9!FW=*VcIMC@|S<_`f#Y=&htZ?FO&@K2CCJk z3%nCbzgfB~;S@R07j}~*)dnnBUHiTsp(}&=x%GL-L@9Fo@fvc;@X6oJK}X8J;?2Yd z8yhB*2B=8z>ys9NrE|2&xzDeE-SCM!18MO99nz@9ztvCeK3%eMa1!RFWm-w$62|AH zUo>b}bzGD{Uv1LeAj8)#?flvaasi~iG`A+8F6<;uXoz>tuTu&}V`=xCu(7#ka# zn3$NFnwp-To|&1MlarI5pDz}ROG--0%gcA}+*w&!SzB9MUtizY*x1z6)YjIvfB*ij zuCCtR-oC!R{{H^s$B&;pdGgGeGZ!vgxOC~#*x1}&{rjA`M~_9F;M%N~35R;B zHL1pqk!32yD4wkE5~~#9AM{boy^3C`Sygq0c9C)nF3=iUtdkY;n$5e<@T)ROK7U4~ z3^UyGE;6XI3du5#pvhOm87!t7hm)2SyqUPp-~@#gR1mM#>)Wr+l4AT(q+6554C7;v zKs&K=m3zTd;5aqn%5AB0dbLCFRLY~Qx;Iv5^WEqJO$9H;$uzB>8l#vcm@W~o(-4fQ z6d18ttaXt50(Y4z-hTVRPqik#tNCZ|*|H?@1g#%k zggi+liH0P1aH+=Ry^mLoR0NQWi=^XP`_yp{iS-v1=+~6}A698Q>$@;2ydLqd;PDKr z<-Hl-uFd3=Q7oY&182{y)a1S5;dHEHFjq}%i_g_pD2XV;V1 z&xnS}Tp8QM*#4GyOv|aC_b~OrN8vLwuR~Z+wab(!P{-$@QnIQkDx@PJEs+=yv!OGg z188+o#wdPa0N}IX@F-5xjrj`6tfL5%+&r36_5V$S6|pgjid6#ZVanu|+e#&Bo|Nf* zRV($swUh16c_6k{wdx3GV;V~?*k2Hli2+-=IJ89@06r0R$R()6L$n_?J|wT;2SzV- zY+6&N<~CbDJGtJT+bX|Lw4KDze&=TjL!0CucOzTeg<*l(Ucbnekz$qe%dVs5{|z5O zI7X_@955`h!)xN03V<6KhjO)pRDm=4rSHKmc8~y{6>S+2kT>;T8u{dKKSfZlBNR(C zb^jPzJRA56R*^dYlWa`KhN5nPZ#PUNY;;}L>pL(YNl+l056F^gO>3kQ#QP;za&Xdz zb<;NTR>D*BQ^J5+%OVrs+YUJO2!PZE@l`EW%kc^A7e6Tjb-ahwSoZs)PxMQ29X;OP z%Ky3qK;5e{MAPEN7{I^1_7EdYSr~t9|G7!3`IW(S3#Ddk_ti;@zt4#8lZ~0+IHFf4 zst&bLh)~_x!j3Ci-nY~O!W9qf$!*WE+*41F4Mr?u__aN%76@)0$569`;#ViGcB^;> z4Hqngd>c7a!^C=&ids6vZV5#OtyPanbl=zBDXU&$+Pa=uhb1VL^f&h0tUkE(nd(!~ zsf;3Bh2U+eE>EJd;&|L^%~A@54+^=NHnVBJ!O69n0klQ`3D3s%RB{TlpWr3h()I2Z zEyEQ_58Jq+Sx&Y#!Y-M3i#D4V?$dms_d~BTFY4`FCsC^z=_WxuT?Uf-M-BR)r)@c< zxTd$4*Gr>N?CxwGWl@4yL6eHQW(?w)N{l?h42x1t(DuqKofsP7Z+Q1LSmJ=nq3ozX z3coKdSuovxty&5>h7={u;)*UpLEXc1?l;1cEWw$uGby;7a=x(bZ#N4rk* zdz-N9c=arEFE>dPY-KsBQJo`fztVb>uun8bG(r%=lm>@HlOFwMwZC9r@TTFOkCE5`z(ql<;7OoNuRNt4TEZZI?R^ z?)p0oZL$|UP@Ia9kci>=EoK}Ulb%l*wRwa*pe6ut5dcztL5v}fO(^n?k1ADGo*%R) zdST((8~|~+;)?se4;+v(uf+b~{gIO($k<|4eWrCLt0&TCHZIyba|1eDP(2pGmkJOJ z>I2N=2MY}##|YZ56ei?=)0sGg=%o^@+r~`p?72-)O8DzT#r1{>G3!gb=ho(@;r{j7 zJYbOV8i|{~@cLr($$T=oBy%2GuFOf(`HWh1jUhOS0vB+)`h8I_0Ai8R?a#{_-R9~C zO_XhC{2vMOwu&qDPruc^6s)l{cWwgH^7xJ`<)i$^l%xflx_@8y=@hCm zb=@!oOO|L$>zEz<-^Yt5-*s(^lm-T4Kj`%<&=lee{qw}}zE4Mt7Tqm&YU?uPj~p#B z6|2EN_qRC#@GGZTe}_)ZC9e^v6Bl))Xk$OY=9T4fb6G_pYc-`$n$l$j>()KJmSFVT zBRvPXH+tbW<-1ibmoN*bj-A0k8n`&58Mb)+Q^-@Vem*fnbSdw{SJ zeL`X_z666^GbiwK@69SFYK6tWzkEs&VxOTawQ|PGYK{l?c7chAVachZ6dFR@;S6awmOl;tj(Dhp)Fo4j*{>9l!!E{-*v$yrk4r$~KuhH8; zOBwGe8zPm%Lek?u{CV%g}jBUawN0Gt$S68lWL*VCKIHU~Ls6gcq66My%;ZL8x-nLyppw(2asRKTL0)oOI05VlkyyYdMgOTCGfG~zCWD=Co2RlizYV!XTV zo2IIySCSk#G7w*PoSv?3GPRkk(UNoeXB+)CajQ z_wAgoD4uSopQ=fY%GjhEOIy<(DBlaIe7D-Y8NsJ2ATjz_(C+t4fCw3`{6;4VrCC`p z^S}>fBC#$EJ((TCLz>TUPYV4wYG@3Q)Bsj$JT%}#stCULt3bXn(qdoyslD_EAGgK) zLUNHJ2NRmEdYF6fW9uJc7cDfcgw4x6V2)r~AR<~%^RIt|%jYfN9#G@LL(W&gx<_l- zOS)$*C{`4NP(dOCD7YSPu0sFBC;L$HuUY0t)YW|?N@zidF$LmR0lqPK=TC0$)t4Q8r;|<}&zY)L?ArK3FeAsPII{B2CcwR_Z|FBV4iuipo z^paMVXQNI>d!8EMDxsZRzwJ?@4(5Nw!YlFdfu!t^EDK$z23KU&6vnp)!wuc#wf7B> z#(f%2!fzae2$Pvjdk`r2g;22(#}ak@{h(1>h4@tGlm)kkU6-0YYz+@1+EUO-ja*Gh zg+VOu?zyHiLxWPbE+Pl&N7Orf!{yCFhn|iGrDDaFwHxlV>^M*JbG?GQ@#5>asoWYi zyv@j?fkuB(w~35}(YT^<93JIJ#By26$zi`0)- z3;IMGu5FU85XTSHc&xCY2`Y<4g1L>8PZ2p#F zCYi%;S(|ZjBcl3gg}#VCQYsyATNeo#I&m z9zh076#nclLbEZ<6o8dUfF&|?U?TP#;g4Q;&upAuoX)dP`3oCRmsz+N*nMU`rpu_% zZKT!oRge!`-Cj2OR54f2zE^_Zvkc4QE9 zOpjg-N$lnRBU<&-TF6$xm>VQR06nmD?h+y_MJ>d@+WYL)>dlrCW?Ax@ff}>`pj#J^ zn(%zLwe1JXBNy&TbYf8pFi3G8w9e>I*0uTk!8(cyy-0`mujuaR4QQJM<3Pg~BF@Yh zTZ+zh2CN1V=$az_Bo0u1cq`XBtzd$k@Z_&jiwm7-BWaK^p{HA{&LHyoH^!wFw^TWT6`Kk z7Ki#$5N$Q|6y=!j>%Lxw+Mc}-?Z&VL@a4jh9n~urUAe~JXT6z=YI6pLB0I~&$enrL zCzhwn^6VB*SJA5k9dVSv_-xs)smr_bCWnjTuU0`lDZE`DIa~5$#W^%xGkN!)L7S{m z55<-ZYG}shQmwdy5w{1zd^L_39eEvjR;saOY?t2^KvPhz%mD-SS}spe#Pj#vYc6;l zcPQ?Rd+{2(5TBFy_7N+n*(7n{uU|NZ&Um4A@6mT{tmip8c1pldqmD}Wyg!*LENsl} zh}-TO;_TEv>T4*XSjOc|l;rKsJ*^|Yqc0-oAO6P5AjKra|Fu@U&G^lW2ky=hP#xwM z<3M~VBp(Ipra;`q3_F&~ZY@(Z4AmFI$yRj7xqTG=l&oRsX0X$@?-B|E09{esGljr- zUfBmv_oP0m5-xMs5hZy3_?#cdgRwDpjoky(-#^*Q3eozKJ5?Y9S3>8nV93$!JeL#; zj)xMG<%n-56xl*rCwnY&@Ez5nccwgayi}JN%UMFyL%l^0!zrWCKvn!ikDJkX$@#3O z4M=FjXl+>hg}h0B=`AOvnf)ZiYiHAwnaD%wCSS=>dmdy1Q%eA!Ghoc-aoIXSd~V(e zV(m|d!F0=}-$%E?P_8Nho?~V09RM^HEG)vUg^|6X6tAWYyLU_?&k++f&^I2`Qx6)b zzB7;mbD5#PQm?azxaAmhlOkWKzOgy_(_>tOvaa;)^w9ONjDal$>R zqSNnU>4~-$R)ngm)IWYjtB_d4FEvSY^C_I(U@~}40JS6moikAN7&+)kYzbsl7p$3l zJ&gzub7@QG1vvWzZzzM&XPM0TXAcVsPvQ!+DlugY9JFJ3@kBQ_Ox7VlCT;zp`56A z`SS1Ndy}_c#Ammid}#aAQl*H5uDLLjdNzu-?m1n3Bp`{fY_5WSWsuDyc1^6g8X1qB zL(DS}&nI9V%I5;aM1kv-FCKQqt(4Nsm8dnZ_3E3K=TApf+$;CLQPbS{D}k=Z0)jpA zipzn)Pu-?6^R~_}w40^F6*97c8Ld$wADz*zKOFWwpjDo@-1FZ|aJtd;!;kTmrtb@Y zCeN@@?!u}>X`PSq_xxeS81!nC-yt3GzFe|3=**3Vo!dy2;ilC>xvhSUL6b*^NnuJ>G`3tIf2XC^+EzKRe~hIsgCw literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_23.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_23.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad0197289e6fdde6eae3b076d01fd37e1e9da08 GIT binary patch literal 5687 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_25.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_25.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd18ac9854d9a8ace2646280d0940b5fba11b52 GIT binary patch literal 5692 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 A0RR91 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_4.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..759d3242d3473e34eb028e57bd811af813d4f4a0 GIT binary patch literal 5180 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 TSHebVSKJmZCr`p&0O0z65??Hs literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_6.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..fbea5c447ad311b076d437f84c0fc40af87dab3c GIT binary patch literal 5190 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 Goc{*|raU?T literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_7.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f48bf498e2b1f9d978b848fae1a8603d95adf2 GIT binary patch literal 5178 zcmWkxc{tRGvT7-uS*8COPVvaYP!5sFd` z9i(H2a;qjfMy20KTdC|SvemZh*Y|nYN91bToHkQZZB_<}Oq@?WKyEij4GdDN)z<~n=1qDS#MP+4W<>lqo)zxCLxVE;o zv9a;Qi4(1@t?ljYot>RsU0qVC^y<~C*RNl{apQ(eCL10e9vd5*oSdARntJ%~p+cc} z@#4kHmoHzvdbO~yu(-Imyu7@!vhwxo*R{1Z+E)|`1pokTO?AUwUQ*&FUQ$Z@9%2%2 z?_Qoa)6UuDe*kQLFo6Fl1~6-gVvDZHv5?c`cMto=63*)obc(M;SZW4eT1dNPJe%=- z;@{mSJqNs3zbgLR_w264U)wG||MN`+T~8HXRHUMUJ6v|SyrS|j7B*yTq}TennVMOc zThbY}9!?GpHV*aaYZ4Gfh!i9r znfAr;ZhjvES5=jjYa~q~9e1beIL%L8jTx5@$VA%KjBVt>;%6ew+QI!^Zt(CCGSx

U@^Aa%0yi3228@V!G1q(#hjPR~tuy{nB6tuY! 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_8.png b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..38b730fd14fc519691e5cb51797285cb1fe678fa GIT binary patch literal 5186 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 K!Biat;P!w1oJh?8 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt new file mode 100644 index 000000000..f0fa77e2e --- /dev/null +++ b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt @@ -0,0 +1,13 @@ +Filetype: Flipper Animation +Version: 1 +Width: 128 +Height: 64 +Passive frames: 21 +Active frames: 1 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +Active cycles: 1 +Frame rate: 5 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/nsfw/manifest.txt b/assets/dolphin/external/nsfw/manifest.txt index 1a9dc08c8..c9cba41d4 100644 --- a/assets/dolphin/external/nsfw/manifest.txt +++ b/assets/dolphin/external/nsfw/manifest.txt @@ -78,6 +78,13 @@ Min level: 11 Max level: 30 Weight: 9 +Name: nsfw/PaxGod_TikTok_Marketing +Min butthurt: 0 +Max butthurt: 14 +Min level: 11 +Max level: 30 +Weight: 3 + Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 diff --git a/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt b/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt index 1fbcd6106..2027b1c9f 100644 --- a/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt +++ b/assets/dolphin/external/nsfw/no_lvl_up_manifest.txt @@ -78,6 +78,13 @@ Min level: 1 Max level: 30 Weight: 9 +Name: nsfw/PaxGod_TikTok_Marketing +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 3 + Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_0.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..5401e21b2742ac70a3f2e21cffc20d99517dd429 GIT binary patch literal 416 zcmV;R0bl+B0Gt5;FMG%ha{2rq9{%*j64>fT9Pu zxfAFQN%%P%WDnL@gUCoA{{RjA9;g8a_&t-$KPR9*JQ4Hy1K^%;(0&iZAK>;c_&t&S zuk-u^{2tHr2iNc(@$h>8f&KUY1LFV>KDd0^f)6jp3?6WAusy&-KnI`ja6tC|`@usF z^aIN<4`rD{KLGN^1LisKACNwy9RPW80rNQg1IvsLSPk(MUkEr5ctG}Nr5p%8Abj{Q z{s92|LFy?e2LRkZ$Q!)@>`oydgVYpw4g3rUK=pYTD1gQM2c-NSqf-VDOt3H@Q2)i` z1ti#n$QFO_nLJHaAo3`b_&$Nb2Z_{)Mfin-&H?@-2*8>J0H6cVI3Y7Fm;r%B=wT>M Kf&79N5r7yR#J4B_ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_1.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..49d9e5135894c85d2339e3d8fa92c5fc4f6ade0b GIT binary patch literal 385 zcmV-{0e=1g0DS=fE#L@$kN5y!a0mz~0H^#1o&X-O@F4?;9y|bg$G~HN2d97@x9}MF z0qO7{i75cWPB3~%0p|yRd;#hF2aNC@qV@k6Mt%>!`P4z}zz6ZYAou_9Kf&&wNH`3E z`#A@|q($au6Dg`#r{w50Pq3+4|D&6{eJ-c1qeS;@DFeE|A7Jz@OwkS z>-z_p5JBbsvxCpR4~2;Q5@iMl%8el3;CXQY_526yFdlqhe8&Oj!UxY_o_;iWfQA7) zMH~bOJ`j3>N!~a3Fc5wq`k((GI1hk5MP;5tz!Wehk$@z^EF%Cgxss>7 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_10.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_10.bm new file mode 100644 index 0000000000000000000000000000000000000000..9f8e4fb7ed8f1b5803b8ef5eecac7cb1f6652f98 GIT binary patch literal 365 zcmV-z0h0a!0BHdLU;F?5hl8sD{{RR*J^=OjfA8S);7@!J@Opm(>-hipFXQG1r~AeR z5%d4x;9`IQh5`>S06j;9I1;gq#2%lB86e5b4;Y8=GJ$a#kUZlP@X84U9@+ER1Mj{m zAbOvS9w3tk;blUq4<%89?j{d}dV~BBK=ywKJk7)pxOjb>1P@n9gVo-Sg9rFO%_apP zdN)WP;Qt4|03LJje}mP^VDtnSKE((A3n)GyNbv{Y|H1ZuV0qyUod(=ap3d&gU{d(P5XfT;Q1V%`<@S%0spyRQwRLu92!IgA1qbJvi~!*B Lr-#%4zkqmvm1MAU literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_11.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_11.bm new file mode 100644 index 0000000000000000000000000000000000000000..38c7944ac4efc73677137956ec3861611ab226ea GIT binary patch literal 391 zcmV;20eJoa0D}PlUjzU1pMi?O0tdI_|N94@0uB#v_y772Kg2v-;PH=vhXMZz7y!Ni z@&AL%;UD;LU}NP6r}_uL<73rG*NQG$e@AM{Cs>P`=Z@q@-D59Ue((LRv& zN(00!O7#c$y@Bxo2gd>4p#KN>Jx0V2M`?rG01xnggUsF=a&2M5c20saqCvIEivAK-e2>Ci#^KqPz~egJwX6F!eH zdax3I{s+kbl3_## zoZ%Q?^d}fRcjyxbh`fX988Ch(%#;IybU0p58yr) z2oFJ^gV0`|z$pXRpnebNK3FI42b{zF4@vv|1f&mR0sKE8@`wZ1<{wBr5&;+=ubebr zfhf-)5P*8&-b4=+F)z>_F!}H(f1UI(C)zLg2b3E8ABg_}<}>>7l-uZ!DE`f`{&|KR@z z_&>nq@c+TX{15p6JpslKS^$5rAHXT6>--OR_&>q@4@a;+!Tt|;JP02c0D4cs>G%i2 z0YUTsRG7Uu0QG@`{2qc*2eHKg=impafj@#$uzvyQU_g1yALb7qxq$!Bc>q25u9^Z}lJtq(d2t9xO@OnTn0_OjK1P*`C_4ks@@(0iWXF&RUihMu>4^QwsyIcN0s(wn3jGPF}2tEo2AAg8GNCh7ThQ1g8 literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_15.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_15.bm new file mode 100644 index 0000000000000000000000000000000000000000..bff1cf3e63b00acf617e13219e0f3520795af81e GIT binary patch literal 451 zcmV;!0X+Tz0KWkMCjveQYybQTaSs4Jz7z0zd@e9RdjB`z^nichU}V65`{4BdL*U@_ z@PEJpB`_e)1N?1vzE&(}+QOPDClZN+%>IDF5g0xr_y|16A8CPs&w=dzJNzGk2aW>BCSdea3?4iWz*>OK-iF~P zp^U-i-5dlkHdp|CK?mdyxI91~fU%B)+u#pN1_Eji&juc157;;?h4yJ}2-E1Rb70`X`L&A4ziukr4swWCV~s ze}MC!@gd@}-~;3S-xzBAf%9R&LP7Np|IpwDF#rfW|G@MFh(Avz53~t@1`Gow@q@*J zVDFdG0pXZ`{L tM-T3u6#0M*{%r9EkAUKh_qm5y044JWjf@{20D54-@qh=Ue0szMpMW$J%IyFE literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_16.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_16.bm new file mode 100644 index 0000000000000000000000000000000000000000..d234a954f4ee7c9ed0bee2d02acc3f5e2af4a91e GIT binary patch literal 440 zcmV;p0Z0A;0JH%BCjwvyYybEPcMb&L9KH+x{0yIa_&tA{@OnTX_+Wbf!RdesDHy-~ z@KOH-tpNOgzycmPcw}H8^Zx_W;2t;_-2vwU{{qegK0pC*Fk{q$Pz3}IEC0jC9|xga z!RPq>i;e*pKA1epCIBcw07u9V8TsjCVE2au)8YPro09)Og9FmwKY99P0rG7?daI8A zcT)*O!SDx(Wd&B|w5E$q`ED#8&J-h()Ka9j5%<~7xykWrnpg_p0;*6K*0T=NA26#ps0zGH{fO*6c13(A2fPjMnFRlGPfCC4u&H?Z^ iqJ8{efq?_me!OvO00+PiDf#?GtbibTPvGJRAQb$zq{j#V literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_17.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_17.bm new file mode 100644 index 0000000000000000000000000000000000000000..30fdc120ad021a74ff8a082646b39691bbd26d22 GIT binary patch literal 444 zcmV;t0Ym-)0Js4FB*K0OZ}<2Lehu(FxEKHU89)2jKs`Sb@OlY`4lZr@Jj25SfIvaV zfd7C53}3+_fCu0YK&Z#T>=+Pv{4e05fdkAOK=FfrhoS%&B>;|K0^ni8#t#%RgNpy~ z@sCn4eK2|dKWDWd7x*4vAw4EQh$qtrmGtz#a&m*l7!OMUKtt<)ESNlx&3~VwP#%Qz z@2Zp^2+_b#!R)>;c;Fxj0|&%^0SB1_**<~6fzN^W1Mor6CvXS5RABModwc=t01DrL|Ch!d z3m|*P|Nb02G!{iO2d$3*2?w{}9*}ZcEX*FT@P86a05E`j2TUHnz_o@dHBKUe}5TlpfC>z{eJ+F01WYnI0btD_yhxp90!1ZQuv@%9_s=4 m98mtR@mLYX9qT{f0K}eP0|gK~Z~_AWC@7hvMHu{mp*QfG#m3

$53V#B1JycU^Pj0m!7Je5ih zGJ0LX{EZv{h{5K*F?ir04B`jOe*q7f7u7zY!GX_#_XFTTZ-6}j0xvtj zJ}?k+dEWu^1P_=z{0jpIj4*z8;C#X20Q?9HbRU)s1XLfM3_L_1uy*;2>HuHRc*Lv$ z5jWHj8a@aD+|TacCeXKP`9wd8o)9&~jP>&+rdOd95J;_zsvoe}ME3m_A|d z69>2W9*c(fV< tJxBt9ID$R^1O7OmJ%oklhlA99oB$yMmH-Mf;DhG?3L;pEOd!LupMY8c%9sEE literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_19.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_19.bm new file mode 100644 index 0000000000000000000000000000000000000000..01492a1b431b3b9bb6440a2149d3d44373449a88 GIT binary patch literal 444 zcmV;t0Ym-)0Js4F9AhzW1hw=01wVxz{tjFP|NaI~=smt0@OZ)i<@|$#*ZtoQpTqwT z7dQMKpYR~a0qNlX`^N+Y5oqurAoKnPL>^zr_@sg84iI?YAb;>#ln;OpKZlNfmT|y? z&*E!f0R92xKmQAm7AMmOnMA+^cq$0^!Q~zYth^rA_%J;#3DXCh{ss?8fIZQK4`gwJ z#?B9t`XfgGkT84;$YfyiXAnGL_y|16ACL$f_#Vpifbbykzqr=D#pF=pgL!2hludK=MhLJiz7;C;&cF z;s7z31JWOV;6dTw_WT3S|KP*IL1dF4ds=V+{eza$7!QHygU%2SpaFx=_zy(MgV+2I zMhS!R0uO%>JzeJji~!5V4^r`;&jIlVt^6K;z$k;F<2Y`Q283W9UG!M`{h6flh m5)gq6fYH43Hps8B|y)^9S60o}%&xs9cBa4@h`8*+vym zdoG9`!{k*MKNCa`Y4|^Y=Kzn3PF Dk9w{C literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_20.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_20.bm new file mode 100644 index 0000000000000000000000000000000000000000..fadf12f2758a1a1dee3c312f7d6a02121cb09094 GIT binary patch literal 463 zcmV;=0Wkgn0LuXY9CPIl1h<3!1v>}wJ`ZX5Jvblmdwe_K^Zb9{V)p-Y@8Chef9LQC zz&QaU?+2H|{|A6v1*;g9JZkG zKOj6}VE+ffeM`fDP#8W7#Bnfr|AFa%hs=TYhZq{H!RD__^HemR_x5gR^C?Gxm@9~6#@{53g!0HeVH-~-rzpW~p|5$ZrtsYn6t zFf_2hA_w&V5WLEyZ(sn1#sSV65Pl)%u{s$20ESy1fIR*Iqu>Y+f+8RQf{YF$QxK97 F0pwOj+h+g( literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_21.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_21.bm new file mode 100644 index 0000000000000000000000000000000000000000..ea71be67e9dd3055355b2fe819ebb34d9f16cc9e GIT binary patch literal 454 zcmV;%0XhBw0Kx$P9CP^r1hoTy0D%EV;s1k!+duyT7lY692e*U14?q0=0S*VR^WT38 z5VWI!Y*I=fL|j3>+45<@=?E4ht}RfCOG(a|fwC zLG=s|mH-}qfO#Us9wV{`+#Vngz*xsY^?!g^FcDCGAI4()AbrQwLJz9}?0*yf1K2_9 z|A0^+2=TZB>j4Bmjst=Zrup!J^8XpI40wR~FNi3-0QcX!)E^n}`7_8!fb$E9JVWG> z7yALubiW{cL99TM00=%K{wO&t!S4f~_^|NMSwVnh{s*1@#ejr^>;gCm_&;C(_g5G^ zNhS}t_&x9d^%j^u-XsrR0{p?`P!It_f%2X>2Y3oL1o{AkfPhkvAJhOa5?O=BAP;eY w1H>pr_81{ljp+vpAUu3&_6MTKd>l4=2iXXR^Mm*Rg?|DG%)v(oBBPOwW_ZrTP5=M^ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_3.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..30b2bf584cdeea2c4a2035840419681914c9bc06 GIT binary patch literal 398 zcmV;90df8T0Ez(sANmFcPxt_!AcX>+03RRk{2U5i0DFcC{su3AJs|>x3zzU7k-&Px z#-$c0|%M>nC1^yMnT?S@>ifd zVfct2fFEB-eo_bc|NnvTp&s%0Vd44z^XJV0fd8-H@)HO=*hCK>&^)*R`VW{r(nI)2 z2>hrFQ3s*Oe-MA*Jgflt_+Q3^#}ItA)ruf;0Sp8le=z|A;a)}25Qx0N?A|i4gVgd* zV*?mHmm&@@0E`G;m;rJC1g=ey2b2Ilz;OqNj7MZRAbJ!=9$OSq1IYeG6OVv}5|iPA s|D)xxkAaKx69=yVvLN&5eu{(uXHobi;OHrh{BB_Rn0x?*Kr#>kK(D#FBme*a literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_4.bm b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..4bcbb83bb02052c171c7e836e6e96c1515d0eb71 GIT binary patch literal 390 zcmV;10eSub0D=Jk7xVuD1E>4|P!KtPzwq#J@B#7$PXIl@#2`PwKBwel2b>^}17ZV| zIst$KoD3|W@f?Uh!3Yl_ddI==Pf&l~!SH`jc@7L8A8>k~%is@mdjr%0C-eu?o!jXH z56C@<@DEdYA`Biwbb+tPkYM+Nz<~-6fH=GmA87*zxcH0+4r843?9I82lzk1@?Ri-mB=3|0tb@4Ab0>tJIEg&j5>&a z{qTH1K_ed=4zX@v_T%5d1H}iY^d6Xd|AM{|5P47@=mHr3076mlc-R5$0l-7ZA`f^N z2uA}C@C(jBb|86Q%LUN~oWLI{bch4*;t(YIf9K%zVTeBfg4R%aIthG00Wyd@&m=A& z0y)eccnR=5e*p75lrlgMQNf4L_;VkCK?)-W{sYXwP(q5Xgw#WFD6l+Tf)6iz4j>O- kgnWi8l1PfUfD8{Wgw6yGhy{3zP>3)-X8ZoW<~OF?kh?9*{9YgZv-h{2!G39_``>oa`UL^FN?Hui*IL1Vx@e z`S1hLj9~RJll+1H53f7}{8w859Y6l?d&~jrKLH3oKk!w%LmNCmXy(VxaNx8jU(Y Y1>iib|1KbKQFnNK<9^wS}1LQ!TzCI2tU#2KeYRs;9fxdbQCxq>fr~VegXauWU+(%9*_`!o7HS!{|BxBAKn27zsmj( zfr$g#;174R1O8wqAbCOX0QV29{2qsLj04+%58L=X;Q;mj_($!C2e1Is=0{L_d;%jt zf1n6X#|ICR9RcHiOPiSBAAov6*yO%8f`i5eM=1C`8wL+pNIgd-2M3WbV~fEEAUwa& w90UY#KhpvfN)P-8iX`S>^j!=;;13}X!GOc*{}A`jRap#kPcH^8(MA8LaK%Hcr94~0Pi zjP7ED2l`-v@Tg#XGlU2!2{qBVDd8WD0QSZM z*M1K)d4t>j4>TUkErLr{v}bm+}G_GYH@T>lnWq$RAna*n`YmAok~ygdU^zAdo*t zA`c`1p@bfb^9Rr*f$Wc1+MxmS3kRZn!RZHe5Pgis4{-T|)chd#ccdKrApZyA^g;dr z9{?C!f)DUA0w65F{|B!CUqyol+xUV04k7%5%7Ab2eY=Ps>HL2XKf(SF@P0r+3brtO zd;$IsP%#6_UJvc~Ab$X1zk}hRK>r7i^a?>^2bn}c?HC8o_#SY8dbmgUcU)jSVc`B< z2tBZX^+gCgr}zM{@B!*d5P3Ju9`F!(F^>TMPygON41nMC3^WVVY&NTvq$BqRc zdW;MnIdM6U%m5>T2aLQPGylMWTqOqwoCmK=b}X|MT(kgVYLF@Ok(F z>%hN)3Iq=?z&(5r@j*w)%nvWb3~*%T2aH4fNJtquLE|1Rh(9~$u>_h#f$BjZdw+rI z2@rm!6dp$PO%OjKVE&DR;a;$?davQYK=$|p(J&~K2f*Ng_YVhbYAj9Mj@O%yoA83OUFg@@Xu>T9}{=oQGus$H*{|EF9-k|>n_&>q% z0SEXXxD93a1JDvc{9q72!Q|F3d=dxd4>`a+N+KU0I6UJ3^+1Sxex`H81J&Xn@%@9( z7!O$ZJin@Q2eN2W1aB9>@d4@z5P2))^gx0l3mF^b|NFqf%!1L$f z(WU={gUw)J@q>wso?rn7qCEUR_<%hBfc5wQg(^oC7Ky0fAAy1xNFKlj`~%38pap!4 EJYmqPVE_OC literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt new file mode 100644 index 000000000..83bee1ed9 --- /dev/null +++ b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 21 +Active frames: 1 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +Active cycles: 1 +Frame rate: 5 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/manifest.txt b/assets/resources/dolphin/nsfw/manifest.txt index 1a9dc08c8..c9cba41d4 100644 --- a/assets/resources/dolphin/nsfw/manifest.txt +++ b/assets/resources/dolphin/nsfw/manifest.txt @@ -78,6 +78,13 @@ Min level: 11 Max level: 30 Weight: 9 +Name: nsfw/PaxGod_TikTok_Marketing +Min butthurt: 0 +Max butthurt: 14 +Min level: 11 +Max level: 30 +Weight: 3 + Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 diff --git a/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt b/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt index 1fbcd6106..2027b1c9f 100644 --- a/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt +++ b/assets/resources/dolphin/nsfw/no_lvl_up_manifest.txt @@ -78,6 +78,13 @@ Min level: 1 Max level: 30 Weight: 9 +Name: nsfw/PaxGod_TikTok_Marketing +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 3 + Name: nsfw/lvl_12 Min butthurt: 0 Max butthurt: 14 From cc2f421b12cef7e7d07333fb319b472682ad0979 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 18:11:19 +0100 Subject: [PATCH 38/64] Playlists --- assets/resources/subghz/playlist/Ford Playlist.txt | 3 +++ assets/resources/subghz/playlist/tesla_playlist.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 assets/resources/subghz/playlist/Ford Playlist.txt diff --git a/assets/resources/subghz/playlist/Ford Playlist.txt b/assets/resources/subghz/playlist/Ford Playlist.txt new file mode 100644 index 000000000..e50b31ef6 --- /dev/null +++ b/assets/resources/subghz/playlist/Ford Playlist.txt @@ -0,0 +1,3 @@ +# Ford Playlist +sub: /ext/subghz/Vehicles/Ford/ford_signal_block_1.sub +sub: /ext/subghz/Vehicles/Ford/ford_signal_block_2.sub \ No newline at end of file diff --git a/assets/resources/subghz/playlist/tesla_playlist.txt b/assets/resources/subghz/playlist/tesla_playlist.txt index f57e881e3..844a3c926 100644 --- a/assets/resources/subghz/playlist/tesla_playlist.txt +++ b/assets/resources/subghz/playlist/tesla_playlist.txt @@ -1,4 +1,4 @@ -# Example Playlist +# Tesla Playlist sub: /ext/subghz/Vehicles/Tesla/Tesla_charge_AM270.sub sub: /ext/subghz/Vehicles/Tesla/Tesla_charge_AM650.sub sub: /ext/subghz/Vehicles/Tesla/433_Tesla_AM270_EU_AUS.sub From 746a99f2d2f06318325b2624ac45675a207af82a Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 18:16:18 +0100 Subject: [PATCH 39/64] test --- applications/ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/ReadMe.md b/applications/ReadMe.md index 6224cb45a..3bd2aeb06 100644 --- a/applications/ReadMe.md +++ b/applications/ReadMe.md @@ -86,4 +86,4 @@ Small applications providing configuration for basic firmware and its services. Utility apps not visible in other menus. - `storage_move_to_sd` - Data migration tool for internal storage -- `updater` - Update service & application +- `updater` - updater service & application From 91386440ef6c3f7768ad5f762e68e0e53fa7979f Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 14:25:44 -0500 Subject: [PATCH 40/64] remove pong notifications notifications don't clear upon app close --- applications/plugins/pong/flipper_pong.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/applications/plugins/pong/flipper_pong.c b/applications/plugins/pong/flipper_pong.c index c25e46b7b..2af3e6df4 100644 --- a/applications/plugins/pong/flipper_pong.c +++ b/applications/plugins/pong/flipper_pong.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #define SCREEN_SIZE_X 128 @@ -127,10 +126,6 @@ int32_t flipper_pong_app() Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - if (players.ball_X_direction == 0) notification_message(notification, &sequence_set_only_red_255); - else notification_message(notification, &sequence_set_only_blue_255); - FuriTimer* timer = furi_timer_alloc(clock_tick, FuriTimerTypePeriodic, event_queue); furi_timer_start(timer, 1000/FPS); @@ -146,7 +141,6 @@ int32_t flipper_pong_app() if(event.input.key == InputKeyBack) { release_mutex(&state_mutex, playersMutex); - notification_message(notification, &sequence_set_only_green_255); break; } else if(event.input.key == InputKeyUp) @@ -202,7 +196,6 @@ int32_t flipper_pong_app() playersMutex->ball_X -= playersMutex->ball_X_speed; playersMutex->ball_X_speed = changeSpeed(); playersMutex->ball_Y_speed = changeSpeed(); - notification_message(notification, &sequence_set_only_red_255); } else if (insidePlayer2 == true) { @@ -210,7 +203,6 @@ int32_t flipper_pong_app() playersMutex->ball_X += playersMutex->ball_X_speed; playersMutex->ball_X_speed = changeSpeed(); playersMutex->ball_Y_speed = changeSpeed(); - notification_message(notification, &sequence_set_only_blue_255); } else { @@ -229,7 +221,6 @@ int32_t flipper_pong_app() playersMutex->ball_Y_speed = 1; playersMutex->ball_X_direction = 0; playersMutex->player2_score++; - notification_message(notification, &sequence_set_only_red_255); } } else @@ -246,7 +237,6 @@ int32_t flipper_pong_app() playersMutex->ball_Y_speed = 1; playersMutex->ball_X_direction = 1; playersMutex->player1_score++; - notification_message(notification, &sequence_set_only_blue_255); } } } @@ -292,7 +282,6 @@ int32_t flipper_pong_app() view_port_free(view_port); furi_timer_free(timer); furi_record_close(RECORD_GUI); - furi_record_close(RECORD_NOTIFICATION); return 0; -} \ No newline at end of file +} From 2ea789b24bed5ad78a7df195f4e61eefabfe91b9 Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 16:00:58 -0500 Subject: [PATCH 41/64] added nsfw to dap link --- applications/plugins/dap_link/dap_link.c | 35 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/applications/plugins/dap_link/dap_link.c b/applications/plugins/dap_link/dap_link.c index 156e16d05..510540588 100644 --- a/applications/plugins/dap_link/dap_link.c +++ b/applications/plugins/dap_link/dap_link.c @@ -16,6 +16,8 @@ #include #include "DAP_Link_icons.h" +#include "../../settings/desktop_settings/desktop_settings_app.h" + /***************************************************************************/ /****************************** DAP COMMON *********************************/ /***************************************************************************/ @@ -482,22 +484,37 @@ DapConfig* dap_app_get_config(DapApp* app) { int32_t dap_link_app(void* p) { UNUSED(p); + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); if(furi_hal_usb_is_locked()) { DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); DialogMessage* message = dialog_message_alloc(); - dialog_message_set_header(message, "Connection\nis active!", 3, 2, AlignLeft, AlignTop); - dialog_message_set_text( - message, - "Disconnect from\nPC or phone to\nuse this function.", - 3, - 30, - AlignLeft, - AlignTop); + if (settings->sfw_mode) { + dialog_message_set_header(message, "Connection\nis active!", 3, 2, AlignLeft, AlignTop); + dialog_message_set_text( + message, + "Disconnect from\nPC or phone to\nuse this function.", + 3, + 30, + AlignLeft, + AlignTop); + } + else { + dialog_message_set_header(message, "I am not\na whore!", 3, 2, AlignLeft, AlignTop); + dialog_message_set_text( + message, + "Pull out from\nPC or phone to\nuse me like this.", + 3, + 30, + AlignLeft, + AlignTop); + } dialog_message_set_icon(message, &I_ActiveConnection_50x64, 78, 0); dialog_message_show(dialogs, message); dialog_message_free(message); furi_record_close(RECORD_DIALOGS); + free(settings); return -1; } @@ -524,4 +541,4 @@ int32_t dap_link_app(void* p) { dap_app_free(app); return 0; -} \ No newline at end of file +} From f5a4fc424e6dad8b9a27b2661ffd1dc6e84e77c8 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Tue, 10 Jan 2023 22:07:43 +0100 Subject: [PATCH 42/64] Update music_beeper.c --- applications/plugins/music_beeper/music_beeper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/music_beeper/music_beeper.c b/applications/plugins/music_beeper/music_beeper.c index edebbc597..f743e3c98 100644 --- a/applications/plugins/music_beeper/music_beeper.c +++ b/applications/plugins/music_beeper/music_beeper.c @@ -312,7 +312,7 @@ int32_t music_beeper_app(void* p) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options( &browser_options, MUSIC_BEEPER_APP_EXTENSION, &I_music_10px); - browser_options.hide_ext = false; + browser_options.base_path = MUSIC_BEEPER_APP_PATH_FOLDER; DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); From 35751e14272273634777198eb3b4f6fdd6e08416 Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 16:29:12 -0500 Subject: [PATCH 43/64] added nsfw to weather station --- .../images/Scanning_123x52.png | Bin 1690 -> 4092 bytes .../images/Scanning_123x52_sfw.png | Bin 0 -> 1690 bytes .../images/WarningDolphin_45x42.png | Bin 1139 -> 1012 bytes .../images/WarningDolphin_45x42_sfw.png | Bin 0 -> 1139 bytes .../views/weather_station_receiver.c | 20 ++++++++++++++++-- 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 applications/plugins/weather_station/images/Scanning_123x52_sfw.png create mode 100644 applications/plugins/weather_station/images/WarningDolphin_45x42_sfw.png diff --git a/applications/plugins/weather_station/images/Scanning_123x52.png b/applications/plugins/weather_station/images/Scanning_123x52.png index ec785948d035b717944bc41811f73d190e6fc3bd..a48c5330e85c2135866fe99bcb6f3534d06c6d53 100644 GIT binary patch literal 4092 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 N!3~Mzlm%~0{|8*@s)qmo diff --git a/applications/plugins/weather_station/images/Scanning_123x52_sfw.png b/applications/plugins/weather_station/images/Scanning_123x52_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..ec785948d035b717944bc41811f73d190e6fc3bd GIT binary patch literal 1690 zcmaJ?X;2eq7>)>*yJ)S*p|h?~Q6$-f1d>2NNH}5%Lt|z{KrzQc(y-YyStJQ+g^C9Q zSWv-YttjHfh@wyt@GLFhMTjB}M;LSv6%;{^;@J%X_DAW??0&~Q&+|U-`@P@n?x@Hx zJ8Nfa0)b%14d?LjF%^HQmS*_Zy;Prz4^CJ}G`0p!z*2-Nm=GjEMKHicgo!X87D}`~ zG{XJ_!fZF0AR3G2MKHxELKK=XL=B?E*#v@rphhVa%V7)_o@3{?OoMWF~y##kV3^-~Ura#~iQo~#pIF_K28B$0`bDW@qQkN5vj1er#wF+Tj+ z?|%xb1zIIc;=^h*StZ6#E@7!Dl#l0+R;G}k zDeC1D1RjscRj4tcLJV^`ED)C<%48Czw=bJb<4}SjatMt~4q?;jbe~|z8=_EsXfzI; zGR5Vf;$#F?U{hSlXD)k2uBjOiB_5drt7MyCNvH}%fQg)$vYEXwX4ISHN@n&FG$WUU zn<1G__FpGGwS~8jX*%7w_+q;CVFljrD!j4V;}c)t_r;dW2@+`9`eU1O>Hy1H=Z_x? z#)vXQ4`HsunYK6jxY4-M*|zlR`rg;$+V*St8!R`}`J(H(M(Fn4S4n;$pnW-UN$QA` z?fY?KM*pGHedF?8-QC`CtG>sHp2-iZetB?^`cj>4f5g#9o;N06J$3^rWaoX6Zp!iN6AS8ml(v%micb;q2O2KuEfM&;;GfOLnbEbQ;Xh2MB~uUb$O z=Tf34Z;Mngv^s8}xvK?|Q)X5xaeMf&yLz=D);7(;s_;xKaAkeDy_0K?%Yn2|k9C6T z^kdg4x7}!2l%F~e-2N&yKK{I*<bm{PN1M%~EqIS+ z#{g%nih7mt;>v=&E{mA(e4W(c;<>|5`bM6gWBHY@vRSt9LE+^Uhns6zS!2UzZw(cU zoUfWE)n;PLGTwze=xNtR#E5s54 z?u4@P3{ljfm#4cr?==i}&Q~nx+6o_SALMl>7g+8+b*EGr+g0b>QusCdoqSG@XTkT} zJKW>*p7M7!ScsC+I$SWe`PeH**g7LKd+2^e4BT{9(i5Fx*_t#~^L&3q*^<`Bg8SLL zJr^&8Wvz+nlWyNPFyz7qEt>zJmbmY7f19~I|Kz}R|I(kU_SSdG*|X+`TiP_=YR)O9 z%>w2`t#*GaxqGd${KiVYrAK$bi$_|DyT^Fr>F$>+;8w9Tw&Z$d+!FWSfdT)vdK%bz zZxc14Zjp1X%kW^EaVRy?Y1r_3XHB46)J>z~?!08J+0&8}hNJx?^62efuWTu{t@zFL zVZ4jin2pbcGJ}2f!HjR`wC}%p=#A$7DVOR4RjdwPz~ZWrAMHE3V&KiltB9(rl{Yu) zpLzA}yq2xqYW6IxKLj-^F^5Q^3s;lX5 N!3~Mzlm%~0{|8*@s)qmo literal 0 HcmV?d00001 diff --git a/applications/plugins/weather_station/images/WarningDolphin_45x42.png b/applications/plugins/weather_station/images/WarningDolphin_45x42.png index d766ffbb444db1739f2ccd030e506e8bada11ee8..db225de36fe894c0c811e4201bf3ae9b461a6e6e 100644 GIT binary patch delta 1001 zcmVVGd00X8;L_t(| z+QpY^D0^WX$4@7PEF~{o-k{uTUMMw5F3Bh%w-+eNHTO`GTuV~Oy(p9UL5VcXywhoZ#AO91@8nJ3HIc(=$FkzNe?hIvj_GhYt@A zsi~>B2F>p7?$Oba6*z{5hLVz!9335TZEtVi+S)oiJpA_dW>JovogEw*7Z<1hB_$>0 z{{DV{f8TN(Ab)6YZ_muk6bJMpwzg&o z4vj{mP$=r_>v81oyCo$heSLkF;D9llot;BMLX6%G4i5JB_n(@Y;+Ny`@o{~9y{M?j zU1qD&8@$vCVNJtnM7=Pf4VaKEiW8!z{to*4-XI8m9DO?(b3T|nT&gmySuy5(b1Zk8Z+1D=H{NBo}QndbIj4z z)z#9{g8XgfdYB|EEKDkua>=1msZhi6^Yj1YdgQHn=BVi%rj0R#rAMGxPHD!jMBQm;3tqBK%nP z;^E=pXxo;SmY8s$q~S>dnGv?;zXiJ*;3J3^5OF)s4<-XxzK$hC+OjHb+tp`Z5|6kgsC7+cEG{y^4#AVFmmlYVr^ literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& diff --git a/applications/plugins/weather_station/images/WarningDolphin_45x42_sfw.png b/applications/plugins/weather_station/images/WarningDolphin_45x42_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..d766ffbb444db1739f2ccd030e506e8bada11ee8 GIT binary patch literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& literal 0 HcmV?d00001 diff --git a/applications/plugins/weather_station/views/weather_station_receiver.c b/applications/plugins/weather_station/views/weather_station_receiver.c index 42a90b22d..89dbc7a0a 100644 --- a/applications/plugins/weather_station/views/weather_station_receiver.c +++ b/applications/plugins/weather_station/views/weather_station_receiver.c @@ -7,6 +7,8 @@ #include #include +#include "../../../settings/desktop_settings/desktop_settings_app.h" + #define FRAME_HEIGHT 12 #define MAX_LEN_PX 112 #define MENU_ITEMS 4u @@ -176,6 +178,9 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) { FuriString* str_buff; str_buff = furi_string_alloc(); + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); + WSReceiverMenuItem* item_menu; for(size_t i = 0; i < MIN(model->history_item, MENU_ITEMS); ++i) { @@ -200,7 +205,12 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) { canvas_set_color(canvas, ColorBlack); if(model->history_item == 0) { - canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52); + if (settings->sfw_mode) { + canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52_sfw); + } + else { + canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52); + } canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 63, 46, "Scanning..."); canvas_draw_line(canvas, 46, 51, 125, 51); @@ -222,7 +232,12 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) { canvas_draw_icon(canvas, 65, 42, &I_Pin_back_arrow_10x8); canvas_draw_icon(canvas, 80, 42, &I_Pin_back_arrow_10x8); canvas_draw_icon(canvas, 95, 42, &I_Pin_back_arrow_10x8); - canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42); + if (settings->sfw_mode) { + canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42_sfw); + } + else { + canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42); + } canvas_draw_dot(canvas, 17, 61); break; case WSReceiverBarShowUnlock: @@ -235,6 +250,7 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) { canvas_draw_str(canvas, 96, 62, furi_string_get_cstr(model->history_stat_str)); break; } + free(settings); } static void ws_view_receiver_timer_callback(void* context) { From b5985ce5428a14c44ed705f47bb5acb509667b6f Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 16:35:45 -0500 Subject: [PATCH 44/64] added nsfw to pocsag pager --- .../pocsag_pager/images/Scanning_123x52.png | Bin 1690 -> 4092 bytes .../images/Scanning_123x52_sfw.png | Bin 0 -> 1690 bytes .../images/WarningDolphin_45x42.png | Bin 1139 -> 1012 bytes .../images/WarningDolphin_45x42_sfw.png | Bin 0 -> 1139 bytes .../views/pocsag_pager_receiver.c | 20 ++++++++++++++++-- 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 applications/plugins/pocsag_pager/images/Scanning_123x52_sfw.png create mode 100644 applications/plugins/pocsag_pager/images/WarningDolphin_45x42_sfw.png diff --git a/applications/plugins/pocsag_pager/images/Scanning_123x52.png b/applications/plugins/pocsag_pager/images/Scanning_123x52.png index ec785948d035b717944bc41811f73d190e6fc3bd..a48c5330e85c2135866fe99bcb6f3534d06c6d53 100644 GIT binary patch literal 4092 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 N!3~Mzlm%~0{|8*@s)qmo diff --git a/applications/plugins/pocsag_pager/images/Scanning_123x52_sfw.png b/applications/plugins/pocsag_pager/images/Scanning_123x52_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..ec785948d035b717944bc41811f73d190e6fc3bd GIT binary patch literal 1690 zcmaJ?X;2eq7>)>*yJ)S*p|h?~Q6$-f1d>2NNH}5%Lt|z{KrzQc(y-YyStJQ+g^C9Q zSWv-YttjHfh@wyt@GLFhMTjB}M;LSv6%;{^;@J%X_DAW??0&~Q&+|U-`@P@n?x@Hx zJ8Nfa0)b%14d?LjF%^HQmS*_Zy;Prz4^CJ}G`0p!z*2-Nm=GjEMKHicgo!X87D}`~ zG{XJ_!fZF0AR3G2MKHxELKK=XL=B?E*#v@rphhVa%V7)_o@3{?OoMWF~y##kV3^-~Ura#~iQo~#pIF_K28B$0`bDW@qQkN5vj1er#wF+Tj+ z?|%xb1zIIc;=^h*StZ6#E@7!Dl#l0+R;G}k zDeC1D1RjscRj4tcLJV^`ED)C<%48Czw=bJb<4}SjatMt~4q?;jbe~|z8=_EsXfzI; zGR5Vf;$#F?U{hSlXD)k2uBjOiB_5drt7MyCNvH}%fQg)$vYEXwX4ISHN@n&FG$WUU zn<1G__FpGGwS~8jX*%7w_+q;CVFljrD!j4V;}c)t_r;dW2@+`9`eU1O>Hy1H=Z_x? z#)vXQ4`HsunYK6jxY4-M*|zlR`rg;$+V*St8!R`}`J(H(M(Fn4S4n;$pnW-UN$QA` z?fY?KM*pGHedF?8-QC`CtG>sHp2-iZetB?^`cj>4f5g#9o;N06J$3^rWaoX6Zp!iN6AS8ml(v%micb;q2O2KuEfM&;;GfOLnbEbQ;Xh2MB~uUb$O z=Tf34Z;Mngv^s8}xvK?|Q)X5xaeMf&yLz=D);7(;s_;xKaAkeDy_0K?%Yn2|k9C6T z^kdg4x7}!2l%F~e-2N&yKK{I*<bm{PN1M%~EqIS+ z#{g%nih7mt;>v=&E{mA(e4W(c;<>|5`bM6gWBHY@vRSt9LE+^Uhns6zS!2UzZw(cU zoUfWE)n;PLGTwze=xNtR#E5s54 z?u4@P3{ljfm#4cr?==i}&Q~nx+6o_SALMl>7g+8+b*EGr+g0b>QusCdoqSG@XTkT} zJKW>*p7M7!ScsC+I$SWe`PeH**g7LKd+2^e4BT{9(i5Fx*_t#~^L&3q*^<`Bg8SLL zJr^&8Wvz+nlWyNPFyz7qEt>zJmbmY7f19~I|Kz}R|I(kU_SSdG*|X+`TiP_=YR)O9 z%>w2`t#*GaxqGd${KiVYrAK$bi$_|DyT^Fr>F$>+;8w9Tw&Z$d+!FWSfdT)vdK%bz zZxc14Zjp1X%kW^EaVRy?Y1r_3XHB46)J>z~?!08J+0&8}hNJx?^62efuWTu{t@zFL zVZ4jin2pbcGJ}2f!HjR`wC}%p=#A$7DVOR4RjdwPz~ZWrAMHE3V&KiltB9(rl{Yu) zpLzA}yq2xqYW6IxKLj-^F^5Q^3s;lX5 N!3~Mzlm%~0{|8*@s)qmo literal 0 HcmV?d00001 diff --git a/applications/plugins/pocsag_pager/images/WarningDolphin_45x42.png b/applications/plugins/pocsag_pager/images/WarningDolphin_45x42.png index d766ffbb444db1739f2ccd030e506e8bada11ee8..db225de36fe894c0c811e4201bf3ae9b461a6e6e 100644 GIT binary patch delta 1001 zcmVVGd00X8;L_t(| z+QpY^D0^WX$4@7PEF~{o-k{uTUMMw5F3Bh%w-+eNHTO`GTuV~Oy(p9UL5VcXywhoZ#AO91@8nJ3HIc(=$FkzNe?hIvj_GhYt@A zsi~>B2F>p7?$Oba6*z{5hLVz!9335TZEtVi+S)oiJpA_dW>JovogEw*7Z<1hB_$>0 z{{DV{f8TN(Ab)6YZ_muk6bJMpwzg&o z4vj{mP$=r_>v81oyCo$heSLkF;D9llot;BMLX6%G4i5JB_n(@Y;+Ny`@o{~9y{M?j zU1qD&8@$vCVNJtnM7=Pf4VaKEiW8!z{to*4-XI8m9DO?(b3T|nT&gmySuy5(b1Zk8Z+1D=H{NBo}QndbIj4z z)z#9{g8XgfdYB|EEKDkua>=1msZhi6^Yj1YdgQHn=BVi%rj0R#rAMGxPHD!jMBQm;3tqBK%nP z;^E=pXxo;SmY8s$q~S>dnGv?;zXiJ*;3J3^5OF)s4<-XxzK$hC+OjHb+tp`Z5|6kgsC7+cEG{y^4#AVFmmlYVr^ literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& diff --git a/applications/plugins/pocsag_pager/images/WarningDolphin_45x42_sfw.png b/applications/plugins/pocsag_pager/images/WarningDolphin_45x42_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..d766ffbb444db1739f2ccd030e506e8bada11ee8 GIT binary patch literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& literal 0 HcmV?d00001 diff --git a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c b/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c index 972c8dafb..760fcd0fc 100644 --- a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c +++ b/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c @@ -7,6 +7,8 @@ #include #include +#include "../../../settings/desktop_settings/desktop_settings_app.h" + #define FRAME_HEIGHT 12 #define MAX_LEN_PX 112 #define MENU_ITEMS 4u @@ -179,6 +181,9 @@ void pcsg_view_receiver_draw(Canvas* canvas, PCSGReceiverModel* model) { FuriString* str_buff; str_buff = furi_string_alloc(); + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); + PCSGReceiverMenuItem* item_menu; for(size_t i = 0; i < MIN(model->history_item, MENU_ITEMS); ++i) { @@ -204,7 +209,12 @@ void pcsg_view_receiver_draw(Canvas* canvas, PCSGReceiverModel* model) { canvas_set_color(canvas, ColorBlack); if(model->history_item == 0) { - canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52); + if (settings->sfw_mode) { + canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52_sfw); + } + else { + canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52); + } canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 63, 46, "Scanning..."); canvas_draw_line(canvas, 46, 51, 125, 51); @@ -226,7 +236,12 @@ void pcsg_view_receiver_draw(Canvas* canvas, PCSGReceiverModel* model) { canvas_draw_icon(canvas, 65, 42, &I_Pin_back_arrow_10x8); canvas_draw_icon(canvas, 80, 42, &I_Pin_back_arrow_10x8); canvas_draw_icon(canvas, 95, 42, &I_Pin_back_arrow_10x8); - canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42); + if (settings->sfw_mode) { + canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42_sfw); + } + else { + canvas_draw_icon(canvas, 16, 13, &I_WarningDolphin_45x42); + } canvas_draw_dot(canvas, 17, 61); break; case PCSGReceiverBarShowUnlock: @@ -239,6 +254,7 @@ void pcsg_view_receiver_draw(Canvas* canvas, PCSGReceiverModel* model) { canvas_draw_str(canvas, 96, 62, furi_string_get_cstr(model->history_stat_str)); break; } + free(settings); } static void pcsg_view_receiver_timer_callback(void* context) { From 5eb43403eb06ccb1bdba0f4867f15e9718cb3a20 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 00:47:17 +0100 Subject: [PATCH 45/64] cycle shortening --- assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_1/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_10/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_11/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_12/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_13/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_14/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_15/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_16/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_17/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_18/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_19/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_2/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_20/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_21/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_22/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_23/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_24/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_25/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_26/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_27/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_28/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_29/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_3/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_30/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_4/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_5/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_6/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_7/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_8/meta.txt | 2 +- assets/dolphin/external/nsfw/lvl_9/meta.txt | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt index f0fa77e2e..fb0fdb228 100644 --- a/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt +++ b/assets/dolphin/external/nsfw/PaxGod_TikTok_Marketing/meta.txt @@ -7,7 +7,7 @@ Active frames: 1 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 1 Frame rate: 5 -Duration: 3600 +Duration: 360 Active cooldown: 7 Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/nsfw/lvl_1/meta.txt b/assets/dolphin/external/nsfw/lvl_1/meta.txt index ce2a47854..70d1fd018 100644 --- a/assets/dolphin/external/nsfw/lvl_1/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_1/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_10/meta.txt b/assets/dolphin/external/nsfw/lvl_10/meta.txt index 4ca1452a8..0da985c7f 100644 --- a/assets/dolphin/external/nsfw/lvl_10/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_10/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Active cycles: 0 Frame rate: 7 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_11/meta.txt b/assets/dolphin/external/nsfw/lvl_11/meta.txt index 4d5cb4433..4dccc40b3 100644 --- a/assets/dolphin/external/nsfw/lvl_11/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_11/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_12/meta.txt b/assets/dolphin/external/nsfw/lvl_12/meta.txt index d9f9ea390..6ad698fe2 100644 --- a/assets/dolphin/external/nsfw/lvl_12/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_12/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_13/meta.txt b/assets/dolphin/external/nsfw/lvl_13/meta.txt index c874d07bb..68b987d49 100644 --- a/assets/dolphin/external/nsfw/lvl_13/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_13/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 Active cycles: 0 Frame rate: 8 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_14/meta.txt b/assets/dolphin/external/nsfw/lvl_14/meta.txt index 44d736f04..c32dadf26 100644 --- a/assets/dolphin/external/nsfw/lvl_14/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_14/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_15/meta.txt b/assets/dolphin/external/nsfw/lvl_15/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/dolphin/external/nsfw/lvl_15/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_15/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_16/meta.txt b/assets/dolphin/external/nsfw/lvl_16/meta.txt index 5a2562a36..9196e7efa 100644 --- a/assets/dolphin/external/nsfw/lvl_16/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_16/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_17/meta.txt b/assets/dolphin/external/nsfw/lvl_17/meta.txt index db04692ca..87d8674d3 100644 --- a/assets/dolphin/external/nsfw/lvl_17/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_17/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_18/meta.txt b/assets/dolphin/external/nsfw/lvl_18/meta.txt index 22801094f..248ba1feb 100644 --- a/assets/dolphin/external/nsfw/lvl_18/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_18/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_19/meta.txt b/assets/dolphin/external/nsfw/lvl_19/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/dolphin/external/nsfw/lvl_19/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_19/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_2/meta.txt b/assets/dolphin/external/nsfw/lvl_2/meta.txt index 5fdf4c952..30c74a14c 100644 --- a/assets/dolphin/external/nsfw/lvl_2/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_2/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_20/meta.txt b/assets/dolphin/external/nsfw/lvl_20/meta.txt index 6f051aa7b..43dd6af5a 100644 --- a/assets/dolphin/external/nsfw/lvl_20/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_20/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_21/meta.txt b/assets/dolphin/external/nsfw/lvl_21/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/dolphin/external/nsfw/lvl_21/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_21/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_22/meta.txt b/assets/dolphin/external/nsfw/lvl_22/meta.txt index 919490b3d..350c8e366 100644 --- a/assets/dolphin/external/nsfw/lvl_22/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_22/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_23/meta.txt b/assets/dolphin/external/nsfw/lvl_23/meta.txt index c62e04b76..4ed718fa1 100644 --- a/assets/dolphin/external/nsfw/lvl_23/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_23/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_24/meta.txt b/assets/dolphin/external/nsfw/lvl_24/meta.txt index 7e7e55b26..a29a0ddea 100644 --- a/assets/dolphin/external/nsfw/lvl_24/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_24/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_25/meta.txt b/assets/dolphin/external/nsfw/lvl_25/meta.txt index 658cb5ac9..47d4a0191 100644 --- a/assets/dolphin/external/nsfw/lvl_25/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_25/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_26/meta.txt b/assets/dolphin/external/nsfw/lvl_26/meta.txt index 4660b7b7a..d1ce7fc49 100644 --- a/assets/dolphin/external/nsfw/lvl_26/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_26/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_27/meta.txt b/assets/dolphin/external/nsfw/lvl_27/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/dolphin/external/nsfw/lvl_27/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_27/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_28/meta.txt b/assets/dolphin/external/nsfw/lvl_28/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/dolphin/external/nsfw/lvl_28/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_28/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_29/meta.txt b/assets/dolphin/external/nsfw/lvl_29/meta.txt index 827e5b340..240e30716 100644 --- a/assets/dolphin/external/nsfw/lvl_29/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_29/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_3/meta.txt b/assets/dolphin/external/nsfw/lvl_3/meta.txt index 5fdf4c952..30c74a14c 100644 --- a/assets/dolphin/external/nsfw/lvl_3/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_3/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_30/meta.txt b/assets/dolphin/external/nsfw/lvl_30/meta.txt index 4d5cb4433..4dccc40b3 100644 --- a/assets/dolphin/external/nsfw/lvl_30/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_30/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_4/meta.txt b/assets/dolphin/external/nsfw/lvl_4/meta.txt index 019cabf17..721dbe089 100644 --- a/assets/dolphin/external/nsfw/lvl_4/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_4/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_5/meta.txt b/assets/dolphin/external/nsfw/lvl_5/meta.txt index 815e3e173..676c56ed2 100644 --- a/assets/dolphin/external/nsfw/lvl_5/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_5/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_6/meta.txt b/assets/dolphin/external/nsfw/lvl_6/meta.txt index ba81ab2c1..7e408a6e1 100644 --- a/assets/dolphin/external/nsfw/lvl_6/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_6/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_7/meta.txt b/assets/dolphin/external/nsfw/lvl_7/meta.txt index 3e7534cbc..f169de719 100644 --- a/assets/dolphin/external/nsfw/lvl_7/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_7/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/nsfw/lvl_8/meta.txt b/assets/dolphin/external/nsfw/lvl_8/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/dolphin/external/nsfw/lvl_8/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_8/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/nsfw/lvl_9/meta.txt b/assets/dolphin/external/nsfw/lvl_9/meta.txt index 44d736f04..c32dadf26 100644 --- a/assets/dolphin/external/nsfw/lvl_9/meta.txt +++ b/assets/dolphin/external/nsfw/lvl_9/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 From de8bdd4469bcb11401af1c863a66b68989dfd8b1 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 01:51:39 +0100 Subject: [PATCH 46/64] update Wii EC --- applications/plugins/wii_ec_anal/LICENSE | 21 - applications/plugins/wii_ec_anal/README.md | 234 ------ applications/plugins/wii_ec_anal/README.txt | 67 -- applications/plugins/wii_ec_anal/WiiEC.png | Bin 116 -> 0 bytes .../wii_ec_anal/_image_tool/_convert.c | 234 +++--- .../wii_ec_anal/_image_tool/_convert_images.c | 206 ++--- .../wii_ec_anal/_image_tool/_convert_images.h | 66 +- .../wii_ec_anal/_image_tool/_convert_test.c | 82 +- .../plugins/wii_ec_anal/application.fam | 4 +- applications/plugins/wii_ec_anal/bc_logging.h | 54 +- applications/plugins/wii_ec_anal/err.h | 91 +-- applications/plugins/wii_ec_anal/gfx/images.c | 206 ++--- applications/plugins/wii_ec_anal/gfx/images.h | 228 +++--- .../plugins/wii_ec_anal/gfx/img_3x5_0.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_2.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_3.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_4.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_5.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_6.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_7.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_8.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_9.c | 4 +- .../plugins/wii_ec_anal/gfx/img_3x5_v.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_0.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_2.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_3.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_4.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_5.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_6.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_7.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_8.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_9.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_A.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_B.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_C.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_D.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_E.c | 4 +- .../plugins/wii_ec_anal/gfx/img_5x7_F.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_0.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_2.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_3.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_4.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_5.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_6.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_7.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_8.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_9.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_A.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_B.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_C.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_D.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_E.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_F.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_G.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_X.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_Y.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_Z.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_d_.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_n_.c | 4 +- .../plugins/wii_ec_anal/gfx/img_6x8_v_.c | 4 +- .../plugins/wii_ec_anal/gfx/img_RIP.c | 118 ++- .../plugins/wii_ec_anal/gfx/img_cc_Cable.c | 14 +- .../plugins/wii_ec_anal/gfx/img_cc_Joy.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_Main.c | 80 +- .../plugins/wii_ec_anal/gfx/img_cc_btn_A1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_btn_B1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_btn_X1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c | 4 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_L1.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_L2.c | 22 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_L3.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_L4.c | 18 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_R1.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_R2.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_R3.c | 10 +- .../plugins/wii_ec_anal/gfx/img_cc_trg_R4.c | 21 +- .../plugins/wii_ec_anal/gfx/img_csLogo_FULL.c | 84 +- .../wii_ec_anal/gfx/img_csLogo_Small.c | 10 +- .../plugins/wii_ec_anal/gfx/img_ecp_SCL.c | 10 +- .../plugins/wii_ec_anal/gfx/img_ecp_SDA.c | 8 +- .../plugins/wii_ec_anal/gfx/img_ecp_port.c | 48 +- .../plugins/wii_ec_anal/gfx/img_key_Back.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_D.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_L.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_OK.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_OKi.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_R.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_U.c | 5 +- .../plugins/wii_ec_anal/gfx/img_key_Ui.c | 5 +- .../plugins/wii_ec_anal/i2c_workaround.h | 128 ++- applications/plugins/wii_ec_anal/notes.txt | 87 -- applications/plugins/wii_ec_anal/wii_anal.c | 765 +++++++++--------- applications/plugins/wii_ec_anal/wii_anal.h | 118 +-- .../plugins/wii_ec_anal/wii_anal_ec.c | 182 ++--- .../plugins/wii_ec_anal/wii_anal_ec.h | 12 +- .../plugins/wii_ec_anal/wii_anal_keys.c | 414 +++++----- .../plugins/wii_ec_anal/wii_anal_keys.h | 18 +- .../plugins/wii_ec_anal/wii_anal_lcd.c | 323 +++----- .../plugins/wii_ec_anal/wii_anal_lcd.h | 58 +- .../plugins/wii_ec_anal/wii_anal_ver.h | 10 +- applications/plugins/wii_ec_anal/wii_ec.c | 400 ++++----- applications/plugins/wii_ec_anal/wii_ec.h | 210 ++--- .../plugins/wii_ec_anal/wii_ec_classic.c | 575 ++++++------- .../plugins/wii_ec_anal/wii_ec_classic.h | 69 +- .../plugins/wii_ec_anal/wii_ec_macros.h | 150 ++-- .../plugins/wii_ec_anal/wii_ec_nunchuck.c | 715 ++++++++-------- .../plugins/wii_ec_anal/wii_ec_nunchuck.h | 53 +- .../plugins/wii_ec_anal/wii_ec_udraw.c | 160 ++-- .../plugins/wii_ec_anal/wii_ec_udraw.h | 20 +- applications/plugins/wii_ec_anal/wii_i2c.c | 364 +++++---- applications/plugins/wii_ec_anal/wii_i2c.h | 24 +- 116 files changed, 3220 insertions(+), 3885 deletions(-) delete mode 100644 applications/plugins/wii_ec_anal/LICENSE delete mode 100644 applications/plugins/wii_ec_anal/README.md delete mode 100644 applications/plugins/wii_ec_anal/README.txt delete mode 100644 applications/plugins/wii_ec_anal/WiiEC.png delete mode 100644 applications/plugins/wii_ec_anal/notes.txt diff --git a/applications/plugins/wii_ec_anal/LICENSE b/applications/plugins/wii_ec_anal/LICENSE deleted file mode 100644 index 95e544a06..000000000 --- a/applications/plugins/wii_ec_anal/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 BlueChip - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/plugins/wii_ec_anal/README.md b/applications/plugins/wii_ec_anal/README.md deleted file mode 100644 index 8d439c7e0..000000000 --- a/applications/plugins/wii_ec_anal/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# [FlipperZero] Wii Extension Controller Protocol Analyser -This Protocol Analyser offers a full Test and Calibrate system for Wii Extension Controllers. - -__Disclaimer:__ *Use of this plugin, and notably connecting an Extension Controller to the FlipperZero is performed entirely at your own risk.* - -# Notes -This plugin has (todate) only been tested with official Nintendo Nunchucks and Classic Controllers - namely Nunchucks and Classic Controllers. - -# Encryption -This plugin has SOME code to handle encryption, but it it unused, untested, and some of it is known to un-work. - -This plugin (currently) only works with Extension Controllers which implement the encryption-bypass strategy. IE. `i2c_write(0xf0, 0x55) ; i2c_write(0xfb, 0x00)` - -If you need this functionality, either raise an Issue or, better still, a Pull Request. - -# Screen: SPLASH -
-The SPLASH Screen is displayed when the Plugin starts. It can be cleared by pressing any key, else it will auto-clear after 3.5 seconds. - -# Screen: WAIT -   

-The WAIT screen will display which pins you need to connect between the flipper and the Wii Extension Controller. - -__Disclaimer:__ Use of this plugin, and notably connecting the Controller to the FlipperZero is performed entirely at your own risk. - -Looking in to the exposed side of the Extension Controller plug, with the notch on the bottom - -| EC Pin # | EC Position | EC Pin ID | Pin Function | FZ GPIO Pin Name | FZ GPIO Pin # | -| :---: | :---: | :---: | :---: | :---: | :---: | -| 1 | top-left | +3v3 | Power | 3v3 | 9 | -| 2 | bottom-left | SCL | i2c clock | C0 | 16 | -| 3 | top-centre | EN | ¿detect? | | | -| 4 | bottom-centre | -x- | -none- | | | -| 5 | top-right | SDA | i2c data | C1 | 15 | -| 6 | bottom-right | Gnd | Power | Gnd | 18 | - -Keys: -* Left - Show splash screen -* Back - exit plugin - -The easiest way to connect a Wii Extension Controller to a FlipperZero is arguably with a ["WiiChuck"](https://www.ebay.co.uk/sch/?_nkw=wiichuck) or a ["Nunchucky"](https://www.solarbotics.com/product/31040)

- - - - - -
WiiChuckNunchucky
- -### ** WARNING ** -Neither the WiiChuck, nor the Nunchucky have a pin polarisation mechanism.
-If you plug the adaptor in the wrong way around you WILL apply voltage to the Controller the wrong way round!!
-I have no idea if THIS WILL PERMANENTLY KILL THE CONTROLLER ...Who wants to try it? - -On all the WiiChucks I have seen: -* The WiiChuck has THREE connectors on one side, and TWO connectors on the other. -* The side with TWO connectors should go against the side of the Controller plug with the big indent. -``` -+-------------+ -| _________ | -| | = = = | | -| |_=_____=_| | <-- notice missing pin -| ___ | -| | | | <-- notice indent -+----+ +----+ -``` -
- -...BUT I *highly* recommend you check the pins on your adaptor to make sure everything goes well. - -I believe the unconnected pin on the top is a "presence detect" function, but I have not (yet) verified this.
-This feature is NOT required by this plugin, as the detection is performed by means of an i2c handshake. - -When a device is connected it will be immediately recognised. If it is not, either: -* The Controller is not correctly connected
-...This may be as simple as a broken wire. -* The controller board in the Controller is faulty.
-...Repair of which is beyond the scope of this document. - -To get the list of "known" Controllers, run `./info.sh`
-As of writing this, that returns: -```c -[PID_UNKNOWN ] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "Unknown Perhipheral", SCENE_DUMP, -[PID_NUNCHUCK ] = { {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00}, "Nunchuck", SCENE_NUNCHUCK, -[PID_CLASSIC ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}, "Classic Controller", SCENE_CLASSIC, -[PID_BALANCE ] = { {0x00, 0x00, 0xA4, 0x20, 0x04, 0x02}, "Balance Board", SCENE_DUMP, -[PID_GH_GUITAR ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero Guitar", SCENE_DUMP, -[PID_GH_DRUMS ] = { {0x01, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero World Tour Drums", SCENE_DUMP, -[PID_TURNTABLE ] = { {0x03, 0x00, 0xA4, 0x20, 0x01, 0x03}, "DJ Hero Turntable", SCENE_DUMP, -[PID_TAIKO_DRUMS] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x11}, "Taiko Drum Controller)", SCENE_DUMP, - -``` - -You can see that there are EIGHT known devices. One is the default for an unknown controller; SEVEN devices are known by name; and TWO (of those seven) have bespoke "scenes" (ie. SCENE_NUNCHUCK & SCENE_CLASSIC). - -# Screen: NUNCHUCK - MAIN -
-When you connect a Nunchuck, you will see a screen displaying: -* Accelerometer{X,Y,Z} values -* Joystick{X,Y} values -* Joystick graphic -* Button{C,Z} - -Keys: -* Left - Go to the DUMP screen -* Right - Go to the NUNCHUCK_ACC accelerometers screen -* Up/Down/OK - [qv. Peak Meters] -* Short-Back - Reset controller -* Long-Back - Exit plugin - -# Screen: NUNCHUCK - ACCELEROMETERS - -   
- -| Axis | Movement | Lower | Higher | -| :---: | :---: | :---: | :---: | -| X | Left / Right | Left | Right | -| Y | Fwd / Bkwd | Fwd | Bkwd | -| Z | Down / Up | Down | Up | - -* Movement in the direction of an axis changes that axis reading -* Twisting/tilting around an axis changes the other two readings -* EG. - * Move left (along the X axis) will effect X - * Turn left (a rotation around the Y axis) will effect X and Z - -Keys: -* Left - go to the main NUNCHUCK screen -* Up - * Auto-Pause Disabled --> Enable Auto-Pause - * Paused at the end of a page --> Restart scanner - * Running with Auto-Pause Enabled --> Disable Auto-Pause -* Nunchuck-Z - Toggle pause -* Nunchuck-C - Toggle auto-pause -* Long-OK - Enter Software Calibration mode [qv. Calibration] - * Calibration mode on the Accelerometer screen will ONLY calibrate the accelerometer -* Short-OK - Leave Software Calibration mode *and* Calibrate CENTRE position(s) -* Short-Back - Reset controller -* Long-Back - Exit plugin - -NB. Code DOES exist to scroll the display, but the LCD refresh rate is too low, and it looks awful - -# Screen: CLASSIC -
-When you connect a Classic Controller [Pro], you will see a screen displaying a Classic Controller -* The Classic Controller will animate in line with controller events -* The scan rate is set to 30fps, but in reality there is a bit of lag with the LCD screen, so YMMV. - -Keys: -* Left - go to the DUMP screen -* Right - show analogue readings (Left to hide them again) -* Up/Down/OK - [qv. Peak Meters] -* Short-Back - Reset controller -* Long-Back - Exit plugin - -# Screen: DUMP -
-The Dump screen will show you the raw readings from the device.
-If you connect a device which does not have a bespoke `_decode()` function (etc.), you will see (only) this screen. -* SID - String ID - human-readable name (from the `info` table) -* PID - Peripheral ID - The 6 bytes which identify the device. -* Cal - Calibration data - 16 bytes -* The bottom row of hex shows the SIX bytes of Controller data - * Below each hex digit is the binary representation of that digit - * By example. With a Nunchuck connected, click the Z button, and watch the bit on the far right - -Keys: -* Right - return to controller-specific screen (if there is one) -* Short-Back - Reset controller -* Long-Back - Exit plugin - -# Peak Meters (Calibration values) - -On any Controller-specific screen with a Peak/Trough menu displayed: -* Up - [toggle] only show peak values -* Down - [toggle] only show trough values -* Long-OK - Enter Software Calibration mode [qv. Calibration] -* Short-OK - Leave Software Calibration mode / Calibrate CENTRE position(s) - -# Calibration -
- -* __This project handles Calibration of Analogue Controls, but has NO understanding of Accelerometer values (yet).__ - -Digital buttons do NOT require Calibration. - -Some Calibration data is calculated at the factory, and stored in memory (¿OTP?) on the Controller. - -Each device has a different way to interpret the Calibration Data.
-EG. A Nunchuck has one joystick, and an accelerometer ...whereas a Classic Controller has 2 joysticks and 2 analogue buttons. - -I have personally found the calibration data to be inaccurate (when compared to actual readings), I guess Controllers drift over the years‽ -If the factory-values LIMIT movement, this is easily resolved - by expanding them on-the-fly.
-BUT, I have seen Controllers with factory calibration data that suggests the limits are FURTHER than the joystick can reach ...and this requires a full re-calibration of the Controller! - -Probably the best way to calibrate is to: -* Take a/some reading(s) while the Controller is 'at rest', IE. perfectly still and level. -* Move the Controller to all extremes and store the extreme {peak/trough} values. - -Nintendo (allegedly) take the 'at rest' reading immediately after the Controller is connected, and a 're-calibration' can be performed at any time by pressing {`A`, `B`, `+`, `-`} at the same time, for at least 3 seconds. Although I have no details on what this actually does. - -### This tool calibrates as such: -* When the Controller is first recognised - * The factory Calibration data is used to decide the Centre/Middle position and extreme values (eg. far-left & far-right) for each analogue Control -* Long-OK button press (on the FlipperZero) ...Do NOT touch ANY of the analogue controllers while you are pressing Long-OK - * Start the calibrate button flashing - * Take the current reading as the Centre position - * Set the range limits to "no range" - * You must now move the Control between its extremes, so the code can work out the new Calibration/range/peak+trough values - * When done, press Short-OK to end Software Calibration mode -* Short-OK button press (on the FlipperZero) ...Do NOT touch ANY of the analogue controllers while you are pressing Short-OK - * Stop the calibrate button flashing - * Calibrate the centre position of all analogue controls (accelerometers not supported (yet)) - -# Screen: DEBUG -
-On any screen (except SPLASH) you may press Long-Down to enter Debug mode. - -You can (at any time) attach to the FlipperZero (via USB) with a serial console {`minicom`, `putty`, whatever} and start the `log` function to see the debug messages. - -When you enter the DEBUG screen, the real-time scanner will be stopped. And the following keys made available: -* Up - Attempt to initialise the attached Controller -* OK - Take a reading from the attached Controller -* Long-Down - Restart the real-time scanner and return to the WAIT screen - -You can limit the messages at compile-time [see `./info.sh`], or at runtime [FZ->Settings->System->LogLevel]
- -[This is probably irrelevant since the introduction of FAP support]
-If you have memory issues, limiting the messages at compile-time will make the plugin smaller.
-But (¿obviously?) the more you limit the messsages, the less debug information will be sent to the logger. - -# TODO - -* FZ Bug: At the time of writing this, there are problems with the i2c FZ functions [qv `i2c_workaround.c`] - diff --git a/applications/plugins/wii_ec_anal/README.txt b/applications/plugins/wii_ec_anal/README.txt deleted file mode 100644 index e7ebe7a4c..000000000 --- a/applications/plugins/wii_ec_anal/README.txt +++ /dev/null @@ -1,67 +0,0 @@ - ,-------. ----( Files )--- - `-------' - - README.md - User Manual : Body [github markdown] - _images/ - User Manual : Images - _images/GIMP/ - User Manual : GIMP image masters - - LICENSE - Tech Docs : MIT Licence file - README.txt - Tech Docs : Dev notes - notes.txt - Tech Docs : Random dev notes - info.sh - Tech Docs : Retrieve info from source code - - application.fam - FAP : Header file - WiiEC.png - FAP : Icon {10x10} - - gfx/ - Analyser : Images [generated by bc_image_tool] - wii_anal.c|h - Analyser : Main application - wii_anal_ec.c|h - Analyser : Extension controller actions - wii_anal_keys.c|h - Analyser : Keyboard handling - wii_anal_lcd.c|h - Analyser : LCD handling - - i2c_workaround.h - Temporary workaround for i2c bug in FZ code - err.h - Errors - bc_logging.h - Logging macros - especially LOG_LEVEL - - wii_i2c.c|h - i2c functionality - - wii_ec.c|h - Extension Controller basic functions - wii_ec_macros.h - Bespoke Extension Controller handy-dandy MACROs - wii_ec_classic.c|h - EC: Classic Controller Pro scene - wii_ec_nunchuck.c|h - EC: Nunchuck scene - wii_ec_udraw.c|h - EC: UDraw scene - not written - - ,----------------------------------. ----( Adding a new Extension Controller )--- - `----------------------------------' - -//! I'll finish this when I write the UDraw code - -Create a new Extension Controller called "mydev" - -Create wii_ec_mydev.c and wii_ec_mydev.h - -In wii_ec_mydev.c|h - Create the functions [& prototypes] - bool mydev_init (wiiEC_t* const) ; // Additional initialisation code - void mydev_decode (wiiEC_t* const) ; // Decode controller input data - void mydev_msg (wiiEC_t* const, FuriMessageQueue* const) ; // Put event messages in the event queue - void mydev_calib (wiiEC_t* const, ecCalib_t) ; // Controller calibration function - void mydev_show (Canvas* const, state_t* const) ; // Scene LCD display - bool mydev_key (const eventMsg_t* const, state_t* const) ; // Scene key controls - -In wii_ec.h - Include the new header - #include "wii_ec_mydev.h" - Add a perhipheral id to enum ecPid - PID_MYDEV - -In wii_anal.h - As a scene name to enum scene - SCENE_MYDEV - -In wii_ec.c - Add the device definition to the ecId[] array - [PID_MYDEV] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "My Device", SCENE_MYDEV, - mydev_init, mydev_decode, mydev_msg, mydev_calib, mydev_show, mydev_key }, diff --git a/applications/plugins/wii_ec_anal/WiiEC.png b/applications/plugins/wii_ec_anal/WiiEC.png deleted file mode 100644 index 6e1afcb0cdf4edb2b6ed8877a7f4abee7cc18eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihsko;mLT)4~l} zNhv8QPR|xh! O7zR&QKbLh*2~7YOV #include -int main(int argc, char* argv[]) { - const unsigned char* pp = NULL; - uint32_t pix = 0; - int bit = 0; +int main (int argc, char* argv[]) +{ + const unsigned char* pp = NULL; + uint32_t pix = 0; + int bit = 0; - uint8_t b = 0; - uint8_t bcnt = 0; + uint8_t b = 0; + uint8_t bcnt = 0; - unsigned int lcnt = 0; - static const int lmax = 16; // max hex values per line + unsigned int lcnt = 0; + static const int lmax = 16; // max hex values per line - uint8_t* buf = NULL; - uint8_t* bp = NULL; - unsigned int blen = 0; + uint8_t* buf = NULL; + uint8_t* bp = NULL; + unsigned int blen = 0; - uint8_t* cmp = NULL; - uint8_t* cp = NULL; - unsigned int clen = 0; - uint8_t ctag = 0xFF; - uint32_t tag[256] = {0}; - uint32_t tmax = UINT32_MAX; + uint8_t* cmp = NULL; + uint8_t* cp = NULL; + unsigned int clen = 0; + uint8_t ctag = 0xFF; + uint32_t tag[256] = {0}; + uint32_t tmax = UINT32_MAX; - unsigned int x, y, z; + unsigned int x, y, z; - const char* name = argv[1]; - FILE* fh = fopen(argv[2], "wb"); + const char* name = argv[1]; + FILE* fh = fopen(argv[2], "wb"); - uint32_t white = 0xFF; + uint32_t white = 0xFF; - int rv = 0; // assume success + int rv = 0; // assume success - // allocate buffers - blen = ((img.w * img.h) + 0x7) >> 3; - bp = (buf = calloc(blen + 1, 1)); - cp = (cmp = calloc(blen + 4, 1)); + // allocate buffers + blen = ((img.w * img.h) +0x7) >>3; + bp = (buf = calloc(blen +1, 1)); + cp = (cmp = calloc(blen +4, 1)); - // sanity check - if(!fh || !buf || !cmp) { - printf("! fopen() or malloc() fail.\n"); - rv = 255; - goto bail; - } + // sanity check + if (!fh || !buf || !cmp) { + printf("! fopen() or malloc() fail.\n"); + rv = 255; + goto bail; + } - // Find white value - for(x = 1; x < img.bpp; x++) white = (white << 8) | 0xFF; + // Find white value + for (x = 1; x < img.bpp; x++) + white = (white << 8) | 0xFF ; - // build bit pattern - // create the comment as we go - for(pp = img.b, y = 0; y < img.h; y++) { - fprintf(fh, "// "); - for(x = 0; x < img.w; x++) { - // read pixel - for(pix = 0, z = 0; z < img.bpp; pix = (pix << 8) | *pp++, z++) - ; - // get bit and draw - if(pix < white) { - b = (b << 1) | 1; - fprintf(fh, "##"); - } else { - b <<= 1; - fprintf(fh, ".."); - } - // got byte - if((++bcnt) == 8) { - *bp++ = b; - tag[b]++; - bcnt = (b = 0); - } - } - fprintf(fh, "\n"); - } - fprintf(fh, "\n"); - // padding - if(bcnt) { - b <<= (bcnt = 8 - bcnt); - *bp++ = b; - tag[b]++; - } - // Kill the compression - *bp = ~bp[-1]; // https://youtube.com/clip/Ugkx-JZIr16hETy7hz_H6yIdKPtxVe8C5w_V + // build bit pattern + // create the comment as we go + for (pp = img.b, y = 0; y < img.h; y++) { + fprintf(fh, "// "); + for (x = 0; x < img.w; x++) { + // read pixel + for (pix = 0, z = 0; z < img.bpp; pix = (pix << 8) | *pp++, z++) ; + // get bit and draw + if (pix < white) { + b = (b << 1) | 1; + fprintf(fh, "##"); + } else { + b <<= 1; + fprintf(fh, ".."); + } + // got byte + if ((++bcnt) == 8) { + *bp++ = b; + tag[b]++; + bcnt = (b = 0); + } + } + fprintf(fh, "\n"); + } + fprintf(fh, "\n"); + // padding + if (bcnt) { + b <<= (bcnt = 8 - bcnt); + *bp++ = b; + tag[b]++; + } + // Kill the compression + *bp = ~bp[-1]; // https://youtube.com/clip/Ugkx-JZIr16hETy7hz_H6yIdKPtxVe8C5w_V - // Byte run length compression - // Find a good tag - for(x = 0; tmax && (x < 256); x++) { - if(tag[x] < tmax) { - tmax = tag[x]; - ctag = x; - } - } + // Byte run length compression + // Find a good tag + for (x = 0; tmax && (x < 256); x++) { + if (tag[x] < tmax) { + tmax = tag[x]; + ctag = x; + } + } - // compress the data - for(bp = buf, x = 0; (clen < blen) && (x < blen); x++) { - // need at least 4 the same to be worth it - // must compress tag (if it occurs) - if((bp[x] == bp[x + 1]) && (bp[x] == bp[x + 2]) && (bp[x] == bp[x + 3]) || - (bp[x] == ctag)) { - for(y = 1; (y < 255) && (bp[x] == bp[x + y]); y++) - ; - *cp++ = ctag; // tag - *cp++ = y; // length - *cp++ = bp[x]; // byte - x += y - 1; - clen += 3; - } else { - *cp++ = bp[x]; - clen++; - } - } + // compress the data + for (bp = buf, x = 0; (clen < blen) && (x < blen); x++) { + // need at least 4 the same to be worth it + // must compress tag (if it occurs) + if ((bp[x] == bp[x+1]) && (bp[x] == bp[x+2]) && (bp[x] == bp[x+3]) || (bp[x] == ctag)) { + for (y = 1; (y < 255) && (bp[x] == bp[x+y]); y++) ; + *cp++ = ctag; // tag + *cp++ = y; // length + *cp++ = bp[x]; // byte + x += y -1; + clen += 3; + } else { + *cp++ = bp[x]; + clen++; + } + } - // create struct - fprintf(fh, "#include \"images.h\"\n\n"); - fprintf(fh, "const image_t img_%s = { %d, %d, ", name, img.w, img.h); + // create struct + fprintf(fh, "#include \"images.h\"\n\n"); + fprintf(fh, "const image_t img_%s = { %d, %d, ", name, img.w, img.h); - if(clen < blen) { // dump compressed? - fprintf( - fh, - "true, %d, 0x%02X, { // orig:%d, comp:%.2f%%\n\t", - clen, - ctag, - blen, - 100.0 - ((clen * 100.0) / blen)); - for(x = 0; x < clen; x++) - if(x == clen - 1) - fprintf(fh, "0x%02X\n}};\n", cmp[x]); - else - fprintf(fh, "0x%02X%s", cmp[x], (!((x + 1) % 16)) ? ",\n\t" : ", "); + if (clen < blen) { // dump compressed? + fprintf(fh, "true, %d, 0x%02X, { // orig:%d, comp:%.2f%%\n\t", + clen, ctag, blen, 100.0-((clen*100.0)/blen)); + for (x = 0; x < clen; x++) + if (x == clen -1) fprintf(fh, "0x%02X\n}};\n", cmp[x]) ; + else fprintf(fh, "0x%02X%s", cmp[x], (!((x+1)%16)) ? ",\n\t" : ", ") ; - } else { // dump UNcompressed - fprintf(fh, "false, %d, 0, {\n\t", blen); - for(x = 0; x < blen; x++) - if(x == blen - 1) - fprintf(fh, "0x%02X\n}};\n", buf[x]); - else - fprintf(fh, "0x%02X%s", buf[x], (!((x + 1) % 16)) ? ",\n\t" : ", "); - } + } else { // dump UNcompressed + fprintf(fh, "false, %d, 0, {\n\t", blen); + for (x = 0; x < blen; x++) + if (x == blen -1) fprintf(fh, "0x%02X\n}};\n", buf[x]) ; + else fprintf(fh, "0x%02X%s", buf[x], (!((x+1)%16)) ? ",\n\t" : ", ") ; + } bail: - if(fh) fclose(fh); - if(buf) free(buf); - if(cmp) free(cmp); + if (fh) fclose(fh) ; + if (buf) free(buf) ; + if (cmp) free(cmp) ; - return rv; + return rv; } diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.c b/applications/plugins/wii_ec_anal/_image_tool/_convert_images.c index e8ab899f7..57046e9a3 100644 --- a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.c +++ b/applications/plugins/wii_ec_anal/_image_tool/_convert_images.c @@ -1,49 +1,55 @@ -#include // GUI (screen/keyboard) API +#include // GUI (screen/keyboard) API -#include "images.h" +#include "images.h" //----------------------------------------------------------------------------- ---------------------------------------- -static Canvas* _canvas; -static uint8_t _tlx; -static uint8_t _tly; +static Canvas* _canvas; +static uint8_t _tlx; +static uint8_t _tly; -static uint8_t _x; -static uint8_t _y; +static uint8_t _x; +static uint8_t _y; -static const image_t* _img; +static const image_t* _img; -static bool _blk; -static Color _set; -static Color _clr; +static bool _blk; +static Color _set; +static Color _clr; //+============================================================================ -static void _showByteSet(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(b & m) // plot only SET bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteSet (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if (b & m) // plot only SET bits + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ -static void _showByteClr(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(!(b & m)) // plot only CLR bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteClr (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if (!(b & m)) // plot only CLR bits + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ -static void _showByteAll(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if((!!(b & m)) ^ _blk) { // Change colour only when required - canvas_set_color(_canvas, ((b & m) ? _set : _clr)); - _blk = !_blk; - } - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteAll (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if ((!!(b & m)) ^ _blk) { // Change colour only when required + canvas_set_color(_canvas, ((b & m) ? _set : _clr)); + _blk = !_blk; + } + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ @@ -55,83 +61,81 @@ static void _showByteAll(const uint8_t b) { // SHOW_ALL - plot all images pixels as they are // SHOW_ALL_INV - plot all images pixels inverted // -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode) { - void (*fnShow)(const uint8_t) = NULL; +void show (Canvas* const canvas, const uint8_t tlx, const uint8_t tly, + const image_t* img, const showMode_t mode) +{ + void(*fnShow)(const uint8_t) = NULL; - const uint8_t* bp = img->data; + const uint8_t* bp = img->data; - // code size optimisation - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - _set = ColorBlack; - _clr = ColorWhite; - break; + // code size optimisation + switch (mode & SHOW_INV_) { + case SHOW_NRM_: + _set = ColorBlack; + _clr = ColorWhite; + break; - case SHOW_INV_: - _set = ColorWhite; - _clr = ColorBlack; - break; + case SHOW_INV_: + _set = ColorWhite; + _clr = ColorBlack; + break; - case SHOW_BLK_: - canvas_set_color(canvas, ColorBlack); - break; + case SHOW_BLK_: + canvas_set_color(canvas, ColorBlack); + break; - case SHOW_WHT_: - canvas_set_color(canvas, ColorWhite); - break; - } - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - case SHOW_INV_: - fnShow = _showByteAll; - canvas_set_color(canvas, ColorWhite); - _blk = 0; - break; + case SHOW_WHT_: + canvas_set_color(canvas, ColorWhite); + break; - case SHOW_BLK_: - case SHOW_WHT_: - switch(mode & SHOW_ALL_) { - case SHOW_SET_: - fnShow = _showByteSet; - break; - case SHOW_CLR_: - fnShow = _showByteClr; - break; - } - break; - } - furi_check(fnShow); + } + switch (mode & SHOW_INV_) { + case SHOW_NRM_: + case SHOW_INV_: + fnShow = _showByteAll; + canvas_set_color(canvas, ColorWhite); + _blk = 0; + break; - // I want nested functions! - _canvas = canvas; - _img = img; - _tlx = tlx; - _tly = tly; - _x = 0; - _y = 0; + case SHOW_BLK_: + case SHOW_WHT_: + switch (mode & SHOW_ALL_) { + case SHOW_SET_: + fnShow = _showByteSet; + break; + case SHOW_CLR_: + fnShow = _showByteClr; + break; + } + break; + } + furi_check(fnShow); - // Compressed - if(img->c) { - for(unsigned int i = 0; i < img->len; i++, bp++) { - // Compressed data? {tag, length, value} - if(*bp == img->tag) { - for(uint16_t c = 0; c < bp[1]; c++) fnShow(bp[2]); - bp += 3 - 1; - i += 3 - 1; + // I want nested functions! + _canvas = canvas; + _img = img; + _tlx = tlx; + _tly = tly; + _x = 0; + _y = 0; - // Uncompressed byte - } else { - fnShow(*bp); - } - } + // Compressed + if (img->c) { + for (unsigned int i = 0; i < img->len; i++, bp++) { + // Compressed data? {tag, length, value} + if (*bp == img->tag) { + for (uint16_t c = 0; c < bp[1]; c++) fnShow(bp[2]) ; + bp += 3 -1; + i += 3 -1; - // Not compressed - } else { - for(unsigned int i = 0; i < img->len; i++, bp++) fnShow(*bp); - } + // Uncompressed byte + } else { + fnShow(*bp); + } + } + + // Not compressed + } else { + for (unsigned int i = 0; i < img->len; i++, bp++) fnShow(*bp) ; + } } diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.h b/applications/plugins/wii_ec_anal/_image_tool/_convert_images.h index 1743cb409..bfc44568e 100644 --- a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.h +++ b/applications/plugins/wii_ec_anal/_image_tool/_convert_images.h @@ -1,53 +1,53 @@ -#ifndef IMAGES_H_ -#define IMAGES_H_ +#ifndef IMAGES_H_ +#define IMAGES_H_ #include #include //----------------------------------------------------------------------------- ---------------------------------------- -typedef enum showMode { - // {INV:--:WHT:BLK::--:--:CLR:SET} - SHOW_SET_ = 0x01, - SHOW_CLR_ = 0x02, - SHOW_ALL_ = SHOW_SET_ | SHOW_CLR_, +typedef + enum showMode { + // {INV:--:WHT:BLK::--:--:CLR:SET} + SHOW_SET_ = 0x01, + SHOW_CLR_ = 0x02, + SHOW_ALL_ = SHOW_SET_ | SHOW_CLR_, - SHOW_BLK_ = 0x10, - SHOW_WHT_ = 0x20, - SHOW_NRM_ = 0x00, - SHOW_INV_ = SHOW_BLK_ | SHOW_WHT_, + SHOW_BLK_ = 0x10, + SHOW_WHT_ = 0x20, + SHOW_NRM_ = 0x00, + SHOW_INV_ = SHOW_BLK_ | SHOW_WHT_, - SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_, - SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_, + SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_, + SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_, - SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_, - SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_, + SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_, + SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_, - SHOW_ALL = SHOW_ALL_ | SHOW_NRM_, - SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_, -} showMode_t; + SHOW_ALL = SHOW_ALL_ | SHOW_NRM_, + SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_, + } +showMode_t; //----------------------------------------------------------------------------- ---------------------------------------- -typedef struct image { - uint8_t w; // width - uint8_t h; // height - bool c; // compressed? - uint16_t len; // image data length - uint8_t tag; // rle tag - uint8_t data[]; // image data -} image_t; +typedef + struct image { + uint8_t w; // width + uint8_t h; // height + bool c; // compressed? + uint16_t len; // image data length + uint8_t tag; // rle tag + uint8_t data[]; // image data + } +image_t; //----------------------------------------------------------------------------- ---------------------------------------- //[TAG] //----------------------------------------------------------------------------- ---------------------------------------- #ifndef IMGTEST -#include -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode); +# include + void show (Canvas* const canvas, const uint8_t tlx, const uint8_t tly, + const image_t* img, const showMode_t mode) ; #endif #endif //IMAGES_H_ diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_test.c b/applications/plugins/wii_ec_anal/_image_tool/_convert_test.c index fdc2ee946..4bdb531d5 100644 --- a/applications/plugins/wii_ec_anal/_image_tool/_convert_test.c +++ b/applications/plugins/wii_ec_anal/_image_tool/_convert_test.c @@ -1,59 +1,59 @@ -#include -#include +#include +#include -#include "images.h" +#include "images.h" //----------------------------------------------------------------------------- // This will be the plot function out of your graphics library // -#define PLOT(x, y, c) \ - do { \ - printf("%s", (c ? "#" : ".")); \ - if(x == img->w - 1) printf("\n"); \ - } while(0) +#define PLOT(x,y,c) do { \ + printf("%s", (c ? "#" : ".")); \ + if (x == img->w -1) printf("\n") ; \ +}while(0) //+============================================================================ // The pain we endure to avoid code duplication cleanly // -#define PLOTBYTE(b) \ - do { \ - for(uint8_t m = 0x80; m; m >>= 1) { \ - PLOT(x, y, (b & m)); \ - if(((++x) == img->w) && !(x = 0) && ((++y) == img->h)) break; \ - } \ - } while(0) +#define PLOTBYTE(b) do { \ + for (uint8_t m = 0x80; m; m>>=1) { \ + PLOT(x,y, (b & m)); \ + if ( ((++x) == img->w) && !(x = 0) && ((++y) == img->h) ) break ; \ + } \ +}while(0) -void show(const image_t* img) { - // Some variables - const uint8_t* bp = img->data; - unsigned int x = 0; - unsigned int y = 0; +void show (const image_t* img) +{ + // Some variables + const uint8_t* bp = img->data; + unsigned int x = 0; + unsigned int y = 0; - // Compressed - if(img->c) { - for(unsigned int i = 0; i < img->len; i++, bp++) { - // Compressed data? {tag, length, value} - if(*bp == img->tag) { - for(uint16_t c = 0; c < bp[1]; c++) PLOTBYTE(bp[2]); - bp += 3 - 1; - i += 3 - 1; + // Compressed + if (img->c) { + for (unsigned int i = 0; i < img->len; i++, bp++) { + // Compressed data? {tag, length, value} + if (*bp == img->tag) { + for (uint16_t c = 0; c < bp[1]; c++) PLOTBYTE(bp[2]) ; + bp += 3 -1; + i += 3 -1; - // Uncompressed byte - } else { - PLOTBYTE(*bp); - } - } + // Uncompressed byte + } else { + PLOTBYTE(*bp); + } + } - // Not compressed - } else { - for(unsigned int i = 0; i < img->len; i++, bp++) PLOTBYTE(*bp); - } + // Not compressed + } else { + for (unsigned int i = 0; i < img->len; i++, bp++) PLOTBYTE(*bp) ; + } } -#undef PLOTBYTE +#undef PLOTBYTE //+============================================================================ -int main(void) { - show(&img_zzz); - return 0; +int main (void) +{ + show(&img_zzz); + return 0; } diff --git a/applications/plugins/wii_ec_anal/application.fam b/applications/plugins/wii_ec_anal/application.fam index 42ed7e979..8fbf565a2 100644 --- a/applications/plugins/wii_ec_anal/application.fam +++ b/applications/plugins/wii_ec_anal/application.fam @@ -2,7 +2,7 @@ App( # --- App Info - appid="Wii_EC_Analyser", + appid="wii_ec_anal", name="Wii EC Analyser", # --- Entry point @@ -32,5 +32,5 @@ App( # fap_version=(1,0), fap_icon="WiiEC.png", - fap_category="Misc", + fap_category="Cyborg Systems", ) diff --git a/applications/plugins/wii_ec_anal/bc_logging.h b/applications/plugins/wii_ec_anal/bc_logging.h index 73dda80bd..d9bb48c92 100644 --- a/applications/plugins/wii_ec_anal/bc_logging.h +++ b/applications/plugins/wii_ec_anal/bc_logging.h @@ -1,13 +1,13 @@ -#ifndef BC_LOGGING_H_ -#define BC_LOGGING_H_ +#ifndef BC_LOGGING_H_ +#define BC_LOGGING_H_ #include -#include "err.h" // appName +#include "err.h" // appName //! WARNING: There is a bug in Furi such that if you crank LOG_LEVEL up to 6=TRACE //! AND you have menu->settings->system->logLevel = trace //! THEN this program will cause the FZ to crash when the plugin exits! -#define LOG_LEVEL 4 +#define LOG_LEVEL 4 //----------------------------------------------------------------------------- ---------------------------------------- // The FlipperZero Settings->System menu allows you to set the logging level at RUN-time @@ -27,44 +27,44 @@ // The FlipperZero Settings->System menu allows you to set the logging level at RUN-time // This lets you limit it at COMPILE-time #ifndef LOG_LEVEL -#define LOG_LEVEL 6 // default = full logging +# define LOG_LEVEL 6 // default = full logging #endif -#if(LOG_LEVEL < 2) -#undef FURI_LOG_E -#define FURI_LOG_E(tag, fmt, ...) +#if (LOG_LEVEL < 2) +# undef FURI_LOG_E +# define FURI_LOG_E(tag, fmt, ...) #endif -#if(LOG_LEVEL < 3) -#undef FURI_LOG_W -#define FURI_LOG_W(tag, fmt, ...) +#if (LOG_LEVEL < 3) +# undef FURI_LOG_W +# define FURI_LOG_W(tag, fmt, ...) #endif -#if(LOG_LEVEL < 4) -#undef FURI_LOG_I -#define FURI_LOG_I(tag, fmt, ...) +#if (LOG_LEVEL < 4) +# undef FURI_LOG_I +# define FURI_LOG_I(tag, fmt, ...) #endif -#if(LOG_LEVEL < 5) -#undef FURI_LOG_D -#define FURI_LOG_D(tag, fmt, ...) +#if (LOG_LEVEL < 5) +# undef FURI_LOG_D +# define FURI_LOG_D(tag, fmt, ...) #endif -#if(LOG_LEVEL < 6) -#undef FURI_LOG_T -#define FURI_LOG_T(tag, fmt, ...) +#if (LOG_LEVEL < 6) +# undef FURI_LOG_T +# define FURI_LOG_T(tag, fmt, ...) #endif //---------------------------------------------------------- // Logging helper macros // -#define ERROR(fmt, ...) FURI_LOG_E(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define WARN(fmt, ...) FURI_LOG_W(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define INFO(fmt, ...) FURI_LOG_I(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define DEBUG(fmt, ...) FURI_LOG_D(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define TRACE(fmt, ...) FURI_LOG_T(appName, fmt __VA_OPT__(, ) __VA_ARGS__) +#define ERROR(fmt, ...) FURI_LOG_E(appName, fmt __VA_OPT__(,) __VA_ARGS__) +#define WARN(fmt, ...) FURI_LOG_W(appName, fmt __VA_OPT__(,) __VA_ARGS__) +#define INFO(fmt, ...) FURI_LOG_I(appName, fmt __VA_OPT__(,) __VA_ARGS__) +#define DEBUG(fmt, ...) FURI_LOG_D(appName, fmt __VA_OPT__(,) __VA_ARGS__) +#define TRACE(fmt, ...) FURI_LOG_T(appName, fmt __VA_OPT__(,) __VA_ARGS__) -#define ENTER TRACE("(+) %s", __func__) -#define LEAVE TRACE("(-) %s", __func__) +#define ENTER TRACE("(+) %s", __func__) +#define LEAVE TRACE("(-) %s", __func__) #endif //BC_LOGGING_H_ diff --git a/applications/plugins/wii_ec_anal/err.h b/applications/plugins/wii_ec_anal/err.h index 5a25c93f8..9398a3fb8 100644 --- a/applications/plugins/wii_ec_anal/err.h +++ b/applications/plugins/wii_ec_anal/err.h @@ -1,11 +1,11 @@ // Avoid circular/nested/mulitple inclusion -#ifndef ERR_H_ -#define ERR_H_ +#ifndef ERR_H_ +#define ERR_H_ //----------------------------------------------------------------------------- ---------------------------------------- // Application name // -static const char* const appName = "Wii_i2c"; //$ Name used in log files +static const char* const appName = "Wii_i2c"; //$ Name used in log files //----------------------------------------------------------------------------- ---------------------------------------- // Error codes and messages @@ -13,60 +13,57 @@ static const char* const appName = "Wii_i2c"; //$ Name used in log files // You should only ever (need to) edit this list // ...Watch out for extraneous whitespace after the terminating backslashes -#define FOREACH_ES(esPrial) \ - /* The first line MUST define 'ERR_OK = 0' */ \ - esPrial(0, ERR_OK, "OK (no error)") \ - \ - esPrial(1, ERR_MALLOC_QUEUE, "malloc() fail - queue") esPrial( \ - 2, \ - ERR_MALLOC_STATE, \ - "malloc() fail - state") esPrial(3, ERR_MALLOC_TEXT, "malloc() fail - text") \ - esPrial(4, ERR_MALLOC_VIEW, "malloc() fail - viewport") esPrial( \ - 5, ERR_NO_MUTEX, "Cannot create mutex") esPrial(6, ERR_NO_GUI, "Cannot open GUI") \ - esPrial(7, ERR_NO_TIMER, "Cannot create timer") esPrial( \ - 8, ERR_NO_NOTIFY, "Cannot acquire notifications handle") \ - \ - esPrial(10, ERR_MUTEX_BLOCK, "Mutex block failed") esPrial( \ - 11, ERR_MUTEX_RELEASE, "Mutex release failed") \ - \ - esPrial(20, ERR_QUEUE_RTOS, "queue - Undefined RTOS error") \ - esPrial(21, DEBUG_QUEUE_TIMEOUT, "queue - Timeout") esPrial( \ - 22, ERR_QUEUE_RESOURCE, "queue - Resource not available") \ - esPrial(23, ERR_QUEUE_BADPRM, "queue - Bad parameter") esPrial( \ - 24, ERR_QUEUE_NOMEM, "queue - Out of memory") \ - esPrial(25, ERR_QUEUE_ISR, "queue - Banned in ISR") esPrial( \ - 26, ERR_QUEUE_UNK, "queue - Unknown") \ - \ - esPrial(30, WARN_SCAN_START, "Scan - Already started") \ - esPrial(31, WARN_SCAN_STOP, "Scan - Already stopped") \ - esPrial( \ - 32, \ - ERR_TIMER_START, \ - "Scan - Cannot start timer") \ - esPrial( \ - 33, \ - ERR_TIMER_STOP, \ - "Scan - Cannot stop timer") //[EOT] +#define FOREACH_ES(esPrial) \ + /* The first line MUST define 'ERR_OK = 0' */ \ + esPrial( 0, ERR_OK , "OK (no error)") \ +\ + esPrial( 1, ERR_MALLOC_QUEUE , "malloc() fail - queue") \ + esPrial( 2, ERR_MALLOC_STATE , "malloc() fail - state") \ + esPrial( 3, ERR_MALLOC_TEXT , "malloc() fail - text") \ + esPrial( 4, ERR_MALLOC_VIEW , "malloc() fail - viewport") \ + esPrial( 5, ERR_NO_MUTEX , "Cannot create mutex") \ + esPrial( 6, ERR_NO_GUI , "Cannot open GUI") \ + esPrial( 7, ERR_NO_TIMER , "Cannot create timer") \ + esPrial( 8, ERR_NO_NOTIFY , "Cannot acquire notifications handle") \ +\ + esPrial(10, ERR_MUTEX_BLOCK , "Mutex block failed") \ + esPrial(11, ERR_MUTEX_RELEASE , "Mutex release failed") \ +\ + esPrial(20, ERR_QUEUE_RTOS , "queue - Undefined RTOS error") \ + esPrial(21, DEBUG_QUEUE_TIMEOUT, "queue - Timeout") \ + esPrial(22, ERR_QUEUE_RESOURCE , "queue - Resource not available") \ + esPrial(23, ERR_QUEUE_BADPRM , "queue - Bad parameter") \ + esPrial(24, ERR_QUEUE_NOMEM , "queue - Out of memory") \ + esPrial(25, ERR_QUEUE_ISR , "queue - Banned in ISR") \ + esPrial(26, ERR_QUEUE_UNK , "queue - Unknown") \ +\ + esPrial(30, WARN_SCAN_START , "Scan - Already started") \ + esPrial(31, WARN_SCAN_STOP , "Scan - Already stopped") \ + esPrial(32, ERR_TIMER_START , "Scan - Cannot start timer") \ + esPrial(33, ERR_TIMER_STOP , "Scan - Cannot stop timer") \ +//[EOT] // Declare list extraction macros -#define ES_ENUM(num, ename, string) ename = num, -#define ES_STRING(num, ename, string) string "\r\n", +#define ES_ENUM(num, ename, string) ename = num, +#define ES_STRING(num, ename, string) string"\r\n", // Build the enum -typedef enum err { FOREACH_ES(ES_ENUM) } err_t; +typedef + enum err { FOREACH_ES(ES_ENUM) } +err_t ; // You need to '#define ERR_C_' in precisely ONE source file #ifdef ERR_C_ -// Build the string list -const char* const wii_errs[] = {FOREACH_ES(ES_STRING)}; + // Build the string list + const char* const wii_errs[] = { FOREACH_ES(ES_STRING) }; #else -// Give access to string list -extern const char* const wii_errs[]; + // Give access to string list + extern const char* const wii_errs[]; #endif // This is a header file, clean up -#undef ES_ENUM -#undef ES_STRING -#undef FOREACH_ES +#undef ES_ENUM +#undef ES_STRING +#undef FOREACH_ES #endif // ERR_H_ diff --git a/applications/plugins/wii_ec_anal/gfx/images.c b/applications/plugins/wii_ec_anal/gfx/images.c index e8ab899f7..57046e9a3 100644 --- a/applications/plugins/wii_ec_anal/gfx/images.c +++ b/applications/plugins/wii_ec_anal/gfx/images.c @@ -1,49 +1,55 @@ -#include // GUI (screen/keyboard) API +#include // GUI (screen/keyboard) API -#include "images.h" +#include "images.h" //----------------------------------------------------------------------------- ---------------------------------------- -static Canvas* _canvas; -static uint8_t _tlx; -static uint8_t _tly; +static Canvas* _canvas; +static uint8_t _tlx; +static uint8_t _tly; -static uint8_t _x; -static uint8_t _y; +static uint8_t _x; +static uint8_t _y; -static const image_t* _img; +static const image_t* _img; -static bool _blk; -static Color _set; -static Color _clr; +static bool _blk; +static Color _set; +static Color _clr; //+============================================================================ -static void _showByteSet(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(b & m) // plot only SET bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteSet (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if (b & m) // plot only SET bits + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ -static void _showByteClr(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(!(b & m)) // plot only CLR bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteClr (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if (!(b & m)) // plot only CLR bits + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ -static void _showByteAll(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if((!!(b & m)) ^ _blk) { // Change colour only when required - canvas_set_color(_canvas, ((b & m) ? _set : _clr)); - _blk = !_blk; - } - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } +static +void _showByteAll (const uint8_t b) +{ + for (uint8_t m = 0x80; m; m >>= 1) { + if ((!!(b & m)) ^ _blk) { // Change colour only when required + canvas_set_color(_canvas, ((b & m) ? _set : _clr)); + _blk = !_blk; + } + canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ; + if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) ) break ; + } } //+============================================================================ @@ -55,83 +61,81 @@ static void _showByteAll(const uint8_t b) { // SHOW_ALL - plot all images pixels as they are // SHOW_ALL_INV - plot all images pixels inverted // -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode) { - void (*fnShow)(const uint8_t) = NULL; +void show (Canvas* const canvas, const uint8_t tlx, const uint8_t tly, + const image_t* img, const showMode_t mode) +{ + void(*fnShow)(const uint8_t) = NULL; - const uint8_t* bp = img->data; + const uint8_t* bp = img->data; - // code size optimisation - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - _set = ColorBlack; - _clr = ColorWhite; - break; + // code size optimisation + switch (mode & SHOW_INV_) { + case SHOW_NRM_: + _set = ColorBlack; + _clr = ColorWhite; + break; - case SHOW_INV_: - _set = ColorWhite; - _clr = ColorBlack; - break; + case SHOW_INV_: + _set = ColorWhite; + _clr = ColorBlack; + break; - case SHOW_BLK_: - canvas_set_color(canvas, ColorBlack); - break; + case SHOW_BLK_: + canvas_set_color(canvas, ColorBlack); + break; - case SHOW_WHT_: - canvas_set_color(canvas, ColorWhite); - break; - } - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - case SHOW_INV_: - fnShow = _showByteAll; - canvas_set_color(canvas, ColorWhite); - _blk = 0; - break; + case SHOW_WHT_: + canvas_set_color(canvas, ColorWhite); + break; - case SHOW_BLK_: - case SHOW_WHT_: - switch(mode & SHOW_ALL_) { - case SHOW_SET_: - fnShow = _showByteSet; - break; - case SHOW_CLR_: - fnShow = _showByteClr; - break; - } - break; - } - furi_check(fnShow); + } + switch (mode & SHOW_INV_) { + case SHOW_NRM_: + case SHOW_INV_: + fnShow = _showByteAll; + canvas_set_color(canvas, ColorWhite); + _blk = 0; + break; - // I want nested functions! - _canvas = canvas; - _img = img; - _tlx = tlx; - _tly = tly; - _x = 0; - _y = 0; + case SHOW_BLK_: + case SHOW_WHT_: + switch (mode & SHOW_ALL_) { + case SHOW_SET_: + fnShow = _showByteSet; + break; + case SHOW_CLR_: + fnShow = _showByteClr; + break; + } + break; + } + furi_check(fnShow); - // Compressed - if(img->c) { - for(unsigned int i = 0; i < img->len; i++, bp++) { - // Compressed data? {tag, length, value} - if(*bp == img->tag) { - for(uint16_t c = 0; c < bp[1]; c++) fnShow(bp[2]); - bp += 3 - 1; - i += 3 - 1; + // I want nested functions! + _canvas = canvas; + _img = img; + _tlx = tlx; + _tly = tly; + _x = 0; + _y = 0; - // Uncompressed byte - } else { - fnShow(*bp); - } - } + // Compressed + if (img->c) { + for (unsigned int i = 0; i < img->len; i++, bp++) { + // Compressed data? {tag, length, value} + if (*bp == img->tag) { + for (uint16_t c = 0; c < bp[1]; c++) fnShow(bp[2]) ; + bp += 3 -1; + i += 3 -1; - // Not compressed - } else { - for(unsigned int i = 0; i < img->len; i++, bp++) fnShow(*bp); - } + // Uncompressed byte + } else { + fnShow(*bp); + } + } + + // Not compressed + } else { + for (unsigned int i = 0; i < img->len; i++, bp++) fnShow(*bp) ; + } } diff --git a/applications/plugins/wii_ec_anal/gfx/images.h b/applications/plugins/wii_ec_anal/gfx/images.h index d21909176..87f2b89b7 100644 --- a/applications/plugins/wii_ec_anal/gfx/images.h +++ b/applications/plugins/wii_ec_anal/gfx/images.h @@ -1,134 +1,134 @@ -#ifndef IMAGES_H_ -#define IMAGES_H_ +#ifndef IMAGES_H_ +#define IMAGES_H_ #include #include //----------------------------------------------------------------------------- ---------------------------------------- -typedef enum showMode { - // {INV:--:WHT:BLK::--:--:CLR:SET} - SHOW_SET_ = 0x01, - SHOW_CLR_ = 0x02, - SHOW_ALL_ = SHOW_SET_ | SHOW_CLR_, +typedef + enum showMode { + // {INV:--:WHT:BLK::--:--:CLR:SET} + SHOW_SET_ = 0x01, + SHOW_CLR_ = 0x02, + SHOW_ALL_ = SHOW_SET_ | SHOW_CLR_, - SHOW_BLK_ = 0x10, - SHOW_WHT_ = 0x20, - SHOW_NRM_ = 0x00, - SHOW_INV_ = SHOW_BLK_ | SHOW_WHT_, + SHOW_BLK_ = 0x10, + SHOW_WHT_ = 0x20, + SHOW_NRM_ = 0x00, + SHOW_INV_ = SHOW_BLK_ | SHOW_WHT_, - SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_, - SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_, + SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_, + SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_, - SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_, - SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_, + SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_, + SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_, - SHOW_ALL = SHOW_ALL_ | SHOW_NRM_, - SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_, -} showMode_t; + SHOW_ALL = SHOW_ALL_ | SHOW_NRM_, + SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_, + } +showMode_t; //----------------------------------------------------------------------------- ---------------------------------------- -typedef struct image { - uint8_t w; // width - uint8_t h; // height - bool c; // compressed? - uint16_t len; // image data length - uint8_t tag; // rle tag - uint8_t data[]; // image data -} image_t; +typedef + struct image { + uint8_t w; // width + uint8_t h; // height + bool c; // compressed? + uint16_t len; // image data length + uint8_t tag; // rle tag + uint8_t data[]; // image data + } +image_t; //----------------------------------------------------------------------------- ---------------------------------------- //[TAG] -extern const image_t img_csLogo_Small; -extern const image_t img_3x5_v; -extern const image_t img_3x5_9; -extern const image_t img_3x5_8; -extern const image_t img_3x5_7; -extern const image_t img_3x5_6; -extern const image_t img_3x5_5; -extern const image_t img_3x5_4; -extern const image_t img_3x5_3; -extern const image_t img_3x5_2; -extern const image_t img_3x5_1; -extern const image_t img_3x5_0; -extern const image_t img_key_Ui; -extern const image_t img_key_OKi; -extern const image_t img_RIP; -extern const image_t img_cc_trg_R4; -extern const image_t img_cc_trg_R3; -extern const image_t img_cc_trg_R2; -extern const image_t img_cc_trg_R1; -extern const image_t img_cc_trg_L4; -extern const image_t img_cc_trg_L3; -extern const image_t img_cc_trg_L2; -extern const image_t img_cc_trg_L1; -extern const image_t img_cc_Joy; -extern const image_t img_cc_Main; -extern const image_t img_cc_Cable; -extern const image_t img_key_Back; -extern const image_t img_key_OK; -extern const image_t img_6x8_Z; -extern const image_t img_6x8_Y; -extern const image_t img_6x8_X; -extern const image_t img_key_U; -extern const image_t img_key_D; -extern const image_t img_csLogo_FULL; -extern const image_t img_6x8_7; -extern const image_t img_key_R; -extern const image_t img_key_L; -extern const image_t img_5x7_7; -extern const image_t img_5x7_F; -extern const image_t img_5x7_E; -extern const image_t img_5x7_D; -extern const image_t img_5x7_C; -extern const image_t img_5x7_B; -extern const image_t img_5x7_A; -extern const image_t img_5x7_9; -extern const image_t img_5x7_8; -extern const image_t img_5x7_6; -extern const image_t img_5x7_5; -extern const image_t img_5x7_4; -extern const image_t img_5x7_3; -extern const image_t img_5x7_2; -extern const image_t img_5x7_1; -extern const image_t img_5x7_0; -extern const image_t img_6x8_v; -extern const image_t img_6x8_n; -extern const image_t img_6x8_G; -extern const image_t img_6x8_F; -extern const image_t img_6x8_E; -extern const image_t img_6x8_d; -extern const image_t img_6x8_C; -extern const image_t img_6x8_B; -extern const image_t img_6x8_A; -extern const image_t img_6x8_9; -extern const image_t img_6x8_8; -extern const image_t img_6x8_6; -extern const image_t img_6x8_5; -extern const image_t img_6x8_4; -extern const image_t img_6x8_3; -extern const image_t img_6x8_2; -extern const image_t img_6x8_1; -extern const image_t img_6x8_0; -extern const image_t img_ecp_SDA; -extern const image_t img_ecp_SCL; -extern const image_t img_ecp_port; -extern const image_t img_cc_pad_UD1; -extern const image_t img_cc_pad_LR1; -extern const image_t img_cc_btn_Y1; -extern const image_t img_cc_btn_X1; -extern const image_t img_cc_btn_B1; -extern const image_t img_cc_btn_A1; -extern const image_t img_6x8_D; +extern const image_t img_csLogo_Small; +extern const image_t img_3x5_v; +extern const image_t img_3x5_9; +extern const image_t img_3x5_8; +extern const image_t img_3x5_7; +extern const image_t img_3x5_6; +extern const image_t img_3x5_5; +extern const image_t img_3x5_4; +extern const image_t img_3x5_3; +extern const image_t img_3x5_2; +extern const image_t img_3x5_1; +extern const image_t img_3x5_0; +extern const image_t img_key_Ui; +extern const image_t img_key_OKi; +extern const image_t img_RIP; +extern const image_t img_cc_trg_R4; +extern const image_t img_cc_trg_R3; +extern const image_t img_cc_trg_R2; +extern const image_t img_cc_trg_R1; +extern const image_t img_cc_trg_L4; +extern const image_t img_cc_trg_L3; +extern const image_t img_cc_trg_L2; +extern const image_t img_cc_trg_L1; +extern const image_t img_cc_Joy; +extern const image_t img_cc_Main; +extern const image_t img_cc_Cable; +extern const image_t img_key_Back; +extern const image_t img_key_OK; +extern const image_t img_6x8_Z; +extern const image_t img_6x8_Y; +extern const image_t img_6x8_X; +extern const image_t img_key_U; +extern const image_t img_key_D; +extern const image_t img_csLogo_FULL; +extern const image_t img_6x8_7; +extern const image_t img_key_R; +extern const image_t img_key_L; +extern const image_t img_5x7_7; +extern const image_t img_5x7_F; +extern const image_t img_5x7_E; +extern const image_t img_5x7_D; +extern const image_t img_5x7_C; +extern const image_t img_5x7_B; +extern const image_t img_5x7_A; +extern const image_t img_5x7_9; +extern const image_t img_5x7_8; +extern const image_t img_5x7_6; +extern const image_t img_5x7_5; +extern const image_t img_5x7_4; +extern const image_t img_5x7_3; +extern const image_t img_5x7_2; +extern const image_t img_5x7_1; +extern const image_t img_5x7_0; +extern const image_t img_6x8_v; +extern const image_t img_6x8_n; +extern const image_t img_6x8_G; +extern const image_t img_6x8_F; +extern const image_t img_6x8_E; +extern const image_t img_6x8_d; +extern const image_t img_6x8_C; +extern const image_t img_6x8_B; +extern const image_t img_6x8_A; +extern const image_t img_6x8_9; +extern const image_t img_6x8_8; +extern const image_t img_6x8_6; +extern const image_t img_6x8_5; +extern const image_t img_6x8_4; +extern const image_t img_6x8_3; +extern const image_t img_6x8_2; +extern const image_t img_6x8_1; +extern const image_t img_6x8_0; +extern const image_t img_ecp_SDA; +extern const image_t img_ecp_SCL; +extern const image_t img_ecp_port; +extern const image_t img_cc_pad_UD1; +extern const image_t img_cc_pad_LR1; +extern const image_t img_cc_btn_Y1; +extern const image_t img_cc_btn_X1; +extern const image_t img_cc_btn_B1; +extern const image_t img_cc_btn_A1; +extern const image_t img_6x8_D; //----------------------------------------------------------------------------- ---------------------------------------- #ifndef IMGTEST -#include -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode); +# include + void show (Canvas* const canvas, const uint8_t tlx, const uint8_t tly, + const image_t* img, const showMode_t mode) ; #endif #endif //IMAGES_H_ diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_0.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_0.c index 8fc8e0e14..975d98d35 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_0.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_0.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_0 = {3, 5, false, 2, 0, {0xF6, 0xDE}}; +const image_t img_3x5_0 = { 3, 5, false, 2, 0, { + 0xF6, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_1.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_1.c index 8b7d4cf80..0d9dc3fe4 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_1.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_1 = {3, 5, false, 2, 0, {0xC9, 0x2E}}; +const image_t img_3x5_1 = { 3, 5, false, 2, 0, { + 0xC9, 0x2E +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_2.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_2.c index 89a81c75e..d98bf4e93 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_2.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_2.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_2 = {3, 5, false, 2, 0, {0xE7, 0xCE}}; +const image_t img_3x5_2 = { 3, 5, false, 2, 0, { + 0xE7, 0xCE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_3.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_3.c index 97ff0478a..8d08ed1b6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_3.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_3.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_3 = {3, 5, false, 2, 0, {0xE5, 0x9E}}; +const image_t img_3x5_3 = { 3, 5, false, 2, 0, { + 0xE5, 0x9E +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_4.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_4.c index 2bbd9ef42..795e9b76f 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_4.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_4.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_4 = {3, 5, false, 2, 0, {0x97, 0x92}}; +const image_t img_3x5_4 = { 3, 5, false, 2, 0, { + 0x97, 0x92 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_5.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_5.c index e0466f37a..377853507 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_5.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_5.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_5 = {3, 5, false, 2, 0, {0xF3, 0x9E}}; +const image_t img_3x5_5 = { 3, 5, false, 2, 0, { + 0xF3, 0x9E +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_6.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_6.c index 1b62caf72..d3af64071 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_6.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_6.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_6 = {3, 5, false, 2, 0, {0xD3, 0xDE}}; +const image_t img_3x5_6 = { 3, 5, false, 2, 0, { + 0xD3, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_7.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_7.c index acfe57cf8..2c3b1e0b9 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_7.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_7.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_7 = {3, 5, false, 2, 0, {0xE5, 0x24}}; +const image_t img_3x5_7 = { 3, 5, false, 2, 0, { + 0xE5, 0x24 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_8.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_8.c index 31f32af52..5cb6d3354 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_8.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_8.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_8 = {3, 5, false, 2, 0, {0xF7, 0xDE}}; +const image_t img_3x5_8 = { 3, 5, false, 2, 0, { + 0xF7, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_9.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_9.c index 4b1ba1e09..ee5e82b87 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_9.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_9.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_9 = {3, 5, false, 2, 0, {0xF7, 0x96}}; +const image_t img_3x5_9 = { 3, 5, false, 2, 0, { + 0xF7, 0x96 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_v.c b/applications/plugins/wii_ec_anal/gfx/img_3x5_v.c index 2282e1697..dcf3f631d 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_3x5_v.c +++ b/applications/plugins/wii_ec_anal/gfx/img_3x5_v.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_3x5_v = {3, 5, false, 2, 0, {0x02, 0xD4}}; +const image_t img_3x5_v = { 3, 5, false, 2, 0, { + 0x02, 0xD4 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_0.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_0.c index 7ae2186b3..c59852f19 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_0.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_0.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_0 = {5, 7, false, 5, 0, {0x74, 0x67, 0x5C, 0xC5, 0xC0}}; +const image_t img_5x7_0 = { 5, 7, false, 5, 0, { + 0x74, 0x67, 0x5C, 0xC5, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_1.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_1.c index c1a9cec74..4bd08f89c 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_1 = {5, 7, false, 5, 0, {0x65, 0x08, 0x42, 0x13, 0xE0}}; +const image_t img_5x7_1 = { 5, 7, false, 5, 0, { + 0x65, 0x08, 0x42, 0x13, 0xE0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_2.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_2.c index 7fab90010..1270393f7 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_2.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_2.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_2 = {5, 7, false, 5, 0, {0x74, 0x42, 0x22, 0x23, 0xE0}}; +const image_t img_5x7_2 = { 5, 7, false, 5, 0, { + 0x74, 0x42, 0x22, 0x23, 0xE0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_3.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_3.c index 2099bf795..e26bac523 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_3.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_3.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_3 = {5, 7, false, 5, 0, {0x74, 0x42, 0x60, 0xC5, 0xC0}}; +const image_t img_5x7_3 = { 5, 7, false, 5, 0, { + 0x74, 0x42, 0x60, 0xC5, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_4.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_4.c index 1eee4f07d..e0dc5687f 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_4.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_4.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_4 = {5, 7, false, 5, 0, {0x84, 0x25, 0x2F, 0x88, 0x40}}; +const image_t img_5x7_4 = { 5, 7, false, 5, 0, { + 0x84, 0x25, 0x2F, 0x88, 0x40 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_5.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_5.c index be1e54681..81747376f 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_5.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_5.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_5 = {5, 7, false, 5, 0, {0xFC, 0x21, 0xE0, 0x87, 0xC0}}; +const image_t img_5x7_5 = { 5, 7, false, 5, 0, { + 0xFC, 0x21, 0xE0, 0x87, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_6.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_6.c index da155c1b5..455c874dc 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_6.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_6.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_6 = {5, 7, false, 5, 0, {0x74, 0x21, 0xE8, 0xC5, 0xC0}}; +const image_t img_5x7_6 = { 5, 7, false, 5, 0, { + 0x74, 0x21, 0xE8, 0xC5, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_7.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_7.c index fde7e8ea2..73e813a21 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_7.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_7.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_7 = {5, 7, false, 5, 0, {0xF8, 0x44, 0x22, 0x10, 0x80}}; +const image_t img_5x7_7 = { 5, 7, false, 5, 0, { + 0xF8, 0x44, 0x22, 0x10, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_8.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_8.c index aff178282..0f04a48bf 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_8.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_8.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_8 = {5, 7, false, 5, 0, {0x74, 0x62, 0xE8, 0xC5, 0xC0}}; +const image_t img_5x7_8 = { 5, 7, false, 5, 0, { + 0x74, 0x62, 0xE8, 0xC5, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_9.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_9.c index 2417c57e8..2b1e978c6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_9.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_9.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_9 = {5, 7, false, 5, 0, {0x74, 0x62, 0xF0, 0x85, 0xC0}}; +const image_t img_5x7_9 = { 5, 7, false, 5, 0, { + 0x74, 0x62, 0xF0, 0x85, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_A.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_A.c index 910c034a2..a6b049f01 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_A.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_A.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_A = {5, 7, false, 5, 0, {0x74, 0x63, 0xF8, 0xC6, 0x20}}; +const image_t img_5x7_A = { 5, 7, false, 5, 0, { + 0x74, 0x63, 0xF8, 0xC6, 0x20 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_B.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_B.c index 93808fee2..06b36599c 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_B.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_B.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_B = {5, 7, false, 5, 0, {0xF4, 0x63, 0x68, 0xC7, 0xC0}}; +const image_t img_5x7_B = { 5, 7, false, 5, 0, { + 0xF4, 0x63, 0x68, 0xC7, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_C.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_C.c index 1438eaf44..c058d09a9 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_C.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_C.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_C = {5, 7, false, 5, 0, {0x74, 0x61, 0x08, 0x45, 0xC0}}; +const image_t img_5x7_C = { 5, 7, false, 5, 0, { + 0x74, 0x61, 0x08, 0x45, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_D.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_D.c index 9c6b590ee..3425e3648 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_D.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_D.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_D = {5, 7, false, 5, 0, {0x75, 0x4A, 0x52, 0xD5, 0xC0}}; +const image_t img_5x7_D = { 5, 7, false, 5, 0, { + 0x75, 0x4A, 0x52, 0xD5, 0xC0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_E.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_E.c index bc15fb240..c7bbc301a 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_E.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_E.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_E = {5, 7, false, 5, 0, {0xFC, 0x21, 0xC8, 0x43, 0xE0}}; +const image_t img_5x7_E = { 5, 7, false, 5, 0, { + 0xFC, 0x21, 0xC8, 0x43, 0xE0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_F.c b/applications/plugins/wii_ec_anal/gfx/img_5x7_F.c index e4ad0db69..440c37eae 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_5x7_F.c +++ b/applications/plugins/wii_ec_anal/gfx/img_5x7_F.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_5x7_F = {5, 7, false, 5, 0, {0xFC, 0x21, 0xC8, 0x42, 0x00}}; +const image_t img_5x7_F = { 5, 7, false, 5, 0, { + 0xFC, 0x21, 0xC8, 0x42, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_0.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_0.c index 952cf34d8..b8b4c7d9a 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_0.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_0.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_0 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE}}; +const image_t img_6x8_0 = { 6, 8, false, 6, 0, { + 0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_1.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_1.c index 846a6876c..91e2b2cfa 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_1.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_1 = {6, 8, false, 6, 0, {0x73, 0xC3, 0x0C, 0x30, 0xCF, 0xFF}}; +const image_t img_6x8_1 = { 6, 8, false, 6, 0, { + 0x73, 0xC3, 0x0C, 0x30, 0xCF, 0xFF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_2.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_2.c index 4534bb67c..7d24c64d6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_2.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_2.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_2 = {6, 8, false, 6, 0, {0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF}}; +const image_t img_6x8_2 = { 6, 8, false, 6, 0, { + 0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_3.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_3.c index 7e79eb03a..3a8f9f211 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_3.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_3.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_3 = {6, 8, false, 6, 0, {0x7B, 0xF0, 0xCF, 0x3C, 0x3F, 0xDE}}; +const image_t img_6x8_3 = { 6, 8, false, 6, 0, { + 0x7B, 0xF0, 0xCF, 0x3C, 0x3F, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_4.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_4.c index 324b036ce..c5ae9efef 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_4.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_4.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_4 = {6, 8, false, 6, 0, {0xC3, 0x0D, 0xB6, 0xFF, 0xF1, 0x86}}; +const image_t img_6x8_4 = { 6, 8, false, 6, 0, { + 0xC3, 0x0D, 0xB6, 0xFF, 0xF1, 0x86 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_5.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_5.c index cdfda5f2b..787e39ea6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_5.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_5.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_5 = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFE}}; +const image_t img_6x8_5 = { 6, 8, false, 6, 0, { + 0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_6.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_6.c index 781a060f1..8f07f1bfc 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_6.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_6.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_6 = {6, 8, false, 6, 0, {0x7B, 0xEC, 0x3E, 0xFF, 0x3F, 0xDE}}; +const image_t img_6x8_6 = { 6, 8, false, 6, 0, { + 0x7B, 0xEC, 0x3E, 0xFF, 0x3F, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_7.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_7.c index fec5f4bf4..cad50c65d 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_7.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_7.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_7 = {6, 8, false, 6, 0, {0xFF, 0xF0, 0xC6, 0x18, 0xC3, 0x0C}}; +const image_t img_6x8_7 = { 6, 8, false, 6, 0, { + 0xFF, 0xF0, 0xC6, 0x18, 0xC3, 0x0C +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_8.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_8.c index a5b21c375..a38b2110d 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_8.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_8.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_8 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xDE, 0xFF, 0x3F, 0xDE}}; +const image_t img_6x8_8 = { 6, 8, false, 6, 0, { + 0x7B, 0xFC, 0xDE, 0xFF, 0x3F, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_9.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_9.c index f7707c0df..b740c7f90 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_9.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_9.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_9 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xFF, 0x7C, 0x37, 0xDE}}; +const image_t img_6x8_9 = { 6, 8, false, 6, 0, { + 0x7B, 0xFC, 0xFF, 0x7C, 0x37, 0xDE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_A.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_A.c index 1bb65c902..fa3aed598 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_A.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_A.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_A = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xF3, 0xFF, 0xFC, 0xF3}}; +const image_t img_6x8_A = { 6, 8, false, 6, 0, { + 0x7B, 0xFC, 0xF3, 0xFF, 0xFC, 0xF3 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_B.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_B.c index 00e012d53..14c1e28c6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_B.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_B.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_B = {6, 8, false, 6, 0, {0xFB, 0xFC, 0xFE, 0xFB, 0x3F, 0xFE}}; +const image_t img_6x8_B = { 6, 8, false, 6, 0, { + 0xFB, 0xFC, 0xFE, 0xFB, 0x3F, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_C.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_C.c index 694901009..6d8f7aa32 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_C.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_C.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_C = {6, 8, false, 6, 0, {0x7F, 0xFC, 0x30, 0xC3, 0x0F, 0xDF}}; +const image_t img_6x8_C = { 6, 8, false, 6, 0, { + 0x7F, 0xFC, 0x30, 0xC3, 0x0F, 0xDF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_D.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_D.c index a95e760eb..474e4a235 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_D.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_D.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_D = {6, 8, false, 6, 0, {0xFB, 0xF6, 0xDB, 0x6D, 0xBF, 0xFE}}; +const image_t img_6x8_D = { 6, 8, false, 6, 0, { + 0xFB, 0xF6, 0xDB, 0x6D, 0xBF, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_E.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_E.c index f49503f00..00f2cb559 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_E.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_E.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_E = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3C, 0xF3, 0x0F, 0xFF}}; +const image_t img_6x8_E = { 6, 8, false, 6, 0, { + 0xFF, 0xFC, 0x3C, 0xF3, 0x0F, 0xFF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_F.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_F.c index 0037b2544..8958a0419 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_F.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_F.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_F = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3C, 0xF3, 0x0C, 0x30}}; +const image_t img_6x8_F = { 6, 8, false, 6, 0, { + 0xFF, 0xFC, 0x3C, 0xF3, 0x0C, 0x30 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_G.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_G.c index f30bc9952..f5e8f03f4 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_G.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_G.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_G = {6, 8, false, 6, 0, {0x7F, 0xFC, 0x30, 0xDF, 0x3F, 0xDF}}; +const image_t img_6x8_G = { 6, 8, false, 6, 0, { + 0x7F, 0xFC, 0x30, 0xDF, 0x3F, 0xDF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_X.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_X.c index 4735e82a1..7b162baf3 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_X.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_X.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_X = {6, 8, false, 6, 0, {0xCF, 0x36, 0x8E, 0x71, 0x6C, 0xF3}}; +const image_t img_6x8_X = { 6, 8, false, 6, 0, { + 0xCF, 0x36, 0x8E, 0x71, 0x6C, 0xF3 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c index 508e786bd..b39392948 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_Y = {6, 8, false, 6, 0, {0xCF, 0x3C, 0xF3, 0x78, 0xC3, 0x0C}}; +const image_t img_6x8_Y = { 6, 8, false, 6, 0, { + 0xCF, 0x3C, 0xF3, 0x78, 0xC3, 0x0C +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c index c42d560ac..9904d08b4 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_Z = {6, 8, false, 6, 0, {0xFF, 0xF0, 0xC6, 0x31, 0x8F, 0xFF}}; +const image_t img_6x8_Z = { 6, 8, false, 6, 0, { + 0xFF, 0xF0, 0xC6, 0x31, 0x8F, 0xFF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c index 1f8123a6c..2a00713fd 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_d = {6, 8, false, 6, 0, {0x0C, 0x30, 0xDF, 0xFF, 0x3F, 0xDF}}; +const image_t img_6x8_d = { 6, 8, false, 6, 0, { + 0x0C, 0x30, 0xDF, 0xFF, 0x3F, 0xDF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c index 15d403d28..086bdd2de 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_n = {6, 8, false, 6, 0, {0x00, 0x07, 0xBF, 0xCF, 0x3C, 0xF3}}; +const image_t img_6x8_n = { 6, 8, false, 6, 0, { + 0x00, 0x07, 0xBF, 0xCF, 0x3C, 0xF3 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c b/applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c index 1229701a1..c897aadff 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c +++ b/applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c @@ -9,4 +9,6 @@ #include "images.h" -const image_t img_6x8_v = {6, 8, false, 6, 0, {0x00, 0x08, 0x73, 0xCF, 0xF7, 0x8C}}; +const image_t img_6x8_v = { 6, 8, false, 6, 0, { + 0x00, 0x08, 0x73, 0xCF, 0xF7, 0x8C +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_RIP.c b/applications/plugins/wii_ec_anal/gfx/img_RIP.c index c20877ef0..55cb7bfc2 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_RIP.c +++ b/applications/plugins/wii_ec_anal/gfx/img_RIP.c @@ -65,66 +65,58 @@ #include "images.h" -const image_t img_RIP = { - 128, - 64, - true, - 837, - 0x06, - {// orig:1024, comp:18.26% - 0x06, 0x20, 0xFF, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC8, 0x01, - 0xFC, 0x1E, 0x1F, 0xF0, 0x00, 0xFE, 0x20, 0x8F, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x13, 0xD4, - 0x01, 0xFC, 0x0E, 0x0F, 0xF0, 0x00, 0xFE, 0x71, 0xCF, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x2B, - 0xC0, 0x00, 0x0E, 0x0A, 0x00, 0x38, 0x01, 0x87, 0x71, 0xD8, 0x77, 0x1C, 0x07, 0x71, 0xC0, - 0x03, 0xC0, 0x03, 0x8E, 0x0A, 0x0E, 0x28, 0x01, 0xC5, 0x51, 0x5C, 0x77, 0x1D, 0xC7, 0x71, - 0x40, 0x03, 0xC0, 0x03, 0x8A, 0x0A, 0x0E, 0x28, 0x01, 0x47, 0x51, 0x5C, 0x55, 0x15, 0xC5, - 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, - 0x45, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, - 0x15, 0x45, 0x51, 0xC0, 0x03, 0xC0, 0x02, 0x8E, 0x0A, 0x0A, 0x38, 0x01, 0x40, 0x51, 0x54, - 0x75, 0x55, 0x47, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, 0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x71, - 0xD7, 0xC5, 0x15, 0x7C, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, 0x0A, 0x0B, 0xE0, 0x01, 0x40, - 0x3F, 0x97, 0xC5, 0x15, 0x7C, 0x57, 0x80, 0x03, 0xC0, 0x02, 0x9C, 0x0A, 0x0A, 0x00, 0x01, - 0x40, 0x1B, 0x14, 0x75, 0x55, 0x4E, 0x57, 0xC0, 0x03, 0xC0, 0x02, 0x94, 0x0A, 0x0A, 0x00, - 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, 0x0A, 0x0A, - 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, 0x0A, - 0x0A, 0x00, 0x01, 0xC7, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94, - 0x0A, 0x0A, 0x00, 0x01, 0xC5, 0x0A, 0x1C, 0x77, 0x1D, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, - 0x94, 0x0A, 0x0A, 0x00, 0x01, 0x87, 0x0E, 0x1C, 0x77, 0x1D, 0x4A, 0x61, 0xC0, 0x03, 0xC0, - 0x03, 0x9C, 0xCE, 0xCE, 0xC0, 0x00, 0xFE, 0x0E, 0x0F, 0xE3, 0xF9, 0xCE, 0x3F, 0x80, 0x03, - 0xC0, 0x03, 0x8E, 0xDE, 0xDE, 0xC0, 0x00, 0xFE, 0x1F, 0x0F, 0xE3, 0xF9, 0xC7, 0x3F, 0x80, - 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0A, 0x00, - 0x01, 0x8C, 0x07, 0xF0, 0x03, 0xC0, 0x06, 0x07, 0x00, 0x04, 0x00, 0x00, 0x02, 0x52, 0x18, - 0x0C, 0x03, 0xC1, 0xD5, 0xC7, 0x57, 0x77, 0x6D, 0xC4, 0x5D, 0x2B, 0x8E, 0xE0, 0x03, 0x5A, - 0x20, 0x02, 0x03, 0xC0, 0x95, 0x04, 0x54, 0x24, 0x55, 0x04, 0x55, 0xA1, 0x0A, 0x80, 0x01, - 0x8C, 0x47, 0xC1, 0x03, 0xC0, 0x9D, 0x87, 0x27, 0x26, 0x55, 0xC5, 0x55, 0x61, 0x0C, 0xC0, - 0x00, 0x50, 0x88, 0x21, 0x03, 0xC0, 0x95, 0x01, 0x21, 0x24, 0x44, 0x45, 0x55, 0x21, 0x0A, - 0x80, 0x00, 0x20, 0x90, 0x11, 0x03, 0xC0, 0x95, 0xC7, 0x27, 0x27, 0x45, 0xC6, 0xDD, 0x21, - 0x0E, 0xE0, 0x00, 0x70, 0x91, 0x91, 0x03, 0xC0, 0x06, 0x0B, 0x00, 0x88, 0x92, 0x51, 0x03, - 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, 0x92, 0x91, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, - 0x92, 0x11, 0x03, 0xC1, 0xD5, 0xC7, 0x76, 0xDC, 0x45, 0xDD, 0x5D, 0x5C, 0x57, 0x50, 0x00, - 0x87, 0x11, 0xE2, 0x03, 0xC0, 0x95, 0x04, 0x55, 0x50, 0x44, 0x89, 0x55, 0x48, 0x55, 0x50, - 0x00, 0x80, 0x88, 0x03, 0x03, 0xC0, 0x9D, 0x87, 0x75, 0x58, 0x54, 0x89, 0xD5, 0x48, 0x25, - 0x50, 0x00, 0x40, 0x7C, 0x04, 0x83, 0xC0, 0x95, 0x01, 0x54, 0x50, 0x54, 0x89, 0x55, 0x48, - 0x25, 0x50, 0x00, 0x40, 0x07, 0xF8, 0x43, 0xC0, 0x95, 0xC7, 0x54, 0x5C, 0x6D, 0xC9, 0x5D, - 0xC8, 0x27, 0x70, 0x00, 0x30, 0x00, 0x00, 0x43, 0xC0, 0x06, 0x0B, 0x00, 0x0F, 0xFF, 0xFF, - 0x83, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, - 0xF1, 0xFC, 0x7F, 0x00, 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, - 0xC7, 0xF1, 0xFC, 0x7F, 0x00, 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, - 0x05, 0x4E, 0x3B, 0x8E, 0xE3, 0x80, 0x07, 0x1D, 0xC7, 0x71, 0xDC, 0x70, 0x00, 0x03, 0xC0, - 0x00, 0x01, 0x4E, 0x3A, 0x8E, 0xE3, 0x80, 0x05, 0x15, 0xC7, 0x51, 0x54, 0x50, 0x00, 0x03, - 0xC0, 0x00, 0x01, 0x4A, 0x2B, 0x8A, 0xA2, 0x80, 0x07, 0x15, 0x45, 0x71, 0x5C, 0x50, 0x00, - 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA2, 0x80, 0x00, 0x15, 0x45, 0x01, 0x40, 0x50, - 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA6, 0x80, 0x00, 0x15, 0x4D, 0x01, 0x40, - 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x28, 0x0E, 0xA6, 0x80, 0x00, 0x1D, 0x4D, 0x01, - 0xC0, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x0E, 0xAA, 0x9F, 0xE1, 0xF9, 0x55, - 0x1F, 0x87, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x38, 0xAA, 0x90, 0x23, 0xF1, - 0x55, 0x3F, 0x0F, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x38, 0xB2, 0x9F, 0xE7, - 0x01, 0x65, 0x70, 0x1C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xB2, 0x80, - 0x05, 0x01, 0x65, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, - 0x80, 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, - 0xA2, 0x80, 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, - 0x28, 0xE3, 0x80, 0x05, 0x01, 0xC7, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, - 0x38, 0x28, 0xE3, 0x80, 0x05, 0x0D, 0xC7, 0x50, 0xD4, 0x30, 0x00, 0x03, 0xD4, 0x00, 0x07, - 0xF3, 0xF0, 0x38, 0x7F, 0x00, 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x2B, 0xC8, 0x00, - 0x0F, 0xFB, 0xF0, 0x38, 0x7F, 0x00, 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x13, 0xD4, - 0x06, 0x0E, 0x00, 0x2B, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0x06, 0x20, 0xFF}}; +const image_t img_RIP = { 128, 64, true, 837, 0x06, { // orig:1024, comp:18.26% + 0x06, 0x20, 0xFF, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC8, 0x01, 0xFC, + 0x1E, 0x1F, 0xF0, 0x00, 0xFE, 0x20, 0x8F, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x13, 0xD4, 0x01, 0xFC, + 0x0E, 0x0F, 0xF0, 0x00, 0xFE, 0x71, 0xCF, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x2B, 0xC0, 0x00, 0x0E, + 0x0A, 0x00, 0x38, 0x01, 0x87, 0x71, 0xD8, 0x77, 0x1C, 0x07, 0x71, 0xC0, 0x03, 0xC0, 0x03, 0x8E, + 0x0A, 0x0E, 0x28, 0x01, 0xC5, 0x51, 0x5C, 0x77, 0x1D, 0xC7, 0x71, 0x40, 0x03, 0xC0, 0x03, 0x8A, + 0x0A, 0x0E, 0x28, 0x01, 0x47, 0x51, 0x5C, 0x55, 0x15, 0xC5, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, + 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, 0x45, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, + 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, 0x45, 0x51, 0xC0, 0x03, 0xC0, 0x02, 0x8E, + 0x0A, 0x0A, 0x38, 0x01, 0x40, 0x51, 0x54, 0x75, 0x55, 0x47, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, + 0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x71, 0xD7, 0xC5, 0x15, 0x7C, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, + 0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x3F, 0x97, 0xC5, 0x15, 0x7C, 0x57, 0x80, 0x03, 0xC0, 0x02, 0x9C, + 0x0A, 0x0A, 0x00, 0x01, 0x40, 0x1B, 0x14, 0x75, 0x55, 0x4E, 0x57, 0xC0, 0x03, 0xC0, 0x02, 0x94, + 0x0A, 0x0A, 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, + 0x0A, 0x0A, 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, + 0x0A, 0x0A, 0x00, 0x01, 0xC7, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94, + 0x0A, 0x0A, 0x00, 0x01, 0xC5, 0x0A, 0x1C, 0x77, 0x1D, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94, + 0x0A, 0x0A, 0x00, 0x01, 0x87, 0x0E, 0x1C, 0x77, 0x1D, 0x4A, 0x61, 0xC0, 0x03, 0xC0, 0x03, 0x9C, + 0xCE, 0xCE, 0xC0, 0x00, 0xFE, 0x0E, 0x0F, 0xE3, 0xF9, 0xCE, 0x3F, 0x80, 0x03, 0xC0, 0x03, 0x8E, + 0xDE, 0xDE, 0xC0, 0x00, 0xFE, 0x1F, 0x0F, 0xE3, 0xF9, 0xC7, 0x3F, 0x80, 0x03, 0xC0, 0x06, 0x0E, + 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x8C, 0x07, 0xF0, 0x03, + 0xC0, 0x06, 0x07, 0x00, 0x04, 0x00, 0x00, 0x02, 0x52, 0x18, 0x0C, 0x03, 0xC1, 0xD5, 0xC7, 0x57, + 0x77, 0x6D, 0xC4, 0x5D, 0x2B, 0x8E, 0xE0, 0x03, 0x5A, 0x20, 0x02, 0x03, 0xC0, 0x95, 0x04, 0x54, + 0x24, 0x55, 0x04, 0x55, 0xA1, 0x0A, 0x80, 0x01, 0x8C, 0x47, 0xC1, 0x03, 0xC0, 0x9D, 0x87, 0x27, + 0x26, 0x55, 0xC5, 0x55, 0x61, 0x0C, 0xC0, 0x00, 0x50, 0x88, 0x21, 0x03, 0xC0, 0x95, 0x01, 0x21, + 0x24, 0x44, 0x45, 0x55, 0x21, 0x0A, 0x80, 0x00, 0x20, 0x90, 0x11, 0x03, 0xC0, 0x95, 0xC7, 0x27, + 0x27, 0x45, 0xC6, 0xDD, 0x21, 0x0E, 0xE0, 0x00, 0x70, 0x91, 0x91, 0x03, 0xC0, 0x06, 0x0B, 0x00, + 0x88, 0x92, 0x51, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, 0x92, 0x91, 0x03, 0xC0, 0x06, 0x0A, + 0x00, 0x01, 0x08, 0x92, 0x11, 0x03, 0xC1, 0xD5, 0xC7, 0x76, 0xDC, 0x45, 0xDD, 0x5D, 0x5C, 0x57, + 0x50, 0x00, 0x87, 0x11, 0xE2, 0x03, 0xC0, 0x95, 0x04, 0x55, 0x50, 0x44, 0x89, 0x55, 0x48, 0x55, + 0x50, 0x00, 0x80, 0x88, 0x03, 0x03, 0xC0, 0x9D, 0x87, 0x75, 0x58, 0x54, 0x89, 0xD5, 0x48, 0x25, + 0x50, 0x00, 0x40, 0x7C, 0x04, 0x83, 0xC0, 0x95, 0x01, 0x54, 0x50, 0x54, 0x89, 0x55, 0x48, 0x25, + 0x50, 0x00, 0x40, 0x07, 0xF8, 0x43, 0xC0, 0x95, 0xC7, 0x54, 0x5C, 0x6D, 0xC9, 0x5D, 0xC8, 0x27, + 0x70, 0x00, 0x30, 0x00, 0x00, 0x43, 0xC0, 0x06, 0x0B, 0x00, 0x0F, 0xFF, 0xFF, 0x83, 0xC0, 0x06, + 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0x00, + 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0x00, + 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x05, 0x4E, 0x3B, 0x8E, 0xE3, 0x80, + 0x07, 0x1D, 0xC7, 0x71, 0xDC, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x3A, 0x8E, 0xE3, 0x80, + 0x05, 0x15, 0xC7, 0x51, 0x54, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x2B, 0x8A, 0xA2, 0x80, + 0x07, 0x15, 0x45, 0x71, 0x5C, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA2, 0x80, + 0x00, 0x15, 0x45, 0x01, 0x40, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA6, 0x80, + 0x00, 0x15, 0x4D, 0x01, 0x40, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x28, 0x0E, 0xA6, 0x80, + 0x00, 0x1D, 0x4D, 0x01, 0xC0, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x0E, 0xAA, 0x9F, + 0xE1, 0xF9, 0x55, 0x1F, 0x87, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x38, 0xAA, 0x90, + 0x23, 0xF1, 0x55, 0x3F, 0x0F, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x38, 0xB2, 0x9F, + 0xE7, 0x01, 0x65, 0x70, 0x1C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xB2, 0x80, + 0x05, 0x01, 0x65, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, 0x80, + 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, 0x80, + 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, 0x28, 0xE3, 0x80, + 0x05, 0x01, 0xC7, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, 0x28, 0xE3, 0x80, + 0x05, 0x0D, 0xC7, 0x50, 0xD4, 0x30, 0x00, 0x03, 0xD4, 0x00, 0x07, 0xF3, 0xF0, 0x38, 0x7F, 0x00, + 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x2B, 0xC8, 0x00, 0x0F, 0xFB, 0xF0, 0x38, 0x7F, 0x00, + 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x13, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC0, 0x06, 0x0E, + 0x00, 0x03, 0x06, 0x20, 0xFF +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c b/applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c index f4ac26173..2fc6b5f23 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c @@ -12,14 +12,6 @@ #include "images.h" -const image_t img_cc_Cable = { - 4, - 11, - true, - 4, - 0x00, - {// orig:6, comp:33.33% - 0x00, - 0x05, - 0xDB, - 0xD0}}; +const image_t img_cc_Cable = { 4, 11, true, 4, 0x00, { // orig:6, comp:33.33% + 0x00, 0x05, 0xDB, 0xD0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c b/applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c index 5054103b3..dd189cb7e 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c @@ -18,8 +18,8 @@ #include "images.h" -const image_t img_cc_Joy = {17, 17, false, 37, 0, {0x00, 0x80, 0x01, 0xF0, 0x0F, 0xDF, 0x87, 0x01, - 0xC3, 0x00, 0x61, 0x00, 0x11, 0x80, 0x0C, 0xC0, - 0x06, 0xC0, 0x01, 0xB0, 0x01, 0x98, 0x00, 0xC4, - 0x00, 0x43, 0x00, 0x61, 0xC0, 0x70, 0xFD, 0xF8, - 0x07, 0xC0, 0x00, 0x80, 0x00}}; +const image_t img_cc_Joy = { 17, 17, false, 37, 0, { + 0x00, 0x80, 0x01, 0xF0, 0x0F, 0xDF, 0x87, 0x01, 0xC3, 0x00, 0x61, 0x00, 0x11, 0x80, 0x0C, 0xC0, + 0x06, 0xC0, 0x01, 0xB0, 0x01, 0x98, 0x00, 0xC4, 0x00, 0x43, 0x00, 0x61, 0xC0, 0x70, 0xFD, 0xF8, + 0x07, 0xC0, 0x00, 0x80, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Main.c b/applications/plugins/wii_ec_anal/gfx/img_cc_Main.c index b29a9ab57..8e7bd5ed9 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_Main.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_Main.c @@ -54,47 +54,39 @@ #include "images.h" -const image_t img_cc_Main = { - 116, - 53, - true, - 542, - 0x05, - {// orig:769, comp:29.52% - 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x05, 0x05, 0x00, 0x3F, 0xE0, 0x05, 0x04, 0x00, 0x01, 0xF8, - 0x04, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x02, 0x01, 0xF8, 0x05, 0x04, 0x00, 0x60, 0x00, 0x41, - 0x04, 0x00, 0x60, 0x02, 0x08, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF0, - 0x7F, 0xFF, 0xFF, 0xE0, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x41, 0x04, - 0x00, 0x60, 0x02, 0x08, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x03, 0xFC, 0x10, 0x40, - 0x06, 0x00, 0x20, 0x83, 0xFC, 0x00, 0xA0, 0x00, 0x00, 0x09, 0x0F, 0xC0, 0x00, 0xF8, 0x00, - 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x09, 0x00, 0x00, 0x01, 0x1F, 0x05, 0x09, 0x00, 0x0F, 0x88, - 0x00, 0x00, 0x20, 0x05, 0x0A, 0xFF, 0xF0, 0x40, 0x00, 0x04, 0x78, 0x05, 0x09, 0x00, 0x01, - 0xE2, 0x00, 0x00, 0x9C, 0x05, 0x0A, 0x00, 0x03, 0x90, 0x00, 0x13, 0x05, 0x0B, 0x00, 0x0C, - 0x80, 0x03, 0xE0, 0x05, 0x0B, 0x00, 0x7C, 0x00, 0x38, 0x05, 0x05, 0x00, 0xC6, 0xD8, 0x05, - 0x04, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0D, 0x60, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x0E, 0x00, 0x60, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xD6, 0xD8, 0x00, 0x00, 0x01, - 0xF0, 0x00, 0x60, 0x0C, 0x00, 0x18, 0x30, 0x00, 0x00, 0x0D, 0x6D, 0x80, 0x00, 0x00, 0x31, - 0x80, 0x03, 0x01, 0xC0, 0x01, 0x83, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x00, 0x00, 0x06, 0x0C, - 0x00, 0x38, 0x18, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xCA, 0x60, 0x01, 0x81, 0x00, 0x01, - 0x93, 0x05, 0x07, 0x00, 0x0C, 0x46, 0x00, 0x0C, 0x30, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, - 0xCA, 0x60, 0x00, 0xC2, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x07, 0x06, 0x0C, 0x1C, - 0x04, 0x60, 0x0F, 0xF8, 0x3F, 0xE0, 0x05, 0x05, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x64, 0x00, - 0xC0, 0x00, 0x06, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x02, 0x40, 0x0C, - 0x00, 0x00, 0x60, 0x01, 0x99, 0x99, 0x98, 0x03, 0x06, 0x0E, 0x0C, 0x98, 0x2C, 0x00, 0xCE, - 0x00, 0xE6, 0x00, 0x10, 0x90, 0x90, 0x80, 0x65, 0x30, 0x01, 0x94, 0xC3, 0x80, 0x0C, 0x00, - 0x00, 0x60, 0x01, 0x09, 0x09, 0x08, 0x06, 0x73, 0x00, 0x19, 0xCC, 0x18, 0x00, 0xC0, 0x00, - 0x06, 0x00, 0x19, 0x99, 0x99, 0x80, 0x61, 0x30, 0x01, 0x94, 0xC1, 0x80, 0x0F, 0xF8, 0x3F, - 0xE0, 0x00, 0xF0, 0xF0, 0xF0, 0x03, 0x26, 0x0E, 0x0C, 0x18, 0x18, 0x00, 0xFF, 0x83, 0xFE, - 0x05, 0x05, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x06, 0x00, - 0xF8, 0x31, 0x83, 0xE0, 0x18, 0x00, 0x01, 0x93, 0x05, 0x06, 0x00, 0x07, 0x06, 0x8C, 0x1C, - 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xC8, 0x60, 0x00, 0x18, 0x00, 0x01, 0x83, - 0x05, 0x07, 0x00, 0x0C, 0xC6, 0x00, 0x01, 0x80, 0x00, 0x18, 0x30, 0x05, 0x07, 0x00, 0xCA, - 0x60, 0x00, 0x1C, 0x00, 0x01, 0xFF, 0x05, 0x07, 0x00, 0x06, 0x6C, 0x00, 0x03, 0x40, 0x00, - 0x1F, 0xF0, 0x05, 0x07, 0x00, 0x31, 0x80, 0x00, 0x24, 0x05, 0x0A, 0x00, 0x01, 0xF0, 0x00, - 0x02, 0x60, 0x05, 0x0A, 0x00, 0x0E, 0x00, 0x00, 0x62, 0x05, 0x0D, 0x00, 0x04, 0x20, 0x05, - 0x0D, 0x00, 0x43, 0x05, 0x0D, 0x00, 0x0C, 0x10, 0x05, 0x0D, 0x00, 0x81, 0x80, 0x05, 0x0C, - 0x00, 0x18, 0x0C, 0x05, 0x0C, 0x00, 0x03, 0x00, 0x60, 0x05, 0x0C, 0x00, 0x60, 0x03, 0x05, - 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x05, 0x0B, 0x00, 0x01, 0x80, 0x00, 0xE0, 0x05, 0x0B, 0x00, - 0x70, 0x00, 0x03, 0x05, 0x0B, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x05, 0x0A, 0x00, 0x03, 0x80, - 0x00, 0x00, 0x78, 0x05, 0x09, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x0A, 0xFF, 0xF0, - 0x00, 0x00}}; +const image_t img_cc_Main = { 116, 53, true, 542, 0x05, { // orig:769, comp:29.52% + 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x05, 0x05, 0x00, 0x3F, 0xE0, 0x05, 0x04, 0x00, 0x01, 0xF8, 0x04, + 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x02, 0x01, 0xF8, 0x05, 0x04, 0x00, 0x60, 0x00, 0x41, 0x04, 0x00, + 0x60, 0x02, 0x08, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, + 0xE0, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x41, 0x04, 0x00, 0x60, 0x02, 0x08, + 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x03, 0xFC, 0x10, 0x40, 0x06, 0x00, 0x20, 0x83, 0xFC, + 0x00, 0xA0, 0x00, 0x00, 0x09, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x09, + 0x00, 0x00, 0x01, 0x1F, 0x05, 0x09, 0x00, 0x0F, 0x88, 0x00, 0x00, 0x20, 0x05, 0x0A, 0xFF, 0xF0, + 0x40, 0x00, 0x04, 0x78, 0x05, 0x09, 0x00, 0x01, 0xE2, 0x00, 0x00, 0x9C, 0x05, 0x0A, 0x00, 0x03, + 0x90, 0x00, 0x13, 0x05, 0x0B, 0x00, 0x0C, 0x80, 0x03, 0xE0, 0x05, 0x0B, 0x00, 0x7C, 0x00, 0x38, + 0x05, 0x05, 0x00, 0xC6, 0xD8, 0x05, 0x04, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0xF0, 0x00, 0x00, + 0x0D, 0x60, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x60, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xD6, + 0xD8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x60, 0x0C, 0x00, 0x18, 0x30, 0x00, 0x00, 0x0D, 0x6D, 0x80, + 0x00, 0x00, 0x31, 0x80, 0x03, 0x01, 0xC0, 0x01, 0x83, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x00, 0x00, + 0x06, 0x0C, 0x00, 0x38, 0x18, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xCA, 0x60, 0x01, 0x81, 0x00, + 0x01, 0x93, 0x05, 0x07, 0x00, 0x0C, 0x46, 0x00, 0x0C, 0x30, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, + 0xCA, 0x60, 0x00, 0xC2, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x07, 0x06, 0x0C, 0x1C, 0x04, + 0x60, 0x0F, 0xF8, 0x3F, 0xE0, 0x05, 0x05, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x64, 0x00, 0xC0, 0x00, + 0x06, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x02, 0x40, 0x0C, 0x00, 0x00, 0x60, + 0x01, 0x99, 0x99, 0x98, 0x03, 0x06, 0x0E, 0x0C, 0x98, 0x2C, 0x00, 0xCE, 0x00, 0xE6, 0x00, 0x10, + 0x90, 0x90, 0x80, 0x65, 0x30, 0x01, 0x94, 0xC3, 0x80, 0x0C, 0x00, 0x00, 0x60, 0x01, 0x09, 0x09, + 0x08, 0x06, 0x73, 0x00, 0x19, 0xCC, 0x18, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x19, 0x99, 0x99, 0x80, + 0x61, 0x30, 0x01, 0x94, 0xC1, 0x80, 0x0F, 0xF8, 0x3F, 0xE0, 0x00, 0xF0, 0xF0, 0xF0, 0x03, 0x26, + 0x0E, 0x0C, 0x18, 0x18, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x01, + 0x80, 0x00, 0x19, 0x30, 0x05, 0x06, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x18, 0x00, 0x01, 0x93, 0x05, + 0x06, 0x00, 0x07, 0x06, 0x8C, 0x1C, 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xC8, 0x60, + 0x00, 0x18, 0x00, 0x01, 0x83, 0x05, 0x07, 0x00, 0x0C, 0xC6, 0x00, 0x01, 0x80, 0x00, 0x18, 0x30, + 0x05, 0x07, 0x00, 0xCA, 0x60, 0x00, 0x1C, 0x00, 0x01, 0xFF, 0x05, 0x07, 0x00, 0x06, 0x6C, 0x00, + 0x03, 0x40, 0x00, 0x1F, 0xF0, 0x05, 0x07, 0x00, 0x31, 0x80, 0x00, 0x24, 0x05, 0x0A, 0x00, 0x01, + 0xF0, 0x00, 0x02, 0x60, 0x05, 0x0A, 0x00, 0x0E, 0x00, 0x00, 0x62, 0x05, 0x0D, 0x00, 0x04, 0x20, + 0x05, 0x0D, 0x00, 0x43, 0x05, 0x0D, 0x00, 0x0C, 0x10, 0x05, 0x0D, 0x00, 0x81, 0x80, 0x05, 0x0C, + 0x00, 0x18, 0x0C, 0x05, 0x0C, 0x00, 0x03, 0x00, 0x60, 0x05, 0x0C, 0x00, 0x60, 0x03, 0x05, 0x0C, + 0x00, 0x0C, 0x00, 0x18, 0x05, 0x0B, 0x00, 0x01, 0x80, 0x00, 0xE0, 0x05, 0x0B, 0x00, 0x70, 0x00, + 0x03, 0x05, 0x0B, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x05, 0x0A, 0x00, 0x03, 0x80, 0x00, 0x00, 0x78, + 0x05, 0x09, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x0A, 0xFF, 0xF0, 0x00, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c index 0889b2a08..4d54cbf22 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_cc_btn_A1 = {7, 7, false, 7, 0, {0xFF, 0xDF, 0x5E, 0x3D, 0x7F, 0xFF, 0x80}}; +const image_t img_cc_btn_A1 = { 7, 7, false, 7, 0, { + 0xFF, 0xDF, 0x5E, 0x3D, 0x7F, 0xFF, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c index bbf5fba1a..89d357282 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_cc_btn_B1 = {7, 7, false, 7, 0, {0xFF, 0xBF, 0x7E, 0x7D, 0x7C, 0xFF, 0x80}}; +const image_t img_cc_btn_B1 = { 7, 7, false, 7, 0, { + 0xFF, 0xBF, 0x7E, 0x7D, 0x7C, 0xFF, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c index 2352ba695..a1e7f2876 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_cc_btn_X1 = {7, 7, false, 7, 0, {0xFF, 0xFF, 0x5F, 0x7D, 0x7F, 0xFF, 0x80}}; +const image_t img_cc_btn_X1 = { 7, 7, false, 7, 0, { + 0xFF, 0xFF, 0x5F, 0x7D, 0x7F, 0xFF, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c index d7192e3e7..01f66b4c7 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_cc_btn_Y1 = {7, 7, false, 7, 0, {0xFF, 0xFF, 0x5E, 0x3F, 0x7D, 0xFF, 0x80}}; +const image_t img_cc_btn_Y1 = { 7, 7, false, 7, 0, { + 0xFF, 0xFF, 0x5E, 0x3F, 0x7D, 0xFF, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c index 300ed5eee..698fcfdd6 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c @@ -6,4 +6,6 @@ #include "images.h" -const image_t img_cc_pad_LR1 = {7, 5, false, 5, 0, {0xFF, 0xFF, 0x1F, 0xFF, 0xE0}}; +const image_t img_cc_pad_LR1 = { 7, 5, false, 5, 0, { + 0xFF, 0xFF, 0x1F, 0xFF, 0xE0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c index feb32d283..b7d104ee4 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c @@ -8,4 +8,6 @@ #include "images.h" -const image_t img_cc_pad_UD1 = {5, 7, false, 5, 0, {0xFF, 0xF7, 0xBD, 0xFF, 0xE0}}; +const image_t img_cc_pad_UD1 = { 5, 7, false, 5, 0, { + 0xFF, 0xF7, 0xBD, 0xFF, 0xE0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c index c70e35334..cf4d7159b 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c @@ -7,10 +7,6 @@ #include "images.h" -const image_t img_cc_trg_L1 = { - 17, - 6, - false, - 13, - 0, - {0x1F, 0xC9, 0x34, 0x92, 0x64, 0x92, 0x54, 0x92, 0x44, 0x93, 0xFC, 0xFE, 0x00}}; +const image_t img_cc_trg_L1 = { 17, 6, false, 13, 0, { + 0x1F, 0xC9, 0x34, 0x92, 0x64, 0x92, 0x54, 0x92, 0x44, 0x93, 0xFC, 0xFE, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c index 47561ab98..9e61a64cc 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c @@ -7,22 +7,6 @@ #include "images.h" -const image_t img_cc_trg_L2 = { - 17, - 6, - true, - 12, - 0x01, - {// orig:13, comp:7.69% - 0x1F, - 0xD5, - 0x35, - 0x55, - 0x75, - 0x01, - 0x04, - 0x55, - 0x57, - 0xFD, - 0x7E, - 0x00}}; +const image_t img_cc_trg_L2 = { 17, 6, true, 12, 0x01, { // orig:13, comp:7.69% + 0x1F, 0xD5, 0x35, 0x55, 0x75, 0x01, 0x04, 0x55, 0x57, 0xFD, 0x7E, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c index 0b51bed35..1b06de5ee 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c @@ -7,10 +7,6 @@ #include "images.h" -const image_t img_cc_trg_L3 = { - 17, - 6, - false, - 13, - 0, - {0x1F, 0xB6, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6F, 0xFB, 0x7E, 0x00}}; +const image_t img_cc_trg_L3 = { 17, 6, false, 13, 0, { + 0x1F, 0xB6, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6F, 0xFB, 0x7E, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c index 062caca77..12f877ab1 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c @@ -7,18 +7,6 @@ #include "images.h" -const image_t img_cc_trg_L4 = { - 17, - 6, - true, - 8, - 0x01, - {// orig:13, comp:38.46% - 0x1F, - 0xFF, - 0xBF, - 0x01, - 0x08, - 0xFF, - 0xFE, - 0x00}}; +const image_t img_cc_trg_L4 = { 17, 6, true, 8, 0x01, { // orig:13, comp:38.46% + 0x1F, 0xFF, 0xBF, 0x01, 0x08, 0xFF, 0xFE, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c index 6f08886d3..a196c0fe1 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c @@ -7,10 +7,6 @@ #include "images.h" -const image_t img_cc_trg_R1 = { - 17, - 6, - false, - 13, - 0, - {0x49, 0xFC, 0x49, 0x25, 0x92, 0x49, 0x24, 0x92, 0x5F, 0xE4, 0x90, 0x0F, 0xE4}}; +const image_t img_cc_trg_R1 = { 17, 6, false, 13, 0, { + 0x49, 0xFC, 0x49, 0x25, 0x92, 0x49, 0x24, 0x92, 0x5F, 0xE4, 0x90, 0x0F, 0xE4 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c index d85e45761..ea5458f39 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c @@ -7,10 +7,6 @@ #include "images.h" -const image_t img_cc_trg_R2 = { - 17, - 6, - false, - 13, - 0, - {0x55, 0xFC, 0x55, 0x55, 0x95, 0x55, 0x75, 0x55, 0x5F, 0xF5, 0x50, 0x0F, 0xD4}}; +const image_t img_cc_trg_R2 = { 17, 6, false, 13, 0, { + 0x55, 0xFC, 0x55, 0x55, 0x95, 0x55, 0x75, 0x55, 0x5F, 0xF5, 0x50, 0x0F, 0xD4 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c index 082d160e2..94cf02bf0 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c @@ -7,10 +7,6 @@ #include "images.h" -const image_t img_cc_trg_R3 = { - 17, - 6, - false, - 13, - 0, - {0xB6, 0xFC, 0x36, 0xDB, 0xAD, 0xB6, 0xFB, 0x6D, 0xBF, 0xFB, 0x68, 0x0F, 0xD8}}; +const image_t img_cc_trg_R3 = { 17, 6, false, 13, 0, { + 0xB6, 0xFC, 0x36, 0xDB, 0xAD, 0xB6, 0xFB, 0x6D, 0xBF, 0xFB, 0x68, 0x0F, 0xD8 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c index 0395058b8..c90fbe20b 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c +++ b/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c @@ -7,21 +7,6 @@ #include "images.h" -const image_t img_cc_trg_R4 = { - 17, - 6, - true, - 11, - 0x00, - {// orig:13, comp:15.38% - 0xFF, - 0xFC, - 0x7F, - 0xFF, - 0xBF, - 0x00, - 0x05, - 0xFF, - 0xF8, - 0x0F, - 0xFC}}; +const image_t img_cc_trg_R4 = { 17, 6, true, 11, 0x00, { // orig:13, comp:15.38% + 0xFF, 0xFC, 0x7F, 0xFF, 0xBF, 0x00, 0x05, 0xFF, 0xF8, 0x0F, 0xFC +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c b/applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c index a8c030fa2..97f09ac17 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c +++ b/applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c @@ -41,49 +41,41 @@ #include "images.h" -const image_t img_csLogo_FULL = { - 124, - 40, - true, - 571, - 0x0B, - {// orig:620, comp:7.90% - 0x3F, 0xFF, 0xFE, 0x10, 0x43, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x0B, 0x05, 0x00, 0x03, 0xFF, - 0xFF, 0xE3, 0x8E, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC0, 0x0B, 0x05, 0x00, 0xFC, 0x00, 0x07, - 0x38, 0xE6, 0x1C, 0xE3, 0x80, 0x73, 0x8E, 0x03, 0xBB, 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x00, - 0x52, 0x8A, 0x71, 0xCE, 0x39, 0xC7, 0x38, 0xA0, 0x22, 0x10, 0x00, 0x00, 0x00, 0xFC, 0x00, - 0x05, 0x28, 0xA7, 0x14, 0xA2, 0x9C, 0x52, 0x8A, 0x03, 0x39, 0x00, 0x00, 0x00, 0x0C, 0xC0, - 0x00, 0x52, 0x8A, 0x51, 0x4A, 0x29, 0x45, 0x28, 0xA0, 0x20, 0x90, 0x00, 0x00, 0x00, 0xFC, - 0x00, 0x07, 0x28, 0xA5, 0x14, 0xA2, 0x94, 0x52, 0x8E, 0x03, 0xB9, 0x40, 0x00, 0x00, 0x0F, - 0xC0, 0x00, 0x02, 0x8A, 0x51, 0xCA, 0xA9, 0x47, 0x28, 0x0B, 0x06, 0x00, 0xCC, 0x00, 0x00, - 0x38, 0xE5, 0xF0, 0xA2, 0x97, 0xC2, 0x80, 0x06, 0xEE, 0x80, 0x00, 0x00, 0x0E, 0xC3, 0x00, - 0x01, 0xFC, 0x5F, 0x0A, 0x29, 0x7C, 0x2B, 0xC0, 0x2A, 0xAA, 0x00, 0x00, 0x00, 0xDC, 0x30, - 0x00, 0x0D, 0x85, 0x1C, 0xAA, 0x94, 0xE2, 0xBE, 0x02, 0xEE, 0xE0, 0x00, 0x00, 0x0E, 0xC0, - 0x30, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x28, 0xA0, 0x22, 0xA2, 0x00, 0x00, 0x00, 0xDC, - 0x04, 0x80, 0x05, 0x05, 0x14, 0xA2, 0x94, 0xA2, 0x8A, 0x07, 0x2E, 0x20, 0x00, 0x08, 0x0E, - 0xC0, 0x48, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x38, 0xA0, 0x00, 0x00, 0x00, 0x01, 0x40, - 0xDC, 0x03, 0x00, 0x05, 0x07, 0x1C, 0xE3, 0x94, 0xA3, 0x8A, 0x0B, 0x04, 0x00, 0xE2, 0x0C, - 0xC0, 0x00, 0x00, 0x70, 0x71, 0xCE, 0x39, 0x4A, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x90, - 0xCC, 0x00, 0x00, 0x07, 0x03, 0xF8, 0x7F, 0x1C, 0xE1, 0xFC, 0x0B, 0x04, 0x00, 0x94, 0x8C, - 0xC0, 0x00, 0x00, 0xF8, 0x3F, 0x87, 0xF1, 0xC7, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x72, 0x24, - 0xCC, 0x0B, 0x0C, 0x00, 0x06, 0x15, 0x2C, 0xC0, 0x0B, 0x0C, 0x00, 0x48, 0x89, 0xCC, 0x00, - 0xFE, 0x10, 0x43, 0xF8, 0xFF, 0x8F, 0xE1, 0xFC, 0x3F, 0x80, 0x00, 0x39, 0x05, 0x3C, 0xC0, - 0x0F, 0xE3, 0x8E, 0x3F, 0x8F, 0xF8, 0xFE, 0x1F, 0xC3, 0xF8, 0x00, 0x03, 0x22, 0x27, 0xDC, - 0x01, 0x87, 0x38, 0xE6, 0x1C, 0xDD, 0x99, 0xF3, 0xFE, 0x61, 0xC0, 0x00, 0x21, 0x50, 0xFE, - 0xC0, 0x1C, 0x52, 0x8A, 0x71, 0x41, 0x41, 0xC0, 0x3A, 0xE7, 0x14, 0x00, 0x1C, 0x88, 0x9E, - 0xDC, 0x01, 0x45, 0x28, 0xA5, 0x14, 0x14, 0x14, 0x02, 0xAA, 0x51, 0x40, 0x01, 0x94, 0x13, - 0xEE, 0xC0, 0x14, 0x52, 0x8A, 0x51, 0x41, 0x41, 0x40, 0x2A, 0xA5, 0x14, 0x00, 0x12, 0x22, - 0x7F, 0xDC, 0x01, 0x47, 0x28, 0xA5, 0x1C, 0x14, 0x14, 0x02, 0xAA, 0x51, 0xC0, 0x0E, 0x05, - 0x0F, 0x3E, 0xC0, 0x1C, 0x02, 0x8A, 0x70, 0x01, 0x41, 0x4E, 0x2A, 0xA7, 0x00, 0x00, 0xC0, - 0x09, 0xF0, 0xCC, 0x00, 0xFC, 0x38, 0xE3, 0xF0, 0x14, 0x17, 0x82, 0xAA, 0x3F, 0x00, 0x09, - 0x01, 0x3F, 0x8F, 0xC0, 0x03, 0xE1, 0xFC, 0x0F, 0x81, 0x41, 0x78, 0x2A, 0xA0, 0xF8, 0x01, - 0x28, 0x27, 0x98, 0xFC, 0x00, 0x07, 0x0D, 0x80, 0x1C, 0x14, 0x14, 0xE2, 0xAA, 0x01, 0xC0, - 0x28, 0x40, 0xF8, 0x0C, 0xC0, 0x1C, 0x50, 0x50, 0x71, 0x41, 0x41, 0x40, 0x28, 0xA7, 0x14, - 0x03, 0x02, 0x9F, 0xC0, 0xFC, 0x01, 0x45, 0x05, 0x05, 0x14, 0x14, 0x14, 0x02, 0xAA, 0x51, - 0x40, 0x32, 0x13, 0xCC, 0x0F, 0xC1, 0x94, 0x50, 0x50, 0x51, 0x41, 0x41, 0x40, 0x28, 0xA5, - 0x14, 0x01, 0xF2, 0x7C, 0x00, 0xFC, 0x19, 0x47, 0x05, 0x05, 0x1C, 0x14, 0x1C, 0x02, 0x8A, - 0x51, 0xC0, 0x0E, 0x0F, 0xE0, 0x0F, 0xC1, 0x9C, 0x30, 0x70, 0x70, 0xC1, 0x41, 0x9F, 0x28, - 0xA7, 0x0C, 0x00, 0x61, 0xE6, 0x00, 0x3F, 0xF8, 0xFE, 0x07, 0x03, 0xF8, 0x1C, 0x0F, 0xE3, - 0x8E, 0x3F, 0x80, 0x03, 0xBE, 0x00, 0x03, 0xFF, 0x8F, 0xE0, 0xF8, 0x3F, 0x81, 0xC0, 0xFE, - 0x38, 0xE3, 0xF8, 0x00, 0x1F, 0xF0, 0x0B, 0x0E, 0x00, 0xF3, 0x0B, 0x0E, 0x00, 0x06, 0x00, - 0x00}}; +const image_t img_csLogo_FULL = { 124, 40, true, 571, 0x0B, { // orig:620, comp:7.90% + 0x3F, 0xFF, 0xFE, 0x10, 0x43, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x0B, 0x05, 0x00, 0x03, 0xFF, 0xFF, + 0xE3, 0x8E, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC0, 0x0B, 0x05, 0x00, 0xFC, 0x00, 0x07, 0x38, 0xE6, + 0x1C, 0xE3, 0x80, 0x73, 0x8E, 0x03, 0xBB, 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x52, 0x8A, 0x71, + 0xCE, 0x39, 0xC7, 0x38, 0xA0, 0x22, 0x10, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x05, 0x28, 0xA7, 0x14, + 0xA2, 0x9C, 0x52, 0x8A, 0x03, 0x39, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x52, 0x8A, 0x51, 0x4A, + 0x29, 0x45, 0x28, 0xA0, 0x20, 0x90, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x07, 0x28, 0xA5, 0x14, 0xA2, + 0x94, 0x52, 0x8E, 0x03, 0xB9, 0x40, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x02, 0x8A, 0x51, 0xCA, 0xA9, + 0x47, 0x28, 0x0B, 0x06, 0x00, 0xCC, 0x00, 0x00, 0x38, 0xE5, 0xF0, 0xA2, 0x97, 0xC2, 0x80, 0x06, + 0xEE, 0x80, 0x00, 0x00, 0x0E, 0xC3, 0x00, 0x01, 0xFC, 0x5F, 0x0A, 0x29, 0x7C, 0x2B, 0xC0, 0x2A, + 0xAA, 0x00, 0x00, 0x00, 0xDC, 0x30, 0x00, 0x0D, 0x85, 0x1C, 0xAA, 0x94, 0xE2, 0xBE, 0x02, 0xEE, + 0xE0, 0x00, 0x00, 0x0E, 0xC0, 0x30, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x28, 0xA0, 0x22, 0xA2, + 0x00, 0x00, 0x00, 0xDC, 0x04, 0x80, 0x05, 0x05, 0x14, 0xA2, 0x94, 0xA2, 0x8A, 0x07, 0x2E, 0x20, + 0x00, 0x08, 0x0E, 0xC0, 0x48, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x38, 0xA0, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xDC, 0x03, 0x00, 0x05, 0x07, 0x1C, 0xE3, 0x94, 0xA3, 0x8A, 0x0B, 0x04, 0x00, 0xE2, + 0x0C, 0xC0, 0x00, 0x00, 0x70, 0x71, 0xCE, 0x39, 0x4A, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x90, + 0xCC, 0x00, 0x00, 0x07, 0x03, 0xF8, 0x7F, 0x1C, 0xE1, 0xFC, 0x0B, 0x04, 0x00, 0x94, 0x8C, 0xC0, + 0x00, 0x00, 0xF8, 0x3F, 0x87, 0xF1, 0xC7, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x72, 0x24, 0xCC, 0x0B, + 0x0C, 0x00, 0x06, 0x15, 0x2C, 0xC0, 0x0B, 0x0C, 0x00, 0x48, 0x89, 0xCC, 0x00, 0xFE, 0x10, 0x43, + 0xF8, 0xFF, 0x8F, 0xE1, 0xFC, 0x3F, 0x80, 0x00, 0x39, 0x05, 0x3C, 0xC0, 0x0F, 0xE3, 0x8E, 0x3F, + 0x8F, 0xF8, 0xFE, 0x1F, 0xC3, 0xF8, 0x00, 0x03, 0x22, 0x27, 0xDC, 0x01, 0x87, 0x38, 0xE6, 0x1C, + 0xDD, 0x99, 0xF3, 0xFE, 0x61, 0xC0, 0x00, 0x21, 0x50, 0xFE, 0xC0, 0x1C, 0x52, 0x8A, 0x71, 0x41, + 0x41, 0xC0, 0x3A, 0xE7, 0x14, 0x00, 0x1C, 0x88, 0x9E, 0xDC, 0x01, 0x45, 0x28, 0xA5, 0x14, 0x14, + 0x14, 0x02, 0xAA, 0x51, 0x40, 0x01, 0x94, 0x13, 0xEE, 0xC0, 0x14, 0x52, 0x8A, 0x51, 0x41, 0x41, + 0x40, 0x2A, 0xA5, 0x14, 0x00, 0x12, 0x22, 0x7F, 0xDC, 0x01, 0x47, 0x28, 0xA5, 0x1C, 0x14, 0x14, + 0x02, 0xAA, 0x51, 0xC0, 0x0E, 0x05, 0x0F, 0x3E, 0xC0, 0x1C, 0x02, 0x8A, 0x70, 0x01, 0x41, 0x4E, + 0x2A, 0xA7, 0x00, 0x00, 0xC0, 0x09, 0xF0, 0xCC, 0x00, 0xFC, 0x38, 0xE3, 0xF0, 0x14, 0x17, 0x82, + 0xAA, 0x3F, 0x00, 0x09, 0x01, 0x3F, 0x8F, 0xC0, 0x03, 0xE1, 0xFC, 0x0F, 0x81, 0x41, 0x78, 0x2A, + 0xA0, 0xF8, 0x01, 0x28, 0x27, 0x98, 0xFC, 0x00, 0x07, 0x0D, 0x80, 0x1C, 0x14, 0x14, 0xE2, 0xAA, + 0x01, 0xC0, 0x28, 0x40, 0xF8, 0x0C, 0xC0, 0x1C, 0x50, 0x50, 0x71, 0x41, 0x41, 0x40, 0x28, 0xA7, + 0x14, 0x03, 0x02, 0x9F, 0xC0, 0xFC, 0x01, 0x45, 0x05, 0x05, 0x14, 0x14, 0x14, 0x02, 0xAA, 0x51, + 0x40, 0x32, 0x13, 0xCC, 0x0F, 0xC1, 0x94, 0x50, 0x50, 0x51, 0x41, 0x41, 0x40, 0x28, 0xA5, 0x14, + 0x01, 0xF2, 0x7C, 0x00, 0xFC, 0x19, 0x47, 0x05, 0x05, 0x1C, 0x14, 0x1C, 0x02, 0x8A, 0x51, 0xC0, + 0x0E, 0x0F, 0xE0, 0x0F, 0xC1, 0x9C, 0x30, 0x70, 0x70, 0xC1, 0x41, 0x9F, 0x28, 0xA7, 0x0C, 0x00, + 0x61, 0xE6, 0x00, 0x3F, 0xF8, 0xFE, 0x07, 0x03, 0xF8, 0x1C, 0x0F, 0xE3, 0x8E, 0x3F, 0x80, 0x03, + 0xBE, 0x00, 0x03, 0xFF, 0x8F, 0xE0, 0xF8, 0x3F, 0x81, 0xC0, 0xFE, 0x38, 0xE3, 0xF8, 0x00, 0x1F, + 0xF0, 0x0B, 0x0E, 0x00, 0xF3, 0x0B, 0x0E, 0x00, 0x06, 0x00, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c b/applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c index 71debc2ff..5cd2f613f 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c +++ b/applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c @@ -13,10 +13,6 @@ #include "images.h" -const image_t img_csLogo_Small = { - 9, - 12, - false, - 14, - 0, - {0xFF, 0xFF, 0xF0, 0x78, 0x3D, 0x06, 0x3F, 0x13, 0x88, 0xC7, 0xE0, 0x7D, 0x3E, 0xF0}}; +const image_t img_csLogo_Small = { 9, 12, false, 14, 0, { + 0xFF, 0xFF, 0xF0, 0x78, 0x3D, 0x06, 0x3F, 0x13, 0x88, 0xC7, 0xE0, 0x7D, 0x3E, 0xF0 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c b/applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c index e3622a626..533b79c7b 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c +++ b/applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c @@ -8,10 +8,6 @@ #include "images.h" -const image_t img_ecp_SCL = { - 16, - 7, - false, - 14, - 0, - {0x3F, 0x8F, 0x3F, 0x8F, 0x31, 0x8C, 0x31, 0x8C, 0x31, 0x8C, 0xF1, 0xFC, 0xF1, 0xFC}}; +const image_t img_ecp_SCL = { 16, 7, false, 14, 0, { + 0x3F, 0x8F, 0x3F, 0x8F, 0x31, 0x8C, 0x31, 0x8C, 0x31, 0x8C, 0xF1, 0xFC, 0xF1, 0xFC +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c b/applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c index 5ce0cbec4..7384fc87c 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c +++ b/applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c @@ -13,7 +13,7 @@ #include "images.h" -const image_t img_ecp_SDA = {17, 12, false, 26, 0, {0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, - 0xFC, 0x0F, 0xFE, 0x43, 0x00, 0x30, 0xC0, - 0x0C, 0x27, 0xFF, 0x03, 0xFF, 0x80, 0x01, - 0x80, 0x01, 0x80, 0x00, 0x80}}; +const image_t img_ecp_SDA = { 17, 12, false, 26, 0, { + 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x0F, 0xFE, 0x43, 0x00, 0x30, 0xC0, 0x0C, 0x27, + 0xFF, 0x03, 0xFF, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x80 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_port.c b/applications/plugins/wii_ec_anal/gfx/img_ecp_port.c index 60f535458..942f0c593 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_ecp_port.c +++ b/applications/plugins/wii_ec_anal/gfx/img_ecp_port.c @@ -43,30 +43,24 @@ #include "images.h" -const image_t img_ecp_port = { - 69, - 42, - true, - 290, - 0x04, - {// orig:363, comp:20.11% - 0x00, 0x2A, 0x04, 0x06, 0xAA, 0xA8, 0x02, 0x04, 0x07, 0xAA, 0x80, 0x2A, 0x04, 0x07, 0xAA, - 0x02, 0x04, 0x07, 0xAA, 0xA0, 0x2A, 0x04, 0x07, 0xAA, 0x82, 0x04, 0x07, 0xAA, 0xA8, 0x2A, - 0x04, 0x07, 0xAA, 0xA3, 0x04, 0x07, 0xFF, 0xAA, 0x1F, 0x04, 0x06, 0xFF, 0xFE, 0xA8, 0xC0, - 0x04, 0x06, 0x00, 0x6A, 0x86, 0x04, 0x06, 0x00, 0x03, 0xAA, 0x30, 0x04, 0x06, 0x00, 0x1A, - 0xA1, 0x80, 0x04, 0x06, 0x00, 0xEA, 0x8C, 0x04, 0x06, 0x00, 0x06, 0xA8, 0x61, 0x04, 0x05, - 0xFF, 0xFC, 0x3A, 0xA3, 0x0F, 0x04, 0x05, 0xFF, 0xE1, 0xAA, 0x18, 0x61, 0x83, 0x0C, 0x18, - 0x60, 0xC3, 0x0E, 0xA8, 0xC3, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x6A, 0x86, 0x18, 0x7F, - 0xC3, 0xFE, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, 0xC3, 0xFE, 0x1F, 0xF0, 0xFF, 0x86, 0x1A, 0xA1, - 0x86, 0x04, 0x05, 0x00, 0x30, 0xEA, 0xBC, 0x30, 0x04, 0x04, 0x00, 0x01, 0x86, 0xFB, 0xE1, - 0x80, 0x04, 0x04, 0x00, 0x0C, 0x3F, 0xFF, 0x0C, 0x04, 0x05, 0x00, 0x61, 0xBE, 0x78, 0x60, - 0x04, 0x04, 0x00, 0x03, 0x0F, 0xF8, 0xC3, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x18, 0x6A, 0x86, - 0x18, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, 0xC3, 0x06, 0x1F, 0xF0, 0xC1, 0x86, - 0x1A, 0xA1, 0x86, 0x18, 0x30, 0x80, 0x86, 0x0C, 0x30, 0xEA, 0x8C, 0x3F, 0x04, 0x05, 0xFF, - 0x86, 0xA8, 0x61, 0x04, 0x05, 0xFF, 0xFC, 0x3A, 0xA3, 0x04, 0x06, 0x00, 0x01, 0xAA, 0x18, - 0x04, 0x06, 0x00, 0x0E, 0xA8, 0xC0, 0x04, 0x06, 0x00, 0x6A, 0x86, 0x00, 0x00, 0x7F, 0xFF, - 0xF0, 0x00, 0x03, 0xAA, 0x30, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x1A, 0xA1, 0x80, 0x00, - 0x1A, 0xA0, 0x0C, 0x00, 0x00, 0xEA, 0x0C, 0x00, 0x00, 0xEA, 0x00, 0x60, 0x00, 0x06, 0xA0, - 0x60, 0x00, 0x06, 0xA0, 0x03, 0x00, 0x00, 0x3A, 0x03, 0x00, 0x00, 0x3A, 0x00, 0x18, 0x00, - 0x01, 0xA0, 0x1F, 0xFF, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFE, 0x00, - 0x07, 0xFF, 0xFF, 0xE0, 0x00}}; +const image_t img_ecp_port = { 69, 42, true, 290, 0x04, { // orig:363, comp:20.11% + 0x00, 0x2A, 0x04, 0x06, 0xAA, 0xA8, 0x02, 0x04, 0x07, 0xAA, 0x80, 0x2A, 0x04, 0x07, 0xAA, 0x02, + 0x04, 0x07, 0xAA, 0xA0, 0x2A, 0x04, 0x07, 0xAA, 0x82, 0x04, 0x07, 0xAA, 0xA8, 0x2A, 0x04, 0x07, + 0xAA, 0xA3, 0x04, 0x07, 0xFF, 0xAA, 0x1F, 0x04, 0x06, 0xFF, 0xFE, 0xA8, 0xC0, 0x04, 0x06, 0x00, + 0x6A, 0x86, 0x04, 0x06, 0x00, 0x03, 0xAA, 0x30, 0x04, 0x06, 0x00, 0x1A, 0xA1, 0x80, 0x04, 0x06, + 0x00, 0xEA, 0x8C, 0x04, 0x06, 0x00, 0x06, 0xA8, 0x61, 0x04, 0x05, 0xFF, 0xFC, 0x3A, 0xA3, 0x0F, + 0x04, 0x05, 0xFF, 0xE1, 0xAA, 0x18, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x0E, 0xA8, 0xC3, 0x0C, + 0x18, 0x60, 0xC3, 0x06, 0x18, 0x6A, 0x86, 0x18, 0x7F, 0xC3, 0xFE, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, + 0xC3, 0xFE, 0x1F, 0xF0, 0xFF, 0x86, 0x1A, 0xA1, 0x86, 0x04, 0x05, 0x00, 0x30, 0xEA, 0xBC, 0x30, + 0x04, 0x04, 0x00, 0x01, 0x86, 0xFB, 0xE1, 0x80, 0x04, 0x04, 0x00, 0x0C, 0x3F, 0xFF, 0x0C, 0x04, + 0x05, 0x00, 0x61, 0xBE, 0x78, 0x60, 0x04, 0x04, 0x00, 0x03, 0x0F, 0xF8, 0xC3, 0x0F, 0xF8, 0x00, + 0x03, 0xFE, 0x18, 0x6A, 0x86, 0x18, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, 0xC3, 0x06, + 0x1F, 0xF0, 0xC1, 0x86, 0x1A, 0xA1, 0x86, 0x18, 0x30, 0x80, 0x86, 0x0C, 0x30, 0xEA, 0x8C, 0x3F, + 0x04, 0x05, 0xFF, 0x86, 0xA8, 0x61, 0x04, 0x05, 0xFF, 0xFC, 0x3A, 0xA3, 0x04, 0x06, 0x00, 0x01, + 0xAA, 0x18, 0x04, 0x06, 0x00, 0x0E, 0xA8, 0xC0, 0x04, 0x06, 0x00, 0x6A, 0x86, 0x00, 0x00, 0x7F, + 0xFF, 0xF0, 0x00, 0x03, 0xAA, 0x30, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x1A, 0xA1, 0x80, 0x00, + 0x1A, 0xA0, 0x0C, 0x00, 0x00, 0xEA, 0x0C, 0x00, 0x00, 0xEA, 0x00, 0x60, 0x00, 0x06, 0xA0, 0x60, + 0x00, 0x06, 0xA0, 0x03, 0x00, 0x00, 0x3A, 0x03, 0x00, 0x00, 0x3A, 0x00, 0x18, 0x00, 0x01, 0xA0, + 0x1F, 0xFF, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, + 0xE0, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_Back.c b/applications/plugins/wii_ec_anal/gfx/img_key_Back.c index 23c17fe2b..d13bcf7f2 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_Back.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_Back.c @@ -10,5 +10,6 @@ #include "images.h" -const image_t img_key_Back = - {9, 9, false, 11, 0, {0x7F, 0x7F, 0xFB, 0xF8, 0x7E, 0xDF, 0xEF, 0xCF, 0xFF, 0x3F, 0x00}}; +const image_t img_key_Back = { 9, 9, false, 11, 0, { + 0x7F, 0x7F, 0xFB, 0xF8, 0x7E, 0xDF, 0xEF, 0xCF, 0xFF, 0x3F, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_D.c b/applications/plugins/wii_ec_anal/gfx/img_key_D.c index 689b9148c..8d182427c 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_D.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_D.c @@ -9,5 +9,6 @@ #include "images.h" -const image_t img_key_D = - {9, 8, false, 9, 0, {0x7F, 0x7F, 0xFF, 0xF8, 0x3E, 0x3F, 0xBF, 0xFE, 0xFE}}; +const image_t img_key_D = { 9, 8, false, 9, 0, { + 0x7F, 0x7F, 0xFF, 0xF8, 0x3E, 0x3F, 0xBF, 0xFE, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_L.c b/applications/plugins/wii_ec_anal/gfx/img_key_L.c index a5fca1a21..1fc5556b1 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_L.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_L.c @@ -10,5 +10,6 @@ #include "images.h" -const image_t img_key_L = - {8, 9, false, 9, 0, {0x7E, 0xFF, 0xF7, 0xE7, 0xC7, 0xE7, 0xF7, 0xFF, 0x7E}}; +const image_t img_key_L = { 8, 9, false, 9, 0, { + 0x7E, 0xFF, 0xF7, 0xE7, 0xC7, 0xE7, 0xF7, 0xFF, 0x7E +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_OK.c b/applications/plugins/wii_ec_anal/gfx/img_key_OK.c index 926d91c2e..ef64128f8 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_OK.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_OK.c @@ -10,5 +10,6 @@ #include "images.h" -const image_t img_key_OK = - {9, 9, false, 11, 0, {0x7F, 0x7F, 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8F, 0xFF, 0x3F, 0x00}}; +const image_t img_key_OK = { 9, 9, false, 11, 0, { + 0x7F, 0x7F, 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8F, 0xFF, 0x3F, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_OKi.c b/applications/plugins/wii_ec_anal/gfx/img_key_OKi.c index aa6f9e692..595f2f431 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_OKi.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_OKi.c @@ -10,5 +10,6 @@ #include "images.h" -const image_t img_key_OKi = - {9, 9, false, 11, 0, {0x7F, 0x60, 0xE7, 0x37, 0xDB, 0xED, 0xF6, 0x73, 0x83, 0x7F, 0x00}}; +const image_t img_key_OKi = { 9, 9, false, 11, 0, { + 0x7F, 0x60, 0xE7, 0x37, 0xDB, 0xED, 0xF6, 0x73, 0x83, 0x7F, 0x00 +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_R.c b/applications/plugins/wii_ec_anal/gfx/img_key_R.c index 8b97c7b48..87cc385bc 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_R.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_R.c @@ -10,5 +10,6 @@ #include "images.h" -const image_t img_key_R = - {8, 9, false, 9, 0, {0x7E, 0xFF, 0xEF, 0xE7, 0xE3, 0xE7, 0xEF, 0xFF, 0x7E}}; +const image_t img_key_R = { 8, 9, false, 9, 0, { + 0x7E, 0xFF, 0xEF, 0xE7, 0xE3, 0xE7, 0xEF, 0xFF, 0x7E +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_U.c b/applications/plugins/wii_ec_anal/gfx/img_key_U.c index 65f4cd9e0..aca5bb62a 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_U.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_U.c @@ -9,5 +9,6 @@ #include "images.h" -const image_t img_key_U = - {9, 8, false, 9, 0, {0x7F, 0x7F, 0xFD, 0xFC, 0x7C, 0x1F, 0xFF, 0xFE, 0xFE}}; +const image_t img_key_U = { 9, 8, false, 9, 0, { + 0x7F, 0x7F, 0xFD, 0xFC, 0x7C, 0x1F, 0xFF, 0xFE, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_Ui.c b/applications/plugins/wii_ec_anal/gfx/img_key_Ui.c index 30c60c66e..b740780ad 100644 --- a/applications/plugins/wii_ec_anal/gfx/img_key_Ui.c +++ b/applications/plugins/wii_ec_anal/gfx/img_key_Ui.c @@ -9,5 +9,6 @@ #include "images.h" -const image_t img_key_Ui = - {9, 8, false, 9, 0, {0x7F, 0x60, 0xE2, 0x33, 0x9B, 0xEC, 0x07, 0x06, 0xFE}}; +const image_t img_key_Ui = { 9, 8, false, 9, 0, { + 0x7F, 0x60, 0xE2, 0x33, 0x9B, 0xEC, 0x07, 0x06, 0xFE +}}; diff --git a/applications/plugins/wii_ec_anal/i2c_workaround.h b/applications/plugins/wii_ec_anal/i2c_workaround.h index b24efaf48..de1dbba54 100644 --- a/applications/plugins/wii_ec_anal/i2c_workaround.h +++ b/applications/plugins/wii_ec_anal/i2c_workaround.h @@ -40,70 +40,62 @@ void furi_hal_i2c_release (FuriHalI2cBusHandle* handle) */ -#ifndef I2C_WORKAROUND_H_ -#define I2C_WORKAROUND_H_ +#ifndef I2C_WORKAROUND_H_ +#define I2C_WORKAROUND_H_ -#include +#include #define ENABLE_WORKAROUND 1 #if ENABLE_WORKAROUND == 1 -//+============================================================================ ======================================== -static inline bool furi_hal_Wi2c_is_device_ready( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_is_device_ready(bus, addr, tmo); - furi_hal_i2c_release(bus); - return rv; -} + //+============================================================================ ======================================== + static inline + bool furi_hal_Wi2c_is_device_ready (FuriHalI2cBusHandle* const bus, const uint8_t addr, const uint32_t tmo) + { + furi_hal_i2c_acquire(bus); + bool rv = furi_hal_i2c_is_device_ready(bus, addr, tmo); + furi_hal_i2c_release(bus); + return rv; + } -//+============================================================================ -static inline bool furi_hal_Wi2c_tx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* buf, - const size_t len, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_tx(bus, addr, buf, len, tmo); - furi_hal_i2c_release(bus); - return rv; -} + //+============================================================================ + static inline + bool furi_hal_Wi2c_tx ( FuriHalI2cBusHandle* const bus, const uint8_t addr, + const void* buf, const size_t len, const uint32_t tmo ) + { + furi_hal_i2c_acquire(bus); + bool rv = furi_hal_i2c_tx(bus, addr, buf, len, tmo); + furi_hal_i2c_release(bus); + return rv; + } -//+============================================================================ -static inline bool furi_hal_Wi2c_rx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - void* buf, - const size_t len, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_rx(bus, addr, buf, len, tmo); - furi_hal_i2c_release(bus); - return rv; -} + //+============================================================================ + static inline + bool furi_hal_Wi2c_rx ( FuriHalI2cBusHandle* const bus, const uint8_t addr, + void* buf, const size_t len, const uint32_t tmo ) + { + furi_hal_i2c_acquire(bus); + bool rv = furi_hal_i2c_rx(bus, addr, buf, len, tmo); + furi_hal_i2c_release(bus); + return rv; + } -//+============================================================================ -static inline bool furi_hal_Wi2c_trx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* tx, - const size_t txlen, - void* rx, - const size_t rxlen, - const uint32_t tmo) { - bool rv = furi_hal_Wi2c_tx(bus, addr, tx, txlen, tmo); - if(rv) rv = furi_hal_Wi2c_rx(bus, addr, rx, rxlen, tmo); - return rv; -} + //+============================================================================ + static inline + bool furi_hal_Wi2c_trx ( FuriHalI2cBusHandle* const bus, const uint8_t addr, + const void* tx, const size_t txlen, + void* rx, const size_t rxlen, const uint32_t tmo ) + { + bool rv = furi_hal_Wi2c_tx(bus, addr, tx, txlen, tmo); + if (rv) rv = furi_hal_Wi2c_rx(bus, addr, rx, rxlen, tmo); + return rv; + } -//----------------------------------------------------------------------------- ---------------------------------------- -#define furi_hal_i2c_is_device_ready(...) furi_hal_Wi2c_is_device_ready(__VA_ARGS__) -#define furi_hal_i2c_tx(...) furi_hal_Wi2c_tx(__VA_ARGS__) -#define furi_hal_i2c_rx(...) furi_hal_Wi2c_rx(__VA_ARGS__) -#define furi_hal_i2c_trx(...) furi_hal_Wi2c_trx(__VA_ARGS__) + //----------------------------------------------------------------------------- ---------------------------------------- +# define furi_hal_i2c_is_device_ready(...) furi_hal_Wi2c_is_device_ready(__VA_ARGS__) +# define furi_hal_i2c_tx(...) furi_hal_Wi2c_tx(__VA_ARGS__) +# define furi_hal_i2c_rx(...) furi_hal_Wi2c_rx(__VA_ARGS__) +# define furi_hal_i2c_trx(...) furi_hal_Wi2c_trx(__VA_ARGS__) #endif //ENABLE_WORKAROUND @@ -111,21 +103,17 @@ static inline bool furi_hal_Wi2c_trx( // Some devices take a moment to respond to read requests // The puts a delay between the address being set and the data being read // -static inline bool furi_hal_i2c_trxd( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* tx, - const size_t txlen, - void* rx, - const size_t rxlen, - const uint32_t tmo, - const uint32_t us) { - bool rv = furi_hal_i2c_tx(bus, addr, tx, txlen, tmo); - if(rv) { - furi_delay_us(us); - rv = furi_hal_i2c_rx(bus, addr, rx, rxlen, tmo); - } - return rv; +static inline +bool furi_hal_i2c_trxd ( FuriHalI2cBusHandle* const bus, const uint8_t addr, + const void* tx, const size_t txlen, + void* rx, const size_t rxlen, const uint32_t tmo, const uint32_t us ) +{ + bool rv = furi_hal_i2c_tx(bus, addr, tx, txlen, tmo); + if (rv) { + furi_delay_us(us); + rv = furi_hal_i2c_rx(bus, addr, rx, rxlen, tmo); + } + return rv; } #endif //I2C_WORKAROUND_H_ diff --git a/applications/plugins/wii_ec_anal/notes.txt b/applications/plugins/wii_ec_anal/notes.txt deleted file mode 100644 index 61b6e29af..000000000 --- a/applications/plugins/wii_ec_anal/notes.txt +++ /dev/null @@ -1,87 +0,0 @@ -//+============================================================================ ======================================== -// Select font -// A full list of u8g2 fonts can be found here: -// https://github.com/olikraus/u8g2/wiki/fntlistall -// ...and here are the ones available in FZ (currently: all of them): -// grep -P '.*u8g2.*\[[0-9]*\]' lib/u8g2/u8g2_fonts.c | sed 's/.*\(u8g2_.*\)\[.*/\1/' -// -#if 0 //! Extra fonts is just too memory hungry -#include -void setFont (Canvas* const canvas, const uint8_t* font) -{ - u8g2_SetFontMode(&canvas->fb, 1); // no idea - but canvas.c does it - u8g2_SetFont(&canvas->fb, font); -} -#endif - -litui : @BlueChip for posterity, the function to break at is flipper_application_spawn. At that point, you can set new breakpoints in your fap code and continue. - -/* - -This is wrong on quite a few levels! -https://training.ti.com/introduction-i2c-reserved-addresses - -void doit (void) -{ - furi_hal_i2c_acquire(&furi_hal_i2c_handle_external); - printf("Scanning external i2c on PC0(SCL)/PC1(SDA)\r\n" - "Clock: 100khz, 7bit address\r\n" - "\r\n"); - printf(" | 0 1 2 3 4 5 6 7 8 9 A B C D E F\r\n"); - printf("--+--------------------------------\r\n"); - for(uint8_t row = 0; row < 0x8; row++) { - printf("%x | ", row); - for(uint8_t column = 0; column <= 0xF; column++) { - bool ret = furi_hal_i2c_is_device_ready( - &furi_hal_i2c_handle_external, ((row << 4) + column) << 1, 2); - printf("%c ", ret ? '#' : '-'); - } - printf("\r\n"); - } - furi_hal_i2c_release(&furi_hal_i2c_handle_external); -} -*/ - - -region locking : firmware/targets/f7/furi_hal/furi_hal_region.c - - -# if 0 //! scrolling works beautifully, but the LCD refresh can't keep up :( - // Waveform - if (cnt) { // start - for (int a = ACC_1; a < ACC_N; a++) { - canvas_draw_dot(canvas, x,y[a]+v[a][idx]); - for (int i = 1; i < aw -cnt; i++) { - canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); - } - } - } else { // scroll - for (int a = ACC_1; a < ACC_N; a++) { - for (int i = 0; i < aw; i++) { - int off = (idx +i) %aw; - int prev = off ? off-1 : aw-1; - canvas_draw_line(canvas, x+i,y[a]+v[a][prev] , x+i,y[a]+v[a][off]); - } - } - } - -# else - int end = idx ? idx : aw; - for (int a = ACC_1; a < ACC_N; a++) { - canvas_draw_dot(canvas, x,y[a]+v[a][idx]); - if (state->apause) { - for (int i = 1; i < end; i++) - canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); - } else { - for (int i = 1; i < end; i++) - canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); - for (int i = end+10; i < aw -cnt; i++) - canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); - } - } - - // Wipe bar - if (end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); - if (++end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); - if (++end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); -# endif diff --git a/applications/plugins/wii_ec_anal/wii_anal.c b/applications/plugins/wii_ec_anal/wii_anal.c index f0af1c9c5..fdf718b63 100644 --- a/applications/plugins/wii_ec_anal/wii_anal.c +++ b/applications/plugins/wii_ec_anal/wii_anal.c @@ -3,34 +3,34 @@ // // System libs -#include // malloc -#include // uint32_t -#include // __VA_ARGS__ -#include -#include +#include // malloc +#include // uint32_t +#include // __VA_ARGS__ +#include +#include // FlipperZero libs -#include // Core API -#include // GUI (screen/keyboard) API -#include // GUI Input extensions -#include +#include // Core API +#include // GUI (screen/keyboard) API +#include // GUI Input extensions +#include // Do this first! #define ERR_C_ // Do this in precisely ONE file -#include "err.h" // Error numbers & messages +#include "err.h" // Error numbers & messages -#include "bc_logging.h" +#include "bc_logging.h" // Local headers -#include "wii_anal.h" // Various enums and struct declarations -#include "wii_i2c.h" // Wii i2c functions -#include "wii_ec.h" // Wii Extension Controller functions (eg. draw) -#include "wii_anal_keys.h" // key mappings -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_ec.h" // Wii controller events +#include "wii_anal.h" // Various enums and struct declarations +#include "wii_i2c.h" // Wii i2c functions +#include "wii_ec.h" // Wii Extension Controller functions (eg. draw) +#include "wii_anal_keys.h" // key mappings +#include "gfx/images.h" // Images +#include "wii_anal_lcd.h" // Drawing functions +#include "wii_anal_ec.h" // Wii controller events -#include "wii_anal_ver.h" // Version number +#include "wii_anal_ver.h" // Version number //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // OOOOO // SSSSS CCCCC AAA L L BBBB AAA CCCC K K SSSSS @@ -44,42 +44,48 @@ // OS Callback : Timer tick // We register this function to be called when the OS signals a timer 'tick' event // -static void cbTimer(FuriMessageQueue* queue) { - ENTER; - furi_assert(queue); +static +void cbTimer (FuriMessageQueue* queue) +{ + ENTER; + furi_assert(queue); - eventMsg_t message = {.id = EVID_TICK}; - furi_message_queue_put(queue, &message, 0); + eventMsg_t message = {.id = EVID_TICK}; + furi_message_queue_put(queue, &message, 0); - LEAVE; - return; + LEAVE; + return; } //+============================================================================ ======================================== // OS Callback : Keypress // We register this function to be called when the OS detects a keypress // -static void cbInput(InputEvent* event, FuriMessageQueue* queue) { - ENTER; - furi_assert(queue); - furi_assert(event); +static +void cbInput (InputEvent* event, FuriMessageQueue* queue) +{ + ENTER; + furi_assert(queue); + furi_assert(event); - // Put an "input" event message on the message queue - eventMsg_t message = {.id = EVID_KEY, .input = *event}; - furi_message_queue_put(queue, &message, FuriWaitForever); + // Put an "input" event message on the message queue + eventMsg_t message = {.id = EVID_KEY, .input = *event}; + furi_message_queue_put(queue, &message, FuriWaitForever); - LEAVE; - return; + LEAVE; + return; } //+============================================================================ // Show version number // -static void showVer(Canvas* const canvas) { - show(canvas, 0, 59, &img_3x5_v, SHOW_SET_BLK); - show(canvas, 4, 59, VER_MAJ, SHOW_SET_BLK); - canvas_draw_frame(canvas, 8, 62, 2, 2); - show(canvas, 11, 59, VER_MIN, SHOW_SET_BLK); +static +void showVer (Canvas* const canvas) +{ + show(canvas, 0,59, &img_3x5_v, SHOW_SET_BLK); + show(canvas, 4,59, VER_MAJ, SHOW_SET_BLK); + canvas_draw_frame(canvas, 8,62, 2,2); + show(canvas, 11,59, VER_MIN, SHOW_SET_BLK); } //+============================================================================ @@ -89,103 +95,105 @@ static void showVer(Canvas* const canvas) { // We actually instruct the OS to perform this request, after we update the interface // I guess it's possible that this instruction may able be issued by other threads !? // -static void cbDraw(Canvas* const canvas, void* ctx) { - ENTER; - furi_assert(canvas); - furi_assert(ctx); +static +void cbDraw (Canvas* const canvas, void* ctx) +{ + ENTER; + furi_assert(canvas); + furi_assert(ctx); - state_t* state = NULL; + state_t* state = NULL; - // Try to acquire the mutex for the plugin state variables, timeout = 25mS - if(!(state = (state_t*)acquire_mutex((ValueMutex*)ctx, 25))) return; + // Try to acquire the mutex for the plugin state variables, timeout = 25mS + if ( !(state = (state_t*)acquire_mutex((ValueMutex*)ctx, 25)) ) return ; - switch(state->scene) { - //--------------------------------------------------------------------- - case SCENE_SPLASH: - show(canvas, 2, 0, &img_csLogo_FULL, SHOW_SET_BLK); + switch (state->scene) { + //--------------------------------------------------------------------- + case SCENE_SPLASH: + show(canvas, 2,0, &img_csLogo_FULL, SHOW_SET_BLK); - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 64, 43, AlignCenter, AlignTop, "Wii Extension Controller"); - canvas_draw_str_aligned(canvas, 64, 55, AlignCenter, AlignTop, "Protocol Analyser"); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 64,43, AlignCenter, AlignTop, "Wii Extension Controller"); + canvas_draw_str_aligned(canvas, 64,55, AlignCenter, AlignTop, "Protocol Analyser"); - showVer(canvas); + showVer(canvas); - break; + break; - //--------------------------------------------------------------------- - case SCENE_RIP: - show(canvas, 0, 0, &img_RIP, SHOW_SET_BLK); - break; + //--------------------------------------------------------------------- + case SCENE_RIP: + show(canvas, 0,0, &img_RIP, SHOW_SET_BLK); + break; - //--------------------------------------------------------------------- - case SCENE_WAIT: -#define xo 2 + //--------------------------------------------------------------------- + case SCENE_WAIT: +# define xo 2 - show(canvas, 3 + xo, 10, &img_ecp_port, SHOW_SET_BLK); + show(canvas, 3+xo,10, &img_ecp_port, SHOW_SET_BLK); - BOX_TL(22 + xo, 6, 82 + xo, 23); // 3v3 - BOX_TL(48 + xo, 21, 82 + xo, 23); // C1 - BOX_BL(22 + xo, 41, 82 + xo, 58); // C0 - BOX_BL(48 + xo, 41, 82 + xo, 44); // Gnd + BOX_TL(22+xo, 6, 82+xo,23); // 3v3 + BOX_TL(48+xo,21, 82+xo,23); // C1 + BOX_BL(22+xo,41, 82+xo,58); // C0 + BOX_BL(48+xo,41, 82+xo,44); // Gnd - show(canvas, 90 + xo, 3, &img_6x8_3, SHOW_SET_BLK); // 3v3 - show(canvas, 97 + xo, 3, &img_6x8_v, SHOW_SET_BLK); - show(canvas, 104 + xo, 3, &img_6x8_3, SHOW_SET_BLK); + show(canvas, 90+xo, 3, &img_6x8_3, SHOW_SET_BLK); // 3v3 + show(canvas, 97+xo, 3, &img_6x8_v, SHOW_SET_BLK); + show(canvas, 104+xo, 3, &img_6x8_3, SHOW_SET_BLK); - show(canvas, 90 + xo, 18, &img_6x8_C, SHOW_SET_BLK); // C1 <-> - show(canvas, 98 + xo, 18, &img_6x8_1, SHOW_SET_BLK); - show(canvas, 107 + xo, 16, &img_ecp_SDA, SHOW_SET_BLK); + show(canvas, 90+xo,18, &img_6x8_C, SHOW_SET_BLK); // C1 <-> + show(canvas, 98+xo,18, &img_6x8_1, SHOW_SET_BLK); + show(canvas, 107+xo,16, &img_ecp_SDA, SHOW_SET_BLK); - show(canvas, 90 + xo, 40, &img_6x8_G, SHOW_SET_BLK); // Gnd - show(canvas, 97 + xo, 40, &img_6x8_n, SHOW_SET_BLK); - show(canvas, 104 + xo, 40, &img_6x8_d, SHOW_SET_BLK); + show(canvas, 90+xo,40, &img_6x8_G, SHOW_SET_BLK); // Gnd + show(canvas, 97+xo,40, &img_6x8_n, SHOW_SET_BLK); + show(canvas, 104+xo,40, &img_6x8_d, SHOW_SET_BLK); - show(canvas, 90 + xo, 54, &img_6x8_C, SHOW_SET_BLK); // C0 _-_- - show(canvas, 98 + xo, 54, &img_6x8_0, SHOW_SET_BLK); - show(canvas, 108 + xo, 54, &img_ecp_SCL, SHOW_SET_BLK); + show(canvas, 90+xo,54, &img_6x8_C, SHOW_SET_BLK); // C0 _-_- + show(canvas, 98+xo,54, &img_6x8_0, SHOW_SET_BLK); + show(canvas, 108+xo,54, &img_ecp_SCL, SHOW_SET_BLK); - show(canvas, 0, 0, &img_csLogo_Small, SHOW_SET_BLK); - showVer(canvas); + show(canvas, 0,0, &img_csLogo_Small, SHOW_SET_BLK); + showVer(canvas); -#undef xo - break; +# undef xo + break; - //--------------------------------------------------------------------- - case SCENE_DEBUG: - canvas_set_font(canvas, FontSecondary); + //--------------------------------------------------------------------- + case SCENE_DEBUG: + canvas_set_font(canvas, FontSecondary); - show(canvas, 0, 0, &img_key_U, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 0, AlignLeft, AlignTop, "Initialise Perhipheral"); + show(canvas, 0,0, &img_key_U, SHOW_SET_BLK); + canvas_draw_str_aligned(canvas, 11, 0, AlignLeft, AlignTop, "Initialise Perhipheral"); - show(canvas, 0, 11, &img_key_OK, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 11, AlignLeft, AlignTop, "Read values [see log]"); + show(canvas, 0,11, &img_key_OK, SHOW_SET_BLK); + canvas_draw_str_aligned(canvas, 11,11, AlignLeft, AlignTop, "Read values [see log]"); - show(canvas, 0, 23, &img_key_D, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 22, AlignLeft, AlignTop, "Restart Scanner"); + show(canvas, 0,23, &img_key_D, SHOW_SET_BLK); + canvas_draw_str_aligned(canvas, 11,22, AlignLeft, AlignTop, "Restart Scanner"); - show(canvas, 0, 33, &img_key_Back, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 33, AlignLeft, AlignTop, "Exit"); + show(canvas, 0,33, &img_key_Back, SHOW_SET_BLK); + canvas_draw_str_aligned(canvas, 11,33, AlignLeft, AlignTop, "Exit"); - break; + break ; - //--------------------------------------------------------------------- - default: - if(state->ec.pidx >= PID_ERROR) { - ERROR("%s : bad PID = %d", __func__, state->ec.pidx); - } else { - if((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].show) - ecId[PID_UNKNOWN].show(canvas, state); - else - ecId[state->ec.pidx].show(canvas, state); - } - break; - } + //--------------------------------------------------------------------- + default: + if (state->ec.pidx >= PID_ERROR) { + ERROR("%s : bad PID = %d", __func__, state->ec.pidx); + } else { + if ((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].show) + ecId[PID_UNKNOWN].show(canvas, state); + else + ecId[state->ec.pidx].show(canvas, state); + } + break; + } - // Release the mutex - release_mutex((ValueMutex*)ctx, state); + // Release the mutex + release_mutex((ValueMutex*)ctx, state); - LEAVE; - return; + LEAVE; + return; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -199,54 +207,56 @@ static void cbDraw(Canvas* const canvas, void* ctx) { //+============================================================================ ======================================== // Initialise plugin state variables // -static inline bool stateInit(state_t* const state) { - ENTER; - furi_assert(state); +static inline +bool stateInit (state_t* const state) +{ + ENTER; + furi_assert(state); - bool rv = true; // assume success + bool rv = true; // assume success - // Enable the main loop - state->run = true; + // Enable the main loop + state->run = true; - // Timer - state->timerEn = false; - state->timer = NULL; - state->timerHz = furi_kernel_get_tick_frequency(); - state->fps = 30; + // Timer + state->timerEn = false; + state->timer = NULL; + state->timerHz = furi_kernel_get_tick_frequency(); + state->fps = 30; - // Scene - state->scene = SCENE_SPLASH; - state->scenePrev = SCENE_NONE; - state->scenePegg = SCENE_NONE; + // Scene + state->scene = SCENE_SPLASH; + state->scenePrev = SCENE_NONE; + state->scenePegg = SCENE_NONE; - state->hold = 0; // show hold meters (-1=lowest, 0=current, +1=highest} - state->calib = CAL_TRACK; - state->pause = false; // animation running - state->apause = false; // auto-pause animation + state->hold = 0; // show hold meters (-1=lowest, 0=current, +1=highest} + state->calib = CAL_TRACK; + state->pause = false; // animation running + state->apause = false; // auto-pause animation - // Notifications - state->notify = NULL; + // Notifications + state->notify = NULL; - // Perhipheral - state->ec.init = false; - state->ec.pidx = PID_UNKNOWN; - state->ec.sid = ecId[state->ec.pidx].name; + // Perhipheral + state->ec.init = false; + state->ec.pidx = PID_UNKNOWN; + state->ec.sid = ecId[state->ec.pidx].name; - // Controller data - memset(state->ec.pid, 0xC5, PID_LEN); // Cyborg 5ystems - memset(state->ec.calF, 0xC5, CAL_LEN); - memset(state->ec.joy, 0xC5, JOY_LEN); + // Controller data + memset(state->ec.pid, 0xC5, PID_LEN); // Cyborg 5ystems + memset(state->ec.calF, 0xC5, CAL_LEN); + memset(state->ec.joy, 0xC5, JOY_LEN); - // Encryption details - state->ec.encrypt = false; - memset(state->ec.encKey, 0x00, ENC_LEN); + // Encryption details + state->ec.encrypt = false; + memset(state->ec.encKey, 0x00, ENC_LEN); - // Seed the PRNG - // CYCCNT --> lib/STM32CubeWB/Drivers/CMSIS/Include/core_cm7.h - // srand(DWT->CYCCNT); + // Seed the PRNG + // CYCCNT --> lib/STM32CubeWB/Drivers/CMSIS/Include/core_cm7.h +// srand(DWT->CYCCNT); - LEAVE; - return rv; + LEAVE; + return rv; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -260,284 +270,271 @@ static inline bool stateInit(state_t* const state) { //+============================================================================ ======================================== // Enable/Disable scanning // -void timerEn(state_t* state, bool on) { - ENTER; - furi_assert(state); +void timerEn (state_t* state, bool on) +{ + ENTER; + furi_assert(state); - // ENable scanning - if(on) { - if(state->timerEn) { - WARN(wii_errs[WARN_SCAN_START]); - } else { - // Set the timer to fire at 'fps' times/second - if(furi_timer_start(state->timer, state->timerHz / state->fps) == FuriStatusOk) { - state->timerEn = true; - INFO("%s : monitor started", __func__); - } else { - ERROR(wii_errs[ERR_TIMER_START]); - } - } + // ENable scanning + if (on) { + if (state->timerEn) { + WARN(wii_errs[WARN_SCAN_START]); + } else { + // Set the timer to fire at 'fps' times/second + if (furi_timer_start(state->timer, state->timerHz/state->fps) == FuriStatusOk) { + state->timerEn = true; + INFO("%s : monitor started", __func__); + } else { + ERROR(wii_errs[ERR_TIMER_START]); + } + } - // DISable scanning - } else { - if(!state->timerEn) { - WARN(wii_errs[WARN_SCAN_STOP]); - } else { - // Stop the timer - if(furi_timer_stop(state->timer) == FuriStatusOk) { - state->timerEn = false; - INFO("%s : monitor stopped", __func__); - } else { - ERROR(wii_errs[ERR_TIMER_STOP]); - } - } - } + // DISable scanning + } else { + if (!state->timerEn) { + WARN(wii_errs[WARN_SCAN_STOP]); + } else { + // Stop the timer + if (furi_timer_stop(state->timer) == FuriStatusOk) { + state->timerEn = false; + INFO("%s : monitor stopped", __func__); + } else { + ERROR(wii_errs[ERR_TIMER_STOP]); + } + } + } - LEAVE; - return; + LEAVE; + return; } //+============================================================================ ======================================== // Plugin entry point // -int32_t wii_ec_anal(void) { - ENTER; +int32_t wii_ec_anal (void) +{ + ENTER; - // ===== Variables ===== - err_t error = 0; // assume success - Gui* gui = NULL; - ViewPort* vpp = NULL; - state_t* state = NULL; - ValueMutex mutex = {0}; - FuriMessageQueue* queue = NULL; - const uint32_t queueSz = 20; // maximum messages in queue - uint32_t tmo = (3.5f * 1000); // timeout splash screen after N seconds + // ===== Variables ===== + err_t error = 0; // assume success + Gui* gui = NULL; + ViewPort* vpp = NULL; + state_t* state = NULL; + ValueMutex mutex = {0}; + FuriMessageQueue* queue = NULL; + const uint32_t queueSz = 20; // maximum messages in queue + uint32_t tmo = (3.5f *1000); // timeout splash screen after N seconds - // The queue will contain plugin event-messages - // --> local - eventMsg_t msg = {0}; + // The queue will contain plugin event-messages + // --> local + eventMsg_t msg = {0}; - INFO("BEGIN"); + INFO("BEGIN"); - // ===== Message queue ===== - // 1. Create a message queue (for up to 8 (keyboard) event messages) - if(!(queue = furi_message_queue_alloc(queueSz, sizeof(msg)))) { - ERROR(wii_errs[(error = ERR_MALLOC_QUEUE)]); - goto bail; - } + // ===== Message queue ===== + // 1. Create a message queue (for up to 8 (keyboard) event messages) + if ( !(queue = furi_message_queue_alloc(queueSz, sizeof(msg))) ) { + ERROR(wii_errs[(error = ERR_MALLOC_QUEUE)]); + goto bail; + } - // ===== Create GUI Interface ===== - // 2. Create a GUI interface - if(!(gui = furi_record_open("gui"))) { - ERROR(wii_errs[(error = ERR_NO_GUI)]); - goto bail; - } + // ===== Create GUI Interface ===== + // 2. Create a GUI interface + if ( !(gui = furi_record_open("gui")) ) { + ERROR(wii_errs[(error = ERR_NO_GUI)]); + goto bail; + } - // ===== Plugin state variables ===== - // 3. Allocate space on the heap for the plugin state variables - if(!(state = malloc(sizeof(state_t)))) { - ERROR(wii_errs[(error = ERR_MALLOC_STATE)]); - goto bail; - } - // 4. Initialise the plugin state variables - if(!stateInit(state)) { - // error message(s) is/are output by stateInit() - error = 15; - goto bail; - } - // 5. Create a mutex for (reading/writing) the plugin state variables - if(!init_mutex(&mutex, state, sizeof(state))) { - ERROR(wii_errs[(error = ERR_NO_MUTEX)]); - goto bail; - } + // ===== Plugin state variables ===== + // 3. Allocate space on the heap for the plugin state variables + if ( !(state = malloc(sizeof(state_t))) ) { + ERROR(wii_errs[(error = ERR_MALLOC_STATE)]); + goto bail; + } + // 4. Initialise the plugin state variables + if (!stateInit(state)) { + // error message(s) is/are output by stateInit() + error = 15; + goto bail; + } + // 5. Create a mutex for (reading/writing) the plugin state variables + if (!init_mutex(&mutex, state, sizeof(state))) { + ERROR(wii_errs[(error = ERR_NO_MUTEX)]); + goto bail; + } - // ===== Viewport ===== - // 6. Allocate space on the heap for the viewport - if(!(vpp = view_port_alloc())) { - ERROR(wii_errs[(error = ERR_MALLOC_VIEW)]); - goto bail; - } - // 7a. Register a callback for input events - view_port_input_callback_set(vpp, cbInput, queue); - // 7b. Register a callback for draw events - view_port_draw_callback_set(vpp, cbDraw, &mutex); + // ===== Viewport ===== + // 6. Allocate space on the heap for the viewport + if ( !(vpp = view_port_alloc()) ) { + ERROR(wii_errs[(error = ERR_MALLOC_VIEW)]); + goto bail; + } + // 7a. Register a callback for input events + view_port_input_callback_set(vpp, cbInput, queue); + // 7b. Register a callback for draw events + view_port_draw_callback_set(vpp, cbDraw, &mutex); - // ===== Start GUI Interface ===== - // 8. Attach the viewport to the GUI - gui_add_view_port(gui, vpp, GuiLayerFullscreen); + // ===== Start GUI Interface ===== + // 8. Attach the viewport to the GUI + gui_add_view_port(gui, vpp, GuiLayerFullscreen); - // ===== Timer ===== - // 9. Allocate a timer - if(!(state->timer = furi_timer_alloc(cbTimer, FuriTimerTypePeriodic, queue))) { - ERROR(wii_errs[(error = ERR_NO_TIMER)]); - goto bail; - } + // ===== Timer ===== + // 9. Allocate a timer + if ( !(state->timer = furi_timer_alloc(cbTimer, FuriTimerTypePeriodic, queue)) ) { + ERROR(wii_errs[(error = ERR_NO_TIMER)]); + goto bail; + } - // === System Notifications === - // 10. Acquire a handle for the system notification queue - if(!(state->notify = furi_record_open(RECORD_NOTIFICATION))) { - ERROR(wii_errs[(error = ERR_NO_NOTIFY)]); - goto bail; - } - patBacklight(state); // Turn on the backlight [qv. remote FAP launch] + // === System Notifications === + // 10. Acquire a handle for the system notification queue + if ( !(state->notify = furi_record_open(RECORD_NOTIFICATION)) ) { + ERROR(wii_errs[(error = ERR_NO_NOTIFY)]); + goto bail; + } + patBacklight(state); // Turn on the backlight [qv. remote FAP launch] - INFO("INITIALISED"); + INFO("INITIALISED"); - // ==================== Main event loop ==================== + // ==================== Main event loop ==================== - if(state->run) do { - bool redraw = false; - FuriStatus status = FuriStatusErrorTimeout; + if (state->run) do { + bool redraw = false; + FuriStatus status = FuriStatusErrorTimeout; - // Wait for a message - // while ((status = furi_message_queue_get(queue, &msg, tmo)) == FuriStatusErrorTimeout) ; - status = furi_message_queue_get(queue, &msg, tmo); + // Wait for a message +// while ((status = furi_message_queue_get(queue, &msg, tmo)) == FuriStatusErrorTimeout) ; + status = furi_message_queue_get(queue, &msg, tmo); - // Clear splash screen - if((state->scene == SCENE_SPLASH) && - (state->scenePrev == SCENE_NONE) && // Initial splash - ((status == FuriStatusErrorTimeout) || // timeout - ((msg.id == EVID_KEY) && (msg.input.type == InputTypeShort))) // or key-short - ) { - tmo = 60 * 1000; // increase message-wait timeout to 60secs - timerEn(state, true); // start scanning the i2c bus - status = FuriStatusOk; // pass status check - msg.id = EVID_NONE; // valid msg ID - sceneSet(state, SCENE_WAIT); // move to wait screen - } + // Clear splash screen + if ( (state->scene == SCENE_SPLASH) && (state->scenePrev == SCENE_NONE) && // Initial splash + ( (status == FuriStatusErrorTimeout) || // timeout + ((msg.id == EVID_KEY) && (msg.input.type == InputTypeShort)) ) // or key-short + ) { + tmo = 60 *1000; // increase message-wait timeout to 60secs + timerEn(state, true); // start scanning the i2c bus + status = FuriStatusOk; // pass status check + msg.id = EVID_NONE; // valid msg ID + sceneSet(state, SCENE_WAIT); // move to wait screen + } - // Check for queue errors - if(status != FuriStatusOk) { - switch(status) { - case FuriStatusErrorTimeout: - DEBUG(wii_errs[DEBUG_QUEUE_TIMEOUT]); - continue; - case FuriStatusError: - ERROR(wii_errs[(error = ERR_QUEUE_RTOS)]); - goto bail; - case FuriStatusErrorResource: - ERROR(wii_errs[(error = ERR_QUEUE_RESOURCE)]); - goto bail; - case FuriStatusErrorParameter: - ERROR(wii_errs[(error = ERR_QUEUE_BADPRM)]); - goto bail; - case FuriStatusErrorNoMemory: - ERROR(wii_errs[(error = ERR_QUEUE_NOMEM)]); - goto bail; - case FuriStatusErrorISR: - ERROR(wii_errs[(error = ERR_QUEUE_ISR)]); - goto bail; - default: - ERROR(wii_errs[(error = ERR_QUEUE_UNK)]); - goto bail; - } - } - // Read successful + // Check for queue errors + if (status != FuriStatusOk) { + switch (status) { + case FuriStatusErrorTimeout: DEBUG(wii_errs[DEBUG_QUEUE_TIMEOUT]); continue ; + case FuriStatusError: ERROR(wii_errs[(error = ERR_QUEUE_RTOS)]); goto bail ; + case FuriStatusErrorResource: ERROR(wii_errs[(error = ERR_QUEUE_RESOURCE)]); goto bail ; + case FuriStatusErrorParameter: ERROR(wii_errs[(error = ERR_QUEUE_BADPRM)]); goto bail ; + case FuriStatusErrorNoMemory: ERROR(wii_errs[(error = ERR_QUEUE_NOMEM)]); goto bail ; + case FuriStatusErrorISR: ERROR(wii_errs[(error = ERR_QUEUE_ISR)]); goto bail ; + default: ERROR(wii_errs[(error = ERR_QUEUE_UNK)]); goto bail ; + } + } + // Read successful - // *** Try to lock the plugin state variables *** - if(!(state = (state_t*)acquire_mutex_block(&mutex))) { - ERROR(wii_errs[(error = ERR_MUTEX_BLOCK)]); - goto bail; - } + // *** Try to lock the plugin state variables *** + if ( !(state = (state_t*)acquire_mutex_block(&mutex)) ) { + ERROR(wii_errs[(error = ERR_MUTEX_BLOCK)]); + goto bail; + } - // *** Handle events *** - switch(msg.id) { - //--------------------------------------------- - case EVID_TICK: // Timer events - //! I would prefer to have ecPoll() called by cbTimer() - //! ...but how does cbTimer() get the required access to the state variables? Namely: 'state->ec' - //! So, for now, the timer pushes a message to call ecPoll() - //! which, in turn, will push WIIEC event meesages! - ecPoll(&state->ec, queue); - break; + // *** Handle events *** + switch (msg.id) { + //--------------------------------------------- + case EVID_TICK: // Timer events + //! I would prefer to have ecPoll() called by cbTimer() + //! ...but how does cbTimer() get the required access to the state variables? Namely: 'state->ec' + //! So, for now, the timer pushes a message to call ecPoll() + //! which, in turn, will push WIIEC event meesages! + ecPoll(&state->ec, queue); + break; - //--------------------------------------------- - case EVID_WIIEC: // WiiMote Perhipheral - if(evWiiEC(&msg, state)) redraw = true; - break; + //--------------------------------------------- + case EVID_WIIEC: // WiiMote Perhipheral + if (evWiiEC(&msg, state)) redraw = true ; + break; - //--------------------------------------------- - case EVID_KEY: // Key events - patBacklight(state); - if(evKey(&msg, state)) redraw = true; - break; + //--------------------------------------------- + case EVID_KEY: // Key events + patBacklight(state); + if (evKey(&msg, state)) redraw = true; + break; - //--------------------------------------------- - case EVID_NONE: - break; + //--------------------------------------------- + case EVID_NONE: + break; - //--------------------------------------------- - default: // Unknown event - WARN("Unknown message.ID [%d]", msg.id); - break; - } + //--------------------------------------------- + default: // Unknown event + WARN("Unknown message.ID [%d]", msg.id); + break; + } - // *** Update the GUI screen via the viewport *** - if(redraw) view_port_update(vpp); + // *** Update the GUI screen via the viewport *** + if (redraw) view_port_update(vpp) ; - // *** Try to release the plugin state variables *** - if(!release_mutex(&mutex, state)) { - ERROR(wii_errs[(error = ERR_MUTEX_RELEASE)]); - goto bail; - } - } while(state->run); + // *** Try to release the plugin state variables *** + if ( !release_mutex(&mutex, state) ) { + ERROR(wii_errs[(error = ERR_MUTEX_RELEASE)]); + goto bail; + } + } while (state->run); - // ===== Game Over ===== - INFO("USER EXIT"); + // ===== Game Over ===== + INFO("USER EXIT"); bail: - // 10. Release system notification queue - if(state->notify) { - furi_record_close(RECORD_NOTIFICATION); - state->notify = NULL; - } + // 10. Release system notification queue + if (state->notify) { + furi_record_close(RECORD_NOTIFICATION); + state->notify = NULL; + } - // 9. Stop the timer - if(state->timer) { - (void)furi_timer_stop(state->timer); - furi_timer_free(state->timer); - state->timer = NULL; - state->timerEn = false; - } + // 9. Stop the timer + if (state->timer) { + (void)furi_timer_stop(state->timer); + furi_timer_free(state->timer); + state->timer = NULL; + state->timerEn = false; + } - // 8. Detach the viewport - gui_remove_view_port(gui, vpp); + // 8. Detach the viewport + gui_remove_view_port(gui, vpp); - // 7. No need to unreqgister the callbacks - // ...they will go when the viewport is destroyed + // 7. No need to unreqgister the callbacks + // ...they will go when the viewport is destroyed - // 6. Destroy the viewport - if(vpp) { - view_port_enabled_set(vpp, false); - view_port_free(vpp); - vpp = NULL; - } + // 6. Destroy the viewport + if (vpp) { + view_port_enabled_set(vpp, false); + view_port_free(vpp); + vpp = NULL; + } - // 5. Free the mutex - if(mutex.mutex) { - delete_mutex(&mutex); - mutex.mutex = NULL; - } + // 5. Free the mutex + if (mutex.mutex) { + delete_mutex(&mutex); + mutex.mutex = NULL; + } - // 4. Free up state pointer(s) - // none + // 4. Free up state pointer(s) + // none - // 3. Free the plugin state variables - if(state) { - free(state); - state = NULL; - } + // 3. Free the plugin state variables + if (state) { + free(state); + state = NULL; + } - // 2. Close the GUI - furi_record_close("gui"); + // 2. Close the GUI + furi_record_close("gui"); - // 1. Destroy the message queue - if(queue) { - furi_message_queue_free(queue); - queue = NULL; - } + // 1. Destroy the message queue + if (queue) { + furi_message_queue_free(queue); + queue = NULL; + } - INFO("CLEAN EXIT ... Exit code: %d", error); - LEAVE; - return (int32_t)error; + INFO("CLEAN EXIT ... Exit code: %d", error); + LEAVE; + return (int32_t)error; } diff --git a/applications/plugins/wii_ec_anal/wii_anal.h b/applications/plugins/wii_ec_anal/wii_anal.h index 3aae61fdc..ac7ffddb1 100644 --- a/applications/plugins/wii_ec_anal/wii_anal.h +++ b/applications/plugins/wii_ec_anal/wii_anal.h @@ -1,89 +1,97 @@ -#ifndef WII_ANAL_H_ -#define WII_ANAL_H_ +#ifndef WII_ANAL_H_ +#define WII_ANAL_H_ -#include // Core API -#include // GUI Input extensions -#include +#include // Core API +#include // GUI Input extensions +#include //----------------------------------------------------------------------------- ---------------------------------------- // GUI scenes // -typedef enum scene { - SCENE_NONE = 0, - SCENE_SPLASH = 1, - SCENE_RIP = 2, - SCENE_WAIT = 3, - SCENE_DEBUG = 4, - SCENE_DUMP = 5, - SCENE_CLASSIC = 6, - SCENE_CLASSIC_N = 7, - SCENE_NUNCHUCK = 8, - SCENE_NUNCHUCK_ACC = 9, -} scene_t; +typedef + enum scene { + SCENE_NONE = 0, + SCENE_SPLASH = 1, + SCENE_RIP = 2, + SCENE_WAIT = 3, + SCENE_DEBUG = 4, + SCENE_DUMP = 5, + SCENE_CLASSIC = 6, + SCENE_CLASSIC_N = 7, + SCENE_NUNCHUCK = 8, + SCENE_NUNCHUCK_ACC = 9, + } +scene_t; //----------------------------------------------------------------------------- ---------------------------------------- -#include "wii_i2c.h" -#include "wii_ec.h" +#include "wii_i2c.h" +#include "wii_ec.h" //----------------------------------------------------------------------------- ---------------------------------------- // A list of event IDs handled by this plugin // -typedef enum eventID { - EVID_NONE, - EVID_UNKNOWN, +typedef + enum eventID { + EVID_NONE, + EVID_UNKNOWN, - // A full list of events can be found with: `grep -r --color "void.*set_.*_callback" applications/gui/*` - // ...A free gift to you from the makers of well written code that conforms to a good coding standard - EVID_KEY, // keypad - EVID_TICK, // tick - EVID_WIIEC, // wii extension controller -} eventID_t; + // A full list of events can be found with: `grep -r --color "void.*set_.*_callback" applications/gui/*` + // ...A free gift to you from the makers of well written code that conforms to a good coding standard + EVID_KEY, // keypad + EVID_TICK, // tick + EVID_WIIEC, // wii extension controller + } +eventID_t; //----------------------------------------------------------------------------- ---------------------------------------- // An item in the event message-queue // -typedef struct eventMsg { - eventID_t id; - union { - InputEvent input; // --> applications/input/input.h - wiiEcEvent_t wiiEc; // --> local - }; -} eventMsg_t; +typedef + struct eventMsg { + eventID_t id; + union { + InputEvent input; // --> applications/input/input.h + wiiEcEvent_t wiiEc; // --> local + }; + } +eventMsg_t; //----------------------------------------------------------------------------- ---------------------------------------- // State variables for this plugin // An instance of this is allocated on the heap, and the pointer is passed back to the OS // Access to this memory is controlled by mutex // -typedef struct state { - bool run; // true : plugin is running +typedef + struct state { + bool run; // true : plugin is running - bool timerEn; // controller scanning enabled - FuriTimer* timer; // the timer - uint32_t timerHz; // system ticks per second - int fps; // poll/refresh [frames]-per-second + bool timerEn; // controller scanning enabled + FuriTimer* timer; // the timer + uint32_t timerHz; // system ticks per second + int fps; // poll/refresh [frames]-per-second - int cnvW; // canvas width - int cnvH; // canvas height - scene_t scene; // current scene - scene_t scenePrev; // previous scene - scene_t scenePegg; // previous scene for easter eggs - int flash; // flash counter (flashing icons) + int cnvW; // canvas width + int cnvH; // canvas height + scene_t scene; // current scene + scene_t scenePrev; // previous scene + scene_t scenePegg; // previous scene for easter eggs + int flash; // flash counter (flashing icons) - int hold; // hold type: {-1=tough-peak, 0=none, +1=peak-hold} - ecCalib_t calib; // Software calibration mode + int hold; // hold type: {-1=tough-peak, 0=none, +1=peak-hold} + ecCalib_t calib; // Software calibration mode - bool pause; // Accelerometer animation pause - bool apause; // Accelerometer animation auto-pause + bool pause; // Accelerometer animation pause + bool apause; // Accelerometer animation auto-pause - NotificationApp* notify; // OS nitifcation queue (for patting the backlight watchdog timer) + NotificationApp* notify; // OS nitifcation queue (for patting the backlight watchdog timer) - wiiEC_t ec; // Extension Controller details -} state_t; + wiiEC_t ec; // Extension Controller details + } +state_t; //============================================================================= ======================================== // Function prototypes // -void timerEn(state_t* state, bool on); +void timerEn (state_t* state, bool on) ; #endif //WII_ANAL_H_ diff --git a/applications/plugins/wii_ec_anal/wii_anal_ec.c b/applications/plugins/wii_ec_anal/wii_anal_ec.c index dab167bc0..0bfa47362 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_ec.c +++ b/applications/plugins/wii_ec_anal/wii_anal_ec.c @@ -1,115 +1,97 @@ -#include -#include +#include +#include -#include "wii_anal.h" -#include "wii_anal_lcd.h" -#include "wii_anal_keys.h" +#include "wii_anal.h" +#include "wii_anal_lcd.h" +#include "wii_anal_keys.h" //+============================================================================ ======================================== // Handle Wii Extension Controller events // -bool evWiiEC(const eventMsg_t* const msg, state_t* const state) { - bool redraw = false; +bool evWiiEC (const eventMsg_t* const msg, state_t* const state) +{ + bool redraw = false; -#if LOG_LEVEL >= 4 - { - const char* s = NULL; - switch(msg->wiiEc.type) { - case WIIEC_NONE: - s = "Error"; - break; - case WIIEC_CONN: - s = "Connect"; - break; - case WIIEC_DISCONN: - s = "Disconnect"; - break; - case WIIEC_PRESS: - s = "Press"; - break; - case WIIEC_RELEASE: - s = "Release"; - break; - case WIIEC_ANALOG: - s = "Analog"; - break; - case WIIEC_ACCEL: - s = "Accel"; - break; - default: - s = "Bug"; - break; - } - INFO( - "WIIP : %s '%c' = %d", - s, - (isprint((int)msg->wiiEc.in) ? msg->wiiEc.in : '_'), - msg->wiiEc.val); - if((msg->wiiEc.type == WIIEC_CONN) || (msg->wiiEc.type == WIIEC_DISCONN)) - INFO("...%d=\"%s\"", msg->wiiEc.val, ecId[msg->wiiEc.val].name); - } +# if LOG_LEVEL >= 4 + { + const char* s = NULL; + switch (msg->wiiEc.type) { + case WIIEC_NONE: s = "Error"; break ; + case WIIEC_CONN: s = "Connect"; break ; + case WIIEC_DISCONN: s = "Disconnect"; break ; + case WIIEC_PRESS: s = "Press"; break ; + case WIIEC_RELEASE: s = "Release"; break ; + case WIIEC_ANALOG: s = "Analog"; break ; + case WIIEC_ACCEL: s = "Accel"; break ; + default: s = "Bug"; break ; + } + INFO("WIIP : %s '%c' = %d", s, (isprint((int)msg->wiiEc.in) ? msg->wiiEc.in : '_'), msg->wiiEc.val); + if ((msg->wiiEc.type == WIIEC_CONN) || (msg->wiiEc.type == WIIEC_DISCONN)) + INFO("...%d=\"%s\"", msg->wiiEc.val, ecId[msg->wiiEc.val].name); + } +# endif + + switch (msg->wiiEc.type) { + case WIIEC_CONN: + patBacklight(state); + state->hold = 0; + state->calib = CAL_TRACK; + sceneSet(state, ecId[msg->wiiEc.val].scene); + redraw = true ; + +#if 1 // Workaround for Classic Controller Pro, which shows 00's for Factory Calibration Data!? + if (state->ec.pidx == PID_CLASSIC_PRO) { + // Simulate a Long-OK keypress, to start Software Calibration mode + eventMsg_t msg = { +// .id = EVID_KEY, + .input.type = InputTypeLong, + .input.key = InputKeyOk + }; + key_calib(&msg, state); + } #endif + break; - switch(msg->wiiEc.type) { - case WIIEC_CONN: - patBacklight(state); - state->hold = 0; - state->calib = CAL_TRACK; - sceneSet(state, ecId[msg->wiiEc.val].scene); - redraw = true; + case WIIEC_DISCONN: + patBacklight(state); + sceneSet(state, SCENE_WAIT); + redraw = true; + break; -#if 1 // Workaround for Classic Controller Pro, which shows 00's for Factory Calibration Data!? - if(state->ec.pidx == PID_CLASSIC_PRO) { - // Simulate a Long-OK keypress, to start Software Calibration mode - eventMsg_t msg = {// .id = EVID_KEY, - .input.type = InputTypeLong, - .input.key = InputKeyOk}; - key_calib(&msg, state); - } + case WIIEC_PRESS: + if (state->scene == SCENE_NUNCHUCK_ACC) switch (msg->wiiEc.in) { + case 'z': // un-pause + state->pause = !state->pause; + break; + case 'c': // toggle auto-pause + state->pause = false; + state->apause = !state->apause; + break; + default: break ; + } + +#if 1 //! factory calibration method not known for classic triggers - this will set the digital switch point + if ((state->ec.pidx == PID_CLASSIC) || (state->ec.pidx == PID_CLASSIC_PRO)) { + if (msg->wiiEc.in == 'l') state->ec.calS.classic[2].trgZL = msg->wiiEc.val ; + if (msg->wiiEc.in == 'r') state->ec.calS.classic[2].trgZR = msg->wiiEc.val ; + } #endif - break; + __attribute__ ((fallthrough)); - case WIIEC_DISCONN: - patBacklight(state); - sceneSet(state, SCENE_WAIT); - redraw = true; - break; + case WIIEC_RELEASE: + patBacklight(state); + redraw = true; + break; - case WIIEC_PRESS: - if(state->scene == SCENE_NUNCHUCK_ACC) switch(msg->wiiEc.in) { - case 'z': // un-pause - state->pause = !state->pause; - break; - case 'c': // toggle auto-pause - state->pause = false; - state->apause = !state->apause; - break; - default: - break; - } + case WIIEC_ANALOG: + case WIIEC_ACCEL: + ecCalibrate(&state->ec, state->calib); + redraw = true; + break; -#if 1 //! factory calibration method not known for classic triggers - this will set the digital switch point - if((state->ec.pidx == PID_CLASSIC) || (state->ec.pidx == PID_CLASSIC_PRO)) { - if(msg->wiiEc.in == 'l') state->ec.calS.classic[2].trgZL = msg->wiiEc.val; - if(msg->wiiEc.in == 'r') state->ec.calS.classic[2].trgZR = msg->wiiEc.val; - } -#endif - __attribute__((fallthrough)); + default: + break; + } - case WIIEC_RELEASE: - patBacklight(state); - redraw = true; - break; - - case WIIEC_ANALOG: - case WIIEC_ACCEL: - ecCalibrate(&state->ec, state->calib); - redraw = true; - break; - - default: - break; - } - - return redraw; + return redraw; } diff --git a/applications/plugins/wii_ec_anal/wii_anal_ec.h b/applications/plugins/wii_ec_anal/wii_anal_ec.h index eec6b523c..886b60281 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_ec.h +++ b/applications/plugins/wii_ec_anal/wii_anal_ec.h @@ -1,14 +1,14 @@ -#ifndef WII_ANAL_EC_H_ -#define WII_ANAL_EC_H_ +#ifndef WII_ANAL_EC_H_ +#define WII_ANAL_EC_H_ -#include +#include //============================================================================= ======================================== // Function prototypes // -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; +typedef struct eventMsg eventMsg_t ; +typedef struct state state_t ; -bool evWiiEC(const eventMsg_t* const msg, state_t* const state); +bool evWiiEC (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_ANAL_EC_H_ diff --git a/applications/plugins/wii_ec_anal/wii_anal_keys.c b/applications/plugins/wii_ec_anal/wii_anal_keys.c index 8c5c99b4e..3d2fae14a 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_keys.c +++ b/applications/plugins/wii_ec_anal/wii_anal_keys.c @@ -1,35 +1,40 @@ -#include +#include -#include "bc_logging.h" +#include "bc_logging.h" -#include "wii_anal.h" +#include "wii_anal.h" //+============================================================================ ======================================== // Stop Calibration mode // -static void calStop(state_t* const state) { - state->hold = 0; // stop calibration mode - state->calib &= ~(CAL_RANGE | CAL_NOTJOY); // ... +static +void calStop (state_t* const state) +{ + state->hold = 0; // stop calibration mode + state->calib &= ~(CAL_RANGE | CAL_NOTJOY); // ... } //+============================================================================ ======================================== // Change to another scene // -void sceneSet(state_t* const state, const scene_t scene) { - calStop(state); // Stop software calibration - state->scenePrev = state->scene; // Remember where we came from - state->scene = scene; // Go to new scene - INFO("Scene : %d -> %d", state->scenePrev, state->scene); +void sceneSet (state_t* const state, const scene_t scene) +{ + calStop(state); // Stop software calibration + state->scenePrev = state->scene; // Remember where we came from + state->scene = scene; // Go to new scene + INFO("Scene : %d -> %d", state->scenePrev, state->scene); } //+============================================================================ ======================================== // Change to an easter egg scene // -static void sceneSetEgg(state_t* const state, const scene_t scene) { - calStop(state); // Stop software calibration - state->scenePegg = state->scene; // Remember where we came from - state->scene = scene; // Go to new scene - INFO("Scene* : %d => %d", state->scenePegg, state->scene); +static +void sceneSetEgg (state_t* const state, const scene_t scene) +{ + calStop(state); // Stop software calibration + state->scenePegg = state->scene; // Remember where we came from + state->scene = scene; // Go to new scene + INFO("Scene* : %d => %d", state->scenePegg, state->scene); } //+============================================================================ ======================================== @@ -37,263 +42,256 @@ static void sceneSetEgg(state_t* const state, const scene_t scene) { // Enabling peak-hold on screen with no peak meters will have no effect // So, to avoid code duplication... // -bool key_calib(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +bool key_calib (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# hold = (state->hold == +1) ? 0 : +1; // toggle peak hold - used = true; - break; + switch (msg->input.type) { + case InputTypeShort: //# input.key) { + case InputKeyUp: //# hold = (state->hold == +1) ? 0 : +1 ; // toggle peak hold + used = true; + break; - case InputKeyDown: //# hold = (state->hold == -1) ? 0 : -1; // toggle trough hold - used = true; - break; + case InputKeyDown: //# hold = (state->hold == -1) ? 0 : -1 ; // toggle trough hold + used = true; + break; - case InputKeyOk: //# calib & CAL_RANGE) - calStop(state); // STOP softare calibration - else - ecCalibrate(&state->ec, CAL_CENTRE); // perform centre calibration - used = true; - break; + case InputKeyOk: //# calib & CAL_RANGE) calStop(state) ; // STOP softare calibration + else ecCalibrate(&state->ec, CAL_CENTRE) ; // perform centre calibration + used = true; + break; - default: - break; - } - break; + default: break ; + } + break; - case InputTypeLong: //# >! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease - switch(msg->input.key) { - case InputKeyOk: //# >O [ LONG-OK ] - ecCalibrate(&state->ec, CAL_RESET | CAL_CENTRE); // START software calibration - state->hold = 0; - state->calib |= CAL_RANGE; - state->flash = 8; // start with flash ON - used = true; - break; + case InputTypeLong: //# >! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease + switch (msg->input.key) { + case InputKeyOk: //# >O [ LONG-OK ] + ecCalibrate(&state->ec, CAL_RESET | CAL_CENTRE); // START software calibration + state->hold = 0; + state->calib |= CAL_RANGE; + state->flash = 8; // start with flash ON + used = true; + break; - default: - break; - } - break; + default: break ; + } + break; - default: - break; - } + default: break ; + } - return used; + return used; } //+============================================================================ ======================================== // WAIT screen // -static inline bool wait_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +static inline +bool wait_key (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - if(msg->input.type == InputTypeShort) { - switch(msg->input.key) { - case InputKeyLeft: //# input.type == InputTypeShort) { + switch (msg->input.key) { + case InputKeyLeft: //# run = false; - used = true; - break; + case InputKeyBack: //# run = false; + used = true; + break; - default: - break; - } - } + default: break ; + } + } - return used; + return used; } //+============================================================================ ======================================== // DEBUG screen // -static inline bool debug_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +static inline +bool debug_key (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: { //# ec, NULL); // Initialise the controller //! NULL = no encryption - (void)init; // in case INFO is optimised out - INFO("%s : %s", __func__, (init ? "init OK" : "init fail")); - used = true; - break; - } + switch (msg->input.type) { + case InputTypeShort: //# input.key) { + case InputKeyUp: { //# ec, NULL); // Initialise the controller //! NULL = no encryption + (void)init; // in case INFO is optimised out + INFO("%s : %s", __func__, (init ? "init OK" : "init fail")); + used = true; + break; + } - case InputKeyOk: //# ec) == 0) { // Read the controller - INFO( - "%s : joy: {%02X,%02X,%02X,%02X,%02X,%02X}", - __func__, - state->ec.joy[0], - state->ec.joy[1], - state->ec.joy[2], - state->ec.joy[3], - state->ec.joy[4], - state->ec.joy[5]); - } - used = true; - break; + case InputKeyOk: //# ec) == 0) { // Read the controller + INFO( "%s : joy: {%02X,%02X,%02X,%02X,%02X,%02X}", __func__, + state->ec.joy[0], state->ec.joy[1], state->ec.joy[2], + state->ec.joy[3], state->ec.joy[4], state->ec.joy[5] ); + } + used = true; + break; - case InputKeyDown: //# scenePrev); - used = true; - break; + case InputKeyDown: //# scenePrev); + used = true; + break; - case InputKeyBack: //# run = false; - used = true; - break; + case InputKeyBack: //# run = false; + used = true; + break; - default: - break; //# input.key == InputKeyBack) && (state->scenePrev == SCENE_NONE)) state->run = false; +static inline +bool splash_key (const eventMsg_t* const msg, state_t* const state) +{ + // Back key on the initial SPLASH screen (this will catch the InputKeyPress) + if ((msg->input.key == InputKeyBack) && (state->scenePrev == SCENE_NONE)) state->run = false ; - // ANY-other-KEY press - if(msg->input.type == InputTypeShort) { - timerEn(state, true); // Restart the timer - state->scene = state->scenePegg; - } + // ANY-other-KEY press + if (msg->input.type == InputTypeShort) { + timerEn(state, true); // Restart the timer + state->scene = state->scenePegg; + } - return true; + return true; } + //+============================================================================ ======================================== // "_pre" allows the plugin to use the key before the active scene gets a chance // -static inline bool key_pre(const eventMsg_t* const msg, state_t* const state) { - (void)msg; - (void)state; +static inline +bool key_pre (const eventMsg_t* const msg, state_t* const state) +{ + (void)msg; + (void)state; - return false; + return false; } //+============================================================================ ======================================== // "_post" allows the plugin to use a key if it was not used by the active scene // -static inline bool key_post(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +static inline +bool key_post (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - if(msg->input.key == InputKeyBack) { - if(msg->input.type == InputTypeShort) { //# ec.init = false; // reset/disconnect the controller - sceneSet(state, SCENE_WAIT); - used = true; + if (msg->input.key == InputKeyBack) { + if (msg->input.type == InputTypeShort) { //# ec.init = false; // reset/disconnect the controller + sceneSet(state, SCENE_WAIT); + used = true; - } else if(msg->input.type == InputTypeLong) { //# >B [LONG-BACK] - state->run = false; // Signal the plugin to exit - used = true; - } - } + } else if (msg->input.type == InputTypeLong) { //# >B [LONG-BACK] + state->run = false; // Signal the plugin to exit + used = true; + } + } - // Easter eggs - switch(state->scene) { - case SCENE_SPLASH: // Scenes that do NOT offer Easter eggs - case SCENE_RIP: - case SCENE_DEBUG: - break; - default: - if(msg->input.type == InputTypeLong) { - switch(msg->input.key) { - case InputKeyDown: //# >D [LONG-DOWN] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_DEBUG); - used = true; - break; + // Easter eggs + switch (state->scene) { + case SCENE_SPLASH: // Scenes that do NOT offer Easter eggs + case SCENE_RIP: + case SCENE_DEBUG: + break; + default: + if (msg->input.type == InputTypeLong) { + switch (msg->input.key) { + case InputKeyDown: //# >D [LONG-DOWN] + timerEn(state, false); // Stop the timer + sceneSetEgg(state, SCENE_DEBUG); + used = true; + break; - case InputKeyLeft: //# >L [ LONG-LEFT ] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_SPLASH); - used = true; - break; + case InputKeyLeft: //# >L [ LONG-LEFT ] + timerEn(state, false); // Stop the timer + sceneSetEgg(state, SCENE_SPLASH); + used = true; + break; - case InputKeyUp: //# >U [ LONG-UP ] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_RIP); - used = true; - break; + case InputKeyUp: //# >U [ LONG-UP ] + timerEn(state, false); // Stop the timer + sceneSetEgg(state, SCENE_RIP); + used = true; + break; - default: - break; - } - } - break; - } + default: break ; + } + } + break; + } - return used; + return used; } //+============================================================================ ======================================== // Handle a key press event // -bool evKey(const eventMsg_t* const msg, state_t* const state) { - furi_assert(msg); - furi_assert(state); +bool evKey (const eventMsg_t* const msg, state_t* const state) +{ + furi_assert(msg); + furi_assert(state); - bool used = key_pre(msg, state); + bool used = key_pre(msg, state); - if(!used) switch(state->scene) { - case SCENE_SPLASH: //... - case SCENE_RIP: - used = splash_key(msg, state); - break; + if (!used) switch (state->scene) { + case SCENE_SPLASH: //... + case SCENE_RIP: used = splash_key(msg, state); break ; - case SCENE_WAIT: - used = wait_key(msg, state); - break; - case SCENE_DEBUG: - used = debug_key(msg, state); - break; + case SCENE_WAIT: used = wait_key(msg, state); break ; + case SCENE_DEBUG: used = debug_key(msg, state); break ; - default: - if(state->ec.pidx >= PID_ERROR) { - ERROR("%s : bad PID = %d", __func__, state->ec.pidx); - } else { - if((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].keys) - ecId[PID_UNKNOWN].keys(msg, state); - else - ecId[state->ec.pidx].keys(msg, state); - } - break; + default: + if (state->ec.pidx >= PID_ERROR) { + ERROR("%s : bad PID = %d", __func__, state->ec.pidx); + } else { + if ((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].keys) + ecId[PID_UNKNOWN].keys(msg, state); + else + ecId[state->ec.pidx].keys(msg, state); + } + break; - case SCENE_NONE: - break; - } + case SCENE_NONE: break; + } - if(!used) used = key_post(msg, state); + if (!used) used = key_post(msg, state) ; - return used; + return used; } + diff --git a/applications/plugins/wii_ec_anal/wii_anal_keys.h b/applications/plugins/wii_ec_anal/wii_anal_keys.h index c10fcd1ef..0ebbd5e8e 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_keys.h +++ b/applications/plugins/wii_ec_anal/wii_anal_keys.h @@ -1,16 +1,16 @@ -#ifndef WII_ANAL_KEYS_H_ -#define WII_ANAL_KEYS_H_ +#ifndef WII_ANAL_KEYS_H_ +#define WII_ANAL_KEYS_H_ //============================================================================= ======================================== // Function prototypes // -#include // bool -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; -typedef enum scene scene_t; +#include // bool +typedef struct eventMsg eventMsg_t ; +typedef struct state state_t ; +typedef enum scene scene_t ; -void sceneSet(state_t* const state, const scene_t scene); -bool key_calib(const eventMsg_t* const msg, state_t* const state); -bool evKey(const eventMsg_t* const msg, state_t* const state); +void sceneSet (state_t* const state, const scene_t scene) ; +bool key_calib (const eventMsg_t* const msg, state_t* const state) ; +bool evKey (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_ANAL_KEYS_H_ diff --git a/applications/plugins/wii_ec_anal/wii_anal_lcd.c b/applications/plugins/wii_ec_anal/wii_anal_lcd.c index 921a3708e..d031bc120 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_lcd.c +++ b/applications/plugins/wii_ec_anal/wii_anal_lcd.c @@ -1,45 +1,17 @@ -#include "wii_anal.h" -#include "gfx/images.h" // Images +#include "wii_anal.h" +#include "gfx/images.h" // Images //----------------------------------------------------------------------------- ---------------------------------------- // A couple of monospaced hex fonts // -const image_t* img_6x8[16] = { - &img_6x8_0, - &img_6x8_1, - &img_6x8_2, - &img_6x8_3, - &img_6x8_4, - &img_6x8_5, - &img_6x8_6, - &img_6x8_7, - &img_6x8_8, - &img_6x8_9, - &img_6x8_A, - &img_6x8_B, - &img_6x8_C, - &img_6x8_D, - &img_6x8_E, - &img_6x8_F, +const image_t* img_6x8[16] = { + &img_6x8_0, &img_6x8_1, &img_6x8_2, &img_6x8_3, &img_6x8_4, &img_6x8_5, &img_6x8_6, &img_6x8_7, + &img_6x8_8, &img_6x8_9, &img_6x8_A, &img_6x8_B, &img_6x8_C, &img_6x8_D, &img_6x8_E, &img_6x8_F, }; -const image_t* img_5x7[16] = { - &img_5x7_0, - &img_5x7_1, - &img_5x7_2, - &img_5x7_3, - &img_5x7_4, - &img_5x7_5, - &img_5x7_6, - &img_5x7_7, - &img_5x7_8, - &img_5x7_9, - &img_5x7_A, - &img_5x7_B, - &img_5x7_C, - &img_5x7_D, - &img_5x7_E, - &img_5x7_F, +const image_t* img_5x7[16] = { + &img_5x7_0, &img_5x7_1, &img_5x7_2, &img_5x7_3, &img_5x7_4, &img_5x7_5, &img_5x7_6, &img_5x7_7, + &img_5x7_8, &img_5x7_9, &img_5x7_A, &img_5x7_B, &img_5x7_C, &img_5x7_D, &img_5x7_E, &img_5x7_F, }; //+============================================================================ ======================================== @@ -58,71 +30,66 @@ const image_t* img_5x7[16] = { // // Do this ONCE ... at plugin quit // furi_record_close(RECORD_NOTIFICATION); // } -void patBacklight(state_t* state) { - notification_message(state->notify, &sequence_display_backlight_on); +void patBacklight (state_t* state) +{ + notification_message(state->notify, &sequence_display_backlight_on); } //============================================================================= ======================================== // Show a hex number in an inverted box (for ananlogue readings) // -void showHex( - Canvas* const canvas, - uint8_t x, - uint8_t y, - const uint32_t val, - const uint8_t cnt, - const int b) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, x++, y++, 1 + (cnt * (6 + 1)), 10); +void showHex ( Canvas* const canvas, uint8_t x, uint8_t y, + const uint32_t val, const uint8_t cnt, const int b ) +{ + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, x++,y++, 1 +(cnt *(6 +1)), 10); - // thicken border - if(b == 2) canvas_draw_frame(canvas, x - 2, y - 2, 1 + (cnt * (6 + 1)) + 2, 10 + 2); + // thicken border + if (b == 2) canvas_draw_frame(canvas, x-2,y-2, 1 +(cnt *(6 +1))+2, 10+2); - for(int i = (cnt - 1) * 4; i >= 0; i -= 4, x += 6 + 1) - show(canvas, x, y, img_6x8[(val >> i) & 0xF], SHOW_SET_WHT); + for (int i = (cnt -1) *4; i >= 0; i -= 4, x += 6+1) + show(canvas, x,y, img_6x8[(val >>i) &0xF], SHOW_SET_WHT) ; } //============================================================================= ======================================== // Show the up/down "peak hold" controls in the bottom right // -void showPeakHold(state_t* const state, Canvas* const canvas, const int hold) { - switch(hold) { - case 0: - show(canvas, 119, 51, &img_key_U, SHOW_CLR_BLK); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_BLK); - break; - case +1: - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, 120, 52, 7, 6); - show(canvas, 119, 51, &img_key_U, SHOW_CLR_WHT); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_BLK); - break; - case -1: - show(canvas, 119, 51, &img_key_U, SHOW_CLR_BLK); - canvas_draw_box(canvas, 120, 57, 7, 6); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_WHT); - break; - default: - break; - } - canvas_set_color(canvas, ColorBlack); - canvas_draw_frame(canvas, 119, 51, 9, 13); +void showPeakHold (state_t* const state, Canvas* const canvas, const int hold) +{ + switch (hold) { + case 0: + show(canvas, 119,51, &img_key_U, SHOW_CLR_BLK); + show(canvas, 119,56, &img_key_D, SHOW_CLR_BLK); + break; + case +1: + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 120,52, 7,6); + show(canvas, 119,51, &img_key_U, SHOW_CLR_WHT); + show(canvas, 119,56, &img_key_D, SHOW_CLR_BLK); + break; + case -1: + show(canvas, 119,51, &img_key_U, SHOW_CLR_BLK); + canvas_draw_box(canvas, 120,57, 7,6); + show(canvas, 119,56, &img_key_D, SHOW_CLR_WHT); + break; + default: + break; + } + canvas_set_color(canvas, ColorBlack); + canvas_draw_frame(canvas, 119,51, 9,13); - // calibration indicator - show( - canvas, - 108, - 55, - ((state->calib & CAL_RANGE) && (++state->flash & 8)) ? &img_key_OKi : &img_key_OK, - SHOW_SET_BLK); + // calibration indicator + show( canvas, 108,55, + ((state->calib & CAL_RANGE) && (++state->flash &8)) ? &img_key_OKi : &img_key_OK, + SHOW_SET_BLK ); } //============================================================================= ======================================== -// This code performs a FULL calibration on the device EVERY time it draws a joystick +// This code performs a FULL calibration on the device EVERY time it draws a joystick //...This is NOT a good way forward for anything other than a test tool. // // Realistically you would do all the maths when the controller is connected -// or, if you prefer (and it IS a good thing), have a "calibrate controller" menu option +// or, if you prefer (and it IS a good thing), have a "calibrate controller" menu option // ...and then just use a lookup table, or trivial formual // // THIS algorithm chops the joystick in to one of 9 zones @@ -130,12 +97,12 @@ void showPeakHold(state_t* const state, Canvas* const canvas, const int hold) { // FullLeft and FullRight have a deadzone of N [qv. xDead] ..a total of N+1 positions // Middle has a deadzone of N EACH WAY ...a total of 2N+1 positions // -// If the remaining range does not divide evenly in to three zones, +// If the remaining range does not divide evenly in to three zones, // the first remainder is added to zone3, // and the second remainder (if there is one) is added to zone2 // ...giving finer control near the centre of the joystick // -// The value of the deadzone is based on the number of bits in the +// The value of the deadzone is based on the number of bits in the // joystcik {x,y} values - the larger the range, the larger the deadzone. // // 03 15 29 @@ -151,132 +118,106 @@ void showPeakHold(state_t* const state, Canvas* const canvas, const int hold) { // Turn and object - this is probably good enough // Start slowly & pick up speed - how about a log or sine curve? // -void showJoy( - Canvas* const canvas, - const uint8_t x, - const uint8_t y, // x,y is the CENTRE of the Joystick - const uint8_t xMin, - const uint8_t xMid, - const uint8_t xMax, - const uint8_t yMin, - const uint8_t yMid, - const uint8_t yMax, - const uint8_t xPos, - const uint8_t yPos, - const uint8_t bits) { - int xOff = 0; // final offset of joystick hat image - int yOff = 0; +void showJoy ( Canvas* const canvas, const uint8_t x, const uint8_t y, // x,y is the CENTRE of the Joystick + const uint8_t xMin, const uint8_t xMid, const uint8_t xMax, + const uint8_t yMin, const uint8_t yMid, const uint8_t yMax, + const uint8_t xPos, const uint8_t yPos, const uint8_t bits ) +{ + int xOff = 0; // final offset of joystick hat image + int yOff = 0; - int xDead = (bits < 7) ? (1 << 0) : (1 << 3); // dead zone (centre & limits) - int yDead = xDead; + int xDead = (bits < 7) ? (1<<0) : (1<<3); // dead zone (centre & limits) + int yDead = xDead; - // This code is NOT optimised ...and it's still barely readable! - if((xPos >= (xMid - xDead)) && (xPos <= (xMid + xDead))) - xOff = 0; // centre [most likely] - else if(xPos <= (xMin + xDead)) - xOff = -4; // full left - else if(xPos >= (xMax - xDead)) - xOff = +4; // full right - else if(xPos < (xMid - xDead)) { // part left - // very much hard-coded for 3 interim positions - int lo = (xMin + xDead) + 1; // lowest position - int hi = (xMid - xDead) - 1; // highest position + // This code is NOT optimised ...and it's still barely readable! + if ((xPos >= (xMid -xDead)) && (xPos <= (xMid +xDead))) xOff = 0 ; // centre [most likely] + else if (xPos <= (xMin +xDead)) xOff = -4 ; // full left + else if (xPos >= (xMax -xDead)) xOff = +4 ; // full right + else if (xPos < (xMid -xDead)) { // part left + // very much hard-coded for 3 interim positions + int lo = (xMin +xDead) +1; // lowest position + int hi = (xMid -xDead) -1; // highest position - // this is the only duplicated bit of code - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) + // this is the only duplicated bit of code + int range = (hi -lo) +1; // range covered + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) - // int hi1 = hi; // lowest value for zone #-1 - // int lo1 = hi1 -div +1; // highest value for zone #-1 - // int hi2 = lo1 -1; // lowest value for zone #-2 - // int lo2 = hi2 -div +1 -(rem==2); // highest value for zone #-2 expand out remainder - // int hi3 = lo2 -1; // lowest value for zone #-3 - // int lo3 = hi3 -div +1 -(rem>=1); // highest value for zone #-3 expand out remainder +// int hi1 = hi; // lowest value for zone #-1 +// int lo1 = hi1 -div +1; // highest value for zone #-1 +// int hi2 = lo1 -1; // lowest value for zone #-2 +// int lo2 = hi2 -div +1 -(rem==2); // highest value for zone #-2 expand out remainder +// int hi3 = lo2 -1; // lowest value for zone #-3 +// int lo3 = hi3 -div +1 -(rem>=1); // highest value for zone #-3 expand out remainder - int lo1 = hi - div + 1; // (in brevity) - int hi3 = hi - div - div - (rem == 2); // ... + int lo1 = hi -div +1; // (in brevity) + int hi3 = hi -div -div -(rem==2); // ... - if(xPos <= hi3) - xOff = -3; // zone #-3 - else if(xPos >= lo1) - xOff = -1; // zone #-1 - else - xOff = -2; // zone #-2 + if (xPos <= hi3) xOff = -3 ; // zone #-3 + else if (xPos >= lo1) xOff = -1 ; // zone #-1 + else xOff = -2 ; // zone #-2 - } else /*if (xPos > (xMid +xDead))*/ { // part right - // very much hard-coded for 3 interim positions - int lo = (xMid + xDead) + 1; // lowest position - int hi = (xMax - xDead) - 1; // highest position + } else /*if (xPos > (xMid +xDead))*/ { // part right + // very much hard-coded for 3 interim positions + int lo = (xMid +xDead) +1; // lowest position + int hi = (xMax -xDead) -1; // highest position - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) + int range = (hi -lo) +1; // range covered + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) - // int lo1 = lo; // lowest value for zone #+1 - // int hi1 = lo +div -1; // highest value for zone #+1 - // int lo2 = hi1 +1; // lowest value for zone #+2 - // int hi2 = lo2 +div -1 +(rem==2); // highest value for zone #+2 expand out remainder - // int lo3 = hi2 +1; // lowest value for zone #+3 - // int hi3 = lo3 +div -1 +(rem>=1); // highest value for zone #+3 expand out remainder +// int lo1 = lo; // lowest value for zone #+1 +// int hi1 = lo +div -1; // highest value for zone #+1 +// int lo2 = hi1 +1; // lowest value for zone #+2 +// int hi2 = lo2 +div -1 +(rem==2); // highest value for zone #+2 expand out remainder +// int lo3 = hi2 +1; // lowest value for zone #+3 +// int hi3 = lo3 +div -1 +(rem>=1); // highest value for zone #+3 expand out remainder - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... + int hi1 = lo +div -1; // (in brevity) + int lo3 = lo +div +div +(rem==2); // ... - if(xPos <= hi1) - xOff = 1; // zone #1 - else if(xPos >= lo3) - xOff = 3; // zone #3 - else - xOff = 2; // zone #2 - } + if (xPos <= hi1) xOff = 1 ; // zone #1 + else if (xPos >= lo3) xOff = 3 ; // zone #3 + else xOff = 2 ; // zone #2 + } - // All this to print a 3x3 square (in the right place) - LOL! - if((yPos >= (yMid - yDead)) && (yPos <= (yMid + yDead))) - yOff = 0; // centre [most likely] - else if(yPos <= (yMin + yDead)) - yOff = +4; // full down - else if(yPos >= (yMax - yDead)) - yOff = -4; // full up - else if(yPos < (yMid - yDead)) { // part down - int lo = (yMin + yDead) + 1; // lowest position - int hi = (yMid - yDead) - 1; // highest position + // All this to print a 3x3 square (in the right place) - LOL! + if ((yPos >= (yMid -yDead)) && (yPos <= (yMid +yDead))) yOff = 0 ; // centre [most likely] + else if (yPos <= (yMin +yDead)) yOff = +4 ; // full down + else if (yPos >= (yMax -yDead)) yOff = -4 ; // full up + else if (yPos < (yMid -yDead)) { // part down + int lo = (yMin +yDead) +1; // lowest position + int hi = (yMid -yDead) -1; // highest position - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) + int range = (hi -lo) +1; // range covered + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) - int lo1 = hi - div + 1; // (in brevity) - int hi3 = hi - div - div - (rem == 2); // ... + int lo1 = hi -div +1; // (in brevity) + int hi3 = hi -div -div -(rem==2); // ... - if(yPos <= hi3) - yOff = +3; // zone #3 - else if(yPos >= lo1) - yOff = +1; // zone #1 - else - yOff = +2; // zone #2 + if (yPos <= hi3) yOff = +3 ; // zone #3 + else if (yPos >= lo1) yOff = +1 ; // zone #1 + else yOff = +2 ; // zone #2 - } else /*if (yPos > (yMid +yDead))*/ { // part up - int lo = (yMid + yDead) + 1; // lowest position - int hi = (yMax - yDead) - 1; // highest position + } else /*if (yPos > (yMid +yDead))*/ { // part up + int lo = (yMid +yDead) +1; // lowest position + int hi = (yMax -yDead) -1; // highest position - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) + int range = (hi -lo) +1; // range covered + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... + int hi1 = lo +div -1; // (in brevity) + int lo3 = lo +div +div +(rem==2); // ... - if(yPos <= hi1) - yOff = -1; // zone #-1 - else if(yPos >= lo3) - yOff = -3; // zone #-3 - else - yOff = -2; // zone #-2 - } + if (yPos <= hi1) yOff = -1 ; // zone #-1 + else if (yPos >= lo3) yOff = -3 ; // zone #-3 + else yOff = -2 ; // zone #-2 + } - show(canvas, x - (img_cc_Joy.w / 2), y - (img_cc_Joy.h / 2), &img_cc_Joy, SHOW_SET_BLK); + show(canvas, x-(img_cc_Joy.w/2),y-(img_cc_Joy.h/2), &img_cc_Joy, SHOW_SET_BLK); - // All ^that^ for v-this-v - LOL!! - canvas_draw_box(canvas, (x - 1) + xOff, (y - 1) + yOff, 3, 3); + // All ^that^ for v-this-v - LOL!! + canvas_draw_box(canvas, (x-1)+xOff,(y-1)+yOff, 3,3); } diff --git a/applications/plugins/wii_ec_anal/wii_anal_lcd.h b/applications/plugins/wii_ec_anal/wii_anal_lcd.h index e52a3adc6..5258c4de1 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_lcd.h +++ b/applications/plugins/wii_ec_anal/wii_anal_lcd.h @@ -1,57 +1,43 @@ -#ifndef WII_ANAL_LCD_H_ -#define WII_ANAL_LCD_H_ +#ifndef WII_ANAL_LCD_H_ +#define WII_ANAL_LCD_H_ //----------------------------------------------------------------------------- ---------------------------------------- // A couple of monospaced hex fonts // #include "gfx/images.h" -extern const image_t* img_6x8[]; -extern const image_t* img_5x7[]; +extern const image_t* img_6x8[]; +extern const image_t* img_5x7[]; //============================================================================= ======================================== // macros to draw only two sides of a box // these are used for drawing the wires on the WAIT screen // -#define BOX_TL(x1, y1, x2, y2) \ - do { \ - canvas_draw_frame(canvas, x1, y1, x2 - x1 + 1, 2); \ - canvas_draw_frame(canvas, x1, y1 + 2, 2, y2 - y1 + 1 - 2); \ - } while(0) +#define BOX_TL(x1,y1,x2,y2) do { \ + canvas_draw_frame(canvas, x1,y1, x2-x1+1,2); \ + canvas_draw_frame(canvas, x1,y1+2, 2,y2-y1+1-2); \ +}while(0) + +#define BOX_BL(x1,y1,x2,y2) do { \ + canvas_draw_frame(canvas, x1,y2-1, x2-x1+1,2); \ + canvas_draw_frame(canvas, x1,y1, 2,y2-y1+1-2); \ +}while(0) -#define BOX_BL(x1, y1, x2, y2) \ - do { \ - canvas_draw_frame(canvas, x1, y2 - 1, x2 - x1 + 1, 2); \ - canvas_draw_frame(canvas, x1, y1, 2, y2 - y1 + 1 - 2); \ - } while(0) //============================================================================= ======================================== // Function prototypes // -void patBacklight(state_t* state); +void patBacklight (state_t* state) ; -void showHex( - Canvas* const canvas, - uint8_t x, - uint8_t y, - const uint32_t val, - const uint8_t cnt, - const int b); +void showHex ( Canvas* const canvas, uint8_t x, uint8_t y, + const uint32_t val, const uint8_t cnt, const int b ) ; -void showPeakHold(state_t* const state, Canvas* const canvas, const int hold); +void showPeakHold (state_t* const state, Canvas* const canvas, const int hold) ; + +void showJoy ( Canvas* const canvas, const uint8_t x, const uint8_t y, // x,y is the CENTRE of the Joystick + const uint8_t xMin, const uint8_t xMid, const uint8_t xMax, + const uint8_t yMin, const uint8_t yMid, const uint8_t yMax, + const uint8_t xPos, const uint8_t yPos, const uint8_t bits ) ; -void showJoy( - Canvas* const canvas, - const uint8_t x, - const uint8_t y, // x,y is the CENTRE of the Joystick - const uint8_t xMin, - const uint8_t xMid, - const uint8_t xMax, - const uint8_t yMin, - const uint8_t yMid, - const uint8_t yMax, - const uint8_t xPos, - const uint8_t yPos, - const uint8_t bits); #endif //WII_ANAL_LCD_H_ diff --git a/applications/plugins/wii_ec_anal/wii_anal_ver.h b/applications/plugins/wii_ec_anal/wii_anal_ver.h index 3f2c8c0e6..88ed17d19 100644 --- a/applications/plugins/wii_ec_anal/wii_anal_ver.h +++ b/applications/plugins/wii_ec_anal/wii_anal_ver.h @@ -1,9 +1,9 @@ -#ifndef WII_ANAL_VER_H_ -#define WII_ANAL_VER_H_ +#ifndef WII_ANAL_VER_H_ +#define WII_ANAL_VER_H_ -#include "gfx/images.h" +#include "gfx/images.h" -#define VER_MAJ &img_3x5_1 -#define VER_MIN &img_3x5_0 +#define VER_MAJ &img_3x5_1 +#define VER_MIN &img_3x5_0 #endif //WII_ANAL_VER_H_ diff --git a/applications/plugins/wii_ec_anal/wii_ec.c b/applications/plugins/wii_ec_anal/wii_ec.c index 00dcbf922..93b17c67c 100644 --- a/applications/plugins/wii_ec_anal/wii_ec.c +++ b/applications/plugins/wii_ec_anal/wii_ec.c @@ -1,298 +1,220 @@ -#include -#include // Core API +#include +#include // Core API -#include "wii_anal.h" -#include "wii_i2c.h" -#include "wii_ec.h" -#include "bc_logging.h" +#include "wii_anal.h" +#include "wii_i2c.h" +#include "wii_ec.h" +#include "bc_logging.h" -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings +#include "gfx/images.h" // Images +#include "wii_anal_lcd.h" // Drawing functions +#include "wii_anal_keys.h" // key mappings //----------------------------------------------------------------------------- ---------------------------------------- // List of known perhipherals // // More perhipheral ID codes here: https://wiibrew.org/wiki/Wiimote/Extension_Controllers#The_New_Way // -const ecId_t ecId[PID_CNT] = { - [PID_UNKNOWN] = - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - "Unknown Perhipheral", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - ec_show, - ec_key}, +const ecId_t ecId[PID_CNT] = { + [PID_UNKNOWN ] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "Unknown Perhipheral", SCENE_DUMP, + NULL, NULL, NULL, NULL, ec_show, ec_key}, - // If you're wise, ONLY edit this bit - [PID_NUNCHUCK] = - {{0x00, 0x00, 0xA4, 0x20, 0x00, 0x00}, - "Nunchuck", - SCENE_NUNCHUCK, - NULL, - nunchuck_decode, - nunchuck_msg, - nunchuck_calib, - nunchuck_show, - nunchuck_key}, + // If you're wise, ONLY edit this bit + [PID_NUNCHUCK ] = { {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00}, "Nunchuck", SCENE_NUNCHUCK, + NULL, nunchuck_decode, nunchuck_msg, nunchuck_calib, nunchuck_show, nunchuck_key }, - [PID_NUNCHUCK_R2] = - {{0xFF, 0x00, 0xA4, 0x20, 0x00, 0x00}, - "Nunchuck (rev2)", - SCENE_NUNCHUCK, - NULL, - nunchuck_decode, - nunchuck_msg, - nunchuck_calib, - nunchuck_show, - nunchuck_key}, + [PID_NUNCHUCK_R2] = { {0xFF, 0x00, 0xA4, 0x20, 0x00, 0x00}, "Nunchuck (rev2)", SCENE_NUNCHUCK, + NULL, nunchuck_decode, nunchuck_msg, nunchuck_calib, nunchuck_show, nunchuck_key }, - [PID_CLASSIC] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}, - "Classic Controller", - SCENE_CLASSIC, - NULL, - classic_decode, - classic_msg, - classic_calib, - classic_show, - classic_key}, + [PID_CLASSIC ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}, "Classic Controller", SCENE_CLASSIC, + NULL, classic_decode, classic_msg, classic_calib, classic_show, classic_key }, - [PID_CLASSIC_PRO] = - {{0x01, 0x00, 0xA4, 0x20, 0x01, 0x01}, - "Classic Controller Pro", - SCENE_CLASSIC, - NULL, - classic_decode, - classic_msg, - classic_calib, - classic_show, - classic_key}, + [PID_CLASSIC_PRO] = { {0x01, 0x00, 0xA4, 0x20, 0x01, 0x01}, "Classic Controller Pro", SCENE_CLASSIC, + NULL, classic_decode, classic_msg, classic_calib, classic_show, classic_key }, - [PID_BALANCE] = - {{0x00, 0x00, 0xA4, 0x20, 0x04, 0x02}, - "Balance Board", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, + [PID_BALANCE ] = { {0x00, 0x00, 0xA4, 0x20, 0x04, 0x02}, "Balance Board", SCENE_DUMP, + NULL, NULL, NULL, NULL, NULL, NULL }, - [PID_GH_GUITAR] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "Guitar Hero Guitar", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, + [PID_GH_GUITAR ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero Guitar", SCENE_DUMP, + NULL, NULL, NULL, NULL, NULL, NULL }, - [PID_GH_DRUMS] = - {{0x01, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "Guitar Hero World Tour Drums", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, + [PID_GH_DRUMS ] = { {0x01, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero World Tour Drums", SCENE_DUMP, + NULL, NULL, NULL, NULL, NULL, NULL }, - [PID_TURNTABLE] = - {{0x03, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "DJ Hero Turntable", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, + [PID_TURNTABLE ] = { {0x03, 0x00, 0xA4, 0x20, 0x01, 0x03}, "DJ Hero Turntable", SCENE_DUMP, + NULL, NULL, NULL, NULL, NULL, NULL }, - [PID_TAIKO_DRUMS] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x11}, - "Taiko Drum Controller)", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, // Taiko no Tatsujin TaTaCon (Drum controller) + [PID_TAIKO_DRUMS] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x11}, "Taiko Drum Controller)", SCENE_DUMP, + NULL, NULL, NULL, NULL, NULL, NULL }, // Taiko no Tatsujin TaTaCon (Drum controller) - [PID_UDRAW] = - {{0xFF, 0x00, 0xA4, 0x20, 0x00, 0x13}, - "uDraw Tablet", - SCENE_DUMP, - udraw_init, - NULL, - NULL, - NULL, - NULL, - NULL}, //! same as drawsome? - // ----- + [PID_UDRAW ] = { {0xFF, 0x00, 0xA4, 0x20, 0x00, 0x13}, "uDraw Tablet", SCENE_DUMP, + udraw_init, NULL, NULL, NULL, NULL, NULL }, //! same as drawsome? + // ----- - [PID_ERROR] = - {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - "Read Error", - SCENE_NONE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, + [PID_ERROR ] = { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, "Read Error", SCENE_NONE, + NULL, NULL, NULL, NULL, NULL, NULL }, - [PID_NULL] = {{0}, NULL, SCENE_NONE, NULL, NULL, NULL, NULL, NULL, NULL} // last entry + [PID_NULL ] = { {0}, NULL, SCENE_NONE, NULL, NULL, NULL, NULL, NULL, NULL } // last entry }; //+============================================================================ ======================================== -void ecDecode(wiiEC_t* pec) { - if(ecId[pec->pidx].decode) ecId[pec->pidx].decode(pec); +void ecDecode (wiiEC_t* pec) +{ + if (ecId[pec->pidx].decode) ecId[pec->pidx].decode(pec) ; } //+============================================================================ ======================================== -void ecCalibrate(wiiEC_t* const pec, ecCalib_t c) { - if(ecId[pec->pidx].calib) ecId[pec->pidx].calib(pec, c); +void ecCalibrate (wiiEC_t* const pec, ecCalib_t c) +{ + if (ecId[pec->pidx].calib) ecId[pec->pidx].calib(pec, c) ; } //+============================================================================ ======================================== -void ecPoll(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ENTER; - furi_assert(queue); +void ecPoll (wiiEC_t* const pec, FuriMessageQueue* const queue) +{ + ENTER; + furi_assert(queue); - if(!pec->init) { - // Attempt to initialise - if(ecInit(pec, NULL)) { //! need a way to auto-start with encryption enabled - eventMsg_t msg = { - .id = EVID_WIIEC, .wiiEc = {.type = WIIEC_CONN, .in = '<', .val = pec->pidx}}; - furi_message_queue_put(queue, &msg, 0); - } + if (!pec->init) { + // Attempt to initialise + if (ecInit(pec, NULL)) { //! need a way to auto-start with encryption enabled + eventMsg_t msg = { + .id = EVID_WIIEC, + .wiiEc = { + .type = WIIEC_CONN, + .in = '<', + .val = pec->pidx + } + }; + furi_message_queue_put(queue, &msg, 0); + } - } else { - // Attempt to read - switch(ecRead(pec)) { - case 2: { // device gone - eventMsg_t msg = { - .id = EVID_WIIEC, .wiiEc = {.type = WIIEC_DISCONN, .in = '>', .val = pec->pidx}}; - furi_message_queue_put(queue, &msg, 0); - break; - } + } else { + // Attempt to read + switch (ecRead(pec)) { + case 2: { // device gone + eventMsg_t msg = { + .id = EVID_WIIEC, + .wiiEc = { + .type = WIIEC_DISCONN, + .in = '>', + .val = pec->pidx + } + }; + furi_message_queue_put(queue, &msg, 0); + break; + } - case 0: { // read OK - void (*fn)(wiiEC_t*, FuriMessageQueue*) = ecId[pec->pidx].check; - if(fn) fn(pec, queue); - break; - } + case 0: { // read OK + void (*fn)(wiiEC_t*, FuriMessageQueue*) = ecId[pec->pidx].check; + if (fn) fn(pec, queue); + break; + } - case 3: // read fail - // this is probably temporary just ignore it - break; + case 3: // read fail + // this is probably temporary just ignore it + break; - default: // bug: unknown - case 1: // bug: not initialised - should never happen - ERROR("%s : read bug", __func__); - break; - } - } + default: // bug: unknown + case 1: // bug: not initialised - should never happen + ERROR("%s : read bug", __func__); + break; + } + } - LEAVE; - return; + LEAVE; + return; } //+============================================================================ ======================================== // This is the screen drawn for an unknown controller // It is also available by pressing LEFT (at least once) on a "known controller" screen // -void ec_show(Canvas* const canvas, state_t* const state) { - wiiEC_t* pec = &state->ec; - int h = 11; // line height - int x = 1; // (initial) offset for bits - int y = -h; // previous y value - int yb = 0; // y for bit patterns - int c2 = 17; // column 2 +void ec_show (Canvas* const canvas, state_t* const state) +{ + wiiEC_t* pec = &state->ec; + int h = 11; // line height + int x = 1; // (initial) offset for bits + int y = -h; // previous y value + int yb = 0; // y for bit patterns + int c2 = 17; // column 2 - // Headings - canvas_set_font(canvas, FontSecondary); - canvas_set_color(canvas, ColorBlack); + // Headings + canvas_set_font(canvas, FontSecondary); + canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned(canvas, 0, 0, AlignLeft, AlignTop, "SID:"); - canvas_draw_str_aligned(canvas, c2, 0, AlignLeft, AlignTop, pec->sid); + canvas_draw_str_aligned(canvas, 0 ,0, AlignLeft, AlignTop, "SID:"); + canvas_draw_str_aligned(canvas, c2,0, AlignLeft, AlignTop, pec->sid); - canvas_draw_str_aligned(canvas, 0, 11, AlignLeft, AlignTop, "PID:"); - canvas_draw_str_aligned(canvas, 0, 22, AlignLeft, AlignTop, "Cal:"); + canvas_draw_str_aligned(canvas, 0 ,11, AlignLeft, AlignTop, "PID:"); + canvas_draw_str_aligned(canvas, 0 ,22, AlignLeft, AlignTop, "Cal:"); - // PID - x = c2; - for(int i = 0; i < 6; i++) { - show(canvas, x, 11, img_5x7[pec->pid[i] >> 4], SHOW_SET_BLK); - x += 5 + 1; - show(canvas, x, 11, img_5x7[pec->pid[i] & 0xF], SHOW_SET_BLK); - x += 5 + 1 + 2; - } + // PID + x = c2; + for (int i = 0; i < 6; i++) { + show(canvas, x,11, img_5x7[pec->pid[i]>>4], SHOW_SET_BLK); + x += 5+1; + show(canvas, x,11, img_5x7[pec->pid[i]&0xF], SHOW_SET_BLK); + x += 5+1+2; + } - // Calibrations data - y = 11; - for(int j = 0; j <= 8; j += 8) { - x = c2; - y += 11; - for(int i = 0; i < 8; i++) { - show(canvas, x, y, img_5x7[pec->calF[i + j] >> 4], SHOW_SET_BLK); - x += 5 + 1; - show(canvas, x, y, img_5x7[pec->calF[i + j] & 0xF], SHOW_SET_BLK); - x += 5 + 1 + 2; - } - } + // Calibrations data + y = 11; + for (int j = 0; j <= 8; j += 8) { + x = c2; + y += 11; + for (int i = 0; i < 8; i++) { + show(canvas, x,y, img_5x7[pec->calF[i+j]>>4], SHOW_SET_BLK); + x += 5+1; + show(canvas, x,y, img_5x7[pec->calF[i+j]&0xF], SHOW_SET_BLK); + x += 5+1+2; + } + } - // Reading - x = 1; - y++; - yb = (y += h) + h + 2; + // Reading + x = 1; + y++; + yb = (y+=h) +h +2; - canvas_draw_line(canvas, x, y - 1, x, yb + 4); - x += 2; + canvas_draw_line(canvas, x,y-1, x,yb+4); + x += 2; - for(int i = 0; i < JOY_LEN; i++) { - show(canvas, x + 1, y, img_6x8[pec->joy[i] >> 4], SHOW_SET_BLK); - show(canvas, x + 11, y, img_6x8[pec->joy[i] & 0xF], SHOW_SET_BLK); + for (int i = 0; i < JOY_LEN; i++) { + show(canvas, x+ 1,y, img_6x8[pec->joy[i]>>4], SHOW_SET_BLK); + show(canvas, x+11,y, img_6x8[pec->joy[i]&0xF], SHOW_SET_BLK); - // bits - for(int m = 0x80; m; m >>= 1) { - x += 2 * !!(m & 0x08); // nybble step - canvas_draw_box(canvas, x, yb + (2 * !(pec->joy[i] & m)), 2, 2); - x += 2; // bit step - } + // bits + for (int m = 0x80; m; m >>= 1) { + x += 2 * !!(m & 0x08) ; // nybble step + canvas_draw_box(canvas, x,yb +(2*!(pec->joy[i] & m)), 2,2) ; + x += 2; // bit step + } - // byte step - x += 1; - canvas_draw_line(canvas, x, y - 1, x, yb + 4); - x += 2; - } + // byte step + x += 1; + canvas_draw_line(canvas, x,y-1, x,yb+4); + x += 2; + } - // Scene navigation - if(state->scenePrev != SCENE_WAIT) show(canvas, 120, 0, &img_key_R, SHOW_SET_BLK); + // Scene navigation + if (state->scenePrev != SCENE_WAIT) + show(canvas, 120,0, &img_key_R, SHOW_SET_BLK); } //+============================================================================ ======================================== -// The DUMP screen is +// The DUMP screen is // -bool ec_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +bool ec_key (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - if(state->scenePrev != SCENE_WAIT) { - //# input.type == InputTypeShort) && (msg->input.key == InputKeyRight)) { - sceneSet(state, state->scenePrev); - used = true; - } - } + if (state->scenePrev != SCENE_WAIT) { + //# input.type == InputTypeShort) && (msg->input.key == InputKeyRight)) { + sceneSet(state, state->scenePrev); + used = true; + } + } - return used; + return used; } diff --git a/applications/plugins/wii_ec_anal/wii_ec.h b/applications/plugins/wii_ec_anal/wii_ec.h index a28453740..e8745ba13 100644 --- a/applications/plugins/wii_ec_anal/wii_ec.h +++ b/applications/plugins/wii_ec_anal/wii_ec.h @@ -1,142 +1,158 @@ -#ifndef WII_EC_H_ -#define WII_EC_H_ +#ifndef WII_EC_H_ +#define WII_EC_H_ -#include +#include -#include +#include -#include "wii_ec_nunchuck.h" -#include "wii_ec_classic.h" -#include "wii_ec_udraw.h" +#include "wii_ec_nunchuck.h" +#include "wii_ec_classic.h" +#include "wii_ec_udraw.h" //----------------------------------------------------------------------------- ---------------------------------------- // Crypto key (PSK), base register : {0x40..0x4F}[2][8] -#define ENC_LEN (2 * 8) +#define ENC_LEN (2*8) // Controller State data, base register : {0x00..0x05}[6] -#define JOY_LEN (6) +#define JOY_LEN (6) // Calibration data, base register : {0x20..0x2F}[16] -#define CAL_LEN (16) +#define CAL_LEN (16) // Controller ID, base register : {0xFA..0xFF}[6] -#define PID_LEN (6) +#define PID_LEN (6) //----------------------------------------------------------------------------- ---------------------------------------- // Perhipheral specific parameters union // -typedef union ecDec { - ecDecNunchuck_t nunchuck; - ecDecClassic_t classic; -} ecDec_t; +typedef + union ecDec { + ecDecNunchuck_t nunchuck; + ecDecClassic_t classic; + } +ecDec_t; //----------------------------------------------------------------------------- -typedef union ecCal { - // 0=lowest seen ; 1=min ; 2=mid ; 3=max ; 4=highest seen - ecCalNunchuck_t nunchuck[5]; - ecCalClassic_t classic[5]; -} ecCal_t; +typedef + union ecCal { + // 0=lowest seen ; 1=min ; 2=mid ; 3=max ; 4=highest seen + ecCalNunchuck_t nunchuck[5]; + ecCalClassic_t classic[5]; + } +ecCal_t; //----------------------------------------------------------------------------- ---------------------------------------- // Wii Extension Controller events // -typedef enum wiiEcEventType { - WIIEC_NONE, - WIIEC_CONN, // Connect - WIIEC_DISCONN, // Disconnect - WIIEC_PRESS, // Press button - WIIEC_RELEASE, // Release button - WIIEC_ANALOG, // Analogue change (Joystick/Trigger) - WIIEC_ACCEL, // Accelerometer change -} wiiEcEventType_t; +typedef + enum wiiEcEventType { + WIIEC_NONE, + WIIEC_CONN, // Connect + WIIEC_DISCONN, // Disconnect + WIIEC_PRESS, // Press button + WIIEC_RELEASE, // Release button + WIIEC_ANALOG, // Analogue change (Joystick/Trigger) + WIIEC_ACCEL, // Accelerometer change + } +wiiEcEventType_t; //----------------------------------------------------------------------------- -typedef struct wiiEcEvent { - wiiEcEventType_t type; // event type - char in; // input (see device specific options) - uint32_t val; // new value - meaningless for digital button presses -} wiiEcEvent_t; +typedef + struct wiiEcEvent { + wiiEcEventType_t type; // event type + char in; // input (see device specific options) + uint32_t val; // new value - meaningless for digital button presses + } +wiiEcEvent_t; //----------------------------------------------------------------------------- ---------------------------------------- // Known perhipheral types // -typedef enum ecPid { - PID_UNKNOWN = 0, - PID_FIRST = 1, - PID_NUNCHUCK = PID_FIRST, +typedef + enum ecPid { + PID_UNKNOWN = 0, + PID_FIRST = 1, + PID_NUNCHUCK = PID_FIRST, - // If you're wise, ONLY edit this section - PID_NUNCHUCK_R2, - PID_CLASSIC, - PID_CLASSIC_PRO, - PID_BALANCE, - PID_GH_GUITAR, - PID_GH_DRUMS, - PID_TURNTABLE, - PID_TAIKO_DRUMS, - PID_UDRAW, //! same as drawsome? - // ----- + // If you're wise, ONLY edit this section + PID_NUNCHUCK_R2, + PID_CLASSIC, + PID_CLASSIC_PRO, + PID_BALANCE, + PID_GH_GUITAR, + PID_GH_DRUMS, + PID_TURNTABLE, + PID_TAIKO_DRUMS, + PID_UDRAW, //! same as drawsome? + // ----- - PID_ERROR, - PID_NULL, - PID_CNT, -} ecPid_t; + PID_ERROR, + PID_NULL, + PID_CNT, + } +ecPid_t; //----------------------------------------------------------------------------- // Calibration strategies // -typedef enum ecCalib { - CAL_FACTORY = 0x01, // (re)set to factory defaults - CAL_TRACK = 0x02, // track maximum and minimum values seen - CAL_RESET = 0x04, // initialise ready for software calibration - CAL_RANGE = 0x08, // perform software calibration step - CAL_CENTRE = 0x10, // reset centre point of joystick - CAL_NOTJOY = 0x20, // do NOT calibrate the joystick -} ecCalib_t; +typedef + enum ecCalib { + CAL_FACTORY = 0x01, // (re)set to factory defaults + CAL_TRACK = 0x02, // track maximum and minimum values seen + CAL_RESET = 0x04, // initialise ready for software calibration + CAL_RANGE = 0x08, // perform software calibration step + CAL_CENTRE = 0x10, // reset centre point of joystick + CAL_NOTJOY = 0x20, // do NOT calibrate the joystick + } +ecCalib_t; //----------------------------------------------------------------------------- // ecId table entry // -typedef struct ecId { - uint8_t id[6]; // 6 byte ID string returned by Extension Controller - char* name; // Friendly name - scene_t scene; // Default scene - bool (*init)(wiiEC_t*); // Additional initialisation code - void (*decode)(wiiEC_t*); // Decode function - void (*check)(wiiEC_t*, FuriMessageQueue*); // check (for action) function - void (*calib)(wiiEC_t*, ecCalib_t); // calibrate analogue controllers [SOFTWARE] - void (*show)(Canvas* const, state_t* const); // Draw scene - bool (*keys)(const eventMsg_t* const, state_t* const); // Interpret keys -} ecId_t; +typedef + struct ecId { + uint8_t id[6]; // 6 byte ID string returned by Extension Controller + char* name; // Friendly name + scene_t scene; // Default scene + bool (*init)(wiiEC_t*); // Additional initialisation code + void (*decode)(wiiEC_t*); // Decode function + void (*check)(wiiEC_t*, FuriMessageQueue*); // check (for action) function + void (*calib)(wiiEC_t*, ecCalib_t); // calibrate analogue controllers [SOFTWARE] + void (*show)(Canvas* const, state_t* const); // Draw scene + bool (*keys)(const eventMsg_t* const, state_t* const); // Interpret keys + } +ecId_t; //----------------------------------------------------------------------------- // List of known perhipherals // // More perhipheral ID codes here: https://wiibrew.org/wiki/Wiimote/Extension_Controllers#The_New_Way // -extern const ecId_t ecId[PID_CNT]; +extern const ecId_t ecId[PID_CNT] ; //----------------------------------------------------------------------------- ---------------------------------------- // Data pertaining to a single Perhipheral instance // -typedef struct wiiEC { - // Perhipheral state - bool init; // Initialised? +typedef + struct wiiEC { + // Perhipheral state + bool init; // Initialised? - uint8_t pid[PID_LEN]; // PID string - eg. {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00} - ecPid_t pidx; // Index in to ecId table - const char* sid; // just for convenience + uint8_t pid[PID_LEN]; // PID string - eg. {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00} + ecPid_t pidx; // Index in to ecId table + const char* sid; // just for convenience - bool encrypt; // encryption enabled? - uint8_t encKey[ENC_LEN]; // encryption key + bool encrypt; // encryption enabled? + uint8_t encKey[ENC_LEN]; // encryption key - uint8_t calF[CAL_LEN]; // factory calibration data (not software) - uint8_t joy[JOY_LEN]; // Perhipheral raw data + uint8_t calF[CAL_LEN]; // factory calibration data (not software) + uint8_t joy[JOY_LEN]; // Perhipheral raw data - ecDec_t dec[2]; // device specific decode (two, so we can spot changes) - int decN; // which decode set is most recent {0, 1} - ecCal_t calS; // software calibration data -} wiiEC_t; + ecDec_t dec[2]; // device specific decode (two, so we can spot changes) + int decN; // which decode set is most recent {0, 1} + ecCal_t calS; // software calibration data + } +wiiEC_t; //----------------------------------------------------------------------------- ---------------------------------------- // Function prototypes @@ -145,17 +161,17 @@ typedef struct wiiEC { // top level check() function will handle connect/disconnect messages // -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; +#include // Canvas +typedef struct wiiEC wiiEC_t ; +typedef enum ecCalib ecCalib_t ; +typedef struct state state_t ; +typedef struct eventMsg eventMsg_t ; -void ecDecode(wiiEC_t* const pec); -void ecPoll(wiiEC_t* const pec, FuriMessageQueue* const queue); -void ecCalibrate(wiiEC_t* const pec, ecCalib_t c); +void ecDecode (wiiEC_t* const pec) ; +void ecPoll (wiiEC_t* const pec, FuriMessageQueue* const queue) ; +void ecCalibrate (wiiEC_t* const pec, ecCalib_t c) ; -void ec_show(Canvas* const canvas, state_t* const state); -bool ec_key(const eventMsg_t* const msg, state_t* const state); +void ec_show ( Canvas* const canvas, state_t* const state) ; +bool ec_key (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_EC_H_ diff --git a/applications/plugins/wii_ec_anal/wii_ec_classic.c b/applications/plugins/wii_ec_anal/wii_ec_classic.c index 5bd3398ca..91393ba07 100644 --- a/applications/plugins/wii_ec_anal/wii_ec_classic.c +++ b/applications/plugins/wii_ec_anal/wii_ec_classic.c @@ -1,17 +1,17 @@ -#include -#include // Core API +#include +#include // Core API -#include "wii_anal.h" -#include "wii_ec.h" -#include "bc_logging.h" +#include "wii_anal.h" +#include "wii_ec.h" +#include "bc_logging.h" //#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings +#include "wii_anal_lcd.h" // Drawing functions +#include "wii_anal_keys.h" // key mappings // ** If you want to see what this source code looks like with all the MACROs expanded // ** grep -v '#include ' wii_i2c_classic.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" +# include "wii_ec_macros.h" //----------------------------------------------------------------------------- ---------------------------------------- // Classic Controller ... Classic Controller Pro is electronically the same @@ -36,115 +36,102 @@ // ...And yes, the left-joystick has an extra 'bit' of precision! // ...Also: trgZ{L|R} WILL continue to increase after btnZ{L|R} has gone active // -void classic_decode(wiiEC_t* const pec) { - ecDecClassic_t* p = &pec->dec[(pec->decN = !pec->decN)].classic; - uint8_t* joy = pec->joy; +void classic_decode (wiiEC_t* const pec) +{ + ecDecClassic_t* p = &pec->dec[(pec->decN = !pec->decN)].classic; + uint8_t* joy = pec->joy; - p->trgZL = ((joy[2] >> 2) & 0x18) | ((joy[3] >> 5) & 0x07); // {5} - p->btnZL = !(joy[4] & 0x20); // !{1} + p->trgZL = ((joy[2] >>2) &0x18) | ((joy[3] >>5) &0x07); // {5} + p->btnZL = !(joy[4] & 0x20); // !{1} - p->trgZR = joy[3] & 0x1F; // {5} - p->btnZR = !(joy[4] & 0x02); // !{1} + p->trgZR = joy[3] & 0x1F; // {5} + p->btnZR = !(joy[4] & 0x02); // !{1} - p->btnL = !(joy[5] & 0x80); // !{1} - p->btnR = !(joy[5] & 0x04); // !{1} + p->btnL = !(joy[5] & 0x80); // !{1} + p->btnR = !(joy[5] & 0x04); // !{1} - p->padU = !(joy[5] & 0x01); // !{1} - p->padD = !(joy[4] & 0x40); // !{1} - p->padL = !(joy[5] & 0x02); // !{1} - p->padR = !(joy[4] & 0x80); // !{1} + p->padU = !(joy[5] & 0x01); // !{1} + p->padD = !(joy[4] & 0x40); // !{1} + p->padL = !(joy[5] & 0x02); // !{1} + p->padR = !(joy[4] & 0x80); // !{1} - p->btnM = !(joy[4] & 0x10); // !{1} - p->btnH = !(joy[4] & 0x08); // !{1} - p->btnP = !(joy[4] & 0x04); // !{1} + p->btnM = !(joy[4] & 0x10); // !{1} + p->btnH = !(joy[4] & 0x08); // !{1} + p->btnP = !(joy[4] & 0x04); // !{1} - p->btnX = !(joy[5] & 0x08); // !{1} - p->btnY = !(joy[5] & 0x20); // !{1} + p->btnX = !(joy[5] & 0x08); // !{1} + p->btnY = !(joy[5] & 0x20); // !{1} - p->btnA = !(joy[5] & 0x10); // !{1} - p->btnB = !(joy[5] & 0x40); // !{1} + p->btnA = !(joy[5] & 0x10); // !{1} + p->btnB = !(joy[5] & 0x40); // !{1} - p->joyLX = joy[0] & 0x3F; // {6} - p->joyLY = joy[1] & 0x3F; // {6} + p->joyLX = joy[0] & 0x3F; // {6} + p->joyLY = joy[1] & 0x3F; // {6} - p->joyRX = ((joy[0] >> 3) & 0x18) | ((joy[1] >> 5) & 0x06) | ((joy[2] >> 7) & 0x01); // {5} - p->joyRY = joy[2] & 0x1F; // {5} + p->joyRX = ((joy[0] >>3) &0x18) | ((joy[1] >>5) &0x06) | ((joy[2] >>7) &0x01); // {5} + p->joyRY = joy[2] & 0x1F; // {5} - DEBUG( - ">%d> ZL{%02X}%c, L:%c, R:%c, ZR{%02X}%c", - pec->decN, - p->trgZL, - (p->btnZL ? '#' : '.'), - (p->btnL ? '#' : '.'), - (p->btnR ? '#' : '.'), - p->trgZR, - (p->btnZR ? '#' : '.')); - DEBUG( - ">%d> D:{%c,%c,%c,%c}, H:{%c,%c,%c}, B:{%c,%c,%c,%c}", - pec->decN, - (p->padU ? 'U' : '.'), - (p->padD ? 'D' : '.'), - (p->padL ? 'L' : '.'), - (p->padR ? 'R' : '.'), - (p->btnM ? '-' : '.'), - (p->btnH ? 'H' : '.'), - (p->btnP ? '+' : '.'), - (p->btnX ? 'X' : '.'), - (p->btnY ? 'Y' : '.'), - (p->btnA ? 'A' : '.'), - (p->btnB ? 'B' : '.')); - DEBUG( - ">%d> JoyL{x:%02X, y:%02X}, JoyR{x:%02X, y:%02X}", - pec->decN, - p->joyLX, - p->joyLY, - p->joyRX, - p->joyRY); + DEBUG( ">%d> ZL{%02X}%c, L:%c, R:%c, ZR{%02X}%c", pec->decN, + p->trgZL, (p->btnZL ? '#' : '.'), + (p->btnL ? '#' : '.'), + (p->btnR ? '#' : '.'), + p->trgZR, (p->btnZR ? '#' : '.') + ); + DEBUG( ">%d> D:{%c,%c,%c,%c}, H:{%c,%c,%c}, B:{%c,%c,%c,%c}", pec->decN, + (p->padU ? 'U' : '.'), (p->padD ? 'D' : '.'), (p->padL ? 'L' : '.'), (p->padR ? 'R' : '.'), + (p->btnM ? '-' : '.'), (p->btnH ? 'H' : '.'), (p->btnP ? '+' : '.'), + (p->btnX ? 'X' : '.'), (p->btnY ? 'Y' : '.'), (p->btnA ? 'A' : '.'), (p->btnB ? 'B' : '.') + ); + DEBUG( ">%d> JoyL{x:%02X, y:%02X}, JoyR{x:%02X, y:%02X}", pec->decN, + p->joyLX, p->joyLY, p->joyRX, p->joyRY + ); } //+============================================================================ ======================================== // Give each button a unique character identifier // -void classic_msg(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ecDecClassic_t* new = &pec->dec[pec->decN].classic; - ecDecClassic_t* old = &pec->dec[!pec->decN].classic; +void classic_msg (wiiEC_t* const pec, FuriMessageQueue* const queue) +{ + ecDecClassic_t* new = &pec->dec[pec->decN].classic; + ecDecClassic_t* old = &pec->dec[!pec->decN].classic; - eventMsg_t msg = { - .id = EVID_WIIEC, - .wiiEc = { - .type = WIIEC_NONE, - .in = ' ', - .val = 0, - }}; + eventMsg_t msg = { + .id = EVID_WIIEC, + .wiiEc = { + .type = WIIEC_NONE, + .in = ' ', + .val = 0, + } + }; - ANALOG(trgZL, 'l'); // FIVE bit value - ANABTN(btnZL, trgZL, 'l'); + ANALOG(trgZL, 'l'); // FIVE bit value + ANABTN(btnZL, trgZL, 'l'); - BUTTON(btnL, 'L'); - BUTTON(btnR, 'R'); + BUTTON(btnL, 'L'); + BUTTON(btnR, 'R'); - ANALOG(trgZR, 'r'); // FIVE bit value - ANABTN(btnZR, trgZR, 'r'); + ANALOG(trgZR, 'r'); // FIVE bit value + ANABTN(btnZR, trgZR, 'r'); - BUTTON(padU, 'W'); - BUTTON(padL, 'A'); - BUTTON(padD, 'S'); - BUTTON(padR, 'D'); + BUTTON(padU, 'W'); + BUTTON(padL, 'A'); + BUTTON(padD, 'S'); + BUTTON(padR, 'D'); - BUTTON(btnM, '-'); - BUTTON(btnH, 'h'); - BUTTON(btnP, '+'); + BUTTON(btnM, '-'); + BUTTON(btnH, 'h'); + BUTTON(btnP, '+'); - BUTTON(btnX, 'x'); - BUTTON(btnY, 'y'); - BUTTON(btnA, 'a'); - BUTTON(btnB, 'b'); + BUTTON(btnX, 'x'); + BUTTON(btnY, 'y'); + BUTTON(btnA, 'a'); + BUTTON(btnB, 'b'); - ANALOG(joyLX, 'x'); // SIX bit values - ANALOG(joyLY, 'y'); + ANALOG(joyLX, 'x'); // SIX bit values + ANALOG(joyLY, 'y'); - ANALOG(joyRX, 'X'); // FIVE bit values - ANALOG(joyRY, 'Y'); + ANALOG(joyRX, 'X'); // FIVE bit values + ANALOG(joyRY, 'Y'); } //+============================================================================ ======================================== @@ -157,283 +144,255 @@ void classic_msg(wiiEC_t* const pec, FuriMessageQueue* const queue) { // 9..11 right analog stick Y axis {maximum, minimum, center} ... JoyR is 5bits, so >>3 to compare to readings // 12..15 somehow describe the shoulder {5bit} button values!? // -void classic_calib(wiiEC_t* const pec, ecCalib_t c) { - ecDecClassic_t* src = &pec->dec[pec->decN].classic; // from input - ecCalClassic_t* dst = pec->calS.classic; // to calibration data +void classic_calib (wiiEC_t* const pec, ecCalib_t c) +{ + ecDecClassic_t* src = &pec->dec[pec->decN].classic; // from input + ecCalClassic_t* dst = pec->calS.classic; // to calibration data - if(c & CAL_RESET) { // initialise ready for software calibration - // LO is set to the MAXIMUM value (so it can be reduced) - // HI is set to ZERO (so it can be increased) - RESET_LO_HI(trgZL, 5); // 5bit value - RESET_LO_HI(trgZR, 5); // 5bit value + if (c & CAL_RESET) { // initialise ready for software calibration + // LO is set to the MAXIMUM value (so it can be reduced) + // HI is set to ZERO (so it can be increased) + RESET_LO_HI(trgZL, 5); // 5bit value + RESET_LO_HI(trgZR, 5); // 5bit value - RESET_LO_MID_HI(joyLX, 6); // 6bit value - RESET_LO_MID_HI(joyLY, 6); // 6bit value + RESET_LO_MID_HI(joyLX, 6); // 6bit value + RESET_LO_MID_HI(joyLY, 6); // 6bit value - RESET_LO_MID_HI(joyRX, 5); // 5bit value - RESET_LO_MID_HI(joyRY, 5); // 5bit value - } - if(c & CAL_FACTORY) { // (re)set to factory defaults - //! strategy for factory calibration for classic controller [pro] triggers is (currently) unknown - //! FACTORY_LO( trgZL, pec->calF[12..15]); - //! FACTORY_MID(trgZL, pec->calF[12..15]); - //! FACTORY_HI( trgZL, pec->calF[12..15]); + RESET_LO_MID_HI(joyRX, 5); // 5bit value + RESET_LO_MID_HI(joyRY, 5); // 5bit value + } + if (c & CAL_FACTORY) { // (re)set to factory defaults +//! strategy for factory calibration for classic controller [pro] triggers is (currently) unknown +//! FACTORY_LO( trgZL, pec->calF[12..15]); +//! FACTORY_MID(trgZL, pec->calF[12..15]); +//! FACTORY_HI( trgZL, pec->calF[12..15]); - //! FACTORY_LO( trgZR, pec->calF[12..15]); - //! FACTORY_MID(trgZR, pec->calF[12..15]); - //! FACTORY_HI( trgZR, pec->calF[12..15]); +//! FACTORY_LO( trgZR, pec->calF[12..15]); +//! FACTORY_MID(trgZR, pec->calF[12..15]); +//! FACTORY_HI( trgZR, pec->calF[12..15]); #if 1 - FACTORY_LO(trgZL, 0x03); - FACTORY_LO(trgZR, 0x03); + FACTORY_LO(trgZL, 0x03); + FACTORY_LO(trgZR, 0x03); - FACTORY_MID(trgZL, 0x1B); //! these will be set every time the digital switch changes to ON - FACTORY_MID(trgZR, 0x1B); + FACTORY_MID(trgZL, 0x1B); //! these will be set every time the digital switch changes to ON + FACTORY_MID(trgZR, 0x1B); #endif - FACTORY_LO(joyLX, pec->calF[1] >> 2); - FACTORY_MID(joyLX, pec->calF[2] >> 2); - FACTORY_HI(joyLX, pec->calF[0] >> 2); + FACTORY_LO( joyLX, pec->calF[ 1] >>2); + FACTORY_MID(joyLX, pec->calF[ 2] >>2); + FACTORY_HI( joyLX, pec->calF[ 0] >>2); - FACTORY_LO(joyLY, pec->calF[4] >> 2); - FACTORY_MID(joyLY, pec->calF[5] >> 2); - FACTORY_HI(joyLY, pec->calF[3] >> 2); + FACTORY_LO( joyLY, pec->calF[ 4] >>2); + FACTORY_MID(joyLY, pec->calF[ 5] >>2); + FACTORY_HI( joyLY, pec->calF[ 3] >>2); - FACTORY_LO(joyRX, pec->calF[7] >> 3); - FACTORY_MID(joyRX, pec->calF[8] >> 3); - FACTORY_HI(joyRX, pec->calF[6] >> 3); + FACTORY_LO( joyRX, pec->calF[ 7] >>3); + FACTORY_MID(joyRX, pec->calF[ 8] >>3); + FACTORY_HI( joyRX, pec->calF[ 6] >>3); - FACTORY_LO(joyRY, pec->calF[10] >> 3); - FACTORY_MID(joyRY, pec->calF[11] >> 3); - FACTORY_HI(joyRY, pec->calF[9] >> 3); - } - if(c & CAL_TRACK) { // track maximum and minimum values seen - TRACK_LO_HI(trgZL); - TRACK_LO_HI(trgZR); + FACTORY_LO( joyRY, pec->calF[10] >>3); + FACTORY_MID(joyRY, pec->calF[11] >>3); + FACTORY_HI( joyRY, pec->calF[ 9] >>3); + } + if (c & CAL_TRACK) { // track maximum and minimum values seen + TRACK_LO_HI(trgZL); + TRACK_LO_HI(trgZR); - TRACK_LO_HI(joyLX); - TRACK_LO_HI(joyLY); + TRACK_LO_HI(joyLX); + TRACK_LO_HI(joyLY); - TRACK_LO_HI(joyRX); - TRACK_LO_HI(joyRY); - } - if(c & CAL_RANGE) { // perform software calibration step - RANGE_LO_HI(trgZL); - RANGE_LO_HI(trgZR); + TRACK_LO_HI(joyRX); + TRACK_LO_HI(joyRY); + } + if (c & CAL_RANGE) { // perform software calibration step + RANGE_LO_HI(trgZL); + RANGE_LO_HI(trgZR); - RANGE_LO_HI(joyLX); - RANGE_LO_HI(joyLY); + RANGE_LO_HI(joyLX); + RANGE_LO_HI(joyLY); - RANGE_LO_HI(joyRX); - RANGE_LO_HI(joyRY); - } - if(c & CAL_CENTRE) { // reset centre point of joystick - CENTRE(joyLX); - CENTRE(joyLY); + RANGE_LO_HI(joyRX); + RANGE_LO_HI(joyRY); + } + if (c & CAL_CENTRE) { // reset centre point of joystick + CENTRE(joyLX); + CENTRE(joyLY); - CENTRE(joyRX); - CENTRE(joyRY); - } + CENTRE(joyRX); + CENTRE(joyRY); + } } //+============================================================================ ======================================== // bits that are common to both screens // -static void classic_show_(Canvas* const canvas, state_t* const state) { - ecDecClassic_t* d = &state->ec.dec[state->ec.decN].classic; - ecCalClassic_t* js = state->ec.calS.classic; +static +void classic_show_ (Canvas* const canvas, state_t* const state) +{ + ecDecClassic_t* d = &state->ec.dec[state->ec.decN].classic; + ecCalClassic_t* js = state->ec.calS.classic; - static const int dead = 1; // trigger deadzone - const image_t* img = NULL; // trigger image + static const int dead = 1; // trigger deadzone + const image_t* img = NULL; // trigger image - show(canvas, 6, 0, &img_cc_Main, SHOW_SET_BLK); - show(canvas, 62, 53, &img_cc_Cable, SHOW_SET_BLK); + show(canvas, 6, 0, &img_cc_Main , SHOW_SET_BLK); + show(canvas, 62,53, &img_cc_Cable, SHOW_SET_BLK); - // classic triggers - if(d->trgZL >= js[2].trgZL) - img = &img_cc_trg_L4; - else if(d->trgZL <= js[1].trgZL + dead) - img = NULL; - else { - // copied from the joystick calibration code - int lo = js[1].trgZL + dead + 1; - int hi = js[2].trgZL - 1; - int range = hi - lo + 1; - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... + // classic triggers + if (d->trgZL >= js[2].trgZL ) img = &img_cc_trg_L4; + else if (d->trgZL <= js[1].trgZL +dead) img = NULL; + else { + // copied from the joystick calibration code + int lo = js[1].trgZL +dead +1; + int hi = js[2].trgZL -1; + int range = hi -lo +1; + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) + int hi1 = lo +div -1; // (in brevity) + int lo3 = lo +div +div +(rem==2); // ... - if(d->trgZL <= hi1) - img = &img_cc_trg_L1; // zone #1 - else if(d->trgZL >= lo3) - img = &img_cc_trg_L3; // zone #3 - else - img = &img_cc_trg_L2; // zone #2 - } - if(img) show(canvas, 22, 1, img, SHOW_SET_BLK); + if (d->trgZL <= hi1) img = &img_cc_trg_L1 ; // zone #1 + else if (d->trgZL >= lo3) img = &img_cc_trg_L3 ; // zone #3 + else img = &img_cc_trg_L2 ; // zone #2 + } + if (img) show(canvas, 22,1, img, SHOW_SET_BLK) ; - if(d->trgZR >= js[2].trgZR) - img = &img_cc_trg_R4; - else if(d->trgZR <= js[1].trgZR + dead) - img = NULL; - else { - // copied from the joystick calibration code - int lo = js[1].trgZR + dead + 1; - int hi = js[2].trgZR - 1; - int range = hi - lo + 1; - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... + if (d->trgZR >= js[2].trgZR ) img = &img_cc_trg_R4; + else if (d->trgZR <= js[1].trgZR +dead) img = NULL; + else { + // copied from the joystick calibration code + int lo = js[1].trgZR +dead +1; + int hi = js[2].trgZR -1; + int range = hi -lo +1; + int div = range /3; // each division (base amount, eg. 17/3==5) + int rem = range -(div *3); // remainder (ie. range%3) + int hi1 = lo +div -1; // (in brevity) + int lo3 = lo +div +div +(rem==2); // ... - if(d->trgZR <= hi1) - img = &img_cc_trg_R1; // zone #1 - else if(d->trgZR >= lo3) - img = &img_cc_trg_R3; // zone #3 - else - img = &img_cc_trg_R2; // zone #2 - } - if(img) show(canvas, 89, 1, img, SHOW_SET_BLK); + if (d->trgZR <= hi1) img = &img_cc_trg_R1 ; // zone #1 + else if (d->trgZR >= lo3) img = &img_cc_trg_R3 ; // zone #3 + else img = &img_cc_trg_R2 ; // zone #2 + } + if (img) show(canvas, 89,1, img, SHOW_SET_BLK) ; - if(d->padU) show(canvas, 27, 16, &img_cc_pad_UD1, SHOW_ALL); - if(d->padL) show(canvas, 20, 23, &img_cc_pad_LR1, SHOW_ALL); - if(d->padD) show(canvas, 27, 28, &img_cc_pad_UD1, SHOW_ALL); - if(d->padR) show(canvas, 32, 23, &img_cc_pad_LR1, SHOW_ALL); + if (d->padU ) show(canvas, 27,16, &img_cc_pad_UD1, SHOW_ALL) ; + if (d->padL ) show(canvas, 20,23, &img_cc_pad_LR1, SHOW_ALL) ; + if (d->padD ) show(canvas, 27,28, &img_cc_pad_UD1, SHOW_ALL) ; + if (d->padR ) show(canvas, 32,23, &img_cc_pad_LR1, SHOW_ALL) ; - if(d->btnX) show(canvas, 96, 16, &img_cc_btn_X1, SHOW_ALL); - if(d->btnY) show(canvas, 85, 23, &img_cc_btn_Y1, SHOW_ALL); - if(d->btnA) show(canvas, 107, 23, &img_cc_btn_A1, SHOW_ALL); - if(d->btnB) show(canvas, 96, 30, &img_cc_btn_B1, SHOW_ALL); + if (d->btnX ) show(canvas, 96,16, &img_cc_btn_X1, SHOW_ALL) ; + if (d->btnY ) show(canvas, 85,23, &img_cc_btn_Y1, SHOW_ALL) ; + if (d->btnA ) show(canvas, 107,23, &img_cc_btn_A1, SHOW_ALL) ; + if (d->btnB ) show(canvas, 96,30, &img_cc_btn_B1, SHOW_ALL) ; - canvas_set_color(canvas, ColorBlack); - if(d->btnL) canvas_draw_box(canvas, 46, 2, 5, 4); - if(d->btnR) canvas_draw_box(canvas, 77, 2, 5, 4); + canvas_set_color(canvas, ColorBlack); + if (d->btnL ) canvas_draw_box(canvas, 46,2, 5,4) ; + if (d->btnR ) canvas_draw_box(canvas, 77,2, 5,4) ; - if(d->btnM) canvas_draw_box(canvas, 54, 24, 4, 4); - if(d->btnH) canvas_draw_box(canvas, 62, 24, 4, 4); - if(d->btnP) canvas_draw_box(canvas, 70, 24, 4, 4); + if (d->btnM ) canvas_draw_box(canvas, 54,24, 4,4) ; + if (d->btnH ) canvas_draw_box(canvas, 62,24, 4,4) ; + if (d->btnP ) canvas_draw_box(canvas, 70,24, 4,4) ; - // Show joysticks - showJoy( - canvas, - 48, - 42, - js[1].joyLX, - js[2].joyLX, - js[3].joyLX, - js[1].joyLY, - js[2].joyLY, - js[3].joyLY, - d->joyLX, - d->joyLY, - 6); - showJoy( - canvas, - 78, - 42, - js[1].joyRX, - js[2].joyRX, - js[3].joyRX, - js[1].joyRY, - js[2].joyRY, - js[3].joyRY, - d->joyRX, - d->joyRY, - 5); + // Show joysticks + showJoy(canvas, 48,42, js[1].joyLX,js[2].joyLX, js[3].joyLX, + js[1].joyLY,js[2].joyLY, js[3].joyLY, d->joyLX,d->joyLY, 6); + showJoy(canvas, 78,42, js[1].joyRX,js[2].joyRX, js[3].joyRX, + js[1].joyRY,js[2].joyRY, js[3].joyRY, d->joyRX,d->joyRY, 5); - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); + show(canvas, 0,55, &img_key_L, SHOW_SET_BLK); } //+============================================================================ ======================================== -static void classic_showN(Canvas* const canvas, state_t* const state) { - ecCalClassic_t* c = (state->hold) ? - &state->ec.calS.classic[(state->hold < 0) ? 0 : 4] : - (ecCalClassic_t*)(&state->ec.dec[state->ec.decN].classic); //! danger +static +void classic_showN (Canvas* const canvas, state_t* const state) +{ + ecCalClassic_t* c = (state->hold) ? &state->ec.calS.classic[(state->hold < 0) ? 0 : 4] + : (ecCalClassic_t*)(&state->ec.dec[state->ec.decN].classic) ; //! danger - classic_show_(canvas, state); + classic_show_(canvas, state); - showHex(canvas, 0, 0, c->trgZL, 2, 1); // 5bits - showHex(canvas, 113, 0, c->trgZR, 2, 1); // 5bits + showHex(canvas, 0, 0, c->trgZL, 2,1); // 5bits + showHex(canvas, 113, 0, c->trgZR, 2,1); // 5bits - showHex(canvas, 24, 41, c->joyLX, 2, 1); // 6bits - showHex(canvas, 41, 54, c->joyLY, 2, 1); // 6bits + showHex(canvas, 24,41, c->joyLX, 2,1); // 6bits + showHex(canvas, 41,54, c->joyLY, 2,1); // 6bits - showHex(canvas, 88, 41, c->joyRX, 2, 1); // 5bits - showHex(canvas, 71, 54, c->joyRY, 2, 1); // 5bits + showHex(canvas, 88,41, c->joyRX, 2,1); // 5bits + showHex(canvas, 71,54, c->joyRY, 2,1); // 5bits - showPeakHold(state, canvas, state->hold); // peak keys + showPeakHold(state, canvas, state->hold); // peak keys } //+============================================================================ ======================================== -void classic_show(Canvas* const canvas, state_t* const state) { - // Classic controllers have TWO scenes - if(state->scene == SCENE_CLASSIC_N) return classic_showN(canvas, state); +void classic_show (Canvas* const canvas, state_t* const state) +{ + // Classic controllers have TWO scenes + if (state->scene == SCENE_CLASSIC_N) return classic_showN(canvas, state) ; - // Default scene - classic_show_(canvas, state); - show(canvas, 9, 55, &img_key_R, SHOW_SET_BLK); + // Default scene + classic_show_(canvas, state); + show(canvas, 9,55, &img_key_R, SHOW_SET_BLK); - show( - canvas, - 119, - 55, - ((state->calib & CAL_RANGE) && (++state->flash & 8)) ? &img_key_OKi : &img_key_OK, - SHOW_SET_BLK); + show( canvas, 119,55, + ((state->calib & CAL_RANGE) && (++state->flash &8)) ? &img_key_OKi : &img_key_OK, + SHOW_SET_BLK ); } //+============================================================================ ======================================== -static bool classic_keyN(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +static +bool classic_keyN (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - if((msg->input.type == InputTypeShort) && (msg->input.key == InputKeyLeft)) { - sceneSet(state, SCENE_CLASSIC); - used = true; - } + if ((msg->input.type == InputTypeShort) && (msg->input.key == InputKeyLeft)) { + sceneSet(state, SCENE_CLASSIC); + used = true; + } - // Calibration keys - if(!used) used = key_calib(msg, state); + // Calibration keys + if (!used) used = key_calib(msg, state) ; - return used; + return used; } //+============================================================================ ======================================== -bool classic_key(const eventMsg_t* const msg, state_t* const state) { - // Classic controllers have TWO scenes - if(state->scene == SCENE_CLASSIC_N) return classic_keyN(msg, state); +bool classic_key (const eventMsg_t* const msg, state_t* const state) +{ + // Classic controllers have TWO scenes + if (state->scene == SCENE_CLASSIC_N) return classic_keyN(msg, state) ; - // Default scene - int used = false; // assume key is NOT-handled + // Default scene + int used = false; // assume key is NOT-handled - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# input.type) { + case InputTypeShort: //# input.key) { + case InputKeyUp: //# -#include +#include +#include //----------------------------------------------------------------------------- ---------------------------------------- // Classic Controller ... Classic Controller Pro is electronically the same @@ -25,55 +25,60 @@ //----------------------------------------------------------------------------- ---------------------------------------- // Controllers which have calibration must have their calibratable controls here //! Is there a better way to get the start of the decode struct to match the calibration struct ? -#define CLASSIC_ANALOGUE \ - uint8_t trgZL, trgZR; /* ANA{l, l} lowercase=trigger 5bit values {5} */ \ - uint8_t joyLX, joyLY; /* ANA{x, y} left=lowercase 6bit values {6}<-- */ \ - uint8_t joyRX, joyRY; /* ANA{X, Y} 5bit values {5} */ +#define CLASSIC_ANALOGUE \ + uint8_t trgZL, trgZR; /* ANA{l, l} lowercase=trigger 5bit values {5} */ \ + uint8_t joyLX, joyLY; /* ANA{x, y} left=lowercase 6bit values {6}<-- */ \ + uint8_t joyRX, joyRY; /* ANA{X, Y} 5bit values {5} */ //----------------------------------------------------------------------------- // Calibratable controls // -typedef struct ecCalClassic { - CLASSIC_ANALOGUE -} ecCalClassic_t; +typedef + struct ecCalClassic + { + CLASSIC_ANALOGUE + } +ecCalClassic_t; //----------------------------------------------------------------------------- // All controls // -typedef struct ecDecClassic { - CLASSIC_ANALOGUE // MUST be first +typedef + struct ecDecClassic + { + CLASSIC_ANALOGUE // MUST be first - // Digital controls - bool btnZL, - btnZR; // BTN{l, l} + // Digital controls + bool btnZL, btnZR; // BTN{l, l} - bool btnL, btnR; // BTN{L, R} upperrcase=shoulder + bool btnL, btnR; // BTN{L, R} upperrcase=shoulder - bool padU, padL, padD, padR; // BTN{W, A, S, D} + bool padU, padL, padD, padR; // BTN{W, A, S, D} - bool btnM, btnH, btnP; // BTN{-, h, +} + bool btnM, btnH, btnP; // BTN{-, h, +} - bool btnX, btnY; // BTN{x, y} - bool btnA, btnB; // BTN{a, b} + bool btnX, btnY; // BTN{x, y} + bool btnA, btnB; // BTN{a, b} -} ecDecClassic_t; + } +ecDecClassic_t; #undef CLASSIC_ANALOGUE //============================================================================= ======================================== // Function prototypes // -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; +#include // Canvas +typedef struct wiiEC wiiEC_t ; +typedef enum ecCalib ecCalib_t ; +typedef struct state state_t ; +typedef struct eventMsg eventMsg_t ; -void classic_decode(wiiEC_t* const pec); -void classic_msg(wiiEC_t* const pec, FuriMessageQueue* const queue); -void classic_calib(wiiEC_t* const pec, ecCalib_t c); +void classic_decode (wiiEC_t* const pec) ; +void classic_msg (wiiEC_t* const pec, FuriMessageQueue* const queue) ; +void classic_calib (wiiEC_t* const pec, ecCalib_t c) ; -void classic_show(Canvas* const canvas, state_t* const state); -bool classic_key(const eventMsg_t* const msg, state_t* const state); +void classic_show (Canvas* const canvas, state_t* const state) ; +bool classic_key (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_EC_CLASSIC_H_ diff --git a/applications/plugins/wii_ec_anal/wii_ec_macros.h b/applications/plugins/wii_ec_anal/wii_ec_macros.h index 00ab9825b..33daf944d 100644 --- a/applications/plugins/wii_ec_anal/wii_ec_macros.h +++ b/applications/plugins/wii_ec_anal/wii_ec_macros.h @@ -9,53 +9,49 @@ // //if (furi_message_queue_get_count(queue) > 18) WARN("queue high %d", furi_message_queue_get_count(queue)); -#define MSGQ(lbl) \ - do { \ - msg.wiiEc.in = lbl; \ - furi_message_queue_put(queue, &msg, 0); \ - } while(0) +#define MSGQ(lbl) do { \ + msg.wiiEc.in = lbl; \ + furi_message_queue_put(queue, &msg, 0); \ +}while(0) + // A 'standard' "button" is an independent SPST switch // Eg. Nunchuck 'Z' button // The "value" will always be 0 -#define BUTTON(btn, lbl) \ - do { \ - if(new->btn != old->btn) { \ - msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ - msg.wiiEc.val = 0; \ - MSGQ(lbl); \ - } \ - } while(0) +#define BUTTON(btn,lbl) do { \ + if (new->btn != old->btn) { \ + msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ + msg.wiiEc.val = 0; \ + MSGQ(lbl); \ + } \ +}while(0) // An "analogue button" is an SPST coupled with an ananlogue 'switch' // Eg. The "bottom out" switches on the triggers of the classic controller // The "value" will be the value of the associated analogue controller -#define ANABTN(btn, ana, lbl) \ - do { \ - if(new->btn != old->btn) { \ - msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ - msg.wiiEc.val = new->ana; \ - MSGQ(lbl); \ - } \ - } while(0) +#define ANABTN(btn,ana,lbl) do { \ + if (new->btn != old->btn) { \ + msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ + msg.wiiEc.val = new->ana; \ + MSGQ(lbl); \ + } \ +}while(0) -#define ANALOG(ana, lbl) \ - do { \ - if(new->ana != old->ana) { \ - msg.wiiEc.type = WIIEC_ANALOG; \ - msg.wiiEc.val = new->ana; \ - MSGQ(lbl); \ - } \ - } while(0) +#define ANALOG(ana,lbl) do { \ + if (new->ana != old->ana) { \ + msg.wiiEc.type = WIIEC_ANALOG; \ + msg.wiiEc.val = new->ana; \ + MSGQ(lbl); \ + } \ +}while(0) -#define ACCEL(acc, lbl) \ - do { \ - if(new->acc != old->acc) { \ - msg.wiiEc.type = WIIEC_ACCEL; \ - msg.wiiEc.val = new->acc; \ - MSGQ(lbl); \ - } \ - } while(0) +#define ACCEL(acc,lbl) do { \ + if (new->acc != old->acc) { \ + msg.wiiEc.type = WIIEC_ACCEL; \ + msg.wiiEc.val = new->acc; \ + MSGQ(lbl); \ + } \ +}while(0) //----------------------------------------------------------------------------- ---------------------------------------- // CALIBRATION MACROS @@ -65,74 +61,24 @@ // // ... v=variable, n=number // -#define FACTORY_LO(v, n) \ - do { \ - (dst[1].v) = n; \ - } while(0) -#define FACTORY_MID(v, n) \ - do { \ - (dst[2].v) = n; \ - } while(0) -#define FACTORY_HI(v, n) \ - do { \ - (dst[3].v) = n; \ - } while(0) +#define FACTORY_LO(v,n) do{ (dst[1]. v) = n; }while(0) +#define FACTORY_MID(v,n) do{ (dst[2]. v) = n; }while(0) +#define FACTORY_HI(v,n) do{ (dst[3]. v) = n; }while(0) -#define TRACK_LO(v) \ - do { \ - if((src->v) < (dst[0].v)) (dst[0].v) = (src->v); \ - } while(0) -#define TRACK_HI(v) \ - do { \ - if((src->v) > (dst[4].v)) (dst[4].v) = (src->v); \ - } while(0) -#define TRACK_LO_HI(v) \ - do { \ - TRACK_LO(v); \ - TRACK_HI(v); \ - } while(0) +#define TRACK_LO(v) do{ if ((src-> v) < (dst[0]. v)) (dst[0]. v) = (src-> v); }while(0) +#define TRACK_HI(v) do{ if ((src-> v) > (dst[4]. v)) (dst[4]. v) = (src-> v); }while(0) +#define TRACK_LO_HI(v) do{ TRACK_LO(v); TRACK_HI(v); }while(0) -#define RESET_LO(v, b) \ - do { \ - (dst[0].v) = (dst[1].v) = ((1 << (b)) - 1); \ - } while(0) -#define RESET_HI(v) \ - do { \ - (dst[4].v) = (dst[3].v) = 0; \ - } while(0) -#define RESET_MID(v) \ - do { \ - (dst[2].v) = (src->v); \ - } while(0) -#define RESET_LO_HI(v, b) \ - do { \ - RESET_LO(v, b); \ - RESET_HI(v); \ - } while(0) -#define RESET_LO_MID_HI(v, b) \ - do { \ - RESET_LO(v, b); \ - RESET_MID(v); \ - RESET_HI(v); \ - } while(0) +#define RESET_LO(v,b) do{ (dst[0]. v) = (dst[1]. v) = ((1<<(b))-1); }while(0) +#define RESET_HI(v) do{ (dst[4]. v) = (dst[3]. v) = 0; }while(0) +#define RESET_MID(v) do{ (dst[2]. v) = (src-> v); }while(0) +#define RESET_LO_HI(v,b) do{ RESET_LO(v,b); RESET_HI(v); }while(0) +#define RESET_LO_MID_HI(v,b) do{ RESET_LO(v,b); RESET_MID(v); RESET_HI(v); }while(0) -#define RANGE_LO(v) \ - do { \ - if((src->v) < (dst[1].v)) (dst[1].v) = (src->v); \ - } while(0) -#define RANGE_HI(v) \ - do { \ - if((src->v) > (dst[3].v)) (dst[3].v) = (src->v); \ - } while(0) -#define RANGE_LO_HI(v) \ - do { \ - RANGE_LO(v); \ - RANGE_HI(v); \ - } while(0) +#define RANGE_LO(v) do{ if ((src-> v) < (dst[1]. v)) (dst[1]. v) = (src-> v); }while(0) +#define RANGE_HI(v) do{ if ((src-> v) > (dst[3]. v)) (dst[3]. v) = (src-> v); }while(0) +#define RANGE_LO_HI(v) do{ RANGE_LO(v); RANGE_HI(v); }while(0) -#define CENTRE(v) \ - do { \ - (dst[2].v) = (src->v); \ - } while(0) +#define CENTRE(v) do{ (dst[2]. v) = (src-> v); } while(0) #endif //WII_EC_MACROS_H_ diff --git a/applications/plugins/wii_ec_anal/wii_ec_nunchuck.c b/applications/plugins/wii_ec_anal/wii_ec_nunchuck.c index d88d535b6..81c32a243 100644 --- a/applications/plugins/wii_ec_anal/wii_ec_nunchuck.c +++ b/applications/plugins/wii_ec_anal/wii_ec_nunchuck.c @@ -1,144 +1,142 @@ -#include -#include // Core API +#include +#include // Core API -#include "wii_anal.h" -#include "wii_i2c.h" -#include "bc_logging.h" +#include "wii_anal.h" +#include "wii_i2c.h" +#include "bc_logging.h" -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings +#include "gfx/images.h" // Images +#include "wii_anal_lcd.h" // Drawing functions +#include "wii_anal_keys.h" // key mappings // ** If you want to see what this source code looks like with all the MACROs expanded // ** grep -v '#include ' wii_ec_nunchuck.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" +# include "wii_ec_macros.h" //+============================================================================ ======================================== // Standard Nunchuck : 2 buttons, 1 analogue joystick, 1 3-axis accelerometer -// -void nunchuck_decode(wiiEC_t* const pec) { - ecDecNunchuck_t* p = &pec->dec[(pec->decN = !pec->decN)].nunchuck; - uint8_t* joy = pec->joy; +// +void nunchuck_decode (wiiEC_t* const pec) +{ + ecDecNunchuck_t* p = &pec->dec[(pec->decN = !pec->decN)].nunchuck; + uint8_t* joy = pec->joy; - p->btnC = !(joy[5] & 0x02); // !{1} - p->btnZ = !(joy[5] & 0x01); // !{1} + p->btnC = !(joy[5] & 0x02); // !{1} + p->btnZ = !(joy[5] & 0x01); // !{1} - p->joyX = joy[0]; // {8} - p->joyY = joy[1]; // {8} + p->joyX = joy[0]; // {8} + p->joyY = joy[1]; // {8} - p->accX = ((uint16_t)joy[2] << 2) | ((joy[5] >> 2) & 0x03); // {10} - p->accY = ((uint16_t)joy[3] << 2) | ((joy[5] >> 4) & 0x03); // {10} - p->accZ = ((uint16_t)joy[4] << 2) | ((joy[5] >> 6) & 0x03); // {10} + p->accX = ((uint16_t)joy[2] << 2) | ((joy[5] >>2) & 0x03); // {10} + p->accY = ((uint16_t)joy[3] << 2) | ((joy[5] >>4) & 0x03); // {10} + p->accZ = ((uint16_t)joy[4] << 2) | ((joy[5] >>6) & 0x03); // {10} - DEBUG( - ">%d> C:%c, Z:%c, Joy{x:%02X, y:%02X}, Acc{x:%03X, y:%03X, z:%03X}", - pec->decN, - (p->btnC ? '#' : '.'), - (p->btnZ ? '#' : '.'), - p->joyX, - p->joyY, - p->accX, - p->accY, - p->accZ); + DEBUG(">%d> C:%c, Z:%c, Joy{x:%02X, y:%02X}, Acc{x:%03X, y:%03X, z:%03X}", pec->decN, + (p->btnC ? '#' : '.'), (p->btnZ ? '#' : '.'), + p->joyX, p->joyY, p->accX, p->accY, p->accZ + ); } //+============================================================================ ======================================== // Give each button a unique character identifier // -void nunchuck_msg(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ecDecNunchuck_t* new = &pec->dec[pec->decN].nunchuck; - ecDecNunchuck_t* old = &pec->dec[!pec->decN].nunchuck; +void nunchuck_msg (wiiEC_t* const pec, FuriMessageQueue* const queue) +{ + ecDecNunchuck_t* new = &pec->dec[pec->decN].nunchuck; + ecDecNunchuck_t* old = &pec->dec[!pec->decN].nunchuck; - eventMsg_t msg = { - .id = EVID_WIIEC, - .wiiEc = { - .type = WIIEC_NONE, - .in = ' ', - .val = 0, - }}; + eventMsg_t msg = { + .id = EVID_WIIEC, + .wiiEc = { + .type = WIIEC_NONE, + .in = ' ', + .val = 0, + } + }; - BUTTON(btnC, 'c'); - BUTTON(btnZ, 'z'); + BUTTON(btnC, 'c'); + BUTTON(btnZ, 'z'); - ANALOG(joyX, 'x'); - ANALOG(joyY, 'y'); + ANALOG(joyX, 'x'); + ANALOG(joyY, 'y'); - ACCEL(accX, 'x'); - ACCEL(accY, 'y'); - ACCEL(accZ, 'z'); + ACCEL(accX, 'x'); + ACCEL(accY, 'y'); + ACCEL(accZ, 'z'); } //+============================================================================ ======================================== // https://www.hackster.io/infusion/using-a-wii-nunchuk-with-arduino-597254#toc-5--read-actual-calibration-data-from-the-device-14 // -void nunchuck_calib(wiiEC_t* const pec, ecCalib_t c) { - ecDecNunchuck_t* src = &pec->dec[pec->decN].nunchuck; // from input - ecCalNunchuck_t* dst = pec->calS.nunchuck; // to calibration data +void nunchuck_calib (wiiEC_t* const pec, ecCalib_t c) +{ + ecDecNunchuck_t* src = &pec->dec[pec->decN].nunchuck; // from input + ecCalNunchuck_t* dst = pec->calS.nunchuck; // to calibration data - if(c & CAL_RESET) { // initialise ready for software calibration - // LO is set to the MAXIMUM value (so it can be reduced) - // HI is set to ZERO (so it can be increased) - RESET_LO_HI(accX, 10); // 10bit value - RESET_LO_HI(accY, 10); // 10bit value - RESET_LO_HI(accZ, 10); // 10bit value + if (c & CAL_RESET) { // initialise ready for software calibration + // LO is set to the MAXIMUM value (so it can be reduced) + // HI is set to ZERO (so it can be increased) + RESET_LO_HI(accX, 10); // 10bit value + RESET_LO_HI(accY, 10); // 10bit value + RESET_LO_HI(accZ, 10); // 10bit value - RESET_LO_HI(joyX, 8); // 8bit value - RESET_LO_HI(joyY, 8); // 8bit value - } - if(c & CAL_FACTORY) { // (re)set to factory defaults - //! "[4] LSB of Zero value of X,Y,Z axes" ...helpful! - //! ...Well, my test nunchuck has bits set in the bottom 6 bits, so let's guess ;) + RESET_LO_HI(joyX, 8); // 8bit value + RESET_LO_HI(joyY, 8); // 8bit value + } + if (c & CAL_FACTORY) { // (re)set to factory defaults + //! "[4] LSB of Zero value of X,Y,Z axes" ...helpful! + //! ...Well, my test nunchuck has bits set in the bottom 6 bits, so let's guess ;) - // No value available - annecdotal tests suggest 8 is reasonable - FACTORY_LO(accX, 8); - FACTORY_LO(accY, 8); - FACTORY_LO(accZ, 8); + // No value available - annecdotal tests suggest 8 is reasonable + FACTORY_LO( accX, 8); + FACTORY_LO( accY, 8); + FACTORY_LO( accZ, 8); - // @ 0G - FACTORY_MID(accX, ((pec->calF[0] << 2) | ((pec->calF[3] >> 4) & 0x3))); - FACTORY_MID(accY, ((pec->calF[1] << 2) | ((pec->calF[3] >> 2) & 0x3))); - FACTORY_MID(accZ, ((pec->calF[2] << 2) | ((pec->calF[3]) & 0x3))); + // @ 0G + FACTORY_MID( accX, ((pec->calF[0] <<2) | ((pec->calF[3] >>4) &0x3)) ) ; + FACTORY_MID( accY, ((pec->calF[1] <<2) | ((pec->calF[3] >>2) &0x3)) ) ; + FACTORY_MID( accZ, ((pec->calF[2] <<2) | ((pec->calF[3] ) &0x3)) ) ; - // @ 1G - FACTORY_HI(accX, ((pec->calF[4] << 2) | ((pec->calF[7] >> 4) & 0x3))); - FACTORY_HI(accY, ((pec->calF[5] << 2) | ((pec->calF[7] >> 2) & 0x3))); - FACTORY_HI(accZ, ((pec->calF[6] << 2) | ((pec->calF[7]) & 0x3))); + // @ 1G + FACTORY_HI( accX, ((pec->calF[4] <<2) | ((pec->calF[7] >>4) &0x3)) ) ; + FACTORY_HI( accY, ((pec->calF[5] <<2) | ((pec->calF[7] >>2) &0x3)) ) ; + FACTORY_HI( accZ, ((pec->calF[6] <<2) | ((pec->calF[7] ) &0x3)) ) ; - // Joysticks - FACTORY_LO(joyX, pec->calF[9]); - FACTORY_MID(joyX, pec->calF[10]); - FACTORY_HI(joyX, pec->calF[8]); + // Joysticks + FACTORY_LO( joyX, pec->calF[ 9] ) ; + FACTORY_MID(joyX, pec->calF[10] ) ; + FACTORY_HI( joyX, pec->calF[ 8] ) ; - FACTORY_LO(joyY, pec->calF[12]); - FACTORY_MID(joyY, pec->calF[13]); - FACTORY_HI(joyY, pec->calF[11]); - } - if(c & CAL_TRACK) { // track maximum and minimum values seen - TRACK_LO_HI(accX); - TRACK_LO_HI(accY); - TRACK_LO_HI(accZ); + FACTORY_LO( joyY, pec->calF[12] ) ; + FACTORY_MID(joyY, pec->calF[13] ) ; + FACTORY_HI( joyY, pec->calF[11] ) ; + } + if (c & CAL_TRACK) { // track maximum and minimum values seen + TRACK_LO_HI(accX); + TRACK_LO_HI(accY); + TRACK_LO_HI(accZ); - TRACK_LO_HI(joyX); - TRACK_LO_HI(joyY); - } - if(c & CAL_RANGE) { // perform software calibration step - RANGE_LO_HI(accX); - RANGE_LO_HI(accY); - RANGE_LO_HI(accZ); + TRACK_LO_HI(joyX); + TRACK_LO_HI(joyY); + } + if (c & CAL_RANGE) { // perform software calibration step + RANGE_LO_HI(accX); + RANGE_LO_HI(accY); + RANGE_LO_HI(accZ); - if(!(c & CAL_NOTJOY)) { // double negative! - RANGE_LO_HI(joyX); - RANGE_LO_HI(joyY); - } - } - if(c & CAL_CENTRE) { // reset centre point of joystick - CENTRE(accX); - CENTRE(accY); - CENTRE(accZ); + if (!(c & CAL_NOTJOY)) { // double negative! + RANGE_LO_HI(joyX); + RANGE_LO_HI(joyY); + } + } + if (c & CAL_CENTRE) { // reset centre point of joystick + CENTRE(accX); + CENTRE(accY); + CENTRE(accZ); - CENTRE(joyX); - CENTRE(joyY); - } + CENTRE(joyX); + CENTRE(joyY); + } } //============================================================================= ======================================== @@ -154,323 +152,308 @@ void nunchuck_calib(wiiEC_t* const pec, ecCalib_t c) { // // EG. Move left will effect X ; turn left will effect Y & Z // -#define aw 110 // axis width -#define ah 15 // height {0......7......14} -#define am 7 // midpoint { 7 } -#define ar 7 // range {1234567 1234567} +#define aw 110 // axis width +#define ah 15 // height {0......7......14} +#define am 7 // midpoint { 7 } +#define ar 7 // range {1234567 1234567} enum { - ACC_X = 0, - ACC_Y = 1, - ACC_Z = 2, - ACC_CNT = 3, - ACC_1 = ACC_X, // first - ACC_N = ACC_Z, // last + ACC_X = 0, + ACC_Y = 1, + ACC_Z = 2, + ACC_CNT = 3, + ACC_1 = ACC_X, // first + ACC_N = ACC_Z, // last }; //+============================================================================ -static void nunchuck_showAcc(Canvas* const canvas, state_t* const state) { - ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; - ecCalNunchuck_t* lo = &state->ec.calS.nunchuck[1]; - ecCalNunchuck_t* mid = &state->ec.calS.nunchuck[2]; - ecCalNunchuck_t* hi = &state->ec.calS.nunchuck[3]; +static +void nunchuck_showAcc (Canvas* const canvas, state_t* const state) +{ + ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; + ecCalNunchuck_t* lo = &state->ec.calS.nunchuck[1]; + ecCalNunchuck_t* mid = &state->ec.calS.nunchuck[2]; + ecCalNunchuck_t* hi = &state->ec.calS.nunchuck[3]; - int y[ACC_CNT] = {0, 0 + (ah + 4), 0 + ((ah + 4) * 2)}; - int x = 10; + int y[ACC_CNT] = {0, 0+(ah+4), 0+((ah+4)*2)}; + int x = 10; - static uint16_t v[ACC_CNT][aw] = {0}; - // static uint16_t tv[ACC_CNT][aw] = {0}; + static uint16_t v[ACC_CNT][aw] = {0}; +// static uint16_t tv[ACC_CNT][aw] = {0}; - static uint16_t idx = 0; - static uint16_t cnt = aw - 1; + static uint16_t idx = 0; + static uint16_t cnt = aw -1; - // Only record when scanner NOT-paused - if(!state->pause) { - uint16_t dead = (1 << 5); + // Only record when scanner NOT-paused + if (!state->pause) { + uint16_t dead = (1<<5); - // Find axes y-offsets - for(int a = ACC_1; a <= ACC_N; a++) { - uint16_t* dp = NULL; // data value (current reading) - uint16_t* lp = NULL; // lo value - uint16_t* mp = NULL; // mid value - uint16_t* hp = NULL; // hi value - uint16_t* vp = NULL; // value (result) + // Find axes y-offsets + for (int a = ACC_1; a <= ACC_N; a++) { + uint16_t* dp = NULL; // data value (current reading) + uint16_t* lp = NULL; // lo value + uint16_t* mp = NULL; // mid value + uint16_t* hp = NULL; // hi value + uint16_t* vp = NULL; // value (result) - switch(a) { - case ACC_X: - dp = &d->accX; // data (input) - lp = &lo->accX; // low \. - mp = &mid->accX; // mid > calibration - hp = &hi->accX; // high / - vp = &v[ACC_X][idx]; // value (where to store the result) - break; - case ACC_Y: - dp = &d->accY; - lp = &lo->accY; - mp = &mid->accY; - hp = &hi->accY; - vp = &v[ACC_Y][idx]; - break; - case ACC_Z: - dp = &d->accZ; - lp = &lo->accZ; - mp = &mid->accZ; - hp = &hi->accZ; - vp = &v[ACC_Z][idx]; - break; - default: - break; - } + switch (a) { + case ACC_X: + dp = & d->accX; // data (input) + lp = & lo->accX; // low \. + mp = &mid->accX; // mid > calibration + hp = & hi->accX; // high / + vp = &v[ ACC_X][idx]; // value (where to store the result) + break; + case ACC_Y: + dp = & d->accY; + lp = & lo->accY; + mp = &mid->accY; + hp = & hi->accY; + vp = &v[ ACC_Y][idx]; + break; + case ACC_Z: + dp = & d->accZ; + lp = & lo->accZ; + mp = &mid->accZ; + hp = & hi->accZ; + vp = &v[ ACC_Z][idx]; + break; + default: break ; + } - // Again - qv. the joysick calibration: - // This is not the "right way" to do this, it is just "one way" to do it - // ...mid point and extreme zones have a deadzone - // ...the rest is evenly divided by the amount of space on the graph - if((*dp >= (*mp - dead)) && (*dp <= (*mp + dead))) - *vp = ar; - else if(*dp >= (*hp - dead)) - *vp = ah - 1; - else if(*dp <= (*lp + dead)) - *vp = 0; - else if(*dp < *mp) { - uint16_t min = ((*lp + dead) + 1); - uint16_t max = ((*mp - dead) - 1); - float range = (max - min) + 1; - float m = range / (ar - 1); // 6 evenly(/fairly) divided zones - *vp = ((int)((*dp - min) / m)) + 1; + // Again - qv. the joysick calibration: + // This is not the "right way" to do this, it is just "one way" to do it + // ...mid point and extreme zones have a deadzone + // ...the rest is evenly divided by the amount of space on the graph + if ((*dp >= (*mp -dead)) && (*dp <= (*mp +dead))) *vp = ar ; + else if (*dp >= (*hp -dead)) *vp = ah-1 ; + else if (*dp <= (*lp +dead)) *vp = 0 ; + else if (*dp < *mp) { + uint16_t min = ((*lp +dead) +1); + uint16_t max = ((*mp -dead) -1); + float range = (max -min) +1; + float m = range /(ar-1); // 6 evenly(/fairly) divided zones + *vp = ((int)((*dp -min) /m)) +1; - } else { //if (*dp > *mp) - uint16_t min = ((*mp + dead) + 1); - uint16_t max = ((*hp - dead) - 1); - float range = (max - min) + 1; - float m = range / (ar - 1); // 6 evenly(/fairly) divided zones - *vp = ((int)((*dp - min) / m)) + 1 + ar; - } - } + } else {//if (*dp > *mp) + uint16_t min = ((*mp +dead) +1); + uint16_t max = ((*hp -dead) -1); + float range = (max -min) +1; + float m = range /(ar-1); // 6 evenly(/fairly) divided zones + *vp = ((int)((*dp -min) /m)) +1 +ar; + } + } - //! If we decide to offer "export to CSV" - //! I suggest we keep a second array of true-values, rather than do all the maths every time - //! Also - the data will need to me moved to the 'state' table - so a.n.other function can save it off - // tv[ACC_X][idx] = d->accX; - // tv[ACC_Y][idx] = d->accY; - // tv[ACC_Z][idx] = d->accZ; +//! If we decide to offer "export to CSV" +//! I suggest we keep a second array of true-values, rather than do all the maths every time +//! Also - the data will need to me moved to the 'state' table - so a.n.other function can save it off +// tv[ACC_X][idx] = d->accX; +// tv[ACC_Y][idx] = d->accY; +// tv[ACC_Z][idx] = d->accZ; - // Prepare for the next datapoint - if(++idx >= aw) idx = 0; - if(cnt) cnt--; - } + // Prepare for the next datapoint + if (++idx >= aw) idx = 0 ; + if (cnt) cnt-- ; + } - // Auto-pause - if(state->apause && !idx) state->pause = true; + // Auto-pause + if (state->apause && !idx) state->pause = true ; - // *** Draw axes *** - show(canvas, 0, y[ACC_X] + ((ah - img_6x8_X.h) / 2), &img_6x8_X, SHOW_SET_BLK); - show(canvas, 0, y[ACC_Y] + ((ah - img_6x8_Y.h) / 2), &img_6x8_Y, SHOW_SET_BLK); - show(canvas, 0, y[ACC_Z] + ((ah - img_6x8_Z.h) / 2), &img_6x8_Z, SHOW_SET_BLK); + // *** Draw axes *** + show(canvas, 0,y[ACC_X] +((ah -img_6x8_X.h) /2), &img_6x8_X, SHOW_SET_BLK); + show(canvas, 0,y[ACC_Y] +((ah -img_6x8_Y.h) /2), &img_6x8_Y, SHOW_SET_BLK); + show(canvas, 0,y[ACC_Z] +((ah -img_6x8_Z.h) /2), &img_6x8_Z, SHOW_SET_BLK); - canvas_set_color(canvas, ColorBlack); - for(int a = ACC_1; a <= ACC_N; a++) { - canvas_draw_line(canvas, x - 1, y[a], x - 1, y[a] + ah); - canvas_draw_line(canvas, x, y[a] + ah, x + aw - 1, y[a] + ah); + canvas_set_color(canvas, ColorBlack); + for (int a = ACC_1; a <= ACC_N; a++) { + canvas_draw_line(canvas, x-1,y[a] , x -1,y[a]+ah); + canvas_draw_line(canvas, x ,y[a]+ah, x+aw-1,y[a]+ah); - // Mid & Peak lines - for(int i = 1; i < aw; i += 3) { - canvas_draw_dot(canvas, x + i, y[a]); - canvas_draw_dot(canvas, x + i, y[a] + (ah / 2)); - } - } + // Mid & Peak lines + for (int i = 1; i < aw; i += 3) { + canvas_draw_dot(canvas, x+i,y[a]); + canvas_draw_dot(canvas, x+i,y[a] +(ah /2)); + } + } - // Data (wiper display - see notes.txt for scrolling algorithm) - int end = idx ? idx : aw; - for(int a = ACC_1; a <= ACC_N; a++) { - canvas_draw_dot(canvas, x, y[a] + v[a][idx]); - for(int i = 1; i < end; i++) - canvas_draw_line(canvas, x + i, y[a] + v[a][i - 1], x + i, y[a] + v[a][i]); - if(!state->apause) - for(int i = end + 10; i < aw - cnt; i++) - canvas_draw_line(canvas, x + i, y[a] + v[a][i - 1], x + i, y[a] + v[a][i]); - } - // Wipe bar - if(end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); - if(++end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); - if(++end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); + // Data (wiper display - see notes.txt for scrolling algorithm) + int end = idx ? idx : aw; + for (int a = ACC_1; a <= ACC_N; a++) { + canvas_draw_dot(canvas, x,y[a]+v[a][idx]); + for (int i = 1; i < end; i++) + canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); + if (!state->apause) + for (int i = end+10; i < aw -cnt; i++) + canvas_draw_line(canvas, x+i,y[a]+v[a][i-1] , x+i,y[a]+v[a][i]); + } + // Wipe bar + if (end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); + if (++end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); + if (++end < aw) canvas_draw_line(canvas, x+end,y[0], x+end,y[2]+ah-1); - // *** Mode buttons *** - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); // mode key + // *** Mode buttons *** + show(canvas, 0,55, &img_key_L, SHOW_SET_BLK); // mode key - if((state->calib & CAL_RANGE) || state->pause) state->flash++; + if ((state->calib & CAL_RANGE) || state->pause) state->flash++ ; - // -pause- ...yeah, this got a little out of hand! LOL! - if(state->pause || state->apause) { - if(state->pause && state->apause && !idx) { - if(state->flash & 8) { - show(canvas, 108, 56, &img_key_U, SHOW_SET_BLK); - } else { - show(canvas, 108, 56, &img_key_Ui, SHOW_SET_BLK); - canvas_draw_line(canvas, x + aw, y[0], x + aw, y[2] + ah - 1); - } - } else { - show(canvas, 108, 56, &img_key_Ui, SHOW_SET_BLK); - } - } else { - show(canvas, 108, 56, &img_key_U, SHOW_SET_BLK); // pause - } + // -pause- ...yeah, this got a little out of hand! LOL! + if (state->pause || state->apause) { + if (state->pause && state->apause && !idx) { + if (state->flash &8) { + show(canvas, 108,56, &img_key_U, SHOW_SET_BLK); + } else { + show(canvas, 108,56, &img_key_Ui, SHOW_SET_BLK); + canvas_draw_line(canvas, x+aw,y[0], x+aw,y[2]+ah-1); + } + } else { + show(canvas, 108,56, &img_key_Ui, SHOW_SET_BLK); + } + } else { + show(canvas, 108,56, &img_key_U, SHOW_SET_BLK); // pause + } - // -calibration- - if(state->calib & CAL_RANGE) { - show(canvas, 119, 55, (state->flash & 8) ? &img_key_OKi : &img_key_OK, SHOW_SET_BLK); - } else { - show(canvas, 119, 55, &img_key_OK, SHOW_SET_BLK); - } + // -calibration- + if (state->calib & CAL_RANGE) { + show(canvas, 119,55, (state->flash &8) ? &img_key_OKi : &img_key_OK, SHOW_SET_BLK); + } else { + show(canvas, 119,55, &img_key_OK, SHOW_SET_BLK); + } } -#undef aw -#undef ah -#undef am -#undef ar +# undef aw +# undef ah +# undef am +# undef ar //+============================================================================ ======================================== // Default nunchuck screen // -void nunchuck_show(Canvas* const canvas, state_t* const state) { - // Nunchucks have TWO scenes - if(state->scene == SCENE_NUNCHUCK_ACC) return nunchuck_showAcc(canvas, state); +void nunchuck_show (Canvas* const canvas, state_t* const state) +{ + // Nunchucks have TWO scenes + if (state->scene == SCENE_NUNCHUCK_ACC) return nunchuck_showAcc(canvas, state) ; - // Default scene - ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; - ecCalNunchuck_t* c = (state->hold) ? &state->ec.calS.nunchuck[(state->hold < 0) ? 0 : 4] : - (ecCalNunchuck_t*)d; //! danger will robinson! - ecCalNunchuck_t* js = state->ec.calS.nunchuck; + // Default scene + ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; + ecCalNunchuck_t* c = (state->hold) ? &state->ec.calS.nunchuck[(state->hold < 0) ? 0 : 4] + : (ecCalNunchuck_t*)d ; //! danger will robinson! + ecCalNunchuck_t* js = state->ec.calS.nunchuck; - // X, Y, Z - show(canvas, 42, 0, &img_6x8_X, SHOW_SET_BLK); - show(canvas, 73, 0, &img_6x8_Y, SHOW_SET_BLK); - show(canvas, 104, 0, &img_6x8_Z, SHOW_SET_BLK); + // X, Y, Z + show(canvas, 42,0, &img_6x8_X, SHOW_SET_BLK); + show(canvas, 73,0, &img_6x8_Y, SHOW_SET_BLK); + show(canvas, 104,0, &img_6x8_Z, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 0, 14, AlignLeft, AlignTop, "Accel"); - canvas_draw_str_aligned(canvas, 0, 28, AlignLeft, AlignTop, "Joy"); + canvas_draw_str_aligned(canvas, 0,14, AlignLeft, AlignTop, "Accel"); + canvas_draw_str_aligned(canvas, 0,28, AlignLeft, AlignTop, "Joy"); - // accel values - showHex(canvas, 34, 12, c->accX, 3, 2); - showHex(canvas, 65, 12, c->accY, 3, 2); - showHex(canvas, 96, 12, c->accZ, 3, 2); - // Joy values - showHex(canvas, 38, 27, c->joyX, 2, 2); - showHex(canvas, 69, 27, c->joyY, 2, 2); + // accel values + showHex(canvas, 34,12, c->accX, 3,2); + showHex(canvas, 65,12, c->accY, 3,2); + showHex(canvas, 96,12, c->accZ, 3,2); + // Joy values + showHex(canvas, 38,27, c->joyX, 2,2); + showHex(canvas, 69,27, c->joyY, 2,2); - showJoy( - canvas, - 103, - 32, - js[1].joyX, - js[2].joyX, - js[3].joyX, - js[1].joyY, - js[2].joyY, - js[3].joyY, - d->joyX, - d->joyY, - 8); + showJoy(canvas, 103,32, js[1].joyX, js[2].joyX, js[3].joyX, + js[1].joyY, js[2].joyY, js[3].joyY, d->joyX,d->joyY, 8); - // buttons - canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned(canvas, 0, 44, AlignLeft, AlignTop, "Button"); + // buttons + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned(canvas, 0,44, AlignLeft, AlignTop, "Button"); - if(!d->btnC) { - canvas_draw_rframe(canvas, 36, 42, 18, 12, 6); - show(canvas, 42, 44, &img_6x8_C, SHOW_SET_BLK); - } else { - canvas_draw_rbox(canvas, 36, 42, 18, 12, 6); - show(canvas, 42, 44, &img_6x8_C, SHOW_SET_WHT); - canvas_set_color(canvas, ColorBlack); - } + if (!d->btnC) { + canvas_draw_rframe(canvas, 36,42, 18,12, 6); + show(canvas, 42,44, &img_6x8_C, SHOW_SET_BLK); + } else { + canvas_draw_rbox(canvas, 36,42, 18,12, 6); + show(canvas, 42,44, &img_6x8_C, SHOW_SET_WHT); + canvas_set_color(canvas, ColorBlack); + } - if(!d->btnZ) { - canvas_draw_rframe(canvas, 64, 40, 24, 16, 2); - show(canvas, 73, 44, &img_6x8_Z, SHOW_SET_BLK); - } else { - canvas_draw_rbox(canvas, 64, 40, 24, 16, 2); - show(canvas, 73, 44, &img_6x8_Z, SHOW_SET_WHT); - } + if (!d->btnZ) { + canvas_draw_rframe(canvas, 64,40, 24,16, 2); + show(canvas, 73,44, &img_6x8_Z, SHOW_SET_BLK); + } else { + canvas_draw_rbox(canvas, 64,40, 24,16, 2); + show(canvas, 73,44, &img_6x8_Z, SHOW_SET_WHT); + } - // Navigation - showPeakHold(state, canvas, state->hold); // peak keys - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); // mode keys - show(canvas, 9, 55, &img_key_R, SHOW_SET_BLK); + // Navigation + showPeakHold(state, canvas, state->hold); // peak keys + show(canvas, 0,55, &img_key_L, SHOW_SET_BLK); // mode keys + show(canvas, 9,55, &img_key_R, SHOW_SET_BLK); } //+============================================================================ ======================================== -static bool nunchuck_keyAcc(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled +static +bool nunchuck_keyAcc (const eventMsg_t* const msg, state_t* const state) +{ + int used = false; // assume key is NOT-handled - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyDown: //# input.type) { + case InputTypeShort: //# input.key) { + case InputKeyDown: //# pause) - state->pause = false; // Paused? Restart - else - state->apause = !state->apause; // No? toggle auto-pause - used = true; - break; + case InputKeyUp: //# pause) state->pause = false ; // Paused? Restart + else state->apause = !state->apause ; // No? toggle auto-pause + used = true; + break; - case InputKeyLeft: //# calib &= ~CAL_NOTJOY; // DO calibrate joystick in NUNCHUCK mode - used = true; - break; + case InputKeyLeft: //# calib &= ~CAL_NOTJOY; // DO calibrate joystick in NUNCHUCK mode + used = true; + break; - default: - break; //# scene == SCENE_NUNCHUCK_ACC) return nunchuck_keyAcc(msg, state); +bool nunchuck_key (const eventMsg_t* const msg, state_t* const state) +{ + // Nunchucks have TWO scenes + if (state->scene == SCENE_NUNCHUCK_ACC) return nunchuck_keyAcc(msg, state) ; - // Default scene - int used = false; // assume key is NOT-handled + // Default scene + int used = false; // assume key is NOT-handled - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyLeft: //# input.type) { + case InputTypeShort: //# input.key) { + case InputKeyLeft: //# calib |= CAL_NOTJOY; // do NOT calibrate joystick in _ACC mode - used = true; - break; - default: - break; //# calib |= CAL_NOTJOY; // do NOT calibrate joystick in _ACC mode + used = true; + break; + default: break ; //# -#include +#include +#include //----------------------------------------------------------------------------- // Controllers which have calibration must have their calibratable controls here //! Is there a better way to get the start of the decode struct to match the calibration struct ? #define NUNCHUCK_ANALOGUE \ - uint8_t joyX, joyY; \ - uint16_t accX, accY, accZ; + uint8_t joyX, joyY; \ + uint16_t accX, accY, accZ; //----------------------------------------------------------------------------- // Calibratable controls // -typedef struct ecCalNunchuck { - NUNCHUCK_ANALOGUE -} ecCalNunchuck_t; +typedef + struct ecCalNunchuck { + NUNCHUCK_ANALOGUE + } +ecCalNunchuck_t; //----------------------------------------------------------------------------- // All controls // -typedef struct ecDecNunchuck { - NUNCHUCK_ANALOGUE // MUST be first +typedef + struct ecDecNunchuck { + NUNCHUCK_ANALOGUE // MUST be first - // Digital controls - bool btnC, - btnZ; // BTN{c, z} -} ecDecNunchuck_t; + // Digital controls + bool btnC, btnZ; // BTN{c, z} + } +ecDecNunchuck_t; #undef NUNCHUCK_ANALOGUE //============================================================================= // Function prototypes // -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; +#include // Canvas +typedef struct wiiEC wiiEC_t ; +typedef enum ecCalib ecCalib_t ; +typedef struct state state_t ; +typedef struct eventMsg eventMsg_t ; -void nunchuck_decode(wiiEC_t* const pec); -void nunchuck_msg(wiiEC_t* const pec, FuriMessageQueue* const queue); -void nunchuck_calib(wiiEC_t* const pec, ecCalib_t c); +void nunchuck_decode (wiiEC_t* const pec) ; +void nunchuck_msg (wiiEC_t* const pec, FuriMessageQueue* const queue) ; +void nunchuck_calib (wiiEC_t* const pec, ecCalib_t c) ; -void nunchuck_show(Canvas* const canvas, state_t* const state); -bool nunchuck_key(const eventMsg_t* const msg, state_t* const state); +void nunchuck_show (Canvas* const canvas, state_t* const state) ; +bool nunchuck_key (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_EC_NUNCHUCK_H_ diff --git a/applications/plugins/wii_ec_anal/wii_ec_udraw.c b/applications/plugins/wii_ec_anal/wii_ec_udraw.c index 82987b205..babbc92ab 100644 --- a/applications/plugins/wii_ec_anal/wii_ec_udraw.c +++ b/applications/plugins/wii_ec_anal/wii_ec_udraw.c @@ -1,16 +1,16 @@ //! udraw support is NOT written - this is just notes about the init function -#include -#include // Core API +#include +#include // Core API -#include "wii_anal.h" -#include "wii_ec.h" -#include "bc_logging.h" +#include "wii_anal.h" +#include "wii_ec.h" +#include "bc_logging.h" -#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] +#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] // ** If you want to see what this source code looks like with all the MACROs expanded // ** grep -v '#include ' wii_ec_udraw.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" +# include "wii_ec_macros.h" //+============================================================================ ======================================== // https://github.com/madhephaestus/WiiChuck/blob/master/src/Drawsome.cpp#L3 @@ -27,12 +27,13 @@ // read 6 bytes starting from 0x00 (#3) // read 6 bytes starting from 0x00 (#4) // -bool udraw_init(wiiEC_t* const pec) { - ENTER; - bool rv = true; +bool udraw_init (wiiEC_t* const pec) +{ + ENTER; + bool rv = true; - (void)pec; - /* +(void)pec; +/* //! this is the Drawsome code, NOT the uDraw code !! static const uint8_t reg[9] = {0x20, 0x28, 0x30, 0x38, 0x00, 0x00, 0xFB, 0x00, 0x00}; // 0..8 const uint8_t* p = reg; @@ -71,79 +72,74 @@ fail: done: */ - LEAVE; - return rv; + LEAVE; + return rv; } //+============================================================================ ======================================== -bool udraw_key(const eventMsg_t* const msg, state_t* const state) { - (void)state; - bool run = true; +bool udraw_key (const eventMsg_t* const msg, state_t* const state) +{ +(void)state; + bool run = true; - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# ! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease - switch(msg->input.key) { - case InputKeyUp: //# >U [ LONG-UP ] - case InputKeyDown: //# >D [ LONG-DOWN ] - case InputKeyLeft: //# >L [ LONG-LEFT ] - case InputKeyRight: //# >R [ LONG-RIGHT ] - case InputKeyOk: //# >O [ LONG-OK ] - case InputKeyBack: //# >B [ LONG-BACK ] - default: - break; //# >? - } - break; - case InputTypePress: //# +! After debounce - switch(msg->input.key) { - case InputKeyUp: //# +U [ SHORT-UP ] - case InputKeyDown: //# +D [ SHORT-DOWN ] - case InputKeyLeft: //# +L [ SHORT-LEFT ] - case InputKeyRight: //# +R [ SHORT-RIGHT ] - case InputKeyOk: //# +O [ SHORT-OK ] - case InputKeyBack: //# +B [ SHORT-BACK ] - default: - break; //# +? - } - break; - case InputTypeRepeat: //# *! With INPUT_REPEATE_PRESS period after InputTypeLong event - switch(msg->input.key) { - case InputKeyUp: //# *U [ REPEAT-UP ] - case InputKeyDown: //# *D [ REPEAT-DOWN ] - case InputKeyLeft: //# *L [ REPEAT-LEFT ] - case InputKeyRight: //# *R [ REPEAT-RIGHT ] - case InputKeyOk: //# *O [ REPEAT-OK ] - case InputKeyBack: //# *B [ REPEAT-BACK ] - default: - break; //# *? - } - break; - case InputTypeRelease: //# -! After debounce - switch(msg->input.key) { - case InputKeyUp: //# -U [ RELEASE-UP ] - case InputKeyDown: //# -D [ RELEASE-DOWN ] - case InputKeyLeft: //# -L [ RELEASE-LEFT ] - case InputKeyRight: //# -R [ RELEASE-RIGHT ] - case InputKeyOk: //# -O [ RELEASE-OK ] - case InputKeyBack: //# -B [ RELEASE-BACK ] - default: - break; //# -? - } - break; - default: - return true; - } + switch (msg->input.type) { + case InputTypeShort: //# input.key) { + case InputKeyUp: //# ! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease + switch (msg->input.key) { + case InputKeyUp: //# >U [ LONG-UP ] + case InputKeyDown: //# >D [ LONG-DOWN ] + case InputKeyLeft: //# >L [ LONG-LEFT ] + case InputKeyRight: //# >R [ LONG-RIGHT ] + case InputKeyOk: //# >O [ LONG-OK ] + case InputKeyBack: //# >B [ LONG-BACK ] + default: break ; //# >? + } + break; + case InputTypePress: //# +! After debounce + switch (msg->input.key) { + case InputKeyUp: //# +U [ SHORT-UP ] + case InputKeyDown: //# +D [ SHORT-DOWN ] + case InputKeyLeft: //# +L [ SHORT-LEFT ] + case InputKeyRight: //# +R [ SHORT-RIGHT ] + case InputKeyOk: //# +O [ SHORT-OK ] + case InputKeyBack: //# +B [ SHORT-BACK ] + default: break ; //# +? + } + break; + case InputTypeRepeat: //# *! With INPUT_REPEATE_PRESS period after InputTypeLong event + switch (msg->input.key) { + case InputKeyUp: //# *U [ REPEAT-UP ] + case InputKeyDown: //# *D [ REPEAT-DOWN ] + case InputKeyLeft: //# *L [ REPEAT-LEFT ] + case InputKeyRight: //# *R [ REPEAT-RIGHT ] + case InputKeyOk: //# *O [ REPEAT-OK ] + case InputKeyBack: //# *B [ REPEAT-BACK ] + default: break ; //# *? + } + break; + case InputTypeRelease: //# -! After debounce + switch (msg->input.key) { + case InputKeyUp: //# -U [ RELEASE-UP ] + case InputKeyDown: //# -D [ RELEASE-DOWN ] + case InputKeyLeft: //# -L [ RELEASE-LEFT ] + case InputKeyRight: //# -R [ RELEASE-RIGHT ] + case InputKeyOk: //# -O [ RELEASE-OK ] + case InputKeyBack: //# -B [ RELEASE-BACK ] + default: break ; //# -? + } + break; + default: return true ; + } - return run; + return run; } diff --git a/applications/plugins/wii_ec_anal/wii_ec_udraw.h b/applications/plugins/wii_ec_anal/wii_ec_udraw.h index 9283fd95d..1721894e5 100644 --- a/applications/plugins/wii_ec_anal/wii_ec_udraw.h +++ b/applications/plugins/wii_ec_anal/wii_ec_udraw.h @@ -1,18 +1,18 @@ -#ifndef WII_EC_UDRAW_H_ -#define WII_EC_UDRAW_H_ +#ifndef WII_EC_UDRAW_H_ +#define WII_EC_UDRAW_H_ -#include -#include +#include +#include //============================================================================= ======================================= // Function prototypes // -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; +typedef struct wiiEC wiiEC_t ; +typedef enum ecCalib ecCalib_t ; +typedef struct eventMsg eventMsg_t ; +typedef struct state state_t ; -bool udraw_init(wiiEC_t* const pec); -bool udraw_key(const eventMsg_t* const msg, state_t* const state); +bool udraw_init (wiiEC_t* const pec) ; +bool udraw_key (const eventMsg_t* const msg, state_t* const state) ; #endif //WII_EC_UDRAW_H_ diff --git a/applications/plugins/wii_ec_anal/wii_i2c.c b/applications/plugins/wii_ec_anal/wii_i2c.c index f5d6840d9..90fe22163 100644 --- a/applications/plugins/wii_ec_anal/wii_i2c.c +++ b/applications/plugins/wii_ec_anal/wii_i2c.c @@ -17,98 +17,103 @@ // 0xFA..0xFF ( 6 bytes) ... [r] Perhipheral ID //----------------------------------------------------------------------------- ---------------------------------------- -#include -#include -#include +#include +#include +#include -#include -#include -#include +#include +#include +#include -#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] +#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] -#include "wii_anal.h" -#include "wii_i2c.h" -#include "wii_ec.h" +#include "wii_anal.h" +#include "wii_i2c.h" +#include "wii_ec.h" -#include "bc_logging.h" +#include "bc_logging.h" //----------------------------------------------------------------------------- ---------------------------------------- // Wii Extension Controller i2c Bus address -static const uint8_t ec_i2cAddr = 0x52; +static const uint8_t ec_i2cAddr = 0x52; // Initialise for UNencrypted comms -static const uint8_t regInit1 = 0xF0; -static const uint8_t regInit2 = 0xFB; -static const uint8_t cmdInit1[] = {regInit1, 0x55}; -static const uint8_t cmdInit2[] = {regInit2, 0x00}; +static const uint8_t regInit1 = 0xF0; +static const uint8_t regInit2 = 0xFB; +static const uint8_t cmdInit1[] = {regInit1, 0x55}; +static const uint8_t cmdInit2[] = {regInit2, 0x00}; // Initialise for ENcrypted comms -static const uint8_t regInitEnc = 0x40; -static const uint8_t cmdInitEnc[] = {regInitEnc, 0x00}; +static const uint8_t regInitEnc = 0x40; +static const uint8_t cmdInitEnc[] = {regInitEnc, 0x00}; // Crypto key (PSK), base register : {0x40..0x4F}[2][8] -static const uint8_t regEnc = 0x40; // ENC_LEN +static const uint8_t regEnc = 0x40; // ENC_LEN // Controller State data, base register : {0x00..0x05}[6] -static const uint8_t regJoy = 0x00; // JOY_LEN +static const uint8_t regJoy = 0x00; // JOY_LEN // Calibration data, base register : {0x20..0x2F}[16] -static const uint8_t regCal = 0x20; // CAL_LEN +static const uint8_t regCal = 0x20; // CAL_LEN // Controller ID, base register : {0xFA..0xFF}[6] -static const uint8_t regPid = 0xFA; // PID_LEN +static const uint8_t regPid = 0xFA; // PID_LEN //+============================================================================ ======================================== // Hexdump a buffer to the logfile // #if LOG_LEVEL >= 4 // INFO -static void dump(const uint8_t* buf, const unsigned int len, const char* id) { - // snprintf() would be useful! - char s[128] = {0}; - char* p = NULL; +static +void dump (const uint8_t* buf, const unsigned int len, const char* id) +{ + // snprintf() would be useful! + char s[128] = {0}; + char* p = NULL; - strcpy(s, id); - p = s + strlen(s); - *p++ = ':'; - *p++ = ' '; - *p++ = '{'; + strcpy(s, id); + p = s +strlen(s); + *p++ = ':'; + *p++ = ' '; + *p++ = '{'; - for(unsigned int i = 0; i < len; i++) { - uint8_t hi = (buf[i] & 0xF0) >> 4; - uint8_t lo = (buf[i] & 0x0F); + for (unsigned int i = 0; i < len; i++) { + uint8_t hi = (buf[i] &0xF0) >>4; + uint8_t lo = (buf[i] &0x0F); - hi = hi + ((hi > 9) ? ('A' - 10) : '0'); - lo = lo + ((lo > 9) ? ('A' - 10) : '0'); + hi = hi + ((hi > 9) ? ('A' -10) : '0'); + lo = lo + ((lo > 9) ? ('A' -10) : '0'); - *p++ = (char)hi; - *p++ = (char)lo; - *p++ = ','; - } - *p = '\0'; - *--p = '}'; - INFO(s); + *p++ = (char)hi; + *p++ = (char)lo; + *p++ = ','; + } + *p = '\0'; + *--p = '}'; + INFO(s); } #else -#define dump(...) +# define dump(...) #endif //+============================================================================ ======================================== // //! -W-A-R-N-I-N-G- : THIS ENCRYPTION CODE SHOULD NEVER BE REQUIRED ... AS SUCH, I'VE NEVER TESTED IT // -static void decrypt(uint8_t* buf, const uint8_t* encKey, const uint8_t reg, unsigned int len) { -#if 1 // Use standard algorithm - // decrypted_byte = (encrypted_byte XOR encKey[1][address%8]) + encKey[2][address%8] - for(uint8_t* p = buf; p < buf + len; p++) - *p = (*p ^ encKey[(reg + (p - buf)) % 8]) + encKey[8 + ((reg + (p - buf)) % 8)]; +static +void decrypt (uint8_t* buf, const uint8_t* encKey, const uint8_t reg, unsigned int len) +{ +#if 1 // Use standard algorithm + // decrypted_byte = (encrypted_byte XOR encKey[1][address%8]) + encKey[2][address%8] + for (uint8_t* p = buf; p < buf+len; p++) + *p = (*p ^ encKey[(reg +(p -buf)) %8]) + encKey[8 +((reg +(p -buf)) %8)]; -#else //! This is (I think) a shortcut for an all-zero key [not tested] - (void)encKey; - (void)reg; - for(uint8_t* p = buf; p < buf + len; p++) *p = (*p ^ 0x17) + 0x17; +#else //! This is (I think) a shortcut for an all-zero key [not tested] + (void)encKey; + (void)reg; + for (uint8_t* p = buf; p < buf+len; p++) + *p = (*p ^ 0x17) + 0x17; #endif } @@ -118,38 +123,38 @@ static void decrypt(uint8_t* buf, const uint8_t* encKey, const uint8_t reg, unsi // // Returns: {0:OK, >0:Error} // -int ecRead(wiiEC_t* pec) { - ENTER; - int rv = 0; // assume success +int ecRead (wiiEC_t* pec) +{ + ENTER; + int rv = 0; // assume success - if(!pec->init) { - WARN("%s : device not initialised", __func__); - rv = 1; - goto bail; - } + if (!pec->init) { + WARN("%s : device not initialised", __func__); + rv = 1; + goto bail; + } - if(!furi_hal_i2c_is_device_ready(i2cBus, i2cAddr, i2cTimeout)) { - INFO("%s : device disconnected", __func__); - pec->init = false; - rv = 2; - goto bail; - } + if (!furi_hal_i2c_is_device_ready(i2cBus,i2cAddr, i2cTimeout)) { + INFO("%s : device disconnected", __func__); + pec->init = false; + rv = 2; + goto bail; + } - if(!furi_hal_i2c_trxd( - i2cBus, i2cAddr, ®Joy, 1, pec->joy, JOY_LEN, i2cTimeout, i2cReadWait)) { - ERROR("%s : trxd fail", __func__); - rv = 3; - goto bail; - } + if (!furi_hal_i2c_trxd(i2cBus,i2cAddr, ®Joy,1, pec->joy,JOY_LEN, i2cTimeout,i2cReadWait)) { + ERROR("%s : trxd fail", __func__); + rv = 3; + goto bail; + } - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); + if (pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN) ; - // Decode the readings (according to Controller type) - ecDecode(pec); + // Decode the readings (according to Controller type) + ecDecode(pec); bail: - LEAVE; - return rv; + LEAVE; + return rv; } //+============================================================================ ======================================== @@ -157,145 +162,148 @@ bail: // //! To disable encryption, pass a NULL encryption key <-- this is currently ALWAYS the case // -bool ecInit(wiiEC_t* pec, const uint8_t* encKey) { - ENTER; +bool ecInit (wiiEC_t* pec, const uint8_t* encKey) +{ + ENTER; - bool rv = false; // assume failure + bool rv = false; // assume failure -#if 0 //! i2c workaround +#if 0 //! i2c workaround //! I think this is done during OS startup - long before the plugin starts furi_hal_i2c_init(); #endif -#if 0 //! i2c workaround +#if 0 //! i2c workaround // May become relevant when the i2c issues are resolved // Take control of the i2c bus [which returns void !?] // --> firmware/targets/f7/furi_hal/furi_hal_i2c.c furi_hal_i2c_acquire(i2cBus); #endif - pec->init = false; // assume failure + pec->init = false; // assume failure - // === See if the device is alive === - if(!furi_hal_i2c_is_device_ready(i2cBus, i2cAddr, i2cTimeout)) { - TRACE("%s : waiting for device", __func__); - goto bail; - } - INFO("%s : device connected", __func__); + // === See if the device is alive === + if (!furi_hal_i2c_is_device_ready(i2cBus,i2cAddr, i2cTimeout)) { + TRACE("%s : waiting for device", __func__); + goto bail; + } + INFO("%s : device connected", __func__); - // === Initialise the device === - pec->init = false; // This goes true AFTER the (optional) controller-specific init code + // === Initialise the device === + pec->init = false; // This goes true AFTER the (optional) controller-specific init code - // === Start the Extension Controller === - if(encKey) { //! start in encrypted mode + // === Start the Extension Controller === + if (encKey) { //! start in encrypted mode - //! todo - should this happen here, or AFTER we've got the ID ? + //! todo - should this happen here, or AFTER we've got the ID ? - } else { - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInit1, sizeof(cmdInit1), i2cTimeout)) { - ERROR("%s : init fail (dec1)", __func__); - goto bail; - } - TRACE("%s : init OK1", __func__); + } else { - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInit2, sizeof(cmdInit2), i2cTimeout)) { - ERROR("%s : init fail (dec2)", __func__); - goto bail; - } - TRACE("%s : init OK2", __func__); - } + if ( !furi_hal_i2c_tx(i2cBus,i2cAddr, cmdInit1,sizeof(cmdInit1), i2cTimeout) ) { + ERROR("%s : init fail (dec1)", __func__); + goto bail; + } + TRACE("%s : init OK1", __func__); - // === Retrieve the Extension Controller ID === - if(!furi_hal_i2c_trx(i2cBus, i2cAddr, ®Pid, 1, pec->pid, PID_LEN, i2cTimeout)) { - ERROR("%s : T(R)x fail (pid)", __func__); - goto bail; - } - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); - dump(pec->pid, PID_LEN, "pid"); // debug INFO + if ( !furi_hal_i2c_tx(i2cBus,i2cAddr, cmdInit2,sizeof(cmdInit2), i2cTimeout) ) { + ERROR("%s : init fail (dec2)", __func__); + goto bail; + } + TRACE("%s : init OK2", __func__); + } - // Find the StringID in the lookup table - for(pec->pidx = PID_FIRST; pec->pidx < PID_ERROR; pec->pidx++) - if(memcmp(pec->pid, ecId[pec->pidx].id, PID_LEN) == 0) break; - if(pec->pidx == PID_ERROR) pec->pidx = PID_UNKNOWN; - pec->sid = ecId[pec->pidx].name; - INFO("sid: %s", pec->sid); + // === Retrieve the Extension Controller ID === + if (!furi_hal_i2c_trx(i2cBus,i2cAddr, ®Pid,1, pec->pid,PID_LEN, i2cTimeout)) { + ERROR("%s : T(R)x fail (pid)", __func__); + goto bail; + } + if (pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); + dump(pec->pid, PID_LEN, "pid"); // debug INFO - // === (optionally) Enable encryption === - if(!encKey) { - pec->encrypt = false; + // Find the StringID in the lookup table + for (pec->pidx = PID_FIRST; pec->pidx < PID_ERROR; pec->pidx++) + if (memcmp(pec->pid, ecId[pec->pidx].id, PID_LEN) == 0) break ; + if (pec->pidx == PID_ERROR) pec->pidx = PID_UNKNOWN ; + pec->sid = ecId[pec->pidx].name; + INFO("sid: %s", pec->sid); - } else { // Controller WILL encrypt ALL tranmissions - //! this encryption code fails - should it be done earlier? - //! as it is probably never of any use, I'm kinda loathed to spend time on it - //! https://github.com/madhephaestus/WiiChuck/blob/master/src/Accessory.cpp#L138 - uint8_t encTx[1 + ENC_LEN] = {0}; - uint8_t* ep = encTx; + // === (optionally) Enable encryption === + if (!encKey) { + pec->encrypt = false; - pec->encrypt = true; + } else { // Controller WILL encrypt ALL tranmissions +//! this encryption code fails - should it be done earlier? +//! as it is probably never of any use, I'm kinda loathed to spend time on it +//! https://github.com/madhephaestus/WiiChuck/blob/master/src/Accessory.cpp#L138 + uint8_t encTx[1+ENC_LEN] = {0}; + uint8_t* ep = encTx; - // ** Start the Controller in ENcrytped mode - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInitEnc, sizeof(cmdInitEnc), i2cTimeout)) { - ERROR("%s : init fail (enc)", __func__); - goto bail; - } + pec->encrypt = true; - // Copy the (symmetric) encryption key to the controller state table - if(pec->encKey != encKey) memcpy(pec->encKey, encKey, ENC_LEN); + // ** Start the Controller in ENcrytped mode + if ( !furi_hal_i2c_tx(i2cBus,i2cAddr, cmdInitEnc,sizeof(cmdInitEnc), i2cTimeout) ) { + ERROR("%s : init fail (enc)", __func__); + goto bail; + } - // Build the encryption key packet - *ep++ = regEnc; - memcpy(ep, pec->encKey, ENC_LEN); + // Copy the (symmetric) encryption key to the controller state table + if (pec->encKey != encKey) + memcpy(pec->encKey, encKey, ENC_LEN); - // ** Send encryption key (PSK) - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, encTx, (1 + ENC_LEN), i2cTimeout)) { - ERROR("%s : key fail", __func__); - goto bail; - } + // Build the encryption key packet + *ep++ = regEnc; + memcpy(ep, pec->encKey, ENC_LEN); - TRACE("%s : init OK (enc)", __func__); - } + // ** Send encryption key (PSK) + if ( !furi_hal_i2c_tx(i2cBus,i2cAddr, encTx,(1+ENC_LEN), i2cTimeout) ) { + ERROR("%s : key fail", __func__); + goto bail; + } - // === Some devices [eg. Drawsome/uDraw] require additional init code === - if(ecId[pec->init].init && (ecId[pec->init].init(pec) == false)) goto bail; - pec->init = true; + TRACE("%s : init OK (enc)", __func__); + } - // === Read calibration data === - if(!furi_hal_i2c_trx(i2cBus, i2cAddr, ®Cal, 1, pec->calF, CAL_LEN, i2cTimeout)) { - ERROR("%s : trx fail (cal)", __func__); - goto bail; - } - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); - dump(pec->calF, CAL_LEN, "cal"); + // === Some devices [eg. Drawsome/uDraw] require additional init code === + if ( ecId[pec->init].init && (ecId[pec->init].init(pec) == false) ) goto bail ; + pec->init = true; - ecCalibrate(pec, CAL_RESET | CAL_FACTORY); // Load factory default calibration + // === Read calibration data === + if (!furi_hal_i2c_trx(i2cBus,i2cAddr, ®Cal,1, pec->calF,CAL_LEN, i2cTimeout)) { + ERROR("%s : trx fail (cal)", __func__); + goto bail; + } + if (pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); + dump(pec->calF, CAL_LEN, "cal"); - // === Initialise decode buffers === - pec->decN = 0; // read in to decode[1] (yes, N=0 -> read in to dec[1]) - switch(ecRead(pec)) { - case 0: // read OK - memcpy(&pec->dec[0], &pec->dec[1], sizeof(pec->dec[0])); - dump(pec->joy, JOY_LEN, "joy"); - break; + ecCalibrate(pec, CAL_RESET | CAL_FACTORY); // Load factory default calibration - default: // bug: unknown - case 1: // bug: not initialised - should never happen - ERROR("%s : read bug", __func__); - break; + // === Initialise decode buffers === + pec->decN = 0; // read in to decode[1] (yes, N=0 -> read in to dec[1]) + switch (ecRead(pec)) { + case 0: // read OK + memcpy(&pec->dec[0], &pec->dec[1], sizeof(pec->dec[0])); + dump(pec->joy, JOY_LEN, "joy"); + break; - case 2: // device gone - case 3: // read fail - // Logging done by ecRead() - pec->init = false; - goto bail; - } + default: // bug: unknown + case 1: // bug: not initialised - should never happen + ERROR("%s : read bug", __func__); + break; - rv = true; // yay :) + case 2: // device gone + case 3: // read fail + // Logging done by ecRead() + pec->init = false; + goto bail; + } + + rv = true; // yay :) bail: #if 0 //! i2c workaround furi_hal_i2c_release(i2cBus); #endif - LEAVE; - return rv; + LEAVE; + return rv; } diff --git a/applications/plugins/wii_ec_anal/wii_i2c.h b/applications/plugins/wii_ec_anal/wii_i2c.h index efebefcf9..18cb5ee9b 100644 --- a/applications/plugins/wii_ec_anal/wii_i2c.h +++ b/applications/plugins/wii_ec_anal/wii_i2c.h @@ -1,7 +1,7 @@ -#ifndef WII_I2C_H_ -#define WII_I2C_H_ +#ifndef WII_I2C_H_ +#define WII_I2C_H_ -#include +#include //#include "wii_ec.h" @@ -14,11 +14,11 @@ // // After the (special) START "bit"... // the first 8bits (byte) of i2c data are the 7bit i2c Address, -// FOLLOWED by 1bit to signify a READ or WRITE {0=write, 1=read} +// FOLLOWED by 1bit to signify a READ or WRITE {0=write, 1=read} // The data is transmitted BIG-Endian, IE. MSb first [human readable] // So the address actually lives in the TOP (MSb's) of the first "byte", (with bit0 being used as the read/write flag) // -// The read() and write() functions on the FZ will set the LSb appropriately, +// The read() and write() functions on the FZ will set the LSb appropriately, // BUT they do NOT shift the address left to make room for it! // So the address you give to read/write() MUST be given as (7bitAddress << 1) // @@ -26,17 +26,17 @@ // // firmware/targets/f7/furi_hal/furi_hal_i2c_types.h -#define i2cBus (&furi_hal_i2c_handle_external) // FZ external i2c bus -#define i2cAddr (ec_i2cAddr << 1) -#define i2cTimeout (3) // in mS -#define i2cReadWait (300) //! 300uS: how low can we take this? +#define i2cBus (&furi_hal_i2c_handle_external) // FZ external i2c bus +#define i2cAddr (ec_i2cAddr << 1) +#define i2cTimeout (3) // in mS +#define i2cReadWait (300) //! 300uS: how low can we take this? //----------------------------------------------------------------------------- ---------------------------------------- // public functions // -typedef struct wiiEC wiiEC_t; +typedef struct wiiEC wiiEC_t ; -bool ecInit(wiiEC_t* const pec, const uint8_t* encKey); -int ecRead(wiiEC_t* const pec); +bool ecInit (wiiEC_t* const pec, const uint8_t* encKey) ; +int ecRead (wiiEC_t* const pec) ; #endif //WII_I2C_H_ From 44392603320c34be506d0a3920636192139e30e6 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 02:14:56 +0100 Subject: [PATCH 47/64] Get rid of broken USB Midi app --- applications/plugins/usb_midi/.gitattributes | 2 - applications/plugins/usb_midi/.gitignore | 52 --- applications/plugins/usb_midi/application.fam | 14 - applications/plugins/usb_midi/midi/config.h | 3 - applications/plugins/usb_midi/midi/message.c | 144 ------ applications/plugins/usb_midi/midi/message.h | 251 ---------- applications/plugins/usb_midi/midi/parser.c | 149 ------ applications/plugins/usb_midi/midi/parser.h | 14 - .../plugins/usb_midi/midi/usb_message.c | 40 -- .../plugins/usb_midi/midi/usb_message.h | 28 -- .../plugins/usb_midi/usb/cm3_usb_audio.h | 234 ---------- .../plugins/usb_midi/usb/cm3_usb_midi.h | 190 -------- .../plugins/usb_midi/usb/usb_midi_driver.c | 428 ------------------ .../plugins/usb_midi/usb/usb_midi_driver.h | 14 - applications/plugins/usb_midi/usb_midi.c | 84 ---- applications/plugins/usb_midi/usb_midi.png | Bin 146 -> 0 bytes 16 files changed, 1647 deletions(-) delete mode 100644 applications/plugins/usb_midi/.gitattributes delete mode 100644 applications/plugins/usb_midi/.gitignore delete mode 100644 applications/plugins/usb_midi/application.fam delete mode 100644 applications/plugins/usb_midi/midi/config.h delete mode 100644 applications/plugins/usb_midi/midi/message.c delete mode 100644 applications/plugins/usb_midi/midi/message.h delete mode 100644 applications/plugins/usb_midi/midi/parser.c delete mode 100644 applications/plugins/usb_midi/midi/parser.h delete mode 100644 applications/plugins/usb_midi/midi/usb_message.c delete mode 100644 applications/plugins/usb_midi/midi/usb_message.h delete mode 100644 applications/plugins/usb_midi/usb/cm3_usb_audio.h delete mode 100644 applications/plugins/usb_midi/usb/cm3_usb_midi.h delete mode 100644 applications/plugins/usb_midi/usb/usb_midi_driver.c delete mode 100644 applications/plugins/usb_midi/usb/usb_midi_driver.h delete mode 100644 applications/plugins/usb_midi/usb_midi.c delete mode 100644 applications/plugins/usb_midi/usb_midi.png diff --git a/applications/plugins/usb_midi/.gitattributes b/applications/plugins/usb_midi/.gitattributes deleted file mode 100644 index dfe077042..000000000 --- a/applications/plugins/usb_midi/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/applications/plugins/usb_midi/.gitignore b/applications/plugins/usb_midi/.gitignore deleted file mode 100644 index c6127b38c..000000000 --- a/applications/plugins/usb_midi/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf diff --git a/applications/plugins/usb_midi/application.fam b/applications/plugins/usb_midi/application.fam deleted file mode 100644 index d44153fd7..000000000 --- a/applications/plugins/usb_midi/application.fam +++ /dev/null @@ -1,14 +0,0 @@ -App( - appid="USB_Midi", - name="USB Midi", - apptype=FlipperAppType.EXTERNAL, - entry_point="usb_midi_app", - requires=[ - "gui", - ], - stack_size=4 * 1024, - order=20, - fap_icon="usb_midi.png", - fap_category="Music", - # fap_icon_assets="icons", -) diff --git a/applications/plugins/usb_midi/midi/config.h b/applications/plugins/usb_midi/midi/config.h deleted file mode 100644 index c62c1b1ef..000000000 --- a/applications/plugins/usb_midi/midi/config.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -#define SYSEX_BUFFER_LEN 16 \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/message.c b/applications/plugins/usb_midi/midi/message.c deleted file mode 100644 index 7bee9816a..000000000 --- a/applications/plugins/usb_midi/midi/message.c +++ /dev/null @@ -1,144 +0,0 @@ -#include "message.h" - -/** Returns the data within the MidiEvent as a NoteOffEvent struct */ -NoteOffEvent AsNoteOff(MidiEvent* event) { - NoteOffEvent m; - m.channel = event->channel; - m.note = event->data[0]; - m.velocity = event->data[1]; - return m; -} - -/** Returns the data within the MidiEvent as a NoteOnEvent struct */ -NoteOnEvent AsNoteOn(MidiEvent* event) { - NoteOnEvent m; - m.channel = event->channel; - m.note = event->data[0]; - m.velocity = event->data[1]; - return m; -} - -/** Returns the data within the MidiEvent as a PolyphonicKeyPressureEvent struct */ -PolyphonicKeyPressureEvent AsPolyphonicKeyPressure(MidiEvent* event) { - PolyphonicKeyPressureEvent m; - m.channel = event->channel; - m.note = event->data[0]; - m.pressure = event->data[1]; - return m; -} - -/** Returns the data within the MidiEvent as a ControlChangeEvent struct.*/ -ControlChangeEvent AsControlChange(MidiEvent* event) { - ControlChangeEvent m; - m.channel = event->channel; - m.control_number = event->data[0]; - m.value = event->data[1]; - return m; -} - -/** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/ -ProgramChangeEvent AsProgramChange(MidiEvent* event) { - ProgramChangeEvent m; - m.channel = event->channel; - m.program = event->data[0]; - return m; -} - -/** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/ -ChannelPressureEvent AsChannelPressure(MidiEvent* event) { - ChannelPressureEvent m; - m.channel = event->channel; - m.pressure = event->data[0]; - return m; -} - -/** Returns the data within the MidiEvent as a PitchBendEvent struct.*/ -PitchBendEvent AsPitchBend(MidiEvent* event) { - PitchBendEvent m; - m.channel = event->channel; - m.value = ((uint16_t)(event->data[1]) << 7) + (event->data[0] - 8192); - return m; -} - -SystemExclusiveEvent AsSystemExclusive(MidiEvent* event) { - SystemExclusiveEvent m; - m.length = event->sysex_message_len; - for(int i = 0; i < SYSEX_BUFFER_LEN; i++) { - m.data[i] = 0; - if(i < m.length) { - m.data[i] = event->sysex_data[i]; - } - } - return m; -} - -MTCQuarterFrameEvent AsMTCQuarterFrame(MidiEvent* event) { - MTCQuarterFrameEvent m; - m.message_type = (event->data[0] & 0x70) >> 4; - m.value = (event->data[0]) & 0x0f; - return m; -} - -SongPositionPointerEvent AsSongPositionPointer(MidiEvent* event) { - SongPositionPointerEvent m; - m.position = ((uint16_t)(event->data[1]) << 7) | (event->data[0]); - return m; -} - -SongSelectEvent AsSongSelect(MidiEvent* event) { - SongSelectEvent m; - m.song = event->data[0]; - return m; -} - -AllSoundOffEvent AsAllSoundOff(MidiEvent* event) { - AllSoundOffEvent m; - m.channel = event->channel; - return m; -} - -ResetAllControllersEvent AsResetAllControllers(MidiEvent* event) { - ResetAllControllersEvent m; - m.channel = event->channel; - m.value = event->data[1]; - return m; -} - -LocalControlEvent AsLocalControl(MidiEvent* event) { - LocalControlEvent m; - m.channel = event->channel; - m.local_control_off = (event->data[1] == 0); - m.local_control_on = (event->data[1] == 127); - return m; -} - -AllNotesOffEvent AsAllNotesOff(MidiEvent* event) { - AllNotesOffEvent m; - m.channel = event->channel; - return m; -} - -OmniModeOffEvent AsOmniModeOff(MidiEvent* event) { - OmniModeOffEvent m; - m.channel = event->channel; - return m; -} - -OmniModeOnEvent AsOmniModeOn(MidiEvent* event) { - OmniModeOnEvent m; - m.channel = event->channel; - return m; -} - -MonoModeOnEvent AsMonoModeOn(MidiEvent* event) { - MonoModeOnEvent m; - m.channel = event->channel; - m.num_channels = event->data[1]; - return m; -} - -PolyModeOnEvent AsPolyModeOn(MidiEvent* event) { - PolyModeOnEvent m; - m.channel = event->channel; - return m; -} \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/message.h b/applications/plugins/usb_midi/midi/message.h deleted file mode 100644 index 88402c4a4..000000000 --- a/applications/plugins/usb_midi/midi/message.h +++ /dev/null @@ -1,251 +0,0 @@ -#pragma once -#include -#include -#include "config.h" - -typedef enum { - NoteOff, /**< & */ - NoteOn, /**< & */ - PolyphonicKeyPressure, /**< & */ - ControlChange, /**< & */ - ProgramChange, /**< & */ - ChannelPressure, /**< & */ - PitchBend, /**< & */ - SystemCommon, /**< & */ - SystemRealTime, /**< & */ - ChannelMode, /**< & */ - MessageLast, /**< & */ -} MidiMessageType; - -typedef enum { - SystemExclusive, /**< & */ - MTCQuarterFrame, /**< & */ - SongPositionPointer, /**< & */ - SongSelect, /**< & */ - SCUndefined0, /**< & */ - SCUndefined1, /**< & */ - TuneRequest, /**< & */ - SysExEnd, /**< & */ - SystemCommonLast, /**< & */ -} SystemCommonType; - -typedef enum { - TimingClock, /**< & */ - SRTUndefined0, /**< & */ - Start, /**< & */ - Continue, /**< & */ - Stop, /**< & */ - SRTUndefined1, /**< & */ - ActiveSensing, /**< & */ - Reset, /**< & */ - SystemRealTimeLast, /**< & */ -} SystemRealTimeType; - -typedef enum { - AllSoundOff, /**< & */ - ResetAllControllers, /**< & */ - LocalControl, /**< & */ - AllNotesOff, /**< & */ - OmniModeOff, /**< & */ - OmniModeOn, /**< & */ - MonoModeOn, /**< & */ - PolyModeOn, /**< & */ - ChannelModeLast, /**< & */ -} ChannelModeType; - -/** Struct containing note, and velocity data for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t note; /**< & */ - uint8_t velocity; /**< & */ -} NoteOffEvent; - -/** Struct containing note, and velocity data for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t note; /**< & */ - uint8_t velocity; /**< & */ -} NoteOnEvent; - -/** Struct containing note, and pressure data for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; - uint8_t note; - uint8_t pressure; -} PolyphonicKeyPressureEvent; - -/** Struct containing control number, and value for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t control_number; /**< & */ - uint8_t value; /**< & */ -} ControlChangeEvent; - -/** Struct containing new program number, for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t program; /**< & */ -} ProgramChangeEvent; - -/** Struct containing pressure (aftertouch), for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t pressure; /**< & */ -} ChannelPressureEvent; - -/** Struct containing pitch bend value for a given channel. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - int16_t value; /**< & */ -} PitchBendEvent; - -/** Struct containing sysex data. -Can be made from MidiEvent -*/ -typedef struct { - int length; - uint8_t data[SYSEX_BUFFER_LEN]; /**< & */ -} SystemExclusiveEvent; - -/** Struct containing QuarterFrame data. -Can be made from MidiEvent -*/ -typedef struct { - uint8_t message_type; /**< & */ - uint8_t value; /**< & */ -} MTCQuarterFrameEvent; - -/** Struct containing song position data. -Can be made from MidiEvent -*/ -typedef struct { - uint16_t position; /**< & */ -} SongPositionPointerEvent; - -/** Struct containing song select data. -Can be made from MidiEvent -*/ -typedef struct { - uint8_t song; /**< & */ -} SongSelectEvent; - -/** Struct containing sound off data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ -} AllSoundOffEvent; - -/** Struct containing ResetAllControllersEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t value; /**< & */ -} ResetAllControllersEvent; - -/** Struct containing LocalControlEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - bool local_control_off; /**< & */ - bool local_control_on; /**< & */ -} LocalControlEvent; - -/** Struct containing AllNotesOffEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ -} AllNotesOffEvent; - -/** Struct containing OmniModeOffEvent data. - * Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ -} OmniModeOffEvent; - -/** Struct containing OmniModeOnEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ -} OmniModeOnEvent; - -/** Struct containing MonoModeOnEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ - uint8_t num_channels; /**< & */ -} MonoModeOnEvent; - -/** Struct containing PolyModeOnEvent data. -Can be made from MidiEvent -*/ -typedef struct { - int channel; /**< & */ -} PolyModeOnEvent; - -/** Simple MidiEvent with message type, channel, and data[2] members. -*/ -typedef struct { - MidiMessageType type; - int channel; - uint8_t data[2]; - uint8_t sysex_data[SYSEX_BUFFER_LEN]; - uint8_t sysex_message_len; - SystemCommonType sc_type; - SystemRealTimeType srt_type; - ChannelModeType cm_type; -} MidiEvent; - -/** Returns the data within the MidiEvent as a NoteOffEvent struct */ -NoteOffEvent AsNoteOff(MidiEvent* event); - -/** Returns the data within the MidiEvent as a NoteOnEvent struct */ -NoteOnEvent AsNoteOn(MidiEvent* event); - -/** Returns the data within the MidiEvent as a PolyphonicKeyPressureEvent struct */ -PolyphonicKeyPressureEvent AsPolyphonicKeyPressure(MidiEvent* event); - -/** Returns the data within the MidiEvent as a ControlChangeEvent struct.*/ -ControlChangeEvent AsControlChange(MidiEvent* event); - -/** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/ -ProgramChangeEvent AsProgramChange(MidiEvent* event); - -/** Returns the data within the MidiEvent as a ProgramChangeEvent struct.*/ -ChannelPressureEvent AsChannelPressure(MidiEvent* event); - -/** Returns the data within the MidiEvent as a PitchBendEvent struct.*/ -PitchBendEvent AsPitchBend(MidiEvent* event); - -SystemExclusiveEvent AsSystemExclusive(MidiEvent* event); -MTCQuarterFrameEvent AsMTCQuarterFrame(MidiEvent* event); -SongPositionPointerEvent AsSongPositionPointer(MidiEvent* event); -SongSelectEvent AsSongSelect(MidiEvent* event); -AllSoundOffEvent AsAllSoundOff(MidiEvent* event); -ResetAllControllersEvent AsResetAllControllers(MidiEvent* event); -LocalControlEvent AsLocalControl(MidiEvent* event); -AllNotesOffEvent AsAllNotesOff(MidiEvent* event); -OmniModeOffEvent AsOmniModeOff(MidiEvent* event); -OmniModeOnEvent AsOmniModeOn(MidiEvent* event); -MonoModeOnEvent AsMonoModeOn(MidiEvent* event); -PolyModeOnEvent AsPolyModeOn(MidiEvent* event); \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/parser.c b/applications/plugins/usb_midi/midi/parser.c deleted file mode 100644 index 86120e007..000000000 --- a/applications/plugins/usb_midi/midi/parser.c +++ /dev/null @@ -1,149 +0,0 @@ -#include -#include "parser.h" - -typedef enum { - ParserEmpty, - ParserHasStatus, - ParserHasData0, - ParserSysEx, -} ParserState; - -const uint8_t kStatusByteMask = 0x80; -const uint8_t kMessageMask = 0x70; -const uint8_t kDataByteMask = 0x7F; -const uint8_t kSystemCommonMask = 0xF0; -const uint8_t kChannelMask = 0x0F; -const uint8_t kRealTimeMask = 0xF8; -const uint8_t kSystemRealTimeMask = 0x07; - -struct MidiParser { - MidiMessageType status; - ParserState state; - MidiEvent incoming_message; -}; - -MidiParser* midi_parser_alloc(void) { - MidiParser* parser = malloc(sizeof(MidiParser)); - parser->incoming_message.type = MessageLast; - parser->state = ParserEmpty; - return parser; -} - -void midi_parser_free(MidiParser* parser) { - free(parser); -} - -bool midi_parser_parse(MidiParser* parser, uint8_t byte) { - bool parsed = false; - MidiEvent* event = &parser->incoming_message; - - switch(parser->state) { - case ParserEmpty: - // check byte for valid Status Byte - if(byte & kStatusByteMask) { - // Get MessageType, and Channel - event->channel = byte & kChannelMask; - event->type = (MidiMessageType)((byte & kMessageMask) >> 4); - - // Validate, and move on. - if(event->type < MessageLast) { - parser->state = ParserHasStatus; - // Mark this status byte as running_status - parser->status = event->type; - - if(parser->status == SystemCommon) { - event->channel = 0; - //system real time = 1111 1xxx - if(byte & 0x08) { - event->type = SystemRealTime; - parser->status = SystemRealTime; - event->srt_type = (SystemRealTimeType)(byte & kSystemRealTimeMask); - - //short circuit to start - parser->state = ParserEmpty; - //queue_.push(incoming_message_); - parsed = true; - } - //system common - else { - event->sc_type = (SystemCommonType)(byte & 0x07); - //sysex - if(event->sc_type == SystemExclusive) { - parser->state = ParserSysEx; - event->sysex_message_len = 0; - } - //short circuit - else if(event->sc_type > SongSelect) { - parser->state = ParserEmpty; - //queue_.push(incoming_message_); - parsed = true; - } - } - } - } - // Else we'll keep waiting for a valid incoming status byte - } else { - // Handle as running status - event->type = parser->status; - event->data[0] = byte & kDataByteMask; - parser->state = ParserHasData0; - } - break; - case ParserHasStatus: - if((byte & kStatusByteMask) == 0) { - event->data[0] = byte & kDataByteMask; - if(parser->status == ChannelPressure || parser->status == ProgramChange || - event->sc_type == MTCQuarterFrame || event->sc_type == SongSelect) { - //these are just one data byte, so we short circuit back to start - parser->state = ParserEmpty; - //queue_.push(incoming_message_); - parsed = true; - } else { - parser->state = ParserHasData0; - } - - //ChannelModeMessages (reserved Control Changes) - if(parser->status == ControlChange && event->data[0] > 119) { - event->type = ChannelMode; - parser->status = ChannelMode; - event->cm_type = (ChannelModeType)(event->data[0] - 120); - } - } else { - // invalid message go back to start ;p - parser->state = ParserEmpty; - } - break; - case ParserHasData0: - if((byte & kStatusByteMask) == 0) { - event->data[1] = byte & kDataByteMask; - // At this point the message is valid, and we can add this MidiEvent to the queue - //queue_.push(incoming_message_); - parsed = true; - } - // Regardless, of whether the data was valid or not we go back to empty - // because either the message is queued for handling or its not. - parser->state = ParserEmpty; - break; - case ParserSysEx: - // end of sysex - if(byte == 0xf7) { - parser->state = ParserEmpty; - //queue_.push(incoming_message_); - parsed = true; - } else { - if(event->sysex_message_len < SYSEX_BUFFER_LEN) { - event->sysex_data[event->sysex_message_len] = byte; - event->sysex_message_len++; - } - } - break; - default: - break; - } - - return parsed; -} - -MidiEvent* midi_parser_get_message(MidiParser* parser) { - return &parser->incoming_message; -} \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/parser.h b/applications/plugins/usb_midi/midi/parser.h deleted file mode 100644 index 93630f026..000000000 --- a/applications/plugins/usb_midi/midi/parser.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include -#include -#include "message.h" - -typedef struct MidiParser MidiParser; - -MidiParser* midi_parser_alloc(void); - -void midi_parser_free(MidiParser* parser); - -bool midi_parser_parse(MidiParser* parser, uint8_t data); - -MidiEvent* midi_parser_get_message(MidiParser* parser); \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/usb_message.c b/applications/plugins/usb_midi/midi/usb_message.c deleted file mode 100644 index b6844c5f4..000000000 --- a/applications/plugins/usb_midi/midi/usb_message.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "usb_message.h" - -CodeIndex code_index_from_data(uint8_t data) { - return (CodeIndex)(data & 0b00001111); -} - -uint8_t cable_id_from_data(uint8_t data) { - return (data >> 4) & 0b00001111; -} - -uint8_t usb_message_data_size(CodeIndex code_index) { - uint8_t data_size = 0; - switch(code_index) { - case CodeIndexCommon1Byte: - /* case CodeIndexSysExEnd1Byte: */ - case CodeIndexSingleByte: - data_size = 1; - break; - case CodeIndexSysEx2Byte: - case CodeIndexSysExEnd2Byte: - case CodeIndexProgramChange: - case CodeIndexChannelPressure: - data_size = 2; - break; - case CodeIndexSysEx3Byte: - case CodeIndexSysExStart: - case CodeIndexSysExEnd3Byte: - case CodeIndexNoteOff: - case CodeIndexNoteOn: - case CodeIndexPolyKeyPress: - case CodeIndexControlChange: - case CodeIndexPitchBendChange: - data_size = 3; - break; - default: - break; - } - - return data_size; -} \ No newline at end of file diff --git a/applications/plugins/usb_midi/midi/usb_message.h b/applications/plugins/usb_midi/midi/usb_message.h deleted file mode 100644 index 852e9cb4f..000000000 --- a/applications/plugins/usb_midi/midi/usb_message.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include - -typedef enum { - CodeIndexMisc = 0x0, /**< Reserved, MIDI Size: 1, 2, 3 */ - CodeIndexCableEvent = 0x1, /**< Reserved, MIDI Size: 1, 2, 3 */ - CodeIndexSysEx2Byte = 0x2, /**< MIDI Size: 2 */ - CodeIndexSysEx3Byte = 0x3, /**< MIDI Size: 3 */ - CodeIndexSysExStart = 0x4, /**< MIDI Size: 3 */ - CodeIndexCommon1Byte = 0x5, /**< MIDI Size: 1 */ - CodeIndexSysExEnd1Byte = 0x5, /**< MIDI Size: 1 */ - CodeIndexSysExEnd2Byte = 0x6, /**< MIDI Size: 2 */ - CodeIndexSysExEnd3Byte = 0x7, /**< MIDI Size: 3 */ - CodeIndexNoteOff = 0x8, /**< MIDI Size: 3 */ - CodeIndexNoteOn = 0x9, /**< MIDI Size: 3 */ - CodeIndexPolyKeyPress = 0xA, /**< MIDI Size: 3 */ - CodeIndexControlChange = 0xB, /**< MIDI Size: 3 */ - CodeIndexProgramChange = 0xC, /**< MIDI Size: 2 */ - CodeIndexChannelPressure = 0xD, /**< MIDI Size: 2 */ - CodeIndexPitchBendChange = 0xE, /**< MIDI Size: 3 */ - CodeIndexSingleByte = 0xF, /**< MIDI Size: 1 */ -} CodeIndex; - -CodeIndex code_index_from_data(uint8_t data); - -uint8_t cable_id_from_data(uint8_t data); - -uint8_t usb_message_data_size(CodeIndex code_index); \ No newline at end of file diff --git a/applications/plugins/usb_midi/usb/cm3_usb_audio.h b/applications/plugins/usb_midi/usb/cm3_usb_audio.h deleted file mode 100644 index 3c767f929..000000000 --- a/applications/plugins/usb_midi/usb/cm3_usb_audio.h +++ /dev/null @@ -1,234 +0,0 @@ -/** @defgroup usb_audio_defines USB Audio Type Definitions - -@brief Defined Constants and Types for the USB Audio Type Definitions - -@ingroup USB_defines - -@version 1.0.0 - -@author @htmlonly © @endhtmlonly 2014 -Daniel Thompson -Seb Holzapfel - -@date 19 April 2014 - -LGPL License Terms @ref lgpl_license -*/ - -/* - * This file is part of the libopencm3 project. - * - * Copyright (C) 2014 Daniel Thompson - * Copyright (C) 2018 Seb Holzapfel - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -/**@{*/ - -#ifndef LIBOPENCM3_USB_AUDIO_H -#define LIBOPENCM3_USB_AUDIO_H - -#include - -/* - * Definitions from the USB_AUDIO_ or usb_audio_ namespace come from: - * "Universal Serial Bus Class Definitions for Audio Devices, Revision 1.0" - */ - -/* Table A-1: Audio Interface Class Code */ -#define USB_CLASS_AUDIO 0x01 - -/* Table A-2: Audio Interface Subclass Codes */ -#define USB_AUDIO_SUBCLASS_UNDEFINED 0x00 -#define USB_AUDIO_SUBCLASS_CONTROL 0x01 -#define USB_AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 -#define USB_AUDIO_SUBCLASS_MIDISTREAMING 0x03 - -/* Table A-4: Audio Class-specific Descriptor Types */ -#define USB_AUDIO_DT_CS_UNDEFINED 0x20 -#define USB_AUDIO_DT_CS_DEVICE 0x21 -#define USB_AUDIO_DT_CS_CONFIGURATION 0x22 -#define USB_AUDIO_DT_CS_STRING 0x23 -#define USB_AUDIO_DT_CS_INTERFACE 0x24 -#define USB_AUDIO_DT_CS_ENDPOINT 0x25 - -/* Table A-5: Audio Class-Specific AC Interface Descriptor Subtypes */ -#define USB_AUDIO_TYPE_AC_DESCRIPTOR_UNDEFINED 0x00 -#define USB_AUDIO_TYPE_HEADER 0x01 -#define USB_AUDIO_TYPE_INPUT_TERMINAL 0x02 -#define USB_AUDIO_TYPE_OUTPUT_TERMINAL 0x03 -#define USB_AUDIO_TYPE_MIXER_UNIT 0x04 -#define USB_AUDIO_TYPE_SELECTOR_UNIT 0x05 -#define USB_AUDIO_TYPE_FEATURE_UNIT 0x06 -#define USB_AUDIO_TYPE_PROCESSING_UNIT 0x07 -#define USB_AUDIO_TYPE_EXTENSION_UNIT 0x08 - -/* Table 4-2: Class-Specific AC Interface Header Descriptor (head) */ -struct usb_audio_header_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdADC; - uint16_t wTotalLength; - uint8_t bInCollection; - /* ... */ -} __attribute__((packed)); - -/* Table 4-2: Class-Specific AC Interface Header Descriptor (body) */ -struct usb_audio_header_descriptor_body { - /* ... */ - uint8_t baInterfaceNr; -} __attribute__((packed)); - -/* Table 4-3: Input Terminal Descriptor */ -struct usb_audio_input_terminal_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bNrChannels; - uint16_t wChannelConfig; - uint8_t iChannelNames; - uint8_t iTerminal; -} __attribute__((packed)); - -/* Table 4-3: Output Terminal Descriptor */ -struct usb_audio_output_terminal_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bSourceID; - uint8_t iTerminal; -} __attribute__((packed)); - -/* Table 4-7: Feature Unit Descriptor (head) */ -struct usb_audio_feature_unit_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bSourceID; - uint8_t bControlSize; - uint16_t bmaControlMaster; /* device can assume 16-bit, given highest - * defined bit in spec is bit #9. - * (it is thus required bControlSize=2) */ - /* ... */ -} __attribute__((packed)); - -/* Table 4-7: Feature Unit Descriptor (body) */ -struct usb_audio_feature_unit_descriptor_body { - /* ... */ - uint16_t bmaControl; - /* ... */ -} __attribute__((packed)); - -/* Table 4-7: Feature Unit Descriptor (tail) */ -struct usb_audio_feature_unit_descriptor_tail { - /* ... */ - uint8_t iFeature; -} __attribute__((packed)); - -/* Table 4-7: Feature Unit Descriptor (2-channel) - * - * This structure is a convenience covering the (common) case where - * there are 2 channels associated with the feature unit - */ -struct usb_audio_feature_unit_descriptor_2ch { - struct usb_audio_feature_unit_descriptor_head head; - struct usb_audio_feature_unit_descriptor_body channel_control[2]; - struct usb_audio_feature_unit_descriptor_tail tail; -} __attribute__((packed)); - -/* Table 4-19: Class-Specific AS Interface Descriptor */ -struct usb_audio_stream_interface_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalLink; - uint8_t bDelay; - uint16_t wFormatTag; -} __attribute__((packed)); - -/* Table 4-20: Standard AS Isochronous Audio Data Endpoint Descriptor */ -struct usb_audio_stream_endpoint_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; - uint8_t bRefresh; - uint8_t bSynchAddress; -} __attribute__((packed)); - -/* Table 4-21: Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ -struct usb_audio_stream_audio_endpoint_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmAttributes; - uint8_t bLockDelayUnits; - uint16_t wLockDelay; -} __attribute__((packed)); - -/* - * Definitions from the USB_AUDIO_FORMAT_ or usb_audio_format_ namespace come from: - * "Universal Serial Bus Device Class Definition for Audio Data Formats, Revision 1.0" - */ - -/* Table 2-1: Type I Format Type Descriptor (head) */ -struct usb_audio_format_type1_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bFormatType; - uint8_t bNrChannels; - uint8_t bSubFrameSize; - uint8_t bBitResolution; - uint8_t bSamFreqType; - /* ... */ -} __attribute__((packed)); - -/* Table 2-2: Continuous Sampling Frequency */ -struct usb_audio_format_continuous_sampling_frequency { - /* ... */ - uint32_t tLowerSamFreq : 24; - uint32_t tUpperSamFreq : 24; -} __attribute__((packed)); - -/* Table 2-3: Discrete Number of Sampling Frequencies */ -struct usb_audio_format_discrete_sampling_frequency { - /* ... */ - uint32_t tSamFreq : 24; -} __attribute__((packed)); - -/* Table 2-1: Type I Format Type Descriptor (1 sampling frequency) - * - * This structure is a convenience covering the (common) case where - * only 1 discrete sampling frequency is used - */ -struct usb_audio_format_type1_descriptor_1freq { - struct usb_audio_format_type1_descriptor_head head; - struct usb_audio_format_discrete_sampling_frequency freqs[1]; -} __attribute__((packed)); - -#endif - -/**@}*/ diff --git a/applications/plugins/usb_midi/usb/cm3_usb_midi.h b/applications/plugins/usb_midi/usb/cm3_usb_midi.h deleted file mode 100644 index 8435c883e..000000000 --- a/applications/plugins/usb_midi/usb/cm3_usb_midi.h +++ /dev/null @@ -1,190 +0,0 @@ -/** @defgroup usb_audio_defines USB MIDI Type Definitions - -@brief Defined Constants and Types for the USB MIDI Type Definitions - -@ingroup USB_defines - -@version 1.0.0 - -@author @htmlonly © @endhtmlonly 2014 -Daniel Thompson - -@date 19 April 2014 - -LGPL License Terms @ref lgpl_license -*/ - -/* - * This file is part of the libopencm3 project. - * - * Copyright (C) 2014 Daniel Thompson - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -/**@{*/ - -#ifndef LIBOPENCM3_USB_MIDI_H -#define LIBOPENCM3_USB_MIDI_H - -#include - -/* - * Definitions from the USB_MIDI_ or usb_midi_ namespace come from: - * "Universal Serial Bus Class Definitions for MIDI Devices, Revision 1.0" - */ - -/* Appendix A.1: MS Class-Specific Interface Descriptor Subtypes */ -#define USB_MIDI_SUBTYPE_MS_DESCRIPTOR_UNDEFINED 0x00 -#define USB_MIDI_SUBTYPE_MS_HEADER 0x01 -#define USB_MIDI_SUBTYPE_MIDI_IN_JACK 0x02 -#define USB_MIDI_SUBTYPE_MIDI_OUT_JACK 0x03 -#define USB_MIDI_SUBTYPE_MIDI_ELEMENT 0x04 - -/* Appendix A.2: MS Class-Specific Endpoint Descriptor Subtypes */ -#define USB_MIDI_SUBTYPE_DESCRIPTOR_UNDEFINED 0x00 -#define USB_MIDI_SUBTYPE_MS_GENERAL 0x01 - -/* Appendix A.3: MS MIDI IN and OUT Jack types */ -#define USB_MIDI_JACK_TYPE_UNDEFINED 0x00 -#define USB_MIDI_JACK_TYPE_EMBEDDED 0x01 -#define USB_MIDI_JACK_TYPE_EXTERNAL 0x02 - -/* Appendix A.5.1 Endpoint Control Selectors */ -#define USB_MIDI_EP_CONTROL_UNDEFINED 0x00 -#define USB_MIDI_ASSOCIATION_CONTROL 0x01 - -/* Table 6-2: Class-Specific MS Interface Header Descriptor */ -struct usb_midi_header_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdMSC; - uint16_t wTotalLength; -} __attribute__((packed)); - -/* Table 6-3: MIDI IN Jack Descriptor */ -struct usb_midi_in_jack_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bJackType; - uint8_t bJackID; - uint8_t iJack; -} __attribute__((packed)); - -/* Table 6-4: MIDI OUT Jack Descriptor (head) */ -struct usb_midi_out_jack_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bJackType; - uint8_t bJackID; - uint8_t bNrInputPins; - /* ... */ -} __attribute__((packed)); - -/* Table 6.4: MIDI OUT Jack Descriptor (body) */ -struct usb_midi_out_jack_descriptor_body { - /* ... */ - uint8_t baSourceID; - uint8_t baSourcePin; - /* ... */ -} __attribute__((packed)); - -/* Table 6.4: MIDI OUT Jack Descriptor (tail) */ -struct usb_midi_out_jack_descriptor_tail { - /* ... */ - uint8_t iJack; -} __attribute__((packed)); - -/* Table 6.4: MIDI OUT Jack Descriptor (single) - * - * This structure is a convenience covering the (normal) case where - * there is only one input pin. - */ -struct usb_midi_out_jack_descriptor { - struct usb_midi_out_jack_descriptor_head head; - struct usb_midi_out_jack_descriptor_body source[1]; - struct usb_midi_out_jack_descriptor_tail tail; -} __attribute__((packed)); - -/* Table 6-5: MIDI Element Descriptor (head) */ -struct usb_midi_element_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bElementID; - uint8_t bNrInputPins; - /* ... */ -} __attribute__((packed)); - -/* Table 6-5: MIDI Element Descriptor (body) */ -struct usb_midi_element_descriptor_body { - /* ... */ - uint8_t baSourceID; - uint8_t baSourcePin; - /* ... */ -} __attribute__((packed)); - -/* Table 6-5: MIDI Element Descriptor (tail) */ -struct usb_midi_element_descriptor_tail { - /* ... */ - uint8_t bNrOutputPins; - uint8_t bInTerminalLink; - uint8_t bOutTerminalLink; - uint8_t bElCapsSize; - uint16_t bmElementCaps; /* host cannot assume this is 16-bit but device - can (since highest defined bitmap value in - v1.0 is bit 11) */ - uint8_t iElement; -} __attribute__((packed)); - -/* Table 6-5: MIDI Element Descriptor (single) - * - * This structure is a convenience covering the (common) case where - * there is only one input pin. - */ -struct usb_midi_element_descriptor { - struct usb_midi_element_descriptor_head head; - struct usb_midi_element_descriptor_body source[1]; - struct usb_midi_element_descriptor_tail tail; -} __attribute__((packed)); - -/* Table 6-7: Class-specific MS Bulk Data Endpoint Descriptor (head) */ -struct usb_midi_endpoint_descriptor_head { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; - uint8_t bNumEmbMIDIJack; -} __attribute__((packed)); - -/* Table 6-7: Class-specific MS Bulk Data Endpoint Descriptor (body) */ -struct usb_midi_endpoint_descriptor_body { - uint8_t baAssocJackID; -} __attribute__((packed)); - -/* Table 6.7: Class-specific MS Bulk Data Endpoint Descriptor (single) - * - * This structure is a convenience covering the (normal) case where - * there is only one input pin. - */ -struct usb_midi_endpoint_descriptor { - struct usb_midi_endpoint_descriptor_head head; - struct usb_midi_endpoint_descriptor_body jack[1]; -} __attribute__((packed)); - -#endif - -/**@}*/ diff --git a/applications/plugins/usb_midi/usb/usb_midi_driver.c b/applications/plugins/usb_midi/usb/usb_midi_driver.c deleted file mode 100644 index 9abf77d12..000000000 --- a/applications/plugins/usb_midi/usb/usb_midi_driver.c +++ /dev/null @@ -1,428 +0,0 @@ -#include -#include -#include -#include - -#include "usb_midi_driver.h" -#include "cm3_usb_audio.h" -#include "cm3_usb_midi.h" - -// Appendix B. "Example: Simple MIDI Adapter" from "Universal Serial Bus Device Class Definition for MIDI Devices", Revision 1.0 - -#define USB_VID 0x6666 -#define USB_PID 0x5119 - -#define USB_EP0_SIZE 8 - -#define USB_MIDI_EP_SIZE 64 -#define USB_MIDI_EP_IN 0x81 -#define USB_MIDI_EP_OUT 0x01 - -#define EP_CFG_DECONFIGURE 0 -#define EP_CFG_CONFIGURE 1 - -enum { - USB_STR_ZERO, - USB_STR_MANUFACTURER, - USB_STR_PRODUCT, - USB_STR_SERIAL_NUMBER, -}; - -/* - B.1 Device Descriptor -*/ -static const struct usb_device_descriptor device_descriptor = { - .bLength = sizeof(struct usb_device_descriptor), - .bDescriptorType = USB_DTYPE_DEVICE, - .bcdUSB = VERSION_BCD(2, 0, 0), // was 0x0110, 1.10 - current revision of USBspecification. - .bDeviceClass = USB_CLASS_PER_INTERFACE, - .bDeviceSubClass = USB_SUBCLASS_NONE, - .bDeviceProtocol = USB_PROTO_NONE, - .bMaxPacketSize0 = USB_EP0_SIZE, - .idVendor = USB_VID, - .idProduct = USB_PID, - .bcdDevice = VERSION_BCD(1, 0, 0), - .iManufacturer = USB_STR_MANUFACTURER, - .iProduct = USB_STR_PRODUCT, - .iSerialNumber = USB_STR_SERIAL_NUMBER, - .bNumConfigurations = 1, -}; - -struct usb_audio_header_descriptor { - struct usb_audio_header_descriptor_head head; - struct usb_audio_header_descriptor_body body; -} __attribute__((packed)); - -struct usb_midi_jacks_descriptor { - struct usb_midi_header_descriptor header; - struct usb_midi_in_jack_descriptor in_embedded; - struct usb_midi_in_jack_descriptor in_external; - struct usb_midi_out_jack_descriptor out_embedded; - struct usb_midi_out_jack_descriptor out_external; -} __attribute__((packed)); - -struct MidiConfigDescriptor { - /* - B.2 Configuration Descriptor - */ - struct usb_config_descriptor config; - - /* - B.3 AudioControl Interface Descriptors - - The AudioControl interface describes the device structure (audio function topology) - and is used to manipulate the Audio Controls. This device has no audio function incorporated. - However, the AudioControl interface is mandatory and therefore both the standard AC interface - descriptor and the classspecific AC interface descriptor must be present. - The class-specific AC interface descriptor only contains the header descriptor. - */ - // B.3.1 Standard AC Interface Descriptor - struct usb_interface_descriptor audio_control_iface; - // B.3.2 Class-specific AC Interface Descriptor - struct usb_audio_header_descriptor audio_control_header; - - /* - B.4 MIDIStreaming Interface Descriptors - */ - // B.4.1 Standard MS Interface Descriptor - struct usb_interface_descriptor midi_streaming_iface; - // B.4.2 Class-specific MS Interface Descriptor - // B.4.3 MIDI IN Jack Descriptor - // B.4.4 MIDI OUT Jack Descriptor - struct usb_midi_jacks_descriptor midi_jacks; - - /* - B.5 Bulk OUT Endpoint Descriptors - */ - // B.5.1 Standard Bulk OUT Endpoint Descriptor - struct usb_endpoint_descriptor bulk_out; - // B.5.2 Class-specific MS Bulk OUT Endpoint Descriptor - struct usb_midi_endpoint_descriptor midi_bulk_out; - - /* - B.6 Bulk IN Endpoint Descriptors - */ - // B.6.1 Standard Bulk IN Endpoint Descriptor - struct usb_endpoint_descriptor bulk_in; - // B.6.2 Class-specific MS Bulk IN Endpoint Descriptor - struct usb_midi_endpoint_descriptor midi_bulk_in; -} __attribute__((packed)); - -static const struct MidiConfigDescriptor config_descriptor = { - .config = - { - .bLength = sizeof(struct usb_config_descriptor), - .bDescriptorType = USB_DTYPE_CONFIGURATION, - .wTotalLength = sizeof(struct MidiConfigDescriptor), - .bNumInterfaces = 2, /* control and data */ - .bConfigurationValue = 1, - .iConfiguration = 0, - .bmAttributes = USB_CFG_ATTR_RESERVED, - .bMaxPower = USB_CFG_POWER_MA(100), - }, - .audio_control_iface = - { - .bLength = sizeof(struct usb_interface_descriptor), - .bDescriptorType = USB_DTYPE_INTERFACE, - .bInterfaceNumber = 0, - .bAlternateSetting = 0, - .bNumEndpoints = 0, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_AUDIO_SUBCLASS_CONTROL, - .bInterfaceProtocol = USB_PROTO_NONE, - .iInterface = 0, - }, - .audio_control_header = - { - .head = - { - .bLength = sizeof(struct usb_audio_header_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_AUDIO_TYPE_HEADER, - .bcdADC = VERSION_BCD(1, 0, 0), - .wTotalLength = sizeof(struct usb_audio_header_descriptor), - .bInCollection = 1, - }, - .body = - { - .baInterfaceNr = 1, - }, - }, - .midi_streaming_iface = - { - .bLength = sizeof(struct usb_interface_descriptor), - .bDescriptorType = USB_DTYPE_INTERFACE, - .bInterfaceNumber = 1, - .bAlternateSetting = 0, - .bNumEndpoints = 2, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_AUDIO_SUBCLASS_MIDISTREAMING, - .bInterfaceProtocol = USB_PROTO_NONE, - .iInterface = 0, - }, - .midi_jacks = - { - .header = - { - .bLength = sizeof(struct usb_midi_header_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_MIDI_SUBTYPE_MS_HEADER, - .bcdMSC = VERSION_BCD(1, 0, 0), - .wTotalLength = sizeof(struct usb_midi_jacks_descriptor), - }, - .in_embedded = - { - .bLength = sizeof(struct usb_midi_in_jack_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_MIDI_SUBTYPE_MIDI_IN_JACK, - .bJackType = USB_MIDI_JACK_TYPE_EMBEDDED, - .bJackID = 0x01, - .iJack = 0x00, - }, - .in_external = - { - .bLength = sizeof(struct usb_midi_in_jack_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_MIDI_SUBTYPE_MIDI_IN_JACK, - .bJackType = USB_MIDI_JACK_TYPE_EXTERNAL, - .bJackID = 0x02, - .iJack = 0x00, - }, - .out_embedded = - { - .head = - { - .bLength = sizeof(struct usb_midi_out_jack_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_MIDI_SUBTYPE_MIDI_OUT_JACK, - .bJackType = USB_MIDI_JACK_TYPE_EMBEDDED, - .bJackID = 0x03, - .bNrInputPins = 1, - }, - .source[0] = - { - .baSourceID = 0x02, - .baSourcePin = 0x01, - }, - .tail = - { - .iJack = 0x00, - }, - }, - .out_external = - { - .head = - { - .bLength = sizeof(struct usb_midi_out_jack_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_INTERFACE, - .bDescriptorSubtype = USB_MIDI_SUBTYPE_MIDI_OUT_JACK, - .bJackType = USB_MIDI_JACK_TYPE_EXTERNAL, - .bJackID = 0x04, - .bNrInputPins = 1, - }, - .source[0] = - { - .baSourceID = 0x01, - .baSourcePin = 0x01, - }, - .tail = - { - .iJack = 0x00, - }, - }, - }, - .bulk_out = - { - .bLength = sizeof(struct usb_endpoint_descriptor), - .bDescriptorType = USB_DTYPE_ENDPOINT, - .bEndpointAddress = USB_MIDI_EP_OUT, - .bmAttributes = USB_EPTYPE_BULK, - .wMaxPacketSize = USB_MIDI_EP_SIZE, - .bInterval = 0, - }, - .midi_bulk_out = - { - .head = - { - .bLength = sizeof(struct usb_midi_endpoint_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_ENDPOINT, - .bDescriptorSubType = USB_MIDI_SUBTYPE_MS_GENERAL, - .bNumEmbMIDIJack = 1, - }, - .jack[0] = - { - .baAssocJackID = 0x01, - }, - }, - .bulk_in = - { - .bLength = sizeof(struct usb_endpoint_descriptor), - .bDescriptorType = USB_DTYPE_ENDPOINT, - .bEndpointAddress = USB_MIDI_EP_IN, - .bmAttributes = USB_EPTYPE_BULK, - .wMaxPacketSize = USB_MIDI_EP_SIZE, - .bInterval = 0, - }, - .midi_bulk_in = - { - .head = - { - .bLength = sizeof(struct usb_midi_endpoint_descriptor), - .bDescriptorType = USB_AUDIO_DT_CS_ENDPOINT, - .bDescriptorSubType = USB_MIDI_SUBTYPE_MS_GENERAL, - .bNumEmbMIDIJack = 1, - }, - .jack[0] = - { - .baAssocJackID = 0x03, - }, - }, -}; - -static const struct usb_string_descriptor dev_manufacturer_string = - USB_STRING_DESC("Flipper Devices Inc."); - -static const struct usb_string_descriptor dev_product_string = - USB_STRING_DESC("Flipper MIDI Device"); - -static const struct usb_string_descriptor dev_serial_number_string = - USB_STRING_DESC("Serial Number"); - -static void midi_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); -static void midi_deinit(usbd_device* dev); -static void midi_on_wakeup(usbd_device* dev); -static void midi_on_suspend(usbd_device* dev); -static usbd_respond midi_ep_config(usbd_device* dev, uint8_t cfg); -static usbd_respond midi_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_callback* callback); - -FuriHalUsbInterface midi_usb_interface = { - .init = midi_init, - .deinit = midi_deinit, - .wakeup = midi_on_wakeup, - .suspend = midi_on_suspend, - .dev_descr = (struct usb_device_descriptor*)&device_descriptor, - .cfg_descr = (void*)&config_descriptor, -}; - -typedef struct { - usbd_device* dev; - MidiRxCallback rx_callback; - void* context; - FuriSemaphore* semaphore_tx; - bool connected; -} MidiUsb; - -static MidiUsb midi_usb; - -void midi_usb_set_context(void* context) { - midi_usb.context = context; -} - -void midi_usb_set_rx_callback(MidiRxCallback callback) { - midi_usb.rx_callback = callback; -} - -size_t midi_usb_rx(uint8_t* buffer, size_t size) { - size_t len = usbd_ep_read(midi_usb.dev, USB_MIDI_EP_OUT, buffer, size); - return len; -} - -size_t midi_usb_tx(uint8_t* buffer, uint8_t size) { - if((midi_usb.semaphore_tx == NULL) || (midi_usb.connected == false)) return 0; - - furi_check(furi_semaphore_acquire(midi_usb.semaphore_tx, FuriWaitForever) == FuriStatusOk); - - if(midi_usb.connected) { - int32_t len = usbd_ep_write(midi_usb.dev, USB_MIDI_EP_IN, buffer, size); - return len; - } else { - return 0; - } -} - -static void midi_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) { - UNUSED(intf); - UNUSED(ctx); - - midi_usb_interface.str_manuf_descr = (void*)&dev_manufacturer_string; - midi_usb_interface.str_prod_descr = (void*)&dev_product_string; - midi_usb_interface.str_serial_descr = (void*)&dev_serial_number_string; - midi_usb_interface.dev_descr->idVendor = USB_VID; - midi_usb_interface.dev_descr->idProduct = USB_PID; - - midi_usb.dev = dev; - if(midi_usb.semaphore_tx == NULL) midi_usb.semaphore_tx = furi_semaphore_alloc(1, 1); - - usbd_reg_config(dev, midi_ep_config); - usbd_reg_control(dev, midi_control); - - usbd_connect(dev, true); -} - -static void midi_deinit(usbd_device* dev) { - midi_usb.connected = false; - midi_usb.dev = NULL; - furi_semaphore_free(midi_usb.semaphore_tx); - - usbd_reg_config(dev, NULL); - usbd_reg_control(dev, NULL); -} - -static void midi_on_wakeup(usbd_device* dev) { - UNUSED(dev); - if(!midi_usb.connected) { - midi_usb.connected = true; - } -} - -static void midi_on_suspend(usbd_device* dev) { - UNUSED(dev); - if(midi_usb.connected) { - midi_usb.connected = false; - } -} - -static void midi_tx_rx(usbd_device* dev, uint8_t event, uint8_t ep) { - UNUSED(dev); - UNUSED(ep); - - switch(event) { - case usbd_evt_eptx: - furi_semaphore_release(midi_usb.semaphore_tx); - break; - case usbd_evt_eprx: - if(midi_usb.rx_callback != NULL) { - midi_usb.rx_callback(midi_usb.context); - } - break; - default: - break; - } -} - -static usbd_respond midi_ep_config(usbd_device* dev, uint8_t cfg) { - switch(cfg) { - case EP_CFG_DECONFIGURE: - usbd_ep_deconfig(dev, USB_MIDI_EP_OUT); - usbd_ep_deconfig(dev, USB_MIDI_EP_IN); - usbd_reg_endpoint(dev, USB_MIDI_EP_OUT, NULL); - usbd_reg_endpoint(dev, USB_MIDI_EP_IN, NULL); - return usbd_ack; - case EP_CFG_CONFIGURE: - usbd_ep_config(dev, USB_MIDI_EP_OUT, USB_EPTYPE_BULK, USB_MIDI_EP_SIZE); - usbd_ep_config(dev, USB_MIDI_EP_IN, USB_EPTYPE_BULK, USB_MIDI_EP_SIZE); - usbd_reg_endpoint(dev, USB_MIDI_EP_OUT, midi_tx_rx); - usbd_reg_endpoint(dev, USB_MIDI_EP_IN, midi_tx_rx); - return usbd_ack; - default: - return usbd_fail; - } -} - -static usbd_respond midi_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_callback* callback) { - UNUSED(dev); - UNUSED(req); - UNUSED(callback); - - return usbd_fail; -} \ No newline at end of file diff --git a/applications/plugins/usb_midi/usb/usb_midi_driver.h b/applications/plugins/usb_midi/usb/usb_midi_driver.h deleted file mode 100644 index d385efcb5..000000000 --- a/applications/plugins/usb_midi/usb/usb_midi_driver.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include - -extern FuriHalUsbInterface midi_usb_interface; - -typedef void (*MidiRxCallback)(void* context); - -void midi_usb_set_context(void* context); - -void midi_usb_set_rx_callback(MidiRxCallback callback); - -size_t midi_usb_rx(uint8_t* buffer, size_t size); - -size_t midi_usb_tx(uint8_t* buffer, uint8_t size); \ No newline at end of file diff --git a/applications/plugins/usb_midi/usb_midi.c b/applications/plugins/usb_midi/usb_midi.c deleted file mode 100644 index d82fb74d7..000000000 --- a/applications/plugins/usb_midi/usb_midi.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include "usb/usb_midi_driver.h" -#include "midi/parser.h" -#include "midi/usb_message.h" -#include - -float note_to_frequency(int note) { - float a = 440; - return (a / 32) * powf(2, ((note - 9) / 12.0)); -} - -typedef enum { - MidiThreadEventStop = (1 << 0), - MidiThreadEventRx = (1 << 1), - MidiThreadEventAll = MidiThreadEventStop | MidiThreadEventRx, -} MidiThreadEvent; - -static void midi_rx_callback(void* context) { - furi_assert(context); - FuriThreadId thread_id = (FuriThreadId)context; - furi_thread_flags_set(thread_id, MidiThreadEventRx); -} - -int32_t usb_midi_app(void* p) { - UNUSED(p); - - FuriHalUsbInterface* usb_config_prev; - usb_config_prev = furi_hal_usb_get_config(); - midi_usb_set_context(furi_thread_get_id(furi_thread_get_current())); - midi_usb_set_rx_callback(midi_rx_callback); - furi_hal_usb_set_config(&midi_usb_interface, NULL); - - MidiParser* parser = midi_parser_alloc(); - uint32_t events; - uint8_t current_note = 255; - - while(1) { - events = furi_thread_flags_wait(MidiThreadEventAll, FuriFlagWaitAny, FuriWaitForever); - - if(!(events & FuriFlagError)) { - if(events & MidiThreadEventRx) { - uint8_t buffer[64]; - size_t size = midi_usb_rx(buffer, sizeof(buffer)); - // loopback - // midi_usb_tx(buffer, size); - size_t start = 0; - while(start < size) { - CodeIndex code_index = code_index_from_data(buffer[start]); - uint8_t data_size = usb_message_data_size(code_index); - if(data_size == 0) break; - - start += 1; - for(size_t j = 0; j < data_size; j++) { - if(midi_parser_parse(parser, buffer[start + j])) { - MidiEvent* event = midi_parser_get_message(parser); - if(event->type == NoteOn) { - NoteOnEvent note_on = AsNoteOn(event); - current_note = note_on.note; - if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) { - furi_hal_speaker_start( - note_to_frequency(note_on.note), - note_on.velocity / 127.0f); - } - } else if(event->type == NoteOff) { - NoteOffEvent note_off = AsNoteOff(event); - if(note_off.note == current_note && furi_hal_speaker_is_mine()) { - furi_hal_speaker_stop(); - furi_hal_speaker_release(); - } - } - } - } - start += data_size; - } - } - } - } - - midi_parser_free(parser); - furi_hal_usb_set_config(usb_config_prev, NULL); - - return 0; -} \ No newline at end of file diff --git a/applications/plugins/usb_midi/usb_midi.png b/applications/plugins/usb_midi/usb_midi.png deleted file mode 100644 index 6d0ac6fed3cdb934124017206bb67c83d0b0ed31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>@$qzV43U^R zwa<|6fB^?{?v?-bKX;i-^*(VS+QBS=N5OO3*Dd-hXTFo$aV)o5dW}igTg3*Q%PPB From 9bb6405065e2adb8c4d67d044b92b623b3effa32 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 02:21:46 +0100 Subject: [PATCH 48/64] Get rid of duplicate Game (2048) --- applications/plugins/game2048/2048.png | Bin 159 -> 0 bytes applications/plugins/game2048/application.fam | 12 - applications/plugins/game2048/font.c | 155 ------ applications/plugins/game2048/font.h | 3 - applications/plugins/game2048/game_2048.c | 495 ------------------ 5 files changed, 665 deletions(-) delete mode 100644 applications/plugins/game2048/2048.png delete mode 100644 applications/plugins/game2048/application.fam delete mode 100644 applications/plugins/game2048/font.c delete mode 100644 applications/plugins/game2048/font.h delete mode 100644 applications/plugins/game2048/game_2048.c diff --git a/applications/plugins/game2048/2048.png b/applications/plugins/game2048/2048.png deleted file mode 100644 index 6f46d4de543e8ee590f58b4cd9988ee95a7196f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl}23GfMV1=9cj|Nr~<@4tWlPRVDj0P;BtJR*x382Ao?FyoGi*>8b@GM+Au xArj%q4s1O=0W2v-jTvca9V|Qn%NiOP8MwYMmt)6!PC{xWt~$(69D~ZE+YT{ diff --git a/applications/plugins/game2048/application.fam b/applications/plugins/game2048/application.fam deleted file mode 100644 index 61e474046..000000000 --- a/applications/plugins/game2048/application.fam +++ /dev/null @@ -1,12 +0,0 @@ -App( - appid="2048", - name="2048 (Original)", - apptype=FlipperAppType.EXTERNAL, - entry_point="game_2048_app", - cdefines=["APP_2048_GAME"], - requires=["gui"], - stack_size=2 * 1024, - order=10, - fap_icon="2048.png", - fap_category="Games", -) diff --git a/applications/plugins/game2048/font.c b/applications/plugins/game2048/font.c deleted file mode 100644 index 9acfe8d23..000000000 --- a/applications/plugins/game2048/font.c +++ /dev/null @@ -1,155 +0,0 @@ -#include -#include -#include - -/* 7px 3 width digit font by Sefjor - * digit encoding example - *7 ¦¦¦ 111 - *6 ¦ ¦ 101 - *5 ¦ ¦ 101 - *4 ¦ ¦ 101 - *3 ¦ ¦ 101 - *2 ¦ ¦ 101 - *1 ¦¦¦ 111 - *0 000 this string is empty, used to align - * ? ? ? - * FE 82 FE //0 - */ - -static uint8_t font[10][3] = { - {0xFE, 0x82, 0xFE}, // 0; - {0x00, 0xFE, 0x00}, // 1; - {0xF2, 0x92, 0x9E}, // 2; - {0x92, 0x92, 0xFE}, // 3; - {0x1E, 0x10, 0xFE}, // 4; - {0x9E, 0x92, 0xF2}, // 5; - {0xFE, 0x92, 0xF2}, // 6; - {0x02, 0x02, 0xFE}, // 7; - {0xFE, 0x92, 0xFE}, // 8; - {0x9E, 0x92, 0xFE}, // 9; -}; - -#define FONT_HEIGHT 8 -#define FONT_WIDTH 3 - -static void game_2048_draw_black_point(Canvas* const canvas, uint8_t x, uint8_t y) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_dot(canvas, x, y); -} - -static void game_2048_draw_white_square(Canvas* const canvas, uint8_t x, uint8_t y) { - canvas_set_color(canvas, ColorWhite); - canvas_draw_box(canvas, x, y, 15 - 1, 15 - 3); -} - -static void _game_2048_draw_column( - Canvas* const canvas, - int digit, - int coord_x, - int coord_y, - uint8_t column) { - for(int x = 0; x < FONT_HEIGHT; ++x) { - bool is_filled = (font[digit][column] >> x) & 0x1; - if(is_filled) { - game_2048_draw_black_point(canvas, coord_x, coord_y + x); - } - } -} - -static uint8_t - _game_2048_draw_digit(Canvas* const canvas, uint8_t digit, uint8_t coord_x, uint8_t coord_y) { - uint8_t x_shift = 0; - - if(digit != 1) { - for(int column = 0; column < FONT_WIDTH; column++) { - _game_2048_draw_column(canvas, digit, coord_x + column, coord_y, column); - } - x_shift = 3; - } else { - _game_2048_draw_column(canvas, digit, coord_x, coord_y, true); - x_shift = 1; - } - - return x_shift; -} - -/* We drawing text field with 1px white border - * at given coords. Total size is: - * x = 9 = 1 + 7 + 1 - * y = 1 + total text width + 1 - */ - -/* - * Returns array of digits and it's size, - * digits should be at least 4 size - * works from 1 to 9999 - */ -static void _game_2048_parse_number(uint16_t number, uint8_t* digits, uint8_t* size) { - *size = 0; - uint16_t divider = 1000; - //find first digit, result is highest divider - while(number / divider == 0) { - divider /= 10; - if(divider == 0) { - break; - } - } - - for(int i = 0; divider != 0; i++) { - digits[i] = number / divider; - number %= divider; - *size += 1; - divider /= 10; - } -} - -uint8_t _game_2048_calculate_shift(uint16_t num) { - uint8_t shift = 0; - switch(num) { - case 1: - shift = 7; - break; - case 2: - case 4: - case 8: - shift = 6; - break; - case 16: - shift = 5; - break; - case 32: - case 64: - shift = 4; - break; - case 128: - shift = 3; - break; - case 256: - shift = 2; - break; - case 512: - shift = 3; - break; - case 1024: - shift = 2; - break; - } - return shift; -} - -void game_2048_draw_number(Canvas* const canvas, uint8_t x, uint8_t y, int number) { - uint8_t digits[4]; - uint8_t size; - - _game_2048_parse_number(number, digits, &size); - if(number > 512) { - game_2048_draw_white_square(canvas, x, y); - } - - x += _game_2048_calculate_shift(number); - y += 4; - for(int i = 0; i < size; ++i) { - x += _game_2048_draw_digit(canvas, digits[i], x, y); - x++; - } -} \ No newline at end of file diff --git a/applications/plugins/game2048/font.h b/applications/plugins/game2048/font.h deleted file mode 100644 index 500123ac3..000000000 --- a/applications/plugins/game2048/font.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -void game_2048_draw_number(Canvas* const canvas, uint8_t x, uint8_t y, int number); \ No newline at end of file diff --git a/applications/plugins/game2048/game_2048.c b/applications/plugins/game2048/game_2048.c deleted file mode 100644 index 706b95ce5..000000000 --- a/applications/plugins/game2048/game_2048.c +++ /dev/null @@ -1,495 +0,0 @@ -#include -#include -#include -#include -#include - -#include "font.h" - -#define DEBUG false -/* - 0 empty - 1 2 - 2 4 - 3 8 - 4 16 - 5 32 - 6 64 - 7 128 - 8 256 - 9 512 -10 1024 -11 2048 -12 4096 -... - */ -typedef uint8_t cell_state; - -/* DirectionLeft <-- -┌╌╌╌╌â”┌╌╌╌╌â”┌╌╌╌╌â”┌╌╌╌╌┠-╎ ╎╎ ╎╎ ╎╎ ╎ -└╌╌╌╌┘└╌╌╌╌┘└╌╌╌╌┘└╌╌╌╌┘ -┌╌╌╌╌â”┌╌╌╌╌â”┌╌╌╌╌â”┌╌╌╌╌┠-╎ ╎╎ ╎╎ ╎╎ ╎ -└╌╌╌╌┘└╌╌╌╌┘└╌╌╌╌┘└╌╌╌╌┘ -┌╌╌┌╌╌╌╌â”╌╌â”┌╌╌╌╌â”┌╌╌╌╌┠-╎ 2╎ 2 ╎ ╎╎ ╎╎ ╎ -└╌╌└╌╌╌╌┘╌╌┘└╌╌╌╌┘└╌╌╌╌┘ -┌╌╌┌╌╌╌╌â”┌╌╌┌╌╌╌╌â”┌╌╌╌╌┠-╎ 4╎ 4 ╎╎ 2╎ 2 ╎╎ ╎ -└╌╌└╌╌╌╌┘└╌╌└╌╌╌╌┘└╌╌╌╌┘ -*/ -typedef enum { - DirectionIdle, - DirectionUp, - DirectionRight, - DirectionDown, - DirectionLeft, -} Direction; - -typedef struct { - uint8_t y; // 0 <= y <= 3 - uint8_t x; // 0 <= x <= 3 -} Point; - -typedef struct { - uint32_t gameScore; - uint32_t highScore; -} Score; - -typedef struct { - /* - +----X - | - | field[x][y] - Y - */ - uint8_t field[4][4]; - - uint8_t next_field[4][4]; - - Score score; // original scoring - - Direction direction; - /* - field { - animation-timing-function: linear; - animation-duration: 300ms; - } - */ - uint32_t animation_start_ticks; - - Point keyframe_from[4][4]; - - Point keyframe_to[4][4]; - - bool debug; - -} GameState; - -#define XtoPx(x) (33 + x * 15) - -#define YtoPx(x) (1 + y * 15) - -static void game_2048_render_callback(Canvas* const canvas, ValueMutex* const vm) { - const GameState* game_state = acquire_mutex(vm, 25); - if(game_state == NULL) { - return; - } - - // Before the function is called, the state is set with the canvas_reset(canvas) - - if(game_state->direction == DirectionIdle) { - for(uint8_t y = 0; y < 4; y++) { - for(uint8_t x = 0; x < 4; x++) { - uint8_t field = game_state->field[y][x]; - canvas_set_color(canvas, ColorBlack); - canvas_draw_frame(canvas, XtoPx(x), YtoPx(y), 16, 16); - if(field != 0) { - game_2048_draw_number(canvas, XtoPx(x), YtoPx(y), 1 << field); - } - } - } - - // display score - char buffer[12]; - snprintf(buffer, sizeof(buffer), "%lu", game_state->score.gameScore); - canvas_draw_str_aligned(canvas, 127, 8, AlignRight, AlignBottom, buffer); - - if(game_state->score.highScore > 0) { - char buffer2[12]; - snprintf(buffer2, sizeof(buffer2), "%lu", game_state->score.highScore); - canvas_draw_str_aligned(canvas, 127, 62, AlignRight, AlignBottom, buffer2); - } - } else { // if animation - // for animation - // (osKernelGetSysTimerCount() - game_state->animation_start_ticks) / osKernelGetSysTimerFreq(); - - // TODO: end animation event/callback/set AnimationIdle - } - - release_mutex(vm, game_state); -} - -static void - game_2048_input_callback(const InputEvent* const input_event, FuriMessageQueue* event_queue) { - furi_assert(event_queue); - - furi_message_queue_put(event_queue, input_event, FuriWaitForever); -} - -// if return false then Game Over -static bool game_2048_set_new_number(GameState* const game_state) { - uint8_t empty = 0; - for(uint8_t y = 0; y < 4; y++) { - for(uint8_t x = 0; x < 4; x++) { - if(game_state->field[y][x] == 0) { - empty++; - } - } - } - - if(empty == 0) { - return false; - } - - if(empty == 1) { - // If it is 1 move before losing, we help the player and get rid of randomness. - for(uint8_t y = 0; y < 4; y++) { - for(uint8_t x = 0; x < 4; x++) { - if(game_state->field[y][x] == 0) { - bool haveFour = - // +----X - // | - // | field[x][y], 0 <= x, y <= 3 - // Y - - // up == 4 or - (y > 0 && game_state->field[y - 1][x] == 2) || - // right == 4 or - (x < 3 && game_state->field[y][x + 1] == 2) || - // down == 4 - (y < 3 && game_state->field[y + 1][x] == 2) || - // left == 4 - (x > 0 && game_state->field[y][x - 1] == 2); - - if(haveFour) { - game_state->field[y][x] = 2; - return true; - } - - game_state->field[y][x] = 1; - return true; - } - } - } - } - - uint8_t target = rand() % empty; - uint8_t twoOrFore = rand() % 4 < 3; - for(uint8_t y = 0; y < 4; y++) { - for(uint8_t x = 0; x < 4; x++) { - if(game_state->field[y][x] == 0) { - if(target == 0) { - if(twoOrFore) { - game_state->field[y][x] = 1; // 2^1 == 2 75% - } else { - game_state->field[y][x] = 2; // 2^2 == 4 25% - } - goto exit; - } - target--; - } - } - } -exit: - return true; -} - -// static void game_2048_process_row(uint8_t before[4], uint8_t *(after[4])) { -// // move 1 row left. -// for(uint8_t i = 0; i <= 2; i++) { -// if(before[i] != 0 && before[i] == before[i + 1]) { -// before[i]++; -// before[i + 1] = 0; -// i++; -// } -// } -// for(uint8_t i = 0, j = 0; i <= 3; i++) { -// if (before[i] != 0) { -// before[j] = before[i]; -// i++; -// } -// } -// } - -static void game_2048_process_move(GameState* const game_state) { - memset(game_state->next_field, 0, sizeof(game_state->next_field)); - // +----X - // | - // | field[x][y], 0 <= x, y <= 3 - // Y - - // up - if(game_state->direction == DirectionUp) { - for(uint8_t x = 0; x < 4; x++) { - uint8_t next_y = 0; - for(int8_t y = 0; y < 4; y++) { - uint8_t field = game_state->field[y][x]; - if(field == 0) { - continue; - } - - if(game_state->next_field[next_y][x] == 0) { - game_state->next_field[next_y][x] = field; - continue; - } - - if(field == game_state->next_field[next_y][x]) { - game_state->next_field[next_y][x]++; - game_state->score.gameScore += pow(2, game_state->next_field[next_y][x]); - if(game_state->next_field[next_y][x] == 11 && !game_state->debug) { - DOLPHIN_DEED(getRandomDeed()); - } // get some xp for making a 2048 tile - next_y++; - continue; - } - - next_y++; - game_state->next_field[next_y][x] = field; - } - } - } - - // right - if(game_state->direction == DirectionRight) { - for(uint8_t y = 0; y < 4; y++) { - uint8_t next_x = 3; - for(int8_t x = 3; x >= 0; x--) { - uint8_t field = game_state->field[y][x]; - if(field == 0) { - continue; - } - - if(game_state->next_field[y][next_x] == 0) { - game_state->next_field[y][next_x] = field; - continue; - } - - if(field == game_state->next_field[y][next_x]) { - game_state->next_field[y][next_x]++; - game_state->score.gameScore += pow(2, game_state->next_field[y][next_x]); - if(game_state->next_field[y][next_x] == 11 && !game_state->debug) { - DOLPHIN_DEED(getRandomDeed()); - } // get some xp for making a 2048 tile - next_x--; - continue; - } - - next_x--; - game_state->next_field[y][next_x] = field; - } - } - } - - // down - if(game_state->direction == DirectionDown) { - for(uint8_t x = 0; x < 4; x++) { - uint8_t next_y = 3; - for(int8_t y = 3; y >= 0; y--) { - uint8_t field = game_state->field[y][x]; - if(field == 0) { - continue; - } - - if(game_state->next_field[next_y][x] == 0) { - game_state->next_field[next_y][x] = field; - continue; - } - - if(field == game_state->next_field[next_y][x]) { - game_state->next_field[next_y][x]++; - game_state->score.gameScore += pow(2, game_state->next_field[next_y][x]); - if(game_state->next_field[next_y][x] == 11 && !game_state->debug) { - DOLPHIN_DEED(getRandomDeed()); - } // get some xp for making a 2048 tile - next_y--; - continue; - } - - next_y--; - game_state->next_field[next_y][x] = field; - } - } - } - - // 0, 0, 1, 1 - // 1, 0, 0, 0 - - // left - if(game_state->direction == DirectionLeft) { - for(uint8_t y = 0; y < 4; y++) { - uint8_t next_x = 0; - for(uint8_t x = 0; x < 4; x++) { - uint8_t field = game_state->field[y][x]; - if(field == 0) { - continue; - } - - if(game_state->next_field[y][next_x] == 0) { - game_state->next_field[y][next_x] = field; - continue; - } - - if(field == game_state->next_field[y][next_x]) { - game_state->next_field[y][next_x]++; - game_state->score.gameScore += pow(2, game_state->next_field[y][next_x]); - if(game_state->next_field[y][next_x] == 11 && !game_state->debug) { - DOLPHIN_DEED(getRandomDeed()); - } // get some xp for making a 2048 tile - next_x++; - continue; - } - - next_x++; - game_state->next_field[y][next_x] = field; - } - } - } - - // - game_state->direction = DirectionIdle; - memcpy(game_state->field, game_state->next_field, sizeof(game_state->field)); - // -} - -static void game_2048_restart(GameState* const game_state) { - game_state->debug = DEBUG; - - // check score - if(game_state->score.gameScore > game_state->score.highScore) { - game_state->score.highScore = game_state->score.gameScore; - } - - // clear all cells - for(uint8_t y = 0; y < 4; y++) { - for(uint8_t x = 0; x < 4; x++) { - game_state->field[y][x] = 0; - } - } - - // start next game - game_state->score.gameScore = 0; - game_2048_set_new_number(game_state); - game_2048_set_new_number(game_state); -} - -int32_t game_2048_app(void* p) { - UNUSED(p); - int32_t return_code = 0; - - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); - - GameState* game_state = malloc(sizeof(GameState)); - - ValueMutex state_mutex; - if(!init_mutex(&state_mutex, game_state, sizeof(GameState))) { - return_code = 255; - goto free_and_exit; - } - - ViewPort* view_port = view_port_alloc(); - view_port_draw_callback_set( - view_port, (ViewPortDrawCallback)game_2048_render_callback, &state_mutex); - view_port_input_callback_set( - view_port, (ViewPortInputCallback)game_2048_input_callback, event_queue); - - Gui* gui = furi_record_open(RECORD_GUI); - gui_add_view_port(gui, view_port, GuiLayerFullscreen); - - game_state->direction = DirectionIdle; - game_2048_restart(game_state); - - if(game_state->debug) { - game_state->field[0][0] = 0; - game_state->field[0][1] = 0; - game_state->field[0][2] = 0; - game_state->field[0][3] = 0; - - game_state->field[1][0] = 1; - game_state->field[1][1] = 2; - game_state->field[1][2] = 3; - game_state->field[1][3] = 4; - - game_state->field[2][0] = 5; - game_state->field[2][1] = 6; - game_state->field[2][2] = 7; - game_state->field[2][3] = 8; - - game_state->field[3][0] = 9; - game_state->field[3][1] = 10; - game_state->field[3][2] = 11; - game_state->field[3][3] = 12; - } - - InputEvent event; - for(bool loop = true; loop;) { - FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); - GameState* game_state = (GameState*)acquire_mutex_block(&state_mutex); - - if(event_status == FuriStatusOk) { - if(event.type == InputTypeShort) { - switch(event.key) { - case InputKeyUp: - game_state->direction = DirectionUp; - game_2048_process_move(game_state); - game_2048_set_new_number(game_state); - break; - case InputKeyDown: - game_state->direction = DirectionDown; - game_2048_process_move(game_state); - game_2048_set_new_number(game_state); - break; - case InputKeyRight: - game_state->direction = DirectionRight; - game_2048_process_move(game_state); - game_2048_set_new_number(game_state); - break; - case InputKeyLeft: - game_state->direction = DirectionLeft; - game_2048_process_move(game_state); - game_2048_set_new_number(game_state); - break; - case InputKeyOk: - game_state->direction = DirectionIdle; - break; - case InputKeyBack: - loop = false; - break; - default: - break; - } - } else if(event.type == InputTypeLong) { - if(event.key == InputKeyOk) { - game_state->direction = DirectionIdle; - game_2048_restart(game_state); - } - } - } - - view_port_update(view_port); - release_mutex(&state_mutex, game_state); - } - - view_port_enabled_set(view_port, false); - gui_remove_view_port(gui, view_port); - furi_record_close(RECORD_GUI); - view_port_free(view_port); - delete_mutex(&state_mutex); - -free_and_exit: - free(game_state); - furi_message_queue_free(event_queue); - - return return_code; -} \ No newline at end of file From ca0fd8e871dd5e187cd626d2e69f08af2873a1f8 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 02:25:17 +0100 Subject: [PATCH 49/64] Update GPIO module descriptors --- applications/plugins/flashlight/application.fam | 2 +- applications/plugins/rc2014_coleco/application.fam | 2 +- applications/plugins/signal_generator/application.fam | 2 +- applications/plugins/unitemp/application.fam | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/plugins/flashlight/application.fam b/applications/plugins/flashlight/application.fam index d6d5aa791..368e14833 100644 --- a/applications/plugins/flashlight/application.fam +++ b/applications/plugins/flashlight/application.fam @@ -1,6 +1,6 @@ App( appid="Flashlight", - name="Flashlight", + name="[GPIO] Flashlight", apptype=FlipperAppType.EXTERNAL, entry_point="flashlight_app", cdefines=["APP_FLASHLIGHT"], diff --git a/applications/plugins/rc2014_coleco/application.fam b/applications/plugins/rc2014_coleco/application.fam index 2a3900e19..6856b716b 100644 --- a/applications/plugins/rc2014_coleco/application.fam +++ b/applications/plugins/rc2014_coleco/application.fam @@ -1,6 +1,6 @@ App( appid="RC2014_Coleco", - name="RC2014 ColecoVision", + name="[RC2014] ColecoVision", apptype=FlipperAppType.EXTERNAL, entry_point="coleco_app", cdefines=["APP_COLECO"], diff --git a/applications/plugins/signal_generator/application.fam b/applications/plugins/signal_generator/application.fam index 7d9d181ec..133319cf4 100644 --- a/applications/plugins/signal_generator/application.fam +++ b/applications/plugins/signal_generator/application.fam @@ -1,6 +1,6 @@ App( appid="Signal_Generator", - name="Signal Generator", + name="[GPIO] Signal Generator", apptype=FlipperAppType.EXTERNAL, entry_point="signal_gen_app", cdefines=["APP_SIGNAL_GEN"], diff --git a/applications/plugins/unitemp/application.fam b/applications/plugins/unitemp/application.fam index 4fc9472cc..3ac128eef 100644 --- a/applications/plugins/unitemp/application.fam +++ b/applications/plugins/unitemp/application.fam @@ -1,6 +1,6 @@ App( appid="unitemp", - name="Unitemp", + name="[GPIO] Unitemp", apptype=FlipperAppType.EXTERNAL, entry_point="unitemp_app", cdefines=["UNITEMP_APP"], From 44ecda161acc341f987e0ae385b9ca203c2423e0 Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 02:32:35 +0100 Subject: [PATCH 50/64] Added NFSW mode to unitemp application --- .../plugins/unitemp/assets/sherlok_53x45.png | Bin 695 -> 2382 bytes .../unitemp/assets/sherlok_53x45_sfw.png | Bin 0 -> 695 bytes .../plugins/unitemp/views/General_view.c | 11 ++++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 applications/plugins/unitemp/assets/sherlok_53x45_sfw.png diff --git a/applications/plugins/unitemp/assets/sherlok_53x45.png b/applications/plugins/unitemp/assets/sherlok_53x45.png index 1f258737e351cc742771d8ddaa160184670cbad4..65571203eb5d8ec43473b5b2f8a6998320aa19b2 100644 GIT binary patch literal 2382 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 ALI3~& diff --git a/applications/plugins/unitemp/assets/sherlok_53x45_sfw.png b/applications/plugins/unitemp/assets/sherlok_53x45_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..1f258737e351cc742771d8ddaa160184670cbad4 GIT binary patch literal 695 zcmV;o0!aOdP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0!&FnK~!i%-Ia}w z;xG(^;okq9cNw&U=DfCJI{}XSq=+{0&rDsF>(`CTVXoKf&sEG5+CDgDN{yf-?!D67 zxA7<0Hbrrn0g@R7n^GS9`T1=FAr!eQhBa7om(iqXCL@a3$*t0!)NaEHsE5&lg3z zQ>y0JI2y3Ix?io`niPuaIst1zEQRaR{VL^2={1S=I%xfjOot^jrO8<#8wa9TMPqpl zY_2`iei6rBKQ>!6R64PQ#xlyE^sEqLB38LosggJ)MV8h=h;J8v3kfy{-<^X zS|C=}gtn=jX0Kv2snulc`DBvFnZ5xnQ*3l%Qad$}n;CBXPenpBu7k}}DPAqBC!#&6 z2sWxN=2X!fUPqKnp$G*~6c@0KR$}eB*5TTr^!kygnHLw7y~A^@$9UVr+s|qP*VIas z62(^cRV=VMJjcFXXN*4SiZ+|znb0+1+f;;S7WdIp#=dvPy)4&q#1xuMpQ;s$Yh515 z$@(3glx<{1+575)U>+X;SCs$jL!p7@XbE$f=QXuw)gFlVV!i#pOxb{_Py~e%FSioo zk!i7KkJryj!o3xd!F>GMT13yH7)xfz~eqoR!ycNJY&;39eq#x zp8{xP*97Ew4+waMpK9tPo-yA4+P|$^e0{X<#u}hm)%Y=!A{5VG8d9?#XR5+Sn~J9O dA5Q9W`3ATiP9a&X@v#5^002ovPDHLkV1h6FKidER literal 0 HcmV?d00001 diff --git a/applications/plugins/unitemp/views/General_view.c b/applications/plugins/unitemp/views/General_view.c index e21b04de2..b48349bdd 100644 --- a/applications/plugins/unitemp/views/General_view.c +++ b/applications/plugins/unitemp/views/General_view.c @@ -19,6 +19,7 @@ #include "unitemp_icons.h" #include +#include "../../../settings/desktop_settings/desktop_settings_app.h" static View* view; @@ -169,7 +170,14 @@ static void _draw_singleSensor(Canvas* canvas, Sensor* sensor, const uint8_t pos } static void _draw_view_noSensors(Canvas* canvas) { - canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x45); + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); + if (settings->sfw_mode) { + canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x45_sfw); + } + else { + canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x45); + } //РиÑование рамки canvas_draw_rframe(canvas, 0, 0, 128, 63, 7); canvas_draw_rframe(canvas, 0, 0, 128, 64, 7); @@ -184,6 +192,7 @@ static void _draw_view_noSensors(Canvas* canvas) { canvas_draw_str(canvas, x, y + 18, "press OK"); canvas_draw_icon(canvas, x + 37, y + 10, &I_Ok_btn_9x9); + free(settings); } static void _draw_view_sensorsList(Canvas* canvas) { From 049912611954317d6988b6369d9aba8d9871063c Mon Sep 17 00:00:00 2001 From: jbohack Date: Tue, 10 Jan 2023 21:08:41 -0500 Subject: [PATCH 51/64] readded WiiEC icon --- applications/plugins/wii_ec_anal/WiiEC.png | Bin 0 -> 116 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 applications/plugins/wii_ec_anal/WiiEC.png diff --git a/applications/plugins/wii_ec_anal/WiiEC.png b/applications/plugins/wii_ec_anal/WiiEC.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1afcb0cdf4edb2b6ed8877a7f4abee7cc18eef GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihsko;mLT)4~l} zNhv8QPR|xh! O7zR&QKbLh*2~7YOV Date: Tue, 10 Jan 2023 21:27:03 -0500 Subject: [PATCH 52/64] modified levelup animations, added sfw levelups, and changed framerates --- .../desktop/animations/animation_manager.c | 21 +++++++++++++----- .../Animations/Levelup1_128x64/frame_10.png | Bin 2091 -> 984 bytes .../frame_11.png} | Bin .../frame_12.png} | Bin .../frame_13.png} | Bin .../frame_14.png} | Bin .../frame_15.png} | Bin .../frame_16.png} | Bin .../frame_17.png} | Bin .../frame_18.png} | Bin .../frame_19.png} | Bin .../Animations/Levelup1_128x64/frame_20.png | Bin 0 -> 1071 bytes .../Animations/Levelup1_128x64/frame_21.png | Bin 0 -> 1151 bytes .../Animations/Levelup1_128x64/frame_22.png | Bin 0 -> 1008 bytes .../frame_23.png} | Bin .../Animations/Levelup1_128x64/frame_24.png | Bin 0 -> 1029 bytes .../Animations/Levelup1_128x64/frame_25.png | Bin 0 -> 1028 bytes .../Animations/Levelup1_128x64/frame_26.png | Bin 0 -> 961 bytes .../Animations/Levelup1_128x64/frame_27.png | Bin 0 -> 1109 bytes .../Animations/Levelup1_128x64/frame_28.png | Bin 0 -> 1004 bytes .../Animations/Levelup1_128x64/frame_29.png | Bin 0 -> 1080 bytes .../Animations/Levelup1_128x64/frame_30.png | Bin 0 -> 984 bytes .../frame_31.png} | Bin .../Animations/Levelup1_128x64/frame_rate | 2 +- .../Levelup1_128x64_sfw/frame_00.png | Bin 0 -> 1326 bytes .../Levelup1_128x64_sfw/frame_01.png | Bin 0 -> 1597 bytes .../Levelup1_128x64_sfw/frame_02.png | Bin 0 -> 1754 bytes .../Levelup1_128x64_sfw/frame_03.png | Bin 0 -> 1828 bytes .../Levelup1_128x64_sfw/frame_04.png | Bin 0 -> 1686 bytes .../Levelup1_128x64_sfw/frame_05.png | Bin 0 -> 1672 bytes .../Levelup1_128x64_sfw/frame_06.png | Bin 0 -> 1659 bytes .../Levelup1_128x64_sfw/frame_07.png | Bin 0 -> 1540 bytes .../Levelup1_128x64_sfw/frame_08.png | Bin 0 -> 1557 bytes .../Levelup1_128x64_sfw/frame_09.png | Bin 0 -> 1551 bytes .../Levelup1_128x64_sfw/frame_10.png | Bin 0 -> 1604 bytes .../frame_rate | 0 .../Levelup2_128x64_sfw/frame_00.png | Bin 0 -> 1368 bytes .../Levelup2_128x64_sfw/frame_01.png | Bin 0 -> 1632 bytes .../Levelup2_128x64_sfw/frame_02.png | Bin 0 -> 1812 bytes .../Levelup2_128x64_sfw/frame_03.png | Bin 0 -> 1860 bytes .../Levelup2_128x64_sfw/frame_04.png | Bin 0 -> 1700 bytes .../Levelup2_128x64_sfw/frame_05.png | Bin 0 -> 1725 bytes .../Levelup2_128x64_sfw/frame_06.png | Bin 0 -> 1684 bytes .../Levelup2_128x64_sfw/frame_07.png | Bin 0 -> 1590 bytes .../Levelup2_128x64_sfw/frame_08.png | Bin 0 -> 1598 bytes .../Levelup2_128x64_sfw/frame_09.png | Bin 0 -> 1604 bytes .../Levelup2_128x64_sfw/frame_10.png | Bin 0 -> 1612 bytes .../Animations/Levelup2_128x64_sfw/frame_rate | 1 + 48 files changed, 18 insertions(+), 6 deletions(-) rename assets/icons/Animations/{Levelup2_128x64/frame_04.png => Levelup1_128x64/frame_11.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_05.png => Levelup1_128x64/frame_12.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_06.png => Levelup1_128x64/frame_13.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_07.png => Levelup1_128x64/frame_14.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_08.png => Levelup1_128x64/frame_15.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_09.png => Levelup1_128x64/frame_16.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_00.png => Levelup1_128x64/frame_17.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_01.png => Levelup1_128x64/frame_18.png} (100%) rename assets/icons/Animations/{Levelup2_128x64/frame_02.png => Levelup1_128x64/frame_19.png} (100%) create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_20.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_21.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_22.png rename assets/icons/Animations/{Levelup2_128x64/frame_03.png => Levelup1_128x64/frame_23.png} (100%) create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_24.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_25.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_26.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_27.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_28.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_29.png create mode 100644 assets/icons/Animations/Levelup1_128x64/frame_30.png rename assets/icons/Animations/{Levelup2_128x64/frame_10.png => Levelup1_128x64/frame_31.png} (100%) create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_00.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_01.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_02.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_03.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_04.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_05.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_06.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_07.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_08.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_09.png create mode 100644 assets/icons/Animations/Levelup1_128x64_sfw/frame_10.png rename assets/icons/Animations/{Levelup2_128x64 => Levelup1_128x64_sfw}/frame_rate (100%) create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_00.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_01.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_02.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_03.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_04.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_05.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_06.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_07.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_08.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_09.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_10.png create mode 100644 assets/icons/Animations/Levelup2_128x64_sfw/frame_rate diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index 9fe415ca9..041ef2d11 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -13,6 +13,8 @@ #include "animation_storage.h" #include "animation_manager.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" + #define TAG "AnimationManager" #define HARDCODED_ANIMATION_NAME "thank_you_128x64" @@ -544,6 +546,8 @@ static void animation_manager_switch_to_one_shot_view(AnimationManager* animatio Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); DolphinStats stats = dolphin_stats(dolphin); furi_record_close(RECORD_DOLPHIN); + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); animation_manager->one_shot_view = one_shot_view_alloc(); one_shot_view_set_interact_callback( @@ -552,13 +556,20 @@ static void animation_manager_switch_to_one_shot_view(AnimationManager* animatio 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 <= 20) { + if (settings->sfw_mode) { one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup1_128x64); - } else if(stats.level >= 21) { - one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup2_128x64); - } else { - furi_assert(0); + }else { + if (stats.level <= 20) { + one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup1_128x64_sfw); + } + else if (stats.level >= 21) { + one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup2_128x64_sfw); + } + else { + furi_assert(0); + } } + free(settings); } static void animation_manager_switch_to_animation_view(AnimationManager* animation_manager) { diff --git a/assets/icons/Animations/Levelup1_128x64/frame_10.png b/assets/icons/Animations/Levelup1_128x64/frame_10.png index 1fd028cff573f60f5f52ccb45c8ef78c44ab45e0..e4576c8643347bfb4d86a485809b0f71c1db771a 100644 GIT binary patch literal 984 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 VH+Qd@rilOm002ovPDHLkV1nhs($D|^ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_04.png b/assets/icons/Animations/Levelup1_128x64/frame_11.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_04.png rename to assets/icons/Animations/Levelup1_128x64/frame_11.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_05.png b/assets/icons/Animations/Levelup1_128x64/frame_12.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_05.png rename to assets/icons/Animations/Levelup1_128x64/frame_12.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_06.png b/assets/icons/Animations/Levelup1_128x64/frame_13.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_06.png rename to assets/icons/Animations/Levelup1_128x64/frame_13.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_07.png b/assets/icons/Animations/Levelup1_128x64/frame_14.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_07.png rename to assets/icons/Animations/Levelup1_128x64/frame_14.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_08.png b/assets/icons/Animations/Levelup1_128x64/frame_15.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_08.png rename to assets/icons/Animations/Levelup1_128x64/frame_15.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_09.png b/assets/icons/Animations/Levelup1_128x64/frame_16.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_09.png rename to assets/icons/Animations/Levelup1_128x64/frame_16.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_00.png b/assets/icons/Animations/Levelup1_128x64/frame_17.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_00.png rename to assets/icons/Animations/Levelup1_128x64/frame_17.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_01.png b/assets/icons/Animations/Levelup1_128x64/frame_18.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_01.png rename to assets/icons/Animations/Levelup1_128x64/frame_18.png diff --git a/assets/icons/Animations/Levelup2_128x64/frame_02.png b/assets/icons/Animations/Levelup1_128x64/frame_19.png similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_02.png rename to assets/icons/Animations/Levelup1_128x64/frame_19.png diff --git a/assets/icons/Animations/Levelup1_128x64/frame_20.png b/assets/icons/Animations/Levelup1_128x64/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..a6589b0c7c4d1672fa7a31dfeae856d298b4a865 GIT binary patch literal 1071 zcmV+~1kn3ONk%w1VSoTY0J{JH0002R#l`FE>!zlrs;a7si;Kg_CX>@2HWqN06W-eoIZ6HTUMj&lrYh`i` z3IHqs0001h06+i$1pg4oNvplM7Fv1-+Z1}^6@ucIt!(SQ?}>8sESk41!+h_%g~LQa zImk*ijYxP3{+`gNLMR~?kv7S$y3|pl;4o`C^hk`_lxhpGf|vybTTG{uxfN?uX>mK} zb%9|rZWBgFhHW@$S%Qv(9aAKR3WX$aG6!-hjgOw6bYGyOq@|{(sHv)}tgWuEurLRr zv9(YK4wVeHygUaCxdaOV1G~M)7{3k;0|^1o#Ky?TvkVH%!_d$Tw9~Q53Io~11kTS3 z3Jl%ethfyX1KQ*b=EMU7>FeyK?(y>H_p;rCHlTq6efvIH^Y^czLwxEImU2MAp~Z^? z4jP)pQKA?J4F4~Rl!woO$p$D<-tqVZKq;}AI^jKwDm9q`tN{=R7|9gofQkXQcD29&tvms6t&)wm zKFe4WKt}!@*|#BJ8RO?6bmS|2gG5z%F0_Z7+&N;7}{yLYF51 z6?zsiVr>K#cU54unE}&|Pcpt< zq69SXUjIl7yk{SC(U|7|N%aJ-~bUyI9y2G88D1% z%x!p?16U1&p@@(XM+}4}1`uF?8s;a}0pl&j5CI{=NFhN8DX9d{c%`-H00Y(tm_VO} zy{0EU60Qf9n-XzU4NiwbgARNKJdh5kz$kF$q+(JSB%U1tYThsKoHbK`0=7qh0wyT{ zq`rg{3YXij2{5%KU{o18pR6~!2Vs#g<|gg0xoH>Zj^P;UB0=ss_iMN)(b^tS)*|PT zChFevC#|I3sh3~4S|cMg1e|*mMfn=~PdV?7DIc@f)JKf4)-k|L!p6$>tiMv$S?k4L zR%Wk9AYrWUVb5_4*QmwHM72son!zlrs;a7si;D~l43m?S!^6YllnN98N>3M?tJh6zZ;H4 z9Lj7*qY%h!I(-GhNI^0PYekhzdW$~4;IKj}qE@j+(XzZ%lEd&gZ#;F0tm>R@4KTyF z1qys}goJc#C1zb(CVpOng^_VWej`>_mVHQhX_B6kEn_s63Y9c~LI#35ou96+gm193 zw6(UkDGmey1hPE_4hsqghq%T}4hI1N0}DUE3Iqeoy~ox*2Fl9~&c6x+4a?NN*X1M0 z;>!oY3+?R&@Bju2yXorW=GWQwywU^U{|*paa3CDN00;2pGlq`ew1WW}7!=1~0E2N0 z&F!OhG2%mr_Wltd5UyHAYpTTm4H&r%B*>M!5}vfS;9-M*A6-Jc8LrsOTJv)19GY%` z&!4bV)g#JO5}R}nOHy3Bl^!}S(it{#?i%;t681g)J9t1 z6{OpjLivG}3x{pG1b_tyu-9NINW%vQIN%#c0ad|}2iqg5^DM}{jGt%|7g;brX*&(( zoxC{n6Rq|lJ466F@iNPayP0l6_aNZJ30Om+;>+00}LQ=fN{A^lhc0yqM!g-|BTmJb=&>Z00PJnKpp}(i9=z9 zjSwXbbsIvKTZhImZ~%)hE_EV`BwRQY0U);6*?l}7$Kr^aIfvsEDr)FsWVt=)BXZ&d zcchLw5uoIfkTnRwlKVv@+mR(KkR+BHHpnDkfbqyndtj2_0C?va*W!>*5}<%P3Rs6g zTy2_Q0Gzw@xM5&RCa{hJ!SE=Jk$wK@k~CH_$yzjIB3H_T4`jz^o6-F?(sTWo^$n9HgGOF5fP zVW>W!Z@Y7X8ZNvK$=m2O&X%aseyA=}ppW)3oL<1#itr{*6o&+&eT2SCBtZ~IOpmG* zd$pg&Wp0OPyb;ecEXA-X>@Jos;`EeO%Fe3_%Lc0?Xt6a?Ohq=UMhrkQIOqHtj|dLh z;CwinK@hLK)>O1e&5p!cwDgViFwR%CBeXnQ7fl&q1v+?fssc?-z+&+Tt;^InAx4cr z0zqJRb_ImZ@>5^S^9|f0(Wi%-$ifQ=i7h>BoqUGw{SoU1Ox&%0X0Y6I8N$L RB;%qqOs@9?-qwTw06Y1u0uKNH literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64/frame_22.png b/assets/icons/Animations/Levelup1_128x64/frame_22.png new file mode 100644 index 0000000000000000000000000000000000000000..19a5121a94410868eb1172b4642f8f1d51a17948 GIT binary patch literal 1008 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64/frame_27.png b/assets/icons/Animations/Levelup1_128x64/frame_27.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c826438232d81c98daf755105ca245fa37c568 GIT binary patch literal 1109 zcmV-b1giT-Nk%v~VSoTY0J{JH00020s;a%cz3c1i!^6Xkjg4GfT#Ji~3=9n8;+L&#>%Q-a za`Y^kw=Khb@4E-Yq(DK)N;Qp0cnbcW&}cy@Ar_G~$*#K8QKR56YdZ8ujM|iH3$TKi zhXPwnr<1uAYg1`)JLh$QVKQzLMn{HiIB8jej)NUjB!&frBychaaw?6Fo}YAIprfRv zrl%PT1p;?32nz<4t*EpxngId=2ClHHxwEyw8MgtryDbO?xdhCtqQcNctIPzfum;!$ z3kci*$+b2r&F=ozFZ(Z7k+OyaP~Oama%N9D%5W|lO3mR=e?c7*FnTnKs+>!yF>?wus#60zt3pACwX4UH zCv}Mp^b@L9uedbATn3Zs+83%6hD*SAz_^F3p6XmRcfs8-NvRE3y!fwE!Y3KdwR?D2 zfrkVbH-?*0FxR-AAr>%P`Nx8WxD+rR=T#wOndCwPK32NNNPhta3dAg6+-txRWf$97 zn@2LVnBfl3oFH(~Uk%byE`COC%zgq?4^YtHcU)h%OoF8DLX&dk0UEeVz*s>g&+oG% z2RxlR0@S#H^J@@2fqU@F=}g5OL$4WF+eql?$DU@Z z1?CO`2^6y#K*d;CngLCnG!2Iwj`LtH4r=EjWF}UIqHqprv>}U{DbSf;+BH_tP2-Wr z0*VTUsZn+d~Ra%LoR9Z%v}GV=iE}dBJ^2dKe{>EGE#v0)#G*+bT7dM$BNWFgfFrWrhe(13}3WmY&{N zH&_Ae`PZE`C~CQ*Km>HR3Y(Z-fZ}KLfe25bhL+hQGY%A>o&cz(TEVK1J;h1@3ebs7 z0Dy|RjsySXs_O*2_DbOYWp5Q5X_^e>xvT`uauuHd4IoR6w6gl;j1l(_SF}M?)6hhyy!sqltK!S+TfPpPSwu8*PbTueCedQZ@3-8 z(+;`1#=<~5Bo3Dy#XNF%8KDf|87~FcsPeE>>45BHXFL6bajM+>w6aqmg1pYQYN4ZS z!yF6D6{QOXx=+w10}#uln8qS>XTWI`lvV{*Qu4zL7zWG9MHqm~!_J*`Cy31zz`)sG z(`#5aTuY!b*iegh_Sx>tef7g&wQY#aa0B?&+*Z%cH-ro@jcLGe!|YW92Aquz1CL_^ bcK|<^n|9*SsrQ%);MqKWIfOHV5&-}^wUQ0# literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64/frame_28.png b/assets/icons/Animations/Levelup1_128x64/frame_28.png new file mode 100644 index 0000000000000000000000000000000000000000..79a86e03e1fdec65d54ffbb9cd39cdec4a550d95 GIT binary patch literal 1004 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_01.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..39c910d3a41314c985e4ce79337cbbf30d1ae79e GIT binary patch literal 1597 zcmaJ>eM}Q)7{5}5%D^dpRi@)O7`W*5?s^B;R;rYKC`z%G8Y+Q}>)l)EN_*Y)Sc`6o z=qAjeQ#WD)}yh;LPt4dw`DnG9mu!RfIf~Wx+2mqNwqk+0$*bp^hBX$i?jvW&i zI-(-`jo2tDx7~r7MG2s+hQfK0BvDqc0RpG>&|Z$8hiXYJMNsf&af&r)X#=H4$1V&y zlmxHAX|avDgF7QuE6X7RK|~@EO@!8nQVl`r^?HKT5?U<|HSlmlQ0Ag|Fq{>)U;$xX z@`Yrd7(`SmTZhvAp7#_;NdvV zgY$V5g=+!BA+9YtBqdTWuzYR#wf^hH)} zk%^3Bi-TdA3-TcD+XsD*VNK7)8q5;lWKnX7VqLru9JQh>hHJ$Ts--m~I;Y$h6vRmQ z)mV*2L$(0P_ZARrk{Ccol5Frjg8)b8=hIpi;2zlNIO7qZBzSZ<%g~&cVR(k}zyL<^ z!c)l`?NfLHg9ydB7)T0u^LR2J2Y}JzJj+nHhbFbSmt$F)CMg}muowX;60yE{s*mDF zusLJmlfi(SC!+;|aGoSMIBLq(1&1!tQR1?~b$EDq|K+_`5G27^Y%#f_f823bZBb^b zgnx(k{&b_X%C@ij%eKlR1xz4AxW=oeHrzdS@wL@=Po(b|Y|8y{=6&U!_b23JK6qSl z=Ul(3U+Z>w81&36ROoa>Vw};AiR+k0+1z%t8NFY0jwL6AiTw!i~cvHBP6VAaH(t%~zvICA{Agl`I%Vxu z68zSrmC0!dz3ofM=AK;@KX*2Lw5i2p+ufM1m_OK}@82}P>xjFuZtgeW@!@ny9%#*) zwmG$JIs3-vs-E7n-E*90d}+P&5)voBGI-Sa>GrGlauUsV&W&$Ps>}&tmW&aP|S$*a?s)anPWU)!;^ zL#VILC2LNl&CYCZzS55@y|-=+x*uu2(bC40EMboCNF}Cqe)a1irm04ewgSz*9By^% z53in~QmPX@4W{I>O!-`%ZUS=a#>U^Lq$RausA>A~+>cfMi{lcGP4_BNmUXd;&QI)Z z==qd;({~>{d1mb{bt%%QGTu(SaN34cx>QKxEJgeM{Y=w%WCnXCBX!LKlhR`U;qFB literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_02.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..4975adf8627b62a22d002bfc1d7be423dcc5e83b GIT binary patch literal 1754 zcmaJ?c~BE)6kiEqM1gwIQV`cr5o$NPn}ZyZawR~JAjTlrk&(@2V^T;qCJO`*jYwN? zzJ0&UL^uF2iuI~ADov3n#z_MkbLz0I1`~}2fba;b3Bxl93RDvt^hOD5;Pe?5sMknX zseA>ZFvSo$eSE%|Se>7w!t*n6k%krVDHv`Q(*_I#g@IN>meC@%N>~$i#kA}^hFRc* z3Y95gO_EAeB!e-enE(ZB6v7b%0R;fhfaICZgT zhh~jdtdz!1xubUymX4xKVi?ZN&1L6u*`#>`jEY1e7~#Mi4n%7}mOLYcSs|k($YnuF zSa7r6MCnN*=(LEb$!to(qRCE1VK6BaZwwnPQ@NtE23s)`jIt5fU~q;up>3g*#D6s2 zscli^nFv@(SjcQMPM1U*c(#EsQgW$;MSo#y^ct}c zBh(m%sUe(?q7aAR;Si?Qav`-4!7-r*!?^;X%g(#-B9TB8%jHA~I5HuM%3?&aXsJvV z#^sBmWt`|J#D$d`Efi+N372m@?RyF<`d_R##!O%oX;zVBma7qxbtFYvbfgL7aM=hL zlBzdq$XrXPvqqC4O9`_+htR~DNdq{MWU>Ao1Tbz`7?&d;AT{0T5Kpb4C5>7L33yyg z%j4lZR80pkiPyZ9yvaVLPv{^_E-qpOCA54T34;iNCxUPR4~5iRgac_Yfq=_JP$7>e zV8Jv+*x5I4^^xm{ZceB8W-#c@o6#bS^gNmA!MWz%;YAOfM{=S{Mz0Qs<3MNiJpgd) zl1rmh)~^1wcgr6m%w~t9I_nxTE`~My=&O-8 z^gpbe?g8|F%k{EVr;;O0dg4dtG7da+A?1Toh{ro$cLX)S$u4NTs#)APzctwFBm`J-;zH4 zG~j+QWNYc%rB@myO~`n2pzYl30R}T3&QPu?0OthkE<)vN@N<2Uvm*Pq+pGAEmix8S=nd9m#njz_o z)mNE70C33D#l~~-VT%Zg)r&~Gj>xJv@@N1ER9KB9wTj_D4U?=h$b~)C7lfdWmJ8$j z!;mmz2$P~)kZEFKGQ(r3%vF?(7Aod~fmVVypl3J|wCYn0X2L2LzP3y7vi%qqg0EG$ zRdV4Vsrax+FoZQRATB~73PBJMmx&mf#57_pNzDc^1Vdqzzi|k~2~13&GH~b;@(xY3 zmWWoWhurZyxiE#}j06l@EEbVPEMiT`Fe;PDU<89P4B|B)bB2Kugd(LhNr`dku$_0|Wini*7Go+LQ%O-&6(UmwD^;ohvA--> zg$2(;hOwarGe;UIX4tom_dSGFz86b`m>7~{O|dMSI@}16DJ;jDQ&=O2iA4zL8>chS zti|kSuhC%0O2(v1XK1yF)q}5-Oz7T0fD{J=h%uajG<>H+5)I8uv_=Zy5;3WjNGJ)a z;R6`N({Ckjuuu6DJ_zG57Xm>Utv`hXKnx?1K@=`QA&nTpAT5dGVljeBB@$c+^Aurw z-@MgF!$*8`+Qm16!EfG-7GvP&$;1!Nn#4Z)*f~WmidFIJz`#IRsv7#R+qh3KqUKV$YLpsF+-C>Ad1 zW5>=dVf}1sI?^UO=z_-BRDvKiqR!gx~J?s>wfxY|O9R z=3<%TTyv!--`al0bHepClGHZaLthvA+^UGKm8UDa^XhJ&LO!34xwW?BwHEl^*cY-~ z<8`=PGTBGH@UQB_-Fu367GaZe+zy?sU%%opS!1ew<>HilXz7!K%hYRTwIl^?#-}*f z1@ul;6k?`QBD!{0eq6!w)V()%oo;Mv&+BX<;EJruyw*DRnNDc~;QgB4(jyyYOl#V4 zKjtX6d&H=T8#b$@NiiP<{E*-MHL}KC;E)jSZWDr^Y&Z%6BZIC-Z|b#-?HQLFTsSJS z@$Q#_w%gOBZtV~6c9!ORQ`9$FQ0rII=XiRz?nsY&dH2H2<^3{|#OCdI(@=P&b)sPW zyMOp7w6(KXWo40nJ zY|eY}PX@?#b!4yazvau+ju3P#d)l$6(`iE4%ZY-9f5|pwy$K*30`J*m9hcRstx#3CvLZO?i~j&Y CQO3gn literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_04.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c88df92b73b89f1ad31810be1a653c3fea5d6f GIT binary patch literal 1686 zcmaJ=c~BE)6we_o2w0(7EJ|I2w$PgFkwB7#KnMwk5ag0$7>>iMhk9}@h1G@VD8w4dC-Ij zQz+w2lFCpgLXotYg2V!pPa+5ciKPNcOJEwIjvyC97=ocN3SKcE72}u?N2Soz!vg`$ zS{ z2o0YMLQy_OiAX-7(Fyq)2|^MQEkO#!5~rUR;iXcsG)gGM#F$EgqN+%#N}*J#f`vg+ zg$h$dAWm$o(ZUc$l5)n@gVBBu}%3uuP66woFJ6ABP0AYE_N z(pF2L=2MhN$|uDll&=vY7+*(-#X=#1N<<gi@&~&dP#;2;lXt&#&t~K0bu{c{|l@Y17 z>-RHn7{7%);{LVo+jqBhkqhwFC4EtW3*T<$zCId!FiEzI1fFWbckNm0!wC`F3?{`-k_IuBzxtei%cnRJ}L)M0R{}2G+6F zZG*9Y7OSOh-!=B>@A8IMxp8A|xO=x=!2Y(+gJ-d;8f8QB1>^h2=QL`k^?dIQyM-j| zc4sTxD_T;{yi;1W<)2XO1@7zLRZQU{WAjPZ3s_`D;x8k!Rx(r zKja`3H`3xc5OAPI-m|UaXIjwS9Q;g z|NJ!wnLSd#RzRm}F3x!OXko;eggHLEjEeb+)zxy`<>_YMQx@?^U1w9t;}c1K@m{7o zOMYbiaeBb(0uyc-z1&v+X;R|B+QqeBmLg>`K?T>>PuurH!->W=`<=?xPu9n?my3`3 z&mOS$&p(%)uDO_#>eK7qD+r0I9N;9mtXS)}Fnc&`tj4{o`pL{(#jZ!9gTHL`??_vJ zfKzP`85l_E${B5GU~kg*br<+>+p_$N<2uSbpn2@F!~NZyb)lDw!Z{wSWiB%sx(wTa PLRqX>Rf6(}B5%!qVpw+j literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_05.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_05.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bae4d6c8e7b60de8cb5d4751ae8d9259a39338 GIT binary patch literal 1672 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_07.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_07.png new file mode 100644 index 0000000000000000000000000000000000000000..32e864e9827420142930083d480d331024d033f9 GIT binary patch literal 1540 zcmaJ=eM}Q)7(ZwQL|`a!rcUQsm~or;U3zV$($W^GvxQU^s++UdySJr6@4EJ&1vM*% zeI;gS%*lpcNfsA0gc z;4`?ar4Pfwol#va%OL|nM59qW%HUGiPf&Wjo*-$0rZK32MH)nzi(z6UKk2~=B78Uy zk^_>6COmRpsZKVkA=u$8f+2_Fkz+CPuvV~YM2rg&6iyPsU?R04?TG9G|HF8qcBHZ) z1PB+1NOfTzw#1j8G=}ASdZ2_NL}Mrq2Vh^gTC2p@1%W8rtwuGx!G(Ze&~d=aahw<9 z3n>btfriI8uaCjJI+Evf0>?9~F6rk<_9djw!f16imbU3A%4X5qN~|`UmMPSi*ys{7 znY6Ww5t$Qtkc=IGvCV7=tEKhkr`j4UVZg~!xKfg8lSHVfmSibXErn2;!AW##RX`M^ zXynC2kA_pWf^eW72&G{uhz=Fm5O@Lrj?rovngy5_G9A-+1tgoGE;=1Mw!5dLIL>q&-FN=xw&*uC4Znihe$~NUAEd-L-0kus zvktd4b)`E?wVS_whgh+2EWSyhisJ_sDkr2?m?x%AIPEvRi)_AFgWT)A-;$?9Zk`oV zLVYi%ps58@;_dEc&+@jWF$=~m*faKDX(zHZXH?WP`ciFt`c{|Fvuq@?>tuWXt{Vb! z&3Wz*d$02K6q9mm8tck5QLDT1*md>GvZ{VYZ1vUYuDk-xr(((|(;@q++&ZNF1LPs~qy>5Nmh?FjI;C+jq@u}~$RyFRM)b3xp;ltj4 zUf7$r<(&U% zE4lk;thumebThty%=r6+vRkAVy);)DQv5hN>$`!&x?{7-dKcfxHhtdGbotBIkc-zp zt~M^wT)%m*{C>Ksr98cC%PMNJYx@)?@A-Qd8ZCi=E6$PI?~k0V=*Uv$A3kUNA@v~h zY7sUVMW+zEytcAL|>t;DnRKT5(UD*ylh literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_08.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_08.png new file mode 100644 index 0000000000000000000000000000000000000000..c692f48952c106373b56ecafd4bce7ba1295f5da GIT binary patch literal 1557 zcmaJ>d2ka|7=JXS#89*jgNP!m+d9ax$sTDpS(;usXn;T{(Nd zzTbE48t1HOBQ$Sl001NG#g-DZE=Ny+T7}*n>U9pZj8Uv*%3Rr}MENiTgNH=xd5nEiLNrG%rTP_l7>HN@+n_tNGvR(k32{1IG#b@L8Lb?y)KNyGQAg4`nkJA25vh?BK1N89%%lYij0j;d zq=>SFB`oqDxmq#di0nWV!H~o8)UXs8%oWO-F2;v+l$O*5gNe}kwIfOi{GY~iwIi;Y z5Y&~xh+G{OP)U55Nia&^iyb8t5gTrHSVVQ<7g}VYItV4jZZYBLi`FZ8IRg(pJkNUw zA)BHI8tMgt_xKpXV;}|I;N=B|H6-mk4_`zY%uJ4vW@)Q|qO4}4wa8+%<}lgDA}d`~ zNG7p%DWdR_0F%B&&{G~1zyRL+ zO!5Z$6rG?TLP;(hNkLz>K;{q->WzfJ>M6p*kTl`rS(af)%AnV?xDHX&CHm%>K1v>; z=1hoB2Lo-Mjuw>AJcZHVd_T8g6B@cS=S-Ist?_t#_wU>O03c^_Er#$s`}2At6RG*kH%iwIIOcLFlAe36?42` zd`H8NV|%w=Ik>{cJos)yU)9OG6WtnTd|p~cdKc)+S^(;2&%4_4jr#TWo~>!v`$I_3 zvoG$iyP*Gc$nt#$mMrTc?^4j2(rjCMyj&wy2`SEwopXM!ZT;kwq%d6%v)^Xy1k%`}eLa8Mr}TBFU}|SM{nDF;MJcVm>CKkZ6<_sg3WvFCvsz!Sm}nk; z;m#rV%4Nqss3XP{gY-=s0@>?ZeiF@xx#8B{Yx# literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup1_128x64_sfw/frame_09.png b/assets/icons/Animations/Levelup1_128x64_sfw/frame_09.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1c8bb9042d28b4e0ace883ea20e23cccf7ea52 GIT binary patch literal 1551 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 aR#*bwkfy%NiRRUj|9VblzU`o;xcWa;e@A@) literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64/frame_rate b/assets/icons/Animations/Levelup1_128x64_sfw/frame_rate similarity index 100% rename from assets/icons/Animations/Levelup2_128x64/frame_rate rename to assets/icons/Animations/Levelup1_128x64_sfw/frame_rate diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_00.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_00.png new file mode 100644 index 0000000000000000000000000000000000000000..77b531076df19b7a04056d7ec88284c29ee33421 GIT binary patch literal 1368 zcmaJ>e@q*76hAD#$1f9?fm_&lB#eb!?^nyUCza7&8Fec(r5V)($M^2Or4{b3UJqLc zZb;M#aT|#yBN`n{mY8g!G25IP1I8?7@sF8kV&-&dVsviKFwG<;1najzaet6q?(TiR z@80LV&wJnZZamPjue|ipQVhe&eeGfp$x-y|Ew-TdFU2SPNYt3#u-T2u6bpsTu>XJ{>#7xGZLBFZj?fs^+>(j|xgVOi1p8u|i&*?@ zp1@;@i|DrdX@A@Uqp|j319lB}gyi9V*{KjMPvFfd0Xa~i3GkFUpe2Nqi&*t5pmkPF z5%{W!+3zCONQM0Y+@l*1=dBDW(=?6qPAgOZD{&DZ@4;D`Whe&SJjw6^%L$AVU%voPA5gP6w8vxf=mo)CPtWPK1Wy zkP5qKPqAm}rP&0j^i$GtjN=y+P07?J=iInXO zL$c5&lR%1aq~xGw;81|f@s6CI&G2?xYpdJMb3EJTU>L8*>2-@F(V=&NW zW3-@#=E*>VGq;QbG<1c510gSxnM~%)wNpP~SYFsCwuVwa+?l#w@g-j7`8kuh_wejG&>WbN^GdD&mUcXv1T{-jDQ_Ucsz|W3J%eAv7 zUio*a)_%DEcG1HNOEo$sR^gpTJT0T?$qVC{R`SSPLp^r&^O=$HylFDMeEof&fAXs< zooye~7dZBu;^x2pbVn4cSWI$li}GQK5L_Kipn zbp{91D*^TB%iEV~LglS5lzy1LSk*UFd24@B$s1Uc%d)iCMQ`gpUut&T$d(ZxN%2swiG*YNp{(1MF m{QbNoef)R=n>%@V-)J7T*jVI!`&-GA{nz=t9paq3ckDkK+0xqp literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_01.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..b53437265966c6367911b3c54d172284822e39c5 GIT binary patch literal 1632 zcmaJ>dr%W+5I;yntOYgyG!7bD-jbCAVLr!BdJp4%iRS|NG>D?iBKvc z(~_a%V{|I@NvE~GT5DT;*HK5OVzo-^qoPGeDivxi{-KtNN-sdHe>mRU-G1NR{&s)6 z-|qQxveP5O;=&*ZiZo{Eb46JzK664P;=3z!l}Qv61%pM%<86WmxL8Qb@KzQ!+Ced! z%K~O;`587Df+Y2v*&SrpCNWx#JE^V*#v8iJBjyiP!uvI1;ni#dk|={<4`fjLHl zRIs~I$gNR>b498F^z*+$S zR+LV}ag<<{GzzRX1!`4cG*B^sR*Yjn5;;Go$+Y)*_lj7@qamP&Q8K;T_wo-YeDLQV-U@a_`c2@?t#1}Efm4uISK5$a zJo7^FhWb?0h)FmDTqq1@ZHY9NgtDwsjnbqNN39BsKy82|6$%VjiNO%LNKx+Zn-}^h zpc0$YzkEIz;^z5iu?}&bT;kv)|AvH$Ll=^hWj2U%U|?Wd`_>K!3NAA0wPx?NzbrwH zdMu)GV4%l1vZZo^E;am@X;jZC++Ke1YW9*xU-30}7u|gPb$GA-#KxcNo(Az<(${A6 zY5u-@*_}|_oKg68ea*@Kbkp%?pQL>8;MuCCw)C*-+mc4fI4CUYhn8c@cEqjx@_O%f z-{P&+T@C%0W`;gel|OlUJ(sAPvSi)l+Q{pQO}AHf^vOmxwǘR?xI&JHpJ@9)bR zC=9#b5S$>1$?R%X=%k>wXJt=jYkl?VwkK;%_Lj%*_wJmIKpuBz%)`}37M3>WpMKW3 zsKJ#zcJ0%sv{6N1f8>X4%+c3tyDh)3*sS}!#H5}enc!O^jZsw2Y8u(rQ1h^`A$&tH zyuR?8>IMJqoiYZRcIE7~Q_Yd(HMNp4r%uO572Ut1?eJ}hZPe~Q+jLRelsVgdBP0A! zUYXB__pV8~75(eCmn0=Eb2{IA??=)jyL&@=W=sEgZ{|R^_fY)USX^ECaQle0Ymy3z zL+cis{#g-UP_-Od-bXWy#^h}=Co8dp`jBgv57{c3w@Z&k6yz^B{6_fqCmv6#A+6!_mmw`DBJSs`kGG6H@+k;izOVnn=yUTI-J4#wJL2FU z+`^Ufd{gG7H-$xcQ|AU@S9}|ZS(|rw>hQ^%Vx#wT9{4Fex;ASjhkSf~mq(7hHKI9l z-?_-RgWZ2(Nu#0jDLc0AEr-?xO)}rQy7QwFyr6zb0v#RO!cpxvgW5Fh4+y4pOvrbW z#&>r{g`XS;6;01SEa^C{gBF@&A*fmkUC895(u2S&; literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_02.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9623af7d87422a4d538f5b2359bf5a59d7651444 GIT binary patch literal 1812 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_04.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..677a3367e8d4ec943c88097d48abf95fcd29510f GIT binary patch literal 1700 zcmaJ?e^AqQ6fYG4QDCSjaHyd=C)2b^T1b;?q4WpPjUr-I1azcn3KiOvHeE~c2QqZZ z6#O+Ox|^anCo1zimP;@qYdox16qa-vf=C&FMUQ0E_>xg_uVeR-evKJR_s zyR1!5OAZQ*4CHV)LFyD`1}jV1M;0)Geg7U%rC~(`qsnCF(gwysSSe1Tp4L%-+C=10 z85E%}E^4DB9L|Vxqc)St)TH7hZQ>Ii8@|(IVbL6pB*AGR$O4K1bX11VI3b@hLrl=!6D>oCP2d0t;aFMnM?G5g`s^!0^Rm z16uV4JVTi@9FE;ddHD=u!36?`!@+k5`Ls1p0Am;?fDi$KfUE^*D>gHP6ExeVdOav9 z8)-FK7$a>4JRS)hZD*uBmh4a#CW}V%!m-&lTr0L}0w-Y+z%Pw6-xB)c-VI zX>HRMTPQ&WWuxs@l06c`R4*rN?41*L1mY9elNn#jQDKM2>sZzxW zV==i3ktaf4tlDg22s24}V;kAn!&vOKSX^PH2!^(5X}Zwc2cs>QGQb5^VCQUI-Ef0>%)r z0fI#a-Y{POQt^iRl-00FSiD?t2&N3NBoqfyln4V!R0M-MA%uVi0!4*F2o|%!cmkH9 zz|%J`^^sS_Hm7I#Vlddvi_xOY>^xc7!Remy^-^}|{L)jkDpn2*4D5C9{Ds5e)~c0> zT4(3|h1r$gK><+@R^0o!PTfvI8)~~|FWTQV{i~Hee)mT%SA_ITxv^!S|M~hG$HI~x zcT14SGeG~8lwUttitUUFY5pi;yW9FizQy^E+;w~G{K(DIc68jC+%YlmOaE2DSr?D5 zY&BJXQId8!yS)0%K;6EqWm^vCwk+C%GRGQfKMXx&xw^5(y>(vKu8h)_it`gE#INQ4 zwj_7D-%m}MOUU zdRcY)y;C!bi$?vc<(4&m+*h|75SW9^ilbZ4ge_awy(x^B=lFgS={puEgyvLt&j`Ol z_pV4GDih*tXiWO(MI z;Lf%U0XY!?KBm-$1I{t$Lf81eu|3eS#7EJ(qoX6ZtSCXGYJKmmgQG*QuacC@7W-DX z`X$`IuC-6mS&R?5Co%rnzMRg`)j$4V4|w+PxvQ0Je;=$WTfDQjnz<2D(Zu~cKXpS8 zx?=w3ngREy{T1s{e6H_k7~L8-xv#TnT*=ejO+||#*F8+;8m*jJDmfh-u%NlB|5n*! z-SRbbH1upt^R1BN(g)!xS(fNH)!h<^6|AVwE6wY)AWaoM=1a+`*{vmGN~3(19TK&1 fou7qQCiwVqK7AOxBD>a-==pD`RcXq4d2ZQ%RqlP+ literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_05.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_05.png new file mode 100644 index 0000000000000000000000000000000000000000..fb58fed1e0fbbe7bed41ff7ab0e676ae7067edaa GIT binary patch literal 1725 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_07.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_07.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3dfc8c4a875a8b9eda2c87337cb46d984a93b9 GIT binary patch literal 1590 zcmaJ>eNYou5Pt+eKt#b>N3r60Vv*|Q?vlVIXCj0oV5-3sV~uvKUhXcCf!xL9AOW=? z#j!Hh@3AOV)M~Y@1E{q_>lfN~uyrh08B1-8jOZ|m)~eY0Rp|>5>mQCccen5D?Qi$D z`*v@&H7hfENZb$rK(u*=F&oNK_@qUI!}qm_brvYbNG7{9M|4Vl#>)deCpvh<>}GQK zY@XqYmi)kL0SGU5+3b?tGK*$Kx10&u$OCQKL_IvvplXz0MrOAHcl=LQnW%zlNzM|LSaBJ z=cKcZ8U5klPKV}7l844|zuzzSE9Ig$2PZWe4NfRXn6F5Xm;fgDCWbs1c^~U_ zc_f!8AVH6eLoASVC?wmLh1+AXJaa7g`fCNNh6flAPRa?~?GC2aYweS=`TuFW(AsA! z^6+>z?-L8WEIbnD#1I&k@8yAlhL8 zU~Do;VhUcxVvNJ7#2jjZWz-zQDk*iy&x`Pe6eFcJ7*Z%jhMFWz28}7*XfmZJlQrok zMY^5{VabaO%(G(jbP0cCDE5FdJu(DP9T%# zxdcx1`;vlZ)R(f6_qqysF2gIjk=`QHt``t+vMLot@hXg=92BNv8JIl9DKW;$kQ#;B zNsuZh+K=a+D_&opLJds96XHS>B=1aSi4=_IRT_+?R3zq55(>=8P?SXxtnYKZb62{rk^X?YV!p^-x&gm!oa>Yy8WPJy1M398q^5547C4 z(=`pGR&3LMcXjcZs!O%&TUU0T9UD9OwB@P3et@<7$a@poKcu7XkC(Omybc7eJ={95 zeVAT`oY3Wg%ij#!8CQz7e+E?1k2v+d-@09!H^lt)TH2jsceBLCC1C47eZ~&3zv!t} z_&4Eh`Hhd>SvsNsSpR8Dyuz-ccFIjNa2a%(+3mscgKUD)(#(t zw8@O~>&LHHfBxd!(XU?lRI{OFd+U~6#H8u9DWd+|)cGYU`CDfXm+#1=%jz6d{CZe-=ON2ixnVKdliTcNt1Fg*&2?Ebx{I5+ zgpH|Do0=|$7h61qiQNx3j(i0l9JO7py?yRc`IK?OnrzMDL2(Y~0!7l1CXt2ypeH8>Q% zb;N+`8eso=**r(niYY6c;q3Ck&G#}t!8=PTXR2$!mp9!Qduq?dd+#O#l~Z%5`#E*!qQWH533d`rguo=FX$ X{(3~&sLLIZ!9Tg#lx3_*UtIPdOIt_2 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_08.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_08.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5a28805a856668c4d05c0824cb8253f9dcc732 GIT binary patch literal 1598 zcmaJ>eNYou5Wghyr80hi)uN+k)Pm?GcbC8=R|142NRZG>Oe<&|xm;c(1G$U2qlst{ zg&DPek2;Oj7O=G++G*`bty2`y>Qt~++WJMO&QPpcuo}l1Ypr1V0>t`<?RQM*LO_6fcXW5^(|V68(%1AbKb70I1o+ zECV*cI9Duh2U!Rrt9RQ=#1cyp&GH@v6R}YQJYI-KkgS}5mtiY_h&sSBH>Z<_T29DO zw^Juym|?*!UIQq17gYPeg6d*BTV26wo${P)G%G+u2Oc0YXuwm+33NawAM{JZbwsU{ zqk|@5g-$+1s>EVN4ZIJal!Cxm9LG^gs{l@hbf{bmI~OH!l28)xrZ9q{Nfk|K(cw!D z1NxjU+Gflj4hMHSdATThX{FNd_bdD=1@Bv?B(z$s5+{`;i9riYSiy-*0ON!iQ4dBS zus*j}bn_e<@yIy%Dp4ngWQVfwcrBKvjyYktR3S8;&L{b~H7DOBPpT={o z1^WswP}+dNSNT|YB(51zFf8AT14RrW8~Qb$8=ebOY2?`|58yoD8d?G*Lg#!y7VMjOFe&WpTI&U;Z(rNGg&g>KHt z`-Rz&Ga5?S2z>6hfHU96d(gom)9&XGaItDNMFBO&P!0-HvkXk0a;h-K#SmIjZJp~YUy*edrd-mqm19gXFNgFzmz6J_Ojw54`LgeQ8`Hz=h&riUQ zeIhwqg&da#&Zi~VGJlX*XT9H*b9};YNgd5E)&668*zwGD!Iw&Nb^`))|R<#+{L8v+j=E&C@}2K>3MYP zQJci7HLb)h)i>V%>Q4XeCl>w8&D}+&ZVp*J>9$aIPMkaK?O+EV)5%;v7y4=4f|^g0 zuYNwpAC?@P+AAFEq4q78xgNA1UN;J>QS@Gz)7Dwv)W7P~rh6y%CVaTqJ1w`!8v8ZU zxW#!kRO%8(m#yUN-8H3gmGa15eNuDEJ;zw{z^vL*;@!H=V*U13t)x^_c(eaaF)>%S z>vYqP`&xy$dt$8N^u577^I~_n3L6H@PwofvTf(UldZS7gKDvW{W&J$i@ZVL3T1QMm YrcO_Iys{zVX5^1AGk|J(*OVf literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_09.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_09.png new file mode 100644 index 0000000000000000000000000000000000000000..76267a2a8d6689a04241f432e55501ae91231b2d GIT binary patch literal 1604 zcmaJ=eNYou5Wggq5*0tH)fA~7hYsp+$=xMzNhC_h1%V-m5eKBT<#M^00LjJNX#%w6 zL~*EJwAC^|tx&1ejx|$T99yvpezdgJ4q98Pt$;)Ahg#IBR2-es7a-O@9B=M!-`lsp z-QVupeLW|8an#u8u@D4BWu#M9AVu({M9RSbYGjQCi01@zzOamQ2!7hfLPk4hW8n-p zy^6K6w7qoo*K9Hb$u_uh^M!m%mY(6rz^e8$1W?&&SlDq8J!(jv=B}X=z#+_E6{MjUE<;O0RuAZR}a=9 zwF-fUO@v|tGD0ffk^`GK9}AO89Az*JgGrr|wbO)6?Vya^sAMeZ2xZLP!R+QEKt7GBhUfV!^ed^ zP%O{*TwcM&dEk&o+QzLB3Wo?u9O)IA)ET^#~c10RbmUyUVWE z(yWc9X&cHU;y6mM8V03p4mE1iVhpXd(~O$bhW$JaZ%U#_t;u92i8L*an@u`%DrGh& zsS|anW+K&yg|QhPUZ6b;8;tJI2etFBv}nglQt67Ff>S>w5w6tLE}0? z>%ef00~y8JA1U5Qp8^d?!W-tI$8gq>$Y4n*%W8BeLuzo;rp5@=L6f9fjp14l3{e4! zs!-oN(nnzxXwJ~`;b4Hx!_i_rV4i$naBABQE(Svvk&~5c26AXNb1T^#gXkl)z)r?=GDGjbhag<;X+I^Ym6=HYV95f`oAcqZx2a(kL`jA zr>s0$L{0pyV0JGRm@8{^D*hcDh-o7WYI0u`+Yr<;XkD>Bc%qXNp|hDh*D`Ll^weakq7Hv%jfw#W(x{ z=>21dVzb(Jb&K-P`lF*|_1(Sw2F1rMeMe`;O7=9r1CxGOXl`#sJ>e>%0zNo z{oWJK{^YpC8Xi()+wY(6oPTMVVdBL7FY3A`96tB%M(4hThr65ka}VURX5_fG22Zb! zcq^M47(6xZcJrzFd!+pM4pEviX5EQh*}FXl4(^5Isfc=M7VK`2DB^yND1>?ggrqn2 zLQJ|$tT-#tMy-|?>SV$AowIgI^S@8AXPU*T`EN9Lbx!TG47NX={%ZU{f_Tqb{pHHo z*@Xqy$CN3mFIgKZtNdrl?MA6~-iAGQ?Z}O496dg+|aOkG? j&5o)3_*?4sMo0#=U6ZG6`PBUh=qxD1oJ|E&3oHKv!xl}j literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Levelup2_128x64_sfw/frame_10.png b/assets/icons/Animations/Levelup2_128x64_sfw/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..bda1bf44ce0a0cab9a03d15fd284b709590f3b4d GIT binary patch literal 1612 zcmaJ>c~BE)6yI=2qGGYkSZLK*mQuBJv%5)PlP!USBxuxN3{-Kf%4YYAte9-vT}r@q z07osJIOy08Whx#_J*u_UX%#K!sJ-lXRA;0Y?dWI~j}}`UmC`RjtbaJ}?0)C_z4v?9 zu5ss2jUV~qNCZLRozv_dI9J2ZqK<~+6?L5pPRWX+NGT9~N;xY5#LA0afI9u`V&DNR zU$N|KkcA-8D}}-$rN}jt;Y7cd4a;al{vbpnNLEfL$a1AXLA_wH5HMr6kF{Z_z?-qT z87|Tlw1E;~TBQUED)S4u%2Lk6V>#JqR)~QL{6JyRkbh}FWh1MvVxuL4wkfgx?=_ZBSZPJm7yCPnDJnD}sRV z09h=PIG7S&Y6J|!_iRI9LCA)gB?&Mu>{7ePmH9zHaoWuoywUOk&lp+YWm(pXa~Twc z>wtm7S+7rzdyOQ=8hMt})5eINr{PV8JcrSdLDG3NNl^}))#|Y4*^MTf&2BY19QFv- z8ITn=z=4Qu0ooqI8uFfrWo!~)6;Ub_#ifx#aF>XRD3^#qRHxUH=;XOVfEUZ&-y0-Xp(xG*FId>I^>i34CT;T&zCaIc=!;XamzW=P6tFwhtQDH7qjd7_RYN3b}< z%g2oYH;-Ej1Ykc&uyN|D@^`|f8{wW==z#OUz(Dh*Z9gMO)J&({S{Ul?Ez)f4BGoGg zsw$gzeSWkf(6}URzWLmo_{1b%5c!_D@$n%zjjp3!yE2Vq!)Av$d{+5rR!L=3i)*VDMSr|DmPI(qrLg% zbd@mTSlqeMhu^*06+@(@T$sIAq>$o6h4Jku-hL#%!+du?8SVZfHz_x!IFxHl**QD) z*8UXDnjVvFEPf(;!irny#qOiFo`Qs!-{=jea{qdC=h#V^+PKH|ilMG$>;t4_OUIp4 z3xrJvKDw@L>-?tmBEEAT61+5t-gh=H?ZbhBG) d` Date: Tue, 10 Jan 2023 21:28:29 -0500 Subject: [PATCH 53/64] new compiled firmware metas added --- assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_1/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_10/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_11/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_12/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_13/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_14/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_15/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_16/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_17/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_18/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_19/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_2/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_20/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_21/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_22/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_23/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_24/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_25/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_26/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_27/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_28/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_29/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_3/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_30/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_4/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_5/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_6/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_7/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_8/meta.txt | 2 +- assets/resources/dolphin/nsfw/lvl_9/meta.txt | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt index 83bee1ed9..6503043bd 100644 --- a/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt +++ b/assets/resources/dolphin/nsfw/PaxGod_TikTok_Marketing/meta.txt @@ -8,7 +8,7 @@ Active frames: 1 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 1 Frame rate: 5 -Duration: 3600 +Duration: 360 Active cooldown: 7 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_1/meta.txt b/assets/resources/dolphin/nsfw/lvl_1/meta.txt index ce2a47854..70d1fd018 100644 --- a/assets/resources/dolphin/nsfw/lvl_1/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_1/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_10/meta.txt b/assets/resources/dolphin/nsfw/lvl_10/meta.txt index 4ca1452a8..0da985c7f 100644 --- a/assets/resources/dolphin/nsfw/lvl_10/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_10/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Active cycles: 0 Frame rate: 7 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_11/meta.txt b/assets/resources/dolphin/nsfw/lvl_11/meta.txt index 4d5cb4433..4dccc40b3 100644 --- a/assets/resources/dolphin/nsfw/lvl_11/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_11/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_12/meta.txt b/assets/resources/dolphin/nsfw/lvl_12/meta.txt index d9f9ea390..6ad698fe2 100644 --- a/assets/resources/dolphin/nsfw/lvl_12/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_12/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_13/meta.txt b/assets/resources/dolphin/nsfw/lvl_13/meta.txt index c874d07bb..68b987d49 100644 --- a/assets/resources/dolphin/nsfw/lvl_13/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_13/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 Active cycles: 0 Frame rate: 8 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_14/meta.txt b/assets/resources/dolphin/nsfw/lvl_14/meta.txt index 44d736f04..c32dadf26 100644 --- a/assets/resources/dolphin/nsfw/lvl_14/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_14/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_15/meta.txt b/assets/resources/dolphin/nsfw/lvl_15/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/resources/dolphin/nsfw/lvl_15/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_15/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_16/meta.txt b/assets/resources/dolphin/nsfw/lvl_16/meta.txt index 5a2562a36..9196e7efa 100644 --- a/assets/resources/dolphin/nsfw/lvl_16/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_16/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_17/meta.txt b/assets/resources/dolphin/nsfw/lvl_17/meta.txt index db04692ca..87d8674d3 100644 --- a/assets/resources/dolphin/nsfw/lvl_17/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_17/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_18/meta.txt b/assets/resources/dolphin/nsfw/lvl_18/meta.txt index 22801094f..248ba1feb 100644 --- a/assets/resources/dolphin/nsfw/lvl_18/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_18/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_19/meta.txt b/assets/resources/dolphin/nsfw/lvl_19/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/resources/dolphin/nsfw/lvl_19/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_19/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_2/meta.txt b/assets/resources/dolphin/nsfw/lvl_2/meta.txt index 5fdf4c952..30c74a14c 100644 --- a/assets/resources/dolphin/nsfw/lvl_2/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_2/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_20/meta.txt b/assets/resources/dolphin/nsfw/lvl_20/meta.txt index 6f051aa7b..43dd6af5a 100644 --- a/assets/resources/dolphin/nsfw/lvl_20/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_20/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_21/meta.txt b/assets/resources/dolphin/nsfw/lvl_21/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/resources/dolphin/nsfw/lvl_21/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_21/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_22/meta.txt b/assets/resources/dolphin/nsfw/lvl_22/meta.txt index 919490b3d..350c8e366 100644 --- a/assets/resources/dolphin/nsfw/lvl_22/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_22/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_23/meta.txt b/assets/resources/dolphin/nsfw/lvl_23/meta.txt index c62e04b76..4ed718fa1 100644 --- a/assets/resources/dolphin/nsfw/lvl_23/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_23/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_24/meta.txt b/assets/resources/dolphin/nsfw/lvl_24/meta.txt index 7e7e55b26..a29a0ddea 100644 --- a/assets/resources/dolphin/nsfw/lvl_24/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_24/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_25/meta.txt b/assets/resources/dolphin/nsfw/lvl_25/meta.txt index 658cb5ac9..47d4a0191 100644 --- a/assets/resources/dolphin/nsfw/lvl_25/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_25/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_26/meta.txt b/assets/resources/dolphin/nsfw/lvl_26/meta.txt index 4660b7b7a..d1ce7fc49 100644 --- a/assets/resources/dolphin/nsfw/lvl_26/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_26/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_27/meta.txt b/assets/resources/dolphin/nsfw/lvl_27/meta.txt index 246dfa2b1..8e51d5271 100644 --- a/assets/resources/dolphin/nsfw/lvl_27/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_27/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_28/meta.txt b/assets/resources/dolphin/nsfw/lvl_28/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/resources/dolphin/nsfw/lvl_28/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_28/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_29/meta.txt b/assets/resources/dolphin/nsfw/lvl_29/meta.txt index 827e5b340..240e30716 100644 --- a/assets/resources/dolphin/nsfw/lvl_29/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_29/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_3/meta.txt b/assets/resources/dolphin/nsfw/lvl_3/meta.txt index 5fdf4c952..30c74a14c 100644 --- a/assets/resources/dolphin/nsfw/lvl_3/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_3/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_30/meta.txt b/assets/resources/dolphin/nsfw/lvl_30/meta.txt index 4d5cb4433..4dccc40b3 100644 --- a/assets/resources/dolphin/nsfw/lvl_30/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_30/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_4/meta.txt b/assets/resources/dolphin/nsfw/lvl_4/meta.txt index 019cabf17..721dbe089 100644 --- a/assets/resources/dolphin/nsfw/lvl_4/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_4/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_5/meta.txt b/assets/resources/dolphin/nsfw/lvl_5/meta.txt index 815e3e173..676c56ed2 100644 --- a/assets/resources/dolphin/nsfw/lvl_5/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_5/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_6/meta.txt b/assets/resources/dolphin/nsfw/lvl_6/meta.txt index ba81ab2c1..7e408a6e1 100644 --- a/assets/resources/dolphin/nsfw/lvl_6/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_6/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_7/meta.txt b/assets/resources/dolphin/nsfw/lvl_7/meta.txt index 6f051aa7b..43dd6af5a 100644 --- a/assets/resources/dolphin/nsfw/lvl_7/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_7/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_8/meta.txt b/assets/resources/dolphin/nsfw/lvl_8/meta.txt index d9d683102..cf387b42f 100644 --- a/assets/resources/dolphin/nsfw/lvl_8/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_8/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/nsfw/lvl_9/meta.txt b/assets/resources/dolphin/nsfw/lvl_9/meta.txt index 44d736f04..c32dadf26 100644 --- a/assets/resources/dolphin/nsfw/lvl_9/meta.txt +++ b/assets/resources/dolphin/nsfw/lvl_9/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 From d0f34cc71832fa6534167b896a038f8053d3332a Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 04:34:27 +0100 Subject: [PATCH 54/64] fam fix --- applications/plugins/wii_ec_anal/application.fam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/wii_ec_anal/application.fam b/applications/plugins/wii_ec_anal/application.fam index 8fbf565a2..655b5f938 100644 --- a/applications/plugins/wii_ec_anal/application.fam +++ b/applications/plugins/wii_ec_anal/application.fam @@ -32,5 +32,5 @@ App( # fap_version=(1,0), fap_icon="WiiEC.png", - fap_category="Cyborg Systems", + fap_category="GPIO", ) From 4f6e84b44eeb5a2d1ecc2fc636ffc95ecdedd67d Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 04:36:07 +0100 Subject: [PATCH 55/64] last fam fix. ready for v38 --- applications/plugins/flipper_i2ctools/application.fam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/flipper_i2ctools/application.fam b/applications/plugins/flipper_i2ctools/application.fam index 7d9c5944c..d8d10dfce 100644 --- a/applications/plugins/flipper_i2ctools/application.fam +++ b/applications/plugins/flipper_i2ctools/application.fam @@ -1,6 +1,6 @@ App( appid="I2C_Tools", - name="i2c Tools", + name="[GPIO] i2c Tools", apptype=FlipperAppType.EXTERNAL, entry_point="i2ctools_app", cdefines=["APP_I2CTOOLS"], From 9f08021382b6e935022672f4bb8d5013d022b07b Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 04:37:21 +0100 Subject: [PATCH 56/64] fams are annoying. now its all, i swear --- applications/plugins/gpioreader/application.fam | 2 +- applications/plugins/gpioreader2/application.fam | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/plugins/gpioreader/application.fam b/applications/plugins/gpioreader/application.fam index 55295f3ab..a7f297d47 100644 --- a/applications/plugins/gpioreader/application.fam +++ b/applications/plugins/gpioreader/application.fam @@ -1,6 +1,6 @@ App( appid="GPIO_Reader_B", - name="GPIO Reader (biotinker)", + name="[GPIO] Reader (biotinker)", apptype=FlipperAppType.EXTERNAL, entry_point="gpio_app", cdefines=["APP_GPIOREADER"], diff --git a/applications/plugins/gpioreader2/application.fam b/applications/plugins/gpioreader2/application.fam index dd3a6acfe..57792fd0c 100644 --- a/applications/plugins/gpioreader2/application.fam +++ b/applications/plugins/gpioreader2/application.fam @@ -1,6 +1,6 @@ App( appid="GPIO_Reader_A", - name="GPIO Reader (Aurelilc)", + name="[GPIO] Reader (Aurelilc)", apptype=FlipperAppType.EXTERNAL, entry_point="GPIO_reader_app", requires=["gui"], From d2df35a35bfbffd167529dbd4b69dccf7833a225 Mon Sep 17 00:00:00 2001 From: Stephen Kent Date: Wed, 11 Jan 2023 02:13:07 -0800 Subject: [PATCH 57/64] fbt: add `fap_deploy` target to build and copy all .fap apps to flipper (#2146) * fbt: add `faps_copy` target to build and copy all .fap apps to flipper * fbt: restore default runfap.py invocation behavior, use -n for copy only * fbt: proper implementation of fap_deploy target Co-authored-by: hedger --- .vscode/example/tasks.json | 16 ++++++++++++++-- SConstruct | 8 ++++++++ scripts/fbt_tools/fbt_help.py | 2 ++ scripts/runfap.py | 20 +++++++++++++++----- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/.vscode/example/tasks.json b/.vscode/example/tasks.json index c16c3ab4f..beedf8865 100644 --- a/.vscode/example/tasks.json +++ b/.vscode/example/tasks.json @@ -138,6 +138,18 @@ "Serial Console" ] }, + { + "label": "[Debug] Build and upload all FAPs to Flipper over USB", + "group": "build", + "type": "shell", + "command": "./fbt fap_deploy" + }, + { + "label": "[Release] Build and upload all FAPs to Flipper over USB", + "group": "build", + "type": "shell", + "command": "./fbt COMPACT=1 DEBUG=0 fap_deploy" + }, { // Press Ctrl+] to quit "label": "Serial Console", @@ -145,7 +157,7 @@ "command": "./fbt cli", "group": "none", "isBackground": true, - "options": { + "options": { "env": { "FBT_NO_SYNC": "0" } @@ -162,4 +174,4 @@ } } ] -} +} \ No newline at end of file diff --git a/SConstruct b/SConstruct index 138b52d93..b8c65044d 100644 --- a/SConstruct +++ b/SConstruct @@ -165,6 +165,14 @@ Alias("fap_dist", fap_dist) distenv.Depends(firmware_env["FW_RESOURCES"], firmware_env["FW_EXTAPPS"].resources_dist) +# Copy all faps to device + +fap_deploy = distenv.PhonyTarget( + "fap_deploy", + "${PYTHON3} ${ROOT_DIR}/scripts/storage.py send ${SOURCE} /ext/apps", + source=Dir("#/assets/resources/apps"), +) + # Target for bundling core2 package for qFlipper copro_dist = distenv.CoproBuilder( diff --git a/scripts/fbt_tools/fbt_help.py b/scripts/fbt_tools/fbt_help.py index 0475f51bc..8cce9335b 100644 --- a/scripts/fbt_tools/fbt_help.py +++ b/scripts/fbt_tools/fbt_help.py @@ -11,6 +11,8 @@ Building: Build all FAP apps fap_{APPID}, launch_app APPSRC={APPID}: Build FAP app with appid={APPID}; upload & start it over USB + fap_deploy: + Build and upload all FAP apps over USB Flashing & debugging: flash, flash_blackmagic, jflash: diff --git a/scripts/runfap.py b/scripts/runfap.py index c2c0f78d5..410b3e7d2 100644 --- a/scripts/runfap.py +++ b/scripts/runfap.py @@ -15,6 +15,13 @@ import serial.tools.list_ports as list_ports class Main(App): def init(self): self.parser.add_argument("-p", "--port", help="CDC Port", default="auto") + self.parser.add_argument( + "-n", + "--no-launch", + dest="launch_app", + action="store_false", + help="Don't launch app", + ) self.parser.add_argument("fap_src_path", help="App file to upload") self.parser.add_argument( @@ -84,11 +91,14 @@ class Main(App): self.logger.error(f"Error: upload failed: {storage.last_error}") return -3 - storage.send_and_wait_eol(f'loader open "Applications" {fap_dst_path}\r') - result = storage.read.until(storage.CLI_EOL) - if len(result): - self.logger.error(f"Unexpected response: {result.decode('ascii')}") - return -4 + if self.args.launch_app: + storage.send_and_wait_eol( + f'loader open "Applications" {fap_dst_path}\r' + ) + result = storage.read.until(storage.CLI_EOL) + if len(result): + self.logger.error(f"Unexpected response: {result.decode('ascii')}") + return -4 return 0 finally: From 7765d09dcee3caf3fe9c001cc6cf4a14e0913ec2 Mon Sep 17 00:00:00 2001 From: jbohack Date: Wed, 11 Jan 2023 08:33:33 -0500 Subject: [PATCH 58/64] updated DolphinMafia_115x62 icon --- assets/icons/iButton/DolphinMafia_115x62.png | Bin 4152 -> 6968 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/icons/iButton/DolphinMafia_115x62.png b/assets/icons/iButton/DolphinMafia_115x62.png index 53dffb4fa92a3fa1c6434157506d28c10d4048cc..a9ed8a1176107796aee521be917b038dbbd8cf34 100644 GIT binary patch literal 6968 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 From 20621da8ac013b1fc447e7f6f5a9e7e69c2bc913 Mon Sep 17 00:00:00 2001 From: Giacomo Ferretti Date: Wed, 11 Jan 2023 14:41:57 +0100 Subject: [PATCH 59/64] Fix typos in source code (#2285) * Fix typo in TextInput module * Fix typo in Widget comment * Fix typo in comment Co-authored-by: hedger --- applications/services/gui/modules/text_input.c | 14 +++++++------- applications/services/gui/modules/widget.h | 2 +- applications/services/input/input.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 80680fe45..32607e884 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -29,7 +29,7 @@ typedef struct { TextInputValidatorCallback validator_callback; void* validator_callback_context; FuriString* validator_text; - bool valadator_message_visible; + bool validator_message_visible; } TextInputModel; static const uint8_t keyboard_origin_x = 1; @@ -254,7 +254,7 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { } } } - if(model->valadator_message_visible) { + if(model->validator_message_visible) { canvas_set_font(canvas, FontSecondary); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 8, 10, 110, 48); @@ -319,7 +319,7 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b if(model->validator_callback && (!model->validator_callback( model->text_buffer, model->validator_text, model->validator_callback_context))) { - model->valadator_message_visible = true; + model->validator_message_visible = true; furi_timer_start(text_input->timer, furi_kernel_get_tick_frequency() * 4); } else if(model->callback != 0 && text_length > 0) { model->callback(model->callback_context); @@ -348,8 +348,8 @@ static bool text_input_view_input_callback(InputEvent* event, void* context) { TextInputModel* model = view_get_model(text_input->view); if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) && - model->valadator_message_visible) { - model->valadator_message_visible = false; + model->validator_message_visible) { + model->validator_message_visible = false; consumed = true; } else if(event->type == InputTypeShort) { consumed = true; @@ -435,7 +435,7 @@ void text_input_timer_callback(void* context) { with_view_model( text_input->view, TextInputModel * model, - { model->valadator_message_visible = false; }, + { model->validator_message_visible = false; }, true); } @@ -495,7 +495,7 @@ void text_input_reset(TextInput* text_input) { model->validator_callback = NULL; model->validator_callback_context = NULL; furi_string_reset(model->validator_text); - model->valadator_message_visible = false; + model->validator_message_visible = false; }, true); } diff --git a/applications/services/gui/modules/widget.h b/applications/services/gui/modules/widget.h index 50c261751..9076ce7f2 100644 --- a/applications/services/gui/modules/widget.h +++ b/applications/services/gui/modules/widget.h @@ -91,7 +91,7 @@ void widget_add_string_element( * @param[in] text Formatted text. The following formats are available: * "\e#Bold text\e#" - bold font is used * "\e*Monospaced text\e*" - monospaced font is used - * "\e#Inversed text\e#" - white text on black background + * "\e!Inversed text\e!" - white text on black background * @param strip_to_dots Strip text to ... if does not fit to width */ void widget_add_text_box_element( diff --git a/applications/services/input/input.h b/applications/services/input/input.h index ec3d09711..062dc0fa5 100644 --- a/applications/services/input/input.h +++ b/applications/services/input/input.h @@ -19,7 +19,7 @@ extern "C" { typedef enum { InputTypePress, /**< Press event, emitted after debounce */ InputTypeRelease, /**< Release event, emitted after debounce */ - InputTypeShort, /**< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */ + InputTypeShort, /**< Short event, emitted after InputTypeRelease done within INPUT_LONG_PRESS interval */ InputTypeLong, /**< Long event, emitted after INPUT_LONG_PRESS_COUNTS interval, asynchronous to InputTypeRelease */ InputTypeRepeat, /**< Repeat event, emitted with INPUT_LONG_PRESS_COUNTS period after InputTypeLong event */ InputTypeMAX, /**< Special value for exceptional */ From ad9d746a279d7856780586304e4bafb92f2b6753 Mon Sep 17 00:00:00 2001 From: Nikolay Minaylov Date: Wed, 11 Jan 2023 16:58:51 +0300 Subject: [PATCH 60/64] BadUSB backspace/delete fix (#2288) Co-authored-by: hedger --- applications/main/bad_usb/bad_usb_script.c | 4 ++-- applications/main/gpio/scenes/gpio_scene_usb_uart_config.c | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index 92c7466f1..bbd721ed2 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -71,8 +71,8 @@ static const DuckyKey ducky_keys[] = { {"BREAK", HID_KEYBOARD_PAUSE}, {"PAUSE", HID_KEYBOARD_PAUSE}, {"CAPSLOCK", HID_KEYBOARD_CAPS_LOCK}, - {"DELETE", HID_KEYBOARD_DELETE}, - {"BACKSPACE", HID_KEYPAD_BACKSPACE}, + {"DELETE", HID_KEYBOARD_DELETE_FORWARD}, + {"BACKSPACE", HID_KEYBOARD_DELETE}, {"END", HID_KEYBOARD_END}, {"ESC", HID_KEYBOARD_ESCAPE}, {"ESCAPE", HID_KEYBOARD_ESCAPE}, diff --git a/applications/main/gpio/scenes/gpio_scene_usb_uart_config.c b/applications/main/gpio/scenes/gpio_scene_usb_uart_config.c index 55b04ed67..776343fb0 100644 --- a/applications/main/gpio/scenes/gpio_scene_usb_uart_config.c +++ b/applications/main/gpio/scenes/gpio_scene_usb_uart_config.c @@ -14,9 +14,12 @@ static const char* uart_ch[] = {"13,14", "15,16"}; static const char* flow_pins[] = {"None", "2,3", "6,7", "16,15"}; static const char* baudrate_mode[] = {"Host"}; static const uint32_t baudrate_list[] = { + 1200, 2400, + 4800, 9600, 19200, + 28800, 38400, 57600, 115200, From 4831ff4d0b7653aed101884d9a2e980bdfda0dc9 Mon Sep 17 00:00:00 2001 From: jbohack Date: Wed, 11 Jan 2023 09:08:19 -0500 Subject: [PATCH 61/64] modified DolphinMafia_115x62 to fix text overlap --- assets/icons/iButton/DolphinMafia_115x62.png | Bin 6968 -> 6876 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/icons/iButton/DolphinMafia_115x62.png b/assets/icons/iButton/DolphinMafia_115x62.png index a9ed8a1176107796aee521be917b038dbbd8cf34..e53a1c040565a2d28d6c8a99e3da87edcba9fd0c 100644 GIT binary patch literal 6876 zcmV<28YAV2P)=Do809goM&!5F$zl zC@3u@77{8*BOwY(DxpXTDvf}YMMZ+@{k&%&Zz4g}XmS2AP?vtPVWcz&J z10U$#``-6Q}$I9lzan+jU!QwN;ow`@P@|E4f3oqR6|IKfHv)g5tUAoVI{`2japa1;l-H(6# zZak7rxN#yYIf;(MKQMopsh(-DaC@)_v?_AM5tpZ@=!8 zQ%>owxZ;YoZ^I2Y?DpJq&rxPxd+oK|Z+`Qe?#wgK?5?}+y6!7q`AYj6a}GW9&`|*m z!+iez?|(PJGM;+sscx9ZBr(&1s$^Hqv|vP{X>-mwXSd8U%XII5|NFa*H{Q5={p(-f z%{SkC-8$*X-6>Ypte*%PzZYW6~_M%+iRBIkd_)8nwn6YjkgT!y6iNoNqhL zbgpAR^O?`I^S0e~+wNQ6`c}95?z?wi`qG!WBab|?Y41@-9o2q+;uD`}=hEIAZn&ZQ z&Ue1k&T%}39&o?`ZO-@Hb5Hm5(@%H5``zzG*Y@nQ&yN0HYN@3fBcrjgR^yJDkyK0! zBO|p{D>0K6(%yHx;~m}m-uJ$4o_XeJTDbGhJ2&%*8BC&muX)XD8j-&H-S2i=Z@qQ* z^{;=uUB~&3B?uUXAvBowGNoVp+Si(P9&^kw&15@g^UXJJTI+Aj#4OkQ#y7sv?nQGk z9rHHWV1ste{rBI$nQ3!04~#ng_~RQBG0XR5mtEGq>s{|^g3&jz)hdk}X7(rlidVd% znZYph@y8$UUiGS1HKI;2#T3oV@{u$Y;SW6Uz~AIaLk84{NZ-}Q%^m$30fU*e)F5#JnWA~ z_WkL&VrEQA7GYsooWVEx8>o59Ti((bg9#Xdnatu3e(-}vxLtSMwfo3NKGKNm9LFH8 zZSjvj2tU86{mTWFz$ns6|qzz?PqB*(kYXFvPdW?mh$_~MJV-xwOrcYSLhRMmCV^~O>S zt9DKjGl2txKeIs0$U+gHIpVjLTW-0ANTUH57!yrf5YjOi#AnhF1V>m}1$`nM!qODr zL^u@fXTn{BN#q+(KKbN!56p6&dqTyuh?+W)=eHCtc6lVrKn4tiWfoeP*N;OovKC0H2LE+Nk*+Ch3iDd}GrJAp!(R zilIgRincLr&@Mt@B2x^>Lb0o_zWS&Z&}y2B!GuQ)YWw%U|NUmJ2?UhNM`9R(Vvd$E{{s)MJl5 zHo8DWut_rJHpI<- zW_$M8XK&jHko)nI5(l)43B?d*b;T7|Y@rUJAT<1HfDV+(Hwt&4R08_fzy7t&ZH_tS z7_~5bwU6Hkof7Ao6JXa5&&C}yNg={pn1xtu7VLxAf_%TB(OYi0r7=C@uDkB)=AVE5 z7BVE9@L6Gn6`JW|qM1u(9J3=R{F!aE&VJinhjufCw9~z44DI9#?c*OIUZ&b{H{N(- zGs(_>@WBUPgiIG%WRb=wW?xLpBxh|wv(a4NHU1nn?HrjLtvvkj!y98F$reho5gbEp zrvVQ?{BZZc0}qT|gC;Rwci(+?BX9^a+UC!=xK$oN>mepg0GTd;FPL&)>{nh!uv~cg{KIwBHg6m=I~FQGA@3kya!Jo9hEH zgoQ@R^-ekElr5V{25oab~Re^FhdIrkSQ8UjEBIDMo?=e3_SlVHgNe15-d) z&NGx7bhc9rN^$fBd5nM3@r51U&f$PG}$|OM<&k^~-#p7*?9k-vq^g zQ29t^RR|LcfjQz+znypAefM<_J@nA%T;e|d_{Tqvn$@HeX*|tze~FMV)3?y4Ut}0p zxmocZ#K;$d`WD69`9A;r^Bd7!kGnnf(NaFgiw}VqBV8zVO&%j~&&_#9+}DCJEuhip(bPQmZK#%YQOy zz>OhZjbtMnrty114Vo)lFp{m2SkLtc0L0AXiW?(57|gE)*rZiN(t!CVC=o8m_}9Pw zbxZjHYt|AoYo0=zl=Xx@G+D?Z<3y-rrpBe2C9wj2#6RJL6JDg17RLV|9wPV~adI94 zIZtJR2GfK(FhNYIoQ1(5w!E%kA5+UbGIN9oBQab7ny;=yMhWW7xy-f9komG60F&IS zm{y1(Vb4#;KQg1X1>mi=+GlFYOy;RfQ+OfjWJ1_4?e&0@A9 z*{OT-uZHuPxFFpcY-0?+mwVChFdCsDRQ`?0jP^L6<^g7@>g1X%iDS$+nhl*o(XM45 zKMom7#Irg{9m*3!y|DsnqqI1G!w&u8{J3H!ZMfr(JDTRmepm=issX)hOn^kPEu>kV zHUroR_~`=(F)VEfvW(C3x%lFX+p*4*9l}uaVCH0Z`bBh1Wl}Lq+a;#*naX8`P6C=o z2nnS)H&#YlihI$M(h`axhMGBB( zTFp&k7v_my6RMb>JaW#%*r48F?46ycWx0$ff$5v|A8{_y+O$wZjfOY%~v> zx@P=m08_2F2!~)vd`BBY&|CxBm4I-L zIoM_%VoQW&TK&y;Res~`!_hA}*uATxanE#x)jI@9pvH#5t} zkaqrx_5d(xPYfdT8*suPQY_w!mQ+H<9MX=AJj0Tqp-ToyrvNS0?%|#_Uaf-B*Zydz zl%s)p=79N<=#Y47mrSxAU0^6}B(CioLKI&;E_#5X9grMTbKZI9HM1u0R@Gn%CA2LN z=*h!9LJ`{}+Y`KFl#%ufabqR6Ru7ua0zl0*0g!nFt zbNS_$H$=?RL{P&Z={na;l_kEN&@i!SWb=`4mPLYc2}!KPxG=M%5C}N^^wS$`7kFzh zwhy{wa%ieTG9t*-L_7FYCY7m7YohHE5X`oi4)CDmv`U>cNriq^Ck)H;Eslj&#elRc zPoqgBMDr?>2_R$+%w-UUSO;^l*8DAzzzRX-smoRuk=`J=;l2V4ZJY_nK&i|f$z|Ta zenY6jY)X+KI_<>JJapS{=}(0Ovt?%T@M^M3V$8mE@X4ceVQd)Ae5bwBHS^dZpk|xg ztu_(yuaq3^bG=+g-ICT~3=ONuT<8N>(d6nH@*SqSMnKRonB0NP%z`<3K|5wjxiM8t zElmT2bkQ-57UW}r2!j}rX4;bq1A_CziQ|$?aLuZbu3w*au6{ft4c6|Pm@w5~Thfl+&$)x#s5*BM&;xeGwmc!c4$NS3_kEKPgmU zftc*{&ZdzpjIUu%?l*MI%wRrcUL*^cP7=zG@F&@C051TB5#-0z>0=FoOs7Jv0oH}r zc7F`*Kb>9A#Vm1WJ+JRu>$L_6N3DGH!y`|YNl>V)sFCJz!c>IZ0Q)h32FPhTC+|Y&TYy0ljX*JB@rM;;)N^X^ z?wCQu4WkKyIT1`r`F^M*zVsLc@Pnz@2c0X3)6CifrN})j{j&qjtjQ_-dgM;MPf^<9 zG!TouLO`ZdoT(({F@fq&_%Usm_9yvX&0W=^n8u7SuO5R*_4$=P0sGmQ{9Uh+bD~jI zD}7@Ye{Vg&ji$6PSxhVTbR0S)jH$8l(8ig0aRd}AU}thIAnpB7BJC4u&`J;L49bZj zCZAigJAG}bTK7_Zvi^=49i-v)+Lh6mW6tU4sUOJ>rj@(!8v+h0Cy;8celxvQaI4QB zN;69{`41rjKwx1OB*+fYBnOx(fG2H;{qh!K@GpqN-%g0g6B?C3{il}g%l??wiGd&1 zLW&N$O^U9j6@^YL5R)ng3lY~aOYywcWh1nMEX7bU6LRH0n9uqEsz5nRumC7hJZF(L zabDXOBLw#IzyAwhND-j#U;CD&`sXCVD5 zMt$MaSR&ey+&oF^42$u$4rW#tc@~A4CZFyC?IN-~wLVyb>};0;lLuAco}8>no}=u~ z&u_jp^AEsEHmLf4%t`k`KX02k%ggFqz;IeA*6goIB0@)k-`q}wBKI2WEYL{5f5y;B zAOqr=e*mazoOsiaNRaAN_L92|^YR?ypdcI5b+EhMHtwecG9XL^4r*AC|Xo)t60Ft>e>~SaZi1zxC>-PMiBl z-e=wQTFy@#JeJxyGDxZwl=b2$e*r<2fXokRw&=Bggm7t)5Em@Lw&z$owd8cHf|$LZV{ZZ@|z?5s)V5jhgOOc6@)7h zFdDIxvY1d!RFz@!p_NdBn2LCMa3@uY`^>8*x+dTUg)!z>g{$Uali*NvPv-=rD^U{P zSo@cJ(m~k&3<6?f!psVS3}qiNl_!sN4`k8&4bz61c|t3R=$IqP>3)Y?pSk&)f1Mm{ z>@&arcMWy&;;1S>6Piz6eqlSNO8oaTL$uOwpisTDnqTYHzf>*6SZL=+ABCwgsx)x+ z3dd=YNdJz?iCU&!pb)1%-N?AYf!&z{b&IZ17{sDg6Bx1aq5}1gODI7BGjIun(Z3P za@a^e*wuNa`AWhdPYtI9!^HWzm=oKxm}-(H1cU~C25B$rFtMaT1wQ64V^iO?5SP#w zmNa>p7oqd5iA#~&@t*#Yht4Z%%uRAYNRvkz@)UU0%>15E%>J^P*=pWQTBZZg5kOl& zeV9gONE|90fNcA3<(L!(P7LYBhq)f21@hM#XarDtkdO0VQXW?7H&*w-Pao89Ddr$u zDJRQ~q&dxgl_U3&cyONMV2M1cP-F1w0>&b}H&Sn`E~#9l`AX6t(hc2)Fp}@mck;4c ziQUhn)R#(3s?V(FxmN0>io*aFbMKy#4muwM_ykGph=59PX_^jW`bmp^sxhxqBMhvO zhiPfIFeW7~YfxlBll14Ne>NS6wUJwlO8Ca=+07TBS=y*-00boDNPA*ptvs!)*;%*2 zpl3OJ_qF1sJ}g2y)TDL1lE_lJsL_Ua-Um3XSrFSinwwB(Rz>EgpFjh=MX#P@A!O^L_`hX|9`8Can(zSFn~j=jBo=L&7mJWZu@5H*eB%$#*DMSNO9muKVuS@#;GaeDht>ebRFLY+w3Gd<7dJT;H#zyNxhuvaZj1 zgb9^_6MBNIZWG+=95i$cOz8ZiAl)|)25X|$GFo3cm2P(ejp3|Ft|@`HI zm3!3iBLJm7`j?kd^xIkLbv-~NTLk>*{gIpP$EE0jiA-+(y@qS*|IOPzndk^_>Zva~ zGie2oVG>LSlc#Fn@A#d5=K!>*o+)n&gyi*Rm1s%CSFKFwQB7q(>_8X-HK>&Z!&#EJ zh5G(G*YBf9a~zaduibUr3BloK0VnZiJvKmzp!;BE-lNB_(^!f?03#@4>NDAS3*-X; zpajkFqcy*og-XP0ErELDGitmjR!haDAEG4r&8H1wnnwwkw+WS$DuQJpfR{o0ge*0# z?9an?%oIx!`rlG}|&W_yhRJ-2DmdDV8`*O*JpX3%SG)ub8HiY!Zfe1$S%blObPP4B-X{>9(Med4EG<&wh6Vqw)XE%>M$& W#^eyOwOvyH0000PbXFRCwCW+$blD< z^T%`T=REtIv-iE%y4St--sfre@=7}X{qKMKy!hgaKls59*2(|Zawyz&*In(}wfpR6 zKfA{sdkknfKJ}?jb?erxYuBzH{_uy7J@(k$ci(-@HP=+!Hs*_gtFs!V53Vn>R1z|NQ4aOO`CT?z-!o^!25eUaHo5x?ZS|YHb9h z-ODTW(3uZ?=tGY@@(4h+GO(u6pxJA$z4qL5&tAQH`P^^6{hU1f@WY|7%PzY>JavW) z83M;Ie({T&Z@&465hK3-^{)f;JKy<^U)Ni2y~{7Z{G^jkQs=nijyvtN(=NH>l54NM z_J|{n=-s>b>8GE5)m2yh{O3P+@^hd2+{q`O9ApOQB?T40?Iv4qz4e$eW8ihlDW}|U!wqio?sva?r=51< z=KcEhyW)x~@GJwLIddlK#^7$KGK)U`_~SLnPoMeBXWVD%)TxHE8vlV0e85wjkF^&0 zwuKqmt=tHfHnnRxavrNH3s4<8bO0HQfCX6|ec^={>gupz!}i~Qe<-NtCn)$DVs(J# zZEt%U-oVK3d*Az{xz zelTm+tiS#3Z|9$XzCraA=h=Hv*=oeIFSQ(6rirmrF(d$SRj_Wj;fDC}YhU{s3+2?$ zJo60i_LV&bS$4;YePv?Illu#9{2B|x2q}XAhd_T^%W=U47hsQd*Il<$r%pzN*9%{8 zH*D&-+n2xmWjx@g9e3PO0l2Y!_t7NdS7cRfj{n6(+Jf@RL^gbn95obDX)bj58YnaG?m#{<3#r#oXe7uaIVsJcdoV>5gaK8s@4oxSh!{Bg1+>v3 za-I3X4}O3{42I~BTY+fsa0Lfvm8`x?moA17Q8)>4t@`CJe~FiW_q*Tu$!NKW2N{yI zFb_)MH^2E!E6uRF*sS*b^{; z2L9oPANJ6VH{Lj&)TiZ8h}w%@_Bb)NjXbdOk>%Z>(L~K!qvZ&i5TW)J#QOX1zaQ?Y z|A#;Pp<~C6bW+5VpGlJi~(=ePx)=JL4*5&XJj|8?rKHi%FeCtYiZM z@#}r}-G?sJ|I?rTR6)OU=g#26JOnbjNF$>SV#_|uTHC@5?N++Mo_F4PAd6jSE*k*~ zaGha6fBy5IpM3JkT*B`7;~)R{M?j=Y>#x7QGvGV*)Kl>TTtMKbx4-@EzP|IF??ebl z*%_v77zjA@;#NQY@sBe+su2dL77tLVixw@?2DxkrDf*#kiU`SbKk|`}sdQhnkfjD{;j7?z7JB>rFd z%2xz#K@Xok_Sj=lnhxE5$2;CZHXuYNCDVpVc=SZ~0U|)j51~(xOikx;#ipBXn&;Aa zbb?#CT=R^m&uEx@8b7XPNLC{@a0nn2`yF@O0h$W6Qbu+pg5kA0@4S;Tzx(dH$xr$` ze)rTe;OOOJstqPwK5Xo%F`f8&I9XG$y5Zw2#mFy#D&@^^+~@ zC(s{w-~mKToThI;sWFJvi0MSAAjSaw${x9J6hiQQ&wJj3DArzkZ6+-G-*wkrQ6TCV zJin%9Jch4Km@vUl*Is*V9P2NC`HP>@Hmprl1ZW2CB&;z5LSK#8AmI!5@jm8LF1%pD z0#pku2DN0#64eBmf{E{AVXD@7*D_TOOCgONJJx;X&z}#trAwDG+l)laxog+1@-B=F z0v8e+DnI+|v#y1RIwac9e)cnupn_whoDPU)6SD?G;rkf!9>tFvm zZVnV?m^gz63>y%0xj2Sul*tCa!n&p}B*%2Fag}0_V#TWBp>!@DLnkDerofu)@x~*| z;>dml-Y3FT{H2`kx#u2iAZ>+Fra^U#RSGqbm0!Un6Aoxv9;J>X4I4c4&_nQYXAHyK z!U>3&m}gn(KZZ3z0fLPK6h*>F-1lgM!H`h_^AseFx)qs2Ckw*fVlUQDMd)Z}|vDwlsg!ACRgSD37i#EG%lh{Tu}chgl8m8T0wHTwl(gv&jJDOXX!u@PN`BkH86*fNpiWRj?< zQ>W%y13+e=1zI(u1!xqR7?njDnF9VXJQ+oz;+9)(k@yOs8WuM2bSf>AoYWh;ro-fQ z#!uF_y08H&Ap4;+dGh2kSWQH5daDo0dX<_wrsn9;qggaNs++)wfE_n(9H4{9;>C-7 zI*AbYHE%U$UVyNGgq`t%`?X{lkuhN15eE3fx8k+w&V z9)?+c!$X#U-oUhRL9E?M6b3|W%A!Sc=KhUGmMQ)I_rGUr5*W>5cO~y7ONkpvikQZJ`|X#jgsgZ=6UD$(!CH0fY{EyeUPN&V>*~ykJ+p60WZlBN;@9)g2IP zC^hrH2qBl#D$sYW=e{v)5Z_E0{dMZpiNR+6kj~fJ>W>Uc9Z?0cSvoBU()oNg3$bO{ z#F0lH>148aAVv(ic~W~7R3kZZ6&{B*4qet}^Tgl?YeUPoG;FPwL(-8YMlsL$+?aKV_&Q~MS!TquSFreK88)bG%tgLbC_>8eg<_9Uj7&gT-E zL5iW8NBHU~WGo1ffHF3$$f-`WL=b7(Y3^B897QagW}}UO<|LaKIdUYiRT0dQnXv!0 z%{GyZ<&xY?Kv|2qo6d8k3I%Jn99Wn*rDoF4Q%^k=dj`tpGE^0G7+!c5^qvK*zyJO3 zyjU)02ywTbdt!FeV2RwS)-vMtfinD_oY>cX{rbU?HpsK!i(5q3JbkB~c9P?va+cAS zrLZ>fZ0#rkt6(hw1BXy1DUMmYS=FlWf&~jw?%A`a zoNegPp^SIXph0e1D!7KEY5uWXiFKCiJp%f>?6M1?k_lOKapH+53T0WjaTC>ySs1)6 zQwJ-KY;!SOVC7J=XV2!L#QBp?KFN{i&!4ZM0#`P>QChw(UAi=S9(*p$+6k>%h)kI> zg}w6tN~4%3Pl*O#_~7W$r3=DQzuF@$o-}EaLg&t%GgPXi(lnPLURY!_331|UM2VH!hO$2JRV15C6C zt@&ys;uapH!6{1|I2px~S>vLntc)FX)KN_XYL(Hfe4btQ*5Z=r&u7^JKP7##=*`n5 zmvCXWz|H>T<|dy^Zb4kulwH9|;fUF$TR5`+G7txJe3Hd>muG{i`04AkY15v5`e_PU z!pc0$0y=i=$dEzC5=*pDZ(<<3E>g;8@O4Ro*b30Xir8#3IZ31OJtYrWi75v}2<%ZD zJLjBpIQ5Gyhlc8sp2RemTkB7L5{VHT!ffVeTgmFm#NrmqhVhk*Y;Bb;`;|M&&2PKyHd2O&VRxXB z?Bf9i#v7W`P_$d2Mz;&Ka44_>cg(Xo&=e%g?HCS0mr;SOesyO}749G_cHMN-O@$hI zrNDR?8p)P}tX&5Bl54r=>rHl7Tv(LW`+OP_FwpG3`Z{9qS`qE1;<%wFB9hq?Fo@`J)wrJ6!yYIfcG?4QEVnH%=)$&F| zlfhdxUB_ZCA=9#*s#as{r&jy10=HrCI77Z<$&#kRqhyB~J$#O1Y`KW2z;*@(DqtuWiCq_wL<;HGxdt`c*F? z%Su)+8)H@p&(;GJ^3DcTK*pm54a#mG(V2NtR1Ef%Q%-4>(d#*0u0*SqSZ?*EKr4D} z`pvSIUNnsK2P^M74|GM@lu6P8igUuo=I!QFp zM2(}yQ%7FF0Y$AWH8-aU^#qaW6;fUni&vPes14aU+3fIg!xtBkywV9tUMq*D_IMcg z@7ApwIZ<-(zWeU0S>xEjvfGee%N$s{Hp1#41`rm1uZ_M0b}-T)QJcEd)|zdpMd^%z z^9cHN?N@D1V79WOD3$^OG&}FS^8*h&PzG4rX9f-&Nbv5x_ukUwjW*h-CKwTGP+oui z^>azRe&<2y{%hIqwSvfIDkNvLZ05|F*r03Iu4x}+Jv&PY4?p~{bgSk@OO5A@BvK;3 z&N}P7DvM>BqWN3}ES&Zv5*AGbT&QJ9qB)t6W_0M#;h1BN0Xl;vX`9WHXtZzNUIDXZ zJemaf+GlLrt#J6txIOmRV{(`qZ@f_iE32exUv7DMP|ExGo*lg3?C@LUDaHK|06Xr_A(IpmPtcH6DF<2*L&tEiwo(P0^e zCRx44HQhGNBEHgo!u`%W@65DIHXb{_;f5PF*G`&5_Nr2* zLVWWWHEI;IO}ddxuj#6JQL$d_D8t0>s6b;trZ9Et)XX5~o}D{)PRr{;^`oQ9rCtlT zZBkt?x9o%+GiJ<{S6(TIRfqW(lhHn9Y>-Vc>05KIuTa)>S;p(~wI(ezSuZJXh$0ij z6*il6ls%9#E+i(DH7QtYYpKFlOqB)G3{`l1Rk18BTn()sFMD}42K!h{L0tQMPS7IoAdO)FXE(KU)SQIJ$++ikbadI!NE!3nF@ zqMRek#?7NuoO~_ucEwd!I=Rn2`w)OvU3FEbPMy+jq{c}hn+=4S>4>lO=+UFOyxK%L zWkmd{gW5#DSuVwvm-cGFmVH)UBXI`4=bn3RGb>}T3Ig(h2Oe1bpv{+Ec3E?;$*SVn z>dy@~+|a*&f0RFE%9Jc`WKrw9^Uk~f{`(g%UYuUle%0*BZmQbl9uoQHyibkda%FEb z+0C0Y8Q|s$P_57B>)B_Yop<=aiWWjsgjX$k%7d@C;)+66h0QkGY`Lk*D&bkwBU1J1 z)k{M&<5?^wCdj^I>rH#iTTAU;!;!AKNik;irx`k$E*YKB9K}{U4eHoxtF4IWv`TC^ z^w2|Nm3!{FXDu5WhPiX+)*4zRjsI-faH3ePL4jGGhMRIFUZ9tQi(YeGBki4< zdukdt11vMfm3Q26M>gU$H-a?7S2IANFOQIg@4x^4SSw4P&Ufk3#oZ(qYWh{=$Tp-B z=|w@Sif1bv-+ue;d+f2tHP>7tQ;3<+3F*>t#~ml5UAlDXt+(FV%zWxaj#uW{s_DYa z^X|Lvz9J#caa)Kit4RX-OkT9n-$fvlN{G*jxl1!^R?+Pdqm%go8L%ob`= z&z?PXC%YH2>mbX_wYh}&eZJ*b+yi;)2GXuk^8J!v%sAh#j+sxJnXQ;z)|n(l&={0%v8u(xR;E#j@hb+8!Dq)C%HcI@c0IkQ>sCiujLvR*kWI&PW| ztErHZt~Mz+Yo$hR`|Y={eOJM#09|(DVtu9aAA0B^%^Npv+_LqPWV>^=Mh_l5c*`xf ztT+6!afWdKozvv<*|TT+#CX_4gT=R1u4lQ-K?fal$t9N%F?vqNG~h_|aS+sypns&(RIk#yPcv$JbgNmIT8qV9h6){v zbrfz@NPIh}<$!Enz(w(_m>C)149}|NS#+bJI7kGG(hlubs-EUfoH%j(`0#NwyDBw3qNn-ZahOX;5sTPeu&YouWy+LT zYtEDied38Hv^#%J(quFbil;{p)G9igl0);Muzz(}Eq@>r{)BFjV0ocEVkFwf#=E;n%ktCOJua|$t_22UZRBx zl-J6?yLa!Nz)%zO8jr7u2S!aQB#w<7Ig+*J#fr$==F-M19RCN Date: Wed, 11 Jan 2023 09:57:54 -0500 Subject: [PATCH 62/64] added CLI-GUI Bridge app & Text Viewer app --- applications/plugins/cli_bridge/.gitignore | 1 + applications/plugins/cli_bridge/LICENSE | 674 ++++++++++++++++++ applications/plugins/cli_bridge/README.md | 24 + .../plugins/cli_bridge/application.fam | 10 + applications/plugins/cli_bridge/cli_control.c | 109 +++ applications/plugins/cli_bridge/cli_control.h | 8 + applications/plugins/cli_bridge/cligui.png | Bin 0 -> 8410 bytes applications/plugins/cli_bridge/cligui_main.c | 131 ++++ .../plugins/cli_bridge/cligui_main_i.h | 41 ++ .../plugins/cli_bridge/console_output.c | 13 + .../plugins/cli_bridge/console_output.h | 4 + .../plugins/cli_bridge/internal_defs.h | 118 +++ applications/plugins/cli_bridge/text_input.c | 31 + applications/plugins/cli_bridge/text_input.h | 5 + applications/plugins/text_viewer/.gitignore | 52 ++ applications/plugins/text_viewer/LICENSE | 21 + applications/plugins/text_viewer/README.md | 9 + .../plugins/text_viewer/application.fam | 16 + applications/plugins/text_viewer/hex_viewer.c | 282 ++++++++ .../plugins/text_viewer/icons/hex_10px.png | Bin 0 -> 171 bytes .../plugins/text_viewer/textviewerflipper.PNG | Bin 0 -> 11796 bytes 21 files changed, 1549 insertions(+) create mode 100644 applications/plugins/cli_bridge/.gitignore create mode 100644 applications/plugins/cli_bridge/LICENSE create mode 100644 applications/plugins/cli_bridge/README.md create mode 100644 applications/plugins/cli_bridge/application.fam create mode 100644 applications/plugins/cli_bridge/cli_control.c create mode 100644 applications/plugins/cli_bridge/cli_control.h create mode 100644 applications/plugins/cli_bridge/cligui.png create mode 100644 applications/plugins/cli_bridge/cligui_main.c create mode 100644 applications/plugins/cli_bridge/cligui_main_i.h create mode 100644 applications/plugins/cli_bridge/console_output.c create mode 100644 applications/plugins/cli_bridge/console_output.h create mode 100644 applications/plugins/cli_bridge/internal_defs.h create mode 100644 applications/plugins/cli_bridge/text_input.c create mode 100644 applications/plugins/cli_bridge/text_input.h create mode 100644 applications/plugins/text_viewer/.gitignore create mode 100644 applications/plugins/text_viewer/LICENSE create mode 100644 applications/plugins/text_viewer/README.md create mode 100644 applications/plugins/text_viewer/application.fam create mode 100644 applications/plugins/text_viewer/hex_viewer.c create mode 100644 applications/plugins/text_viewer/icons/hex_10px.png create mode 100644 applications/plugins/text_viewer/textviewerflipper.PNG diff --git a/applications/plugins/cli_bridge/.gitignore b/applications/plugins/cli_bridge/.gitignore new file mode 100644 index 000000000..600d2d33b --- /dev/null +++ b/applications/plugins/cli_bridge/.gitignore @@ -0,0 +1 @@ +.vscode \ No newline at end of file diff --git a/applications/plugins/cli_bridge/LICENSE b/applications/plugins/cli_bridge/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/applications/plugins/cli_bridge/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/applications/plugins/cli_bridge/README.md b/applications/plugins/cli_bridge/README.md new file mode 100644 index 000000000..446f3b8a9 --- /dev/null +++ b/applications/plugins/cli_bridge/README.md @@ -0,0 +1,24 @@ +# flipperzero-cli-bridge +Allows CLI control from GUI, giving untethered access to sub-ghz chat, system diagnostics, and more. +# Installation +## Easy way - get a .fap file from the releases page +Swing by the [releases](https://github.com/ranchordo/flipperzero-cli-bridge/releases) page, and download a pre-built .fap file for the latest flipperzero firmware. Use [qFlipper](https://flipperzero.one/update) to copy the .fap file into SD Card/apps/Tools/. MAKE SURE TO UPGRADE FLIPPERZERO FIRMWARE TO NEWEST VERSION BEFORE INSTALLING. +## Hard way - building from source +The following commands will (probably) not work on Windows. If you run Windows, use wsl or a linux vm or something. +```sh +git clone https://github.com/flipperdevices/flipperzero-firmware +cd ./flipperzero-firmware +git clone https://github.com/ranchordo/flipperzero-cli-bridge ./applications_user/flipperzero-cli-bridge/ +./fbt fap_dist APPSRC=applications_user/flipperzero-cli-bridge +# If everything went well, the built .fap file can be found in ./dist/f7-D/apps/apps/Tools/cli_gui.fap +``` +# Usage +On the flipperzero, you should be able to find a new application (CLI-GUI Bridge) under Applications->Tools. Opening it will result in a text prompt - the prompt for the command line. Enter a suitable command (quickly pressing the back button will input a space) such as `subghz chat [freq in hz, e.g. 310000000]`, etc, then navigate to and press the SAVE key. You should then see the command window. Use Up and Down to scroll, and use Left or Center to get back to the text input prompt. A quick tap of the back key while viewing the console output sends a Ctrl-C to the console. +## Exiting the app +Holding and then releasing the back key for at least a second or so (long press) will exit the app normally, meaning that the inner terminal will send Ctrl-C and close. Any sessions will be disconnected. + + +Holding and then releasing the OK key for at least a second or so (long press) will exit the app while keeping the terminal open. Terminal output will be cleared the next time you launch the app, but whatever command or session was running previously will be resumed. This is especially handy with subghz chat - exiting the app while keeping the terminal open will not disconnect you from the chat, and the flipper will still vibrate briefly whenever a new message comes in (even if the app is closed). + + +NOTE: USB functionality (qFlipper, normal USB CLI) may not work after running the app (especially after exiting without closing the terminal), simply restart your flipper and all USB functionality will return to normal. diff --git a/applications/plugins/cli_bridge/application.fam b/applications/plugins/cli_bridge/application.fam new file mode 100644 index 000000000..c9baa5254 --- /dev/null +++ b/applications/plugins/cli_bridge/application.fam @@ -0,0 +1,10 @@ +App( + appid="cli_gui", + name="CLI-GUI Bridge", + apptype=FlipperAppType.EXTERNAL, + entry_point="cligui_main", + requires=["gui","cli"], + stack_size=8 * 1024, + fap_icon="cligui.png", + fap_category="Tools", +) diff --git a/applications/plugins/cli_bridge/cli_control.c b/applications/plugins/cli_bridge/cli_control.c new file mode 100644 index 000000000..e159d7424 --- /dev/null +++ b/applications/plugins/cli_bridge/cli_control.c @@ -0,0 +1,109 @@ +#include "cli_control.h" + +#include +#include +#include +#include "cligui_main_i.h" +#include + +volatile bool gotCallbackSet = false; + +FuriStreamBuffer* tx_stream; +FuriStreamBuffer* rx_stream; +static FuriThread* volatile cliThread = NULL; +static void tx_handler_stdout(const char* buffer, size_t size) { + furi_stream_buffer_send(tx_stream, buffer, size, FuriWaitForever); +} +static void tx_handler(const uint8_t* buffer, size_t size) { + furi_thread_set_stdout_callback(tx_handler_stdout); + cliThread = furi_thread_get_current(); + furi_stream_buffer_send(tx_stream, buffer, size, FuriWaitForever); +} +static size_t real_rx_handler(uint8_t* buffer, size_t size, uint32_t timeout) { + size_t rx_cnt = 0; + while(size > 0) { + size_t batch_size = size; + if(batch_size > 128) batch_size = 128; + size_t len = furi_stream_buffer_receive(rx_stream, buffer, batch_size, timeout); + if(len == 0) break; + size -= len; + buffer += len; + rx_cnt += len; + } + return rx_cnt; +} + +static CliCommand_internal* getInternalCliCommand(Cli* cli, const char* name) { + FuriString* target_command = furi_string_alloc(); + furi_string_set_str(target_command, name); + CliCommand_internal* command = + CliCommandTree_internal_get(((Cli_internal*)cli)->commands, target_command); + furi_string_free(target_command); + return command; +} + +static void session_init(void) { +} +static void session_deinit(void) { +} +static bool session_connected(void) { + return true; +} +static CliSession session; +void latch_tx_handler() { + Cli* global_cli = furi_record_open(RECORD_CLI); + + CliCommand_internal* help_command = getInternalCliCommand(global_cli, "help"); + cliThread = help_command->context; + + furi_thread_set_stdout_callback(tx_handler_stdout); + if(cliThread != NULL) { + ((FuriThread_internal*)cliThread)->output.write_callback = &tx_handler_stdout; + } + + rx_stream = furi_stream_buffer_alloc(128, 1); + tx_stream = furi_stream_buffer_alloc(128, 1); + + session.tx = &tx_handler; + session.rx = &real_rx_handler; + session.tx_stdout = &tx_handler_stdout; + session.init = &session_init; + session.deinit = &session_deinit; + session.is_connected = &session_connected; + cli_session_close(global_cli); + cli_session_open(global_cli, &session); + // Unlock loader-lock + Loader* loader = furi_record_open(RECORD_LOADER); + Loader_internal* loader_i = (Loader_internal*)loader; + loader_i->lock_count = 0; + furi_record_close(RECORD_CLI); + furi_record_close(RECORD_LOADER); +} +void unlatch_tx_handler(bool persist) { + Cli* global_cli = furi_record_open(RECORD_CLI); + // Stash cliThread if not null + if(cliThread != NULL) { + CliCommand_internal* help_command = getInternalCliCommand(global_cli, "help"); + help_command->context = cliThread; + } + // Switch to new session + if(persist) { + // Use dummy debug firmware function as is_connected + cli_vcp.is_connected = &furi_hal_version_do_i_belong_here; + } else { + // Send CTRL-C + char eot = 0x03; + furi_stream_buffer_send(rx_stream, &eot, 1, FuriWaitForever); + } + cli_session_open(global_cli, &cli_vcp); + furi_record_close(RECORD_CLI); + // Unblock waiting rx handler + furi_stream_buffer_send(rx_stream, "_", 1, FuriWaitForever); + // Reconfigure stdout_callback to cli_vcp + if(cliThread != NULL) { + ((FuriThread_internal*)cliThread)->output.write_callback = cli_vcp.tx_stdout; + } + // At this point, all cli_vcp functions should be back. + furi_stream_buffer_free(rx_stream); + furi_stream_buffer_free(tx_stream); +} \ No newline at end of file diff --git a/applications/plugins/cli_bridge/cli_control.h b/applications/plugins/cli_bridge/cli_control.h new file mode 100644 index 000000000..9ea959155 --- /dev/null +++ b/applications/plugins/cli_bridge/cli_control.h @@ -0,0 +1,8 @@ +#pragma once + +#include +#include +extern void latch_tx_handler(); +extern void unlatch_tx_handler(bool persist); +extern FuriStreamBuffer* tx_stream; +extern FuriStreamBuffer* rx_stream; \ No newline at end of file diff --git a/applications/plugins/cli_bridge/cligui.png b/applications/plugins/cli_bridge/cligui.png new file mode 100644 index 0000000000000000000000000000000000000000..57a97049ee9f9774e2e02b7e942e86cbe4b01da4 GIT binary patch literal 8410 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 zWqdata->streams.app_rx); + for(size_t i = 0; i < available; i++) { + char c = 0; + size_t len = furi_stream_buffer_receive(app->data->streams.app_rx, &c, 1, 100); + if(len > 0) { + furi_string_push_back(app->text_box_store, c); + } + } + if (available > 0) { + text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store)); + } + // Set input header stuff + size_t len = furi_string_size(app->text_box_store); + size_t idx = len - 2; + while (idx > 0) { + if (furi_string_get_char(app->text_box_store, idx) == '\n') { + idx++; + break; + } + idx--; + } + text_input_set_header_text(app->text_input, furi_string_get_cstr(app->text_box_store) + idx); + UNUSED(app); +} + +ViewPortInputCallback prev_input_callback; +volatile bool persistent_exit = false; +static void input_callback_wrapper(InputEvent* event, void* context) { + CliguiApp* app = context; + if(event->type == InputTypeLong && event->key == InputKeyBack) { + persistent_exit = false; + view_dispatcher_stop(app->view_dispatcher); + } + if(event->type == InputTypeLong && event->key == InputKeyOk) { + persistent_exit = true; + view_dispatcher_stop(app->view_dispatcher); + } + if(app->data->state == ViewTextInput) { + text_input_input_handler(app, event); + } else { + console_output_input_handler(app, event); + } + prev_input_callback(event, app->view_dispatcher); +} + +int32_t cligui_main(void* p) { + UNUSED(p); + CliguiApp* cligui = malloc(sizeof(CliguiApp)); + cligui->data = malloc(sizeof(CliguiData)); + + latch_tx_handler(); + cligui->data->streams.app_tx = rx_stream; + cligui->data->streams.app_rx = tx_stream; + + cligui->gui = furi_record_open(RECORD_GUI); + cligui->view_dispatcher = view_dispatcher_alloc(); + cligui->view_dispatcher_i = (ViewDispatcher_internal*)(cligui->view_dispatcher); + prev_input_callback = + ((ViewPort_internal*)cligui->view_dispatcher_i->view_port)->input_callback; + view_port_input_callback_set( + cligui->view_dispatcher_i->view_port, input_callback_wrapper, cligui); + view_dispatcher_enable_queue(cligui->view_dispatcher); + view_dispatcher_set_event_callback_context(cligui->view_dispatcher, cligui); + view_dispatcher_set_custom_event_callback(cligui->view_dispatcher, cligui_custom_event_cb); + view_dispatcher_set_navigation_event_callback(cligui->view_dispatcher, cligui_back_event_cb); + view_dispatcher_set_tick_event_callback(cligui->view_dispatcher, cligui_tick_event_cb, 100); + + view_dispatcher_attach_to_gui( + cligui->view_dispatcher, cligui->gui, ViewDispatcherTypeFullscreen); + + view_dispatcher_send_to_front(cligui->view_dispatcher); + + cligui->text_box = text_box_alloc(); + view_dispatcher_add_view( + cligui->view_dispatcher, ViewConsoleOutput, text_box_get_view(cligui->text_box)); + cligui->text_box_store = furi_string_alloc(); + furi_string_reserve(cligui->text_box_store, TEXT_BOX_STORE_SIZE); + furi_string_set_char(cligui->text_box_store, 0, 0); + text_box_set_text(cligui->text_box, furi_string_get_cstr(cligui->text_box_store)); + text_box_set_focus(cligui->text_box, TextBoxFocusEnd); + + cligui->text_input = text_input_alloc(); + text_input_set_result_callback( + cligui->text_input, + text_input_result_callback, + cligui, + cligui->text_input_store, + TEXT_INPUT_STORE_SIZE, + true); + view_dispatcher_add_view( + cligui->view_dispatcher, ViewTextInput, text_input_get_view(cligui->text_input)); + + view_dispatcher_switch_to_view(cligui->view_dispatcher, ViewTextInput); + cligui->data->state = ViewTextInput; + + view_dispatcher_run(cligui->view_dispatcher); + + view_dispatcher_remove_view(cligui->view_dispatcher, ViewConsoleOutput); + view_dispatcher_remove_view(cligui->view_dispatcher, ViewTextInput); + text_box_free(cligui->text_box); + furi_string_free(cligui->text_box_store); + text_input_free(cligui->text_input); + view_dispatcher_free(cligui->view_dispatcher); + + unlatch_tx_handler(persistent_exit); + + furi_record_close(RECORD_GUI); + + free(cligui->data); + free(cligui); + + return 0; +} \ No newline at end of file diff --git a/applications/plugins/cli_bridge/cligui_main_i.h b/applications/plugins/cli_bridge/cligui_main_i.h new file mode 100644 index 000000000..b3b5823c9 --- /dev/null +++ b/applications/plugins/cli_bridge/cligui_main_i.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "internal_defs.h" + +#define TEXT_BOX_STORE_SIZE (4096) +#define TEXT_INPUT_STORE_SIZE (512) + +typedef enum { + ViewTextInput, + ViewConsoleOutput, +} CliguiState; + +typedef struct { + CliguiState state; + struct { + FuriStreamBuffer* app_tx; + FuriStreamBuffer* app_rx; + } streams; +} CliguiData; + +typedef struct { + CliguiData* data; + Gui* gui; + TextBox* text_box; + FuriString* text_box_store; + char text_input_store[TEXT_INPUT_STORE_SIZE + 1]; + TextInput* text_input; + ViewDispatcher* view_dispatcher; + ViewDispatcher_internal* view_dispatcher_i; +} CliguiApp; \ No newline at end of file diff --git a/applications/plugins/cli_bridge/console_output.c b/applications/plugins/cli_bridge/console_output.c new file mode 100644 index 000000000..933ee8431 --- /dev/null +++ b/applications/plugins/cli_bridge/console_output.c @@ -0,0 +1,13 @@ +#include "console_output.h" + +void console_output_input_handler(CliguiApp* app, InputEvent* event) { + if(event->type == InputTypeShort && (event->key == InputKeyOk || event->key == InputKeyLeft)) { + view_dispatcher_switch_to_view(app->view_dispatcher, ViewTextInput); + app->data->state = ViewTextInput; + } + if(event->type == InputTypeShort && event->key == InputKeyBack) { + char eot = 0x03; + furi_stream_buffer_send(app->data->streams.app_tx, &eot, 1, FuriWaitForever); + } + +} \ No newline at end of file diff --git a/applications/plugins/cli_bridge/console_output.h b/applications/plugins/cli_bridge/console_output.h new file mode 100644 index 000000000..63e0d9afe --- /dev/null +++ b/applications/plugins/cli_bridge/console_output.h @@ -0,0 +1,4 @@ +#pragma once +#include "cligui_main_i.h" + +extern void console_output_input_handler(CliguiApp*, InputEvent*); \ No newline at end of file diff --git a/applications/plugins/cli_bridge/internal_defs.h b/applications/plugins/cli_bridge/internal_defs.h new file mode 100644 index 000000000..cdb5f2fa9 --- /dev/null +++ b/applications/plugins/cli_bridge/internal_defs.h @@ -0,0 +1,118 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +typedef struct { + FuriThreadStdoutWriteCallback write_callback; + FuriString* buffer; +} FuriThreadStdout_internal; + +typedef struct { + bool is_service; + FuriThreadState state; + int32_t ret; + + FuriThreadCallback callback; + void* context; + + FuriThreadStateCallback state_callback; + void* state_context; + + char* name; + configSTACK_DEPTH_TYPE stack_size; + FuriThreadPriority priority; + + TaskHandle_t task_handle; + bool heap_trace_enabled; + size_t heap_size; + + FuriThreadStdout_internal output; +} FuriThread_internal; + +DICT_DEF2(ViewDict, uint32_t, M_DEFAULT_OPLIST, View*, M_PTR_OPLIST) +typedef struct { + FuriMessageQueue* queue; + Gui* gui; + ViewPort* view_port; + ViewDict_t views; + + View* current_view; + + View* ongoing_input_view; + uint8_t ongoing_input; + + ViewDispatcherCustomEventCallback custom_event_callback; + ViewDispatcherNavigationEventCallback navigation_event_callback; + ViewDispatcherTickEventCallback tick_event_callback; + uint32_t tick_period; + void* event_context; +} ViewDispatcher_internal; + +typedef struct { + Gui* gui; + bool is_enabled; + ViewPortOrientation orientation; + + uint8_t width; + uint8_t height; + + ViewPortDrawCallback draw_callback; + void* draw_callback_context; + + ViewPortInputCallback input_callback; + void* input_callback_context; +} ViewPort_internal; + +typedef struct { + FuriThreadId loader_thread; + + const void* application; + FuriThread* application_thread; + char* application_arguments; + + void* cli; + void* gui; + + void* view_dispatcher; + void* primary_menu; + void* plugins_menu; + void* debug_menu; + void* settings_menu; + + volatile uint8_t lock_count; + + void* pubsub; +} Loader_internal; + + +typedef struct { + CliCallback callback; + void* context; + uint32_t flags; +} CliCommand_internal; + +#define CLI_COMMANDS_TREE_RANK 4 +BPTREE_DEF2( + CliCommandTree_internal, + CLI_COMMANDS_TREE_RANK, + FuriString*, + FURI_STRING_OPLIST, + CliCommand_internal, + M_POD_OPLIST) + +#define M_OPL_CliCommandTree_internal_t() BPTREE_OPLIST(CliCommandTree_internal, M_POD_OPLIST) + +typedef struct { + CliCommandTree_internal_t commands; + void* mutex; + void* idle_sem; + void* last_line; + void* line; + void* session; + + size_t cursor_position; +} Cli_internal; \ No newline at end of file diff --git a/applications/plugins/cli_bridge/text_input.c b/applications/plugins/cli_bridge/text_input.c new file mode 100644 index 000000000..295e7629d --- /dev/null +++ b/applications/plugins/cli_bridge/text_input.c @@ -0,0 +1,31 @@ +#include "text_input.h" +#include "cligui_main_i.h" + +void text_input_result_callback(void* ctx) { + CliguiApp* app = ctx; + char* data = app->text_input_store; + size_t len = strlen(data); + for(size_t i = 0; i < len; i++) { + if(data[i] >= 0x41 && data[i] <= 0x5A) { + // Char is uppercase + data[i] += 0x20; + } + } + furi_stream_buffer_send(app->data->streams.app_tx, data, len, FuriWaitForever); + furi_stream_buffer_send(app->data->streams.app_tx, "\r\n", 2, FuriWaitForever); + data[0] = 0; + view_dispatcher_switch_to_view(app->view_dispatcher, ViewConsoleOutput); + app->data->state = ViewConsoleOutput; +} + +void text_input_input_handler(CliguiApp* app, InputEvent* event) { + UNUSED(app); + UNUSED(event); + if(event->type == InputTypeShort && event->key == InputKeyBack) { + // view_dispatcher_switch_to_view(app->view_dispatcher, ViewConsoleOutput); + // app->data->state = ViewConsoleOutput; + size_t len = strlen(app->text_input_store); + app->text_input_store[len] = ' '; + app->text_input_store[len + 1] = 0; + } +} \ No newline at end of file diff --git a/applications/plugins/cli_bridge/text_input.h b/applications/plugins/cli_bridge/text_input.h new file mode 100644 index 000000000..77cc30efa --- /dev/null +++ b/applications/plugins/cli_bridge/text_input.h @@ -0,0 +1,5 @@ +#pragma once +#include "cligui_main_i.h" + +extern void text_input_result_callback(void* ctx); +extern void text_input_input_handler(CliguiApp*, InputEvent*); \ No newline at end of file diff --git a/applications/plugins/text_viewer/.gitignore b/applications/plugins/text_viewer/.gitignore new file mode 100644 index 000000000..c6127b38c --- /dev/null +++ b/applications/plugins/text_viewer/.gitignore @@ -0,0 +1,52 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf diff --git a/applications/plugins/text_viewer/LICENSE b/applications/plugins/text_viewer/LICENSE new file mode 100644 index 000000000..69004dc62 --- /dev/null +++ b/applications/plugins/text_viewer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Roman Shchekin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/applications/plugins/text_viewer/README.md b/applications/plugins/text_viewer/README.md new file mode 100644 index 000000000..cc41931be --- /dev/null +++ b/applications/plugins/text_viewer/README.md @@ -0,0 +1,9 @@ +# flipper-zero-text-viewer + +Text Viewer application for Flipper Zero! + +A fork with a few changes from [QTRoS' hex viewer](https://github.com/QtRoS/flipper-zero-hex-viewer) to just display text without any hex byte representation + +![Text Viewer app!](https://github.com/kyhwana/flipper-zero-hex-viewer/blob/master/textviewerflipper.PNG?raw=true) + +[Link to FAP](https://github.com/kyhwana/latest_flipper_zero_apps/raw/main/text_viewer.fap) diff --git a/applications/plugins/text_viewer/application.fam b/applications/plugins/text_viewer/application.fam new file mode 100644 index 000000000..4f5182edf --- /dev/null +++ b/applications/plugins/text_viewer/application.fam @@ -0,0 +1,16 @@ +App( + appid="text_viewer", + name="Text Viewer", + apptype=FlipperAppType.EXTERNAL, + entry_point="hex_viewer_app", + cdefines=["APP_TEXT_VIEWER"], + requires=[ + "gui", + "dialogs", + ], + stack_size=2 * 1024, + order=20, + fap_icon="icons/hex_10px.png", + fap_category="Misc", + fap_icon_assets="icons", +) diff --git a/applications/plugins/text_viewer/hex_viewer.c b/applications/plugins/text_viewer/hex_viewer.c new file mode 100644 index 000000000..3830a6602 --- /dev/null +++ b/applications/plugins/text_viewer/hex_viewer.c @@ -0,0 +1,282 @@ +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define TAG "TextViewer" + +#define HEX_VIEWER_APP_PATH_FOLDER "/any" +#define HEX_VIEWER_APP_EXTENSION "*" + +#define HEX_VIEWER_BYTES_PER_LINE 20u +#define HEX_VIEWER_LINES_ON_SCREEN 5u +#define HEX_VIEWER_BUF_SIZE (HEX_VIEWER_LINES_ON_SCREEN * HEX_VIEWER_BYTES_PER_LINE) + +typedef struct { + uint8_t file_bytes[HEX_VIEWER_LINES_ON_SCREEN][HEX_VIEWER_BYTES_PER_LINE]; + uint32_t file_offset; + uint32_t file_read_bytes; + uint32_t file_size; + Stream* stream; + bool mode; // Print address or content +} HexViewerModel; + +typedef struct { + HexViewerModel* model; + FuriMutex** mutex; + + FuriMessageQueue* input_queue; + + ViewPort* view_port; + Gui* gui; + Storage* storage; +} HexViewer; + +static void render_callback(Canvas* canvas, void* ctx) { + HexViewer* hex_viewer = ctx; + furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk); + + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + + //elements_button_left(canvas, hex_viewer->model->mode ? "Addr" : "Text"); + hex_viewer->model->mode = 1; //text mode + //elements_button_right(canvas, "Info"); + + int ROW_HEIGHT = 12; + int TOP_OFFSET = 10; + int LEFT_OFFSET = 3; + + uint32_t line_count = hex_viewer->model->file_size / HEX_VIEWER_BYTES_PER_LINE; + if(hex_viewer->model->file_size % HEX_VIEWER_BYTES_PER_LINE != 0) line_count += 1; + uint32_t first_line_on_screen = hex_viewer->model->file_offset / HEX_VIEWER_BYTES_PER_LINE; + if(line_count > HEX_VIEWER_LINES_ON_SCREEN) { + uint8_t width = canvas_width(canvas); + elements_scrollbar_pos( + canvas, + width, + 0, + ROW_HEIGHT * HEX_VIEWER_LINES_ON_SCREEN, + first_line_on_screen, // TODO + line_count - (HEX_VIEWER_LINES_ON_SCREEN - 1)); + } + + char temp_buf[32]; + uint32_t row_iters = hex_viewer->model->file_read_bytes / HEX_VIEWER_BYTES_PER_LINE; + if(hex_viewer->model->file_read_bytes % HEX_VIEWER_BYTES_PER_LINE != 0) row_iters += 1; + + for(uint32_t i = 0; i < row_iters; ++i) { + uint32_t bytes_left_per_row = + hex_viewer->model->file_read_bytes - i * HEX_VIEWER_BYTES_PER_LINE; + bytes_left_per_row = MIN(bytes_left_per_row, HEX_VIEWER_BYTES_PER_LINE); + + if(hex_viewer->model->mode) { + memcpy(temp_buf, hex_viewer->model->file_bytes[i], bytes_left_per_row); + temp_buf[bytes_left_per_row] = '\0'; + for(uint32_t j = 0; j < bytes_left_per_row; ++j) + if(!isprint((int)temp_buf[j])) temp_buf[j] = '.'; + + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str(canvas, LEFT_OFFSET, TOP_OFFSET + i * ROW_HEIGHT, temp_buf); + } else { + uint32_t addr = hex_viewer->model->file_offset + i * HEX_VIEWER_BYTES_PER_LINE; + snprintf(temp_buf, 32, "%04lX", addr); + + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str(canvas, LEFT_OFFSET, TOP_OFFSET + i * ROW_HEIGHT, temp_buf); + } + } + + furi_mutex_release(hex_viewer->mutex); +} + +static void input_callback(InputEvent* input_event, void* ctx) { + HexViewer* hex_viewer = ctx; + if(input_event->type == InputTypeShort || input_event->type == InputTypeRepeat) { + furi_message_queue_put(hex_viewer->input_queue, input_event, 0); + } +} + +static HexViewer* hex_viewer_alloc() { + HexViewer* instance = malloc(sizeof(HexViewer)); + + instance->model = malloc(sizeof(HexViewerModel)); + memset(instance->model, 0x0, sizeof(HexViewerModel)); + + instance->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + + instance->input_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + + instance->view_port = view_port_alloc(); + view_port_draw_callback_set(instance->view_port, render_callback, instance); + view_port_input_callback_set(instance->view_port, input_callback, instance); + + instance->gui = furi_record_open(RECORD_GUI); + gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen); + + instance->storage = furi_record_open(RECORD_STORAGE); + + return instance; +} + +static void hex_viewer_free(HexViewer* instance) { + furi_record_close(RECORD_STORAGE); + + gui_remove_view_port(instance->gui, instance->view_port); + furi_record_close(RECORD_GUI); + view_port_free(instance->view_port); + + furi_message_queue_free(instance->input_queue); + + furi_mutex_free(instance->mutex); + + if(instance->model->stream) buffered_file_stream_close(instance->model->stream); + + free(instance->model); + free(instance); +} + +static bool hex_viewer_open_file(HexViewer* hex_viewer, const char* file_path) { + furi_assert(hex_viewer); + furi_assert(file_path); + + hex_viewer->model->stream = buffered_file_stream_alloc(hex_viewer->storage); + bool isOk = true; + + do { + if(!buffered_file_stream_open( + hex_viewer->model->stream, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "Unable to open stream: %s", file_path); + isOk = false; + break; + }; + + hex_viewer->model->file_size = stream_size(hex_viewer->model->stream); + } while(false); + + return isOk; +} + +static bool hex_viewer_read_file(HexViewer* hex_viewer) { + furi_assert(hex_viewer); + furi_assert(hex_viewer->model->stream); + furi_assert(hex_viewer->model->file_offset % HEX_VIEWER_BYTES_PER_LINE == 0); + + memset(hex_viewer->model->file_bytes, 0x0, HEX_VIEWER_BUF_SIZE); + bool isOk = true; + + do { + uint32_t offset = hex_viewer->model->file_offset; + if(!stream_seek(hex_viewer->model->stream, offset, true)) { + FURI_LOG_E(TAG, "Unable to seek stream"); + isOk = false; + break; + } + + hex_viewer->model->file_read_bytes = stream_read( + hex_viewer->model->stream, + (uint8_t*)hex_viewer->model->file_bytes, + HEX_VIEWER_BUF_SIZE); + } while(false); + + return isOk; +} + +int32_t hex_viewer_app(void* p) { + HexViewer* hex_viewer = hex_viewer_alloc(); + + FuriString* file_path; + file_path = furi_string_alloc(); + + do { + if(p && strlen(p)) { + furi_string_set(file_path, (const char*)p); + } else { + furi_string_set(file_path, HEX_VIEWER_APP_PATH_FOLDER); + + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options( + &browser_options, HEX_VIEWER_APP_EXTENSION, &I_hex_10px); + browser_options.hide_ext = false; + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); + + furi_record_close(RECORD_DIALOGS); + if(!res) { + FURI_LOG_I(TAG, "No file selected"); + break; + } + } + + FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path)); + + if(!hex_viewer_open_file(hex_viewer, furi_string_get_cstr(file_path))) break; + hex_viewer_read_file(hex_viewer); + + InputEvent input; + while(furi_message_queue_get(hex_viewer->input_queue, &input, FuriWaitForever) == + FuriStatusOk) { + if(input.key == InputKeyBack) { + break; + } else if(input.key == InputKeyUp) { + furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk); + if(hex_viewer->model->file_offset > 0) { + hex_viewer->model->file_offset -= HEX_VIEWER_BYTES_PER_LINE; + if(!hex_viewer_read_file(hex_viewer)) break; + } + furi_mutex_release(hex_viewer->mutex); + } else if(input.key == InputKeyDown) { + furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk); + uint32_t last_byte_on_screen = + hex_viewer->model->file_offset + hex_viewer->model->file_read_bytes; + + if(hex_viewer->model->file_size > last_byte_on_screen) { + hex_viewer->model->file_offset += HEX_VIEWER_BYTES_PER_LINE; + if(!hex_viewer_read_file(hex_viewer)) break; + } + furi_mutex_release(hex_viewer->mutex); + } else if(input.key == InputKeyLeft) { + furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk); + hex_viewer->model->mode = !hex_viewer->model->mode; + furi_mutex_release(hex_viewer->mutex); + } else if(input.key == InputKeyRight) { + FuriString* buffer; + buffer = furi_string_alloc(); + furi_string_printf( + buffer, + "File path: %s\nFile size: %lu (0x%lX)", + furi_string_get_cstr(file_path), + hex_viewer->model->file_size, + hex_viewer->model->file_size); + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "Text Viewer v1.1", 16, 2, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_hex_10px, 3, 2); + dialog_message_set_text( + message, furi_string_get_cstr(buffer), 3, 16, AlignLeft, AlignTop); + dialog_message_set_buttons(message, NULL, NULL, "Back"); + dialog_message_show(dialogs, message); + + furi_string_free(buffer); + dialog_message_free(message); + furi_record_close(RECORD_DIALOGS); + } + view_port_update(hex_viewer->view_port); + } + } while(false); + + furi_string_free(file_path); + hex_viewer_free(hex_viewer); + + return 0; +} \ No newline at end of file diff --git a/applications/plugins/text_viewer/icons/hex_10px.png b/applications/plugins/text_viewer/icons/hex_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..582e288c6dc61ccfffd8bcfe52dd386f7f253bfa GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGXn$T+1LD%K#pXIYeY$Kep*R+Vo@rCV@iHf zs)A>3VtQ&&YGO)d;mK4Rpdz*apAgsoT|gGYuCKccfRweTi(^Q|t)v77#s&r^#Ri6? zgp>pp4h4gw94ZV<9gTuoEKitN1f1mbxTmrKl{kkU?C6>B)uBZIXxa+~g^a@Zbs*zB MUHx3vIVCg!0RLJn-v9sr literal 0 HcmV?d00001 diff --git a/applications/plugins/text_viewer/textviewerflipper.PNG b/applications/plugins/text_viewer/textviewerflipper.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d357b7455fced494b392f417a676360cb4f33388 GIT binary patch literal 11796 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 W Date: Wed, 11 Jan 2023 16:37:24 +0100 Subject: [PATCH 63/64] Merge PRs --- .../infrared/scenes/infrared_scene_start.c | 16 ++++- .../services/desktop/desktop_settings.h | 7 ++ .../services/power/power_service/power.c | 64 +++++++++++++++++-- .../scenes/desktop_settings_scene_start.c | 11 +++- 4 files changed, 89 insertions(+), 9 deletions(-) diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index c7df0f45b..79826ede9 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -3,6 +3,7 @@ enum SubmenuIndex { SubmenuIndexUniversalRemotes, SubmenuIndexLearnNewRemote, + SubmenuIndexLearnNewRemoteRaw, SubmenuIndexSavedRemotes, SubmenuIndexDebug }; @@ -37,6 +38,12 @@ void infrared_scene_start_on_enter(void* context) { infrared); if(infrared->app_state.is_debug_enabled) { + submenu_add_item( + submenu, + "Learn New Remote RAW", + SubmenuIndexLearnNewRemoteRaw, + infrared_scene_start_submenu_callback, + infrared); submenu_add_item( submenu, "Debug", SubmenuIndexDebug, infrared_scene_start_submenu_callback, infrared); } @@ -61,7 +68,14 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { if(submenu_index == SubmenuIndexUniversalRemotes) { scene_manager_next_scene(scene_manager, InfraredSceneUniversal); consumed = true; - } else if(submenu_index == SubmenuIndexLearnNewRemote) { + } else if( + submenu_index == SubmenuIndexLearnNewRemote || + submenu_index == SubmenuIndexLearnNewRemoteRaw) { + + // enable automatic signal decoding if "Learn New Remote" + // disable automatic signal decoding if "Learn New Remote (RAW)" + infrared_worker_rx_enable_signal_decoding( + infrared->worker, submenu_index == SubmenuIndexLearnNewRemote); infrared->app_state.is_learning_new_remote = true; scene_manager_next_scene(scene_manager, InfraredSceneLearn); consumed = true; diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 4c3144de6..55d8640f5 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -36,6 +36,13 @@ #define MIN_PIN_SIZE 4 #define MAX_APP_LENGTH 128 +#define DISPLAY_BATTERY_BAR 0 +#define DISPLAY_BATTERY_PERCENT 1 +#define DISPLAY_BATTERY_INVERTED_PERCENT 2 +#define DISPLAY_BATTERY_RETRO_3 3 +#define DISPLAY_BATTERY_RETRO_5 4 +#define DISPLAY_BATTERY_BAR_PERCENT 5 + #define FAP_LOADER_APP_NAME "Applications" typedef struct { diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index e3c98e97a..d891968c7 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -14,7 +14,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->info.gauge_is_ok) { char batteryPercentile[4]; snprintf(batteryPercentile, sizeof(batteryPercentile), "%d", power->info.charge); - if((power->displayBatteryPercentage == 1) && + if((power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT) && (power->state != PowerStateCharging)) { //if display battery percentage, black background white text canvas_set_font(canvas, FontBatteryPercent); @@ -23,14 +23,14 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_color(canvas, ColorWhite); canvas_draw_str_aligned(canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); } else if( - (power->displayBatteryPercentage == 2) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_INVERTED_PERCENT) && (power->state != PowerStateCharging)) { //if display inverted percentage, white background black text canvas_set_font(canvas, FontBatteryPercent); canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); } else if( - (power->displayBatteryPercentage == 3) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_RETRO_3) && (power->state != PowerStateCharging)) { //Retro style segmented display, 3 parts if(power->info.charge > 25) { canvas_draw_box(canvas, 2, 2, 6, 4); @@ -42,7 +42,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_draw_box(canvas, 16, 2, 6, 4); } } else if( - (power->displayBatteryPercentage == 4) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_RETRO_5) && (power->state != PowerStateCharging)) { //Retro style segmented display, 5 parts if(power->info.charge > 10) { canvas_draw_box(canvas, 2, 2, 3, 4); @@ -59,6 +59,57 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->info.charge > 90) { canvas_draw_box(canvas, 18, 2, 3, 4); } + } else if( + (power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) && + (power->state != PowerStateCharging) && // Default bar display with percentage + (power->info.voltage_battery_charging >= 4.2)) { // not looking nice with low voltage indicator + canvas_set_font(canvas, FontBatteryPercent); + + // align charge dispaly value with digits to draw + uint8_t bar_charge = power->info.charge; + if(bar_charge > 23 && bar_charge < 38) { + bar_charge = 23; + } else if(bar_charge >= 38 && bar_charge < 62) { + bar_charge = 50; + } else if(bar_charge >= 62 && bar_charge < 74) { + bar_charge = 74; + } + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 1, 1, (bar_charge * 22) / 100, 6); + + // drawing digits + if(bar_charge < 38) { // both digits are black + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); + } else if(bar_charge >= 38 && bar_charge < 74) { // first digit is white + canvas_set_color(canvas, ColorWhite); + + // first + char batteryPercentileFirstDigit[2]; + snprintf( + batteryPercentileFirstDigit, + sizeof(batteryPercentileFirstDigit), + "%c", + batteryPercentile[0]); + canvas_draw_str_aligned( + canvas, 9, 4, AlignCenter, AlignCenter, batteryPercentileFirstDigit); + + // second + char batteryPercentileSecondDigit[2]; + snprintf( + batteryPercentileSecondDigit, + sizeof(batteryPercentileSecondDigit), + "%c", + batteryPercentile[1]); + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 15, 4, AlignCenter, AlignCenter, batteryPercentileSecondDigit); + } else { // charge >= 62, both digits are white + canvas_set_color(canvas, ColorWhite); + canvas_draw_str_aligned( + canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); + } } else { //default bar display, added here to serve as fallback/default behaviour. canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4); } @@ -82,7 +133,8 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->state == PowerStateCharging) { canvas_set_bitmap_mode(canvas, 1); // TODO: replace -1 magic for uint8_t with re-framing - if(power->displayBatteryPercentage == 1) { + if(power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT || + power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) { canvas_set_color(canvas, ColorBlack); canvas_draw_box(canvas, 1, 1, 22, 6); canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); @@ -91,7 +143,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_font(canvas, FontBatteryPercent); canvas_draw_str_aligned( canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); - } else if(power->displayBatteryPercentage == 2) { + } else if(power->displayBatteryPercentage == DISPLAY_BATTERY_INVERTED_PERCENT) { canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 1, 1, 22, 6); canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 9124ce287..6f38ed54b 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -26,7 +26,7 @@ const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { const uint32_t auto_lock_delay_value[AUTO_LOCK_DELAY_COUNT] = {0, 10000, 15000, 30000, 60000, 90000, 120000, 300000, 600000}; -#define BATTERY_VIEW_COUNT 5 +#define BATTERY_VIEW_COUNT 6 const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { "Bar", "%", @@ -34,7 +34,14 @@ const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { "Retro 3", "Retro 5", }; -const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = {0, 1, 2, 3, 4}; +const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = { + DISPLAY_BATTERY_BAR, + DISPLAY_BATTERY_PERCENT, + DISPLAY_BATTERY_INVERTED_PERCENT, + DISPLAY_BATTERY_RETRO_3, + DISPLAY_BATTERY_RETRO_5, + DISPLAY_BATTERY_BAR_PERCENT +}; uint8_t origBattDisp_value = 0; From d0d0e8d1d87dc0c8b570d2927b9c577cee4bb9aa Mon Sep 17 00:00:00 2001 From: VerstreuteSeele Date: Wed, 11 Jan 2023 16:55:49 +0100 Subject: [PATCH 64/64] Fixing battery thingy --- .../desktop_settings/scenes/desktop_settings_scene_start.c | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 6f38ed54b..da4140aa1 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -33,6 +33,7 @@ const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { "Inv. %", "Retro 3", "Retro 5", + "Bar %" }; const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = { DISPLAY_BATTERY_BAR,